Remove the abs_rate field from the segment structure, we can trivially compute
it when needed.
g_return_if_fail (segment != NULL);
segment->rate = 1.0;
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;
segment->applied_rate = 1.0;
segment->format = format;
segment->flags = 0;
g_return_if_fail (start <= stop);
segment->rate = 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;
segment->applied_rate = 1.0;
segment->flags = flags;
segment->start = start;
gint64 stop, gint64 time)
{
gint64 duration, last_stop;
gint64 stop, gint64 time)
{
gint64 duration, last_stop;
g_return_if_fail (rate != 0.0);
g_return_if_fail (applied_rate != 0.0);
g_return_if_fail (rate != 0.0);
g_return_if_fail (applied_rate != 0.0);
last_stop = stop;
}
/* use previous rate to calculate duration */
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;
/* 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;
segment->applied_rate = applied_rate;
segment->start = start;
segment->last_stop = last_stop;
{
gint64 result;
gint64 start, stop, accum;
{
gint64 result;
gint64 start, stop, accum;
if (G_UNLIKELY (position == -1))
return -1;
if (G_UNLIKELY (position == -1))
return -1;
/* scale based on the rate, avoid division by and conversion to
* float when not needed */
/* 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;
/* correct for accumulated segments */
result += accum;
{
gint64 result;
gint64 start, stop, accum;
{
gint64 result;
gint64 start, stop, accum;
g_return_val_if_fail (segment != NULL, -1);
g_return_val_if_fail (segment != NULL, -1);
result = running_time - accum;
/* move into the segment at the right rate */
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 */
if (G_LIKELY (segment->rate > 0.0)) {
/* bring to corrected position in segment */
/**
* GstSegment:
* @rate: the rate of the segment
/**
* 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
* @format: the format of the segment values
* @flags: flags for this segment
* @start: the start of the segment
struct _GstSegment {
/*< public >*/
gdouble rate;
struct _GstSegment {
/*< public >*/
gdouble rate;
gdouble applied_rate;
GstFormat format;
GstSeekFlags flags;
gdouble applied_rate;
GstFormat format;
GstSeekFlags flags;
/* set the new rate for the remainder of the segment */
current->start_rate = segment->rate;
segment->rate *= current->rate;
/* 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)
/* save values */
if (segment->rate > 0.0)
/* restore the previous rate */
segment->rate = current->start_rate;
/* 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;
if (segment->rate > 0.0)
segment->stop = current->start_stop;
{
guint64 end;
gint64 first, last;
{
guint64 end;
gint64 first, last;
if (segment->rate > 0.0) {
if (segment->stop == *cstop)
if (segment->rate > 0.0) {
if (segment->stop == *cstop)
end = current->start + current->amount;
current->position = first - current->start;
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,
GST_DEBUG_OBJECT (sink,
"buffer: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
if (running_time <= segment->accum)
return segment->start;
else
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;