av1parse: Add video codec tag to the tag list
authorSebastian Dröge <sebastian@centricular.com>
Mon, 16 Dec 2024 09:38:52 +0000 (11:38 +0200)
committerBackport Bot <gitlab-backport-bot@gstreamer-foundation.org>
Fri, 20 Dec 2024 00:53:04 +0000 (00:53 +0000)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8186>

subprojects/gst-plugins-bad/gst/videoparsers/gstav1parse.c

index 3d382893b16441f0b21cc44b160a2435e7097155..87ffa3a2023061c04529be4f75e234b6ffbd0218 100644 (file)
@@ -73,6 +73,7 @@
 #include <gst/base/gstbitwriter.h>
 #include <gst/codecparsers/gstav1parser.h>
 #include <gst/video/video.h>
+#include <gst/pbutils/pbutils.h>
 #include "gstvideoparserselements.h"
 #include "gstav1parse.h"
 
@@ -101,6 +102,8 @@ struct _GstAV1Parse
 {
   GstBaseParse parent;
 
+  gboolean first_frame;
+
   gint width;
   gint height;
   gint subsampling_x;
@@ -321,6 +324,7 @@ gst_av1_parse_reset (GstAV1Parse * self)
   self->show_frame = FALSE;
   self->last_parsed_offset = 0;
   self->highest_spatial_id = 0;
+  self->first_frame = TRUE;
   gst_av1_parse_reset_obu_data_state (self);
   g_clear_pointer (&self->colorimetry, g_free);
   g_clear_pointer (&self->parser, gst_av1_parser_free);
@@ -2140,6 +2144,34 @@ gst_av1_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
   if (!frame->buffer)
     return GST_FLOW_OK;
 
+  if (self->first_frame) {
+    GstTagList *taglist;
+    GstCaps *caps;
+
+    /* codec tag */
+    caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (caps == NULL) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (self))) {
+        GST_INFO_OBJECT (self, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (self, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
+    gst_pb_utils_add_codec_description_to_tag_list (taglist,
+        GST_TAG_VIDEO_CODEC, caps);
+    gst_caps_unref (caps);
+
+    gst_base_parse_merge_tags (parse, taglist, GST_TAG_MERGE_REPLACE);
+    gst_tag_list_unref (taglist);
+
+    /* also signals the end of first-frame processing */
+    self->first_frame = FALSE;
+  }
+
   if (self->align == GST_AV1_PARSE_ALIGN_FRAME) {
     /* When the input align to TU, it may may contain more than one frames
        inside its buffer. When splitting a TU into frames, the base parse