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()