segment: add gst_segment_set_running_time
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 4 Jun 2009 10:48:51 +0000 (12:48 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 4 Jun 2009 10:53:20 +0000 (12:53 +0200)
Added new method for closing the segment to a specific running time.

API: GstSegment::gst_segment_set_running_time()

docs/gst/gstreamer-sections.txt
gst/gstsegment.c
gst/gstsegment.h
tests/check/gst/gstsegment.c
win32/common/libgstreamer.def

index 448eff7..925cb34 100644 (file)
@@ -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
index 88601bf..5ecb2e8 100644 (file)
@@ -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;
+}
index 6f66c06..a0c3683 100644 (file)
@@ -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__ */
index 8e489d4..2ac8423 100644 (file)
@@ -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
  *
index 55a41e2..ac0c3b8 100644 (file)
@@ -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