camera: exif support using the new metadata structure

1. Change the mm-jpeg-interface to support 2 different version
    if the metadata structure.
2. Extract exif data from the new metadata structure

Bug: 10037666
Change-Id: I9be22208ad1be0ce3b852b3920ec1beb10a44d9f
diff --git a/camera/QCamera2/HAL/QCameraPostProc.cpp b/camera/QCamera2/HAL/QCameraPostProc.cpp
index 01b70f1..c301bde 100644
--- a/camera/QCamera2/HAL/QCameraPostProc.cpp
+++ b/camera/QCamera2/HAL/QCameraPostProc.cpp
@@ -1105,7 +1105,7 @@
     }
     if (meta_frame != NULL) {
         // fill in meta data frame ptr
-        jpg_job.encode_job.p_metadata = (cam_metadata_info_t *)meta_frame->buffer;
+        jpg_job.encode_job.p_metadata_v1 = (cam_metadata_info_t *)meta_frame->buffer;
     }
 
     ALOGD("[KPI Perf] %s : call jpeg start_job", __func__);
diff --git a/camera/QCamera2/HAL3/QCamera3PostProc.cpp b/camera/QCamera2/HAL3/QCamera3PostProc.cpp
index 2ccae48..b54da47 100644
--- a/camera/QCamera2/HAL3/QCamera3PostProc.cpp
+++ b/camera/QCamera2/HAL3/QCamera3PostProc.cpp
@@ -764,7 +764,7 @@
  *              none-zero failure code
  *==========================================================================*/
 int32_t QCamera3PostProcessor::encodeData(qcamera_jpeg_data_t *jpeg_job_data,
-                                         uint8_t &needNewSess)
+                          uint8_t &needNewSess, mm_camera_super_buf_t *p_metaFrame)
 {
     ALOGV("%s : E", __func__);
     int32_t ret = NO_ERROR;
@@ -979,9 +979,14 @@
     }
     if (meta_frame != NULL) {
         // fill in meta data frame ptr
-        jpg_job.encode_job.p_metadata = (cam_metadata_info_t *)meta_frame->buffer;
+        jpg_job.encode_job.p_metadata_v1 = (cam_metadata_info_t *)meta_frame->buffer;
+    } else if (p_metaFrame != NULL) {
+       //Fill in the metadata passed as parameter
+       jpg_job.encode_job.p_metadata_v3 = (metadata_buffer_t *)p_metaFrame->bufs[0]->buffer;;
+    } else {
+       ALOGE("%s: Metadata is null", __func__);
     }
-
+    //Not required here
     //jpg_job.encode_job.cam_exif_params = m_parent->mExifParams;
     //Start jpeg encoding
     ret = mJpegHandle.start_job(&jpg_job, &jobId);
@@ -1012,6 +1017,8 @@
     int ret;
     uint8_t is_active = FALSE;
     uint8_t needNewSess = TRUE;
+    mm_camera_super_buf_t *pp_frame = NULL;
+    mm_camera_super_buf_t *meta_frame = NULL;
     ALOGV("%s: E", __func__);
     QCamera3PostProcessor *pme = (QCamera3PostProcessor *)data;
     QCameraCmdThread *cmdThread = &pme->m_dataProcTh;
@@ -1100,7 +1107,7 @@
 
                             // add into ongoing jpeg job Q
                             pme->m_ongoingJpegQ.enqueue((void *)jpeg_job);
-                            ret = pme->encodeData(jpeg_job, needNewSess);
+                            ret = pme->encodeData(jpeg_job, needNewSess, meta_frame);
                             if (NO_ERROR != ret) {
                                 // dequeue the last one
                                 pme->m_ongoingJpegQ.dequeue(false);
@@ -1111,10 +1118,9 @@
                         }
                     }
                     ALOGE("%s: dequeuing pp frame", __func__);
