From d63829fc9a700b557ad67ebf60c284f3416b4fc2 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 9 May 2011 16:39:13 +0200 Subject: [PATCH] segment: remove abs_rate from segment structure Remove the abs_rate field from the segment structure, we can trivially compute it when needed. --- gst/gstsegment.c | 21 ++++++++++++--------- gst/gstsegment.h | 2 -- libs/gst/base/gstbasesink.c | 8 ++++---- plugins/elements/gstinputselector.c | 3 ++- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/gst/gstsegment.c b/gst/gstsegment.c index a70e8e6..f776ffa 100644 --- a/gst/gstsegment.c +++ b/gst/gstsegment.c @@ -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 */ diff --git a/gst/gstsegment.h b/gst/gstsegment.h index 37ab0b7..a1c4455 100644 --- a/gst/gstsegment.h +++ b/gst/gstsegment.h @@ -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; diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 00aaaec..34aac61 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -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, diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index c7ae19f..742c13e 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -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 -- 2.7.4