- snprintf(sdp, sizeof(sdp),
- "v=0\r\nc=IN IP%d %s\r\nm=%s %d RTP/AVP %d\r\n",
- addr.ss_family == AF_INET ? 4 : 6, host,
- par->codec_type == AVMEDIA_TYPE_DATA ? "application" :
- par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio",
- port, payload_type);
- av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", sdp);
+ av_bprint_init(&sdp, 0, AV_BPRINT_SIZE_UNLIMITED);
+ av_bprintf(&sdp, "v=0\r\nc=IN IP%d %s\r\n",
+ addr.ss_family == AF_INET ? 4 : 6, host);
+
+ p = strchr(s->url, '?');
+ if (p) {
+ static const char filters[][2][8] = { { "sources", "incl" },
+ { "block", "excl" } };
+ int i;
+ char *q;
+ for (i = 0; i < FF_ARRAY_ELEMS(filters); i++) {
+ if (av_find_info_tag(filters_buf, sizeof(filters_buf), filters[i][0], p)) {
+ q = filters_buf;
+ while ((q = strchr(q, ',')) != NULL)
+ *q = ' ';
+ av_bprintf(&sdp, "a=source-filter:%s IN IP%d %s %s\r\n",
+ filters[i][1],
+ addr.ss_family == AF_INET ? 4 : 6, host,
+ filters_buf);
+ }
+ }
+ }
+
+ av_bprintf(&sdp, "m=%s %d RTP/AVP %d\r\n",
+ par->codec_type == AVMEDIA_TYPE_DATA ? "application" :
+ par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio",
+ port, payload_type);
+ av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", sdp.str);
+ if (!av_bprint_is_complete(&sdp))
+ goto fail_nobuf;