Camera3: Pass stream type mask as part of parameter

Camera3 request contains both settings and buffers as one entity.
While HAL send setting via setParameter, and queue buffers to kernel
via v4l2 QBUF.

To make sure proper synchronization between them in the lower layer,
HAL specifies which streams does a particular request expects buffer
from. This implicitely maintain the association between request and
buffers.

Change-Id: I945578d2180b0755e7bc5936daeebdb371cccde7
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp
index 1074dea..69e3af4 100644
--- a/camera/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp
@@ -322,6 +322,24 @@
 }
 
 /*===========================================================================
+ * FUNCTION   : getStreamTypeMask
+ *
+ * DESCRIPTION: Get bit mask of all stream types in this channel
+ *
+ * PARAMETERS : None
+ *
+ * RETURN     : Bit mask of all stream types in this channel
+ *==========================================================================*/
+uint32_t QCamera3Channel::getStreamTypeMask()
+{
+    uint32_t mask = 0;
+    for (int i = 0; i < m_numStreams; i++) {
+       mask |= (0x1 << mStreams[i]->getMyType());
+    }
+    return mask;
+}
+
+/*===========================================================================
  * FUNCTION   : getInternalFormatBuffer
  *
  * DESCRIPTION: return buffer in the internal format structure
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.h b/camera/QCamera2/HAL3/QCamera3Channel.h
index b3e9812..0b6e547 100644
--- a/camera/QCamera2/HAL3/QCamera3Channel.h
+++ b/camera/QCamera2/HAL3/QCamera3Channel.h
@@ -67,6 +67,8 @@
     int32_t stop();
     int32_t bufDone(mm_camera_super_buf_t *recvd_frame);
 
+    uint32_t getStreamTypeMask();
+
     virtual int32_t registerBuffers(uint32_t num_buffers,
                         buffer_handle_t **buffers) = 0;
     virtual int32_t initialize() = 0;
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index eeb1f32..32d38ca 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -823,12 +823,7 @@
     }
 
     uint32_t frameNumber = request->frame_number;
-    rc = setFrameParameters(request->frame_number, request->settings);
-    if (rc < 0) {
-        ALOGE("%s: fail to set frame parameters", __func__);
-        pthread_mutex_unlock(&mMutex);
-        return rc;
-    }
+    uint32_t streamTypeMask = 0;
 
     meta = request->settings;
     if (meta.exists(ANDROID_REQUEST_ID)) {
@@ -853,6 +848,7 @@
     int blob_request = 0;
     for (size_t i = 0; i < request->num_output_buffers; i++) {
         const camera3_stream_buffer_t& output = request->output_buffers[i];
+        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
         sp<Fence> acquireFence = new Fence(output.acquire_fence);
 
         if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
@@ -872,6 +868,14 @@
             pthread_mutex_unlock(&mMutex);
             return rc;
         }
+        streamTypeMask |= channel->getStreamTypeMask();
+    }
+
+    rc = setFrameParameters(request->frame_number, request->settings, streamTypeMask);
+    if (rc < 0) {
+        ALOGE("%s: fail to set frame parameters", __func__);
+        pthread_mutex_unlock(&mMutex);
+        return rc;
     }
 
     /* Update pending request list and pending buffers map */
@@ -2555,14 +2559,15 @@
  *              framework
  *
  * PARAMETERS :
+ *   @frame_id  : frame number for this particular request
  *   @settings  : frame settings information from framework
- *
+ *   @streamTypeMask : bit mask of stream types on which buffers are requested
  *
  * RETURN     : success: NO_ERROR
  *              failure:
  *==========================================================================*/
 int QCamera3HardwareInterface::setFrameParameters(int frame_id,
-                                                  const camera_metadata_t *settings)
+                    const camera_metadata_t *settings, uint32_t streamTypeMask)
 {
     /*translate from camera_metadata_t type to parm_type_t*/
     int rc = 0;
@@ -2586,6 +2591,14 @@
         return BAD_VALUE;
     }
 
+    /* Update stream id mask where buffers are requested */
+    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK,
+                                sizeof(streamTypeMask), &streamTypeMask);
+    if (rc < 0) {
+        ALOGE("%s: Failed to set stream type mask in the parameters", __func__);
+        return BAD_VALUE;
+    }
+
     if(settings != NULL){
         rc = translateMetadataToParameters(settings);
     }
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 53f8cc3..148e9eb 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -121,7 +121,7 @@
     void getMetadataVendorTagOps(vendor_tag_query_ops_t* ops);
     void dump(int fd);
 
-    int setFrameParameters(int frame_id, const camera_metadata_t *settings);
+    int setFrameParameters(int frame_id, const camera_metadata_t *settings, uint32_t streamTypeMask);
     int translateMetadataToParameters(const camera_metadata_t *settings);
     camera_metadata_t* translateCbMetadataToResultMetadata(metadata_buffer_t *metadata,
                             nsecs_t timestamp, int32_t request_id);
