gst_segment_to_stream_time (const GstSegment * segment, GstFormat format,
guint64 position)
{
- guint64 result, start, stop, time;
+ guint64 stream_time, start, stop, time;
gdouble abs_applied_rate;
/* format does not matter for -1 */
if (G_UNLIKELY (time == -1))
return -1;
- /* bring to uncorrected position in segment */
- result = position - start;
-
abs_applied_rate = ABS (segment->applied_rate);
- /* correct for applied rate if needed */
- if (G_UNLIKELY (abs_applied_rate != 1.0))
- result *= 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 */
- result += 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 > result))
- result = time - result;
- else
- result = 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 result;
+ return stream_time;
}
/**
}
return TRUE;
}
+
+/**
+ * gst_segment_is_equal:
+ * @s0: a #GstSegment structure.
+ * @s1: a #GstSegment structure.
+ *
+ * Checks for two segments being equal. Equality here is defined
+ * as perfect equality, including floating point values.
+ *
+ * Since: 1.6
+ *
+ * Returns: %TRUE if the segments are equal, %FALSE otherwise.
+ */
+gboolean
+gst_segment_is_equal (const GstSegment * s0, const GstSegment * s1)
+{
+ if (s0->flags != s1->flags)
+ return FALSE;
+ if (s0->rate != s1->rate)
+ return FALSE;
+ if (s0->applied_rate != s1->applied_rate)
+ return FALSE;
+ if (s0->format != s1->format)
+ return FALSE;
+ if (s0->base != s1->base)
+ return FALSE;
+ if (s0->offset != s1->offset)
+ return FALSE;
+ if (s0->start != s1->start)
+ return FALSE;
+ if (s0->stop != s1->stop)
+ return FALSE;
+ if (s0->time != s1->time)
+ return FALSE;
+ if (s0->position != s1->position)
+ return FALSE;
+ if (s0->duration != s1->duration)
+ return FALSE;
+ return TRUE;
+}