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 cf8a9d5..c3672b1 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -8124,6 +8124,10 @@
             frame_ois_data->ois_sample_shift_x, frame_ois_data->num_ois_sample);
         camMetadata.update(NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
             frame_ois_data->ois_sample_shift_y, frame_ois_data->num_ois_sample);
+        camMetadata.update(NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_X,
+            frame_ois_data->ois_sample_shift_pixel_x, frame_ois_data->num_ois_sample);
+        camMetadata.update(NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_Y,
+            frame_ois_data->ois_sample_shift_pixel_y, frame_ois_data->num_ois_sample);
     }
 
     resultMetadata = camMetadata.release();
@@ -14679,33 +14683,97 @@
     }
 }
 
-bool QCamera3HardwareInterface::trySubmittingHdrPlusRequestLocked(
-        HdrPlusPendingRequest *hdrPlusRequest, const camera3_capture_request_t &request,
-        const CameraMetadata &metadata)
-{
-    if (hdrPlusRequest == nullptr) return false;
-
-    // Check noise reduction mode is high quality.
+bool QCamera3HardwareInterface::isRequestHdrPlusCompatible(
+        const camera3_capture_request_t &request, const CameraMetadata &metadata) {
     if (!metadata.exists(ANDROID_NOISE_REDUCTION_MODE) ||
          metadata.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0] !=
             ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY) {
-        ALOGD("%s: Not an HDR+ request: ANDROID_NOISE_REDUCTION_MODE is not HQ: %d", __FUNCTION__,
+        ALOGV("%s: ANDROID_NOISE_REDUCTION_MODE is not HQ: %d", __FUNCTION__,
                 metadata.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]);
         return false;
     }
 
-    // Check edge mode is high quality.
     if (!metadata.exists(ANDROID_EDGE_MODE) ||
-         metadata.find(ANDROID_EDGE_MODE).data.u8[0] != ANDROID_EDGE_MODE_HIGH_QUALITY) {
-        ALOGD("%s: Not an HDR+ request: ANDROID_EDGE_MODE is not HQ.", __FUNCTION__);
+            metadata.find(ANDROID_EDGE_MODE).data.u8[0] != ANDROID_EDGE_MODE_HIGH_QUALITY) {
+        ALOGV("%s: ANDROID_EDGE_MODE is not HQ.", __FUNCTION__);
         return false;
     }
 
+    if (!metadata.exists(ANDROID_COLOR_CORRECTION_ABERRATION_MODE) ||
+            metadata.find(ANDROID_COLOR_CORRECTION_ABERRATION_MODE).data.u8[0] !=
+                    ANDROID_COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY) {
+        ALOGV("%s: ANDROID_COLOR_CORRECTION_ABERRATION_MODE is not HQ.", __FUNCTION__);
+        return false;
+    }
+
+    if (!metadata.exists(ANDROID_CONTROL_AE_MODE) ||
+            (metadata.find(ANDROID_CONTROL_AE_MODE).data.u8[0] != ANDROID_CONTROL_AE_MODE_ON &&
+             metadata.find(ANDROID_CONTROL_AE_MODE).data.u8[0] !=
+                    ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH)) {
+        ALOGV("%s: ANDROID_CONTROL_AE_MODE is not ON or ON_AUTO_FLASH.", __FUNCTION__);
+        return false;
+    }
+
+    if (!metadata.exists(ANDROID_CONTROL_AWB_MODE) ||
+            metadata.find(ANDROID_CONTROL_AWB_MODE).data.u8[0] != ANDROID_CONTROL_AWB_MODE_AUTO) {
+        ALOGV("%s: ANDROID_CONTROL_AWB_MODE is not AUTO.", __FUNCTION__);
+        return false;
+    }
+
+    if (!metadata.exists(ANDROID_CONTROL_EFFECT_MODE) ||
+            metadata.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0] !=
+                    ANDROID_CONTROL_EFFECT_MODE_OFF) {
+        ALOGV("%s: ANDROID_CONTROL_EFFECT_MODE_OFF is not OFF.", __FUNCTION__);
+        return false;
+    }
+
+    if (!metadata.exists(ANDROID_CONTROL_MODE) ||
+            (metadata.find(ANDROID_CONTROL_MODE).data.u8[0] != ANDROID_CONTROL_MODE_AUTO &&
+             metadata.find(ANDROID_CONTROL_MODE).data.u8[0] !=
+                    ANDROID_CONTROL_MODE_USE_SCENE_MODE)) {
+        ALOGV("%s: ANDROID_CONTROL_MODE is not AUTO or USE_SCENE_MODE.", __FUNCTION__);
+        return false;
+    }
+
+    // TODO (b/32585046): support non-ZSL.
+    if (!metadata.exists(ANDROID_CONTROL_ENABLE_ZSL) ||
+         metadata.find(ANDROID_CONTROL_ENABLE_ZSL).data.u8[0] != ANDROID_CONTROL_ENABLE_ZSL_TRUE) {
+        ALOGV("%s: ANDROID_CONTROL_ENABLE_ZSL is not true.", __FUNCTION__);
+        return false;
+    }
+
+    // TODO (b/32586081): support flash.
+    if (!metadata.exists(ANDROID_FLASH_MODE) ||
+         metadata.find(ANDROID_FLASH_MODE).data.u8[0] != ANDROID_FLASH_MODE_OFF) {
+        ALOGV("%s: ANDROID_FLASH_MODE is not OFF.", __FUNCTION__);
+        return false;
+    }
+
+    // TODO (b/36492953): support digital zoom.
+    if (!metadata.exists(ANDROID_SCALER_CROP_REGION) ||
+         metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[0] != 0 ||
+         metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[1] != 0 ||
+         metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[2] !=
+                gCamCapability[mCameraId]->active_array_size.width ||
+         metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[3] !=
+                gCamCapability[mCameraId]->active_array_size.height) {
+        ALOGV("%s: ANDROID_SCALER_CROP_REGION is not the same as active array region.",
+                __FUNCTION__);
+        return false;
+    }
+
+    if (!metadata.exists(ANDROID_TONEMAP_MODE) ||
+         metadata.find(ANDROID_TONEMAP_MODE).data.u8[0] != ANDROID_TONEMAP_MODE_HIGH_QUALITY) {
+        ALOGV("%s: ANDROID_TONEMAP_MODE is not HQ.", __FUNCTION__);
+        return false;
+    }
+
+    // TODO (b/36693254, b/36690506): support other outputs.
     if (request.num_output_buffers != 1 ||
             request.output_buffers[0].stream->format != HAL_PIXEL_FORMAT_BLOB) {
-        ALOGD("%s: Not an HDR+ request: Only Jpeg output is supported.", __FUNCTION__);
+        ALOGV("%s: Not an HDR+ request: Only Jpeg output is supported.", __FUNCTION__);
         for (uint32_t i = 0; i < request.num_output_buffers; i++) {
-            ALOGD("%s: output_buffers[%u]: %dx%d format %d", __FUNCTION__, i,
+            ALOGV("%s: output_buffers[%u]: %dx%d format %d", __FUNCTION__, i,
                     request.output_buffers[0].stream->width,
                     request.output_buffers[0].stream->height,
                     request.output_buffers[0].stream->format);
@@ -14713,6 +14781,16 @@
         return false;
     }
 
+    return true;
+}
+
+bool QCamera3HardwareInterface::trySubmittingHdrPlusRequestLocked(
+        HdrPlusPendingRequest *hdrPlusRequest, const camera3_capture_request_t &request,
+        const CameraMetadata &metadata)
+{
+    if (hdrPlusRequest == nullptr) return false;
+    if (!isRequestHdrPlusCompatible(request, metadata)) return false;
+
     // Get a YUV buffer from pic channel.
     QCamera3PicChannel *picChannel = (QCamera3PicChannel*)request.output_buffers[0].stream->priv;
     auto yuvBuffer = std::make_shared<mm_camera_buf_def_t>();
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h
index b7be197..0746c11 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.h
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h
@@ -806,6 +806,10 @@
     // Return if current session with configured streams is compatible with HDR+ mode.
     bool isSessionHdrPlusModeCompatible();
 
+    // Return if the request is compatible with HDR+.
+    bool isRequestHdrPlusCompatible(
+            const camera3_capture_request_t &request, const CameraMetadata &metadata);
+
     // Configure streams for HDR+.
     status_t configureHdrPlusStreamsLocked();
 
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
index 8fd0c4e..c5a0675 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
@@ -357,6 +357,8 @@
     { "stats.ois_timestamps_boottime", TYPE_INT64 },
     { "stats.ois_shift_x", TYPE_INT32 },
     { "stats.ois_shift_y", TYPE_INT32 },
+    { "stats.ois_shift_pixel_x", TYPE_FLOAT },
+    { "stats.ois_shift_pixel_y", TYPE_FLOAT },
     { "sensor.pd_data_dimensions", TYPE_INT32},
     { "sensor.pd_data_enable", TYPE_BYTE},
     { "control.exposure_time_boost", TYPE_FLOAT},
@@ -595,6 +597,8 @@
     (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_TIMESTAMPS_BOOTTIME,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_X,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
+    (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_X,
+    (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_Y,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_PD_DATA_DIMENSIONS,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
     (uint32_t)NEXUS_EXPERIMENTAL_2017_EXP_TIME_BOOST,
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
index 082faa1..bf0167e 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
@@ -437,6 +437,8 @@
     NEXUS_EXPERIMENTAL_2017_OIS_TIMESTAMPS_BOOTTIME,
     NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_X,
     NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
+    NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_X,
+    NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_Y,
     /* PD plumbing */
     NEXUS_EXPERIMENTAL_2017_PD_DATA_DIMENSIONS,
     NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
diff --git a/msm8998/QCamera2/stack/common/cam_types.h b/msm8998/QCamera2/stack/common/cam_types.h
index fc7a134..fd75193 100644
--- a/msm8998/QCamera2/stack/common/cam_types.h
+++ b/msm8998/QCamera2/stack/common/cam_types.h
@@ -995,6 +995,8 @@
     int64_t ois_sample_timestamp_boottime[MAX_OIS_SAMPLE_NUM_PER_FRAME];
     int32_t ois_sample_shift_x[MAX_OIS_SAMPLE_NUM_PER_FRAME];
     int32_t ois_sample_shift_y[MAX_OIS_SAMPLE_NUM_PER_FRAME];
+    float ois_sample_shift_pixel_x[MAX_OIS_SAMPLE_NUM_PER_FRAME];
+    float ois_sample_shift_pixel_y[MAX_OIS_SAMPLE_NUM_PER_FRAME];
 } cam_frame_ois_info_t;
 
 typedef struct  {