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;
+}