codecs: vp8decoder: handle the show_frame check in base class.
authorHe Junyan <junyan.he@intel.com>
Sun, 11 Oct 2020 16:57:24 +0000 (00:57 +0800)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 15 Oct 2020 19:01:54 +0000 (19:01 +0000)
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1670>

gst-libs/gst/codecs/gstvp8decoder.c

index 12c983d..ad78395 100644 (file)
@@ -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);