diff options
author | Olivier Crête <olivier.crete@collabora.com> | 2021-05-27 16:05:04 -0400 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2021-06-02 19:24:19 +0100 |
commit | be0f32155cc860dad51b3c9dec7b8ca2305e900b (patch) | |
tree | a82d39b11716539660c0ddd0f840cbd73c5a0761 | |
parent | f008cb00f73ebca04c531b2dc2607b9f601ec885 (diff) | |
download | gstreamer-plugins-base-be0f32155cc860dad51b3c9dec7b8ca2305e900b.tar.gz |
audioaggregator: Don't overwrite already written samples
On re-sync, don't forget what has already been written. Instead, just
drop any samples that overlap with parts that were already filled.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1185>
-rw-r--r-- | gst-libs/gst/audio/gstaudioaggregator.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/gst-libs/gst/audio/gstaudioaggregator.c b/gst-libs/gst/audio/gstaudioaggregator.c index 5249dc2ab..2668c51b1 100644 --- a/gst-libs/gst/audio/gstaudioaggregator.c +++ b/gst-libs/gst/audio/gstaudioaggregator.c @@ -1669,13 +1669,12 @@ gst_audio_aggregator_fill_buffer (GstAudioAggregator * aagg, GST_DEBUG_OBJECT (pad, "Have discont. Expected %" G_GUINT64_FORMAT ", got %" G_GUINT64_FORMAT, pad->priv->next_offset, start_offset); - pad->priv->output_offset = -1; pad->priv->next_offset = end_offset; } else { pad->priv->next_offset += pad->priv->size; } - if (pad->priv->output_offset == -1) { + if (pad->priv->output_offset == -1 || discont) { GstClockTime start_running_time; GstClockTime end_running_time; GstClockTime segment_pos; @@ -1711,7 +1710,6 @@ gst_audio_aggregator_fill_buffer (GstAudioAggregator * aagg, /* Outside output segment, drop */ pad->priv->position = 0; pad->priv->size = 0; - pad->priv->output_offset = -1; GST_DEBUG_OBJECT (pad, "Buffer outside output segment"); return FALSE; } @@ -1723,14 +1721,16 @@ gst_audio_aggregator_fill_buffer (GstAudioAggregator * aagg, if (end_output_offset < aagg->priv->offset) { pad->priv->position = 0; pad->priv->size = 0; - pad->priv->output_offset = -1; GST_DEBUG_OBJECT (pad, "Buffer before segment or current position: %" G_GUINT64_FORMAT " < %" G_GINT64_FORMAT, end_output_offset, aagg->priv->offset); return FALSE; } - if (start_output_offset == -1 || start_output_offset < aagg->priv->offset) { + if (start_output_offset == -1 || + start_output_offset < aagg->priv->offset || + (pad->priv->output_offset != -1 && + start_output_offset < pad->priv->output_offset)) { guint diff; if (start_output_offset == -1 && end_output_offset < pad->priv->size) { @@ -1742,6 +1742,9 @@ gst_audio_aggregator_fill_buffer (GstAudioAggregator * aagg, diff = aagg->priv->offset - start_output_offset; else diff = 0; + } else if (pad->priv->output_offset != -1 && + start_output_offset < pad->priv->output_offset) { + diff = pad->priv->output_offset - start_output_offset; } else { diff = aagg->priv->offset - start_output_offset; } @@ -1751,7 +1754,6 @@ gst_audio_aggregator_fill_buffer (GstAudioAggregator * aagg, /* Empty buffer, drop */ pad->priv->position = 0; pad->priv->size = 0; - pad->priv->output_offset = -1; GST_DEBUG_OBJECT (pad, "Buffer before segment or current position: %" G_GUINT64_FORMAT " < %" G_GINT64_FORMAT, end_output_offset, aagg->priv->offset); @@ -1761,6 +1763,9 @@ gst_audio_aggregator_fill_buffer (GstAudioAggregator * aagg, if (start_output_offset == -1 || start_output_offset < aagg->priv->offset) pad->priv->output_offset = aagg->priv->offset; + else if (pad->priv->output_offset != -1) + pad->priv->output_offset = MAX (pad->priv->output_offset, + start_output_offset); else pad->priv->output_offset = start_output_offset; |