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;
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;
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);
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;
{
gint64 result;
gint64 start, stop, accum;
+ gdouble abs_rate;
if (G_UNLIKELY (position == -1))
return -1;
/* 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;
{
gint64 result;
gint64 start, stop, accum;
+ gdouble abs_rate;
g_return_val_if_fail (segment != NULL, -1);
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 */
/* 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)
/* 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;
{
guint64 end;
gint64 first, last;
+ gdouble abs_rate;
if (segment->rate > 0.0) {
if (segment->stop == *cstop)
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,