Camera3: Override AE state for front camera during precapture trigger

For front camera (YUV sensor), 3A doesn't run, so HAL cannot provide
metadata with regard to precapture trigger. Override the result
AE state to CONVERGED for a request with precapture trigger.

Bug: 18456128
Change-Id: Iadb9b9d8dbd26fba891337ba2bbfc928c950cb83
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 3b122b4..df656d2 100755
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
+/* Copyright (c) 2012-2013, 2015, The Linux Foundataion. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -164,7 +164,8 @@
       mParameters(NULL),
       mJpegSettings(NULL),
       mIsZslMode(false),
-      m_pPowerModule(NULL)
+      m_pPowerModule(NULL),
+      mPrecaptureId(0)
 {
     mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
     mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
@@ -875,19 +876,21 @@
         streamTypeMask |= channel->getStreamTypeMask();
     }
 
-    rc = setFrameParameters(request->frame_number, request->settings, streamTypeMask);
-    if (rc < 0) {
-        ALOGE("%s: fail to set frame parameters", __func__);
-        pthread_mutex_unlock(&mMutex);
-        return rc;
-    }
-
-    /* Update pending request list and pending buffers map */
     PendingRequestInfo pendingRequest;
     pendingRequest.frame_number = frameNumber;
     pendingRequest.num_buffers = request->num_output_buffers;
     pendingRequest.request_id = request_id;
     pendingRequest.blob_request = blob_request;
+    pendingRequest.ae_trigger.trigger_id = mPrecaptureId;
+    pendingRequest.ae_trigger.trigger = CAM_AEC_TRIGGER_IDLE;
+
+    rc = setFrameParameters(request->frame_number, request->settings,
+            streamTypeMask, pendingRequest.ae_trigger);
+    if (rc < 0) {
+        ALOGE("%s: fail to set frame parameters", __func__);
+        pthread_mutex_unlock(&mMutex);
+        return rc;
+    }
 
     for (size_t i = 0; i < request->num_output_buffers; i++) {
         RequestedBufferInfo requestedBuf;
@@ -1077,7 +1080,8 @@
                 result.result = dummyMetadata.release();
             } else {
                 result.result = translateCbMetadataToResultMetadata(metadata,
-                        current_capture_time, i->request_id);
+                        current_capture_time, i->request_id, i->ae_trigger);
+
                 if (i->blob_request && needReprocess()) {
                    //If it is a blob request then send the metadata to the picture channel
                    mPictureChannel->queueMetadata(metadata_buf);
@@ -1219,7 +1223,7 @@
 camera_metadata_t*
 QCamera3HardwareInterface::translateCbMetadataToResultMetadata
                                 (metadata_buffer_t *metadata, nsecs_t timestamp,
-                                 int32_t request_id)
+                                 int32_t request_id, const cam_trigger_t &aeTrigger)
 {
     CameraMetadata camMetadata;
     camera_metadata_t* resultMetadata;
@@ -1263,9 +1267,8 @@
         (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
     camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
 
-    int32_t  *ae_precapture_id =
-        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
-    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
+    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID,
+            &aeTrigger.trigger_id, 1);
 
     /*aec regions*/
     cam_area_t  *hAeRegions =
@@ -1277,9 +1280,17 @@
         uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
         camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
     } else {
-        uint8_t *ae_state =
-            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
-        camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
+        uint8_t ae_state =
+            *(uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
+        //Override AE state for front(YUV) sensor if corresponding request
+        //contain a precapture trigger. This is to work around the precapture
+        //trigger timeout for YUV sensor.
+        if (gCamCapability[mCameraId]->position == CAM_POSITION_FRONT &&
+                aeTrigger.trigger_id > 0 && aeTrigger.trigger ==
+                ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START) {
+            ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
+        }
+        camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
     }
     uint8_t  *focusMode =
         (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
@@ -2567,12 +2578,14 @@
  *   @frame_id  : frame number for this particular request
  *   @settings  : frame settings information from framework
  *   @streamTypeMask : bit mask of stream types on which buffers are requested
+ *   @aeTrigger : Return aeTrigger if it exists in the request
  *
  * RETURN     : success: NO_ERROR
  *              failure:
  *==========================================================================*/
 int QCamera3HardwareInterface::setFrameParameters(int frame_id,
-                    const camera_metadata_t *settings, uint32_t streamTypeMask)
+        const camera_metadata_t *settings, uint32_t streamTypeMask,
+        cam_trigger_t &aeTrigger)
 {
     /*translate from camera_metadata_t type to parm_type_t*/
     int rc = 0;
@@ -2605,7 +2618,7 @@
     }
 
     if(settings != NULL){
-        rc = translateMetadataToParameters(settings);
+        rc = translateMetadataToParameters(settings, aeTrigger);
     }
     /*set the parameters to backend*/
     mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
@@ -2620,13 +2633,13 @@
  *
  * PARAMETERS :
  *   @settings  : frame settings information from framework
- *
+ *   @aeTrigger : output ae trigger if it's set in request
  *
  * RETURN     : success: NO_ERROR
  *              failure:
  *==========================================================================*/
-int QCamera3HardwareInterface::translateMetadataToParameters
-                                  (const camera_metadata_t *settings)
+int QCamera3HardwareInterface::translateMetadataToParameters(
+        const camera_metadata_t *settings, cam_trigger_t &aeTrigger)
 {
     int rc = 0;
     CameraMetadata frame_settings;
@@ -2782,18 +2795,16 @@
                     sizeof(colorCorrectTransform), &colorCorrectTransform);
     }
 
