Merge "QCamera3: Fail unsupported stream configurations" into mnc-dr-dev
diff --git a/QCamera2/HAL3/QCamera3Channel.cpp b/QCamera2/HAL3/QCamera3Channel.cpp
index acf435d..22adde5 100644
--- a/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/QCamera2/HAL3/QCamera3Channel.cpp
@@ -35,6 +35,7 @@
 #include <cstdlib>
 #include <stdio.h>
 #include <string.h>
+#include <linux/videodev2.h>
 #include <hardware/camera3.h>
 #include <system/camera_metadata.h>
 #include <gralloc_priv.h>
@@ -55,6 +56,7 @@
 #define DEFAULT_FORMAT  CAM_FORMAT_YUV_420_NV21
 #define CALLBACK_FORMAT CAM_FORMAT_YUV_420_NV21
 #define RAW_FORMAT      CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG
+#define IS_BUFFER_ERROR(x) (((x) & V4L2_QCOM_BUF_DATA_CORRUPT) == V4L2_QCOM_BUF_DATA_CORRUPT)
 
 /*===========================================================================
  * FUNCTION   : QCamera3Channel
@@ -609,7 +611,13 @@
 
     result.stream = mCamera3Stream;
     result.buffer = resultBuffer;
-    result.status = CAMERA3_BUFFER_STATUS_OK;
+    if (IS_BUFFER_ERROR(super_frame->bufs[0]->flags)) {
+        result.status = CAMERA3_BUFFER_STATUS_ERROR;
+        ALOGW("%s: %d CAMERA3_BUFFER_STATUS_ERROR for stream_type: %d",
+            __func__, __LINE__, mStreams[0]->getMyType());
+    } else {
+        result.status = CAMERA3_BUFFER_STATUS_OK;
+    }
     result.acquire_fence = -1;
     result.release_fence = -1;
     if(mPerFrameMapUnmapEnable) {
diff --git a/QCamera2/stack/common/mm_camera_interface.h b/QCamera2/stack/common/mm_camera_interface.h
index debf83f..e203974 100644
--- a/QCamera2/stack/common/mm_camera_interface.h
+++ b/QCamera2/stack/common/mm_camera_interface.h
@@ -115,6 +115,7 @@
 *    @frame_len : length of the whole frame, to be filled during
 *               mem allocation
 *    @mem_info : user specific pointer to additional mem info
+*    @flags:  v4l2_buffer flags, used to report error in data buffers
 **/
 typedef struct mm_camera_buf_def {
     uint32_t stream_id;
@@ -132,6 +133,7 @@
     void *buffer;
     size_t frame_len;
     void *mem_info;
+    uint32_t flags;
 } mm_camera_buf_def_t;
 
 /** mm_camera_super_buf_t: super buf structure for bundled
diff --git a/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c b/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
index 373cde4..8511bba 100755
--- a/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
+++ b/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
@@ -1266,12 +1266,14 @@
         buf_info->buf->frame_idx = vb.sequence;
         buf_info->buf->ts.tv_sec  = vb.timestamp.tv_sec;
         buf_info->buf->ts.tv_nsec = vb.timestamp.tv_usec * 1000;
+        buf_info->buf->flags = vb.flags;
 
         CDBG_HIGH("%s: VIDIOC_DQBUF buf_index %d, frame_idx %d, stream type %d, rc %d,"
-                "queued: %d, buf_type = %d",
+                "queued: %d, buf_type = %d flags = %d",
             __func__, vb.index, buf_info->buf->frame_idx,
             my_obj->stream_info->stream_type, rc,
-            my_obj->queued_buffer_count, buf_info->buf->buf_type);
+            my_obj->queued_buffer_count, buf_info->buf->buf_type,
+            buf_info->buf->flags);
 
         buf_info->buf->is_uv_subsampled =
             (vb.reserved == V4L2_PIX_FMT_NV14 || vb.reserved == V4L2_PIX_FMT_NV41);