-                    mm_camera_super_buf_t *pp_frame =
+                    pp_frame =
                         (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue();
                     if (NULL != pp_frame) {
-                       mm_camera_super_buf_t *meta_frame = NULL;
                        meta_frame =
                                (mm_camera_super_buf_t *)pme->m_inputMetaQ.dequeue();
                        if (meta_frame == NULL) {
diff --git a/camera/QCamera2/HAL3/QCamera3PostProc.h b/camera/QCamera2/HAL3/QCamera3PostProc.h
index 9c0f3c8..b970c24 100755
--- a/camera/QCamera2/HAL3/QCamera3PostProc.h
+++ b/camera/QCamera2/HAL3/QCamera3PostProc.h
@@ -119,7 +119,7 @@
                                   QCamera3Stream *main_stream,
                                   QCamera3Stream *thumb_stream);
     int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data,
-                       uint8_t &needNewSess);
+                       uint8_t &needNewSess, mm_camera_super_buf_t *p_metaFrame);
     void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
     static void releaseNotifyData(void *user_data, void *cookie);
     int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame);
diff --git a/camera/QCamera2/stack/common/cam_intf.h b/camera/QCamera2/stack/common/cam_intf.h
index a13e909..3b142d7 100644
--- a/camera/QCamera2/stack/common/cam_intf.h
+++ b/camera/QCamera2/stack/common/cam_intf.h
@@ -541,6 +541,7 @@
     INCLUDE(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,     uint8_t,                     1);
     INCLUDE(CAM_INTF_META_STATS_SHARPNESS_MAP,          cam_sharpness_map_t,         3);
     INCLUDE(CAM_INTF_META_LENS_SHADING_MAP,             cam_lens_shading_map_t,      1);
+    INCLUDE(CAM_INTF_META_AEC_INFO,                     cam_ae_params_t,              1);
     INCLUDE(CAM_INTF_META_PRIVATE_DATA,                 char,                        MAX_METADATA_PAYLOAD_SIZE);
 } metadata_type_t;
 
diff --git a/camera/QCamera2/stack/common/cam_types.h b/camera/QCamera2/stack/common/cam_types.h
index c4f8509..1ef5da0 100644
--- a/camera/QCamera2/stack/common/cam_types.h
+++ b/camera/QCamera2/stack/common/cam_types.h
@@ -1025,6 +1025,8 @@
     CAM_INTF_META_PRIVATE_DATA,
     /* Indicates streams this request needs buffers on */
     CAM_INTF_META_STREAM_TYPE_MASK,
+    /*AEC info for Exif*/
+    CAM_INTF_META_AEC_INFO,
     CAM_INTF_PARM_MAX
 } cam_intf_parm_type_t;
 
diff --git a/camera/QCamera2/stack/common/mm_jpeg_interface.h b/camera/QCamera2/stack/common/mm_jpeg_interface.h
index 378414a..1ffd211 100644
--- a/camera/QCamera2/stack/common/mm_jpeg_interface.h
+++ b/camera/QCamera2/stack/common/mm_jpeg_interface.h
@@ -150,8 +150,11 @@
   /*session id*/
   uint32_t session_id;
 
-  /*Metadata stream*/
-  cam_metadata_info_t *p_metadata;
+  /*Metadata from HAl version 1 */
+  cam_metadata_info_t *p_metadata_v1;
+
+  /*Metadata stream from HAL version 3*/
+  metadata_buffer_t *p_metadata_v3;
 
   /* buf to exif entries, caller needs to
    * take care of the memory manage with insider ptr */
diff --git a/camera/QCamera2/stack/mm-jpeg-interface/inc/mm_jpeg.h b/camera/QCamera2/stack/mm-jpeg-interface/inc/mm_jpeg.h
index 61caa46..629049d 100644
--- a/camera/QCamera2/stack/mm-jpeg-interface/inc/mm_jpeg.h
+++ b/camera/QCamera2/stack/mm-jpeg-interface/inc/mm_jpeg.h
@@ -195,7 +195,9 @@
 extern int32_t addExifEntry(QOMX_EXIF_INFO *p_exif_info, exif_tag_id_t tagid,
   exif_tag_type_t type, uint32_t count, void *data);
 extern int32_t releaseExifEntry(QEXIF_INFO_DATA *p_exif_data);
-extern int process_meta_data(cam_metadata_info_t *p_meta,
+extern int process_meta_data_v1(cam_metadata_info_t *p_meta,
+  QOMX_EXIF_INFO *exif_info, mm_jpeg_exif_params_t *p_cam_exif_params);
+extern int process_meta_data_v3(metadata_buffer_t *p_meta,
   QOMX_EXIF_INFO *exif_info, mm_jpeg_exif_params_t *p_cam3a_params);
 
 #endif /* MM_JPEG_H_ */
diff --git a/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c b/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c
index 4f28ec9..e05b8e9 100644
--- a/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c
+++ b/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg.c
@@ -1079,7 +1079,7 @@
     CDBG_ERROR("%s:%d] Error %d", __func__, __LINE__, rc);
     return rc;
   }
