diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-06-04 12:48:51 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-06-04 12:53:20 +0200 |
commit | 0e74bfe2487f24feded522ee11ce6b3405ad8b94 (patch) | |
tree | 7b89b93ed034f0a418314d9a282a44f94b755c5c | |
parent | fef7c3f2ff15314572e87d4f92894a190bbc3193 (diff) |
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()
-rw-r--r-- | docs/gst/gstreamer-sections.txt | 1 | ||||
-rw-r--r-- | gst/gstsegment.c | 58 | ||||
-rw-r--r-- | gst/gstsegment.h | 3 | ||||
-rw-r--r-- | tests/check/gst/gstsegment.c | 1 | ||||
-rw-r--r-- | win32/common/libgstreamer.def | 1 |
5 files changed, 63 insertions, 1 deletions
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index 448eff73d4..925cb34439 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 <SUBSECTION Standard> GST_TYPE_SEGMENT gst_segment_get_type diff --git a/gst/gstsegment.c b/gst/gstsegment.c index 88601bf127..5ecb2e8e42 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 6f66c06a90..a0c3683202 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 8e489d495d..2ac8423393 100644 --- a/tests/check/gst/gstsegment.c +++ b/tests/check/gst/gstsegment.c @@ -1,5 +1,6 @@ /* GStreamer * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com> + * 2009 Wim Taymans <wim.taymans@gmail.com> * * gstsegment.c: Unit test for segments * diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index 55a41e276d..ac0c3b8945 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 |