From 82cc4877761d3bbb64d3b880c9c88d7b8a5958d2 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 17 May 2011 17:51:58 +0200 Subject: [PATCH] segment: handle wraparound better Now that we use unsigned values for the segment, handle wraparound when seeking better. --- gst/gstsegment.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/gst/gstsegment.c b/gst/gstsegment.c index 32eacdd..788652f 100644 --- a/gst/gstsegment.c +++ b/gst/gstsegment.c @@ -265,12 +265,17 @@ gst_segment_do_seek (GstSegment * segment, gdouble rate, /* start holds desired position, map -1 to the start */ if (start == -1) start = 0; - /* start must be 0 or the formats must match */ break; case GST_SEEK_TYPE_CUR: + { + gint64 sstart = (gint64) start; /* add start to currently configured segment */ - start = segment->start + start; + if (sstart > 0 || segment->start > -sstart) + start = segment->start + start; + else + start = 0; break; + } case GST_SEEK_TYPE_END: if (segment->duration != -1) { /* add start to total length */ @@ -284,7 +289,7 @@ gst_segment_do_seek (GstSegment * segment, gdouble rate, } /* bring in sane range */ if (segment->duration != -1) - start = CLAMP (start, 0, segment->duration); + start = MIN (start, segment->duration); else start = MAX (start, 0); @@ -295,19 +300,20 @@ gst_segment_do_seek (GstSegment * segment, gdouble rate, update_stop = FALSE; break; case GST_SEEK_TYPE_SET: - /* stop holds required value, if it's not -1, it must be of the same - * format as the segment. */ + /* stop holds required value */ break; case GST_SEEK_TYPE_CUR: if (segment->stop != -1) { - /* only add compatible formats or 0 */ - stop = segment->stop + stop; + gint64 sstop = (gint64) stop; + if (sstop > 0 || segment->stop > -sstop) + stop = segment->stop + stop; + else + stop = 0; } else stop = -1; break; case GST_SEEK_TYPE_END: if (segment->duration != -1) { - /* only add compatible formats or 0 */ stop = segment->duration + stop; } else { stop = segment->stop; -- 2.7.4