decodebin3: Store stream-start event on output pad before exposing it
authorSeungha Yang <seungha@centricular.com>
Mon, 19 Oct 2020 11:03:40 +0000 (20:03 +0900)
committerSeungha Yang <seungha@centricular.com>
Mon, 19 Oct 2020 11:28:06 +0000 (20:28 +0900)
It's required for users to be able to figure out associated GstStream
object with a pad on pad-added callback.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/880>

gst/playback/gstdecodebin3.c
gst/playback/gsturidecodebin3.c

index 1ab9544..968a634 100644 (file)
@@ -2262,6 +2262,20 @@ reconfigure_output_stream (DecodebinOutputStream * output,
     goto cleanup;
   }
   if (output->src_exposed == FALSE) {
+    GstEvent *stream_start;
+
+    stream_start = gst_pad_get_sticky_event (slot->src_pad,
+        GST_EVENT_STREAM_START, 0);
+
+    /* Ensure GstStream is accesiable from pad-added callback */
+    if (stream_start) {
+      gst_pad_store_sticky_event (output->src_pad, stream_start);
+      gst_event_unref (stream_start);
+    } else {
+      GST_WARNING_OBJECT (slot->src_pad,
+          "Pad has no stored stream-start event");
+    }
+
     output->src_exposed = TRUE;
     gst_element_add_pad (GST_ELEMENT_CAST (dbin), output->src_pad);
   }
index fcfdbf4..295ba45 100644 (file)
@@ -541,6 +541,7 @@ add_output_pad (GstURIDecodeBin3 * dec, GstPad * target_pad)
 {
   OutputPad *output;
   gchar *pad_name;
+  GstEvent *stream_start;
 
   output = g_slice_new0 (OutputPad);
 
@@ -554,6 +555,17 @@ add_output_pad (GstURIDecodeBin3 * dec, GstPad * target_pad)
   g_free (pad_name);
 
   gst_pad_set_active (output->ghost_pad, TRUE);
+
+  stream_start = gst_pad_get_sticky_event (target_pad,
+      GST_EVENT_STREAM_START, 0);
+  if (stream_start) {
+    gst_pad_store_sticky_event (output->ghost_pad, stream_start);
+    gst_event_unref (stream_start);
+  } else {
+    GST_WARNING_OBJECT (target_pad,
+        "Exposing pad without stored stream-start event");
+  }
+
   gst_element_add_pad (GST_ELEMENT (dec), output->ghost_pad);
 
   output->probe_id =