static void kms_rtp_endpoint_start_transport_send (KmsBaseSdpEndpoint * base_sdp_endpoint, gboolean offerer) { KmsRtpEndpoint *self = KMS_RTP_ENDPOINT (base_sdp_endpoint); SdpMessageContext *remote_ctx = kms_base_sdp_endpoint_get_remote_sdp_ctx (base_sdp_endpoint); const GstSDPMessage *sdp = kms_sdp_message_context_get_sdp_message (remote_ctx); const GSList *item = kms_sdp_message_context_get_medias (remote_ctx); const GstSDPConnection *msg_conn = gst_sdp_message_get_connection (sdp); /* Chain up */ KMS_BASE_SDP_ENDPOINT_CLASS (parent_class)->start_transport_send (base_sdp_endpoint, offerer); for (; item != NULL; item = g_slist_next (item)) { SdpMediaConfig *mconf = item->data; GstSDPMedia *media = kms_sdp_media_config_get_sdp_media (mconf); const GstSDPConnection *media_con; KmsRtpBaseConnection *conn; guint port; if (media->port == 0) { continue; } if (gst_sdp_media_connections_len (media) != 0) { media_con = gst_sdp_media_get_connection (media, 0); } else { media_con = msg_conn; } if (media_con == NULL || media_con->address == NULL || media_con->address[0] == '\0') { const gchar *media_str = gst_sdp_media_get_media (media); GST_WARNING_OBJECT (self, "Missing connection information for '%s'", media_str); continue; } conn = kms_rtp_endpoint_media_get_connection (self, mconf); if (conn == NULL) { continue; } port = gst_sdp_media_get_port (media); kms_rtp_base_connection_set_remote_info (conn, media_con->address, port, port + 1); /* TODO: get rtcp port from attr if it exists */ } }
static void kms_connection_ext_get_connection_attrs (KmsISdpMediaExtension * ext, const GstSDPMedia * media, GArray * conns) { guint i, len; len = gst_sdp_media_connections_len (media); for (i = 0; i < len; i++) { const GstSDPConnection *conn; conn = gst_sdp_media_get_connection (media, i); add_address_to_list (conns, conn); } }
static GstSDPStream * gst_sdp_demux_create_stream (GstSDPDemux * demux, GstSDPMessage * sdp, gint idx) { GstSDPStream *stream; const gchar *payload, *rtcp; const GstSDPMedia *media; const GstSDPConnection *conn; /* get media, should not return NULL */ media = gst_sdp_message_get_media (sdp, idx); if (media == NULL) return NULL; stream = g_new0 (GstSDPStream, 1); stream->parent = demux; /* we mark the pad as not linked, we will mark it as OK when we add the pad to * the element. */ stream->last_ret = GST_FLOW_OK; stream->added = FALSE; stream->disabled = FALSE; stream->id = demux->numstreams++; stream->eos = FALSE; /* we must have a payload. No payload means we cannot create caps */ /* FIXME, handle multiple formats. */ if ((payload = gst_sdp_media_get_format (media, 0))) { stream->pt = atoi (payload); /* convert caps */ stream->caps = gst_sdp_demux_media_to_caps (stream->pt, media); if (stream->pt >= 96) { /* If we have a dynamic payload type, see if we have a stream with the * same payload number. If there is one, they are part of the same * container and we only need to add one pad. */ if (find_stream (demux, GINT_TO_POINTER (stream->pt), (gpointer) find_stream_by_pt)) { stream->container = TRUE; } } } if (!(conn = gst_sdp_media_get_connection (media, 0))) { if (!(conn = gst_sdp_message_get_connection (sdp))) goto no_connection; } stream->destination = conn->address; stream->ttl = conn->ttl; stream->multicast = is_multicast_address (stream->destination); stream->rtp_port = gst_sdp_media_get_port (media); if ((rtcp = gst_sdp_media_get_attribute_val (media, "rtcp"))) { /* FIXME, RFC 3605 */ stream->rtcp_port = stream->rtp_port + 1; } else { stream->rtcp_port = stream->rtp_port + 1; } GST_DEBUG_OBJECT (demux, "stream %d, (%p)", stream->id, stream); GST_DEBUG_OBJECT (demux, " pt: %d", stream->pt); GST_DEBUG_OBJECT (demux, " container: %d", stream->container); GST_DEBUG_OBJECT (demux, " caps: %" GST_PTR_FORMAT, stream->caps); /* we keep track of all streams */ demux->streams = g_list_append (demux->streams, stream); return stream; /* ERRORS */ no_connection: { gst_sdp_demux_stream_free (demux, stream); return NULL; } }