From 13b31e77c60b0367ef21ac96b88ae77882f282d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 17 Sep 2016 12:42:46 +0200 Subject: 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 064bf3507..0155ced13 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; -- cgit v1.2.1