codecs: {vp8,vp9}decoder: Cleanup drain code
authorSeungha Yang <seungha@centricular.com>
Thu, 30 Sep 2021 16:00:24 +0000 (01:00 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 2 Oct 2021 12:11:48 +0000 (12:11 +0000)
Make them consistent with h26x decoder baseclass

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

subprojects/gst-plugins-bad/gst-libs/gst/codecs/gstvp8decoder.c
subprojects/gst-plugins-bad/gst-libs/gst/codecs/gstvp9decoder.c

index 5150e73..d99bd5e 100644 (file)
@@ -76,7 +76,8 @@ static void gst_vp8_decoder_clear_output_frame (GstVp8DecoderOutputFrame *
     output_frame);
 static void gst_vp8_decoder_drain_output_queue (GstVp8Decoder * self,
     guint num, GstFlowReturn * ret);
-
+static GstFlowReturn gst_vp8_decoder_drain_internal (GstVp8Decoder * self,
+    gboolean wait_keyframe);
 
 static void
 gst_vp8_decoder_class_init (GstVp8DecoderClass * klass)
@@ -273,18 +274,29 @@ done:
 }
 
 static GstFlowReturn
-gst_vp8_decoder_finish (GstVideoDecoder * decoder)
+gst_vp8_decoder_drain_internal (GstVp8Decoder * self, gboolean wait_keyframe)
 {
-  GstVp8Decoder *self = GST_VP8_DECODER (decoder);
   GstFlowReturn ret = GST_FLOW_OK;
+  GstVp8DecoderPrivate *priv = self->priv;
 
-  GST_DEBUG_OBJECT (self, "finish");
+  gst_vp8_decoder_drain_output_queue (self, 0, &ret);
+  gst_vp8_picture_clear (&self->last_picture);
+  gst_vp8_picture_clear (&self->golden_ref_picture);
+  gst_vp8_picture_clear (&self->alt_ref_picture);
 
-  gst_vp8_decoder_drain_output_queue (GST_VP8_DECODER (decoder), 0, &ret);
+  priv->wait_keyframe = wait_keyframe;
 
   return ret;
 }
 
+static GstFlowReturn
+gst_vp8_decoder_finish (GstVideoDecoder * decoder)
+{
+  GST_DEBUG_OBJECT (decoder, "finish");
+
+  return gst_vp8_decoder_drain_internal (GST_VP8_DECODER (decoder), TRUE);
+}
+
 static gboolean
 gst_vp8_decoder_flush (GstVideoDecoder * decoder)
 {
@@ -300,15 +312,9 @@ gst_vp8_decoder_flush (GstVideoDecoder * decoder)
 static GstFlowReturn
 gst_vp8_decoder_drain (GstVideoDecoder * decoder)
 {
-  GstVp8Decoder *self = GST_VP8_DECODER (decoder);
-  GstFlowReturn ret = GST_FLOW_OK;
+  GST_DEBUG_OBJECT (decoder, "drain");
 
-  GST_DEBUG_OBJECT (self, "drain");
-
-  gst_vp8_decoder_drain_output_queue (GST_VP8_DECODER (decoder), 0, &ret);
-  gst_vp8_decoder_reset (self);
-
-  return ret;
+  return gst_vp8_decoder_drain_internal (GST_VP8_DECODER (decoder), TRUE);
 }
 
 static void
index e482009..d8db0c1 100644 (file)
@@ -110,6 +110,8 @@ static void
 gst_vp9_decoder_clear_output_frame (GstVp9DecoderOutputFrame * output_frame);
 static void gst_vp9_decoder_drain_output_queue (GstVp9Decoder * self,
     guint num, GstFlowReturn * ret);
+static GstFlowReturn gst_vp9_decoder_drain_internal (GstVp9Decoder * self,
+    gboolean wait_keyframe);
 
 static void
 gst_vp9_decoder_class_init (GstVp9DecoderClass * klass)
@@ -249,18 +251,28 @@ gst_vp9_decoder_reset (GstVp9Decoder * self)
 }
 
 static GstFlowReturn
-gst_vp9_decoder_finish (GstVideoDecoder * decoder)
+gst_vp9_decoder_drain_internal (GstVp9Decoder * self, gboolean wait_keyframe)
 {
   GstFlowReturn ret = GST_FLOW_OK;
+  GstVp9DecoderPrivate *priv = self->priv;
 
-  GST_DEBUG_OBJECT (decoder, "finish");
+  gst_vp9_decoder_drain_output_queue (self, 0, &ret);
+  if (priv->dpb)
+    gst_vp9_dpb_clear (priv->dpb);
 
-  gst_vp9_decoder_drain_output_queue (GST_VP9_DECODER (decoder), 0, &ret);
-  gst_vp9_decoder_reset (GST_VP9_DECODER (decoder));
+  priv->wait_keyframe = wait_keyframe;
 
   return ret;
 }
 
+static GstFlowReturn
+gst_vp9_decoder_finish (GstVideoDecoder * decoder)
+{
+  GST_DEBUG_OBJECT (decoder, "finish");
+
+  return gst_vp9_decoder_drain_internal (GST_VP9_DECODER (decoder), TRUE);
+}
+
 static gboolean
 gst_vp9_decoder_flush (GstVideoDecoder * decoder)
 {
@@ -274,14 +286,9 @@ gst_vp9_decoder_flush (GstVideoDecoder * decoder)
 static GstFlowReturn
 gst_vp9_decoder_drain (GstVideoDecoder * decoder)
 {
-  GstFlowReturn ret = GST_FLOW_OK;
-
   GST_DEBUG_OBJECT (decoder, "drain");
 
-  gst_vp9_decoder_drain_output_queue (GST_VP9_DECODER (decoder), 0, &ret);
-  gst_vp9_decoder_reset (GST_VP9_DECODER (decoder));
-
-  return ret;
+  return gst_vp9_decoder_drain_internal (GST_VP9_DECODER (decoder), TRUE);
 }
 
 static void