From patchwork Fri Jan 13 12:57:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andreas_H=C3=A5kon?= X-Patchwork-Id: 2207 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp169555vsb; Fri, 13 Jan 2017 04:57:41 -0800 (PST) X-Received: by 10.223.135.43 with SMTP id a40mr8351359wra.197.1484312261382; Fri, 13 Jan 2017 04:57:41 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u8si2079004wmd.19.2017.01.13.04.57.41; Fri, 13 Jan 2017 04:57:41 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@protonmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=protonmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 997DE68A39E; Fri, 13 Jan 2017 14:57:30 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail2.protonmail.ch (mail2.protonmail.ch [185.70.40.22]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6D4D9689C43 for ; Fri, 13 Jan 2017 14:57:23 +0200 (EET) Received: from B09B-5 (localhost [127.0.0.1]) by mail2.protonmail.ch (Postfix) with ESMTP id 3E168C0552 for ; Fri, 13 Jan 2017 07:57:30 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=default; t=1484312250; bh=xtFjgmkt/Bz8u8BfFO/AyFvx6CyA5hHB3E75wpv5+WY=; h=Date:To:From:Reply-To:Subject:In-Reply-To:References:Feedback-ID: From; b=K0mKJV7HhNF4C2ZB7Na3+P3pUIvhsChYP4MTKnVX+CVxdsufe1+5SvBs5mTtdZ0YS qlezNi8IKffbq7Pqx31AJ4D2YA/PwoL0tc0RGe8a9NAqeBXP2Qc1jl1/1/WmSudV7u 4Pv8Nr9SQHxNvrY+HijbKQ7Ci2hpJY+etE9PDNXc= Date: Fri, 13 Jan 2017 07:57:28 -0500 To: "ffmpeg-devel@ffmpeg.org" From: =?UTF-8?Q?Andreas_H=C3=A5kon?= Message-ID: In-Reply-To: References: Feedback-ID: Mx8CaiV20jk_fqXDN0fFpg3vRaGkb9VCTrYRnZNHwEija3aOdqvFspzl6ODkmHrlSKJSx29p-LzkuvS_96L02A==:Ext:ProtonMail MIME-Version: 1.0 X-Spam-Status: No, score=-3.0 required=4.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE, MIME_BASE64_BLANKS,URIBL_BLOCKED autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail2.protonmail.ch X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: Re: [FFmpeg-devel] [PATCH] avformat: Add rtp_mpegtsraw (MPEG-TS RAW Stream output) 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Hi, I resend the attachment with the correct mime type: text/plain Sorry! -------- Original Message -------- Subject: [PATCH] avformat: Add rtp_mpegtsraw (MPEG-TS RAW Stream output) From: andreas.hakon@protonmail.com To: ffmpeg-devel@ffmpeg.org Hi, This patch adds a new MUXER named "rtp_mpegtsraw". This new muxer works with the "mpegtsraw" input demuxer. The objective is enable direct bitstream input-output of MPEG-TS for RTP+FEC. Using the recent support for Pro-MPEG CoP FEC protocol, you can now use FFmpeg for streaming any UDP/RTP MPEG-TS stream. Example: ffmpeg -f mpegtsraw -i udp://239.8.8.8:12345 -map 0 -c copy -f rtp_mpegtsraw -fec prompeg=l=8:d=8 rtp://239.9.9.9:10000 In this example FFmpeg reads from the network one stream in UDP o RTP format from the multicast address 239.8.8.8:12345 and re-encapsulates it without remuxing to the multicast address 239.9.9.9 using RTP+FEC (ports 10000 & 10001 are for the base RTP, port 10002 are for "row" and 10004 are for "column"). If you ever have had the need to do use FFmpeg in plain "bitstream" mode with MPEG-TS streams, you have luck: know you can! Please comment, Andreas HÃ¥kon From 8b1dba724cbce3f368da7bdc97fd802939205c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20H=C3=A5kon?= Date: Tue, 10 Jan 2017 17:02:04 +0100 Subject: [PATCH 1/2] avformat: Add rtp_mpegtsraw (MPEG-TS RAW Stream output --- ffmpeg.c | 1 + libavformat/allformats.c | 1 + libavformat/mpegts.c | 2 +- libavformat/rtpenc.c | 6 ++++++ libavformat/rtpenc_mpegts.c | 48 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/ffmpeg.c b/ffmpeg.c index b85c314..838f4d2 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -3228,6 +3228,7 @@ static int init_output_stream_encode(OutputStream *ost) } break; case AVMEDIA_TYPE_DATA: + av_log(NULL, AV_LOG_TRACE, "Using bitstream with codec %s\n", avcodec_get_name(enc_ctx->codec_id)); break; default: abort(); diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 6a79b75..b58e178 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -269,6 +269,7 @@ void av_register_all(void) REGISTER_MUXDEMUX(RSO, rso); REGISTER_MUXDEMUX(RTP, rtp); REGISTER_MUXER (RTP_MPEGTS, rtp_mpegts); + REGISTER_MUXER (RTP_MPEGTSRAW, rtp_mpegtsraw); REGISTER_MUXDEMUX(RTSP, rtsp); REGISTER_DEMUXER (SAMI, sami); REGISTER_MUXDEMUX(SAP, sap); diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 0aa0ad7..2c23a05 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2663,7 +2663,7 @@ static int mpegts_read_header(AVFormatContext *s) return AVERROR(ENOMEM); avpriv_set_pts_info(st, 60, 1, 27000000); st->codecpar->codec_type = AVMEDIA_TYPE_DATA; - st->codecpar->codec_id = AV_CODEC_ID_MPEG2TS; + st->codecpar->codec_id = AV_CODEC_ID_BIN_DATA; /* we iterate until we find two PCRs to estimate the bitrate */ pcr_pid = -1; diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c index efa63a5..e465501 100644 --- a/libavformat/rtpenc.c +++ b/libavformat/rtpenc.c @@ -82,6 +82,7 @@ static int is_supported(enum AVCodecID id) case AV_CODEC_ID_MJPEG: case AV_CODEC_ID_SPEEX: case AV_CODEC_ID_OPUS: + case AV_CODEC_ID_BIN_DATA: return 1; default: return 0; @@ -160,6 +161,7 @@ static int rtp_write_header(AVFormatContext *s1) avpriv_set_pts_info(st, 32, 1, 90000); } s->buf_ptr = s->buf; + av_log(s1, AV_LOG_TRACE, "Using RTP muxer with codec %s\n", avcodec_get_name(st->codecpar->codec_id)); switch(st->codecpar->codec_id) { case AV_CODEC_ID_MP2: case AV_CODEC_ID_MP3: @@ -571,6 +573,7 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) ff_rtp_send_amr(s1, pkt->data, size); break; case AV_CODEC_ID_MPEG2TS: + case AV_CODEC_ID_BIN_DATA: rtp_send_mpegts_raw(s1, pkt->data, size); break; case AV_CODEC_ID_DIRAC: @@ -624,6 +627,9 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) /* Intentional fallthrough */ default: /* better than nothing : send the codec raw data */ + av_log(s1, AV_LOG_WARNING, + "RTP output is unsupported with codec %s\n", + avcodec_get_name(st->codecpar->codec_id)); rtp_send_raw(s1, pkt->data, size); break; } diff --git a/libavformat/rtpenc_mpegts.c b/libavformat/rtpenc_mpegts.c index 7af02e0..1e7177c 100644 --- a/libavformat/rtpenc_mpegts.c +++ b/libavformat/rtpenc_mpegts.c @@ -143,6 +143,43 @@ static int rtp_mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) return ret; } +static int rtp_mpegtsraw_write_close(AVFormatContext *s) +{ + rtp_mpegts_write_close(s); + return 0; +} + +static int rtp_mpegtsraw_write_header(AVFormatContext *s) +{ + struct MuxChain *chain = s->priv_data; + int ret = AVERROR(ENOMEM); + + ret = rtp_mpegts_write_header(s); + + if (ret < 0) + return ret; + + if (chain->mpegts_ctx) { + av_write_trailer(chain->mpegts_ctx); + ffio_free_dyn_buf(&chain->mpegts_ctx->pb); + avformat_free_context(chain->mpegts_ctx); + + chain->mpegts_ctx = NULL; + } + + return ret; +} + +static int rtp_mpegtsraw_write_packet(AVFormatContext *s, AVPacket *pkt) +{ + struct MuxChain *chain = s->priv_data; + int ret = 0; + + ret = av_write_frame(chain->rtp_ctx, pkt); + + return ret; +} + AVOutputFormat ff_rtp_mpegts_muxer = { .name = "rtp_mpegts", .long_name = NULL_IF_CONFIG_SMALL("RTP/mpegts output format"), @@ -153,3 +190,14 @@ AVOutputFormat ff_rtp_mpegts_muxer = { .write_packet = rtp_mpegts_write_packet, .write_trailer = rtp_mpegts_write_close, }; + +AVOutputFormat ff_rtp_mpegtsraw_muxer = { + .name = "rtp_mpegtsraw", + .long_name = NULL_IF_CONFIG_SMALL("RTP/mpegts RAW-Stream output format"), + .priv_data_size = sizeof(struct MuxChain), + .audio_codec = AV_CODEC_ID_AAC, + .video_codec = AV_CODEC_ID_MPEG4, + .write_header = rtp_mpegtsraw_write_header, + .write_packet = rtp_mpegtsraw_write_packet, + .write_trailer = rtp_mpegtsraw_write_close, +};