-    cam_trigger_t aecTrigger;
-    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
-    aecTrigger.trigger_id = -1;
     if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
         frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
-        aecTrigger.trigger =
+        aeTrigger.trigger =
             frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
-        aecTrigger.trigger_id =
+        aeTrigger.trigger_id =
             frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
+        mPrecaptureId = aeTrigger.trigger_id;
     }
     rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
-                                sizeof(aecTrigger), &aecTrigger);
+                                sizeof(aeTrigger), &aeTrigger);
 
     /*af_trigger must come with a trigger id*/
     if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 148e9eb..71baf9e 100755
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
+/* Copyright (c) 2012-2013, 2015, The Linux Foundataion. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
@@ -121,10 +121,13 @@
     void getMetadataVendorTagOps(vendor_tag_query_ops_t* ops);
     void dump(int fd);
 
-    int setFrameParameters(int frame_id, const camera_metadata_t *settings, uint32_t streamTypeMask);
-    int translateMetadataToParameters(const camera_metadata_t *settings);
+    int setFrameParameters(int frame_id, const camera_metadata_t *settings,
+        uint32_t streamTypeMask, cam_trigger_t &aeTrigger);
+    int translateMetadataToParameters(const camera_metadata_t *settings,
+            cam_trigger_t &aeTrigger);
     camera_metadata_t* translateCbMetadataToResultMetadata(metadata_buffer_t *metadata,
-                            nsecs_t timestamp, int32_t request_id);
+                            nsecs_t timestamp, int32_t request_id,
+                            const cam_trigger_t &aeTrigger);
     int getJpegSettings(const camera_metadata_t *settings);
     int initParameters();
     void deinitParameters();
@@ -197,6 +200,7 @@
         int32_t request_id;
         List<RequestedBufferInfo> buffers;
         int blob_request;
+        cam_trigger_t ae_trigger;
     } PendingRequestInfo;
     typedef KeyedVector<camera3_stream_t *, uint32_t> PendingBuffersMap;
 
@@ -216,6 +220,8 @@
 
     power_module_t *m_pPowerModule;   // power module
 
+    int32_t mPrecaptureId;
+
     static const QCameraMap EFFECT_MODES_MAP[];
     static const QCameraMap WHITE_BALANCE_MODES_MAP[];
     static const QCameraMap SCENE_MODES_MAP[];