amlv4l2: CF1 support stream mode [1/1]
PD#SWPL-118049
Problem:
amlv4l2dec element support v4l2 stream mode
Solution:
amlv4l2dec element support v4l2 stream mode
Verify:
(detail info)
Change-Id: I8b77343e02904eda5d22d52367150f760059a788
Signed-off-by: xuesong.jiang <xuesong.jiang@amlogic.com>
diff --git a/src/gstamlv4l2object.c b/src/gstamlv4l2object.c
index 4eed06c..131a718 100644
--- a/src/gstamlv4l2object.c
+++ b/src/gstamlv4l2object.c
@@ -61,6 +61,7 @@
#define V4L2_CID_USER_AMLOGIC_BASE (V4L2_CID_USER_BASE + 0x1100)
#define AML_V4L2_SET_DRMMODE (V4L2_CID_USER_AMLOGIC_BASE + 0)
#define AML_V4L2_DEC_PARMS_CONFIG (V4L2_CID_USER_AMLOGIC_BASE + 7)
+#define AML_V4L2_SET_STREAM_MODE (V4L2_CID_USER_AMLOGIC_BASE + 9)
enum
{
@@ -202,6 +203,7 @@
#define GST_AML_V4L2_FORMAT_COUNT (G_N_ELEMENTS(gst_aml_v4l2_formats))
static GSList *gst_aml_v4l2_object_get_format_list(GstAmlV4l2Object *v4l2object);
+static gboolean gst_aml_v4l2_set_control(GstAmlV4l2Object *v4l2object, guint ctl);
#define GST_TYPE_AML_V4L2_DEVICE_FLAGS (gst_aml_v4l2_device_get_type())
static GType
@@ -401,6 +403,12 @@
g_param_spec_string("dump-frame-location", "dump frame location",
"Location of the file to write decoder frames", NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property(gobject_class, PROP_STREAM_MODE,
+ g_param_spec_boolean("stream-mode", "Configure v4l2 stream mode",
+ "TRUE for stream mode, FALSE for frame mode",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
/* Support for 32bit off_t, this wrapper is casting off_t to gint64 */
@@ -468,6 +476,7 @@
v4l2object->colors = NULL;
v4l2object->keep_aspect = TRUE;
+ v4l2object->stream_mode = FALSE;
v4l2object->n_v4l2_planes = 0;
@@ -665,6 +674,9 @@
g_free(v4l2object->dumpframefile);
v4l2object->dumpframefile = g_value_dup_string(value);
break;
+ case PROP_STREAM_MODE:
+ v4l2object->stream_mode = g_value_get_boolean(value);
+ break;
default:
return FALSE;
break;
@@ -766,6 +778,9 @@
case PROP_DUMP_FRAME_LOCATION:
g_value_set_string(value, v4l2object->dumpframefile);
break;
+ case PROP_STREAM_MODE:
+ g_value_set_boolean(value, v4l2object->stream_mode);
+ break;
default:
return FALSE;
break;
@@ -3395,6 +3410,12 @@
int major = 0,minor = 0;
struct utsname info;
+ decParm->cfg.data[0] = 0;
+ decParm->cfg.data[1] = 0;
+ decParm->cfg.data[2] = 0;
+ decParm->cfg.data[3] = 0;
+ decParm->cfg.data[4] = 0;
+
decParm->cfg.metadata_config_flag = 1 << 13;
if (v4l2object->type == V4L2_BUF_TYPE_VIDEO_OUTPUT || v4l2object->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
@@ -5000,6 +5021,20 @@
gst_caps_unref(tmp);
}
+ if (v4l2object->stream_mode)
+ {
+ GST_INFO_OBJECT(v4l2object->dbg_obj, "ret caps: %" GST_PTR_FORMAT, ret);
+ for (guint i = 0; i < gst_caps_get_size(ret); i++)
+ {
+ GstStructure *s = gst_caps_get_structure(ret, i);
+ if (s)
+ gst_structure_remove_field(s, "alignment");
+
+ GST_DEBUG("i:%d, s:%p", i, s);
+ }
+ GST_INFO_OBJECT(v4l2object->dbg_obj, "new ret caps: %" GST_PTR_FORMAT, ret);
+ }
+
GST_INFO_OBJECT(v4l2object->dbg_obj, "probed caps: %" GST_PTR_FORMAT, ret);
return ret;
@@ -5589,55 +5624,91 @@
return TRUE;
}
+static gboolean gst_aml_v4l2_set_control(GstAmlV4l2Object *v4l2object, guint ctl)
+{
+ int rc;
+ struct v4l2_queryctrl queryctrl;
+ struct v4l2_control control;
+
+ GstAmlV4l2VideoDec *self = (GstAmlV4l2VideoDec *)v4l2object->element;
+ self->is_secure_path = TRUE;
+
+ memset(&queryctrl, 0, sizeof(queryctrl));
+ queryctrl.id = ctl;
+
+ rc = v4l2object->ioctl(v4l2object->video_fd, VIDIOC_QUERYCTRL, &queryctrl);
+ if (rc == 0)
+ {
+ if (!(queryctrl.flags & V4L2_CTRL_FLAG_DISABLED))
+ {
+ memset(&control, 0, sizeof(control));
+ control.id = ctl;
+ control.value = 1;
+ rc = v4l2object->ioctl(v4l2object->video_fd, VIDIOC_S_CTRL, &control);
+ if (rc != 0)
+ {
+ GST_ERROR_OBJECT(v4l2object->dbg_obj, "set ctl:0x%x fail rc %d", ctl, rc);
+ return FALSE;
+ }
+ GST_DEBUG_OBJECT(v4l2object->dbg_obj, "set ctl:0x%x succ", ctl);
+ return TRUE;
+ }
+ else
+ {
+ GST_DEBUG_OBJECT(v4l2object->dbg_obj, "ctl:0x%x is disabled", ctl);
+ return TRUE;
+ }
+ }
+ else
+ {
+ GST_ERROR_OBJECT(v4l2object->dbg_obj, "VIDIOC_QUERYCTRL for 0x:%x fail", ctl);
+ return FALSE;
+ }
+}
+
+
gboolean gst_aml_v4l2_set_drm_mode(GstAmlV4l2Object *v4l2object)
{
/* On AmLogic, output obj use of GST_V4L2_IO_DMABUF_IMPORT implies secure memory */
if (v4l2object->req_mode == GST_V4L2_IO_DMABUF_IMPORT)
{
- int rc;
- struct v4l2_queryctrl queryctrl;
- struct v4l2_control control;
- GstAmlV4l2VideoDec *self = (GstAmlV4l2VideoDec *)v4l2object->element;
- self->is_secure_path = TRUE;
-
-//#define V4L2_CID_USER_AMLOGIC_BASE (V4L2_CID_USER_BASE + 0x1100)
-//#define AML_V4L2_SET_DRMMODE (V4L2_CID_USER_AMLOGIC_BASE + 0)
- memset(&queryctrl, 0, sizeof(queryctrl));
- queryctrl.id = AML_V4L2_SET_DRMMODE;
-
- rc = v4l2object->ioctl(v4l2object->video_fd, VIDIOC_QUERYCTRL, &queryctrl);
- if (rc == 0)
+ if (gst_aml_v4l2_set_control(v4l2object, AML_V4L2_SET_DRMMODE))
{
- if (!(queryctrl.flags & V4L2_CTRL_FLAG_DISABLED))
- {
- memset(&control, 0, sizeof(control));
- control.id = AML_V4L2_SET_DRMMODE;
- control.value = 1;
- rc = v4l2object->ioctl(v4l2object->video_fd, VIDIOC_S_CTRL, &control);
- if (rc != 0)
- {
- GST_ERROR_OBJECT(v4l2object, "AML_V4L2_SET_DRMMODE fail: rc %d", rc);
- return FALSE;
- }
- GST_DEBUG_OBJECT(v4l2object, "AML_V4L2_SET_DRMMODE set succ");
- return TRUE;
- }
- else
- {
- GST_DEBUG_OBJECT(v4l2object, "AML_V4L2_SET_DRMMODE is disabled");
- return TRUE;
- }
+ GST_DEBUG_OBJECT(v4l2object->dbg_obj, "AML_V4L2_SET_DRMMODE set succ");
+ return TRUE;
}
else
{
- GST_ERROR_OBJECT(v4l2object, "VIDIOC_QUERYCTRL for AML_V4L2_SET_DRMMODE fail");
+ GST_ERROR_OBJECT(v4l2object->dbg_obj, "AML_V4L2_SET_DRMMODE set fail");
return FALSE;
}
}
else
{
- GST_DEBUG_OBJECT(v4l2object, "req mode is not GST_V4L2_IO_DMABUF_IMPORT, DRM mode does not need to be configured");
+ GST_DEBUG_OBJECT(v4l2object->dbg_obj, "req mode is not GST_V4L2_IO_DMABUF_IMPORT, DRM mode does not need to be configured");
+ return TRUE;
+ }
+}
+
+gboolean gst_aml_v4l2_set_stream_mode(GstAmlV4l2Object *v4l2object)
+{
+ if (v4l2object->stream_mode)
+ {
+ if (gst_aml_v4l2_set_control(v4l2object, AML_V4L2_SET_STREAM_MODE))
+ {
+ GST_DEBUG_OBJECT(v4l2object->dbg_obj, "AML_V4L2_SET_STREAM_MODE set succ");
+ return TRUE;
+ }
+ else
+ {
+ GST_ERROR_OBJECT(v4l2object->dbg_obj, "AML_V4L2_SET_STREAM_MODE set fail");
+ return FALSE;
+ }
+ }
+ else
+ {
+ GST_DEBUG_OBJECT(v4l2object->dbg_obj, "req mode is not stream mode, frame mode in configured by default");
return TRUE;
}
}