videodecoder: Add API for marking output frames as corrupted
authorSebastian Dröge <sebastian@centricular.com>
Wed, 1 Jul 2020 15:09:22 +0000 (18:09 +0300)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 10 Sep 2020 17:22:14 +0000 (17:22 +0000)
This can be used by subclasses to mark output frames as known to be
corrupted, for example if reference frames were missing. ffmpeg's
decoders can signal this.

In addition this flag is propagated downstream if the input frame had it
set.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/730>

gst-libs/gst/video/gstvideodecoder.c
gst-libs/gst/video/gstvideoutils.h

index b6d91bf..84d60eb 100644 (file)
@@ -3171,6 +3171,14 @@ gst_video_decoder_finish_frame (GstVideoDecoder * decoder,
     GST_BUFFER_FLAG_SET (output_buffer, GST_BUFFER_FLAG_DISCONT);
   }
 
+  if (GST_VIDEO_CODEC_FRAME_FLAG_IS_SET (frame,
+          GST_VIDEO_CODEC_FRAME_FLAG_CORRUPTED)) {
+    GST_DEBUG_OBJECT (decoder,
+        "marking frame %" GST_TIME_FORMAT " as corrupted",
+        GST_TIME_ARGS (frame->pts));
+    GST_BUFFER_FLAG_SET (output_buffer, GST_BUFFER_FLAG_CORRUPTED);
+  }
+
   if (decoder_class->transform_meta) {
     if (G_LIKELY (frame->input_buffer)) {
       CopyMetaData data;
@@ -3487,6 +3495,12 @@ gst_video_decoder_have_frame (GstVideoDecoder * decoder)
     GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (priv->current_frame);
   }
 
+  if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_CORRUPTED)) {
+    GST_LOG_OBJECT (decoder, "Marking as corrupted");
+    GST_VIDEO_CODEC_FRAME_FLAG_SET (priv->current_frame,
+        GST_VIDEO_CODEC_FRAME_FLAG_CORRUPTED);
+  }
+
   /* In reverse playback, just capture and queue frames for later processing */
   if (decoder->input_segment.rate < 0.0) {
     priv->parse_gather =
index f49a089..b89267d 100644 (file)
@@ -82,6 +82,7 @@ struct _GstVideoCodecState
  * @GST_VIDEO_CODEC_FRAME_FLAG_SYNC_POINT: is the frame a synchronization point (keyframe)
  * @GST_VIDEO_CODEC_FRAME_FLAG_FORCE_KEYFRAME: should the output frame be made a keyframe
  * @GST_VIDEO_CODEC_FRAME_FLAG_FORCE_KEYFRAME_HEADERS: should the encoder output stream headers
+ * @GST_VIDEO_CODEC_FRAME_FLAG_CORRUPTED: the buffer data is corrupted (Since: 1.20)
  *
  * Flags for #GstVideoCodecFrame
  */
@@ -90,7 +91,15 @@ typedef enum
   GST_VIDEO_CODEC_FRAME_FLAG_DECODE_ONLY            = (1<<0),
   GST_VIDEO_CODEC_FRAME_FLAG_SYNC_POINT             = (1<<1),
   GST_VIDEO_CODEC_FRAME_FLAG_FORCE_KEYFRAME         = (1<<2),
-  GST_VIDEO_CODEC_FRAME_FLAG_FORCE_KEYFRAME_HEADERS = (1<<3)
+  GST_VIDEO_CODEC_FRAME_FLAG_FORCE_KEYFRAME_HEADERS = (1<<3),
+  /**
+   * GST_VIDEO_CODEC_FRAME_FLAG_CORRUPTED:
+   *
+   * The buffer data is corrupted.
+   *
+   * Since: 1.20
+   */
+  GST_VIDEO_CODEC_FRAME_FLAG_CORRUPTED = (1<<4),
 } GstVideoCodecFrameFlags;
 
 /**