static void kms_base_rtp_session_add_bundle_connection (KmsBaseRtpSession * self, KmsIRtpConnection * conn, SdpMediaConfig * mconf, gboolean active) { gboolean added; GstElement *ssrcdemux; GstElement *rtcpdemux; /* FIXME: Useful for local and remote ssrcs mapping */ GstPad *src, *sink; if (GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (conn), bundle_conn_added_quark ()))) { GST_DEBUG_OBJECT (self, "Connection configured"); return; } g_object_set_qdata (G_OBJECT (conn), bundle_conn_added_quark (), GUINT_TO_POINTER (TRUE)); g_object_get (conn, "added", &added, NULL); if (!added) { kms_i_rtp_connection_add (conn, GST_BIN (self), active); } ssrcdemux = gst_element_factory_make ("rtpssrcdemux", NULL); rtcpdemux = gst_element_factory_make ("rtcpdemux", NULL); g_object_set_qdata_full (G_OBJECT (ssrcdemux), rtcp_demux_peer_quark (), g_object_ref (rtcpdemux), g_object_unref); g_signal_connect (ssrcdemux, "new-ssrc-pad", G_CALLBACK (rtp_ssrc_demux_new_ssrc_pad), self); kms_i_rtp_connection_sink_sync_state_with_parent (conn); gst_bin_add_many (GST_BIN (self), ssrcdemux, rtcpdemux, NULL); /* RTP */ src = kms_i_rtp_connection_request_rtp_src (conn); sink = gst_element_get_static_pad (ssrcdemux, "sink"); kms_base_rtp_session_link_pads (src, sink); g_object_unref (src); g_object_unref (sink); /* RTCP */ src = kms_i_rtp_connection_request_rtcp_src (conn); sink = gst_element_get_static_pad (rtcpdemux, "sink"); kms_base_rtp_session_link_pads (src, sink); g_object_unref (src); g_object_unref (sink); gst_element_link_pads (rtcpdemux, "rtcp_src", ssrcdemux, "rtcp_sink"); gst_element_sync_state_with_parent_target_state (ssrcdemux); gst_element_sync_state_with_parent_target_state (rtcpdemux); kms_i_rtp_connection_src_sync_state_with_parent (conn); }
static void rtp_ssrc_demux_new_ssrc_pad (GstElement * ssrcdemux, guint ssrc, GstPad * pad, KmsBaseRtpSession * self) { const gchar *rtp_pad_name = GST_OBJECT_NAME (pad); gchar *rtcp_pad_name; SdpMediaConfig *mconf; GstPad *src, *sink; GST_DEBUG_OBJECT (self, "pad: %" GST_PTR_FORMAT " ssrc: %" G_GUINT32_FORMAT, pad, ssrc); KMS_SDP_SESSION_LOCK (self); if (self->remote_audio_ssrc == ssrc || ssrcs_are_mapped (ssrcdemux, self->local_audio_ssrc, ssrc)) { mconf = self->audio_neg_mconf; } else if (self->remote_video_ssrc == ssrc || ssrcs_are_mapped (ssrcdemux, self->local_video_ssrc, ssrc)) { mconf = self->video_neg_mconf; } else { if (!kms_i_rtp_session_manager_custom_ssrc_management (self->manager, self, ssrcdemux, ssrc, pad)) { GST_ERROR_OBJECT (pad, "SSRC %" G_GUINT32_FORMAT " not matching.", ssrc); } goto end; } /* RTP */ sink = kms_i_rtp_session_manager_request_rtp_sink (self->manager, self, mconf); kms_base_rtp_session_link_pads (pad, sink); g_object_unref (sink); /* RTCP */ rtcp_pad_name = g_strconcat ("rtcp_", rtp_pad_name, NULL); src = gst_element_get_static_pad (ssrcdemux, rtcp_pad_name); g_free (rtcp_pad_name); sink = kms_i_rtp_session_manager_request_rtcp_sink (self->manager, self, mconf); kms_base_rtp_session_link_pads (src, sink); g_object_unref (src); g_object_unref (sink); end: KMS_SDP_SESSION_UNLOCK (self); }
static void kms_base_rtp_session_add_connection_sink (KmsBaseRtpSession * self, KmsIRtpConnection * conn, SdpMediaConfig * mconf) { GstPad *src, *sink; /* RTP */ src = kms_i_rtp_session_manager_request_rtp_src (self->manager, self, mconf); sink = kms_i_rtp_connection_request_rtp_sink (conn); kms_base_rtp_session_link_pads (src, sink); g_object_unref (src); g_object_unref (sink); /* RTCP */ src = kms_i_rtp_session_manager_request_rtcp_src (self->manager, self, mconf); sink = kms_i_rtp_connection_request_rtcp_sink (conn); kms_base_rtp_session_link_pads (src, sink); g_object_unref (src); g_object_unref (sink); }
static void kms_base_rtp_session_add_rtcp_mux_connection (KmsBaseRtpSession * self, KmsIRtpConnection * conn, SdpMediaConfig * mconf, gboolean active) { /* FIXME: Useful for local and remote ssrcs mapping */ GstElement *rtcpdemux = gst_element_factory_make ("rtcpdemux", NULL); GstPad *src, *sink; kms_i_rtp_connection_add (conn, GST_BIN (self), active); kms_i_rtp_connection_sink_sync_state_with_parent (conn); gst_bin_add (GST_BIN (self), rtcpdemux); /* RTP */ src = kms_i_rtp_connection_request_rtp_src (conn); sink = kms_i_rtp_session_manager_request_rtp_sink (self->manager, self, mconf); kms_base_rtp_session_link_pads (src, sink); g_object_unref (src); g_object_unref (sink); /* RTCP */ src = gst_element_get_static_pad (rtcpdemux, "rtcp_src"); sink = kms_i_rtp_session_manager_request_rtcp_sink (self->manager, self, mconf); g_object_unref (src); g_object_unref (sink); src = kms_i_rtp_connection_request_rtcp_src (conn); sink = gst_element_get_static_pad (rtcpdemux, "sink"); kms_base_rtp_session_link_pads (src, sink); g_object_unref (src); g_object_unref (sink); gst_element_sync_state_with_parent_target_state (rtcpdemux); kms_base_rtp_session_add_connection_sink (self, conn, mconf); kms_i_rtp_connection_src_sync_state_with_parent (conn); }