From patchwork Tue Dec 22 00:35:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 24611 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 DEF5244B1D0 for ; Tue, 22 Dec 2020 02:43:16 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BBC9368A898; Tue, 22 Dec 2020 02:43:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-il1-f170.google.com (mail-il1-f170.google.com [209.85.166.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1988689CFE for ; Tue, 22 Dec 2020 02:43:09 +0200 (EET) Received: by mail-il1-f170.google.com with SMTP id t9so10548617ilf.2 for ; Mon, 21 Dec 2020 16:43:09 -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=O8zxD9zn/8ttW91G56LSfJtZ86B5SkXGE8kO9Dj8jqk=; b=i6EvJpAN9E8WB84z9niQZXJ94vEwBFGPRNiJz2TfOzGcaLlnJL0e+4a7DH5hFyiGpm DvApt+mHsbP3f0Vu9gu2Q8qr6IgXfjEz2rXF2V6UJFrp8lARpiqoOWG6CL6Ns5XTR7CR 9uKWHYxCei0LNSfq3iXdFDaJ8C0hRZdOG1cBpo1Em4K1+8yD7TRBjwFt1e78sL3HayWs ALn01coD6uHt8yGoHDmrdNvw+7pRjveU/qfG5TriaMXWbm5KEmftHlhDvxroFpI0yhvU lyPzgmzMi6E3nie3ZCUfRLRcgiia6RoIU/7qxgpjMCni05gzoqA/y8gLsyREsagwrs2+ UsKg== X-Gm-Message-State: AOAM5300uPhMFozwjPb8zngxsdr7OyNt/WSlFkX6tKnwnNkwqOzQbll3 jflY1dupTFbeUN6XE9yTUyZWegAhqOuO+SUm X-Google-Smtp-Source: ABdhPJzQeW34NDmEfHR3jW+NedSMAho6sBqnPSMkLxysIXSYewYrvChxT5shZZJ7OVNRq7dP5tulbQ== X-Received: by 2002:a63:794:: with SMTP id 142mr17271504pgh.187.1608597384611; Mon, 21 Dec 2020 16:36:24 -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 z7sm18320780pfq.193.2020.12.21.16.36.23 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 21 Dec 2020 16:36:23 -0800 (PST) From: Aman Karmani To: ffmpeg-devel@ffmpeg.org Date: Mon, 21 Dec 2020 16:35:59 -0800 Message-Id: <20201222003600.27621-2-ffmpeg@tmm1.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201222003600.27621-1-ffmpeg@tmm1.net> References: <20201222003600.27621-1-ffmpeg@tmm1.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] avformat/rtpdec_mpegts: add ff_mpegtsraw_dynamic_handler 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 Passthrough handler which can be used to receive MP2T stream over RTP, and repackage it into a AV_CODEC_ID_MPEG2TS data stream. Signed-off-by: Aman Karmani --- libavformat/rtpdec_formats.h | 1 + libavformat/rtpdec_mpegts.c | 55 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/libavformat/rtpdec_formats.h b/libavformat/rtpdec_formats.h index dad2b8ac1b..ce349292df 100644 --- a/libavformat/rtpdec_formats.h +++ b/libavformat/rtpdec_formats.h @@ -74,6 +74,7 @@ extern const RTPDynamicProtocolHandler ff_mpeg_audio_robust_dynamic_handler; extern const RTPDynamicProtocolHandler ff_mpeg_video_dynamic_handler; extern const RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler; extern const RTPDynamicProtocolHandler ff_mpegts_dynamic_handler; +extern const RTPDynamicProtocolHandler ff_mpegtsraw_dynamic_handler; extern const RTPDynamicProtocolHandler ff_ms_rtp_asf_pfa_handler; extern const RTPDynamicProtocolHandler ff_ms_rtp_asf_pfv_handler; extern const RTPDynamicProtocolHandler ff_qcelp_dynamic_handler; diff --git a/libavformat/rtpdec_mpegts.c b/libavformat/rtpdec_mpegts.c index 405271f744..6d5a547030 100644 --- a/libavformat/rtpdec_mpegts.c +++ b/libavformat/rtpdec_mpegts.c @@ -20,6 +20,7 @@ */ #include "libavutil/attributes.h" +#include "libavformat/internal.h" #include "mpegts.h" #include "rtpdec_formats.h" @@ -28,6 +29,7 @@ struct PayloadContext { int read_buf_index; int read_buf_size; uint8_t buf[RTP_MAX_PACKET_LENGTH]; + AVStream *raw; }; static void mpegts_close_context(PayloadContext *data) @@ -89,6 +91,50 @@ static int mpegts_handle_packet(AVFormatContext *ctx, PayloadContext *data, return 0; } +static av_cold int mpegtsraw_init(AVFormatContext *ctx, int st_index, + PayloadContext *data) +{ + AVStream *st; + st = avformat_new_stream(ctx, NULL); + if (!st) + return AVERROR(ENOMEM); + st->codecpar->codec_type = AVMEDIA_TYPE_DATA; + st->codecpar->codec_id = AV_CODEC_ID_MPEG2TS; + data->raw = st; + return 0; +} + +static int mpegtsraw_handle_packet(AVFormatContext *ctx, PayloadContext *data, + AVStream *st, AVPacket *pkt, uint32_t *timestamp, + const uint8_t *buf, int len, uint16_t seq, + int flags) +{ + int ret; + + // We don't want to use the RTP timestamps at all. If the mpegts demuxer + // doesn't set any pts/dts, the generic rtpdec code shouldn't try to + // fill it in either, since the mpegts and RTP timestamps are in totally + // different ranges. + *timestamp = RTP_NOTS_VALUE; + + if (!buf || len < 188) { + return AVERROR_INVALIDDATA; + } + + if ((ret = av_new_packet(pkt, len)) < 0) + return ret; + memcpy(pkt->data, buf, len); + pkt->stream_index = data->raw->index; + return 0; +} + +static void mpegtsraw_close_context(PayloadContext *data) +{ + if (!data) + return; + data->raw = NULL; +} + const RTPDynamicProtocolHandler ff_mpegts_dynamic_handler = { .codec_type = AVMEDIA_TYPE_DATA, .priv_data_size = sizeof(PayloadContext), @@ -97,3 +143,12 @@ const RTPDynamicProtocolHandler ff_mpegts_dynamic_handler = { .close = mpegts_close_context, .static_payload_id = 33, }; + +const RTPDynamicProtocolHandler ff_mpegtsraw_dynamic_handler = { + .codec_type = AVMEDIA_TYPE_DATA, + .priv_data_size = sizeof(PayloadContext), + .parse_packet = mpegtsraw_handle_packet, + .init = mpegtsraw_init, + .close = mpegtsraw_close_context, + .static_payload_id = 33, +};