From 0e74bfe2487f24feded522ee11ce6b3405ad8b94 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 4 Jun 2009 12:48:51 +0200 Subject: [PATCH] segment: add gst_segment_set_running_time Added new method for closing the segment to a specific running time. API: GstSegment::gst_segment_set_running_time() --- docs/gst/gstreamer-sections.txt | 1 + gst/gstsegment.c | 58 ++++++++++++++++++++++++++++++++++++++++- gst/gstsegment.h | 3 +++ tests/check/gst/gstsegment.c | 1 + win32/common/libgstreamer.def | 1 + 5 files changed, 63 insertions(+), 1 deletion(-) diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index 448eff7..925cb34 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -1985,6 +1985,7 @@ gst_segment_set_seek gst_segment_to_running_time gst_segment_to_stream_time gst_segment_to_position +gst_segment_set_running_time GST_TYPE_SEGMENT gst_segment_get_type diff --git a/gst/gstsegment.c b/gst/gstsegment.c index 88601bf..5ecb2e8 100644 --- a/gst/gstsegment.c +++ b/gst/gstsegment.c @@ -771,7 +771,8 @@ gst_segment_clip (GstSegment * segment, GstFormat format, gint64 start, * Convert @running_time into a position in the segment so that * gst_segment_to_running_time() with that position returns @running_time. * - * Returns: the position in the segment for @running_time. + * Returns: the position in the segment for @running_time. This function returns + * -1 when @running_time is -1 or when it is not inside @segment. * * Since: 0.10.24 */ @@ -831,3 +832,58 @@ gst_segment_to_position (GstSegment * segment, GstFormat format, } return result; } + + +/** + * gst_segment_set_running_time: + * @segment: a #GstSegment structure. + * @format: the format of the segment. + * @running_time: the running_time in the segment + * + * Adjust the start/stop and accum values of @segment such that the next valid + * buffer will be one with @running_time. + * + * Returns: %TRUE if the segment could be updated successfully. If %FALSE is + * returned, @running_time is -1 or not in @segment. + * + * Since: 0.10.24 + */ +gboolean +gst_segment_set_running_time (GstSegment * segment, GstFormat format, + gint64 running_time) +{ + gint64 position; + gint64 start, stop, last_stop; + + /* start by bringing the running_time into the segment position */ + position = gst_segment_to_position (segment, format, running_time); + + /* we must have a valid position now */ + if (G_UNLIKELY (position == -1)) + return FALSE; + + start = segment->start; + stop = segment->stop; + last_stop = segment->last_stop; + + if (G_LIKELY (segment->rate > 0.0)) { + /* update the start/last_stop and time values */ + start = position; + if (last_stop < start) + last_stop = start; + } else { + /* reverse, update stop */ + stop = position; + /* if we were past the position, go back */ + if (last_stop > stop) + last_stop = stop; + } + /* and accumulated time is exactly the running time */ + segment->time = gst_segment_to_stream_time (segment, format, start); + segment->start = start; + segment->stop = stop; + segment->last_stop = last_stop; + segment->accum = running_time; + + return TRUE; +} diff --git a/gst/gstsegment.h b/gst/gstsegment.h index 6f66c06..a0c3683 100644 --- a/gst/gstsegment.h +++ b/gst/gstsegment.h @@ -101,6 +101,9 @@ gint64 gst_segment_to_position (GstSegment *segment, GstFormat for gboolean gst_segment_clip (GstSegment *segment, GstFormat format, gint64 start, gint64 stop, gint64 *clip_start, gint64 *clip_stop); +gboolean gst_segment_set_running_time (GstSegment *segment, GstFormat format, gint64 running_time); + + G_END_DECLS #endif /* __GST_SEGMENT_H__ */ diff --git a/tests/check/gst/gstsegment.c b/tests/check/gst/gstsegment.c index 8e489d4..2ac8423 100644 --- a/tests/check/gst/gstsegment.c +++ b/tests/check/gst/gstsegment.c @@ -1,5 +1,6 @@ /* GStreamer * Copyright (C) 2005 Jan Schmidt + * 2009 Wim Taymans * * gstsegment.c: Unit test for segments * diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index 55a41e2..ac0c3b8 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -835,6 +835,7 @@ EXPORTS gst_segment_set_last_stop gst_segment_set_newsegment gst_segment_set_newsegment_full + gst_segment_set_running_time gst_segment_set_seek gst_segment_to_position gst_segment_to_running_time -- 2.7.4