Do not use GST_SCHEDULING_FLAG_SEEKABLE in TV Profile
[platform/upstream/gstreamer.git] / gst / gstsegment.c
index 7cecf68..2594d53 100644 (file)
@@ -398,7 +398,7 @@ guint64
 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 */
@@ -426,30 +426,32 @@ gst_segment_to_stream_time (const GstSegment * segment, GstFormat format,
   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;
 }
 
 /**
@@ -830,3 +832,43 @@ gst_segment_offset_running_time (GstSegment * segment, GstFormat format,
   }
   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;
+}