summaryrefslogtreecommitdiff
path: root/camera
diff options
context:
space:
mode:
Diffstat (limited to 'camera')
-rw-r--r--camera/QCamera2/HAL3/QCamera3HWI.cpp68
-rw-r--r--camera/QCamera2/HAL3/QCamera3HWI.h7
2 files changed, 52 insertions, 23 deletions
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 490cd2e..652fde8 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -2312,7 +2312,7 @@ void QCamera3HardwareInterface::handleBatchMetadata(
urgentFrameNumDiff = last_urgent_frame_number + 1 -
first_urgent_frame_number;
- CDBG("%s: urgent_frm: valid: %d frm_num: %d - %d",
+ CDBG_HIGH("%s: urgent_frm: valid: %d frm_num: %d - %d",
__func__, urgent_frame_number_valid,
first_urgent_frame_number, last_urgent_frame_number);
}
@@ -2323,7 +2323,7 @@ void QCamera3HardwareInterface::handleBatchMetadata(
first_frame_number;
mPendingBatchMap.removeItem(last_frame_number);
- CDBG("%s: frm: valid: %d frm_num: %d - %d",
+ CDBG_HIGH("%s: frm: valid: %d frm_num: %d - %d",
__func__, frame_number_valid,
first_frame_number, last_frame_number);
@@ -2384,13 +2384,14 @@ void QCamera3HardwareInterface::handleBatchMetadata(
first_frame_capture_time + (i * NSEC_PER_SEC / (double) mHFRVideoFps);
ADD_SET_PARAM_ENTRY_TO_BATCH(metadata,
CAM_INTF_META_SENSOR_TIMESTAMP, capture_time);
- CDBG("%s: batch capture_time: %lld, capture_time: %lld",
+ CDBG_HIGH("%s: batch capture_time: %lld, capture_time: %lld",
__func__, last_frame_capture_time, capture_time);
}
}
pthread_mutex_lock(&mMutex);
handleMetadataWithLock(metadata_buf,
- false /* free_and_bufdone_meta_buf */);
+ false /* free_and_bufdone_meta_buf */,
+ (i == 0) /* first metadata in the batch metadata */);
pthread_mutex_unlock(&mMutex);
}
@@ -2410,12 +2411,15 @@ done_batch_metadata:
* PARAMETERS : @metadata_buf: metadata buffer
* @free_and_bufdone_meta_buf: Buf done on the meta buf and free
* the meta buf in this method
+ * @firstMetadataInBatch: Boolean to indicate whether this is the
+ * first metadata in a batch. Valid only for batch mode
*
* RETURN :
*
*==========================================================================*/
void QCamera3HardwareInterface::handleMetadataWithLock(
- mm_camera_super_buf_t *metadata_buf, bool free_and_bufdone_meta_buf)
+ mm_camera_super_buf_t *metadata_buf, bool free_and_bufdone_meta_buf,
+ bool firstMetadataInBatch)
{
ATRACE_CALL();
@@ -2635,7 +2639,8 @@ void QCamera3HardwareInterface::handleMetadataWithLock(
result.result = translateFromHalMetadata(metadata,
i->timestamp, i->request_id, i->jpegMetadata, i->pipeline_depth,
- i->capture_intent, i->hybrid_ae_enable, internalPproc, i->need_dynamic_blklvl);
+ i->capture_intent, i->hybrid_ae_enable, internalPproc, i->need_dynamic_blklvl,
+ firstMetadataInBatch);
saveExifParams(metadata);
@@ -4023,7 +4028,8 @@ void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_
hdrPlusPerfLock(metadata_buf);
pthread_mutex_lock(&mMutex);
handleMetadataWithLock(metadata_buf,
- true /* free_and_bufdone_meta_buf */);
+ true /* free_and_bufdone_meta_buf */,
+ false /* first frame of batch metadata */ );
pthread_mutex_unlock(&mMutex);
}
} else if (isInputBuffer) {
@@ -4197,11 +4203,19 @@ QCamera3HardwareInterface::translateFromHalMetadata(
uint8_t capture_intent,
uint8_t hybrid_ae_enable,
bool pprocDone,
- bool dynamic_blklvl)
+ bool dynamic_blklvl,
+ bool firstMetadataInBatch)
{
CameraMetadata camMetadata;
camera_metadata_t *resultMetadata;
+ if (mBatchSize && !firstMetadataInBatch) {
+ /* In batch mode, use cached metadata from the first metadata
+ in the batch */
+ camMetadata.clear();
+ camMetadata = mCachedMetadata;
+ }
+
if (jpegMetadata.entryCount())
camMetadata.append(jpegMetadata);
@@ -4211,6 +4225,12 @@ QCamera3HardwareInterface::translateFromHalMetadata(
camMetadata.update(ANDROID_CONTROL_CAPTURE_INTENT, &capture_intent, 1);
camMetadata.update(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE, &hybrid_ae_enable, 1);
+ if (mBatchSize && !firstMetadataInBatch) {
+ /* In batch mode, use cached metadata instead of parsing metadata buffer again */
+ resultMetadata = camMetadata.release();
+ return resultMetadata;
+ }
+
IF_META_AVAILABLE(uint32_t, frame_number, CAM_INTF_META_FRAME_NUMBER, metadata) {
int64_t fwk_frame_number = *frame_number;
camMetadata.update(ANDROID_SYNC_FRAME_NUMBER, &fwk_frame_number, 1);
@@ -4781,10 +4801,22 @@ 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);
+ CDBG("%s: Metadata : ANDROID_CONTROL_AF_MODE %d", __func__, val);
+ } else {
+ CDBG_HIGH("%s: Metadata not found : ANDROID_CONTROL_AF_MODE %d",
+ __func__, 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);
- CDBG("%s: urgent Metadata : ANDROID_CONTROL_AF_STATE %u", __func__, *afState);
+ CDBG("%s: Metadata : ANDROID_CONTROL_AF_STATE %u", __func__, *afState);
}
IF_META_AVAILABLE(float, focusDistance, CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata) {
@@ -4996,6 +5028,12 @@ QCamera3HardwareInterface::translateFromHalMetadata(
camMetadata.update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, &postRawSensitivity, 1);
}
+ /* In batch mode, cache the first metadata in the batch */
+ if (mBatchSize && firstMetadataInBatch) {
+ mCachedMetadata.clear();
+ mCachedMetadata = camMetadata;
+ }
+
resultMetadata = camMetadata.release();
return resultMetadata;
}
@@ -5098,18 +5136,6 @@ QCamera3HardwareInterface::translateCbUrgentMetadataToResultMetadata
CDBG("%s: urgent Metadata : ANDROID_CONTROL_AE_STATE %u", __func__, *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);
- CDBG("%s: urgent Metadata : ANDROID_CONTROL_AF_MODE", __func__);
- } else {
- CDBG_HIGH("%s: urgent Metadata not found : ANDROID_CONTROL_AF_MODE %d", __func__,
- 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);
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 0302b05..eb75f97 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -174,7 +174,8 @@ public:
nsecs_t timestamp, int32_t request_id,
const CameraMetadata& jpegMetadata, uint8_t pipeline_depth,
uint8_t capture_intent, uint8_t hybrid_ae_enable,
- bool pprocDone, bool dynamic_blklvl);
+ bool pprocDone, bool dynamic_blklvl,
+ bool firstMetadataInBatch);
camera_metadata_t* saveRequestSettings(const CameraMetadata& jpegMetadata,
camera3_capture_request_t *request);
int initParameters();
@@ -234,7 +235,8 @@ private:
int32_t handlePendingReprocResults(uint32_t frame_number);
int64_t getMinFrameDuration(const camera3_capture_request_t *request);
void handleMetadataWithLock(mm_camera_super_buf_t *metadata_buf,
- bool free_and_bufdone_meta_buf);
+ bool free_and_bufdone_meta_buf,
+ bool firstMetadataInBatch);
void handleBatchMetadata(mm_camera_super_buf_t *metadata_buf,
bool free_and_bufdone_meta_buf);
void handleBufferWithLock(camera3_stream_buffer_t *buffer,
@@ -435,6 +437,7 @@ private:
uint32_t mLdafCalib[2];
bool mPowerHintEnabled;
int32_t mLastCustIntentFrmNum;
+ CameraMetadata mCachedMetadata;
static const QCameraMap<camera_metadata_enum_android_control_effect_mode_t,
cam_effect_mode_type> EFFECT_MODES_MAP[];