[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