autoconvert: Cache incoming new segment events and push to children.
authorJan Schmidt <thaytan@noraisin.net>
Sat, 24 Oct 2009 10:18:59 +0000 (11:18 +0100)
committerJan Schmidt <thaytan@noraisin.net>
Tue, 27 Oct 2009 12:23:24 +0000 (12:23 +0000)
Cache incoming new-segment info.

When installing a child element, inform it of the current segment info.

https://bugzilla.gnome.org/show_bug.cgi?id=599469

gst/autoconvert/gstautoconvert.c
gst/autoconvert/gstautoconvert.h

index 7e81c5750e2e90ec255bc287cc97e62e5c2dfb5f..d680af13dffb39bc12e82382005cda24cf3bd83a 100644 (file)
@@ -227,6 +227,8 @@ gst_auto_convert_init (GstAutoConvert * autoconvert,
 
   gst_element_add_pad (GST_ELEMENT (autoconvert), autoconvert->sinkpad);
   gst_element_add_pad (GST_ELEMENT (autoconvert), autoconvert->srcpad);
+
+  gst_segment_init (&autoconvert->sink_segment, GST_FORMAT_UNDEFINED);
 }
 
 static void
@@ -801,6 +803,19 @@ gst_auto_convert_sink_setcaps (GstPad * pad, GstCaps * caps)
     autoconvert->current_internal_sinkpad = internal_sinkpad;
     GST_AUTOCONVERT_UNLOCK (autoconvert);
 
+    /* Send new-segment event if we have one */
+    if (autoconvert->sink_segment.format != GST_FORMAT_UNDEFINED) {
+      GstEvent *event;
+      GstSegment *seg = &autoconvert->sink_segment;
+      event = gst_event_new_new_segment_full (TRUE,
+          seg->rate, seg->applied_rate, seg->format, seg->start,
+          seg->stop, seg->time);
+
+      autoconvert->drop_newseg = TRUE;
+      gst_pad_push_event (internal_srcpad, event);
+      autoconvert->drop_newseg = FALSE;
+    }
+
     GST_INFO_OBJECT (autoconvert,
         "Selected element %s",
         GST_OBJECT_NAME (GST_OBJECT (autoconvert->current_subelement)));
@@ -988,6 +1003,26 @@ gst_auto_convert_sink_event (GstPad * pad, GstEvent * event)
   GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
   GstPad *internal_srcpad;
 
+  if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
+    GstFormat format;
+    gdouble rate, arate;
+    gint64 start, stop, time;
+    gboolean update;
+
+    gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
+        &start, &stop, &time);
+
+    GST_DEBUG_OBJECT (autoconvert,
+        "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT
+        ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT,
+        update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
+        GST_TIME_ARGS (time));
+
+    /* Store the values for feeding to sub-elements */
+    gst_segment_set_newsegment_full (&autoconvert->sink_segment, update,
+        rate, arate, format, start, stop, time);
+  }
+
   internal_srcpad = gst_auto_convert_get_internal_srcpad (autoconvert);
   if (internal_srcpad) {
     ret = gst_pad_push_event (internal_srcpad, event);
@@ -1323,6 +1358,14 @@ gst_auto_convert_internal_sink_event (GstPad * pad, GstEvent * event)
       GST_AUTO_CONVERT (g_object_get_qdata (G_OBJECT (pad),
           parent_quark));
 
+  if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
+    if (autoconvert->drop_newseg) {
+      GST_DEBUG_OBJECT (autoconvert, "Dropping primer newsegment event");
+      gst_event_unref (event);
+      return TRUE;
+    }
+  }
+
   return gst_pad_push_event (autoconvert->srcpad, event);
 }
 
index af463f4b42ec173fbb716895618e155ae516aca7..37b717624700d0a05fa06f8f37b2559b1f737555 100644 (file)
@@ -54,6 +54,8 @@ struct _GstAutoConvert
   GstPad *current_internal_sinkpad;
 
   GList *cached_events;
+  GstSegment sink_segment;
+  gboolean drop_newseg;
 };
 
 struct _GstAutoConvertClass