gstsegment: Actually start==stop==segment_start is inside the segment
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 11 Aug 2009 11:21:35 +0000 (13:21 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Tue, 11 Aug 2009 11:21:35 +0000 (13:21 +0200)
Still the old code was wrong as it claimed that start==stop<segment_start
would be inside the segment and returned insane clipping differences.

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

index 25d92a7..c1527c0 100644 (file)
@@ -737,8 +737,11 @@ gst_segment_clip (GstSegment * segment, GstFormat format, gint64 start,
     return FALSE;
 
   /* if a stop position is given and is before the segment start,
-   * we're outside of the segment */
-  if (G_UNLIKELY (stop != -1 && stop <= segment->start))
+   * we're outside of the segment. Special case is were start
+   * and stop are equal to the segment start. In that case we
+   * are inside the segment. */
+  if (G_UNLIKELY (stop != -1 && (stop < segment->start || (start != stop
+                  && stop == segment->start))))
     return FALSE;
 
   if (clip_start) {
index ec37065..2c7b42b 100644 (file)
@@ -73,10 +73,16 @@ GST_START_TEST (segment_seek_nosize)
   fail_unless (cstart == 100);
   fail_unless (cstop == 150);
 
-  /* special case, 0 duration and touching lower bound */
+  /* special case, 0 duration and outside segment */
+  res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 90, 90, &cstart, &cstop);
+  fail_unless (res == FALSE);
+
+  /* special case, 0 duration and touching lower bound, i.e. inside segment */
   res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
       100, 100, &cstart, &cstop);
-  fail_unless (res == FALSE);
+  fail_unless (res == TRUE);
+  fail_unless (cstart == 100);
+  fail_unless (cstop == 100);
 
   /* special case, 0 duration and inside the segment */
   res = gst_segment_clip (&segment, GST_FORMAT_BYTES,