From ebf80977c43185e7a2fc0a915429ebb128459580 Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Wed, 4 Apr 2012 20:43:23 +0200 Subject: [PATCH] audiodecoder: don't discard timestamps when consecutive input buffers have the same ts Avoid pushing out buffers with the same timestamp only if the out buffers are decoded from the same input buffer. Instead keep the timestamps when upstream pushes consecutive buffers with the same ts. --- gst-libs/gst/audio/gstaudiodecoder.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiodecoder.c b/gst-libs/gst/audio/gstaudiodecoder.c index 31253e4cb2..a7bcf97682 100644 --- a/gst-libs/gst/audio/gstaudiodecoder.c +++ b/gst-libs/gst/audio/gstaudiodecoder.c @@ -216,6 +216,7 @@ struct _GstAudioDecoderPrivate GstAdapter *adapter; /* tracking input ts for changes */ GstClockTime prev_ts; + guint64 prev_distance; /* frames obtained from input */ GQueue frames; /* collected output data */ @@ -475,6 +476,7 @@ gst_audio_decoder_reset (GstAudioDecoder * dec, gboolean full) dec->priv->out_ts = GST_CLOCK_TIME_NONE; dec->priv->out_dur = 0; dec->priv->prev_ts = GST_CLOCK_TIME_NONE; + dec->priv->prev_distance = 0; dec->priv->drained = TRUE; dec->priv->base_ts = GST_CLOCK_TIME_NONE; dec->priv->samples = 0; @@ -1055,6 +1057,7 @@ gst_audio_decoder_push_buffers (GstAudioDecoder * dec, gboolean force) if (G_LIKELY (av)) { gint len; GstClockTime ts; + guint64 distance; /* parse if needed */ if (klass->parse) { @@ -1094,12 +1097,13 @@ gst_audio_decoder_push_buffers (GstAudioDecoder * dec, gboolean force) len = av; } /* track upstream ts, but do not get stuck if nothing new upstream */ - ts = gst_adapter_prev_timestamp (priv->adapter, NULL); - if (ts == priv->prev_ts) { + ts = gst_adapter_prev_timestamp (priv->adapter, &distance); + if (ts != priv->prev_ts || distance <= priv->prev_distance) { + priv->prev_ts = ts; + priv->prev_distance = distance; + } else { GST_LOG_OBJECT (dec, "ts == prev_ts; discarding"); ts = GST_CLOCK_TIME_NONE; - } else { - priv->prev_ts = ts; } buffer = gst_adapter_take_buffer (priv->adapter, len); buffer = gst_buffer_make_writable (buffer);