Esempio n. 1
0
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);
  }
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
/* 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);
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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));
  }
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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);
}