From 06bcf95ebf37ee2c6887420d20cbc193e1feeb3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 1 Jul 2020 18:09:22 +0300 Subject: [PATCH] videodecoder: Add API for marking output frames as corrupted 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: --- gst-libs/gst/video/gstvideodecoder.c | 14 ++++++++++++++ gst-libs/gst/video/gstvideoutils.h | 11 ++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index b6d91bfac6..84d60eb203 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -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 = diff --git a/gst-libs/gst/video/gstvideoutils.h b/gst-libs/gst/video/gstvideoutils.h index f49a089748..b89267de67 100644 --- a/gst-libs/gst/video/gstvideoutils.h +++ b/gst-libs/gst/video/gstvideoutils.h @@ -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; /**