GST_END_TEST GST_START_TEST (modify) { GstSDPMessage *message; glong length = -1; const GstSDPMedia *media; const gchar *old_val; const gchar *result; GstSDPAttribute attr; gst_sdp_message_new (&message); gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message); /* modify session attribute */ fail_unless (gst_sdp_message_add_attribute (message, "test_attr_session", "param1=val1") == GST_SDP_OK); old_val = gst_sdp_message_get_attribute_val (message, "test_attr_session"); fail_unless (old_val != NULL); attr.key = g_strdup ("test_attr_session"); attr.value = g_strdup_printf ("%s;param2=val2", old_val); fail_unless (gst_sdp_message_replace_attribute (message, 0, &attr) == GST_SDP_OK); result = gst_sdp_message_get_attribute_val (message, "test_attr_session"); fail_unless (result != NULL); fail_unless (g_strcmp0 (result, "param1=val1;param2=val2") == 0); /* modify media attribute */ media = gst_sdp_message_get_media (message, 0); fail_unless (media != NULL); fail_unless (gst_sdp_media_add_attribute ((GstSDPMedia *) media, "test_attr_media", "param3=val3") == GST_SDP_OK); old_val = gst_sdp_media_get_attribute_val ((GstSDPMedia *) media, "test_attr_media"); fail_unless (old_val != NULL); attr.key = g_strdup ("test_attr_media"); attr.value = g_strdup ("myparam=myval"); fail_unless (gst_sdp_media_replace_attribute ((GstSDPMedia *) media, 0, &attr) == GST_SDP_OK); result = gst_sdp_media_get_attribute_val ((GstSDPMedia *) media, "test_attr_media"); fail_unless (result != NULL); fail_unless (g_strcmp0 (result, "myparam=myval") == 0); gst_sdp_message_free (message); }
static GstRTSPResult gst_rtsp_wms_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, GstStructure * props) { const gchar *config, *maxps; gint i; GstRTSPWMS *ctx = (GstRTSPWMS *) ext; if (!ctx->active) return GST_RTSP_OK; for (i = 0; (config = gst_sdp_message_get_attribute_val_n (sdp, "pgmpu", i)); i++) { if (g_str_has_prefix (config, HEADER_PREFIX)) { config += strlen (HEADER_PREFIX); gst_structure_set (props, "config", G_TYPE_STRING, config, NULL); break; } } if (config == NULL) goto no_config; gst_structure_set (props, "config", G_TYPE_STRING, config, NULL); maxps = gst_sdp_message_get_attribute_val (sdp, "maxps"); if (maxps) gst_structure_set (props, "maxps", G_TYPE_STRING, maxps, NULL); gst_structure_set (props, "encoding-name", G_TYPE_STRING, "X-ASF-PF", NULL); gst_structure_set (props, "media", G_TYPE_STRING, "application", NULL); return GST_RTSP_OK; /* ERRORS */ no_config: { GST_DEBUG_OBJECT (ctx, "Could not find config SDP field, deactivating."); ctx->active = FALSE; return GST_RTSP_OK; } }
static gboolean add_media_to_sdp_message (SdpMediaConfig * mconf, GstSDPMessage * msg, GError ** error) { GstSDPMedia *cpy; if (gst_sdp_message_get_attribute_val (msg, "group") != NULL && gst_sdp_media_get_attribute_val (mconf->media, "mid") == NULL) { /* When group attribute is present, the mid attribute */ /* in media is mandatory */ gst_sdp_media_add_attribute (mconf->media, "mid", mconf->mid); } if (gst_sdp_media_copy (mconf->media, &cpy) != GST_SDP_OK) { g_set_error_literal (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_UNEXPECTED_ERROR, "can not create media entry"); return FALSE; } gst_sdp_message_add_media (msg, cpy); gst_sdp_media_free (cpy); return TRUE; }
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); }