amlv4l2dec: CF2 amlv4l2 can support avs codec [1/1]
PD#SWPL-74963
Problem:
amlv4l2 support avs, avs2, and avs3 codecs
Solution:
amlv4l2dec add avs codec
Verify:
Yocto
Signed-off-by: zengliang.li <zengliang.li@amlogic.com>
Change-Id: If6ebe8e15513c8f2e08e60ecfab30152407192d9
diff --git a/src/ext/videodev2.h b/src/ext/videodev2.h
index b620332..9530213 100644
--- a/src/ext/videodev2.h
+++ b/src/ext/videodev2.h
@@ -659,6 +659,9 @@
#define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0') /* VP8 */
#define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') /* VP9 */
#define V4L2_PIX_FMT_AV1 v4l2_fourcc('A', 'V', '1', '0') /* AV1 */
+#define V4L2_PIX_FMT_AVS v4l2_fourcc('A', 'V', 'S', '0') /* AVS */
+#define V4L2_PIX_FMT_AVS2 v4l2_fourcc('A', 'V', 'S', '2') /* AVS2 */
+#define V4L2_PIX_FMT_AVS3 v4l2_fourcc('A', 'V', 'S', '3') /* AVS3 */
#define V4L2_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C') /* HEVC aka H.265 */
#define V4L2_PIX_FMT_FWHT v4l2_fourcc('F', 'W', 'H', 'T') /* Fast Walsh Hadamard Transform (vicodec) */
diff --git a/src/gstamlv4l2object.c b/src/gstamlv4l2object.c
index 09b8726..dc78171 100644
--- a/src/gstamlv4l2object.c
+++ b/src/gstamlv4l2object.c
@@ -192,6 +192,9 @@
{V4L2_PIX_FMT_VP8, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
{V4L2_PIX_FMT_VP9, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
{V4L2_PIX_FMT_AV1, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
+ {V4L2_PIX_FMT_AVS, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
+ {V4L2_PIX_FMT_AVS2, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
+ {V4L2_PIX_FMT_AVS3, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
/* Vendor-specific formats */
{V4L2_PIX_FMT_WNVA, TRUE, GST_V4L2_CODEC},
@@ -1432,6 +1435,15 @@
case V4L2_PIX_FMT_AV1:
structure = gst_structure_new_empty("video/x-av1");
break;
+ case V4L2_PIX_FMT_AVS:
+ structure = gst_structure_new_empty("video/x-avs");
+ break;
+ case V4L2_PIX_FMT_AVS2:
+ structure = gst_structure_new_empty("video/x-avs2");
+ break;
+ case V4L2_PIX_FMT_AVS3:
+ structure = gst_structure_new_empty("video/x-avs3");
+ break;
case V4L2_PIX_FMT_GREY: /* 8 Greyscale */
case V4L2_PIX_FMT_Y16:
case V4L2_PIX_FMT_Y16_BE:
@@ -1851,6 +1863,18 @@
{
fourcc = V4L2_PIX_FMT_AV1;
}
+ else if (g_str_equal(mimetype, "video/x-avs"))
+ {
+ fourcc = V4L2_PIX_FMT_AVS;
+ }
+ else if (g_str_equal(mimetype, "video/x-avs2"))
+ {
+ fourcc = V4L2_PIX_FMT_AVS2;
+ }
+ else if (g_str_equal(mimetype, "video/x-avs3"))
+ {
+ fourcc = V4L2_PIX_FMT_AVS3;
+ }
else if (g_str_equal(mimetype, "video/x-bayer"))
{
const gchar *vformat = gst_structure_get_string(structure, "format");
diff --git a/src/gstamlv4l2videodec.c b/src/gstamlv4l2videodec.c
index 9953ddc..b1db3e2 100644
--- a/src/gstamlv4l2videodec.c
+++ b/src/gstamlv4l2videodec.c
@@ -1564,6 +1564,24 @@
GST_DEBUG_OBJECT(self, "after Send private_signal Event :%p", event);
break;
}
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+ GstStructure *structure;
+
+ gst_event_parse_caps (event, &caps);
+ structure= gst_caps_get_structure(caps, 0);
+ if ( gst_structure_has_field(structure, "parsed") )
+ {
+ gboolean parsed = TRUE;
+ if ( gst_structure_get_boolean( structure, "parsed", &parsed ) )
+ {
+ self->v4l2output->stream_mode = !parsed;
+ GST_DEBUG("frame parsed:%d, set stream_mode to %d", parsed, self->v4l2output->stream_mode);
+ }
+ }
+ break;
+ }
case GST_EVENT_FLUSH_START:
GST_DEBUG_OBJECT(self, "flush start");
@@ -1875,6 +1893,18 @@
{
SET_META("AV1");
}
+ else if (gst_structure_has_name(s, "video/x-avs"))
+ {
+ SET_META("AVS");
+ }
+ else if (gst_structure_has_name(s, "video/x-avs2"))
+ {
+ SET_META("AVS2");
+ }
+ else if (gst_structure_has_name(s, "video/x-avs3"))
+ {
+ SET_META("AVS3");
+ }
else if (gst_structure_has_name(s, "video/x-bayer"))
{
SET_META("BAYER");