diff options
author | Ranjith Kagathi Ananda <ranjith@codeaurora.org> | 2016-07-08 20:19:49 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2016-07-11 10:07:51 -0700 |
commit | 5383d9196a24e063f81fd40775a153df7d32e3bf (patch) | |
tree | c05fa161a75ab236222663891c5824f28447f26c /camera | |
parent | 59c13a9f7fbb61714aa46e1fb46207320f50b5fb (diff) | |
download | bullhead-5383d9196a24e063f81fd40775a153df7d32e3bf.tar.gz |
QCamera2/HAL3: Cache metadata in batch mode
In batch mode, only one metadata is sent from back-end per
batch. It can be *copied* as multiple metadata for rest of
the frames in the batch instead of parsing the same
metadata buffer again
BUG=28312446
CRs-Fixed: 1038197
Change-Id: I5be580e69b8f14e8a381111a787c38081fb04f71
Diffstat (limited to 'camera')
-rw-r--r-- | camera/QCamera2/HAL3/QCamera3HWI.cpp | 42 | ||||
-rw-r--r-- | camera/QCamera2/HAL3/QCamera3HWI.h | 7 |
2 files changed, 39 insertions, 10 deletions
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp index 59ef87b..61ce2b2 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 / 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); @@ -4996,6 +5016,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; } 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[]; |