-  CDBG("%s:%d] Num of exif entries passed from HAL: %d", __func__, __LINE__,
+  CDBG_ERROR("%s:%d] Num of exif entries passed from HAL: %d", __func__, __LINE__,
       (int)p_jobparams->exif_info.numOfEntries);
   if (p_jobparams->exif_info.numOfEntries > 0) {
      rc = OMX_SetConfig(p_session->omx_handle, exif_idx,
@@ -1089,11 +1089,19 @@
       return rc;
     }
   }
-  /*parse aditional exif data from the metadata*/
-  if (NULL != p_jobparams->p_metadata) {
+  /*parse aditional exif data from the metadata if present*/
+  if ((NULL != p_jobparams->p_metadata_v3) ||
+    (NULL != p_jobparams->p_metadata_v1)) {
     exif_info.numOfEntries = 0;
     exif_info.exif_data = &p_session->exif_info_local[0];
-  process_meta_data(p_jobparams->p_metadata, &exif_info, &p_jobparams->cam_exif_params);
+
+    if (NULL != p_jobparams->p_metadata_v3) {
+      process_meta_data_v3(p_jobparams->p_metadata_v3,
+          &exif_info, &p_jobparams->cam_exif_params);
+    } else {
+      process_meta_data_v1(p_jobparams->p_metadata_v1,
+        &exif_info, &p_jobparams->cam_exif_params);
+    }
     /* After Parse metadata */
     p_session->exif_count_local = exif_info.numOfEntries;
 
@@ -1108,6 +1116,8 @@
       return rc;
       }
     }
+  } else {
+    CDBG_ERROR("%s:%d] Metadata is null", __func__, __LINE__, rc);
   }
 
   return rc;
diff --git a/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg_exif.c b/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg_exif.c
index 6773410..f3de998 100644
--- a/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg_exif.c
+++ b/camera/QCamera2/stack/mm-jpeg-interface/src/mm_jpeg_exif.c
@@ -29,6 +29,7 @@
 
 #include "mm_jpeg_dbg.h"
 #include "mm_jpeg.h"
+
 #include <errno.h>
 #include <math.h>
 
@@ -310,6 +311,20 @@
     ALOGE("%s:%d]: Error adding Exif Entry", __func__, __LINE__);
   }
 
+  /*Flash*/
+  short val_short;
+  if (p_sensor_params->flash_state == CAM_FLASH_STATE_FIRED) {
+    val_short = 1;
+  } else {
+    val_short = 0;
+  }
+  //val_short =  (p_sensor_params->flash_mode << 3) | val_short;
+  ALOGE("%s: Flash value %d flash mode %d flash state %d", __func__, val_short,
+    p_sensor_params->flash_mode, p_sensor_params->flash_state);
+  rc = addExifEntry(exif_info, EXIFTAGID_FLASH, EXIF_SHORT, 1, &val_short);
+  if (rc) {
+    ALOGE("%s %d]: Error adding flash exif entry", __func__, __LINE__);
+  }
   return rc;
 }
 /** process_3a_data:
@@ -347,9 +362,9 @@
       val_rat.denom = 0;
   } else {
       val_rat.num = 1;
-      val_rat.denom = ROUND((double)p_ae_params->exp_time * 1000);
+      val_rat.denom = ROUND(1.0/p_ae_params->exp_time);
   }
-  ALOGE("%s: numer %d denom %d", __func__, val_rat.num, val_rat.denom );
+  ALOGD("%s: numer %d denom %d", __func__, val_rat.num, val_rat.denom );
 
   rc = addExifEntry(exif_info, EXIFTAGID_EXPOSURE_TIME, EXIF_RATIONAL,
     (sizeof(val_rat)/(8)), &val_rat);
@@ -382,10 +397,12 @@
     ALOGE("%s:%d]: Error adding Exif Entry", __func__, __LINE__);
   }
 
+
  return rc;
 
 }
-/** processMetaData:
+
+/** process_meta_data_v1:
  *
  *  Arguments:
  *   @p_meta : ptr to metadata
@@ -398,9 +415,8 @@
  *  Description:
  *       process awb debug info
  *
- *  Notes: this needs to be filled for the metadata
  **/
