if (G_UNLIKELY (time == -1))
return -1;
- /* bring to uncorrected position in segment */
- stream_time = position - start;
-
abs_applied_rate = ABS (segment->applied_rate);
- /* correct for applied rate if needed */
- if (G_UNLIKELY (abs_applied_rate != 1.0))
- stream_time *= abs_applied_rate;
-
/* add or subtract from segment time based on applied rate */
if (G_LIKELY (segment->applied_rate > 0.0)) {
+ if (G_UNLIKELY (position < start))
+ return -1;
+ /* bring to uncorrected position in segment */
+ stream_time = position - start;
+ /* correct for applied rate if needed */
+ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ stream_time *= abs_applied_rate;
/* correct for segment time */
stream_time += time;
} else {
/* correct for segment time, clamp at 0. Streams with a negative
* applied_rate have timestamps between start and stop, as usual, but have
* the time member starting high and going backwards. */
- if (G_LIKELY (time > stream_time))
- stream_time = time - stream_time;
- else
- stream_time = 0;
+ if (G_UNLIKELY (position > stop))
+ return -1;
+ stream_time = stop - position;
+ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ stream_time *= abs_applied_rate;
+ stream_time += time;
}
return stream_time;