segment: Allow stop == -1 in gst_segment_to_running_time() and rate < 0
authorJan Schmidt <jan@centricular.com>
Thu, 20 Sep 2018 13:17:52 +0000 (23:17 +1000)
committerJan Schmidt <jan@centricular.com>
Sun, 28 Oct 2018 17:03:56 +0000 (04:03 +1100)
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

gst/gstsegment.c
tests/check/gst/gstsegment.c

index 6aa1ce2..958b39f 100644 (file)
@@ -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);
index 751469d..ac46b7d 100644 (file)
@@ -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;