GstAdapter *adapter;
/* tracking input ts for changes */
GstClockTime prev_ts;
+ guint64 prev_distance;
/* frames obtained from input */
GQueue frames;
/* collected output data */
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;
if (G_LIKELY (av)) {
gint len;
GstClockTime ts;
+ guint64 distance;
/* parse if needed */
if (klass->parse) {
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);