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;
}
Beispiel #3
0
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;
}