mm-video-v4l2: Update logic to add cvp skip flag

Use CVP_METADATA_FLAG_REPEAT posted by camera to add CVP skip flag
for an ETB. The addition of this flag ensures that CVP metadata is
always set by camera for all frames of the buffer and avoid letting
video driver initiate duplicate CVP kernel to kernel usage.

Change-Id: Ibfd150946cf090ec2f2d9d0e62e06b25aba3c63b
Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
index ada2b7c..122d22e 100644
--- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
+++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
@@ -475,6 +475,7 @@
         bool m_hdr10meta_enabled;
         ColorMetaData colorData= {};
 
+        bool m_cvp_first_metadata;
         bool m_cvp_meta_enabled;
         CVPMetadata cvpMetadata;
         pthread_mutex_t pause_resume_mlock;
diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
index b4233d8..a2b00f2 100644
--- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
+++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp
@@ -120,6 +120,7 @@
     mBatchSize = 0;
     m_roi_enabled = false;
     m_cvp_meta_enabled = false;
+    m_cvp_first_metadata = false;
     low_latency_mode = false;
     pthread_mutex_init(&m_roilock, NULL);
     pthread_mutex_init(&m_configlock, NULL);
@@ -680,7 +681,7 @@
     data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
     memset((void *)(data), 0, (input_extradata_info.buffer_size)); // clear stale data in current buffer
 
-    if (m_cvp_meta_enabled && cvpMetadata.size == CVP_METADATA_SIZE) {
+    if (m_cvp_meta_enabled && !(buf.flags & V4L2_BUF_FLAG_CVPMETADATA_SKIP)) {
         packet_size = sizeof(struct msm_vidc_extradata_header) - sizeof(unsigned int)
                            + cvpMetadata.size;
 
@@ -4285,6 +4286,7 @@
                 return false;
             }
             m_cvp_meta_enabled = true;
+            m_cvp_first_metadata = true;
             DEBUG_PRINT_HIGH("CVP metadata enabled");
             if (!venc_set_cvp_skipratio_controls())
                 return false;
@@ -4292,6 +4294,8 @@
             DEBUG_PRINT_ERROR("ERROR: External CVP mode disabled for this session and continue!");
             clearMetaData(handle, SET_CVP_METADATA);
         }
+    } else {
+        DEBUG_PRINT_INFO("venc_cvp_enable: cvp metadata not available");
     }
     return true;
 }
@@ -4301,9 +4305,10 @@
     struct v4l2_control ctrl;
 
     if (!cvpMetadata.cvp_frame_rate || !cvpMetadata.capture_frame_rate) {
-        DEBUG_PRINT_LOW("ERROR: Invalid cvp frame rate received");
+        DEBUG_PRINT_ERROR("ERROR: Invalid cvp frame rate received");
         return true;
     }
+    DEBUG_PRINT_HIGH("cvpMetadata: frame_rate %u capture rate %u", cvpMetadata.cvp_frame_rate, cvpMetadata.capture_frame_rate);
 
     ctrl.id = V4L2_CID_MPEG_VIDC_CAPTURE_FRAME_RATE;
     ctrl.value = cvpMetadata.capture_frame_rate;
@@ -4315,7 +4320,7 @@
     ctrl.id = V4L2_CID_MPEG_VIDC_CVP_FRAME_RATE;
     ctrl.value = cvpMetadata.cvp_frame_rate;
     if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &ctrl)) {
-        DEBUG_PRINT_LOW("ERROR: Setting cvp frame rate control failed");
+        DEBUG_PRINT_ERROR("ERROR: Setting cvp frame rate control failed");
         return false;
     }
     return true;
@@ -4343,10 +4348,17 @@
         }
         DEBUG_PRINT_LOW("CVP metadata size %d", cvpMetadata.size);
     } else {
+        DEBUG_PRINT_ERROR("ERROR: CVP metadata not available");
+        return false;
+    }
+
+    if (m_cvp_first_metadata) {
+        m_cvp_first_metadata = false;
+    } else if (cvpMetadata.flags & CVP_METADATA_FLAG_REPEAT) {
         buf->flags |= V4L2_BUF_FLAG_CVPMETADATA_SKIP;
         DEBUG_PRINT_LOW("venc_empty_buf: V4L2_BUF_FLAG_CVPMETADATA_SKIP is set");
-        DEBUG_PRINT_LOW("CVP metadata not available");
     }
+
     if ((cvpMetadata.capture_frame_rate != capture_rate) ||
         (cvpMetadata.cvp_frame_rate != cvp_rate)) {
         if(!venc_set_cvp_skipratio_controls())