[gst-cvs] gstreamer: segment: add gst_segment_set_running_time
Wim Taymans
wtay at kemper.freedesktop.org
Thu Jun 4 03:53:38 PDT 2009
Module: gstreamer
Branch: master
Commit: 0e74bfe2487f24feded522ee11ce6b3405ad8b94
URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=0e74bfe2487f24feded522ee11ce6b3405ad8b94
Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date: Thu Jun 4 12:48:51 2009 +0200
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 deletions(-)
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
<SUBSECTION Standard>
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 <thaytan at mad.scientist.com>
+ * 2009 Wim Taymans <wim.taymans at gmail.com>
*
* 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
More information about the Gstreamer-commits
mailing list