Merge "QCamera3: Add a vendor key for request ready" into oc-mr1-dev
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index b987e8a..c3672b1 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -10355,6 +10355,7 @@
 
     if (gExposeEnableZslKey) {
         available_result_keys.add(ANDROID_CONTROL_ENABLE_ZSL);
+        available_result_keys.add(NEXUS_EXPERIMENTAL_2017_NEXT_STILL_INTENT_REQUEST_READY);
     }
 
     staticInfo.update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
@@ -15069,6 +15070,44 @@
     mShutterDispatcher.markShutterReady(requestId, apSensorTimestampNs);
 }
 
+void QCamera3HardwareInterface::onNextCaptureReady(uint32_t requestId)
+{
+    pthread_mutex_lock(&mMutex);
+
+    // Find the pending request for this result metadata.
+    auto requestIter = mPendingRequestsList.begin();
+    while (requestIter != mPendingRequestsList.end() && requestIter->frame_number != requestId) {
+        requestIter++;
+    }
+
+    if (requestIter == mPendingRequestsList.end()) {
+        ALOGE("%s: Cannot find a pending request for frame number %u.", __FUNCTION__, requestId);
+        pthread_mutex_unlock(&mMutex);
+        return;
+    }
+
+    requestIter->partial_result_cnt++;
+
+    CameraMetadata metadata;
+    uint8_t ready = true;
+    metadata.update(NEXUS_EXPERIMENTAL_2017_NEXT_STILL_INTENT_REQUEST_READY, &ready, 1);
+
+    // Send it to framework.
+    camera3_capture_result_t result = {};
+
+    result.result = metadata.getAndLock();
+    // Populate metadata result
+    result.frame_number = requestId;
+    result.num_output_buffers = 0;
+    result.output_buffers = NULL;
+    result.partial_result = requestIter->partial_result_cnt;
+
+    orchestrateResult(&result);
+    metadata.unlock(result.result);
+
+    pthread_mutex_unlock(&mMutex);
+}
+
 void QCamera3HardwareInterface::onCaptureResult(pbcamera::CaptureResult *result,
         const camera_metadata_t &resultMetadata)
 {
@@ -15085,6 +15124,9 @@
             return;
         }
 
+        // TODO (b/34854987): initiate this from HDR+ service.
+        onNextCaptureReady(result->requestId);
+
         // Find the pending HDR+ request.
         HdrPlusPendingRequest pendingRequest;
         {
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h
index 2306b36..0746c11 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.h
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h
@@ -836,6 +836,7 @@
             const camera_metadata_t &resultMetadata) override;
     void onFailedCaptureResult(pbcamera::CaptureResult *failedResult) override;
     void onShutter(uint32_t requestId, int64_t apSensorTimestampNs) override;
+    void onNextCaptureReady(uint32_t requestId);
 
     nsecs_t calculateMaxExpectedDuration(const camera_metadata_t *request);
     void getExpectedFrameDuration(const camera_metadata_t *request, nsecs_t *frameDuration);
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
index 3c6847d..c5a0675 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
@@ -363,6 +363,7 @@
     { "sensor.pd_data_enable", TYPE_BYTE},
     { "control.exposure_time_boost", TYPE_FLOAT},
     { "request.makernote", TYPE_BYTE },
+    { "request.next_still_intent_request_ready", TYPE_BYTE },
 };
 
 vendor_tag_info_t tango_mode_data[TANGO_MODE_DATA_END -
@@ -602,6 +603,7 @@
     (uint32_t)NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_EXP_TIME_BOOST,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_EXIF_MAKERNOTE,
+    (uint32_t)NEXUS_EXPERIMENTAL_2017_NEXT_STILL_INTENT_REQUEST_READY,
 
     //TANGO_MODE
     (uint32_t)TANGO_MODE_DATA_SENSOR_FULLFOV,
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
index 2f6ea20..bf0167e 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
@@ -446,6 +446,7 @@
     NEXUS_EXPERIMENTAL_2017_EXP_TIME_BOOST,
     /* EASEL HDR+ */
     NEXUS_EXPERIMENTAL_2017_EXIF_MAKERNOTE,
+    NEXUS_EXPERIMENTAL_2017_NEXT_STILL_INTENT_REQUEST_READY,
 
     NEXUS_EXPERIMENTAL_2017_END,