summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2016-09-17 12:42:46 +0200
committerSebastian Dröge <sebastian@centricular.com>2016-09-30 13:41:28 +0300
commit13b31e77c60b0367ef21ac96b88ae77882f282d8 (patch)
tree4aaaba1fdaa9fe05546c789a1182995c1ca270ba
parent31dd3706cbb29fa61a901474f45cd9e0473f1f27 (diff)
downloadgstreamer-plugins-base-13b31e77c60b0367ef21ac96b88ae77882f282d8.tar.gz
audiotestsrc: Fix segment boundary checking for reverse playback
-rw-r--r--gst/audiotestsrc/gstaudiotestsrc.c16
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;