static GstSDPMedia * reject_media_answer (const GstSDPMedia * offered) { GstSDPMedia *media; const gchar *mid; guint i, len; gst_sdp_media_new (&media); /* [rfc3264] To reject an offered stream, the port number in the */ /* corresponding stream in the answer MUST be set to zero. Any */ /* media formats listed are ignored. */ gst_sdp_media_set_media (media, gst_sdp_media_get_media (offered)); gst_sdp_media_set_port_info (media, 0, 1); gst_sdp_media_set_proto (media, gst_sdp_media_get_proto (offered)); len = gst_sdp_media_formats_len (offered); for (i = 0; i < len; i++) { const gchar *format; format = gst_sdp_media_get_format (offered, i); gst_sdp_media_insert_format (media, i, format); } /* [rfc5888] mid attribute must be present in answer as well */ mid = gst_sdp_media_get_attribute_val (offered, "mid"); if (mid == NULL) { return media; } gst_sdp_media_add_attribute (media, "mid", mid); return media; }
static gboolean accept_fmtp_attribute (const GstSDPMedia * offer, const GstSDPAttribute * attr, GstSDPMedia * media, SdpMessageContext * ctx) { guint i, len; gchar **fmtp; gboolean ret = FALSE; fmtp = g_strsplit (attr->value, " ", 0); /* Check that answer supports this format */ len = gst_sdp_media_formats_len (media); for (i = 0; i < len; i++) { const gchar *fmt; fmt = gst_sdp_media_get_format (media, i); if (g_strcmp0 (fmt, fmtp[0] /* format */ ) == 0) { ret = TRUE; break; } } g_strfreev (fmtp); return ret; }
static gboolean format_supported (const GstSDPMedia * media, const gchar * fmt) { guint i, len; len = gst_sdp_media_formats_len (media); for (i = 0; i < len; i++) { const gchar *format; format = gst_sdp_media_get_format (media, i); if (g_strcmp0 (format, fmt) == 0) { return TRUE; } } return FALSE; }
static gboolean kms_sdp_reject_media_handler_init_answer (KmsSdpMediaHandler * handler, const GstSDPMedia * offer, GstSDPMedia * answer, GError ** error) { guint i, len; if (gst_sdp_media_set_media (answer, gst_sdp_media_get_media (offer)) != GST_SDP_OK) { g_set_error (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER, "Can not set '%s' media ttribute", gst_sdp_media_get_media (offer)); return FALSE; } if (gst_sdp_media_set_proto (answer, gst_sdp_media_get_proto (offer)) != GST_SDP_OK) { g_set_error (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER, "Can not set proto '%s' attribute", gst_sdp_media_get_proto (offer)); return FALSE; } if (gst_sdp_media_set_port_info (answer, 0, 1) != GST_SDP_OK) { g_set_error_literal (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER, "Can not set port info attribute"); return FALSE; } len = gst_sdp_media_formats_len (offer); for (i = 0; i < len; i++) { const gchar *format; format = gst_sdp_media_get_format (offer, i); gst_sdp_media_insert_format (answer, i, format); } return TRUE; }