[FFmpeg-devel] [PATCH 2/3] avformat/rtpdec_mpegts: add ff_mpegtsraw_dynamic_handler
Aman Karmani
ffmpeg at tmm1.net
Tue Dec 22 02:35:59 EET 2020
From: Aman Karmani <aman at tmm1.net>
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 <aman at tmm1.net>
---
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,
+};
--
2.29.2
More information about the ffmpeg-devel
mailing list