static void kms_base_rtp_session_update_conn_state (KmsBaseRtpSession * self) { GHashTableIter iter; gpointer key, v; gboolean emit = FALSE; KmsConnectionState new_state = KMS_CONNECTION_STATE_CONNECTED; KMS_SDP_SESSION_LOCK (self); g_hash_table_iter_init (&iter, self->conns); while (g_hash_table_iter_next (&iter, &key, &v)) { KmsIRtpConnection *conn = KMS_I_RTP_CONNECTION (v); gboolean connected; g_object_get (conn, "connected", &connected, NULL); if (!connected) { new_state = KMS_CONNECTION_STATE_DISCONNECTED; break; } } if (self->conn_state != new_state) { GST_DEBUG_OBJECT (self, "Connection state changed to '%d'", new_state); self->conn_state = new_state; emit = TRUE; } KMS_SDP_SESSION_UNLOCK (self); if (emit) { g_signal_emit (G_OBJECT (self), obj_signals[CONNECTION_STATE_CHANGED], 0, new_state); } }
static void kms_base_rtp_session_disable_connection_stats (gpointer key, gpointer value, gpointer user_data) { kms_i_rtp_connection_collect_latency_stats (KMS_I_RTP_CONNECTION (value), FALSE); }
static KmsIRtpConnection * kms_webrtc_session_create_connection (KmsBaseRtpSession * base_rtp_sess, SdpMediaConfig * mconf, const gchar * name, guint16 min_port, guint16 max_port) { KmsWebrtcSession *self = KMS_WEBRTC_SESSION (base_rtp_sess); GstSDPMedia *media = kms_sdp_media_config_get_sdp_media (mconf); KmsWebRtcBaseConnection *conn; self->min_port = min_port; self->max_port = max_port; if (g_strcmp0 (gst_sdp_media_get_proto (media), "DTLS/SCTP") == 0) { GST_DEBUG_OBJECT (self, "Create SCTP connection"); conn = KMS_WEBRTC_BASE_CONNECTION (kms_webrtc_sctp_connection_new (self->agent, self->context, name, min_port, max_port)); } else { GST_DEBUG_OBJECT (self, "Create RTP connection"); conn = KMS_WEBRTC_BASE_CONNECTION (kms_webrtc_connection_new (self->agent, self->context, name)); } return KMS_I_RTP_CONNECTION (conn); }
/* Connection management begin */ static KmsIRtpConnection * kms_rtp_endpoint_create_connection (KmsBaseRtpEndpoint * base_rtp_endpoint, SdpMediaConfig * mconf, const gchar * name) { KmsRtpConnection *conn = kms_rtp_connection_new (); return KMS_I_RTP_CONNECTION (conn); }
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; }
KmsIRtpConnection * kms_base_rtp_session_get_connection_by_name (KmsBaseRtpSession * self, const gchar * name) { gpointer *conn; conn = g_hash_table_lookup (self->conns, name); if (conn == NULL) { return NULL; } return KMS_I_RTP_CONNECTION (conn); }
static void rtcp_connected_cb (GstElement * dtlssrtpenc, gpointer data) { KmsWebRtcConnection *self = data; gboolean signal; g_mutex_lock (&self->priv->mutex); self->priv->rtcp_tr_connected = TRUE; signal = self->priv->rtp_tr_connected; g_mutex_unlock (&self->priv->mutex); if (signal) { kms_i_rtp_connection_connected_signal (KMS_I_RTP_CONNECTION (self)); } }
KmsRtpConnection * kms_rtp_connection_new (guint16 min_port, guint16 max_port, gboolean use_ipv6) { GObject *obj; KmsRtpConnection *conn; KmsRtpConnectionPrivate *priv; GSocketFamily socket_family; obj = g_object_new (KMS_TYPE_RTP_CONNECTION, NULL); conn = KMS_RTP_CONNECTION (obj); priv = conn->priv; if (use_ipv6) { socket_family = G_SOCKET_FAMILY_IPV6; } else { socket_family = G_SOCKET_FAMILY_IPV4; } if (!kms_rtp_connection_get_rtp_rtcp_sockets (&priv->rtp_socket, &priv->rtcp_socket, min_port, max_port, socket_family)) { GST_ERROR_OBJECT (obj, "Cannot get ports"); g_object_unref (obj); return NULL; } priv->rtp_udpsink = gst_element_factory_make ("multiudpsink", NULL); priv->rtp_udpsrc = gst_element_factory_make ("udpsrc", NULL); g_object_set (priv->rtp_udpsink, "socket", priv->rtp_socket, "sync", FALSE, "async", FALSE, NULL); g_object_set (priv->rtp_udpsrc, "socket", priv->rtp_socket, "auto-multicast", FALSE, NULL); priv->rtcp_udpsink = gst_element_factory_make ("multiudpsink", NULL); priv->rtcp_udpsrc = gst_element_factory_make ("udpsrc", NULL); g_object_set (priv->rtcp_udpsink, "socket", priv->rtcp_socket, "sync", FALSE, "async", FALSE, NULL); g_object_set (priv->rtcp_udpsrc, "socket", priv->rtcp_socket, "auto-multicast", FALSE, NULL); kms_i_rtp_connection_connected_signal (KMS_I_RTP_CONNECTION (conn)); return conn; }
static void kms_base_rtp_session_check_conn_status (KmsBaseRtpSession * self) { GHashTableIter iter; gpointer key, v; KMS_SDP_SESSION_LOCK (self); g_hash_table_iter_init (&iter, self->conns); while (g_hash_table_iter_next (&iter, &key, &v)) { KmsIRtpConnection *conn = KMS_I_RTP_CONNECTION (v); g_signal_connect_data (conn, "connected", G_CALLBACK (kms_base_rtp_session_connected_cb), self, NULL, 0); } KMS_SDP_SESSION_UNLOCK (self); kms_base_rtp_session_update_conn_state (self); }