interleave: convert the output segment to time
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 20 Jul 2012 13:18:46 +0000 (15:18 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 20 Jul 2012 14:09:33 +0000 (16:09 +0200)
Convert the stored input segment to time before pushing it out.

Conflicts:

gst/interleave/interleave.c

gst/interleave/interleave.c

index ab82668..63424ca 100644 (file)
@@ -831,11 +831,13 @@ gst_interleave_sink_event (GstCollectPads * pads, GstCollectData * data,
       gst_event_replace (&self->pending_segment, NULL);
       GST_OBJECT_UNLOCK (self);
       break;
-    case GST_EVENT_NEWSEGMENT:
+    case GST_EVENT_SEGMENT:
+    {
       GST_OBJECT_LOCK (self);
       gst_event_replace (&self->pending_segment, event);
       GST_OBJECT_UNLOCK (self);
       break;
+    }
     case GST_EVENT_CAPS:
     {
       GstCaps *caps;
@@ -1243,11 +1245,48 @@ gst_interleave_collected (GstCollectPads * pads, GstInterleave * self)
   GST_OBJECT_LOCK (self);
   if (self->pending_segment) {
     GstEvent *event;
+    GstSegment segment;
 
     event = self->pending_segment;
     self->pending_segment = NULL;
     GST_OBJECT_UNLOCK (self);
 
+    /* convert the input segment to time now */
+    gst_event_copy_segment (event, &segment);
+
+    if (segment.format != GST_FORMAT_TIME) {
+      gst_event_unref (event);
+
+      /* not time, convert */
+      switch (segment.format) {
+        case GST_FORMAT_BYTES:
+          segment.start *= width;
+          if (segment.stop != -1)
+            segment.stop *= width;
+          if (segment.position != -1)
+            segment.position *= width;
+          /* fallthrough for the samples case */
+        case GST_FORMAT_DEFAULT:
+          segment.start =
+              gst_util_uint64_scale_int (segment.start, GST_SECOND, self->rate);
+          if (segment.stop != -1)
+            segment.stop =
+                gst_util_uint64_scale_int (segment.stop, GST_SECOND,
+                self->rate);
+          if (segment.position != -1)
+            segment.position =
+                gst_util_uint64_scale_int (segment.position, GST_SECOND,
+                self->rate);
+          break;
+        default:
+          GST_WARNING ("can't convert segment values");
+          segment.start = 0;
+          segment.stop = -1;
+          segment.position = 0;
+          break;
+      }
+      event = gst_event_new_segment (&segment);
+    }
     gst_pad_push_event (self->src, event);
 
     GST_OBJECT_LOCK (self);