segment: remove abs_rate from segment structure
authorWim Taymans <wim.taymans@collabora.co.uk>
Mon, 9 May 2011 14:39:13 +0000 (16:39 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 9 May 2011 14:39:13 +0000 (16:39 +0200)
Remove the abs_rate field from the segment structure, we can trivially compute
it when needed.

gst/gstsegment.c
gst/gstsegment.h
libs/gst/base/gstbasesink.c
plugins/elements/gstinputselector.c

index a70e8e6..f776ffa 100644 (file)
@@ -170,7 +170,6 @@ gst_segment_init (GstSegment * segment, GstFormat format)
   g_return_if_fail (segment != NULL);
 
   segment->rate = 1.0;
-  segment->abs_rate = 1.0;
   segment->applied_rate = 1.0;
   segment->format = format;
   segment->flags = 0;
@@ -372,7 +371,6 @@ gst_segment_set_seek (GstSegment * segment, gdouble rate,
     g_return_if_fail (start <= stop);
 
   segment->rate = rate;
-  segment->abs_rate = ABS (rate);
   segment->applied_rate = 1.0;
   segment->flags = flags;
   segment->start = start;
@@ -443,6 +441,7 @@ gst_segment_set_newsegment_full (GstSegment * segment, gboolean update,
     gint64 stop, gint64 time)
 {
   gint64 duration, last_stop;
+  gdouble abs_rate;
 
   g_return_if_fail (rate != 0.0);
   g_return_if_fail (applied_rate != 0.0);
@@ -516,15 +515,15 @@ gst_segment_set_newsegment_full (GstSegment * segment, gboolean update,
       last_stop = stop;
   }
   /* use previous rate to calculate duration */
-  if (G_LIKELY (segment->abs_rate != 1.0))
-    duration /= segment->abs_rate;
+  abs_rate = ABS (segment->rate);
+  if (G_LIKELY (abs_rate != 1.0))
+    duration /= abs_rate;
 
   /* accumulate duration */
   segment->accum += duration;
 
   /* then update the current segment */
   segment->rate = rate;
-  segment->abs_rate = ABS (rate);
   segment->applied_rate = applied_rate;
   segment->start = start;
   segment->last_stop = last_stop;
@@ -644,6 +643,7 @@ gst_segment_to_running_time (GstSegment * segment, GstFormat format,
 {
   gint64 result;
   gint64 start, stop, accum;
+  gdouble abs_rate;
 
   if (G_UNLIKELY (position == -1))
     return -1;
@@ -688,8 +688,9 @@ gst_segment_to_running_time (GstSegment * segment, GstFormat format,
 
   /* scale based on the rate, avoid division by and conversion to 
    * float when not needed */
-  if (G_UNLIKELY (segment->abs_rate != 1.0))
-    result /= segment->abs_rate;
+  abs_rate = ABS (segment->rate);
+  if (G_UNLIKELY (abs_rate != 1.0))
+    result /= abs_rate;
 
   /* correct for accumulated segments */
   result += accum;
@@ -790,6 +791,7 @@ gst_segment_to_position (GstSegment * segment, GstFormat format,
 {
   gint64 result;
   gint64 start, stop, accum;
+  gdouble abs_rate;
 
   g_return_val_if_fail (segment != NULL, -1);
 
@@ -819,8 +821,9 @@ gst_segment_to_position (GstSegment * segment, GstFormat format,
   result = running_time - accum;
 
   /* move into the segment at the right rate */
-  if (G_UNLIKELY (segment->abs_rate != 1.0))
-    result = ceil (result * segment->abs_rate);
+  abs_rate = ABS (segment->rate);
+  if (G_UNLIKELY (abs_rate != 1.0))
+    result = ceil (result * abs_rate);
 
   if (G_LIKELY (segment->rate > 0.0)) {
     /* bring to corrected position in segment */
index 37ab0b7..a1c4455 100644 (file)
@@ -35,7 +35,6 @@ typedef struct _GstSegment GstSegment;
 /**
  * GstSegment:
  * @rate: the rate of the segment
- * @abs_rate: absolute value of @rate
  * @format: the format of the segment values
  * @flags: flags for this segment
  * @start: the start of the segment
@@ -52,7 +51,6 @@ typedef struct _GstSegment GstSegment;
 struct _GstSegment {
   /*< public >*/
   gdouble        rate;
-  gdouble        abs_rate;
   gdouble        applied_rate;
   GstFormat      format;
   GstSeekFlags   flags;
index 00aaaec..34aac61 100644 (file)
@@ -1629,7 +1629,6 @@ start_stepping (GstBaseSink * sink, GstSegment * segment,
   /* set the new rate for the remainder of the segment */
   current->start_rate = segment->rate;
   segment->rate *= current->rate;
-  segment->abs_rate = ABS (segment->rate);
 
   /* save values */
   if (segment->rate > 0.0)
@@ -1717,7 +1716,6 @@ stop_stepping (GstBaseSink * sink, GstSegment * segment,
 
   /* restore the previous rate */
   segment->rate = current->start_rate;
-  segment->abs_rate = ABS (segment->rate);
 
   if (segment->rate > 0.0)
     segment->stop = current->start_stop;
@@ -1755,6 +1753,7 @@ handle_stepping (GstBaseSink * sink, GstSegment * segment,
     {
       guint64 end;
       gint64 first, last;
+      gdouble abs_rate;
 
       if (segment->rate > 0.0) {
         if (segment->stop == *cstop)
@@ -1773,8 +1772,9 @@ handle_stepping (GstBaseSink * sink, GstSegment * segment,
       end = current->start + current->amount;
       current->position = first - current->start;
 
-      if (G_UNLIKELY (segment->abs_rate != 1.0))
-        current->position /= segment->abs_rate;
+      abs_rate = ABS (segment->rate);
+      if (G_UNLIKELY (abs_rate != 1.0))
+        current->position /= abs_rate;
 
       GST_DEBUG_OBJECT (sink,
           "buffer: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
index c7ae19f..742c13e 100644 (file)
@@ -934,7 +934,8 @@ gst_segment_get_timestamp (GstSegment * segment, gint64 running_time)
   if (running_time <= segment->accum)
     return segment->start;
   else
-    return (running_time - segment->accum) * segment->abs_rate + segment->start;
+    return (running_time - segment->accum) * ABS (segment->rate) +
+        segment->start;
 }
 
 static void