codecs: {vp8,vp9}decoder: Drain on new_sequence()
authorSeungha Yang <seungha@centricular.com>
Sat, 18 Sep 2021 13:51:53 +0000 (22:51 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 2 Oct 2021 12:11:48 +0000 (12:11 +0000)
Decoder should drain queued frame (if any) and empty DPB before
starting new sequence.

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 d99bd5e..9f6c897 100644 (file)
@@ -168,6 +168,14 @@ gst_vp8_decoder_check_codec_change (GstVp8Decoder * self,
   if (changed || !priv->had_sequence) {
     GstVp8DecoderClass *klass = GST_VP8_DECODER_GET_CLASS (self);
 
+    /* Drain before new sequence */
+    ret = gst_vp8_decoder_drain_internal (self, FALSE);
+    if (ret != GST_FLOW_OK) {
+      GST_WARNING_OBJECT (self, "Failed to drain pending frames, returned %s",
+          gst_flow_get_name (ret));
+      return ret;
+    }
+
     priv->had_sequence = TRUE;
 
     if (klass->get_preferred_output_delay)
index d8db0c1..5fca5fa 100644 (file)
@@ -193,6 +193,14 @@ gst_vp9_decoder_check_codec_change (GstVp9Decoder * self,
   if (changed || !priv->had_sequence) {
     GstVp9DecoderClass *klass = GST_VP9_DECODER_GET_CLASS (self);
 
+    /* Drain before new sequence */
+    ret = gst_vp9_decoder_drain_internal (self, FALSE);
+    if (ret != GST_FLOW_OK) {
+      GST_WARNING_OBJECT (self, "Failed to drain pending frames, returned %s",
+          gst_flow_get_name (ret));
+      return ret;
+    }
+
     priv->had_sequence = TRUE;
 
     if (klass->get_preferred_output_delay) {