From 6b3ff669ee0fc87ca4a43e115da4621c820dbeea Mon Sep 17 00:00:00 2001 From: He Junyan Date: Mon, 12 Oct 2020 00:57:24 +0800 Subject: [PATCH] codecs: vp8decoder: handle the show_frame check in base class. Move the show_frame check from sub class to vp8 decoder's base class. Calling the sub class' output_picture() function only when the frame is displayed and marking the other automatically as decode only. This is done to avoid logic and code repetition in subclasses. Part-of: --- gst-libs/gst/codecs/gstvp8decoder.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/gst-libs/gst/codecs/gstvp8decoder.c b/gst-libs/gst/codecs/gstvp8decoder.c index 12c983d48f..ad783956b3 100644 --- a/gst-libs/gst/codecs/gstvp8decoder.c +++ b/gst-libs/gst/codecs/gstvp8decoder.c @@ -283,6 +283,7 @@ gst_vp8_decoder_handle_frame (GstVideoDecoder * decoder, GstVp8FrameHdr frame_hdr; GstVp8ParserResult pres; GstVp8Picture *picture = NULL; + GstFlowReturn ret = GST_FLOW_OK; GST_LOG_OBJECT (self, "handle frame, PTS: %" GST_TIME_FORMAT ", DTS: %" @@ -363,8 +364,19 @@ gst_vp8_decoder_handle_frame (GstVideoDecoder * decoder, gst_vp8_decoder_update_reference (self, gst_vp8_picture_ref (picture)); - g_assert (klass->output_picture); - return klass->output_picture (self, frame, picture); + if (!picture->frame_hdr.show_frame) { + GST_LOG_OBJECT (self, "Decode only picture %p", picture); + GST_VIDEO_CODEC_FRAME_SET_DECODE_ONLY (frame); + + gst_vp8_picture_unref (picture); + + ret = gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame); + } else { + g_assert (klass->output_picture); + ret = klass->output_picture (self, frame, picture); + } + + return ret; unmap_and_error: { @@ -374,8 +386,6 @@ unmap_and_error: error: { - GstFlowReturn ret; - if (picture) gst_vp8_picture_unref (picture);