KmsIRtpConnection * kms_base_rtp_session_create_connection (KmsBaseRtpSession * self, SdpMediaConfig * mconf, guint16 min_port, guint16 max_port) { KmsBaseRtpSessionClass *base_rtp_class = KMS_BASE_RTP_SESSION_CLASS (G_OBJECT_GET_CLASS (self)); gchar *name = kms_utils_create_connection_name_from_media_config (mconf); SdpMediaGroup *group = kms_sdp_media_config_get_group (mconf); KmsIRtpConnection *conn; conn = kms_base_rtp_session_get_connection_by_name (self, name); if (conn != NULL) { GST_DEBUG_OBJECT (self, "Re-using connection '%s'", name); goto end; } if (group != NULL) { /* bundle */ conn = KMS_I_RTP_CONNECTION (base_rtp_class->create_bundle_connection (self, name, min_port, max_port)); } else if (kms_sdp_media_config_is_rtcp_mux (mconf)) { conn = KMS_I_RTP_CONNECTION (base_rtp_class->create_rtcp_mux_connection (self, name, min_port, max_port)); } else { conn = base_rtp_class->create_connection (self, mconf, name, min_port, max_port); } if (conn != NULL) { g_hash_table_insert (self->conns, g_strdup (name), conn); kms_base_rtp_session_set_connection_stats (self, conn); } end: g_free (name); return conn; }
static gboolean kms_base_rtp_session_add_connection_for_session (KmsBaseRtpSession * self, SdpMediaConfig * mconf, gboolean active) { KmsIRtpConnection *conn; SdpMediaGroup *group = kms_sdp_media_config_get_group (mconf); conn = kms_base_rtp_session_get_connection (self, mconf); if (conn == NULL) { return FALSE; } if (group != NULL) { /* bundle */ kms_base_rtp_session_add_bundle_connection (self, conn, mconf, active); kms_base_rtp_session_add_connection_sink (self, conn, mconf); } else if (kms_sdp_media_config_is_rtcp_mux (mconf)) { kms_base_rtp_session_add_rtcp_mux_connection (self, conn, mconf, active); } else { kms_base_rtp_session_add_connection (self, conn, mconf, active); } return TRUE; }
static gboolean kms_webrtc_session_sdp_media_add_default_info (KmsWebrtcSession * self, SdpMediaConfig * mconf, gboolean use_ipv6) { GstSDPMedia *media = kms_sdp_media_config_get_sdp_media (mconf); KmsIceBaseAgent *agent = self->agent; char *stream_id; KmsIceCandidate *rtp_default_candidate, *rtcp_default_candidate; gchar *rtp_addr; gchar *rtcp_addr; const gchar *rtp_addr_type, *rtcp_addr_type; gboolean rtp_is_ipv6, rtcp_is_ipv6; guint rtp_port, rtcp_port; guint conn_len, c; gchar *str; guint attr_len, i; stream_id = kms_webrtc_session_get_stream_id (self, mconf); if (stream_id == NULL) { return FALSE; } rtp_default_candidate = kms_ice_base_agent_get_default_local_candidate (agent, stream_id, NICE_COMPONENT_TYPE_RTP); if (kms_sdp_media_config_is_rtcp_mux (mconf) || kms_sdp_media_config_get_group (mconf) != NULL) { rtcp_default_candidate = kms_ice_base_agent_get_default_local_candidate (agent, stream_id, NICE_COMPONENT_TYPE_RTP); } else { rtcp_default_candidate = kms_ice_base_agent_get_default_local_candidate (agent, stream_id, NICE_COMPONENT_TYPE_RTCP); } if (rtcp_default_candidate == NULL || rtcp_default_candidate == NULL) { GST_WARNING_OBJECT (self, "Error getting ICE candidates. Network can be unavailable."); return FALSE; } rtp_addr = kms_ice_candidate_get_address (rtp_default_candidate); rtp_port = kms_ice_candidate_get_port (rtp_default_candidate); rtp_is_ipv6 = kms_ice_candidate_get_ip_version (rtp_default_candidate) == IP_VERSION_6; rtcp_addr = kms_ice_candidate_get_address (rtcp_default_candidate); rtcp_port = kms_ice_candidate_get_port (rtcp_default_candidate); rtcp_is_ipv6 = kms_ice_candidate_get_ip_version (rtcp_default_candidate) == IP_VERSION_6; rtp_addr_type = rtp_is_ipv6 ? "IP6" : "IP4"; rtcp_addr_type = rtcp_is_ipv6 ? "IP6" : "IP4"; if (use_ipv6 != rtp_is_ipv6) { GST_WARNING_OBJECT (self, "No valid rtp address type: %s", rtp_addr_type); return FALSE; } media->port = rtp_port; conn_len = gst_sdp_media_connections_len (media); for (c = 0; c < conn_len; c++) { gst_sdp_media_remove_connection (media, c); } gst_sdp_media_add_connection (media, "IN", rtp_addr_type, rtp_addr, 0, 0); attr_len = gst_sdp_media_attributes_len (media); for (i = 0; i < attr_len; i++) { const GstSDPAttribute *attr = gst_sdp_media_get_attribute (media, i); if (g_strcmp0 (attr->key, "rtcp") == 0) { str = g_strdup_printf ("%d IN %s %s", rtcp_port, rtcp_addr_type, rtcp_addr); gst_sdp_attribute_clear ((GstSDPAttribute *) attr); gst_sdp_attribute_set ((GstSDPAttribute *) attr, "rtcp", str); g_free (str); } } g_free (rtp_addr); g_free (rtcp_addr); g_object_unref (rtp_default_candidate); g_object_unref (rtcp_default_candidate); return TRUE; }