codecparsers: av1parse: Add the DECODE_ONLY flag to output buffer.
authorHe Junyan <junyan.he@intel.com>
Thu, 12 Aug 2021 11:14:16 +0000 (19:14 +0800)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 25 Dec 2021 12:18:24 +0000 (12:18 +0000)
When the alignment is ALIGN_FRAME and the output buf contains a frame
which is not to be shown, the GST_BUFFER_FLAG_DECODE_ONLY flag should
be set.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1050>

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

index 1060861..9119e90 100644 (file)
@@ -122,6 +122,7 @@ struct _GstAV1Parse
   gboolean discont;
   gboolean header;
   gboolean keyframe;
+  gboolean show_frame;
 };
 
 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
@@ -284,6 +285,7 @@ gst_av1_parse_reset (GstAV1Parse * self)
   self->discont = TRUE;
   self->header = FALSE;
   self->keyframe = FALSE;
+  self->show_frame = FALSE;
   self->last_parsed_offset = 0;
   self->highest_spatial_id = 0;
   g_clear_pointer (&self->colorimetry, g_free);
@@ -839,6 +841,14 @@ gst_av1_parse_push_data (GstAV1Parse * self, GstBaseParseFrame * frame,
     if (frame_finished)
       GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_MARKER);
 
+    if (self->align == GST_AV1_PARSE_ALIGN_FRAME) {
+      if (!self->show_frame) {
+        GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DECODE_ONLY);
+      } else {
+        GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DECODE_ONLY);
+      }
+    }
+
     gst_buffer_replace (&frame->out_buffer, buf);
     gst_buffer_unref (buf);
 
@@ -1179,6 +1189,8 @@ gst_av1_parse_handle_one_obu (GstAV1Parse * self, GstAV1OBU * obu,
     if (res != GST_AV1_PARSER_OK)
       GST_WARNING_OBJECT (self, "update frame get result %d", res);
 
+    self->show_frame = fh->show_frame || fh->show_existing_frame;
+
     if (fh->show_existing_frame)
       *frame_complete = TRUE;
 
@@ -1644,6 +1656,7 @@ gst_av1_parse_handle_frame (GstBaseParse * parse,
     self->last_parsed_offset = 0;
     self->header = FALSE;
     self->keyframe = FALSE;
+    self->show_frame = FALSE;
   } else {
     GST_LOG_OBJECT (self, "resuming frame parsing");
   }