From patchwork Mon Mar 2 19:21:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Nicholson X-Patchwork-Id: 18010 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4FECA44B72D for ; Mon, 2 Mar 2020 21:21:44 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2D5BA68AFB3; Mon, 2 Mar 2020 21:21:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D97FB68AFB3 for ; Mon, 2 Mar 2020 21:21:37 +0200 (EET) Received: by mail-wr1-f67.google.com with SMTP id n7so1179901wrt.11 for ; Mon, 02 Mar 2020 11:21:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ffX74wMw6ah+EfiFJgtmxmIlSu/qruCZAf3TZkhXryA=; b=dKmrvlQg1sOfJtq+m8GJfp9RIfdr5OozmvZtLm4Z62mGkihLqsBt8wB3N4JV3s8oRA hZ+/zQnl8FjhOxChXl9W7x3tgoBd3wIn2MCpBbsL6XZkjoEhYU2o8kKczBtUzf+Xsx/Q XOsvA327AdKK9SRtiXHbFIAajxpWajHH42uD9WmMr4t3Q4O5HUG+NDu3j9Os/rcxmuhE WMyJI9KI4NhiMaJjoQ+F2vh7Ui3+a0BX0d5f6uHrXOUSn0NHUhRNXXX0F6kiH6EHUIl7 TDmQ7uSNyQIqAgeaHJxIASFOZ13dgBifZx2oBZxoJRnmHoMRI2bwtIGECM60Sh/OjZKm WTyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ffX74wMw6ah+EfiFJgtmxmIlSu/qruCZAf3TZkhXryA=; b=YrmDimGKyPzrewKhRWiXRnoCiphKjTgnV4sJyYQ1GK2vUtIPdBbvpbBwiZPXUNIMik 8w8+0UnUcYe35RXa2+P3pmcfLhBNrhRkettoZ6K9FvMMBZ0c8RGOUImu4CpHIFN7pFzZ Bc0QOYRehLOPOVjYdX/rDniV7tMdqAIgFhzlzCNYv/AscEuQ4pPzvHL0Xrp3CqBQOhez COuPH25e+gHSju1s+v+inlp9XqkWvKpcBU+PERkXsY00Ea763UbdhmbQY73uOyKEhJH4 9UmacnWR/9sgntDsVnutE6ZMEc6JhtWlIkpPzPjM+6RktU/0++2HU1mjghbo8eW6AKah lFMg== X-Gm-Message-State: ANhLgQ3/1ifNCv+BUl7pGVmWX1jpIg3UyaHa+YdgDbyvzrcZmHjr0D5f YqhpNSY9UKeOdbVIKMHwaHzVymdHDOU= X-Google-Smtp-Source: ADFU+vujKd8el9ULH/9wme2axaXQJ7L/djJAmRQsuyAehrKduFUXyshLwjyv3bK5P3I38wFqzbDXRg== X-Received: by 2002:adf:b19d:: with SMTP id q29mr990170wra.211.1583176897079; Mon, 02 Mar 2020 11:21:37 -0800 (PST) Received: from Rosss-MacBook.localdomain ([89.101.86.58]) by smtp.gmail.com with ESMTPSA id o18sm25530344wrv.60.2020.03.02.11.21.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 02 Mar 2020 11:21:36 -0800 (PST) From: phunkyfish To: ffmpeg-devel@ffmpeg.org Date: Mon, 2 Mar 2020 19:21:09 +0000 Message-Id: <20200302192109.16576-1-phunkyfish@gmail.com> X-Mailer: git-send-email 2.20.1 (Apple Git-117) In-Reply-To: <20200302191316.16334-1-phunkyfish@gmail.com> References: <20200302191316.16334-1-phunkyfish@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/rtp: Pass sources and block filter addresses via sdp file for rtp X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: phunkyfish Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/rtsp.c | 49 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index cd6fc32a29..d23ec5723e 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -2447,8 +2447,8 @@ static int rtp_probe(const AVProbeData *p) static int rtp_read_header(AVFormatContext *s) { uint8_t recvbuf[RTP_MAX_PACKET_LENGTH]; - char host[500], sdp[500]; - int ret, port; + char host[500], sdp[1000], filters_buf[1000]; + int ret, port, sdp_length, nc; URLContext* in = NULL; int payload_type; AVCodecParameters *par = NULL; @@ -2456,6 +2456,7 @@ static int rtp_read_header(AVFormatContext *s) AVIOContext pb; socklen_t addrlen = sizeof(addr); RTSPState *rt = s->priv_data; + const char *p; if (!ff_network_init()) return AVERROR(EIO); @@ -2513,12 +2514,41 @@ static int rtp_read_header(AVFormatContext *s) av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port, NULL, 0, s->url); - 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); + sdp_length = snprintf(sdp + sdp_length, sizeof(sdp) - sdp_length, + "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] = {{"sources", "incl"}, {"block", "excl"}, {NULL, NULL}}; + int i; + char *q; + for (i = 0; filters[i][0]; i++) { + if (av_find_info_tag(filters_buf, sizeof(filters_buf), filters[i][0], p)) { + /* av_log(s, AV_LOG_VERBOSE, "rtp_read_header() found %s %s\n", filters[i][0], filters_buf); */ + q = filters_buf; + while ((q = strchr(q, ',')) != NULL) + *q = ' '; + nc = snprintf(sdp + sdp_length, sizeof(sdp) - sdp_length, + "a=source-filter:%s IN IP%d %s %s\r\n", + filters[i][1], + addr.ss_family == AF_INET ? 4 : 6, host, + filters_buf); + if (nc < 0 || nc + sdp_length >= sizeof(sdp)) + goto fail_nobuf; + sdp_length += nc; + } + } + } + + nc = snprintf(sdp + sdp_length, sizeof(sdp) - sdp_length, + "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); + if (nc < 0 || nc + sdp_length >= sizeof(sdp)) + goto fail_nobuf; + sdp_length += nc; av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", sdp); avcodec_parameters_free(&par); @@ -2534,6 +2564,9 @@ static int rtp_read_header(AVFormatContext *s) s->pb = NULL; return ret; +fail_nobuf: + ret = AVERROR(ENOBUFS); + av_log(s, AV_LOG_ERROR, "rtp_read_header(): not enough buffer space for sdp-headers\n"); fail: avcodec_parameters_free(&par); if (in)