From patchwork Tue Dec 22 22:47:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 24627 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 C2E8A449934 for ; Wed, 23 Dec 2020 00:48:03 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ADA6668AC1A; Wed, 23 Dec 2020 00:48:03 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D70F468A9A5 for ; Wed, 23 Dec 2020 00:47:55 +0200 (EET) Received: by mail-pg1-f194.google.com with SMTP id f17so9325303pge.6 for ; Tue, 22 Dec 2020 14:47:55 -0800 (PST) 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=GodZ1iICZnjIPIrPLBrEsvpBw3Zi2titGiUKOulYY+4=; b=U4QPSDVqNoVeSCe7cIE6jDB9lpZtLAvRPsxX383lid/CSLGcvcIEHh1HAN+G/gvC+T whb1ji5+CgDcUVoEfp3ByRk32H7H0/bG6svEQ7miIWCpFNqv269U5PN/2QxJyIjWbahE livp/sOsgSfohIGsX10qAaqgZjhpMA2+zlEUW8MKjDGb4bbkf6OIFTTuyNDkedwvszmX fOJg4TR6PBY6v2YtCH6H404ocEAz0bfVXSYljeMTTVZo2oQQeqfxTt5KD/RV7PkqpIvl UyNtDfW/K+ercGhCrMetn/hm35JEo4LqHMDhS7/+eSy8AOOv1I7QJmbny8JueSmHQgmD S92w== X-Gm-Message-State: AOAM531DPU9PibcyP8VQCyxT7lde71bIMDD4ZqNHNeCg6+VLHBMBuTv8 q5KxbVoTDkRRvAlce7jlFdqqvr27spWsv7Dd X-Google-Smtp-Source: ABdhPJxVZSn2wI/ZVEMRXW37LbCAz74JKdugrTXlj6+NofbNTHQXM415x9wY6AvfcncnBDnoY32xxA== X-Received: by 2002:a63:f64c:: with SMTP id u12mr4138562pgj.98.1608677273885; Tue, 22 Dec 2020 14:47:53 -0800 (PST) Received: from tmm1-imac.lan (ip72-194-222-34.sb.sd.cox.net. [72.194.222.34]) by smtp.gmail.com with ESMTPSA id m8sm20691725pjr.39.2020.12.22.14.47.52 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 Dec 2020 14:47:53 -0800 (PST) From: Aman Karmani To: ffmpeg-devel@ffmpeg.org Date: Tue, 22 Dec 2020 14:47:46 -0800 Message-Id: <20201222224747.12690-2-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201222224747.12690-1-ffmpeg@tmm1.net> References: <20201222224747.12690-1-ffmpeg@tmm1.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/3] avformat/rtsp: add satip_raw flag to receive raw mpegts stream 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: Aman Karmani Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Aman Karmani This can be used to receive the raw mpegts stream from a SAT>IP server, by letting avformat handle the RTSP/RTP/UDP negotiation and setup, but then simply passing the MP2T stream through instead of demuxing it further. For example, this command would demux/remux the mpegts stream: SATIP_URL='satip://192.168.1.99:554/?src=1&freq=12188&pol=h&ro=0.35&msys=dvbs&mtype=qpsk&plts=off&sr=27500&fec=34&pids=0,17,18,167,136,47,71' ffmpeg -i $SATIP_URL -map 0 -c copy -f mpegts -y remux.ts Whereas this command will simply write out the raw stream, with the original PAT/PMT/PIDs intact: ffmpeg -rtsp_flags satip_raw -i $SATIP_URL -map 0 -c copy -f data -y raw.ts Signed-off-by: Aman Karmani --- libavformat/rtsp.c | 17 ++++++++++++++--- libavformat/rtsp.h | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index ba21b50b76..450ad3a4b8 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -89,6 +89,7 @@ const AVOption ff_rtsp_options[] = { RTSP_FLAG_OPTS("rtsp_flags", "set RTSP flags"), { "listen", "wait for incoming connections", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_LISTEN}, 0, 0, DEC, "rtsp_flags" }, { "prefer_tcp", "try RTP via TCP first, if available", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_PREFER_TCP}, 0, 0, DEC|ENC, "rtsp_flags" }, + { "satip_raw", "export raw MPEG-TS stream instead of demuxing", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_SATIP_RAW}, 0, 0, DEC, "rtsp_flags" }, RTSP_MEDIATYPE_OPTS("allowed_media_types", "set media types to accept from the server"), { "min_port", "set minimum local UDP port", OFFSET(rtp_port_min), AV_OPT_TYPE_INT, {.i64 = RTSP_RTP_PORT_MIN}, 0, 65535, DEC|ENC }, { "max_port", "set maximum local UDP port", OFFSET(rtp_port_max), AV_OPT_TYPE_INT, {.i64 = RTSP_RTP_PORT_MAX}, 0, 65535, DEC|ENC }, @@ -265,9 +266,19 @@ static int init_satip_stream(AVFormatContext *s) av_strlcpy(rtsp_st->control_url, rt->control_uri, sizeof(rtsp_st->control_url)); - rtsp_st->stream_index = -1; - init_rtp_handler(&ff_mpegts_dynamic_handler, rtsp_st, NULL); - finalize_rtp_handler_init(s, rtsp_st, NULL); + if (rt->rtsp_flags & RTSP_FLAG_SATIP_RAW) { + AVStream *st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + st->id = rt->nb_rtsp_streams - 1; + rtsp_st->stream_index = st->index; + st->codecpar->codec_type = AVMEDIA_TYPE_DATA; + st->codecpar->codec_id = AV_CODEC_ID_MPEG2TS; + } else { + rtsp_st->stream_index = -1; + init_rtp_handler(&ff_mpegts_dynamic_handler, rtsp_st, NULL); + finalize_rtp_handler_init(s, rtsp_st, NULL); + } return 0; } diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h index 239ea8a0eb..1310dd9c08 100644 --- a/libavformat/rtsp.h +++ b/libavformat/rtsp.h @@ -429,6 +429,7 @@ typedef struct RTSPState { #define RTSP_FLAG_RTCP_TO_SOURCE 0x8 /**< Send RTCP packets to the source address of received packets. */ #define RTSP_FLAG_PREFER_TCP 0x10 /**< Try RTP via TCP first if possible. */ +#define RTSP_FLAG_SATIP_RAW 0x20 /**< Export SAT>IP stream as raw MPEG-TS */ typedef struct RTSPSource { char addr[128]; /**< Source-specific multicast include source IP address (from SDP content) */