Camera3: Metadata translation
This change adds more static metadata and translates between
request and parameters.
Change-Id: I86e01273244adb9a246223398622bf5042ac3a98
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 865cebc..b5c701b 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -46,6 +46,7 @@
namespace qcamera {
#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
cam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
+parm_buffer_t *prevSettings;
const camera_metadata_t *gStaticMetadata;
@@ -401,6 +402,28 @@
return NO_ERROR;
}
+/*===========================================================================
+ * FUNCTION : processCaptureRequest
+ *
+ * DESCRIPTION:
+ *
+ *
+ * PARAMETERS :
+ * @request : request from framework to process
+ *
+ * RETURN :
+ *
+ *==========================================================================*/
+int QCamera3HardwareInterface::processCaptureRequest
+ (camera3_capture_request_t *request)
+{
+ /*For each frame, we have to set the requested settings*/
+ int rc = NO_ERROR;
+ rc = setFrameParameters(request->settings);
+ /*do the actual processing*/
+ return rc;
+}
+
#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
/*===========================================================================
* FUNCTION : initCapabilities
@@ -515,15 +538,96 @@
(int*)gCamCapability[cameraId]->optical_stab_modes,
gCamCapability[cameraId]->optical_stab_modes_count);
-
- /* staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
- gCamCapability[cameraId]->lens_shading_map_size,
- sizeof(cam_dimension_t)/sizeof(int32_t)); */
-
staticInfo.update(ANDROID_LENS_POSITION,
- gCamCapability[cameraId]->lens_position,
- sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
+ gCamCapability[cameraId]->lens_position,
+ sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
+ static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
+ gCamCapability[cameraId]->lens_shading_map_size.height};
+ staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
+ lens_shading_map_size,
+ sizeof(lens_shading_map_size)/sizeof(int32_t));
+
+ staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map,
+ sizeof(gCamCapability[cameraId]->lens_shading_map_size)/ sizeof(cam_dimension_t));
+
+ static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
+ gCamCapability[cameraId]->geo_correction_map_size.height};
+ staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
+ geo_correction_map_size,
+ sizeof(geo_correction_map_size)/sizeof(int32_t));
+
+ staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
+ gCamCapability[cameraId]->geo_correction_map,
+ sizeof(gCamCapability[cameraId]->geo_correction_map_size)/ sizeof(cam_dimension_t));
+
+ staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
+ gCamCapability[cameraId]->sensor_physical_size, 2);
+
+ staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
+ gCamCapability[cameraId]->exposure_time_range, 2);
+
+ staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
+ &gCamCapability[cameraId]->max_frame_duration, 1);
+
+
+ staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
+ (int*)&gCamCapability[cameraId]->color_arrangement, 1);
+
+ static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
+ gCamCapability[cameraId]->pixel_array_size.height};
+ staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
+ pixel_array_size, 2);
+
+ static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width,
+ gCamCapability[cameraId]->active_array_size.height};
+ staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
+ active_array_size, 2);
+
+ staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
+ &gCamCapability[cameraId]->white_level, 1);
+
+ staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
+ gCamCapability[cameraId]->black_level_pattern, 4);
+
+ staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
+ &gCamCapability[cameraId]->flash_charge_duration, 1);
+
+ staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
+ &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
+
+ staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
+ (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);
+
+ staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
+ &gCamCapability[cameraId]->histogram_size, 1);
+
+ staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
+ &gCamCapability[cameraId]->max_histogram_count, 1);
+
+ static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
+ gCamCapability[cameraId]->sharpness_map_size.height};
+
+ staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
+ sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
+
+ staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
+ &gCamCapability[cameraId]->max_sharpness_map_value, 1);
+
+
+ staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
+ &gCamCapability[cameraId]->raw_min_duration,
+ 1);
+
+ static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
+ gCamCapability[cameraId]->exposure_compensation_max};
+ staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
+ exposureCompensationRange,
+ sizeof(exposureCompensationRange)/sizeof(int32_t));
+
+ uint8_t lensFacing = (gCamCapability[cameraId]->position == CAM_POSITION_BACK) ?
+ ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
+ staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
gStaticMetadata = staticInfo.release();
return rc;
@@ -584,69 +688,7 @@
return rc;
}
-#if 0
-/*===========================================================================
- * FUNCTION : getMetadata
- *
- * DESCRIPTION: query camera metadata
- *
- * PARAMETERS :
- * @cameraId : camera Id
- * @info : camera info struct to be filled in with camera metadata
- *
- * RETURN : int32_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-int QCamera3HardwareInterface::getMetadata(int type)
-{
- QCamera3HeapMemory *metadataHeap = NULL;
- int rc = 0;
- metadataHeap = new QCamera3HeapMemory();
- rc = metadataHeap->allocate(1, sizeof(metadata_type_t));
- if(rc != 0) {
- ALOGE("%s: No memory for metadata", __func__);
- }
-
- rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
- CAM_MAPPING_BUF_TYPE_CAPABILITY,
- metadataHeap->getFd(0),
- sizeof(metadata_type_t));
- if(rc < 0) {
- ALOGE("%s: failed to map capability buffer", __func__);
- metadataHeap->deallocate();
- delete metadataHeap;
- }
-
- /* Query Metadata */
- //rc = cameraHandle->ops->query_metadata(cameraHandle->camera_handle, type);
- rc = mCameraHandle->ops->query_capability(mCameraHandle->camera_handle);
-
- if(rc < 0) {
- ALOGE("%s: failed to query metadata",__func__);
- mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
- CAM_MAPPING_BUF_TYPE_CAPABILITY);
- }
- /*delete the old metadata saved in the HAL*/
- if (curr_metadata != NULL) {
- free(curr_metadata);
- curr_metadata = NULL;
- }
- curr_metadata = (metadata_type_t *)malloc(sizeof(metadata_type_t));
- if (!curr_metadata) {
- ALOGE("%s: out of memory", __func__);
- mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
- CAM_MAPPING_BUF_TYPE_CAPABILITY);
- }
- memcpy(curr_metadata, DATA_PTR(metadataHeap,0),
- sizeof(metadata_type_t));
-
- //metadata now saved in the HAL - still need to copy over to correct
- //format and send to fwk
- return rc;
-}
-#endif
/*===========================================================================
* FUNCTION : translateMetadata
*
@@ -731,18 +773,65 @@
static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0];
settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
-
- /* scalar */
- //settings.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, &gCamCapability[mCameraId]->min_duration, 1);
- //settings.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, &gCamCapability[mCameraId]->raw_min_duration, 1);
-
-
-
mDefaultMetadata[type] = settings.release();
return mDefaultMetadata[type];
}
/*===========================================================================
+ * FUNCTION : setFrameParameters
+ *
+ * DESCRIPTION: set parameters per frame as requested in the metadata from
+ * framework
+ *
+ * PARAMETERS :
+ * @settings : frame settings information from framework
+ *
+ *
+ * RETURN : success: NO_ERROR
+ * failure:
+ *==========================================================================*/
+int QCamera3HardwareInterface::setFrameParameters(const camera_metadata_t *settings)
+{
+ /*translate from camera_metadata_t type to parm_type_t*/
+ int rc = 0;
+ android::CameraMetadata frame_settings;
+ if (settings == NULL && prevSettings == NULL) {
+ /*settings cannot be null for the first request*/
+ return BAD_VALUE;
+ } else if (settings == NULL) {
+ /*do nothing? we have already configured the settings previously*/
+ } else{
+ //reset the prevSettings
+ if (prevSettings != NULL) {
+ free(prevSettings);
+ prevSettings = NULL;
+ }
+ rc = translateMetadataToParameters(settings);
+ }
+ /*set the parameters to backend*/
+ return rc;
+}
+
+/*===========================================================================
+ * FUNCTION : translateMetadataToParameters
+ *
+ * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
+ *
+ *
+ * PARAMETERS :
+ * @settings : frame settings information from framework
+ *
+ *
+ * RETURN : success: NO_ERROR
+ * failure:
+ *==========================================================================*/
+int QCamera3HardwareInterface::translateMetadataToParameters
+ (const camera_metadata_t *settings)
+{
+ return 0;
+}
+
+/*===========================================================================
* FUNCTION : channelCbRoutine
*
* DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
@@ -879,11 +968,19 @@
*
* RETURN :
*==========================================================================*/
-int QCamera3HardwareInterface::process_capture_request(const struct camera3_device *,
+int QCamera3HardwareInterface::process_capture_request(const struct camera3_device *device,
camera3_capture_request_t *request)
{
/*TODO - Implement*/
- return 0;
+ QCamera3HardwareInterface *hw =
+ reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
+ int rc = NO_ERROR;
+ if (!hw) {
+ ALOGE("%s: NULL camera device", __func__);
+ return -ENODEV;
+ }
+ rc = hw->processCaptureRequest(request);
+ return rc;
}
/*===========================================================================
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index c0b0066..f77abdd 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -85,6 +85,10 @@
int initialize(const camera3_callback_ops_t *callback_ops);
int configureStreams(camera3_stream_configuration_t *stream_list);
int registerStreamBuffers(const camera3_stream_buffer_set_t *buffer_set);
+ int processCaptureRequest(camera3_capture_request_t *request);
+
+ int setFrameParameters(const camera_metadata_t *settings);
+ int translateMetadataToParameters(const camera_metadata_t *settings);
private:
int openCamera();