Camera3: Add missing code for Request id
* Added code for book-keeping request id
* In cases when no new request id is passed
re-use from previous request
* Fail when no previous request id is available
Bug: 9166187
Change-Id: I9692a9d334223b01c486d9dc59c30569830066f9
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 91720db..261bc93 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -169,6 +169,7 @@
pthread_mutex_init(&mRequestLock, NULL);
pthread_cond_init(&mRequestCond, NULL);
mPendingRequest = 0;
+ mCurrentRequestId = -1;
pthread_mutex_init(&mMutex, NULL);
pthread_mutex_init(&mCaptureResultLock, NULL);
@@ -729,6 +730,7 @@
camera3_capture_request_t *request)
{
int rc = NO_ERROR;
+ int32_t request_id;
CameraMetadata meta;
pthread_mutex_lock(&mMutex);
@@ -749,6 +751,21 @@
return rc;
}
+ meta = request->settings;
+ if (meta.exists(ANDROID_REQUEST_ID)) {
+ request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
+ mCurrentRequestId = request_id;
+ ALOGD("%s: Received request with id: %d",__func__, request_id);
+ } else if (mFirstRequest || mCurrentRequestId == -1){
+ ALOGE("%s: Unable to find request id field, \
+ & no previous id available", __func__);
+ return NAME_NOT_FOUND;
+ } else {
+ ALOGD("%s: Re-using old request id", __func__);
+ request_id = mCurrentRequestId;
+ }
+
+
ALOGV("%s: %d, num_output_buffers = %d", __func__, __LINE__,
request->num_output_buffers);
// Acquire all request buffers first
@@ -779,6 +796,8 @@
PendingRequestInfo pendingRequest;
pendingRequest.frame_number = frameNumber;
pendingRequest.num_buffers = request->num_output_buffers;
+ pendingRequest.request_id = request_id;
+
for (size_t i = 0; i < request->num_output_buffers; i++) {
RequestedBufferInfo requestedBuf;
requestedBuf.stream = request->output_buffers[i].stream;
@@ -939,10 +958,12 @@
CameraMetadata emptyMetadata(1, 0);
emptyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
¤t_capture_time, 1);
+ emptyMetadata.update(ANDROID_REQUEST_ID,
+ &(i->request_id), 1);
result.result = emptyMetadata.release();
} else {
result.result = translateCbMetadataToResultMetadata(metadata,
- current_capture_time);
+ current_capture_time, i->request_id);
// Return metadata buffer
mMetadataChannel->bufDone(metadata_buf);
}
@@ -1067,13 +1088,15 @@
*==========================================================================*/
camera_metadata_t*
QCamera3HardwareInterface::translateCbMetadataToResultMetadata
- (metadata_buffer_t *metadata, nsecs_t timestamp)
+ (metadata_buffer_t *metadata, nsecs_t timestamp,
+ int32_t request_id)
{
CameraMetadata camMetadata;
camera_metadata_t* resultMetadata;
camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1);
+ camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
/*CAM_INTF_META_HISTOGRAM - TODO*/
/*cam_hist_stats_t *histogram =
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 2dc548c..44a20ef 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -119,7 +119,7 @@
int setFrameParameters(int frame_id, const camera_metadata_t *settings);
int translateMetadataToParameters(const camera_metadata_t *settings);
camera_metadata_t* translateCbMetadataToResultMetadata(metadata_buffer_t *metadata,
- nsecs_t timestamp);
+ nsecs_t timestamp, int32_t request_id);
int getJpegSettings(const camera_metadata_t *settings);
int initParameters();
void deinitParameters();
@@ -181,6 +181,7 @@
typedef struct {
uint32_t frame_number;
uint32_t num_buffers;
+ int32_t request_id;
List<RequestedBufferInfo> buffers;
} PendingRequestInfo;
typedef KeyedVector<camera3_stream_t *, uint32_t> PendingBuffersMap;
@@ -190,6 +191,7 @@
pthread_mutex_t mRequestLock;
pthread_cond_t mRequestCond;
int mPendingRequest;
+ int32_t mCurrentRequestId;
//mutex for serialized access to camera3_device_ops_t functions
pthread_mutex_t mMutex;