From f4949f91d50d86f0dd3830084f7d5014a0280fd6 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Thu, 23 Sep 2004 14:54:57 +0000 Subject: [PATCH] ext/ffmpeg/gstffmpegdec.c: Update timestamp for every new buffer that we output. Improves audio playback for several ... Original commit message from CVS: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): Update timestamp for every new buffer that we output. Improves audio playback for several files that have multiple audio chunks per buffer. --- ChangeLog | 7 +++++++ ext/ffmpeg/gstffmpegdec.c | 22 ++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 165309f..0ee84a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-09-23 Ronald S. Bultje + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + Update timestamp for every new buffer that we output. Improves + audio playback for several files that have multiple audio chunks + per buffer. + 2004-09-22 Ronald S. Bultje * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): diff --git a/ext/ffmpeg/gstffmpegdec.c b/ext/ffmpeg/gstffmpegdec.c index 2f1ae48..8076d58 100644 --- a/ext/ffmpeg/gstffmpegdec.c +++ b/ext/ffmpeg/gstffmpegdec.c @@ -368,6 +368,7 @@ gst_ffmpegdec_chain (GstPad * pad, GstData * _data) guchar *data; gint size, len = 0; gint have_data; + guint64 expected_ts = GST_BUFFER_TIMESTAMP (inbuf); if (!ffmpegdec->opened) { GST_ELEMENT_ERROR (ffmpegdec, CORE, NEGOTIATION, (NULL), @@ -443,8 +444,14 @@ gst_ffmpegdec_chain (GstPad * pad, GstData * _data) } } - /* this isn't necessarily true, but it's better than nothing */ - GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf); + /* note that ffmpeg sometimes gets the FPS wrong */ + if (GST_CLOCK_TIME_IS_VALID (expected_ts)) { + GST_BUFFER_TIMESTAMP (outbuf) = expected_ts; + GST_BUFFER_DURATION (outbuf) = GST_SECOND * + ffmpegdec->context->frame_rate_base / + ffmpegdec->context->frame_rate; + expected_ts += GST_BUFFER_DURATION (outbuf); + } } break; @@ -462,8 +469,13 @@ gst_ffmpegdec_chain (GstPad * pad, GstData * _data) if (have_data) { GST_BUFFER_SIZE (outbuf) = have_data; - GST_BUFFER_DURATION (outbuf) = (have_data * GST_SECOND) / - (ffmpegdec->context->channels * ffmpegdec->context->sample_rate); + if (GST_CLOCK_TIME_IS_VALID (expected_ts)) { + GST_BUFFER_TIMESTAMP (outbuf) = expected_ts; + GST_BUFFER_DURATION (outbuf) = (have_data * GST_SECOND) / + (2 * ffmpegdec->context->channels * + ffmpegdec->context->sample_rate); + expected_ts += GST_BUFFER_DURATION (outbuf); + } } else { gst_buffer_unref (outbuf); } @@ -511,8 +523,6 @@ gst_ffmpegdec_chain (GstPad * pad, GstData * _data) gst_caps_free (caps); } - GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf); - gst_pad_push (ffmpegdec->srcpad, GST_DATA (outbuf)); } -- 2.7.4