ffdec: don't flush buffers on DISCONT

Don't flush the buffers that ffmpeg has on DISCONT but instead let it recover.
This gives a much better image in the case of packet loss.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=635020
This commit is contained in:
Wim Taymans 2012-04-20 16:16:25 +02:00
parent e746746120
commit 630790f50d

View file

@ -2560,15 +2560,15 @@ gst_ffmpegdec_chain (GstPad * pad, GstBuffer * inbuf)
discont = GST_BUFFER_IS_DISCONT (inbuf); discont = GST_BUFFER_IS_DISCONT (inbuf);
/* The discont flags marks a buffer that is not continuous with the previous /* The discont flags marks a buffer that is not continuous with the previous
* buffer. This means we need to clear whatever data we currently have. We * buffer. This means we need to clear whatever data we currently have. We let
* currently also wait for a new keyframe, which might be suboptimal in the * ffmpeg continue with the data that it has. We currently drain the old
* case of a network error, better show the errors than to drop all data.. */ * frames that might be inside the decoder and we clear any partial data in
* the pcache, we might be able to remove the drain and flush too. */
if (G_UNLIKELY (discont)) { if (G_UNLIKELY (discont)) {
GST_DEBUG_OBJECT (ffmpegdec, "received DISCONT"); GST_DEBUG_OBJECT (ffmpegdec, "received DISCONT");
/* drain what we have queued */ /* drain what we have queued */
gst_ffmpegdec_drain (ffmpegdec); gst_ffmpegdec_drain (ffmpegdec);
gst_ffmpegdec_flush_pcache (ffmpegdec); gst_ffmpegdec_flush_pcache (ffmpegdec);
avcodec_flush_buffers (ffmpegdec->context);
ffmpegdec->discont = TRUE; ffmpegdec->discont = TRUE;
gst_ffmpegdec_reset_ts (ffmpegdec); gst_ffmpegdec_reset_ts (ffmpegdec);
} }