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