diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2016-09-17 12:42:46 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-09-30 13:41:28 +0300 |
commit | 13b31e77c60b0367ef21ac96b88ae77882f282d8 (patch) | |
tree | 4aaaba1fdaa9fe05546c789a1182995c1ca270ba | |
parent | 31dd3706cbb29fa61a901474f45cd9e0473f1f27 (diff) | |
download | gstreamer-plugins-base-13b31e77c60b0367ef21ac96b88ae77882f282d8.tar.gz |
audiotestsrc: Fix segment boundary checking for reverse playback
-rw-r--r-- | gst/audiotestsrc/gstaudiotestsrc.c | 16 |
1 files 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; |