summaryrefslogtreecommitdiff
path: root/camera
diff options
context:
space:
mode:
authorRanjith Kagathi Ananda <ranjith@codeaurora.org>2016-07-08 20:19:49 -0700
committerEino-Ville Talvala <etalvala@google.com>2016-07-11 10:07:51 -0700
commit5383d9196a24e063f81fd40775a153df7d32e3bf (patch)
treec05fa161a75ab236222663891c5824f28447f26c /camera
parent59c13a9f7fbb61714aa46e1fb46207320f50b5fb (diff)
downloadbullhead-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.cpp42
-rw-r--r--camera/QCamera2/HAL3/QCamera3HWI.h7
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[];