summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2018-09-20 23:17:52 +1000
committerJan Schmidt <jan@centricular.com>2018-10-29 04:03:56 +1100
commit80015d69a778333166f1d45de7341019e2180557 (patch)
tree7b77ac147b168c51ee8f7848dd52ed6527757325
parent5d115a5d64683bc1e0632efbe90ed1c39f5999bd (diff)
downloadgstreamer-80015d69a778333166f1d45de7341019e2180557.tar.gz
segment: Allow stop == -1 in gst_segment_to_running_time() and rate < 0
If a segment has stop == -1, then gst_segment_to_running_time() would refuse to calculate a running time for negative rates, but gst_segment_do_seek() allows this scenario and uses a valid duration for calculations. Make the 2 functions consistent by using any configured duration to calculate a running time too in that case. https://bugzilla.gnome.org/show_bug.cgi?id=796559
-rw-r--r--gst/gstsegment.c3
-rw-r--r--tests/check/gst/gstsegment.c15
2 files changed, 18 insertions, 0 deletions
diff --git a/gst/gstsegment.c b/gst/gstsegment.c
index 6aa1ce228e..958b39f737 100644
--- a/gst/gstsegment.c
+++ b/gst/gstsegment.c
@@ -758,6 +758,9 @@ gst_segment_to_running_time_full (const GstSegment * segment, GstFormat format,
} else {
stop = segment->stop;
+ if (stop == -1 && segment->duration != -1)
+ stop = segment->start + segment->duration;
+
/* cannot continue if no stop position set or invalid offset */
g_return_val_if_fail (stop != -1, 0);
g_return_val_if_fail (stop >= offset, 0);
diff --git a/tests/check/gst/gstsegment.c b/tests/check/gst/gstsegment.c
index 751469d765..ac46b7d52a 100644
--- a/tests/check/gst/gstsegment.c
+++ b/tests/check/gst/gstsegment.c
@@ -977,6 +977,21 @@ GST_START_TEST (segment_full)
fail_unless (gst_segment_position_from_running_time_full (&segment,
GST_FORMAT_TIME, 75, &pos) == -1);
fail_unless (pos == 300); /* Actually -300 */
+
+ /* Test for running time conversion with stop == -1, where
+ * calculations should use the duration instead */
+ segment.rate = -2.0;
+ segment.start = 100;
+ segment.offset = 0;
+ segment.stop = -1;
+ segment.duration = 200;
+ segment.position = 40;
+ segment.base = 100;
+ segment.time = 10000;
+
+ fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
+ 150, &rt) == 1);
+ fail_unless (rt == 175);
}
GST_END_TEST;