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,
                         &current_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, &timestamp, 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;