summaryrefslogtreecommitdiff
path: root/camera
diff options
context:
space:
mode:
authorShuzhen Wang <shuzhenwang@google.com>2017-07-21 11:39:44 -0700
committerShuzhen Wang <shuzhenwang@google.com>2017-07-26 18:27:21 -0700
commit5c0123448f9788d62654fb08ce7d3e33a962197f (patch)
tree07274d84527af44505075e9d394a9e38a2292b1a /camera
parentf85755bf10bade33efef141d40f4c96029b9839c (diff)
QCamera2: HAL3: Support AF_STATE in both partial result and final result
Currently AF_STATE during AF_TRIGGER is sent 3 frames early (apply_delay 2, and report_delay 1). Without AF_TRIGGER, the AF_STATE is reported at the right time: after AF stats for the current readout frame are analyzed. In the case where AF_TRIGGER results in a state transition, send the new state in partial result, and use last know AF state for all preceding results. This shift applies to both TRIGGER_START and TRIGGER_CANCEL. Also move af_mode back to partial result. Test: Camera CTS, and AF_STATE during HDR+ burst. Bug: 63766738 Change-Id: I968ca06d6909996a0b77d3b247ed0722ab92bb6a
Diffstat (limited to 'camera')
-rw-r--r--camera/QCamera2/HAL3/QCamera3HWI.cpp131
-rw-r--r--camera/QCamera2/HAL3/QCamera3HWI.h23
-rw-r--r--camera/QCamera2/stack/common/cam_intf.h2
-rw-r--r--camera/QCamera2/stack/common/cam_types.h2
4 files changed, 90 insertions, 68 deletions
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 3d17918e..5040bac2 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -385,7 +385,8 @@ QCamera3HardwareInterface::QCamera3HardwareInterface(uint32_t cameraId,
mIsMainCamera(true),
mLinkedCameraId(0),
m_pRelCamSyncHeap(NULL),
- m_pRelCamSyncBuf(NULL)
+ m_pRelCamSyncBuf(NULL),
+ mAfTrigger()
{
getLogLevel();
m_perfLock.lock_init();
@@ -2966,6 +2967,7 @@ void QCamera3HardwareInterface::notifyError(uint32_t frameNumber,
return;
}
+
/*===========================================================================
* FUNCTION : handleMetadataWithLock
*
@@ -3101,7 +3103,7 @@ void QCamera3HardwareInterface::handleMetadataWithLock(
i->bUrgentReceived = 1;
// Extract 3A metadata
result.result = translateCbUrgentMetadataToResultMetadata(
- metadata, lastUrgentMetadataInBatch);
+ metadata, lastUrgentMetadataInBatch, urgent_frame_number);
// Populate metadata result
result.frame_number = urgent_frame_number;
result.num_output_buffers = 0;
@@ -3232,13 +3234,7 @@ void QCamera3HardwareInterface::handleMetadataWithLock(
// atrace_begin(ATRACE_TAG_ALWAYS, "translateFromHalMetadata");
result.result = translateFromHalMetadata(metadata,
- i->timestamp, i->request_id, i->jpegMetadata, i->pipeline_depth,
- i->capture_intent, i->hybrid_ae_enable,
- /* DevCamDebug metadata translateFromHalMetadata function call*/
- i->DevCamDebug_meta_enable,
- /* DevCamDebug metadata end */
- internalPproc, i->fwkCacMode,
- lastMetadataInBatch);
+ *i, internalPproc, lastMetadataInBatch);
// atrace_end(ATRACE_TAG_ALWAYS);
saveExifParams(metadata);
@@ -5068,13 +5064,7 @@ template <class mapType> cam_cds_mode_type_t lookupProp(const mapType *arr,
*
* PARAMETERS :
* @metadata : metadata information from callback
- * @timestamp: metadata buffer timestamp
- * @request_id: request id
- * @jpegMetadata: additional jpeg metadata
- * @hybrid_ae_enable: whether hybrid ae is enabled
- * // DevCamDebug metadata
- * @DevCamDebug_meta_enable: enable DevCamDebug meta
- * // DevCamDebug metadata end
+ * @pendingRequest: pending request for this metadata
* @pprocDone: whether internal offline postprocsesing is done
* @lastMetadataInBatch: Boolean to indicate whether this is the last metadata
* in a batch. Always true for non-batch mode.
@@ -5085,17 +5075,8 @@ template <class mapType> cam_cds_mode_type_t lookupProp(const mapType *arr,
camera_metadata_t*
QCamera3HardwareInterface::translateFromHalMetadata(
metadata_buffer_t *metadata,
- nsecs_t timestamp,
- int32_t request_id,
- const CameraMetadata& jpegMetadata,
- uint8_t pipeline_depth,
- uint8_t capture_intent,
- uint8_t hybrid_ae_enable,
- /* DevCamDebug metadata translateFromHalMetadata argument */
- uint8_t DevCamDebug_meta_enable,
- /* DevCamDebug metadata end */
+ const PendingRequestInfo& pendingRequest,
bool pprocDone,
- uint8_t fwk_cacMode,
bool lastMetadataInBatch)
{
CameraMetadata camMetadata;
@@ -5107,22 +5088,22 @@ QCamera3HardwareInterface::translateFromHalMetadata(
return resultMetadata;
}
- if (jpegMetadata.entryCount())
- camMetadata.append(jpegMetadata);
+ if (pendingRequest.jpegMetadata.entryCount())
+ camMetadata.append(pendingRequest.jpegMetadata);
- camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
- camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
- camMetadata.update(ANDROID_REQUEST_PIPELINE_DEPTH, &pipeline_depth, 1);
- camMetadata.update(ANDROID_CONTROL_CAPTURE_INTENT, &capture_intent, 1);
- camMetadata.update(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE, &hybrid_ae_enable, 1);
+ camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &pendingRequest.timestamp, 1);
+ camMetadata.update(ANDROID_REQUEST_ID, &pendingRequest.request_id, 1);
+ camMetadata.update(ANDROID_REQUEST_PIPELINE_DEPTH, &pendingRequest.pipeline_depth, 1);
+ camMetadata.update(ANDROID_CONTROL_CAPTURE_INTENT, &pendingRequest.capture_intent, 1);
+ camMetadata.update(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE, &pendingRequest.hybrid_ae_enable, 1);
if (mBatchSize == 0) {
// DevCamDebug metadata translateFromHalMetadata. Only update this one for non-HFR mode
- camMetadata.update(DEVCAMDEBUG_META_ENABLE, &DevCamDebug_meta_enable, 1);
+ camMetadata.update(DEVCAMDEBUG_META_ENABLE, &pendingRequest.DevCamDebug_meta_enable, 1);
}
// atrace_begin(ATRACE_TAG_ALWAYS, "DevCamDebugInfo");
// Only update DevCameraDebug metadta conditionally: non-HFR mode and it is enabled.
- if (mBatchSize == 0 && DevCamDebug_meta_enable != 0) {
+ if (mBatchSize == 0 && pendingRequest.DevCamDebug_meta_enable != 0) {
// DevCamDebug metadata translateFromHalMetadata AF
IF_META_AVAILABLE(int32_t, DevCamDebug_af_lens_position,
CAM_INTF_META_DEV_CAM_AF_LENS_POSITION, metadata) {
@@ -5930,24 +5911,19 @@ QCamera3HardwareInterface::translateFromHalMetadata(
hAeRegions->rect.height);
}
- IF_META_AVAILABLE(uint32_t, focusMode, CAM_INTF_PARM_FOCUS_MODE, metadata) {
- int val = lookupFwkName(FOCUS_MODES_MAP, METADATA_MAP_SIZE(FOCUS_MODES_MAP), *focusMode);
- if (NAME_NOT_FOUND != val) {
- uint8_t fwkAfMode = (uint8_t)val;
- camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1);
- LOGD("Metadata : ANDROID_CONTROL_AF_MODE %d", val);
+ if (!pendingRequest.focusStateSent) {
+ if (pendingRequest.focusStateValid) {
+ camMetadata.update(ANDROID_CONTROL_AF_STATE, &pendingRequest.focusState, 1);
+ LOGD("Metadata : ANDROID_CONTROL_AF_STATE %u", pendingRequest.focusState);
} else {
- LOGH("Metadata not found : ANDROID_CONTROL_AF_MODE %d",
- val);
+ IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, metadata) {
+ uint8_t fwk_afState = (uint8_t) *afState;
+ camMetadata.update(ANDROID_CONTROL_AF_STATE, &fwk_afState, 1);
+ LOGD("Metadata : ANDROID_CONTROL_AF_STATE %u", *afState);
+ }
}
}
- IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, metadata) {
- uint8_t fwk_afState = (uint8_t) *afState;
- camMetadata.update(ANDROID_CONTROL_AF_STATE, &fwk_afState, 1);
- LOGD("Metadata : ANDROID_CONTROL_AF_STATE %u", *afState);
- }
-
IF_META_AVAILABLE(float, focusDistance, CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata) {
camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
}
@@ -6115,10 +6091,10 @@ QCamera3HardwareInterface::translateFromHalMetadata(
uint8_t resultCacMode = (uint8_t)val;
// check whether CAC result from CB is equal to Framework set CAC mode
// If not equal then set the CAC mode came in corresponding request
- if (fwk_cacMode != resultCacMode) {
- resultCacMode = fwk_cacMode;
+ if (pendingRequest.fwkCacMode != resultCacMode) {
+ resultCacMode = pendingRequest.fwkCacMode;
}
- LOGD("fwk_cacMode=%d resultCacMode=%d", fwk_cacMode, resultCacMode);
+ LOGD("fwk_cacMode=%d resultCacMode=%d", pendingRequest.fwkCacMode, resultCacMode);
camMetadata.update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &resultCacMode, 1);
} else {
LOGE("Invalid CAC camera parameter: %d", *cacMode);
@@ -6273,13 +6249,15 @@ mm_jpeg_exif_params_t QCamera3HardwareInterface::get3AExifParams()
* @lastUrgentMetadataInBatch: Boolean to indicate whether this is the last
* urgent metadata in a batch. Always true for
* non-batch mode.
+ * @frame_number : frame number for this urgent metadata
*
* RETURN : camera_metadata_t*
* metadata in a format specified by fwk
*==========================================================================*/
camera_metadata_t*
QCamera3HardwareInterface::translateCbUrgentMetadataToResultMetadata
- (metadata_buffer_t *metadata, bool lastUrgentMetadataInBatch)
+ (metadata_buffer_t *metadata, bool lastUrgentMetadataInBatch,
+ uint32_t frame_number)
{
CameraMetadata camMetadata;
camera_metadata_t *resultMetadata;
@@ -6314,15 +6292,52 @@ QCamera3HardwareInterface::translateCbUrgentMetadataToResultMetadata
LOGD("urgent Metadata : ANDROID_CONTROL_AE_STATE %u", *ae_state);
}
+ IF_META_AVAILABLE(uint32_t, focusMode, CAM_INTF_PARM_FOCUS_MODE, metadata) {
+ int val = lookupFwkName(FOCUS_MODES_MAP, METADATA_MAP_SIZE(FOCUS_MODES_MAP), *focusMode);
+ if (NAME_NOT_FOUND != val) {
+ uint8_t fwkAfMode = (uint8_t)val;
+ camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1);
+ LOGD("urgent Metadata : ANDROID_CONTROL_AF_MODE %d", val);
+ } else {
+ LOGH("urgent Metadata not found : ANDROID_CONTROL_AF_MODE %d",
+ val);
+ }
+ }
+
IF_META_AVAILABLE(cam_trigger_t, af_trigger, CAM_INTF_META_AF_TRIGGER, metadata) {
- camMetadata.update(ANDROID_CONTROL_AF_TRIGGER,
- &af_trigger->trigger, 1);
LOGD("urgent Metadata : CAM_INTF_META_AF_TRIGGER = %d",
- af_trigger->trigger);
- camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &af_trigger->trigger_id, 1);
+ af_trigger->trigger);
LOGD("urgent Metadata : ANDROID_CONTROL_AF_TRIGGER_ID = %d",
- af_trigger->trigger_id);
+ af_trigger->trigger_id);
+
+ IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, metadata) {
+ mAfTrigger = *af_trigger;
+ uint32_t fwk_AfState = (uint32_t) *afState;
+
+ // If this is the result for a new trigger, check if there is new early
+ // af state. If there is, use the last af state for all results
+ // preceding current partial frame number.
+ for (auto & pendingRequest : mPendingRequestsList) {
+ if (pendingRequest.frame_number < frame_number) {
+ pendingRequest.focusStateValid = true;
+ pendingRequest.focusState = fwk_AfState;
+ } else if (pendingRequest.frame_number == frame_number) {
+ IF_META_AVAILABLE(uint32_t, earlyAfState, CAM_INTF_META_EARLY_AF_STATE, metadata) {
+ // Check if early AF state for trigger exists. If yes, send AF state as
+ // partial result for better latency.
+ uint8_t fwkEarlyAfState = (uint8_t) *earlyAfState;
+ pendingRequest.focusStateSent = true;
+ camMetadata.update(ANDROID_CONTROL_AF_STATE, &fwkEarlyAfState, 1);
+ LOGD("urgent Metadata(%d) : ANDROID_CONTROL_AF_STATE %u",
+ frame_number, fwkEarlyAfState);
+ }
+ }
+ }
+ }
}
+ camMetadata.update(ANDROID_CONTROL_AF_TRIGGER,
+ &mAfTrigger.trigger, 1);
+ camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &mAfTrigger.trigger_id, 1);
IF_META_AVAILABLE(int32_t, whiteBalance, CAM_INTF_PARM_WHITE_BALANCE, metadata) {
int val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 35ba96e1..47735d8a 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -191,16 +191,9 @@ public:
int translateToHalMetadata(const camera3_capture_request_t *request,
metadata_buffer_t *parm, uint32_t snapshotStreamId);
camera_metadata_t* translateCbUrgentMetadataToResultMetadata (
- metadata_buffer_t *metadata, bool lastUrgentMetadataInBatch);
- camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata,
- nsecs_t timestamp, int32_t request_id,
- const CameraMetadata& jpegMetadata, uint8_t pipeline_depth,
- uint8_t capture_intent, uint8_t hybrid_ae_enable,
- /* DevCamDebug metadata translateFromHalMetadata augment .h */
- uint8_t DevCamDebug_meta_enable,
- /* DevCamDebug metadata end */
- bool pprocDone, uint8_t fwk_cacMode,
- bool lastMetadataInBatch);
+ metadata_buffer_t *metadata, bool lastUrgentMetadataInBatch,
+ uint32_t frame_number);
+
camera_metadata_t* saveRequestSettings(const CameraMetadata& jpegMetadata,
camera3_capture_request_t *request);
int initParameters();
@@ -434,6 +427,10 @@ private:
/* DevCamDebug metadata PendingRequestInfo */
uint8_t DevCamDebug_meta_enable;
/* DevCamDebug metadata end */
+
+ bool focusStateSent;
+ bool focusStateValid;
+ uint8_t focusState;
} PendingRequestInfo;
typedef struct {
uint32_t frame_number;
@@ -552,6 +549,11 @@ private:
int (*LINK_get_surface_pixel_alignment)();
uint32_t mSurfaceStridePadding;
+ camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata,
+ const PendingRequestInfo& pendingRequest,
+ bool pprocDone,
+ bool lastMetadataInBatch);
+
State mState;
//Dual camera related params
bool mIsDeviceLinked;
@@ -562,6 +564,7 @@ private:
cam_sync_related_sensors_event_info_t m_relCamSyncInfo;
bool m60HzZone;
+ cam_trigger_t mAfTrigger;
};
}; // namespace qcamera
diff --git a/camera/QCamera2/stack/common/cam_intf.h b/camera/QCamera2/stack/common/cam_intf.h
index 700c5de8..b99ff627 100644
--- a/camera/QCamera2/stack/common/cam_intf.h
+++ b/camera/QCamera2/stack/common/cam_intf.h
@@ -1009,6 +1009,8 @@ typedef struct {
INCLUDE(CAM_INTF_META_DEV_CAM_AWB_DECISION, int32_t, 1);
/* DevCamDebug metadata end */
INCLUDE(CAM_INTF_META_ISP_POST_STATS_SENSITIVITY, float, 1);
+ INCLUDE(CAM_INTF_META_EARLY_AF_STATE, uint32_t, 1);
+
} metadata_data_t;
/* Update clear_metadata_buffer() function when a new is_xxx_valid is added to
diff --git a/camera/QCamera2/stack/common/cam_types.h b/camera/QCamera2/stack/common/cam_types.h
index 5e928c1f..91b73524 100644
--- a/camera/QCamera2/stack/common/cam_types.h
+++ b/camera/QCamera2/stack/common/cam_types.h
@@ -2225,6 +2225,8 @@ typedef enum {
CAM_INTF_META_AF_SCENE_CHANGE,
/* Gain applied post stats collection in ISP */
CAM_INTF_META_ISP_POST_STATS_SENSITIVITY,
+ /* Early AF state due to trigger */
+ CAM_INTF_META_EARLY_AF_STATE,
CAM_INTF_PARM_MAX
} cam_intf_parm_type_t;