summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Crête <olivier.crete@collabora.com>2021-05-27 16:05:04 -0400
committerTim-Philipp Müller <tim@centricular.com>2021-06-02 19:24:19 +0100
commitbe0f32155cc860dad51b3c9dec7b8ca2305e900b (patch)
treea82d39b11716539660c0ddd0f840cbd73c5a0761
parentf008cb00f73ebca04c531b2dc2607b9f601ec885 (diff)
downloadgstreamer-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.c17
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;