From patchwork Mon Apr 6 21:54:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Nicholson X-Patchwork-Id: 18738 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 0650644B60B for ; Tue, 7 Apr 2020 00:54:54 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D3B4C68B527; Tue, 7 Apr 2020 00:54:53 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E28A468B503 for ; Tue, 7 Apr 2020 00:54:46 +0300 (EEST) Received: by mail-wm1-f68.google.com with SMTP id z7so1056513wmk.1 for ; Mon, 06 Apr 2020 14:54:46 -0700 (PDT) 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=KEqDM/TSYaU6LTq/Z4xAg9PfZXWWhOMFFHYDUkrAEYI=; b=AsPpQe5jfAJ6PhzrLNt2KTesxVZOeSQIvYtJsDm0fwoBcyBY4A7wL0Tk7fXfP3jIbc ImeMjWMPLpNu9lKPFweD+5xA/vHu1mLQ4S/SYjSNoZflLE0Dwum/qL4sSU0kLenOX1RJ 6wOtSd/o6Pz0R6S/5k8gY7aN3JXE3LYBqPwZZW9kalE8HoH6jV4SwCaIqNoqI5n2+RNX Qo0Akb5zca2YX+jxyu9e94QjEZ/k6SdJGjqO/n76KMwA5Vwa0P9iTRdlyDKp6LWEqf1j aonCbkQHx8ysr9Kr9eDDMCLpAyQi/xZNscardSKcV/9Yvo6MVkiN1k1IRTHmm6TAWNBb d5Rw== 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=KEqDM/TSYaU6LTq/Z4xAg9PfZXWWhOMFFHYDUkrAEYI=; b=oVL6qmGRNqQwblejSbMO0Z4hD62rWcvIDj39M5wZWSnktUx5j90tvK9BkQoBJEhkvT qrLQ+Xwr4kNb/C88Tdx7AVvnY1lZYTvxfG1JVGbMcT4aaIcu/nvWf9znhq4gEoENPfNq Yb0FTFFxQMV8/bbQCuA8qLWBCDUQlsGZCCkgpr1/2zhOgoOx2HpNg55EYGR4FiFMYtK1 ZuEnlNMJLgLI163KfXc+pVT424FXJAezX0WmaWtAMFtw9WLR+NeDfA/xapwfDvGo9Gv7 zXa1d63ZF7zg/0FXvPS5XpOjRMtFuNGsEUrBzR5jYN8Onn1FEYrHyaooWevv+SBcRvFl tWEQ== X-Gm-Message-State: AGi0PuaUSWCq0o0wBTACJjo+utl6rMw8+fjnteNRde7OS86AC2sFJyGb u71C22m2RA08jcoimHqcBUhq1alz X-Google-Smtp-Source: APiQypJQPl+8S7tInC2mW9d07/k7IrEo5GFlGz1totmOtQucjJpwS1hdr8FO7xtQgxWny8j9vdSdgw== X-Received: by 2002:a1c:5f56:: with SMTP id t83mr230638wmb.61.1586210086007; Mon, 06 Apr 2020 14:54:46 -0700 (PDT) Received: from Rosss-MacBook.localdomain ([89.101.86.58]) by smtp.gmail.com with ESMTPSA id q14sm26349036wrx.57.2020.04.06.14.54.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 Apr 2020 14:54:45 -0700 (PDT) From: phunkyfish To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 Apr 2020 22:54:39 +0100 Message-Id: <20200406215439.51231-1-phunkyfish@gmail.com> X-Mailer: git-send-email 2.24.1 (Apple Git-126) In-Reply-To: <20200406165651.58783-1-phunkyfish@gmail.com> References: <20200406165651.58783-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 | 50 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index cd6fc32a29..2b59a9330d 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -21,6 +21,7 @@ #include "libavutil/avassert.h" #include "libavutil/base64.h" +#include "libavutil/bprint.h" #include "libavutil/avstring.h" #include "libavutil/intreadwrite.h" #include "libavutil/mathematics.h" @@ -2447,7 +2448,7 @@ 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]; + char host[500], filters_buf[1000]; int ret, port; URLContext* in = NULL; int payload_type; @@ -2456,6 +2457,8 @@ static int rtp_read_header(AVFormatContext *s) AVIOContext pb; socklen_t addrlen = sizeof(addr); RTSPState *rt = s->priv_data; + const char *p; + AVBPrint sdp; if (!ff_network_init()) return AVERROR(EIO); @@ -2513,16 +2516,40 @@ 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); - 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] = {{"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)) { + 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); + if (sdp.len != sdp.size) + goto fail_nobuf; + } + } + } + + 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 (sdp.len != sdp.size) + goto fail_nobuf; avcodec_parameters_free(&par); - ffio_init_context(&pb, sdp, strlen(sdp), 0, NULL, NULL, NULL, NULL); + ffio_init_context(&pb, sdp.str, strlen(sdp.str), 0, NULL, NULL, NULL, NULL); s->pb = &pb; /* sdp_read_header initializes this again */ @@ -2532,9 +2559,14 @@ static int rtp_read_header(AVFormatContext *s) ret = sdp_read_header(s); s->pb = NULL; + av_bprint_finalize(&sdp, 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: + av_bprint_finalize(&sdp, NULL); avcodec_parameters_free(&par); if (in) ffurl_close(in);