From 031f2565845a625524c8bc945bd15ea674bb1285 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 17 Sep 2016 12:42:46 +0200 Subject: [PATCH] audiotestsrc: Fix segment boundary checking for reverse playback --- gst/audiotestsrc/gstaudiotestsrc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/gst/audiotestsrc/gstaudiotestsrc.c b/gst/audiotestsrc/gstaudiotestsrc.c index 252c416..d00c1c6 100644 --- a/gst/audiotestsrc/gstaudiotestsrc.c +++ b/gst/audiotestsrc/gstaudiotestsrc.c @@ -1123,11 +1123,16 @@ gst_audio_test_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment) src->next_sample = next_sample; - if (GST_CLOCK_TIME_IS_VALID (segment->stop)) { + if (segment->rate > 0 && GST_CLOCK_TIME_IS_VALID (segment->stop)) { time = segment->stop; src->sample_stop = gst_util_uint64_scale_round (time, samplerate, GST_SECOND); src->check_seek_stop = TRUE; + } else if (segment->rate < 0) { + time = segment->start; + src->sample_stop = + gst_util_uint64_scale_round (time, samplerate, GST_SECOND); + src->check_seek_stop = TRUE; } else { src->check_seek_stop = FALSE; } @@ -1202,7 +1207,7 @@ gst_audio_test_src_fill (GstBaseSrc * basesrc, guint64 offset, } /* check for eos */ - if (src->check_seek_stop && + if (src->check_seek_stop && !src->reverse && (src->sample_stop > src->next_sample) && (src->sample_stop < src->next_sample + samples) ) { @@ -1210,6 +1215,13 @@ gst_audio_test_src_fill (GstBaseSrc * basesrc, guint64 offset, src->generate_samples_per_buffer = src->sample_stop - src->next_sample; next_sample = src->sample_stop; src->eos_reached = TRUE; + } else if (src->check_seek_stop && src->reverse && + (src->sample_stop > src->next_sample) + ) { + /* calculate only partial buffer */ + src->generate_samples_per_buffer = src->sample_stop - src->next_sample; + next_sample = src->sample_stop; + src->eos_reached = TRUE; } else { /* calculate full buffer */ src->generate_samples_per_buffer = samples; -- 2.7.4