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");