diff --git a/camera/QCamera2/HAL3/QCamera3PostProc.cpp b/camera/QCamera2/HAL3/QCamera3PostProc.cpp
index 86e6432..a8eaa33 100644
--- a/camera/QCamera2/HAL3/QCamera3PostProc.cpp
+++ b/camera/QCamera2/HAL3/QCamera3PostProc.cpp
@@ -811,15 +811,19 @@
         QCamera3Stream *srcStream =
             srcChannel->getStreamByHandle(recvd_frame->bufs[i]->stream_id);
         if (srcStream != NULL) {
-            if (srcStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) ||
-                srcStream->isTypeOf(CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT) ||
-                srcStream->isTypeOf(CAM_STREAM_TYPE_OFFLINE_PROC)) {
+            switch (srcStream->getMyType()) {
+            case CAM_STREAM_TYPE_SNAPSHOT:
+            case CAM_STREAM_TYPE_OFFLINE_PROC:
                 main_stream = srcStream;
                 main_frame = recvd_frame->bufs[i];
-            } else if (srcStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
-                       srcStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW)) {
+                break;
+            case CAM_STREAM_TYPE_PREVIEW:
+            case CAM_STREAM_TYPE_POSTVIEW:
                 thumb_stream = srcStream;
                 thumb_frame = recvd_frame->bufs[i];
+                break;
+            default:
+                break;
             }
         }
     }
diff --git a/camera/QCamera2/HAL3/QCamera3Stream.cpp b/camera/QCamera2/HAL3/QCamera3Stream.cpp
index 044854b..39d8cb9 100644
--- a/camera/QCamera2/HAL3/QCamera3Stream.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Stream.cpp
@@ -690,25 +690,6 @@
 }
 
 /*===========================================================================
- * FUNCTION   : isTypeOf
- *
- * DESCRIPTION: helper function to determine if the stream is of the queried type
- *
- * PARAMETERS :
- *   @type    : stream type as of queried
- *
- * RETURN     : true/false
- *==========================================================================*/
-bool QCamera3Stream::isTypeOf(cam_stream_type_t type)
-{
-    if (mStreamInfo != NULL && (mStreamInfo->stream_type == type)) {
-        return true;
-    } else {
-        return false;
-    }
-}
-
-/*===========================================================================
  * FUNCTION   : getFrameOffset
  *
  * DESCRIPTION: query stream buffer frame offset info
@@ -794,7 +775,8 @@
  *
  * RETURN     : type of stream
  *==========================================================================*/
-cam_stream_type_t QCamera3Stream::getMyType() {
+cam_stream_type_t QCamera3Stream::getMyType() const
+{
     if (mStreamInfo != NULL) {
         return mStreamInfo->stream_type;
     } else {
diff --git a/camera/QCamera2/HAL3/QCamera3Stream.h b/camera/QCamera2/HAL3/QCamera3Stream.h
index 4e89f73..d000c4c 100644
--- a/camera/QCamera2/HAL3/QCamera3Stream.h
+++ b/camera/QCamera2/HAL3/QCamera3Stream.h
@@ -71,8 +71,7 @@
     static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, void *userdata);
     static void *dataProcRoutine(void *data);
     uint32_t getMyHandle() const {return mHandle;}
-    cam_stream_type_t getMyType();
-    bool isTypeOf(cam_stream_type_t type);
+    cam_stream_type_t getMyType() const;
     int32_t getFrameOffset(cam_frame_len_offset_t &offset);
     int32_t getFrameDimension(cam_dimension_t &dim);
     int32_t getFormat(cam_format_t &fmt);
diff --git a/camera/QCamera2/stack/common/cam_intf.h b/camera/QCamera2/stack/common/cam_intf.h
index bf7b493..a2d2224 100644
--- a/camera/QCamera2/stack/common/cam_intf.h
+++ b/camera/QCamera2/stack/common/cam_intf.h
@@ -475,6 +475,7 @@
     INCLUDE(CAM_INTF_META_TONEMAP_CURVE_RED,        cam_tonemap_curve_t,         1);
     INCLUDE(CAM_INTF_META_TONEMAP_MODE,             uint8_t,                     1);
     INCLUDE(CAM_INTF_META_FLASH_MODE,               uint8_t,                     1);
+    INCLUDE(CAM_INTF_META_STREAM_TYPE_MASK,         uint32_t,                    1);
 } parm_type_t;
 
 
diff --git a/camera/QCamera2/stack/common/cam_types.h b/camera/QCamera2/stack/common/cam_types.h
index 58d77df..45e7b6e 100644
--- a/camera/QCamera2/stack/common/cam_types.h
+++ b/camera/QCamera2/stack/common/cam_types.h
@@ -984,6 +984,8 @@
      * compensate for lens shading for this frame */
     CAM_INTF_META_LENS_SHADING_MAP,
     CAM_INTF_META_PRIVATE_DATA,
+    /* Indicates streams this request needs buffers on */
+    CAM_INTF_META_STREAM_TYPE_MASK,
     CAM_INTF_PARM_MAX
 } cam_intf_parm_type_t;