void InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged() { GRefPtr<GstEvent> event = adoptGRef(gst_pad_get_sticky_event(m_pad.get(), GST_EVENT_STREAM_START, 0)); if (!event) return; const gchar* streamId; gst_event_parse_stream_start(event.get(), &streamId); INFO_MEDIA_MESSAGE("Track %d got stream start for stream %s.", m_index, streamId); m_streamId = streamId; }
static gboolean gst_streamid_demux_event (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean res = TRUE; GstStreamidDemux *demux; const gchar *stream_id = NULL; GstPad *active_srcpad = NULL; demux = GST_STREAMID_DEMUX (parent); GST_DEBUG_OBJECT (demux, "event = %s, sticky = %d", GST_EVENT_TYPE_NAME (event), GST_EVENT_IS_STICKY (event)); if (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START) { gst_event_parse_stream_start (event, &stream_id); if (!stream_id) goto no_stream_id; GST_OBJECT_LOCK (demux); active_srcpad = gst_streamid_demux_get_srcpad_by_stream_id (demux, stream_id); if (!active_srcpad) { /* try to generate a srcpad */ if (gst_streamid_demux_srcpad_create (demux, pad, stream_id)) { GST_OBJECT_UNLOCK (demux); gst_pad_set_active (demux->active_srcpad, TRUE); /* Forward sticky events to the new srcpad */ gst_pad_sticky_events_foreach (demux->sinkpad, forward_sticky_events, demux->active_srcpad); gst_element_add_pad (GST_ELEMENT_CAST (demux), demux->active_srcpad); } else { GST_OBJECT_UNLOCK (demux); goto fail_create_srcpad; } } else if (demux->active_srcpad != active_srcpad) { demux->active_srcpad = active_srcpad; GST_OBJECT_UNLOCK (demux); g_object_notify (G_OBJECT (demux), "active-pad"); } else GST_OBJECT_UNLOCK (demux); } if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_START || GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP || GST_EVENT_TYPE (event) == GST_EVENT_EOS) { res = gst_pad_event_default (pad, parent, event); } else if (demux->active_srcpad) { GstPad *srcpad = NULL; GST_OBJECT_LOCK (demux); srcpad = gst_object_ref (demux->active_srcpad); GST_OBJECT_UNLOCK (demux); res = gst_pad_push_event (srcpad, event); gst_object_unref (srcpad); } else { gst_event_unref (event); } return res; /* ERRORS */ no_stream_id: { GST_ELEMENT_ERROR (demux, STREAM, DEMUX, ("Error occurred trying to get stream-id to create a srcpad"), ("no stream-id found at %s", GST_EVENT_TYPE_NAME (event))); gst_event_unref (event); return FALSE; } fail_create_srcpad: { GST_ELEMENT_ERROR (demux, STREAM, FAILED, ("Error occurred trying to create a srcpad"), ("Failed to create a srcpad via stream-id:%s", stream_id)); gst_event_unref (event); return FALSE; } }
static void gst_srtp_dec_push_early_events (GstSrtpDec * filter, GstPad * pad, GstPad * otherpad, gboolean is_rtcp) { GstEvent *otherev, *ev; ev = gst_pad_get_sticky_event (pad, GST_EVENT_STREAM_START, 0); if (ev) { gst_event_unref (ev); } else { gchar *new_stream_id; otherev = gst_pad_get_sticky_event (otherpad, GST_EVENT_STREAM_START, 0); if (otherev) { const gchar *other_stream_id; gst_event_parse_stream_start (otherev, &other_stream_id); new_stream_id = g_strdup_printf ("%s/%s", other_stream_id, is_rtcp ? "rtcp" : "rtp"); gst_event_unref (otherev); } else { new_stream_id = gst_pad_create_stream_id (pad, GST_ELEMENT (filter), is_rtcp ? "rtcp" : "rtp"); } ev = gst_event_new_stream_start (new_stream_id); g_free (new_stream_id); gst_pad_push_event (pad, ev); } ev = gst_pad_get_sticky_event (pad, GST_EVENT_CAPS, 0); if (ev) { gst_event_unref (ev); } else { GstCaps *caps; if (is_rtcp) caps = gst_caps_new_empty_simple ("application/x-rtcp"); else caps = gst_caps_new_empty_simple ("application/x-rtp"); gst_pad_set_caps (pad, caps); gst_caps_unref (caps); } ev = gst_pad_get_sticky_event (pad, GST_EVENT_SEGMENT, 0); if (ev) { gst_event_unref (ev); } else { ev = gst_pad_get_sticky_event (otherpad, GST_EVENT_SEGMENT, 0); if (ev) gst_pad_push_event (pad, ev); } if (is_rtcp) filter->rtcp_has_segment = TRUE; else filter->rtp_has_segment = TRUE; }