QCamera3HWI: Finish opening HDR+ client
Finish opening HDR+ client before closing camera or
disabling HDR+ mode.
Test: GCA
Bug: 62881085
Change-Id: I479cf3167a2a07b9df017502e6894f03c665e74c
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index e657231..c299ea2 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -149,13 +149,14 @@
bool EaselManagerClientOpened = false; // If gEaselManagerClient is opened.
std::unique_ptr<HdrPlusClient> gHdrPlusClient = nullptr;
bool gHdrPlusClientOpening = false; // If HDR+ client is being opened.
+std::condition_variable gHdrPlusClientOpenCond; // Used to synchronize HDR+ client opening.
bool gEaselProfilingEnabled = false; // If Easel profiling is enabled.
bool gExposeEnableZslKey = false; // If HAL makes android.control.enableZsl available.
// If Easel is in bypass only mode. If true, Easel HDR+ won't be enabled.
bool gEaselBypassOnly;
-Mutex gHdrPlusClientLock; // Protect above Easel related variables.
+std::mutex gHdrPlusClientLock; // Protect above Easel related variables.
const QCamera3HardwareInterface::QCameraPropMap QCamera3HardwareInterface::CDS_MAP [] = {
@@ -872,7 +873,7 @@
}
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (gEaselManagerClient.isEaselPresentOnDevice()) {
logEaselEvent("EASEL_STARTUP_LATENCY", "Resume");
rc = gEaselManagerClient.resume();
@@ -891,7 +892,7 @@
// Suspend Easel because opening camera failed.
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (gEaselManagerClient.isEaselPresentOnDevice()) {
status_t suspendErr = gEaselManagerClient.suspend();
if (suspendErr != 0) {
@@ -1087,7 +1088,8 @@
mCameraId, rc);
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+ finishHdrPlusClientOpeningLocked(l);
if (gHdrPlusClient != nullptr) {
// Disable HDR+ mode.
disableHdrPlusModeLocked();
@@ -3015,7 +3017,8 @@
// Disable HRD+ if it's enabled;
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
+ finishHdrPlusClientOpeningLocked(l);
disableHdrPlusModeLocked();
}
@@ -3510,7 +3513,7 @@
result.partial_result = requestIter->partial_result_cnt;
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (gHdrPlusClient != nullptr && mHdrPlusModeEnabled) {
// Notify HDR+ client about the partial metadata.
gHdrPlusClient->notifyFrameMetadata(result.frame_number, *result.result,
@@ -4174,7 +4177,7 @@
mPendingLiveRequest--;
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
// For a live request, send the metadata to HDR+ client.
if (gHdrPlusClient != nullptr && mHdrPlusModeEnabled) {
gHdrPlusClient->notifyFrameMetadata(frameNumber, *resultMetadata,
@@ -5315,7 +5318,7 @@
HdrPlusPendingRequest pendingHdrPlusRequest = {};
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
// If this request has a still capture intent, try to submit an HDR+ request.
if (gHdrPlusClient != nullptr && mHdrPlusModeEnabled &&
mCaptureIntent == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) {
@@ -5941,7 +5944,7 @@
{
// Configure Easel for stream on.
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
// Now that sensor mode should have been selected, get the selected sensor mode
// info.
@@ -5976,7 +5979,7 @@
// Enable HDR+ mode for the first PREVIEW_INTENT request.
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (gEaselManagerClient.isEaselPresentOnDevice() &&
!gEaselBypassOnly && !mFirstPreviewIntentSeen &&
meta.exists(ANDROID_CONTROL_CAPTURE_INTENT) &&
@@ -10813,7 +10816,7 @@
pthread_mutex_lock(&gCamLock);
{
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
rc = initHdrPlusClientLocked();
if (rc != OK) {
ALOGE("%s: initHdrPlusClientLocked failed: %s (%d)", __FUNCTION__, strerror(-rc), rc);
@@ -14541,6 +14544,13 @@
return OK;
}
+void QCamera3HardwareInterface::finishHdrPlusClientOpeningLocked(std::unique_lock<std::mutex> &lock)
+{
+ if (gHdrPlusClientOpening) {
+ gHdrPlusClientOpenCond.wait(lock, [&] { return !gHdrPlusClientOpening; });
+ }
+}
+
void QCamera3HardwareInterface::disableHdrPlusModeLocked()
{
// Disable HDR+ mode.
@@ -14556,7 +14566,6 @@
}
mHdrPlusModeEnabled = false;
- gHdrPlusClientOpening = false;
ALOGD("%s: HDR+ mode disabled", __FUNCTION__);
}
@@ -14639,7 +14648,7 @@
logEaselEvent("EASEL_STARTUP_LATENCY", "HDR+ client opened.");
ALOGI("%s: HDR+ client opened.", __FUNCTION__);
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (!gHdrPlusClientOpening) {
ALOGW("%s: HDR+ is disabled while HDR+ client is being opened.", __FUNCTION__);
return;
@@ -14647,6 +14656,7 @@
gHdrPlusClient = std::move(client);
gHdrPlusClientOpening = false;
+ gHdrPlusClientOpenCond.notify_one();
// Set static metadata.
status_t res = gHdrPlusClient->setStaticMetadata(*gStaticMetadata[mCameraId]);
@@ -14668,8 +14678,9 @@
void QCamera3HardwareInterface::onOpenFailed(status_t err)
{
ALOGE("%s: Opening HDR+ client failed: %s (%d)", __FUNCTION__, strerror(-err), err);
- Mutex::Autolock l(gHdrPlusClientLock);
+ std::unique_lock<std::mutex> l(gHdrPlusClientLock);
gHdrPlusClientOpening = false;
+ gHdrPlusClientOpenCond.notify_one();
}
void QCamera3HardwareInterface::onFatalError()