v4l2dec: develop only I frame mode [1/1]

PD#SWPL-174619

Problem:
develop only I frame mode

Solution:
add property for I only frame and send parm to drive

Verify:
ah212

Change-Id: I4aeef7700141dd9f7368eeb3d215ca577d2d5bbd
Signed-off-by: hanghang.luo <hanghang.luo@amlogic.com>
diff --git a/src/gstamlv4l2object.c b/src/gstamlv4l2object.c
index 5ed1940..bdf162d 100644
--- a/src/gstamlv4l2object.c
+++ b/src/gstamlv4l2object.c
@@ -65,6 +65,8 @@
 #define AML_V4L2_GET_FILMGRAIN_INFO (V4L2_CID_USER_AMLOGIC_BASE + 3)
 #define AML_V4L2_DEC_PARMS_CONFIG (V4L2_CID_USER_AMLOGIC_BASE + 7)
 #define AML_V4L2_SET_STREAM_MODE (V4L2_CID_USER_AMLOGIC_BASE + 9)
+#define AML_V4L2_SET_I_FRAME (V4L2_CID_USER_AMLOGIC_BASE + 14)
+
 
 enum
 {
@@ -441,6 +443,12 @@
                                                          "Reduce memory usage if possible,default is disable",
                                                          FALSE,
                                                          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+    g_object_class_install_property(gobject_class, PROP_I_FRAME_MODE,
+                                    g_param_spec_boolean("iframe-mode", "use I frame mode",
+                                                         "use for speed play",
+                                                         FALSE,
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
 }
 
 /* Support for 32bit off_t, this wrapper is casting off_t to gint64 */
@@ -512,6 +520,9 @@
     v4l2object->have_set_par = FALSE;
     v4l2object->enable_cc_data = FALSE;
     v4l2object->enable_nr = FALSE;
+    v4l2object->low_latency_mode = FALSE;
+    v4l2object->low_memory_mode = FALSE;
+    v4l2object->iframe_mode = FALSE;
 
     v4l2object->n_v4l2_planes = 0;
 
@@ -730,6 +741,10 @@
         v4l2object->low_memory_mode = g_value_get_boolean(value);
         GST_DEBUG_OBJECT(v4l2object, "set low mem: %d",v4l2object->low_latency_mode);
         break;
+    case PROP_I_FRAME_MODE:
+        v4l2object->iframe_mode = g_value_get_boolean(value);
+        GST_DEBUG_OBJECT(v4l2object, "set I frame mode: %d",v4l2object->iframe_mode);
+        break;
     default:
         return FALSE;
         break;
@@ -849,6 +864,9 @@
     case PROP_LOW_MEMORY_MODE:
         g_value_set_boolean(value, v4l2object->low_memory_mode);
         break;
+    case PROP_I_FRAME_MODE:
+        g_value_set_boolean(value, v4l2object->iframe_mode);
+        break;
     default:
         return FALSE;
         break;
@@ -3565,6 +3583,10 @@
     gboolean use_ext_config = FALSE;
     int major = 0,minor = 0;
     struct utsname info;
+    if (getenv("V4L2DEC_LOW_MEM_MODE"))
+        v4l2object->low_memory_mode = TRUE;
+    GST_DEBUG("low mem: %d",v4l2object->low_memory_mode);
+
     if (v4l2object->type == V4L2_BUF_TYPE_VIDEO_OUTPUT || v4l2object->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
     {
         /*set bit12 value to 1,
@@ -5991,6 +6013,24 @@
     }
 }
 
+gboolean gst_aml_v4l2_set_I_frame_mode(GstAmlV4l2Object *v4l2object)
+{
+    if (v4l2object->iframe_mode)
+    {
+        int rc;
+        struct v4l2_control control;
+        memset(&control, 0, sizeof(control));
+        control.id = AML_V4L2_SET_I_FRAME;
+        control.value = 1;
+        rc = v4l2object->ioctl(v4l2object->video_fd, VIDIOC_S_CTRL, &control);
+        if (rc != 0)
+        {
+            GST_ERROR_OBJECT(v4l2object->dbg_obj, "rc: %d", rc);
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
 
 gboolean gst_aml_v4l2_set_drm_mode(GstAmlV4l2Object *v4l2object)
 {
diff --git a/src/gstamlv4l2object.h b/src/gstamlv4l2object.h
index 11389d0..6d5d67a 100644
--- a/src/gstamlv4l2object.h
+++ b/src/gstamlv4l2object.h
@@ -200,6 +200,7 @@
     gboolean low_latency_mode;
     gboolean low_memory_mode;
     gboolean stream_mode;
+    gboolean iframe_mode;
     GValue *par;
     gboolean have_set_par;
     GValue *fps;
@@ -275,7 +276,8 @@
         PROP_CC_DATA, \
         PROP_ENABLE_NR, \
         PROP_DECODING_ERROR_FRAMES, \
-        PROP_LOW_MEMORY_MODE
+        PROP_LOW_MEMORY_MODE, \
+        PROP_I_FRAME_MODE
 
 /* create/destroy */
 GstAmlV4l2Object *gst_aml_v4l2_object_new(GstElement *element,
@@ -367,6 +369,7 @@
 gboolean gst_aml_v4l2_set_attribute(GstAmlV4l2Object *v4l2object, int attribute, const int value);
 gboolean gst_aml_v4l2_set_controls(GstAmlV4l2Object *v4l2object, GstStructure *controls);
 gboolean gst_aml_v4l2_set_drm_mode(GstAmlV4l2Object *v4l2object);
+gboolean gst_aml_v4l2_set_I_frame_mode(GstAmlV4l2Object *v4l2object);
 gboolean gst_aml_v4l2_set_stream_mode(GstAmlV4l2Object *v4l2object);
 gint gst_aml_v4l2_object_get_outstanding_capture_buf_num(GstAmlV4l2Object *v4l2object);
 
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index 1df101c..317850e 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -483,6 +483,12 @@
         self->output_flow = GST_FLOW_OK;
     }
 
+    if ((ret = gst_aml_v4l2_set_I_frame_mode(self->v4l2output)) == FALSE)
+    {
+        GST_ERROR_OBJECT(self, "config I frame mode error");
+        goto done;
+    }
+
     if ((ret = gst_aml_v4l2_set_drm_mode(self->v4l2output)) == FALSE)
     {
         GST_ERROR_OBJECT(self, "config output drm mode error");