summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward.hervey@collabora.co.uk>2012-04-26 17:00:43 +0200
committerEdward Hervey <edward.hervey@collabora.co.uk>2012-04-26 18:53:51 +0200
commit6d2b483e151564ca3d694a4f58c366a0b2aad1dc (patch)
tree9689bf19a11a6e9662fcbb96711e7b896a0ac5ae
parent252c5e0a922e35f086cbc40ae6a9c9e37d3d1c85 (diff)
ffmpegviddec: Flush and drain when needed
we need to flush avcodec internal state on hard resets we need to drain out pending buffers on EOS and soft resets
-rw-r--r--ext/ffmpeg/gstffmpegviddec.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/ext/ffmpeg/gstffmpegviddec.c b/ext/ffmpeg/gstffmpegviddec.c
index 7cfe722..fa25d69 100644
--- a/ext/ffmpeg/gstffmpegviddec.c
+++ b/ext/ffmpeg/gstffmpegviddec.c
@@ -152,6 +152,7 @@ static int gst_ffmpegviddec_get_buffer (AVCodecContext * context,
static void gst_ffmpegviddec_release_buffer (AVCodecContext * context,
AVFrame * picture);
+static GstFlowReturn gst_ffmpegviddec_finish (GstVideoDecoder * decoder);
static void gst_ffmpegviddec_drain (GstFFMpegVidDec * ffmpegdec);
#define GST_FFDEC_PARAMS_QDATA g_quark_from_static_string("ffdec-params")
@@ -298,6 +299,7 @@ gst_ffmpegviddec_class_init (GstFFMpegVidDecClass * klass)
viddec_class->handle_frame = gst_ffmpegviddec_handle_frame;
viddec_class->stop = gst_ffmpegviddec_stop;
viddec_class->reset = gst_ffmpegviddec_reset;
+ viddec_class->finish = gst_ffmpegviddec_finish;
}
static void
@@ -1384,13 +1386,26 @@ gst_ffmpegviddec_stop (GstVideoDecoder * decoder)
return TRUE;
}
+static GstFlowReturn
+gst_ffmpegviddec_finish (GstVideoDecoder * decoder)
+{
+ GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
+
+ gst_ffmpegviddec_drain (ffmpegdec);
+
+ return GST_FLOW_OK;
+}
+
static gboolean
gst_ffmpegviddec_reset (GstVideoDecoder * decoder, gboolean hard)
{
GstFFMpegVidDec *ffmpegdec = (GstFFMpegVidDec *) decoder;
- if (ffmpegdec->opened)
- gst_ffmpegviddec_drain (ffmpegdec);
+ if (ffmpegdec->opened) {
+ if (!hard)
+ gst_ffmpegviddec_drain (ffmpegdec);
+ avcodec_flush_buffers (ffmpegdec->context);
+ }
return TRUE;
}