void kms_base_rtp_session_start_transport_send (KmsBaseRtpSession * self, gboolean offerer) { KmsSdpSession *sdp_sess = KMS_SDP_SESSION (self); GSList *item = kms_sdp_message_context_get_medias (sdp_sess->neg_sdp_ctx); GSList *remote_media_list = kms_sdp_message_context_get_medias (sdp_sess->remote_sdp_ctx); kms_base_rtp_session_check_conn_status (self); for (; item != NULL; item = g_slist_next (item)) { SdpMediaConfig *neg_mconf = item->data; gint mid = kms_sdp_media_config_get_id (neg_mconf); SdpMediaConfig *remote_mconf; if (kms_sdp_media_config_is_inactive (neg_mconf)) { GST_DEBUG_OBJECT (self, "Media (id=%d) inactive", mid); continue; } remote_mconf = g_slist_nth_data (remote_media_list, mid); if (remote_mconf == NULL) { GST_WARNING_OBJECT (self, "Media (id=%d) is not in the remote SDP", mid); continue; } if (!kms_base_rtp_session_configure_connection (self, neg_mconf, remote_mconf, offerer)) { GST_WARNING_OBJECT (self, "Cannot configure connection for media %d.", mid); } } }
static void kms_webrtc_session_configure_connections (KmsWebrtcSession * self, KmsSdpSession * sess, gboolean offerer) { GSList *item = kms_sdp_message_context_get_medias (sess->neg_sdp_ctx); GSList *remote_media_list = kms_sdp_message_context_get_medias (sess->remote_sdp_ctx); for (; item != NULL; item = g_slist_next (item)) { SdpMediaConfig *neg_mconf = item->data; gint mid = kms_sdp_media_config_get_id (neg_mconf); SdpMediaConfig *remote_mconf; if (kms_sdp_media_config_is_inactive (neg_mconf)) { GST_DEBUG_OBJECT (self, "Media (id=%d) inactive", mid); continue; } remote_mconf = g_slist_nth_data (remote_media_list, mid); if (remote_mconf == NULL) { GST_WARNING_OBJECT (self, "Media (id=%d) is not in the remote SDP", mid); continue; } kms_webrtc_session_configure_connection (self, sess, neg_mconf, remote_mconf, offerer); } }
static gboolean kms_webrtc_session_local_sdp_add_default_info (KmsWebrtcSession * self) { KmsSdpSession *sdp_sess = KMS_SDP_SESSION (self); SdpMessageContext *local_sdp_ctx = sdp_sess->local_sdp_ctx; const GstSDPMessage *sdp = kms_sdp_message_context_get_sdp_message (local_sdp_ctx); const GSList *item = kms_sdp_message_context_get_medias (local_sdp_ctx); gboolean use_ipv6; GstSDPConnection *conn; conn = (GstSDPConnection *) gst_sdp_message_get_connection (sdp); gst_sdp_connection_clear (conn); use_ipv6 = kms_sdp_session_get_use_ipv6 (sdp_sess); for (; item != NULL; item = g_slist_next (item)) { SdpMediaConfig *mconf = item->data; if (kms_sdp_media_config_is_inactive (mconf)) { gint mid = kms_sdp_media_config_get_id (mconf); GST_DEBUG_OBJECT (self, "Media (id=%d) inactive", mid); continue; } if (!kms_webrtc_session_sdp_media_add_default_info (self, mconf, use_ipv6)) { return FALSE; } } return TRUE; }
static KmsIceCandidate * kms_ice_nice_agent_get_default_local_candidate (KmsIceBaseAgent * self, const char *stream_id, guint component_id) { KmsIceNiceAgent *nice_agent = KMS_ICE_NICE_AGENT (self); NiceCandidate *nice_cand; KmsIceCandidate *ret = NULL; guint id = atoi (stream_id); KmsSdpSession *sdp_sess = KMS_SDP_SESSION (nice_agent->priv->session); SdpMessageContext *local_sdp_ctx = sdp_sess->local_sdp_ctx; const GSList *item = kms_sdp_message_context_get_medias (local_sdp_ctx); nice_cand = nice_agent_get_default_local_candidate (nice_agent->priv->agent, id, component_id); for (; item != NULL; item = g_slist_next (item)) { SdpMediaConfig *mconf = item->data; gint idx = kms_sdp_media_config_get_id (mconf); const gchar *mid; gchar *media_stream_id; if (kms_sdp_media_config_is_inactive (mconf)) { GST_DEBUG_OBJECT (self, "Media (id=%d) inactive", idx); continue; } media_stream_id = kms_webrtc_session_get_stream_id (nice_agent->priv->session, mconf); if (media_stream_id == NULL) { goto end; } if (media_stream_id != stream_id) { goto end; } mid = kms_sdp_media_config_get_mid (mconf); if (mid != NULL) { ret = kms_ice_candidate_new_from_nice (nice_agent->priv->agent, nice_cand, mid, idx); goto end; } } end: nice_candidate_free (nice_cand); return ret; }
static void gst_media_add_remote_candidates (SdpMediaConfig * mconf, KmsWebRtcBaseConnection * conn, const gchar * msg_ufrag, const gchar * msg_pwd) { const GstSDPMedia *media = kms_sdp_media_config_get_sdp_media (mconf); KmsIceBaseAgent *agent = conn->agent; gchar *stream_id = conn->stream_id; const gchar *ufrag, *pwd; guint len, i; ufrag = gst_sdp_media_get_attribute_val (media, SDP_ICE_UFRAG_ATTR); pwd = gst_sdp_media_get_attribute_val (media, SDP_ICE_PWD_ATTR); if (!kms_ice_base_agent_set_remote_credentials (agent, stream_id, ufrag, pwd)) { GST_WARNING ("Cannot set remote media credentials (%s, %s).", ufrag, pwd); if (!kms_ice_base_agent_set_remote_credentials (agent, stream_id, msg_ufrag, msg_pwd)) { GST_WARNING ("Cannot set remote message credentials (%s, %s).", ufrag, pwd); return; } else { GST_DEBUG ("Set remote message credentials OK (%s, %s).", ufrag, pwd); } } else { GST_DEBUG ("Set remote media credentials OK (%s, %s).", ufrag, pwd); } len = gst_sdp_media_attributes_len (media); for (i = 0; i < len; i++) { const GstSDPAttribute *attr; KmsIceCandidate *candidate; gint idx = kms_sdp_media_config_get_id (mconf); const gchar *mid = kms_sdp_media_config_get_mid (mconf); attr = gst_sdp_media_get_attribute (media, i); if (g_strcmp0 (SDP_CANDIDATE_ATTR, attr->key) != 0) { continue; } candidate = kms_ice_candidate_new (attr->value, mid, idx); kms_ice_base_agent_add_ice_candidate (agent, candidate, stream_id); g_object_unref (candidate); } }
/* RTP connection begin */ gchar * kms_utils_create_connection_name_from_media_config (SdpMediaConfig * mconf) { SdpMediaGroup *group = kms_sdp_media_config_get_group (mconf); gchar *conn_name; if (group != NULL) { gint gid = kms_sdp_media_group_get_id (group); conn_name = g_strdup_printf ("%s%" G_GINT32_FORMAT, BUNDLE_STREAM_NAME, gid); } else { gint mid = kms_sdp_media_config_get_id (mconf); conn_name = g_strdup_printf ("%" G_GINT32_FORMAT, mid); } return conn_name; }
static void kms_ice_nice_agent_sdp_msg_add_ice_candidate (KmsWebrtcSession * self, NiceAgent * agent, NiceCandidate * nice_cand, KmsIceBaseAgent * parent) { KmsSdpSession *sdp_sess = KMS_SDP_SESSION (self); SdpMessageContext *local_sdp_ctx = sdp_sess->local_sdp_ctx; const GSList *item = kms_sdp_message_context_get_medias (local_sdp_ctx); GList *list = NULL, *iterator = NULL; KMS_SDP_SESSION_LOCK (self); for (; item != NULL; item = g_slist_next (item)) { SdpMediaConfig *mconf = item->data; gint idx = kms_sdp_media_config_get_id (mconf); const gchar *mid; if (kms_sdp_media_config_is_inactive (mconf)) { GST_DEBUG_OBJECT (self, "Media (id=%d) inactive", idx); continue; } mid = kms_ice_nice_agent_sdp_media_add_ice_candidate (self, mconf, agent, nice_cand); if (mid != NULL) { KmsIceCandidate *candidate = kms_ice_candidate_new_from_nice (agent, nice_cand, mid, idx); list = g_list_append (list, candidate); } } KMS_SDP_SESSION_UNLOCK (self); for (iterator = list; iterator; iterator = iterator->next) { g_signal_emit_by_name (parent, "on-ice-candidate", KMS_ICE_CANDIDATE (iterator->data)); } g_list_free_full (list, g_object_unref); }
void kms_webrtc_session_start_transport_send (KmsWebrtcSession * self, gboolean offerer) { KmsSdpSession *sdp_sess = KMS_SDP_SESSION (self); const GstSDPMessage *sdp = kms_sdp_message_context_get_sdp_message (sdp_sess->remote_sdp_ctx); const GSList *item = kms_sdp_message_context_get_medias (sdp_sess->neg_sdp_ctx); GSList *remote_media_list = kms_sdp_message_context_get_medias (sdp_sess->remote_sdp_ctx); const gchar *ufrag, *pwd; /* [rfc5245#section-5.2] * The agent that generated the offer which * started the ICE processing MUST take the controlling role, and the * other MUST take the controlled role. */ // TODO: This code should be independent of the ice implementation if (KMS_IS_ICE_NICE_AGENT (self->agent)) { KmsIceNiceAgent *nice_agent = KMS_ICE_NICE_AGENT (self->agent); g_object_set (kms_ice_nice_agent_get_agent (nice_agent), "controlling-mode", offerer, NULL); } /* Configure specific webrtc connection such as SCTP if negotiated */ kms_webrtc_session_configure_connections (self, sdp_sess, offerer); ufrag = gst_sdp_message_get_attribute_val (sdp, SDP_ICE_UFRAG_ATTR); pwd = gst_sdp_message_get_attribute_val (sdp, SDP_ICE_PWD_ATTR); for (; item != NULL; item = g_slist_next (item)) { SdpMediaConfig *neg_mconf = item->data; gint mid = kms_sdp_media_config_get_id (neg_mconf); SdpMediaConfig *remote_mconf; KmsWebRtcBaseConnection *conn; if (kms_sdp_media_config_is_inactive (neg_mconf)) { GST_DEBUG_OBJECT (self, "Media (id=%d) inactive", mid); continue; } conn = kms_webrtc_session_get_connection (self, neg_mconf); if (conn == NULL) { continue; } remote_mconf = g_slist_nth_data (remote_media_list, mid); if (remote_mconf == NULL) { GST_WARNING_OBJECT (self, "Media (id=%d) is not in the remote SDP", mid); continue; } gst_media_add_remote_candidates (remote_mconf, conn, ufrag, pwd); } kms_webrtc_session_add_stored_ice_candidates (self); g_slist_foreach (self->remote_candidates, kms_webrtc_session_remote_sdp_add_stored_ice_candidates, self); }