v0 -> v1: Refactor using GetByteContext; Fix compile error.
This patch adds an MPEG Media Transport Protocol (MMTP) parser, as defined in
ISO/IEC 23008-1, and an MMT protocol over TLV packets (MMT/TLV) demuxer, as
defined in ARIB STD-B32. Currently, it supports HEVC, AAC LATM, and ARIB-TTML
demuxing.
Since MMTP is designed to transmit over IP, there is no size information within
each MMTP packet, and there is no filesystem format defined alongside the
protocol. One industrial solution is a simple container format using
type–length–value packets, which is defined in ARIB STD-B32.
Another known container format for MMTP is using packet capture (pcap) files
which records network packets. This patch does not include the demuxer for this
container format.
Signed-off-by: SuperFashi
---
Changelog|1 +
doc/demuxers.texi|4 +
libavformat/Makefile |1 +
libavformat/allformats.c |1 +
libavformat/mmtp.c | 1375 ++
libavformat/mmtp.h | 61 ++
libavformat/mmttlv.c | 324 +
libavformat/version.h|2 +-
8 files changed, 1768 insertions(+), 1 deletion(-)
create mode 100644 libavformat/mmtp.c
create mode 100644 libavformat/mmtp.h
create mode 100644 libavformat/mmttlv.c
diff --git a/Changelog b/Changelog
index b6f6682904..2483fdd547 100644
--- a/Changelog
+++ b/Changelog
@@ -6,6 +6,7 @@ version :
- Playdate video decoder and demuxer
- Extend VAAPI support for libva-win32 on Windows
- afireqsrc audio source filter
+- MMTP parser and MMT/TLV demuxer
version 6.0:
- Radiance HDR image support
diff --git a/doc/demuxers.texi b/doc/demuxers.texi
index 2d33b47a56..56aab251b2 100644
--- a/doc/demuxers.texi
+++ b/doc/demuxers.texi
@@ -689,6 +689,10 @@ Set the sample rate for libopenmpt to output.
Range is from 1000 to INT_MAX. The value default is 48000.
@end table
+@section mmttlv
+
+Demuxer for MMT protocol over TLV packets (MMT/TLV), as defined in ARIB
STD-B32.
+
@section mov/mp4/3gp
Demuxer for Quicktime File Format & ISO/IEC Base Media File Format (ISO/IEC
14496-12 or MPEG-4 Part 12, ISO/IEC 15444-12 or JPEG 2000 Part 12).
diff --git a/libavformat/Makefile b/libavformat/Makefile
index f8ad7c6a11..e32d6e71a3 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -354,6 +354,7 @@ OBJS-$(CONFIG_MLV_DEMUXER) += mlvdec.o
riffdec.o
OBJS-$(CONFIG_MM_DEMUXER)+= mm.o
OBJS-$(CONFIG_MMF_DEMUXER) += mmf.o
OBJS-$(CONFIG_MMF_MUXER) += mmf.o rawenc.o
+OBJS-$(CONFIG_MMTTLV_DEMUXER)+= mmtp.o mmttlv.o
OBJS-$(CONFIG_MODS_DEMUXER) += mods.o
OBJS-$(CONFIG_MOFLEX_DEMUXER)+= moflex.o
OBJS-$(CONFIG_MOV_DEMUXER) += mov.o mov_chan.o mov_esds.o \
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index efdb34e29d..d5f4f5680e 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -270,6 +270,7 @@ extern const AVInputFormat ff_mlv_demuxer;
extern const AVInputFormat ff_mm_demuxer;
extern const AVInputFormat ff_mmf_demuxer;
extern const FFOutputFormat ff_mmf_muxer;
+extern const AVInputFormat ff_mmttlv_demuxer;
extern const AVInputFormat ff_mods_demuxer;
extern const AVInputFormat ff_moflex_demuxer;
extern const AVInputFormat ff_mov_demuxer;
diff --git a/libavformat/mmtp.c b/libavformat/mmtp.c
new file mode 100644
index 00..a2f98e39f6
--- /dev/null
+++ b/libavformat/mmtp.c
@@ -0,0 +1,1375 @@
+/*
+ * MPEG Media Transport Protocol (MMTP) parser, as defined in ISO/IEC 23008-1.
+ * Copyright (c) 2023 SuperFashi
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "libavutil/mem.h"
+#include "libavutil/avassert.h"
+#include "libavutil/intreadwrite.h"
+#include "libavcodec/bytestream.h"
+#include "network.h"
+#include "mmtp.h"
+#include "internal.h"
+#include "demux.h"
+
+#include
+
+#define AVERROR_INVALIDDATA (abort(), 0)
+
+#define ENSURE_BS_LEFT(bs, size) if (bytestream2_get_bytes_left(bs) < (size))
return AVERROR_INVALIDDATA
+
+struct MMTGeneralLocationInfo {
+uint8_t location_type;
+union {
+struct {
+uint16_t packet_id;
+} type0;
+struct {
+struct in_addr