-int process_meta_data(cam_metadata_info_t *p_meta, QOMX_EXIF_INFO *exif_info,
+int process_meta_data_v1(cam_metadata_info_t *p_meta, QOMX_EXIF_INFO *exif_info,
   mm_jpeg_exif_params_t *p_cam_exif_params)
 {
   int rc = 0;
@@ -410,7 +426,7 @@
     return 0;
   }
   cam_ae_params_t *p_ae_params = p_meta->is_ae_params_valid ?
-    &p_meta->ae_params : &p_cam_exif_params->ae_params;
+    &p_meta->ae_params : NULL;
 
   if (NULL != p_ae_params) {
     rc = process_3a_data(p_ae_params, exif_info);
@@ -419,7 +435,7 @@
     }
   }
   cam_sensor_params_t *p_sensor_params = p_meta->is_sensor_params_valid ?
-    &p_meta->sensor_params : &p_cam_exif_params->sensor_params;
+    &p_meta->sensor_params : NULL;
 
   if (NULL != p_sensor_params) {
     rc = process_sensor_data(p_sensor_params, exif_info);
@@ -429,3 +445,85 @@
   }
   return rc;
 }
+
+/** process_meta_data_v3:
+ *
+ *  Arguments:
+ *   @p_meta : ptr to metadata
+ *   @exif_info: Exif info struct
+ *
+ *  Return     : int32_t type of status
+ *               NO_ERROR  -- success
+ *              none-zero failure code
+ *
+ *  Description:
+ *       Extract exif data from the metadata
+ **/
+int process_meta_data_v3(metadata_buffer_t *p_meta, QOMX_EXIF_INFO *exif_info,
+  mm_jpeg_exif_params_t *p_cam_exif_params)
+{
+  int rc = 0;
+  cam_sensor_params_t p_sensor_params;
+  cam_ae_params_t p_ae_params;
+
+  if (!p_meta) {
+    ALOGE("%s %d:Meta data is NULL", __func__, __LINE__);
+    return 0;
+  }
+  int32_t *iso =
+    (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, p_meta);
+
+  int64_t *sensor_exposure_time =
+    (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, p_meta);
+
+  memset(&p_ae_params,  0,  sizeof(cam_ae_params_t));
+  if (NULL != iso) {
+    p_ae_params.iso_value= *iso;
+  } else {
+    ALOGE("%s: Cannot extract Iso value", __func__);
+  }
+
+  if (NULL != sensor_exposure_time) {
+    p_ae_params.exp_time = (double)(*sensor_exposure_time / 1000000000.0);
+  } else {
+    ALOGE("%s: Cannot extract Exp time value", __func__);
+  }
+
+  rc = process_3a_data(&p_ae_params, exif_info);
+  if (rc) {
+    ALOGE("%s %d: Failed to add 3a exif params", __func__, __LINE__);
+  }
+
+  float *aperture = (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, p_meta);
+
+  uint8_t *flash_mode = (uint8_t *) POINTER_OF(CAM_INTF_META_FLASH_MODE, p_meta);
+  uint8_t *flash_state =
+    (uint8_t *) POINTER_OF(CAM_INTF_META_FLASH_STATE, p_meta);
+
+  memset(&p_sensor_params, 0, sizeof(cam_sensor_params_t));
+
+  if (NULL != aperture) {
+     p_sensor_params.aperture_value = *aperture;
+  } else {
+    ALOGE("%s: Cannot extract Aperture value", __func__);
+  }
+
+  if (NULL != flash_mode) {
+     p_sensor_params.flash_mode = *flash_mode;
+  } else {
+    ALOGE("%s: Cannot extract flash mode value", __func__);
+  }
+
+  if (NULL != flash_state) {
+    p_sensor_params.flash_state = *flash_state;
+  } else {
+    ALOGE("%s: Cannot extract flash state value", __func__);
+  }
+
+  rc = process_sensor_data(&p_sensor_params, exif_info);
+  if (rc) {
+      ALOGE("%s %d: Failed to extract sensor params", __func__, __LINE__);
+  }
+
+  return rc;
+}