videodecoder: Drain decoder on DISCONT buffers
authorEdward Hervey <edward@centricular.com>
Sat, 4 Jun 2016 07:49:00 +0000 (09:49 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Tue, 7 Jun 2016 07:49:56 +0000 (09:49 +0200)
This ensures the decoder is properly drained out when receiving a
DISCONT buffer. The optimal way of doing this would have been to
receive a GAP event before hand but it is not always possible.

Fixes big delays with some decoders (ex gst-libav) that will not
drain out data when only decoding keyframes.

https://bugzilla.gnome.org/show_bug.cgi?id=767232

gst-libs/gst/video/gstvideodecoder.c

index 957dea1..5f463bd 100644 (file)
@@ -2179,6 +2179,9 @@ gst_video_decoder_chain_forward (GstVideoDecoder * decoder,
 
   g_return_val_if_fail (priv->packetized || klass->parse, GST_FLOW_ERROR);
 
+  if (GST_BUFFER_IS_DISCONT (buf))
+    ret = gst_video_decoder_drain_out (decoder, FALSE);
+
   if (priv->current_frame == NULL)
     priv->current_frame = gst_video_decoder_new_frame (decoder);