Camera3: Implement android.request.pipelineDepth

Bug: 12958059
Change-Id: I961999e7850dd6f93bbb61790929532e735c2183
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 8284dbf..bb7228f 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -55,6 +55,8 @@
 
 #define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
 
+#define EMPTY_PIPELINE_DELAY 2
+
 cam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
 const camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
 
@@ -1182,7 +1184,7 @@
             result.result = dummyMetadata.release();
         } else {
             result.result = translateFromHalMetadata(metadata,
-                    i->timestamp, i->request_id, i->jpegMetadata);
+                    i->timestamp, i->request_id, i->jpegMetadata, i->pipeline_depth);
 
             if (i->blob_request) {
                 {
@@ -1286,6 +1288,10 @@
     }
 
 done_metadata:
+    for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
+        i != mPendingRequestsList.end() ;i++) {
+        i->pipeline_depth++;
+    }
     if (!pending_requests)
         unblockRequestIfNecessary();
 
@@ -1573,6 +1579,7 @@
     pendingRequest.blob_request = blob_request;
     pendingRequest.bNotified = 0;
     pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0;
+    pendingRequest.pipeline_depth = 0;
     extractJpegMetadata(pendingRequest.jpegMetadata, request);
 
     for (size_t i = 0; i < request->num_output_buffers; i++) {
@@ -1932,7 +1939,8 @@
                                  metadata_buffer_t *metadata,
                                  nsecs_t timestamp,
                                  int32_t request_id,
-                                 const CameraMetadata& jpegMetadata)
+                                 const CameraMetadata& jpegMetadata,
+                                 uint8_t pipeline_depth)
 {
     CameraMetadata camMetadata;
     camera_metadata_t* resultMetadata;
@@ -1942,6 +1950,7 @@
 
     camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
     camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
+    camMetadata.update(ANDROID_REQUEST_PIPELINE_DEPTH, &pipeline_depth, 1);
 
     uint8_t curr_entry = GET_FIRST_PARAM_ID(metadata);
     uint8_t next_entry;
@@ -3473,7 +3482,7 @@
                       avail_testpattern_modes,
                       size);
 
-    uint8_t max_pipeline_depth = kMaxInFlight;
+    uint8_t max_pipeline_depth = kMaxInFlight + EMPTY_PIPELINE_DELAY;
     staticInfo.update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
                       &max_pipeline_depth,
                       1);
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 786cfb4..e6e59d0 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -139,7 +139,7 @@
 
     camera_metadata_t* translateFromHalMetadata(metadata_buffer_t *metadata,
                             nsecs_t timestamp, int32_t request_id,
-                            const CameraMetadata& jpegMetadata);
+                            const CameraMetadata& jpegMetadata, uint8_t pipeline_depth);
     int getJpegSettings(const camera_metadata_t *settings);
     int initParameters();
     void deinitParameters();
@@ -234,6 +234,7 @@
         uint8_t bNotified;
         int input_buffer_present;
         CameraMetadata jpegMetadata;
+        uint8_t pipeline_depth;
     } PendingRequestInfo;
     typedef struct {
         uint32_t frame_number;