* [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing
@ 2024-07-03 21:26 James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 02/11] avformat: Add a new stream disposition for multilayer video James Almer
` (11 more replies)
0 siblings, 12 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/mov.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index a3951a6942..30e8086855 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -8157,6 +8157,53 @@ static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return ff_isom_parse_dvcc_dvvc(c->fc, st, buf, read_size);
}
+static int mov_read_lhvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+ AVStream *st;
+ uint8_t *buf;
+ int ret, old_size, num_arrays;
+
+ if (c->fc->nb_streams < 1)
+ return 0;
+ st = c->fc->streams[c->fc->nb_streams-1];
+
+ if (!st->codecpar->extradata_size)
+ // TODO: handle lhvC when present before hvcC
+ return 0;
+
+ if (atom.size < 6 || st->codecpar->extradata_size < 23)
+ return AVERROR_INVALIDDATA;
+
+ buf = av_malloc(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
+ if (!buf)
+ return AVERROR(ENOMEM);
+ memset(buf + atom.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+ ret = ffio_read_size(pb, buf, atom.size);
+ if (ret < 0) {
+ av_free(buf);
+ av_log(c->fc, AV_LOG_WARNING, "lhvC atom truncated\n");
+ return 0;
+ }
+
+ num_arrays = buf[5];
+ old_size = st->codecpar->extradata_size;
+ atom.size -= 8 /* account for mov_realloc_extradata offseting */
+ + 6 /* lhvC bytes before the arrays*/;
+
+ ret = mov_realloc_extradata(st->codecpar, atom);
+ if (ret < 0) {
+ av_free(buf);
+ return ret;
+ }
+
+ st->codecpar->extradata[22] += num_arrays;
+ memcpy(st->codecpar->extradata + old_size, buf + 6, atom.size + 8);
+
+ av_free(buf);
+ return 0;
+}
+
static int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
AVFormatContext *ctx = c->fc;
@@ -8943,6 +8990,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
{ MKTAG('i','p','r','p'), mov_read_iprp },
{ MKTAG('i','i','n','f'), mov_read_iinf },
{ MKTAG('a','m','v','e'), mov_read_amve }, /* ambient viewing environment box */
+{ MKTAG('l','h','v','C'), mov_read_lhvc },
#if CONFIG_IAMFDEC
{ MKTAG('i','a','c','b'), mov_read_iacb },
#endif
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 02/11] avformat: Add a new stream disposition for multilayer video
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 03/11] avformat/mov: Mark streams with a layered HEVC box as multilayer James Almer
` (10 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
From: Derek Buitenhuis <derek.buitenhuis@gmail.com>
This lets us detect when a container has flagged a stream as multilayer.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: James Almer <jamrial@gmail.com>
---
doc/ffprobe.xsd | 1 +
libavformat/avformat.h | 5 +++++
libavformat/dump.c | 2 ++
libavformat/options.c | 3 ++-
libavformat/version.h | 2 +-
tests/ref/fate/cavs-demux | 2 +-
tests/ref/fate/concat-demuxer-extended-lavf-mxf | 2 +-
.../fate/concat-demuxer-extended-lavf-mxf_d10 | 2 +-
tests/ref/fate/concat-demuxer-simple1-lavf-mxf | 4 ++--
.../ref/fate/concat-demuxer-simple1-lavf-mxf_d10 | 4 ++--
tests/ref/fate/concat-demuxer-simple2-lavf-ts | 4 ++--
tests/ref/fate/ffprobe_compact | 6 +++---
tests/ref/fate/ffprobe_csv | 6 +++---
tests/ref/fate/ffprobe_default | 3 +++
tests/ref/fate/ffprobe_flat | 3 +++
tests/ref/fate/ffprobe_ini | 3 +++
tests/ref/fate/ffprobe_json | 9 ++++++---
tests/ref/fate/ffprobe_xml | 6 +++---
tests/ref/fate/ffprobe_xsd | 6 +++---
tests/ref/fate/flv-demux | 4 ++--
tests/ref/fate/gapless-mp3-side-data | 2 +-
| 1 +
| 1 +
tests/ref/fate/iamf-5_1-copy | 8 ++++++++
tests/ref/fate/iamf-5_1-demux | 8 ++++++++
tests/ref/fate/iamf-5_1_4 | 12 ++++++++++++
tests/ref/fate/iamf-7_1_4 | 14 ++++++++++++++
tests/ref/fate/iamf-ambisonic_1 | 8 ++++++++
tests/ref/fate/iamf-stereo | 2 ++
tests/ref/fate/matroska-alac-remux | 1 +
tests/ref/fate/matroska-mpegts-remux | 2 ++
tests/ref/fate/matroska-side-data-pref-codec | 1 +
tests/ref/fate/matroska-side-data-pref-packet | 1 +
tests/ref/fate/matroska-vp8-alpha-remux | 1 +
tests/ref/fate/mov-heic-demux-still-image-grid | 5 +++++
tests/ref/fate/mov-heic-demux-still-image-iovl | 3 +++
tests/ref/fate/mov-heic-demux-still-image-iovl-2 | 2 ++
tests/ref/fate/mov-mp4-disposition-mpegts-remux | 6 ++++--
tests/ref/fate/mov-mp4-iamf-5_1_4 | 14 ++++++++++++++
tests/ref/fate/mov-mp4-iamf-7_1_4 | 16 ++++++++++++++++
tests/ref/fate/mov-mp4-iamf-ambisonic_1 | 10 ++++++++++
tests/ref/fate/mov-mp4-iamf-stereo | 4 ++++
tests/ref/fate/mov-zombie | 2 +-
tests/ref/fate/mxf-probe-applehdr10 | 3 +++
tests/ref/fate/mxf-probe-d10 | 2 ++
tests/ref/fate/mxf-probe-dnxhd | 4 ++++
tests/ref/fate/mxf-probe-dv25 | 3 +++
tests/ref/fate/mxf-probe-j2k | 1 +
tests/ref/fate/oggopus-demux | 2 +-
tests/ref/fate/ts-demux | 6 +++---
tests/ref/fate/ts-opus-demux | 2 +-
tests/ref/fate/ts-small-demux | 2 +-
tests/ref/fate/ts-timed-id3-demux | 2 +-
tests/ref/fate/webm-webvtt-remux | 4 ++++
54 files changed, 193 insertions(+), 39 deletions(-)
diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd
index 6d5d094d97..64e2d88574 100644
--- a/doc/ffprobe.xsd
+++ b/doc/ffprobe.xsd
@@ -255,6 +255,7 @@
<xsd:attribute name="metadata" type="xsd:int" use="required" />
<xsd:attribute name="dependent" type="xsd:int" use="required" />
<xsd:attribute name="still_image" type="xsd:int" use="required" />
+ <xsd:attribute name="multilayer" type="xsd:int" use="required" />
</xsd:complexType>
<xsd:complexType name="streamType">
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 8afdcd9fd0..ef912731ac 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -713,6 +713,11 @@ typedef struct AVIndexEntry {
* The video stream contains still images.
*/
#define AV_DISPOSITION_STILL_IMAGE (1 << 20)
+/**
+ * The video stream contains multiple layers, e.g. stereoscopic views (cf. H.264
+ * Annex G/H, or HEVC Annex F).
+ */
+#define AV_DISPOSITION_MULTILAYER (1 << 21)
/**
* @return The AV_DISPOSITION_* flag corresponding to disp or a negative error
diff --git a/libavformat/dump.c b/libavformat/dump.c
index 7507434f92..0d08c7eb54 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -562,6 +562,8 @@ static void dump_disposition(int disposition, int log_level)
av_log(NULL, log_level, " (still image)");
if (disposition & AV_DISPOSITION_NON_DIEGETIC)
av_log(NULL, log_level, " (non-diegetic)");
+ if (disposition & AV_DISPOSITION_MULTILAYER)
+ av_log(NULL, log_level, " (multilayer)");
}
/* "user interface" functions */
diff --git a/libavformat/options.c b/libavformat/options.c
index 60a73d79b9..ae879b9072 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -219,7 +219,8 @@ const AVClass *avformat_get_class(void)
{ "descriptions", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS }, .unit = "disposition" }, \
{ "metadata", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA }, .unit = "disposition" }, \
{ "dependent", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEPENDENT }, .unit = "disposition" }, \
- { "still_image", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_STILL_IMAGE }, .unit = "disposition" }
+ { "still_image", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_STILL_IMAGE }, .unit = "disposition" }, \
+ { "multilayer", .type = AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_MULTILAYER }, .unit = "disposition" }
static const AVOption stream_options[] = {
DISPOSITION_OPT(AVStream),
diff --git a/libavformat/version.h b/libavformat/version.h
index af7d0a1024..e2634b85ae 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -31,7 +31,7 @@
#include "version_major.h"
-#define LIBAVFORMAT_VERSION_MINOR 4
+#define LIBAVFORMAT_VERSION_MINOR 5
#define LIBAVFORMAT_VERSION_MICRO 100
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
diff --git a/tests/ref/fate/cavs-demux b/tests/ref/fate/cavs-demux
index 016e40e782..059c8bd042 100644
--- a/tests/ref/fate/cavs-demux
+++ b/tests/ref/fate/cavs-demux
@@ -58,5 +58,5 @@ packet|codec_type=video|stream_index=0|pts=2280000|pts_time=1.900000|dts=2280000
packet|codec_type=video|stream_index=0|pts=2320000|pts_time=1.933333|dts=2320000|dts_time=1.933333|duration=40000|duration_time=0.033333|size=67|pos=172185|flags=K__|data_hash=CRC32:42484449
packet|codec_type=video|stream_index=0|pts=2360000|pts_time=1.966667|dts=2360000|dts_time=1.966667|duration=40000|duration_time=0.033333|size=83|pos=172252|flags=K__|data_hash=CRC32:a941bdf0
packet|codec_type=video|stream_index=0|pts=2400000|pts_time=2.000000|dts=2400000|dts_time=2.000000|duration=40000|duration_time=0.033333|size=5417|pos=172335|flags=K__|data_hash=CRC32:9d0d503b
-stream|index=0|codec_name=cavs|profile=unknown|codec_type=video|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=1280|height=720|coded_width=1280|coded_height=720|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=N/A|display_aspect_ratio=N/A|pix_fmt=yuv420p|level=-99|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=unspecified|field_order=unknown|refs=1|id=N/A|r_frame_rate=30/1|avg_frame_rate=25/1|time_base=1/1200000|start_pts=N/A|start_time=N/A|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=60|extradata_size=18|extradata_hash=CRC32:1255d52e|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0
+stream|index=0|codec_name=cavs|profile=unknown|codec_type=video|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=1280|height=720|coded_width=1280|coded_height=720|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=N/A|display_aspect_ratio=N/A|pix_fmt=yuv420p|level=-99|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=unspecified|field_order=unknown|refs=1|id=N/A|r_frame_rate=30/1|avg_frame_rate=25/1|time_base=1/1200000|start_pts=N/A|start_time=N/A|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=60|extradata_size=18|extradata_hash=CRC32:1255d52e|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
format|filename=bunny.mp4|nb_streams=1|nb_programs=0|nb_stream_groups=0|format_name=cavsvideo|start_time=N/A|duration=N/A|size=177752|bit_rate=N/A|probe_score=51
diff --git a/tests/ref/fate/concat-demuxer-extended-lavf-mxf b/tests/ref/fate/concat-demuxer-extended-lavf-mxf
index 1f1b454443..1644c7ebd8 100644
--- a/tests/ref/fate/concat-demuxer-extended-lavf-mxf
+++ b/tests/ref/fate/concat-demuxer-extended-lavf-mxf
@@ -1 +1 @@
-6a6f9fb967044be939c345268cadd7bb *tests/data/fate/concat-demuxer-extended-lavf-mxf.ffprobe
+0e6abc213a400c770c68a32e2144e89a *tests/data/fate/concat-demuxer-extended-lavf-mxf.ffprobe
diff --git a/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10 b/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10
index 93e4846123..ad7db04d49 100644
--- a/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10
+++ b/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10
@@ -1 +1 @@
-05f815e1f45f85456d87030a5c36ebad *tests/data/fate/concat-demuxer-extended-lavf-mxf_d10.ffprobe
+c2477f9b9682ff679e0aba4135da321e *tests/data/fate/concat-demuxer-extended-lavf-mxf_d10.ffprobe
diff --git a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf
index c1afcf71e2..4c9fad3bc9 100644
--- a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf
+++ b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf
@@ -99,5 +99,5 @@ audio|1|63360|1.320000|63360|1.320000|1920|0.040000|3840|190464|K__|1|Strings Me
video|0|33|1.320000|33|1.320000|1|0.040000|12362|195072|___|1|Strings Metadata
audio|1|65280|1.360000|65280|1.360000|1920|0.040000|3840|207872|K__|1|Strings Metadata
video|0|37|1.480000|34|1.360000|1|0.040000|24786|212480|K__|1|Strings Metadata
-0|mpeg2video|4|video|[0][0][0][0]|0x0000|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/25|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|51|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001|CPB properties|0|0|0|49152|-1
-1|pcm_s16le|unknown|audio|[0][0][0][0]|0x0000|s16|48000|1|unknown|16|0|N/A|0/0|0/0|1/48000|0|0.000000|N/A|N/A|768000|N/A|N/A|N/A|N/A|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
+0|mpeg2video|4|video|[0][0][0][0]|0x0000|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/25|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|51|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001|CPB properties|0|0|0|49152|-1
+1|pcm_s16le|unknown|audio|[0][0][0][0]|0x0000|s16|48000|1|unknown|16|0|N/A|0/0|0/0|1/48000|0|0.000000|N/A|N/A|768000|N/A|N/A|N/A|N/A|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
diff --git a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10 b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10
index a8f2dfe3f0..74c32e9dc5 100644
--- a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10
+++ b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10
@@ -68,5 +68,5 @@ video|0|33|1.320000|33|1.320000|1|0.040000|150000|1711104|K__|1|Strings Metadata
audio|1|63360|1.320000|63360|1.320000|1920|0.040000|7680|1861632|K__|1|Strings Metadata
video|0|34|1.360000|34|1.360000|1|0.040000|150000|1924096|K__|1|Strings Metadata
audio|1|65280|1.360000|65280|1.360000|1920|0.040000|7680|2074624|K__|1|Strings Metadata
-0|mpeg2video|0|video|[0][0][0][0]|0x0000|720|608|0|0|0|0|0|1:1|45:38|yuv422p|5|tv|unknown|unknown|unknown|topleft|tt|1|N/A|25/1|25/1|1/25|0|0.000000|N/A|N/A|30000000|N/A|N/A|N/A|N/A|35|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001|CPB properties|30000000|0|0|1212416|-1
-1|pcm_s16le|unknown|audio|[0][0][0][0]|0x0000|s16|48000|2|unknown|16|0|N/A|0/0|0/0|1/48000|0|0.000000|N/A|N/A|1536000|N/A|N/A|N/A|N/A|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
+0|mpeg2video|0|video|[0][0][0][0]|0x0000|720|608|0|0|0|0|0|1:1|45:38|yuv422p|5|tv|unknown|unknown|unknown|topleft|tt|1|N/A|25/1|25/1|1/25|0|0.000000|N/A|N/A|30000000|N/A|N/A|N/A|N/A|35|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001|CPB properties|30000000|0|0|1212416|-1
+1|pcm_s16le|unknown|audio|[0][0][0][0]|0x0000|s16|48000|2|unknown|16|0|N/A|0/0|0/0|1/48000|0|0.000000|N/A|N/A|1536000|N/A|N/A|N/A|N/A|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
index 548cab01c6..30447f7fc8 100644
--- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
+++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
@@ -147,5 +147,5 @@ video|1|164782|1.830911|161182|1.790911|3600|0.040000|12282|168448|___|MPEGTS St
video|1|168382|1.870911|164782|1.830911|3600|0.040000|24786|181420|K__|MPEGTS Stream ID|224
video|1|171982|1.910911|168382|1.870911|3600|0.040000|17440|206988|___|MPEGTS Stream ID|224
video|1|175582|1.950911|171982|1.910911|3600|0.040000|15019|224848|___|MPEGTS Stream ID|224
-0|mp2|unknown|audio|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this is stream 0
-1|mpeg2video|4|video|[2][0][0][0]|0x0002|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this is stream 1|CPB properties|0|0|0|49152|-1
+0|mp2|unknown|audio|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this is stream 0
+1|mpeg2video|4|video|[2][0][0][0]|0x0002|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this is stream 1|CPB properties|0|0|0|49152|-1
diff --git a/tests/ref/fate/ffprobe_compact b/tests/ref/fate/ffprobe_compact
index 3cda8550db..25632fd179 100644
--- a/tests/ref/fate/ffprobe_compact
+++ b/tests/ref/fate/ffprobe_compact
@@ -26,7 +26,7 @@ packet|codec_type=video|stream_index=1|pts=6144|pts_time=0.120000|dts=6144|dts_t
frame|media_type=video|stream_index=1|key_frame=1|pts=6144|pts_time=0.120000|pkt_dts=6144|pkt_dts_time=0.120000|best_effort_timestamp=6144|best_effort_timestamp_time=0.120000|duration=2048|duration_time=0.040000|pkt_pos=793142|pkt_size=230400|width=320|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=unknown|color_space=unknown|color_primaries=unknown|color_transfer=unknown|chroma_location=unspecified
packet|codec_type=video|stream_index=2|pts=6144|pts_time=0.120000|dts=6144|dts_time=0.120000|duration=2048|duration_time=0.040000|size=30000|pos=1023566|flags=K__
frame|media_type=video|stream_index=2|key_frame=1|pts=6144|pts_time=0.120000|pkt_dts=6144|pkt_dts_time=0.120000|best_effort_timestamp=6144|best_effort_timestamp_time=0.120000|duration=2048|duration_time=0.040000|pkt_pos=1023566|pkt_size=30000|width=100|height=100|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=unknown|color_space=unknown|color_primaries=unknown|color_transfer=unknown|chroma_location=unspecified
-stream|index=0|codec_name=pcm_s16le|profile=unknown|codec_type=audio|codec_tag_string=PSD[16]|codec_tag=0x10445350|sample_fmt=s16|sample_rate=44100|channels=1|channel_layout=unknown|bits_per_sample=16|initial_padding=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/44100|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=705600|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=6|nb_read_packets=6|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:E=mc²|tag:encoder=Lavc pcm_s16le
-stream|index=1|codec_name=rawvideo|profile=unknown|codec_type=video|codec_tag_string=RGB[24]|codec_tag=0x18424752|width=320|height=240|coded_width=320|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=1:1|display_aspect_ratio=4:3|pix_fmt=rgb24|level=-99|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=unspecified|field_order=unknown|refs=1|id=N/A|r_frame_rate=25/1|avg_frame_rate=25/1|time_base=1/51200|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=4|nb_read_packets=4|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:title=foobar|tag:duration_ts=field-and-tags-conflict-attempt|tag:encoder=Lavc rawvideo
-stream|index=2|codec_name=rawvideo|profile=unknown|codec_type=video|codec_tag_string=RGB[24]|codec_tag=0x18424752|width=100|height=100|coded_width=100|coded_height=100|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=1:1|display_aspect_ratio=1:1|pix_fmt=rgb24|level=-99|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=unspecified|field_order=unknown|refs=1|id=N/A|r_frame_rate=25/1|avg_frame_rate=25/1|time_base=1/51200|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=4|nb_read_packets=4|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:encoder=Lavc rawvideo
+stream|index=0|codec_name=pcm_s16le|profile=unknown|codec_type=audio|codec_tag_string=PSD[16]|codec_tag=0x10445350|sample_fmt=s16|sample_rate=44100|channels=1|channel_layout=unknown|bits_per_sample=16|initial_padding=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/44100|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=705600|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=6|nb_read_packets=6|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:E=mc²|tag:encoder=Lavc pcm_s16le
+stream|index=1|codec_name=rawvideo|profile=unknown|codec_type=video|codec_tag_string=RGB[24]|codec_tag=0x18424752|width=320|height=240|coded_width=320|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=1:1|display_aspect_ratio=4:3|pix_fmt=rgb24|level=-99|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=unspecified|field_order=unknown|refs=1|id=N/A|r_frame_rate=25/1|avg_frame_rate=25/1|time_base=1/51200|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=4|nb_read_packets=4|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:title=foobar|tag:duration_ts=field-and-tags-conflict-attempt|tag:encoder=Lavc rawvideo
+stream|index=2|codec_name=rawvideo|profile=unknown|codec_type=video|codec_tag_string=RGB[24]|codec_tag=0x18424752|width=100|height=100|coded_width=100|coded_height=100|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=1:1|display_aspect_ratio=1:1|pix_fmt=rgb24|level=-99|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=unspecified|field_order=unknown|refs=1|id=N/A|r_frame_rate=25/1|avg_frame_rate=25/1|time_base=1/51200|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=4|nb_read_packets=4|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:encoder=Lavc rawvideo
format|filename=tests/data/ffprobe-test.nut|nb_streams=3|nb_programs=0|nb_stream_groups=0|format_name=nut|start_time=0.000000|duration=0.120000|size=1053646|bit_rate=70243066|probe_score=100|tag:title=ffprobe test file|tag:comment='A comment with CSV, XML & JSON special chars': <tag value="x">|tag:comment2=I ♥ Üñîçød€
diff --git a/tests/ref/fate/ffprobe_csv b/tests/ref/fate/ffprobe_csv
index 5dcb403156..defe72d4c4 100644
--- a/tests/ref/fate/ffprobe_csv
+++ b/tests/ref/fate/ffprobe_csv
@@ -26,7 +26,7 @@ packet,video,1,6144,0.120000,6144,0.120000,2048,0.040000,230400,793142,K__
frame,video,1,1,6144,0.120000,6144,0.120000,6144,0.120000,2048,0.040000,793142,230400,320,240,0,0,0,0,rgb24,1:1,I,0,0,0,unknown,unknown,unknown,unknown,unspecified
packet,video,2,6144,0.120000,6144,0.120000,2048,0.040000,30000,1023566,K__
frame,video,2,1,6144,0.120000,6144,0.120000,6144,0.120000,2048,0.040000,1023566,30000,100,100,0,0,0,0,rgb24,1:1,I,0,0,0,unknown,unknown,unknown,unknown,unspecified
-stream,0,pcm_s16le,unknown,audio,PSD[16],0x10445350,s16,44100,1,unknown,16,0,N/A,0/0,0/0,1/44100,0,0.000000,N/A,N/A,705600,N/A,N/A,N/A,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,mc²,Lavc pcm_s16le
-stream,1,rawvideo,unknown,video,RGB[24],0x18424752,320,240,320,240,0,0,0,1:1,4:3,rgb24,-99,unknown,unknown,unknown,unknown,unspecified,unknown,1,N/A,25/1,25/1,1/51200,0,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,foobar,field-and-tags-conflict-attempt,Lavc rawvideo
-stream,2,rawvideo,unknown,video,RGB[24],0x18424752,100,100,100,100,0,0,0,1:1,1:1,rgb24,-99,unknown,unknown,unknown,unknown,unspecified,unknown,1,N/A,25/1,25/1,1/51200,0,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Lavc rawvideo
+stream,0,pcm_s16le,unknown,audio,PSD[16],0x10445350,s16,44100,1,unknown,16,0,N/A,0/0,0/0,1/44100,0,0.000000,N/A,N/A,705600,N/A,N/A,N/A,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,mc²,Lavc pcm_s16le
+stream,1,rawvideo,unknown,video,RGB[24],0x18424752,320,240,320,240,0,0,0,1:1,4:3,rgb24,-99,unknown,unknown,unknown,unknown,unspecified,unknown,1,N/A,25/1,25/1,1/51200,0,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,foobar,field-and-tags-conflict-attempt,Lavc rawvideo
+stream,2,rawvideo,unknown,video,RGB[24],0x18424752,100,100,100,100,0,0,0,1:1,1:1,rgb24,-99,unknown,unknown,unknown,unknown,unspecified,unknown,1,N/A,25/1,25/1,1/51200,0,0.000000,N/A,N/A,N/A,N/A,N/A,N/A,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Lavc rawvideo
format,tests/data/ffprobe-test.nut,3,0,0,nut,0.000000,0.120000,1053646,70243066,100,ffprobe test file,"'A comment with CSV, XML & JSON special chars': <tag value=""x"">",I ♥ Üñîçød€
diff --git a/tests/ref/fate/ffprobe_default b/tests/ref/fate/ffprobe_default
index 74c70e55d4..ac55749295 100644
--- a/tests/ref/fate/ffprobe_default
+++ b/tests/ref/fate/ffprobe_default
@@ -595,6 +595,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:E=mc²
TAG:encoder=Lavc pcm_s16le
[/STREAM]
@@ -655,6 +656,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:title=foobar
TAG:duration_ts=field-and-tags-conflict-attempt
TAG:encoder=Lavc rawvideo
@@ -716,6 +718,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:encoder=Lavc rawvideo
[/STREAM]
[FORMAT]
diff --git a/tests/ref/fate/ffprobe_flat b/tests/ref/fate/ffprobe_flat
index 5a858aab81..e1aefe6afb 100644
--- a/tests/ref/fate/ffprobe_flat
+++ b/tests/ref/fate/ffprobe_flat
@@ -538,6 +538,7 @@ streams.stream.0.disposition.descriptions=0
streams.stream.0.disposition.metadata=0
streams.stream.0.disposition.dependent=0
streams.stream.0.disposition.still_image=0
+streams.stream.0.disposition.multilayer=0
streams.stream.0.tags.E="mc²"
streams.stream.0.tags.encoder="Lavc pcm_s16le"
streams.stream.1.index=1
@@ -596,6 +597,7 @@ streams.stream.1.disposition.descriptions=0
streams.stream.1.disposition.metadata=0
streams.stream.1.disposition.dependent=0
streams.stream.1.disposition.still_image=0
+streams.stream.1.disposition.multilayer=0
streams.stream.1.tags.title="foobar"
streams.stream.1.tags.duration_ts="field-and-tags-conflict-attempt"
streams.stream.1.tags.encoder="Lavc rawvideo"
@@ -655,6 +657,7 @@ streams.stream.2.disposition.descriptions=0
streams.stream.2.disposition.metadata=0
streams.stream.2.disposition.dependent=0
streams.stream.2.disposition.still_image=0
+streams.stream.2.disposition.multilayer=0
streams.stream.2.tags.encoder="Lavc rawvideo"
format.filename="tests/data/ffprobe-test.nut"
format.nb_streams=3
diff --git a/tests/ref/fate/ffprobe_ini b/tests/ref/fate/ffprobe_ini
index 6740775959..4d046539d6 100644
--- a/tests/ref/fate/ffprobe_ini
+++ b/tests/ref/fate/ffprobe_ini
@@ -599,6 +599,7 @@ descriptions=0
metadata=0
dependent=0
still_image=0
+multilayer=0
[streams.stream.0.tags]
E=mc²
@@ -663,6 +664,7 @@ descriptions=0
metadata=0
dependent=0
still_image=0
+multilayer=0
[streams.stream.1.tags]
title=foobar
@@ -728,6 +730,7 @@ descriptions=0
metadata=0
dependent=0
still_image=0
+multilayer=0
[streams.stream.2.tags]
encoder=Lavc rawvideo
diff --git a/tests/ref/fate/ffprobe_json b/tests/ref/fate/ffprobe_json
index 9de2f646ea..5583063eb4 100644
--- a/tests/ref/fate/ffprobe_json
+++ b/tests/ref/fate/ffprobe_json
@@ -573,7 +573,8 @@
"descriptions": 0,
"metadata": 0,
"dependent": 0,
- "still_image": 0
+ "still_image": 0,
+ "multilayer": 0
},
"tags": {
"E": "mc²",
@@ -623,7 +624,8 @@
"descriptions": 0,
"metadata": 0,
"dependent": 0,
- "still_image": 0
+ "still_image": 0,
+ "multilayer": 0
},
"tags": {
"title": "foobar",
@@ -674,7 +676,8 @@
"descriptions": 0,
"metadata": 0,
"dependent": 0,
- "still_image": 0
+ "still_image": 0,
+ "multilayer": 0
},
"tags": {
"encoder": "Lavc rawvideo"
diff --git a/tests/ref/fate/ffprobe_xml b/tests/ref/fate/ffprobe_xml
index 988cfe5f39..3b41121902 100644
--- a/tests/ref/fate/ffprobe_xml
+++ b/tests/ref/fate/ffprobe_xml
@@ -33,14 +33,14 @@
<streams>
<stream index="0" codec_name="pcm_s16le" codec_type="audio" codec_tag_string="PSD[16]" codec_tag="0x10445350" sample_fmt="s16" sample_rate="44100" channels="1" bits_per_sample="16" initial_padding="0" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/44100" start_pts="0" start_time="0.000000" bit_rate="705600" nb_read_frames="6" nb_read_packets="6">
- <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
+ <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0" multilayer="0"/>
<tags>
<tag key="E" value="mc²"/>
<tag key="encoder" value="Lavc pcm_s16le"/>
</tags>
</stream>
<stream index="1" codec_name="rawvideo" codec_type="video" codec_tag_string="RGB[24]" codec_tag="0x18424752" width="320" height="240" coded_width="320" coded_height="240" closed_captions="0" film_grain="0" has_b_frames="0" sample_aspect_ratio="1:1" display_aspect_ratio="4:3" pix_fmt="rgb24" level="-99" refs="1" r_frame_rate="25/1" avg_frame_rate="25/1" time_base="1/51200" start_pts="0" start_time="0.000000" nb_read_frames="4" nb_read_packets="4">
- <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
+ <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0" multilayer="0"/>
<tags>
<tag key="title" value="foobar"/>
<tag key="duration_ts" value="field-and-tags-conflict-attempt"/>
@@ -48,7 +48,7 @@
</tags>
</stream>
<stream index="2" codec_name="rawvideo" codec_type="video" codec_tag_string="RGB[24]" codec_tag="0x18424752" width="100" height="100" coded_width="100" coded_height="100" closed_captions="0" film_grain="0" has_b_frames="0" sample_aspect_ratio="1:1" display_aspect_ratio="1:1" pix_fmt="rgb24" level="-99" refs="1" r_frame_rate="25/1" avg_frame_rate="25/1" time_base="1/51200" start_pts="0" start_time="0.000000" nb_read_frames="4" nb_read_packets="4">
- <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
+ <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0" multilayer="0"/>
<tags>
<tag key="encoder" value="Lavc rawvideo"/>
</tags>
diff --git a/tests/ref/fate/ffprobe_xsd b/tests/ref/fate/ffprobe_xsd
index c37bb8a22d..d5eb0a3a46 100644
--- a/tests/ref/fate/ffprobe_xsd
+++ b/tests/ref/fate/ffprobe_xsd
@@ -33,14 +33,14 @@
<streams>
<stream index="0" codec_name="pcm_s16le" codec_type="audio" codec_tag_string="PSD[16]" codec_tag="0x10445350" sample_fmt="s16" sample_rate="44100" channels="1" bits_per_sample="16" initial_padding="0" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/44100" start_pts="0" start_time="0.000000" bit_rate="705600" nb_read_frames="6" nb_read_packets="6">
- <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
+ <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0" multilayer="0"/>
<tags>
<tag key="E" value="mc²"/>
<tag key="encoder" value="Lavc pcm_s16le"/>
</tags>
</stream>
<stream index="1" codec_name="rawvideo" codec_type="video" codec_tag_string="RGB[24]" codec_tag="0x18424752" width="320" height="240" coded_width="320" coded_height="240" closed_captions="0" film_grain="0" has_b_frames="0" sample_aspect_ratio="1:1" display_aspect_ratio="4:3" pix_fmt="rgb24" level="-99" refs="1" r_frame_rate="25/1" avg_frame_rate="25/1" time_base="1/51200" start_pts="0" start_time="0.000000" nb_read_frames="4" nb_read_packets="4">
- <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
+ <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0" multilayer="0"/>
<tags>
<tag key="title" value="foobar"/>
<tag key="duration_ts" value="field-and-tags-conflict-attempt"/>
@@ -48,7 +48,7 @@
</tags>
</stream>
<stream index="2" codec_name="rawvideo" codec_type="video" codec_tag_string="RGB[24]" codec_tag="0x18424752" width="100" height="100" coded_width="100" coded_height="100" closed_captions="0" film_grain="0" has_b_frames="0" sample_aspect_ratio="1:1" display_aspect_ratio="1:1" pix_fmt="rgb24" level="-99" refs="1" r_frame_rate="25/1" avg_frame_rate="25/1" time_base="1/51200" start_pts="0" start_time="0.000000" nb_read_frames="4" nb_read_packets="4">
- <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
+ <disposition default="0" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" non_diegetic="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0" multilayer="0"/>
<tags>
<tag key="encoder" value="Lavc rawvideo"/>
</tags>
diff --git a/tests/ref/fate/flv-demux b/tests/ref/fate/flv-demux
index a9cbcc46e0..4e959e091e 100644
--- a/tests/ref/fate/flv-demux
+++ b/tests/ref/fate/flv-demux
@@ -601,6 +601,6 @@ packet|codec_type=video|stream_index=0|pts=11612|pts_time=11.612000|dts=11612|dt
packet|codec_type=video|stream_index=0|pts=11645|pts_time=11.645000|dts=11645|dts_time=11.645000|duration=33|duration_time=0.033000|size=2600|pos=507811|flags=___|data_hash=CRC32:d35f9e6f
packet|codec_type=audio|stream_index=1|pts=11656|pts_time=11.656000|dts=11656|dts_time=11.656000|duration=46|duration_time=0.046000|size=346|pos=510431|flags=K__|data_hash=CRC32:4e6b44cb
packet|codec_type=video|stream_index=0|pts=11678|pts_time=11.678000|dts=11678|dts_time=11.678000|duration=33|duration_time=0.033000|size=1190|pos=510794|flags=__C|data_hash=CRC32:a0206c90
-stream|index=0|codec_name=h264|profile=77|codec_type=video|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=426|height=240|coded_width=426|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=71:40|pix_fmt=yuv420p|level=21|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|is_avc=true|nal_length_size=4|missing_streams=0|id=N/A|r_frame_rate=30000/1001|avg_frame_rate=30/1|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=393929|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=351|extradata_size=39|extradata_hash=CRC32:07b85ca9|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0
-stream|index=1|codec_name=aac|profile=1|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=22050|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|missing_streams=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=67874|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=252|extradata_size=2|extradata_hash=CRC32:d039c029|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0
+stream|index=0|codec_name=h264|profile=77|codec_type=video|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|width=426|height=240|coded_width=426|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=71:40|pix_fmt=yuv420p|level=21|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|is_avc=true|nal_length_size=4|missing_streams=0|id=N/A|r_frame_rate=30000/1001|avg_frame_rate=30/1|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=393929|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=351|extradata_size=39|extradata_hash=CRC32:07b85ca9|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
+stream|index=1|codec_name=aac|profile=1|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=22050|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|missing_streams=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/1000|start_pts=0|start_time=0.000000|duration_ts=N/A|duration=N/A|bit_rate=67874|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=252|extradata_size=2|extradata_hash=CRC32:d039c029|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
format|filename=Enigma_Principles_of_Lust-part.flv|nb_streams=2|nb_programs=0|nb_stream_groups=0|format_name=flv|start_time=0.000000|duration=210.209999|size=512000|bit_rate=19485|probe_score=100|tag:hasKeyframes=true|tag:hasMetadata=true|tag:datasize=11970544|tag:hasVideo=true|tag:canSeekToEnd=false|tag:lasttimestamp=210|tag:lastkeyframetimestamp=210|tag:audiosize=1791332|tag:hasAudio=true|tag:audiodelay=0|tag:videosize=10176110|tag:metadatadate=2011-02-27T11:00:33.125000Z|tag:metadatacreator=inlet media FLVTool2 v1.0.6 - http://www.inlet-media.de/flvtool2|tag:hasCuePoints=false
diff --git a/tests/ref/fate/gapless-mp3-side-data b/tests/ref/fate/gapless-mp3-side-data
index 87a99661f9..49ebc32dc8 100644
--- a/tests/ref/fate/gapless-mp3-side-data
+++ b/tests/ref/fate/gapless-mp3-side-data
@@ -593,5 +593,5 @@ packet|codec_type=audio|stream_index=0|pts=217866240|pts_time=15.438367|dts=2178
packet|codec_type=audio|stream_index=0|pts=218234880|pts_time=15.464490|dts=218234880|dts_time=15.464490|duration=368640|duration_time=0.026122|size=418|pos=248882|flags=K__|data_hash=CRC32:fbc83c3c
packet|codec_type=audio|stream_index=0|pts=218603520|pts_time=15.490612|dts=218603520|dts_time=15.490612|duration=368640|duration_time=0.026122|size=418|pos=249300|flags=K__|data_hash=CRC32:d5fb5f9c|side_datum/skip_samples:side_data_type=Skip Samples|side_datum/skip_samples:skip_samples=0|side_datum/skip_samples:discard_padding=303|side_datum/skip_samples:skip_reason=0|side_datum/skip_samples:discard_reason=0
packet|codec_type=audio|stream_index=0|pts=218972160|pts_time=15.516735|dts=218972160|dts_time=15.516735|duration=368640|duration_time=0.026122|size=418|pos=249718|flags=K__|data_hash=CRC32:3789f3cf|side_datum/skip_samples:side_data_type=Skip Samples|side_datum/skip_samples:skip_samples=0|side_datum/skip_samples:discard_padding=1152|side_datum/skip_samples:skip_reason=0|side_datum/skip_samples:discard_reason=0
-stream|index=0|codec_name=mp3|profile=unknown|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=44100|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/14112000|start_pts=353600|start_time=0.025057|duration_ts=219340800|duration=15.542857|bit_rate=128000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=595|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:encoder=LAME3.93
+stream|index=0|codec_name=mp3|profile=unknown|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=44100|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/14112000|start_pts=353600|start_time=0.025057|duration_ts=219340800|duration=15.542857|bit_rate=128000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=595|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:encoder=LAME3.93
format|filename=gapless.mp3|nb_streams=1|nb_programs=0|nb_stream_groups=0|format_name=mp3|start_time=0.025057|duration=15.542857|size=250264|bit_rate=128812|probe_score=51|tag:title=test
--git a/tests/ref/fate/hapqa-extract-nosnappy-to-hapalphaonly-mov b/tests/ref/fate/hapqa-extract-nosnappy-to-hapalphaonly-mov
index 50dfed6e4d..7ecba80e0e 100644
--- a/tests/ref/fate/hapqa-extract-nosnappy-to-hapalphaonly-mov
+++ b/tests/ref/fate/hapqa-extract-nosnappy-to-hapalphaonly-mov
@@ -69,6 +69,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=eng
TAG:handler_name=Module de gestion video
TAG:vendor_id=FFMP
--git a/tests/ref/fate/hapqa-extract-nosnappy-to-hapq-mov b/tests/ref/fate/hapqa-extract-nosnappy-to-hapq-mov
index 79e3731a37..24369cce27 100644
--- a/tests/ref/fate/hapqa-extract-nosnappy-to-hapq-mov
+++ b/tests/ref/fate/hapqa-extract-nosnappy-to-hapq-mov
@@ -69,6 +69,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=eng
TAG:handler_name=Module de gestion video
TAG:vendor_id=FFMP
diff --git a/tests/ref/fate/iamf-5_1-copy b/tests/ref/fate/iamf-5_1-copy
index d3530702ee..bc4df7c57f 100644
--- a/tests/ref/fate/iamf-5_1-copy
+++ b/tests/ref/fate/iamf-5_1-copy
@@ -88,6 +88,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -110,6 +111,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -132,6 +134,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -154,6 +157,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -235,6 +239,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -257,6 +262,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -279,6 +285,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -301,5 +308,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/iamf-5_1-demux b/tests/ref/fate/iamf-5_1-demux
index d3530702ee..bc4df7c57f 100644
--- a/tests/ref/fate/iamf-5_1-demux
+++ b/tests/ref/fate/iamf-5_1-demux
@@ -88,6 +88,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -110,6 +111,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -132,6 +134,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -154,6 +157,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -235,6 +239,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -257,6 +262,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -279,6 +285,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -301,5 +308,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/iamf-5_1_4 b/tests/ref/fate/iamf-5_1_4
index d516429d5d..fdee50b8e0 100644
--- a/tests/ref/fate/iamf-5_1_4
+++ b/tests/ref/fate/iamf-5_1_4
@@ -160,6 +160,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -182,6 +183,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -204,6 +206,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -226,6 +229,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -248,6 +252,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -270,6 +275,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -367,6 +373,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -389,6 +396,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -411,6 +419,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -433,6 +442,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -455,6 +465,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -477,5 +488,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/iamf-7_1_4 b/tests/ref/fate/iamf-7_1_4
index 4e6e62bbea..ccce96ea84 100644
--- a/tests/ref/fate/iamf-7_1_4
+++ b/tests/ref/fate/iamf-7_1_4
@@ -176,6 +176,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -198,6 +199,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -220,6 +222,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -242,6 +245,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -264,6 +268,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -286,6 +291,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=6
@@ -308,6 +314,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -405,6 +412,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -427,6 +435,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -449,6 +458,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -471,6 +481,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -493,6 +504,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -515,6 +527,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=6
@@ -537,5 +550,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/iamf-ambisonic_1 b/tests/ref/fate/iamf-ambisonic_1
index 84683b6ce5..e43f891597 100644
--- a/tests/ref/fate/iamf-ambisonic_1
+++ b/tests/ref/fate/iamf-ambisonic_1
@@ -99,6 +99,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -121,6 +122,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -143,6 +145,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -165,6 +168,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -238,6 +242,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -260,6 +265,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -282,6 +288,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -304,5 +311,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/iamf-stereo b/tests/ref/fate/iamf-stereo
index 32fe47bf98..9b3f7e0a79 100644
--- a/tests/ref/fate/iamf-stereo
+++ b/tests/ref/fate/iamf-stereo
@@ -52,6 +52,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -164,5 +165,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/matroska-alac-remux b/tests/ref/fate/matroska-alac-remux
index 1c27c625a4..9b73263acd 100644
--- a/tests/ref/fate/matroska-alac-remux
+++ b/tests/ref/fate/matroska-alac-remux
@@ -153,6 +153,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[FORMAT]
TAG:title=Inside
diff --git a/tests/ref/fate/matroska-mpegts-remux b/tests/ref/fate/matroska-mpegts-remux
index 24fdf8f3f8..491e255d75 100644
--- a/tests/ref/fate/matroska-mpegts-remux
+++ b/tests/ref/fate/matroska-mpegts-remux
@@ -38,6 +38,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -59,4 +60,5 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
diff --git a/tests/ref/fate/matroska-side-data-pref-codec b/tests/ref/fate/matroska-side-data-pref-codec
index 128ecdd423..2b67c0191f 100644
--- a/tests/ref/fate/matroska-side-data-pref-codec
+++ b/tests/ref/fate/matroska-side-data-pref-codec
@@ -310,6 +310,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=spa
TAG:BPS-eng=216040
TAG:DURATION-eng=00:00:00.400000000
diff --git a/tests/ref/fate/matroska-side-data-pref-packet b/tests/ref/fate/matroska-side-data-pref-packet
index a433ece6f4..b3b9427864 100644
--- a/tests/ref/fate/matroska-side-data-pref-packet
+++ b/tests/ref/fate/matroska-side-data-pref-packet
@@ -310,6 +310,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=spa
TAG:BPS-eng=216040
TAG:DURATION-eng=00:00:00.400000000
diff --git a/tests/ref/fate/matroska-vp8-alpha-remux b/tests/ref/fate/matroska-vp8-alpha-remux
index 6d2c18363d..03bb01fdb7 100644
--- a/tests/ref/fate/matroska-vp8-alpha-remux
+++ b/tests/ref/fate/matroska-vp8-alpha-remux
@@ -31,6 +31,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[SIDE_DATA]
side_data_type=Stereo 3D
type=2D
diff --git a/tests/ref/fate/mov-heic-demux-still-image-grid b/tests/ref/fate/mov-heic-demux-still-image-grid
index d8dfccea8f..f7d0b178e1 100644
--- a/tests/ref/fate/mov-heic-demux-still-image-grid
+++ b/tests/ref/fate/mov-heic-demux-still-image-grid
@@ -78,6 +78,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:title=Derived image
[STREAM]
index=0
@@ -100,6 +101,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -122,6 +124,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -144,6 +147,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -166,5 +170,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/mov-heic-demux-still-image-iovl b/tests/ref/fate/mov-heic-demux-still-image-iovl
index 2b211267a4..4a90220c34 100644
--- a/tests/ref/fate/mov-heic-demux-still-image-iovl
+++ b/tests/ref/fate/mov-heic-demux-still-image-iovl
@@ -54,6 +54,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:title=Derived image
[STREAM]
index=0
@@ -76,6 +77,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -98,5 +100,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/mov-heic-demux-still-image-iovl-2 b/tests/ref/fate/mov-heic-demux-still-image-iovl-2
index 492f404a3c..3ee119ff6f 100644
--- a/tests/ref/fate/mov-heic-demux-still-image-iovl-2
+++ b/tests/ref/fate/mov-heic-demux-still-image-iovl-2
@@ -47,6 +47,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:title=Derived image
[STREAM]
index=0
@@ -69,5 +70,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/mov-mp4-disposition-mpegts-remux b/tests/ref/fate/mov-mp4-disposition-mpegts-remux
index 3d103c98cf..a06ef7cef8 100644
--- a/tests/ref/fate/mov-mp4-disposition-mpegts-remux
+++ b/tests/ref/fate/mov-mp4-disposition-mpegts-remux
@@ -44,7 +44,8 @@ adb3b95c07a5f3e0c86641dd62f01dae *tests/data/fate/mov-mp4-disposition-mpegts-rem
"descriptions": 0,
"metadata": 0,
"dependent": 0,
- "still_image": 0
+ "still_image": 0,
+ "multilayer": 0
},
"side_data_list": [
{
@@ -72,7 +73,8 @@ adb3b95c07a5f3e0c86641dd62f01dae *tests/data/fate/mov-mp4-disposition-mpegts-rem
"descriptions": 1,
"metadata": 0,
"dependent": 0,
- "still_image": 0
+ "still_image": 0,
+ "multilayer": 0
},
"side_data_list": [
{
diff --git a/tests/ref/fate/mov-mp4-iamf-5_1_4 b/tests/ref/fate/mov-mp4-iamf-5_1_4
index 36a94143b5..afaa620621 100644
--- a/tests/ref/fate/mov-mp4-iamf-5_1_4
+++ b/tests/ref/fate/mov-mp4-iamf-5_1_4
@@ -157,6 +157,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -181,6 +182,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -203,6 +205,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -225,6 +228,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -247,6 +251,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -269,6 +274,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -291,6 +297,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -385,6 +392,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -409,6 +417,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -431,6 +440,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -453,6 +463,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -475,6 +486,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -497,6 +509,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -519,5 +532,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/mov-mp4-iamf-7_1_4 b/tests/ref/fate/mov-mp4-iamf-7_1_4
index d5014387b6..e8b859121d 100644
--- a/tests/ref/fate/mov-mp4-iamf-7_1_4
+++ b/tests/ref/fate/mov-mp4-iamf-7_1_4
@@ -173,6 +173,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -197,6 +198,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -219,6 +221,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -241,6 +244,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -263,6 +267,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -285,6 +290,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -307,6 +313,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=6
@@ -329,6 +336,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -423,6 +431,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -447,6 +456,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -469,6 +479,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -491,6 +502,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -513,6 +525,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=4
@@ -535,6 +548,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=5
@@ -557,6 +571,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=6
@@ -579,5 +594,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/mov-mp4-iamf-ambisonic_1 b/tests/ref/fate/mov-mp4-iamf-ambisonic_1
index 088fc9a028..8de90c868f 100644
--- a/tests/ref/fate/mov-mp4-iamf-ambisonic_1
+++ b/tests/ref/fate/mov-mp4-iamf-ambisonic_1
@@ -96,6 +96,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -120,6 +121,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -142,6 +144,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -164,6 +167,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -186,6 +190,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -256,6 +261,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -280,6 +286,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -302,6 +309,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -324,6 +332,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -346,5 +355,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=1
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/mov-mp4-iamf-stereo b/tests/ref/fate/mov-mp4-iamf-stereo
index bf141c6755..32027e6daf 100644
--- a/tests/ref/fate/mov-mp4-iamf-stereo
+++ b/tests/ref/fate/mov-mp4-iamf-stereo
@@ -49,6 +49,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -73,6 +74,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
[STREAM_GROUP]
@@ -182,6 +184,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:language=und
TAG:handler_name=SoundHandler
TAG:vendor_id=[0][0][0][0]
@@ -206,5 +209,6 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[/STREAM_GROUP]
diff --git a/tests/ref/fate/mov-zombie b/tests/ref/fate/mov-zombie
index 0ff447ef40..10476bc49f 100644
--- a/tests/ref/fate/mov-zombie
+++ b/tests/ref/fate/mov-zombie
@@ -129,4 +129,4 @@ packet|codec_type=video|stream_index=0|pts=188623|pts_time=2.095811|dts=188622|d
frame|media_type=video|stream_index=0|key_frame=0|pts=188623|pts_time=2.095811|pkt_dts=188622|pkt_dts_time=2.095800|best_effort_timestamp=188623|best_effort_timestamp_time=2.095811|duration=3003|duration_time=0.033367|pkt_pos=100846|pkt_size=974|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=B|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] User Data Unregistered SEI message
packet|codec_type=video|stream_index=0|pts=197632|pts_time=2.195911|dts=191625|dts_time=2.129167|duration=3003|duration_time=0.033367|size=580|pos=101820|flags=__C
frame|media_type=video|stream_index=0|key_frame=0|pts=191626|pts_time=2.129178|pkt_dts=N/A|pkt_dts_time=N/A|best_effort_timestamp=191626|best_effort_timestamp_time=2.129178|duration=3003|duration_time=0.033367|pkt_pos=99180|pkt_size=1666|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=P|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] User Data Unregistered SEI message
-stream|index=0|codec_name=h264|profile=77|codec_type=video|codec_tag_string=avc1|codec_tag=0x31637661|width=160|height=240|coded_width=160|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=2:1|display_aspect_ratio=4:3|pix_fmt=yuv420p|level=12|color_range=tv|color_space=smpte170m|color_transfer=bt709|color_primaries=smpte170m|chroma_location=topleft|field_order=progressive|refs=2|is_avc=true|nal_length_size=4|id=0x1|r_frame_rate=30000/1001|avg_frame_rate=6372000/212521|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=2125200|duration=23.613333|bit_rate=333874|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=708|nb_read_frames=65|nb_read_packets=66|extradata_size=34|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:creation_time=2008-05-12T20:59:27.000000Z|tag:language=eng|tag:handler_name=Apple Video Media Handler|tag:vendor_id=appl|tag:encoder=H.264|side_datum/display_matrix:side_data_type=Display Matrix|side_datum/display_matrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/display_matrix:rotation=0
+stream|index=0|codec_name=h264|profile=77|codec_type=video|codec_tag_string=avc1|codec_tag=0x31637661|width=160|height=240|coded_width=160|coded_height=240|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=2:1|display_aspect_ratio=4:3|pix_fmt=yuv420p|level=12|color_range=tv|color_space=smpte170m|color_transfer=bt709|color_primaries=smpte170m|chroma_location=topleft|field_order=progressive|refs=2|is_avc=true|nal_length_size=4|id=0x1|r_frame_rate=30000/1001|avg_frame_rate=6372000/212521|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=2125200|duration=23.613333|bit_rate=333874|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=708|nb_read_frames=65|nb_read_packets=66|extradata_size=34|disposition:default=1|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:creation_time=2008-05-12T20:59:27.000000Z|tag:language=eng|tag:handler_name=Apple Video Media Handler|tag:vendor_id=appl|tag:encoder=H.264|side_datum/display_matrix:side_data_type=Display Matrix|side_datum/display_matrix:displaymatrix=\n00000000: 131072 0 0\n00000001: 0 65536 0\n00000002: 0 0 1073741824\n|side_datum/display_matrix:rotation=0
diff --git a/tests/ref/fate/mxf-probe-applehdr10 b/tests/ref/fate/mxf-probe-applehdr10
index e322b592f6..e138dad3c7 100644
--- a/tests/ref/fate/mxf-probe-applehdr10
+++ b/tests/ref/fate/mxf-probe-applehdr10
@@ -55,6 +55,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D201300000040ECCE167353449C92D6F2693A9F1D75
[SIDE_DATA]
side_data_type=Mastering display metadata
@@ -120,6 +121,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D201300000040ECCE167353449C92D6F2693A9F1D75
[/STREAM]
[STREAM]
@@ -167,6 +169,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D201300000040ECCE167353449C92D6F2693A9F1D75
[/STREAM]
[FORMAT]
diff --git a/tests/ref/fate/mxf-probe-d10 b/tests/ref/fate/mxf-probe-d10
index 130de39a5c..1e73c15222 100644
--- a/tests/ref/fate/mxf-probe-d10
+++ b/tests/ref/fate/mxf-probe-d10
@@ -56,6 +56,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D1313000000AE86B200913105800000080046A54011
[SIDE_DATA]
side_data_type=CPB properties
@@ -111,6 +112,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D1313000000AE86B200913105800000080046A54011
[/STREAM]
[FORMAT]
diff --git a/tests/ref/fate/mxf-probe-dnxhd b/tests/ref/fate/mxf-probe-dnxhd
index c6e719a50f..bd09397013 100644
--- a/tests/ref/fate/mxf-probe-dnxhd
+++ b/tests/ref/fate/mxf-probe-dnxhd
@@ -37,6 +37,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010101010F001300000057DEEA25B7D80C94060E2B347F7F2A80
TAG:data_type=audio
[/STREAM]
@@ -79,6 +80,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010101010F001300000057DEEA25B7F40C94060E2B347F7F2A80
TAG:data_type=audio
[/STREAM]
@@ -121,6 +123,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010101010F001300000057DEEA25B8050C94060E2B347F7F2A80
TAG:data_type=video
[/STREAM]
@@ -181,6 +184,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010101010F001300000057DEEA25B84D0C94060E2B347F7F2A80
TAG:file_package_name=dnxhr_export.aaf
TAG:reel_umid=0x060A2B340101010101010F001300000057DEEA1570895313060E2B347F7F2A80
diff --git a/tests/ref/fate/mxf-probe-dv25 b/tests/ref/fate/mxf-probe-dv25
index dcf13e79f0..ae23dbbe88 100644
--- a/tests/ref/fate/mxf-probe-dv25
+++ b/tests/ref/fate/mxf-probe-dv25
@@ -55,6 +55,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D4313000000F2E2FCE98722F14F947F08DE1EF7A8DA
[/STREAM]
[STREAM]
@@ -102,6 +103,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D4313000000F2E2FCE98722F14F947F08DE1EF7A8DA
[/STREAM]
[STREAM]
@@ -149,6 +151,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010D4313000000F2E2FCE98722F14F947F08DE1EF7A8DA
[/STREAM]
[FORMAT]
diff --git a/tests/ref/fate/mxf-probe-j2k b/tests/ref/fate/mxf-probe-j2k
index 517fbb99a3..f1dadf4209 100644
--- a/tests/ref/fate/mxf-probe-j2k
+++ b/tests/ref/fate/mxf-probe-j2k
@@ -55,6 +55,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
TAG:file_package_umid=0x060A2B340101010501010F201300000035E05073878E4B2FB69D2369F25ADFC9
TAG:file_package_name=File Package: SMPTE ST 422 / ST 2067-5 frame wrapping of JPEG 2000 codestreams
TAG:track_name=Image Track
diff --git a/tests/ref/fate/oggopus-demux b/tests/ref/fate/oggopus-demux
index 05cdd94f43..03b7b76cf2 100644
--- a/tests/ref/fate/oggopus-demux
+++ b/tests/ref/fate/oggopus-demux
@@ -39,5 +39,5 @@ packet|codec_type=audio|stream_index=0|pts=35164|pts_time=0.732583|dts=35164|dts
packet|codec_type=audio|stream_index=0|pts=36124|pts_time=0.752583|dts=36124|dts_time=0.752583|duration=960|duration_time=0.020000|size=217|pos=841|flags=K__|data_hash=CRC32:b04fe85a
packet|codec_type=audio|stream_index=0|pts=37084|pts_time=0.772583|dts=37084|dts_time=0.772583|duration=960|duration_time=0.020000|size=217|pos=841|flags=K__|data_hash=CRC32:06797ece
packet|codec_type=audio|stream_index=0|pts=38044|pts_time=0.792583|dts=38044|dts_time=0.792583|duration=356|duration_time=0.007417|size=359|pos=841|flags=K__|data_hash=CRC32:01ca3f8f|side_datum/skip_samples:side_data_type=Skip Samples|side_datum/skip_samples:skip_samples=0|side_datum/skip_samples:discard_padding=604|side_datum/skip_samples:skip_reason=0|side_datum/skip_samples:discard_reason=0
-stream|index=0|codec_name=opus|profile=unknown|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=48000|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=356|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/48000|start_pts=0|start_time=0.000000|duration_ts=38756|duration=0.807417|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=41|extradata_size=19|extradata_hash=CRC32:58ba5ff3|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:ENCODER=opusenc from opus-tools 0.1.9|tag:ENCODER_OPTIONS=--discard-comments
+stream|index=0|codec_name=opus|profile=unknown|codec_type=audio|codec_tag_string=[0][0][0][0]|codec_tag=0x0000|sample_fmt=fltp|sample_rate=48000|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=356|id=N/A|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/48000|start_pts=0|start_time=0.000000|duration_ts=38756|duration=0.807417|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=41|extradata_size=19|extradata_hash=CRC32:58ba5ff3|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:ENCODER=opusenc from opus-tools 0.1.9|tag:ENCODER_OPTIONS=--discard-comments
format|filename=intro-partial.opus|nb_streams=1|nb_programs=0|nb_stream_groups=0|format_name=ogg|start_time=0.000000|duration=0.807417|size=10250|bit_rate=101558|probe_score=100
diff --git a/tests/ref/fate/ts-demux b/tests/ref/fate/ts-demux
index ec4aeb2034..45522c2bfb 100644
--- a/tests/ref/fate/ts-demux
+++ b/tests/ref/fate/ts-demux
@@ -23,7 +23,7 @@ packet|codec_type=audio|stream_index=2|pts=3912642700|pts_time=43473.807778|dts=
packet|codec_type=video|stream_index=0|pts=3912686363|pts_time=43474.292922|dts=3912686363|dts_time=43474.292922|duration=1501|duration_time=0.016678|size=4944|pos=506660|flags=___|data_hash=CRC32:54a86cbb
packet|codec_type=audio|stream_index=1|pts=3912644825|pts_time=43473.831389|dts=3912644825|dts_time=43473.831389|duration=2880|duration_time=0.032000|size=906|pos=474888|flags=K__|data_hash=CRC32:0893d398
packet|codec_type=audio|stream_index=2|pts=3912645580|pts_time=43473.839778|dts=3912645580|dts_time=43473.839778|duration=2880|duration_time=0.032000|size=354|pos=491808|flags=K__|data_hash=CRC32:f5963fa6
-stream|index=0|codec_name=mpeg2video|profile=4|codec_type=video|codec_tag_string=[2][0][0][0]|codec_tag=0x0002|width=1280|height=720|coded_width=0|coded_height=0|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=16:9|pix_fmt=yuv420p|level=4|color_range=tv|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|ts_id=32776|ts_packetsize=188|id=0x31|r_frame_rate=60000/1001|avg_frame_rate=60000/1001|time_base=1/90000|start_pts=3912669846|start_time=43474.109400|duration_ts=19519|duration=0.216878|bit_rate=15000000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=15|extradata_size=150|extradata_hash=CRC32:53134fa8|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|side_datum/cpb_properties:side_data_type=CPB properties|side_datum/cpb_properties:max_bitrate=15000000|side_datum/cpb_properties:min_bitrate=0|side_datum/cpb_properties:avg_bitrate=0|side_datum/cpb_properties:buffer_size=9781248|side_datum/cpb_properties:vbv_delay=-1
-stream|index=1|codec_name=ac3|profile=unknown|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|sample_fmt=fltp|sample_rate=48000|channels=6|channel_layout=5.1(side)|bits_per_sample=0|initial_padding=0|ts_id=32776|ts_packetsize=188|id=0x34|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912633305|start_time=43473.703389|duration_ts=14400|duration=0.160000|bit_rate=384000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:language=eng
-stream|index=2|codec_name=ac3|profile=unknown|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|sample_fmt=fltp|sample_rate=48000|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|ts_id=32776|ts_packetsize=188|id=0x35|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912634060|start_time=43473.711778|duration_ts=14400|duration=0.160000|bit_rate=192000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|tag:language=es
+stream|index=0|codec_name=mpeg2video|profile=4|codec_type=video|codec_tag_string=[2][0][0][0]|codec_tag=0x0002|width=1280|height=720|coded_width=0|coded_height=0|closed_captions=0|film_grain=0|has_b_frames=1|sample_aspect_ratio=1:1|display_aspect_ratio=16:9|pix_fmt=yuv420p|level=4|color_range=tv|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|ts_id=32776|ts_packetsize=188|id=0x31|r_frame_rate=60000/1001|avg_frame_rate=60000/1001|time_base=1/90000|start_pts=3912669846|start_time=43474.109400|duration_ts=19519|duration=0.216878|bit_rate=15000000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=15|extradata_size=150|extradata_hash=CRC32:53134fa8|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|side_datum/cpb_properties:side_data_type=CPB properties|side_datum/cpb_properties:max_bitrate=15000000|side_datum/cpb_properties:min_bitrate=0|side_datum/cpb_properties:avg_bitrate=0|side_datum/cpb_properties:buffer_size=9781248|side_datum/cpb_properties:vbv_delay=-1
+stream|index=1|codec_name=ac3|profile=unknown|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|sample_fmt=fltp|sample_rate=48000|channels=6|channel_layout=5.1(side)|bits_per_sample=0|initial_padding=0|ts_id=32776|ts_packetsize=188|id=0x34|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912633305|start_time=43473.703389|duration_ts=14400|duration=0.160000|bit_rate=384000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=eng
+stream|index=2|codec_name=ac3|profile=unknown|codec_type=audio|codec_tag_string=[4][0][0][0]|codec_tag=0x0004|sample_fmt=fltp|sample_rate=48000|channels=2|channel_layout=stereo|bits_per_sample=0|initial_padding=0|ts_id=32776|ts_packetsize=188|id=0x35|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=3912634060|start_time=43473.711778|duration_ts=14400|duration=0.160000|bit_rate=192000|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=5|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0|tag:language=es
format|filename=mp3ac325-4864-small.ts|nb_streams=3|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=43473.703389|duration=0.622889|size=512000|bit_rate=6575810|probe_score=50
diff --git a/tests/ref/fate/ts-opus-demux b/tests/ref/fate/ts-opus-demux
index 961b7f2a92..d13b97aa6f 100644
--- a/tests/ref/fate/ts-opus-demux
+++ b/tests/ref/fate/ts-opus-demux
@@ -510,5 +510,5 @@ packet|codec_type=audio|stream_index=0|pts=914400|pts_time=10.160000|dts=914400|
packet|codec_type=audio|stream_index=0|pts=916200|pts_time=10.180000|dts=916200|dts_time=10.180000|duration=1800|duration_time=0.020000|size=760|pos=508728|flags=K__|data_hash=CRC32:fdf0ce4a|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=189
packet|codec_type=audio|stream_index=0|pts=918000|pts_time=10.200000|dts=918000|dts_time=10.200000|duration=1800|duration_time=0.020000|size=761|pos=510044|flags=K__|data_hash=CRC32:75113c11|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=189
packet|codec_type=audio|stream_index=0|pts=919800|pts_time=10.220000|dts=919800|dts_time=10.220000|duration=1800|duration_time=0.020000|size=759|pos=510984|flags=K__|data_hash=CRC32:59fc266f|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=189
-stream|index=0|codec_name=opus|profile=unknown|codec_type=audio|codec_tag_string=Opus|codec_tag=0x7375704f|sample_fmt=fltp|sample_rate=48000|channels=8|channel_layout=7.1|bits_per_sample=0|initial_padding=0|ts_id=51338|ts_packetsize=188|id=0x44|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=919800|duration=10.220000|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=512|extradata_size=29|extradata_hash=CRC32:6d6089a7|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0
+stream|index=0|codec_name=opus|profile=unknown|codec_type=audio|codec_tag_string=Opus|codec_tag=0x7375704f|sample_fmt=fltp|sample_rate=48000|channels=8|channel_layout=7.1|bits_per_sample=0|initial_padding=0|ts_id=51338|ts_packetsize=188|id=0x44|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=0|start_time=0.000000|duration_ts=919800|duration=10.220000|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=512|extradata_size=29|extradata_hash=CRC32:6d6089a7|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
format|filename=test-8-7.1.opus-small.ts|nb_streams=1|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=0.000000|duration=10.220000|size=512000|bit_rate=400782|probe_score=50
diff --git a/tests/ref/fate/ts-small-demux b/tests/ref/fate/ts-small-demux
index 233f73393e..fad4a07541 100644
--- a/tests/ref/fate/ts-small-demux
+++ b/tests/ref/fate/ts-small-demux
@@ -72,5 +72,5 @@ packet|codec_type=video|stream_index=0|pts=546000|pts_time=6.066667|dts=546000|d
packet|codec_type=video|stream_index=0|pts=552000|pts_time=6.133333|dts=552000|dts_time=6.133333|duration=6000|duration_time=0.066667|size=16|pos=15604|flags=___|data_hash=CRC32:cca62b67|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=224
packet|codec_type=video|stream_index=0|pts=558000|pts_time=6.200000|dts=558000|dts_time=6.200000|duration=6000|duration_time=0.066667|size=16|pos=15792|flags=___|data_hash=CRC32:27b943ef|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=224
packet|codec_type=video|stream_index=0|pts=564000|pts_time=6.266667|dts=564000|dts_time=6.266667|duration=6000|duration_time=0.066667|size=16|pos=16356|flags=___|data_hash=CRC32:f7116111
-stream|index=0|codec_name=h264|profile=578|codec_type=video|codec_tag_string=[27][0][0][0]|codec_tag=0x001b|width=82|height=144|coded_width=82|coded_height=144|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=1:1|display_aspect_ratio=41:72|pix_fmt=yuv420p|level=10|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|is_avc=false|nal_length_size=0|ts_id=1|ts_packetsize=188|id=0x100|r_frame_rate=15/1|avg_frame_rate=15/1|time_base=1/90000|start_pts=126000|start_time=1.400000|duration_ts=444000|duration=4.933333|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=74|extradata_size=35|extradata_hash=CRC32:e62cae27|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0
+stream|index=0|codec_name=h264|profile=578|codec_type=video|codec_tag_string=[27][0][0][0]|codec_tag=0x001b|width=82|height=144|coded_width=82|coded_height=144|closed_captions=0|film_grain=0|has_b_frames=0|sample_aspect_ratio=1:1|display_aspect_ratio=41:72|pix_fmt=yuv420p|level=10|color_range=unknown|color_space=unknown|color_transfer=unknown|color_primaries=unknown|chroma_location=left|field_order=progressive|refs=1|is_avc=false|nal_length_size=0|ts_id=1|ts_packetsize=188|id=0x100|r_frame_rate=15/1|avg_frame_rate=15/1|time_base=1/90000|start_pts=126000|start_time=1.400000|duration_ts=444000|duration=4.933333|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=8|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=74|extradata_size=35|extradata_hash=CRC32:e62cae27|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
format|filename=h264small.ts|nb_streams=1|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=1.400000|duration=4.933333|size=16544|bit_rate=26828|probe_score=50
diff --git a/tests/ref/fate/ts-timed-id3-demux b/tests/ref/fate/ts-timed-id3-demux
index 938b5326e4..3de1ca2990 100644
--- a/tests/ref/fate/ts-timed-id3-demux
+++ b/tests/ref/fate/ts-timed-id3-demux
@@ -1,4 +1,4 @@
packet|codec_type=data|stream_index=0|pts=126000|pts_time=1.400000|dts=126000|dts_time=1.400000|duration=N/A|duration_time=N/A|size=26|pos=564|flags=K__|data_hash=CRC32:469f474b|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=189
packet|codec_type=data|stream_index=0|pts=577350|pts_time=6.415000|dts=577350|dts_time=6.415000|duration=N/A|duration_time=N/A|size=26|pos=1316|flags=K__|data_hash=CRC32:469f474b|side_datum/mpegts_stream_id:side_data_type=MPEGTS Stream ID|side_datum/mpegts_stream_id:id=189
-stream|index=0|codec_name=timed_id3|profile=unknown|codec_type=data|codec_tag_string=ID3 |codec_tag=0x20334449|ts_id=1|ts_packetsize=188|id=0x100|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=126000|start_time=1.400000|duration_ts=451350|duration=5.015000|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=2|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0
+stream|index=0|codec_name=timed_id3|profile=unknown|codec_type=data|codec_tag_string=ID3 |codec_tag=0x20334449|ts_id=1|ts_packetsize=188|id=0x100|r_frame_rate=0/0|avg_frame_rate=0/0|time_base=1/90000|start_pts=126000|start_time=1.400000|duration_ts=451350|duration=5.015000|bit_rate=N/A|max_bit_rate=N/A|bits_per_raw_sample=N/A|nb_frames=N/A|nb_read_frames=N/A|nb_read_packets=2|disposition:default=0|disposition:dub=0|disposition:original=0|disposition:comment=0|disposition:lyrics=0|disposition:karaoke=0|disposition:forced=0|disposition:hearing_impaired=0|disposition:visual_impaired=0|disposition:clean_effects=0|disposition:attached_pic=0|disposition:timed_thumbnails=0|disposition:non_diegetic=0|disposition:captions=0|disposition:descriptions=0|disposition:metadata=0|disposition:dependent=0|disposition:still_image=0|disposition:multilayer=0
format|filename=id3.ts|nb_streams=1|nb_programs=1|nb_stream_groups=0|format_name=mpegts|start_time=1.400000|duration=5.015000|size=1504|bit_rate=2399|probe_score=2
diff --git a/tests/ref/fate/webm-webvtt-remux b/tests/ref/fate/webm-webvtt-remux
index 3775926909..baf4c296a0 100644
--- a/tests/ref/fate/webm-webvtt-remux
+++ b/tests/ref/fate/webm-webvtt-remux
@@ -393,6 +393,7 @@ DISPOSITION:descriptions=1
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=1
@@ -415,6 +416,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=1
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=2
@@ -437,6 +439,7 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
[STREAM]
index=3
@@ -459,4 +462,5 @@ DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
+DISPOSITION:multilayer=0
[/STREAM]
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 03/11] avformat/mov: Mark streams with a layered HEVC box as multilayer
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 02/11] avformat: Add a new stream disposition for multilayer video James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 04/11] avformat/hevc: don't write NALUs with nuh_layer_id > 0 in hvcC boxes James Almer
` (9 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
From: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/mov.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 30e8086855..b27666f50f 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -8200,6 +8200,8 @@ static int mov_read_lhvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st->codecpar->extradata[22] += num_arrays;
memcpy(st->codecpar->extradata + old_size, buf + 6, atom.size + 8);
+ st->disposition |= AV_DISPOSITION_MULTILAYER;
+
av_free(buf);
return 0;
}
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 04/11] avformat/hevc: don't write NALUs with nuh_layer_id > 0 in hvcC boxes
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 02/11] avformat: Add a new stream disposition for multilayer video James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 03/11] avformat/mov: Mark streams with a layered HEVC box as multilayer James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-07 15:46 ` Andreas Rheinhardt
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 05/11] avformat/hevc: don't write the same array values per nal addition James Almer
` (8 subsequent siblings)
11 siblings, 1 reply; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
hvcC should only contain nuh_layer_id == 0 NALUs. Support for a box meant to
contain higher layer NALUs will be added in a following patch.
To achieve this, all sources are parsed and filtered, including hvcC source
that until now were propagated untouched. This is reflected in how the affected
reference files now have ps_array_completeness set to 0 instead of 1 for some
non-PS NALUs.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/hevc.c | 140 ++++++++++++++++-----
libavformat/hevc.h | 3 +-
tests/ref/fate/enhanced-flv-hevc | 4 +-
tests/ref/fate/matroska-dovi-write-config8 | 4 +-
tests/ref/lavf-fate/hevc.flv | 2 +-
5 files changed, 118 insertions(+), 35 deletions(-)
diff --git a/libavformat/hevc.c b/libavformat/hevc.c
index d6b9d233d9..651c3b4b1d 100644
--- a/libavformat/hevc.c
+++ b/libavformat/hevc.c
@@ -40,12 +40,15 @@ enum {
NB_ARRAYS
};
+#define FLAG_ARRAY_COMPLETENESS (1 << 0)
+#define FLAG_IS_NALFF (1 << 1)
+
typedef struct HVCCNALUnitArray {
uint8_t array_completeness;
uint8_t NAL_unit_type;
uint16_t numNalus;
uint16_t *nalUnitLength;
- uint8_t **nalUnit;
+ const uint8_t **nalUnit;
} HVCCNALUnitArray;
typedef struct HEVCDecoderConfigurationRecord {
@@ -654,24 +657,26 @@ static int hvcc_parse_pps(GetBitContext *gb,
return 0;
}
-static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type)
+static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type,
+ uint8_t *nuh_layer_id)
{
skip_bits1(gb); // forbidden_zero_bit
*nal_type = get_bits(gb, 6);
+ *nuh_layer_id = get_bits(gb, 6);
/*
- * nuh_layer_id u(6)
* nuh_temporal_id_plus1 u(3)
*/
- skip_bits(gb, 9);
+ skip_bits(gb, 3);
}
-static int hvcc_array_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size,
- uint8_t nal_type, int ps_array_completeness,
+static int hvcc_array_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
+ uint8_t nal_type, int flags,
HVCCNALUnitArray *array)
{
int ret;
+ int ps_array_completeness = !!(flags & FLAG_ARRAY_COMPLETENESS);
uint16_t numNalus = array->numNalus;
ret = av_reallocp_array(&array->nalUnit, numNalus + 1, sizeof(uint8_t*));
@@ -699,14 +704,14 @@ static int hvcc_array_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size,
return 0;
}
-static int hvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size,
- int ps_array_completeness,
+static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
HEVCDecoderConfigurationRecord *hvcc,
- unsigned array_idx)
+ int flags, unsigned array_idx)
{
int ret = 0;
+ int is_nalff = !!(flags & FLAG_IS_NALFF);
GetBitContext gbc;
- uint8_t nal_type;
+ uint8_t nal_type, nuh_layer_id;
uint8_t *rbsp_buf;
uint32_t rbsp_size;
@@ -720,7 +725,9 @@ static int hvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size,
if (ret < 0)
goto end;
- nal_unit_parse_header(&gbc, &nal_type);
+ nal_unit_parse_header(&gbc, &nal_type, &nuh_layer_id);
+ if (nuh_layer_id > 0)
+ goto end;
/*
* Note: only 'declarative' SEI messages are allowed in
@@ -728,12 +735,17 @@ static int hvcc_add_nal_unit(uint8_t *nal_buf, uint32_t nal_size,
* and non-declarative SEI messages discarded?
*/
ret = hvcc_array_add_nal_unit(nal_buf, nal_size, nal_type,
- ps_array_completeness,
+ flags,
&hvcc->arrays[array_idx]);
if (ret < 0)
goto end;
if (hvcc->arrays[array_idx].numNalus == 1)
hvcc->numOfArrays++;
+
+ /* Don't parse parameter sets. We already have the needed information*/
+ if (is_nalff)
+ goto end;
+
if (nal_type == HEVC_NAL_VPS)
ret = hvcc_parse_vps(&gbc, hvcc);
else if (nal_type == HEVC_NAL_SPS)
@@ -1041,20 +1053,100 @@ int ff_hevc_annexb2mp4_buf(const uint8_t *buf_in, uint8_t **buf_out,
return 0;
}
+static int hvcc_parse_nal_unit(const uint8_t *buf, uint32_t len, int type,
+ HEVCDecoderConfigurationRecord *hvcc,
+ int flags)
+{
+ for (unsigned i = 0; i < FF_ARRAY_ELEMS(hvcc->arrays); i++) {
+ static const uint8_t array_idx_to_type[] =
+ { HEVC_NAL_VPS, HEVC_NAL_SPS, HEVC_NAL_PPS,
+ HEVC_NAL_SEI_PREFIX, HEVC_NAL_SEI_SUFFIX };
+
+ if (type == array_idx_to_type[i]) {
+ int ret = hvcc_add_nal_unit(buf, len, hvcc, flags, i);
+ if (ret < 0)
+ return ret;
+ break;
+ }
+ }
+
+ return 0;
+}
+
int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
int size, int ps_array_completeness)
{
HEVCDecoderConfigurationRecord hvcc;
- uint8_t *buf, *end, *start;
+ uint8_t *buf, *end, *start = NULL;
+ int flags = !!ps_array_completeness * FLAG_ARRAY_COMPLETENESS;
int ret;
if (size < 6) {
/* We can't write a valid hvcC from the provided data */
return AVERROR_INVALIDDATA;
} else if (*data == 1) {
- /* Data is already hvcC-formatted */
- avio_write(pb, data, size);
- return 0;
+ /* Data is already hvcC-formatted. Parse the arrays to skip any NALU
+ with nuh_layer_id > 0 */
+ GetBitContext gbc;
+ int num_arrays;
+
+ if (size < 23)
+ return AVERROR_INVALIDDATA;
+
+ ret = init_get_bits8(&gbc, data, size);
+ if (ret < 0)
+ return ret;
+
+ hvcc_init(&hvcc);
+ skip_bits(&gbc, 8); // hvcc.configurationVersion
+ hvcc.general_profile_space = get_bits(&gbc, 2);
+ hvcc.general_tier_flag = get_bits1(&gbc);
+ hvcc.general_profile_idc = get_bits(&gbc, 5);
+ hvcc.general_profile_compatibility_flags = get_bits_long(&gbc, 32);
+ hvcc.general_constraint_indicator_flags = get_bits64(&gbc, 48);
+ hvcc.general_level_idc = get_bits(&gbc, 8);
+ skip_bits(&gbc, 4); // reserved
+ hvcc.min_spatial_segmentation_idc = get_bits(&gbc, 12);
+ skip_bits(&gbc, 6); // reserved
+ hvcc.parallelismType = get_bits(&gbc, 2);
+ skip_bits(&gbc, 6); // reserved
+ hvcc.chromaFormat = get_bits(&gbc, 2);
+ skip_bits(&gbc, 5); // reserved
+ hvcc.bitDepthLumaMinus8 = get_bits(&gbc, 3);
+ skip_bits(&gbc, 5); // reserved
+ hvcc.bitDepthChromaMinus8 = get_bits(&gbc, 3);
+ hvcc.avgFrameRate = get_bits(&gbc, 16);
+ hvcc.constantFrameRate = get_bits(&gbc, 2);
+ hvcc.numTemporalLayers = get_bits(&gbc, 3);
+ hvcc.temporalIdNested = get_bits1(&gbc);
+ hvcc.lengthSizeMinusOne = get_bits(&gbc, 2);
+
+ flags |= FLAG_IS_NALFF;
+
+ num_arrays = get_bits(&gbc, 8);
+ for (int i = 0; i < num_arrays; i++) {
+ int type, num_nalus;
+
+ skip_bits(&gbc, 2);
+ type = get_bits(&gbc, 6);
+ num_nalus = get_bits(&gbc, 16);
+ for (int j = 0; j < num_nalus; j++) {
+ int len = get_bits(&gbc, 16);
+
+ if (len > (get_bits_left(&gbc) / 8))
+ goto end;
+
+ ret = hvcc_parse_nal_unit(data + get_bits_count(&gbc) / 8,
+ len, type, &hvcc, flags);
+ if (ret < 0)
+ goto end;
+
+ skip_bits_long(&gbc, len * 8);
+ }
+ }
+
+ ret = hvcc_write(pb, &hvcc);
+ goto end;
} else if (!(AV_RB24(data) == 1 || AV_RB32(data) == 1)) {
/* Not a valid Annex B start code prefix */
return AVERROR_INVALIDDATA;
@@ -1075,19 +1167,9 @@ int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
buf += 4;
- for (unsigned i = 0; i < FF_ARRAY_ELEMS(hvcc.arrays); i++) {
- static const uint8_t array_idx_to_type[] =
- { HEVC_NAL_VPS, HEVC_NAL_SPS, HEVC_NAL_PPS,
- HEVC_NAL_SEI_PREFIX, HEVC_NAL_SEI_SUFFIX };
-
- if (type == array_idx_to_type[i]) {
- ret = hvcc_add_nal_unit(buf, len, ps_array_completeness,
- &hvcc, i);
- if (ret < 0)
- goto end;
- break;
- }
- }
+ ret = hvcc_parse_nal_unit(buf, len, type, &hvcc, flags);
+ if (ret < 0)
+ goto end;
buf += len;
}
diff --git a/libavformat/hevc.h b/libavformat/hevc.h
index 0f56325c1c..cb66ac66ac 100644
--- a/libavformat/hevc.h
+++ b/libavformat/hevc.h
@@ -79,7 +79,8 @@ int ff_hevc_annexb2mp4_buf(const uint8_t *buf_in, uint8_t **buf_out,
int *size, int filter_ps, int *ps_count);
/**
- * Writes HEVC extradata (parameter sets, declarative SEI NAL units) to the
+ * Writes HEVC extradata (parameter sets and declarative SEI NAL units with
+ * nuh_layer_id == 0, as a HEVCDecoderConfigurationRecord) to the
* provided AVIOContext.
*
* If the extradata is Annex B format, it gets converted to hvcC format before
diff --git a/tests/ref/fate/enhanced-flv-hevc b/tests/ref/fate/enhanced-flv-hevc
index f011d38a30..f04905d06b 100644
--- a/tests/ref/fate/enhanced-flv-hevc
+++ b/tests/ref/fate/enhanced-flv-hevc
@@ -1,6 +1,6 @@
-0da54607064548fa1aae5695751f189c *tests/data/fate/enhanced-flv-hevc.flv
+565cf155790db391137f81f619448477 *tests/data/fate/enhanced-flv-hevc.flv
3603038 tests/data/fate/enhanced-flv-hevc.flv
-#extradata 0: 551, 0xa18acf66
+#extradata 0: 551, 0xb1ddcd66
#extradata 1: 2, 0x00340022
#tb 0: 1/1000
#media_type 0: video
diff --git a/tests/ref/fate/matroska-dovi-write-config8 b/tests/ref/fate/matroska-dovi-write-config8
index 472cbed708..44ca015e0e 100644
--- a/tests/ref/fate/matroska-dovi-write-config8
+++ b/tests/ref/fate/matroska-dovi-write-config8
@@ -1,6 +1,6 @@
-0730145aa317d800cb4bde0e3a38bb8d *tests/data/fate/matroska-dovi-write-config8.matroska
+3bd4b07d5af6153516e4c0e66a71c8c9 *tests/data/fate/matroska-dovi-write-config8.matroska
3600607 tests/data/fate/matroska-dovi-write-config8.matroska
-#extradata 0: 551, 0xa18acf66
+#extradata 0: 551, 0xb1ddcd66
#extradata 1: 2, 0x00340022
#tb 0: 1/1000
#media_type 0: video
diff --git a/tests/ref/lavf-fate/hevc.flv b/tests/ref/lavf-fate/hevc.flv
index 1105d8eddb..e3962e0938 100644
--- a/tests/ref/lavf-fate/hevc.flv
+++ b/tests/ref/lavf-fate/hevc.flv
@@ -1,3 +1,3 @@
-39cf3df5fc3a9c50ab71a294f45663fe *tests/data/lavf-fate/lavf.hevc.flv
+c9e8b5df15135d21bd2781558f32f269 *tests/data/lavf-fate/lavf.hevc.flv
11819 tests/data/lavf-fate/lavf.hevc.flv
tests/data/lavf-fate/lavf.hevc.flv CRC=0xd29da885
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 05/11] avformat/hevc: don't write the same array values per nal addition
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (2 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 04/11] avformat/hevc: don't write NALUs with nuh_layer_id > 0 in hvcC boxes James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 06/11] avformat/hevc: use a single array for per-PS NALUs James Almer
` (7 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/hevc.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/libavformat/hevc.c b/libavformat/hevc.c
index 651c3b4b1d..40f46668f9 100644
--- a/libavformat/hevc.c
+++ b/libavformat/hevc.c
@@ -672,11 +672,9 @@ static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type,
}
static int hvcc_array_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
- uint8_t nal_type, int flags,
HVCCNALUnitArray *array)
{
int ret;
- int ps_array_completeness = !!(flags & FLAG_ARRAY_COMPLETENESS);
uint16_t numNalus = array->numNalus;
ret = av_reallocp_array(&array->nalUnit, numNalus + 1, sizeof(uint8_t*));
@@ -689,18 +687,8 @@ static int hvcc_array_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
array->nalUnit [numNalus] = nal_buf;
array->nalUnitLength[numNalus] = nal_size;
- array->NAL_unit_type = nal_type;
array->numNalus++;
- /*
- * When the sample entry name is ‘hvc1’, the default and mandatory value of
- * array_completeness is 1 for arrays of all types of parameter sets, and 0
- * for all other arrays. When the sample entry name is ‘hev1’, the default
- * value of array_completeness is 0 for all arrays.
- */
- if (nal_type == HEVC_NAL_VPS || nal_type == HEVC_NAL_SPS || nal_type == HEVC_NAL_PPS)
- array->array_completeness = ps_array_completeness;
-
return 0;
}
@@ -710,6 +698,8 @@ static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
{
int ret = 0;
int is_nalff = !!(flags & FLAG_IS_NALFF);
+ int ps_array_completeness = !!(flags & FLAG_ARRAY_COMPLETENESS);
+ HVCCNALUnitArray *const array = &hvcc->arrays[array_idx];
GetBitContext gbc;
uint8_t nal_type, nuh_layer_id;
uint8_t *rbsp_buf;
@@ -734,13 +724,23 @@ static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
* hvcC. Perhaps the SEI playload type should be checked
* and non-declarative SEI messages discarded?
*/
- ret = hvcc_array_add_nal_unit(nal_buf, nal_size, nal_type,
- flags,
- &hvcc->arrays[array_idx]);
+ ret = hvcc_array_add_nal_unit(nal_buf, nal_size, array);
if (ret < 0)
goto end;
- if (hvcc->arrays[array_idx].numNalus == 1)
+ if (array->numNalus == 1) {
hvcc->numOfArrays++;
+ array->NAL_unit_type = nal_type;
+
+ /*
+ * When the sample entry name is ‘hvc1’, the default and mandatory value of
+ * array_completeness is 1 for arrays of all types of parameter sets, and 0
+ * for all other arrays. When the sample entry name is ‘hev1’, the default
+ * value of array_completeness is 0 for all arrays.
+ */
+ if (nal_type == HEVC_NAL_VPS || nal_type == HEVC_NAL_SPS ||
+ nal_type == HEVC_NAL_PPS)
+ array->array_completeness = ps_array_completeness;
+ }
/* Don't parse parameter sets. We already have the needed information*/
if (is_nalff)
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 06/11] avformat/hevc: use a single array for per-PS NALUs
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (3 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 05/11] avformat/hevc: don't write the same array values per nal addition James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 07/11] avformat/hevc: store parameter set and layer IDs in HVCCNALUnit James Almer
` (6 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/hevc.c | 33 ++++++++++++++++++---------------
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/libavformat/hevc.c b/libavformat/hevc.c
index 40f46668f9..6fe701032b 100644
--- a/libavformat/hevc.c
+++ b/libavformat/hevc.c
@@ -40,15 +40,20 @@ enum {
NB_ARRAYS
};
+
#define FLAG_ARRAY_COMPLETENESS (1 << 0)
#define FLAG_IS_NALFF (1 << 1)
+typedef struct HVCCNALUnit {
+ uint16_t nalUnitLength;
+ const uint8_t *nalUnit;
+} HVCCNALUnit;
+
typedef struct HVCCNALUnitArray {
uint8_t array_completeness;
uint8_t NAL_unit_type;
uint16_t numNalus;
- uint16_t *nalUnitLength;
- const uint8_t **nalUnit;
+ HVCCNALUnit *nal;
} HVCCNALUnitArray;
typedef struct HEVCDecoderConfigurationRecord {
@@ -674,19 +679,17 @@ static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type,
static int hvcc_array_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
HVCCNALUnitArray *array)
{
+ HVCCNALUnit *nal;
int ret;
uint16_t numNalus = array->numNalus;
- ret = av_reallocp_array(&array->nalUnit, numNalus + 1, sizeof(uint8_t*));
- if (ret < 0)
- return ret;
-
- ret = av_reallocp_array(&array->nalUnitLength, numNalus + 1, sizeof(uint16_t));
+ ret = av_reallocp_array(&array->nal, numNalus + 1, sizeof(*array->nal));
if (ret < 0)
return ret;
- array->nalUnit [numNalus] = nal_buf;
- array->nalUnitLength[numNalus] = nal_size;
+ nal = &array->nal[numNalus];
+ nal->nalUnit = nal_buf;
+ nal->nalUnitLength = nal_size;
array->numNalus++;
return 0;
@@ -785,8 +788,7 @@ static void hvcc_close(HEVCDecoderConfigurationRecord *hvcc)
for (unsigned i = 0; i < FF_ARRAY_ELEMS(hvcc->arrays); i++) {
HVCCNALUnitArray *const array = &hvcc->arrays[i];
array->numNalus = 0;
- av_freep(&array->nalUnit);
- av_freep(&array->nalUnitLength);
+ av_freep(&array->nal);
}
}
@@ -871,7 +873,7 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
for (unsigned k = 0; k < array->numNalus; k++)
av_log(NULL, AV_LOG_TRACE,
"nalUnitLength[%u][%u]: %"PRIu16"\n",
- j, k, array->nalUnitLength[k]);
+ j, k, array->nal[k].nalUnitLength);
j++;
}
@@ -972,12 +974,13 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
avio_wb16(pb, array->numNalus);
for (unsigned j = 0; j < array->numNalus; j++) {
+ HVCCNALUnit *nal = &array->nal[j];
+
/* unsigned int(16) nalUnitLength; */
- avio_wb16(pb, array->nalUnitLength[j]);
+ avio_wb16(pb, nal->nalUnitLength);
/* bit(8*nalUnitLength) nalUnit; */
- avio_write(pb, array->nalUnit[j],
- array->nalUnitLength[j]);
+ avio_write(pb, nal->nalUnit, nal->nalUnitLength);
}
}
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 07/11] avformat/hevc: store parameter set and layer IDs in HVCCNALUnit
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (4 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 06/11] avformat/hevc: use a single array for per-PS NALUs James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 08/11] avformat/hevc: add a function to write a lhvC box James Almer
` (5 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/hevc.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/libavformat/hevc.c b/libavformat/hevc.c
index 6fe701032b..f3e5542699 100644
--- a/libavformat/hevc.c
+++ b/libavformat/hevc.c
@@ -45,6 +45,8 @@ enum {
#define FLAG_IS_NALFF (1 << 1)
typedef struct HVCCNALUnit {
+ uint8_t nuh_layer_id;
+ uint8_t parameter_set_id;
uint16_t nalUnitLength;
const uint8_t *nalUnit;
} HVCCNALUnit;
@@ -378,17 +380,17 @@ static void skip_sub_layer_ordering_info(GetBitContext *gb)
get_ue_golomb_long(gb); // max_latency_increase_plus1
}
-static int hvcc_parse_vps(GetBitContext *gb,
+static int hvcc_parse_vps(GetBitContext *gb, HVCCNALUnit *nal,
HEVCDecoderConfigurationRecord *hvcc)
{
unsigned int vps_max_sub_layers_minus1;
+ nal->parameter_set_id = get_bits(gb, 4);
/*
- * vps_video_parameter_set_id u(4)
* vps_reserved_three_2bits u(2)
* vps_max_layers_minus1 u(6)
*/
- skip_bits(gb, 12);
+ skip_bits(gb, 8);
vps_max_sub_layers_minus1 = get_bits(gb, 3);
@@ -501,7 +503,7 @@ static int parse_rps(GetBitContext *gb, unsigned int rps_idx,
return 0;
}
-static int hvcc_parse_sps(GetBitContext *gb,
+static int hvcc_parse_sps(GetBitContext *gb, HVCCNALUnit *nal,
HEVCDecoderConfigurationRecord *hvcc)
{
unsigned int i, sps_max_sub_layers_minus1, log2_max_pic_order_cnt_lsb_minus4;
@@ -526,7 +528,7 @@ static int hvcc_parse_sps(GetBitContext *gb,
hvcc_parse_ptl(gb, hvcc, sps_max_sub_layers_minus1);
- get_ue_golomb_long(gb); // sps_seq_parameter_set_id
+ nal->parameter_set_id = get_ue_golomb_long(gb);
hvcc->chromaFormat = get_ue_golomb_long(gb);
@@ -605,12 +607,12 @@ static int hvcc_parse_sps(GetBitContext *gb,
return 0;
}
-static int hvcc_parse_pps(GetBitContext *gb,
+static int hvcc_parse_pps(GetBitContext *gb, HVCCNALUnit *nal,
HEVCDecoderConfigurationRecord *hvcc)
{
uint8_t tiles_enabled_flag, entropy_coding_sync_enabled_flag;
- get_ue_golomb_long(gb); // pps_pic_parameter_set_id
+ nal->parameter_set_id = get_ue_golomb_long(gb); // pps_pic_parameter_set_id
get_ue_golomb_long(gb); // pps_seq_parameter_set_id
/*
@@ -703,6 +705,7 @@ static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
int is_nalff = !!(flags & FLAG_IS_NALFF);
int ps_array_completeness = !!(flags & FLAG_ARRAY_COMPLETENESS);
HVCCNALUnitArray *const array = &hvcc->arrays[array_idx];
+ HVCCNALUnit *nal;
GetBitContext gbc;
uint8_t nal_type, nuh_layer_id;
uint8_t *rbsp_buf;
@@ -745,16 +748,19 @@ static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
array->array_completeness = ps_array_completeness;
}
+ nal = &array->nal[array->numNalus-1];
+ nal->nuh_layer_id = nuh_layer_id;
+
/* Don't parse parameter sets. We already have the needed information*/
if (is_nalff)
goto end;
if (nal_type == HEVC_NAL_VPS)
- ret = hvcc_parse_vps(&gbc, hvcc);
+ ret = hvcc_parse_vps(&gbc, nal, hvcc);
else if (nal_type == HEVC_NAL_SPS)
- ret = hvcc_parse_sps(&gbc, hvcc);
+ ret = hvcc_parse_sps(&gbc, nal, hvcc);
else if (nal_type == HEVC_NAL_PPS)
- ret = hvcc_parse_pps(&gbc, hvcc);
+ ret = hvcc_parse_pps(&gbc, nal, hvcc);
if (ret < 0)
goto end;
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 08/11] avformat/hevc: add a function to write a lhvC box
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (5 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 07/11] avformat/hevc: store parameter set and layer IDs in HVCCNALUnit James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 09/11] avformat/movenc: add support for writing lhvC boxes James Almer
` (4 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/hevc.c | 163 +++++++++++++++++++++++++++++++++++----------
libavformat/hevc.h | 17 +++++
2 files changed, 145 insertions(+), 35 deletions(-)
diff --git a/libavformat/hevc.c b/libavformat/hevc.c
index f3e5542699..69e6f719e5 100644
--- a/libavformat/hevc.c
+++ b/libavformat/hevc.c
@@ -43,12 +43,16 @@ enum {
#define FLAG_ARRAY_COMPLETENESS (1 << 0)
#define FLAG_IS_NALFF (1 << 1)
+#define FLAG_IS_LHVC (1 << 2)
typedef struct HVCCNALUnit {
uint8_t nuh_layer_id;
uint8_t parameter_set_id;
uint16_t nalUnitLength;
const uint8_t *nalUnit;
+
+ // VPS
+ uint8_t vps_max_sub_layers_minus1;
} HVCCNALUnit;
typedef struct HVCCNALUnitArray {
@@ -383,8 +387,6 @@ static void skip_sub_layer_ordering_info(GetBitContext *gb)
static int hvcc_parse_vps(GetBitContext *gb, HVCCNALUnit *nal,
HEVCDecoderConfigurationRecord *hvcc)
{
- unsigned int vps_max_sub_layers_minus1;
-
nal->parameter_set_id = get_bits(gb, 4);
/*
* vps_reserved_three_2bits u(2)
@@ -392,7 +394,7 @@ static int hvcc_parse_vps(GetBitContext *gb, HVCCNALUnit *nal,
*/
skip_bits(gb, 8);
- vps_max_sub_layers_minus1 = get_bits(gb, 3);
+ nal->vps_max_sub_layers_minus1 = get_bits(gb, 3);
/*
* numTemporalLayers greater than 1 indicates that the stream to which this
@@ -403,7 +405,7 @@ static int hvcc_parse_vps(GetBitContext *gb, HVCCNALUnit *nal,
* that it is unknown whether the stream is temporally scalable.
*/
hvcc->numTemporalLayers = FFMAX(hvcc->numTemporalLayers,
- vps_max_sub_layers_minus1 + 1);
+ nal->vps_max_sub_layers_minus1 + 1);
/*
* vps_temporal_id_nesting_flag u(1)
@@ -411,7 +413,7 @@ static int hvcc_parse_vps(GetBitContext *gb, HVCCNALUnit *nal,
*/
skip_bits(gb, 17);
- hvcc_parse_ptl(gb, hvcc, vps_max_sub_layers_minus1);
+ hvcc_parse_ptl(gb, hvcc, nal->vps_max_sub_layers_minus1);
/* nothing useful for hvcC past this point */
return 0;
@@ -508,10 +510,33 @@ static int hvcc_parse_sps(GetBitContext *gb, HVCCNALUnit *nal,
{
unsigned int i, sps_max_sub_layers_minus1, log2_max_pic_order_cnt_lsb_minus4;
unsigned int num_short_term_ref_pic_sets, num_delta_pocs[HEVC_MAX_SHORT_TERM_REF_PIC_SETS];
+ unsigned int sps_ext_or_max_sub_layers_minus1, multi_layer_ext_sps_flag;
+
+ unsigned int sps_video_parameter_set_id = get_bits(gb, 4);
- skip_bits(gb, 4); // sps_video_parameter_set_id
+ if (nal->nuh_layer_id == 0) {
+ sps_ext_or_max_sub_layers_minus1 = 0;
+ sps_max_sub_layers_minus1 = get_bits(gb, 3);
+ } else {
+ sps_ext_or_max_sub_layers_minus1 = get_bits(gb, 3);
+ if (sps_ext_or_max_sub_layers_minus1 == 7) {
+ const HVCCNALUnitArray *array = &hvcc->arrays[VPS_INDEX];
+ const HVCCNALUnit *vps = NULL;
+
+ for (i = 0; i < array->numNalus; i++)
+ if (sps_video_parameter_set_id == array->nal[i].parameter_set_id) {
+ vps = &array->nal[i];
+ break;
+ }
+ if (!vps)
+ return AVERROR_INVALIDDATA;
- sps_max_sub_layers_minus1 = get_bits (gb, 3);
+ sps_max_sub_layers_minus1 = vps->vps_max_sub_layers_minus1;
+ } else
+ sps_max_sub_layers_minus1 = sps_ext_or_max_sub_layers_minus1;
+ }
+ multi_layer_ext_sps_flag = nal->nuh_layer_id &&
+ sps_ext_or_max_sub_layers_minus1 == 7;
/*
* numTemporalLayers greater than 1 indicates that the stream to which this
@@ -524,12 +549,17 @@ static int hvcc_parse_sps(GetBitContext *gb, HVCCNALUnit *nal,
hvcc->numTemporalLayers = FFMAX(hvcc->numTemporalLayers,
sps_max_sub_layers_minus1 + 1);
- hvcc->temporalIdNested = get_bits1(gb);
-
- hvcc_parse_ptl(gb, hvcc, sps_max_sub_layers_minus1);
+ if (!multi_layer_ext_sps_flag) {
+ hvcc->temporalIdNested = get_bits1(gb);
+ hvcc_parse_ptl(gb, hvcc, sps_max_sub_layers_minus1);
+ }
nal->parameter_set_id = get_ue_golomb_long(gb);
+ if (multi_layer_ext_sps_flag) {
+ if (get_bits1(gb)) // update_rep_format_flag
+ skip_bits(gb, 8); // sps_rep_format_idx
+ } else {
hvcc->chromaFormat = get_ue_golomb_long(gb);
if (hvcc->chromaFormat == 3)
@@ -547,12 +577,15 @@ static int hvcc_parse_sps(GetBitContext *gb, HVCCNALUnit *nal,
hvcc->bitDepthLumaMinus8 = get_ue_golomb_long(gb);
hvcc->bitDepthChromaMinus8 = get_ue_golomb_long(gb);
+ }
log2_max_pic_order_cnt_lsb_minus4 = get_ue_golomb_long(gb);
+ if (!multi_layer_ext_sps_flag) {
/* sps_sub_layer_ordering_info_present_flag */
i = get_bits1(gb) ? 0 : sps_max_sub_layers_minus1;
for (; i <= sps_max_sub_layers_minus1; i++)
skip_sub_layer_ordering_info(gb);
+ }
get_ue_golomb_long(gb); // log2_min_luma_coding_block_size_minus3
get_ue_golomb_long(gb); // log2_diff_max_min_luma_coding_block_size
@@ -561,9 +594,15 @@ static int hvcc_parse_sps(GetBitContext *gb, HVCCNALUnit *nal,
get_ue_golomb_long(gb); // max_transform_hierarchy_depth_inter
get_ue_golomb_long(gb); // max_transform_hierarchy_depth_intra
- if (get_bits1(gb) && // scaling_list_enabled_flag
- get_bits1(gb)) // sps_scaling_list_data_present_flag
- skip_scaling_list_data(gb);
+ if (get_bits1(gb)) { // scaling_list_enabled_flag
+ int sps_infer_scaling_list_flag = 0;
+ if (multi_layer_ext_sps_flag)
+ sps_infer_scaling_list_flag = get_bits1(gb);
+ if (sps_infer_scaling_list_flag)
+ skip_bits(gb, 6); // sps_scaling_list_ref_layer_id
+ else if (get_bits1(gb)) // sps_scaling_list_data_present_flag
+ skip_scaling_list_data(gb);
+ }
skip_bits1(gb); // amp_enabled_flag
skip_bits1(gb); // sample_adaptive_offset_enabled_flag
@@ -703,6 +742,7 @@ static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
{
int ret = 0;
int is_nalff = !!(flags & FLAG_IS_NALFF);
+ int is_lhvc = !!(flags & FLAG_IS_LHVC);
int ps_array_completeness = !!(flags & FLAG_ARRAY_COMPLETENESS);
HVCCNALUnitArray *const array = &hvcc->arrays[array_idx];
HVCCNALUnit *nal;
@@ -722,7 +762,7 @@ static int hvcc_add_nal_unit(const uint8_t *nal_buf, uint32_t nal_size,
goto end;
nal_unit_parse_header(&gbc, &nal_type, &nuh_layer_id);
- if (nuh_layer_id > 0)
+ if (!is_lhvc && nuh_layer_id > 0)
goto end;
/*
@@ -798,9 +838,12 @@ static void hvcc_close(HEVCDecoderConfigurationRecord *hvcc)
}
}
-static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
+static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc,
+ int flags)
{
- uint16_t vps_count, sps_count, pps_count;
+ uint16_t numNalus[NB_ARRAYS] = { 0 };
+ int is_lhvc = !!(flags & FLAG_IS_LHVC);
+ int numOfArrays = 0;
/*
* We only support writing HEVCDecoderConfigurationRecord version 1.
@@ -826,10 +869,32 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
* let's always set them to values meaning 'unspecified'.
*/
hvcc->avgFrameRate = 0;
- hvcc->constantFrameRate = 0;
+ /*
+ * lhvC doesn't store this field. It instead reserves the bits, setting them
+ * to '11'b.
+ */
+ hvcc->constantFrameRate = is_lhvc * 0x3;
+
+ /*
+ * Skip all NALUs with nuh_layer_id == 0 if writing lhvC. We do it here and
+ * not before parsing them as some parameter sets with nuh_layer_id > 0
+ * may reference base layer parameters sets.
+ */
+ for (unsigned i = 0; i < FF_ARRAY_ELEMS(hvcc->arrays); i++) {
+ const HVCCNALUnitArray *const array = &hvcc->arrays[i];
+
+ if (array->numNalus == 0)
+ continue;
+ for (unsigned j = 0; j < array->numNalus; j++)
+ numNalus[i] += !is_lhvc || (array->nal[j].nuh_layer_id != 0);
+ numOfArrays += (numNalus[i] > 0);
+ }
+
+ av_log(NULL, AV_LOG_TRACE, "%s\n", is_lhvc ? "lhvC" : "hvcC");
av_log(NULL, AV_LOG_TRACE, "configurationVersion: %"PRIu8"\n",
hvcc->configurationVersion);
+ if (!is_lhvc) {
av_log(NULL, AV_LOG_TRACE, "general_profile_space: %"PRIu8"\n",
hvcc->general_profile_space);
av_log(NULL, AV_LOG_TRACE, "general_tier_flag: %"PRIu8"\n",
@@ -842,10 +907,12 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
hvcc->general_constraint_indicator_flags);
av_log(NULL, AV_LOG_TRACE, "general_level_idc: %"PRIu8"\n",
hvcc->general_level_idc);
+ }
av_log(NULL, AV_LOG_TRACE, "min_spatial_segmentation_idc: %"PRIu16"\n",
hvcc->min_spatial_segmentation_idc);
av_log(NULL, AV_LOG_TRACE, "parallelismType: %"PRIu8"\n",
hvcc->parallelismType);
+ if (!is_lhvc) {
av_log(NULL, AV_LOG_TRACE, "chromaFormat: %"PRIu8"\n",
hvcc->chromaFormat);
av_log(NULL, AV_LOG_TRACE, "bitDepthLumaMinus8: %"PRIu8"\n",
@@ -856,6 +923,7 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
hvcc->avgFrameRate);
av_log(NULL, AV_LOG_TRACE, "constantFrameRate: %"PRIu8"\n",
hvcc->constantFrameRate);
+ }
av_log(NULL, AV_LOG_TRACE, "numTemporalLayers: %"PRIu8"\n",
hvcc->numTemporalLayers);
av_log(NULL, AV_LOG_TRACE, "temporalIdNested: %"PRIu8"\n",
@@ -863,11 +931,11 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
av_log(NULL, AV_LOG_TRACE, "lengthSizeMinusOne: %"PRIu8"\n",
hvcc->lengthSizeMinusOne);
av_log(NULL, AV_LOG_TRACE, "numOfArrays: %"PRIu8"\n",
- hvcc->numOfArrays);
+ numOfArrays);
for (unsigned i = 0, j = 0; i < FF_ARRAY_ELEMS(hvcc->arrays); i++) {
const HVCCNALUnitArray *const array = &hvcc->arrays[i];
- if (array->numNalus == 0)
+ if (numNalus[i] == 0)
continue;
av_log(NULL, AV_LOG_TRACE, "array_completeness[%u]: %"PRIu8"\n",
@@ -875,28 +943,31 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
av_log(NULL, AV_LOG_TRACE, "NAL_unit_type[%u]: %"PRIu8"\n",
j, array->NAL_unit_type);
av_log(NULL, AV_LOG_TRACE, "numNalus[%u]: %"PRIu16"\n",
- j, array->numNalus);
- for (unsigned k = 0; k < array->numNalus; k++)
+ j, numNalus[i]);
+ for (unsigned k = 0; k < array->numNalus; k++) {
+ if (is_lhvc && array->nal[k].nuh_layer_id == 0)
+ continue;
+
av_log(NULL, AV_LOG_TRACE,
"nalUnitLength[%u][%u]: %"PRIu16"\n",
j, k, array->nal[k].nalUnitLength);
+ }
j++;
}
/*
* We need at least one of each: VPS, SPS and PPS.
*/
- vps_count = hvcc->arrays[VPS_INDEX].numNalus;
- sps_count = hvcc->arrays[SPS_INDEX].numNalus;
- pps_count = hvcc->arrays[PPS_INDEX].numNalus;
- if (!vps_count || vps_count > HEVC_MAX_VPS_COUNT ||
- !sps_count || sps_count > HEVC_MAX_SPS_COUNT ||
- !pps_count || pps_count > HEVC_MAX_PPS_COUNT)
+ if ((!numNalus[VPS_INDEX] || numNalus[VPS_INDEX] > HEVC_MAX_VPS_COUNT) && !is_lhvc)
+ return AVERROR_INVALIDDATA;
+ if (!numNalus[SPS_INDEX] || numNalus[SPS_INDEX] > HEVC_MAX_SPS_COUNT ||
+ !numNalus[PPS_INDEX] || numNalus[PPS_INDEX] > HEVC_MAX_PPS_COUNT)
return AVERROR_INVALIDDATA;
/* unsigned int(8) configurationVersion = 1; */
avio_w8(pb, hvcc->configurationVersion);
+ if (!is_lhvc) {
/*
* unsigned int(2) general_profile_space;
* unsigned int(1) general_tier_flag;
@@ -915,6 +986,7 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
/* unsigned int(8) general_level_idc; */
avio_w8(pb, hvcc->general_level_idc);
+ }
/*
* bit(4) reserved = '1111'b;
@@ -928,6 +1000,7 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
*/
avio_w8(pb, hvcc->parallelismType | 0xfc);
+ if (!is_lhvc) {
/*
* bit(6) reserved = '111111'b;
* unsigned int(2) chromaFormat;
@@ -948,9 +1021,13 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
/* bit(16) avgFrameRate; */
avio_wb16(pb, hvcc->avgFrameRate);
+ }
/*
+ * if (!is_lhvc)
* bit(2) constantFrameRate;
+ * else
+ * bit(2) reserved = '11'b;
* bit(3) numTemporalLayers;
* bit(1) temporalIdNested;
* unsigned int(2) lengthSizeMinusOne;
@@ -961,12 +1038,12 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
hvcc->lengthSizeMinusOne);
/* unsigned int(8) numOfArrays; */
- avio_w8(pb, hvcc->numOfArrays);
+ avio_w8(pb, numOfArrays);
for (unsigned i = 0; i < FF_ARRAY_ELEMS(hvcc->arrays); i++) {
const HVCCNALUnitArray *const array = &hvcc->arrays[i];
- if (!array->numNalus)
+ if (!numNalus[i])
continue;
/*
* bit(1) array_completeness;
@@ -977,11 +1054,14 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
array->NAL_unit_type & 0x3f);
/* unsigned int(16) numNalus; */
- avio_wb16(pb, array->numNalus);
+ avio_wb16(pb, numNalus[i]);
for (unsigned j = 0; j < array->numNalus; j++) {
HVCCNALUnit *nal = &array->nal[j];
+ if (is_lhvc && nal->nuh_layer_id == 0)
+ continue;
+
/* unsigned int(16) nalUnitLength; */
avio_wb16(pb, nal->nalUnitLength);
@@ -1082,12 +1162,11 @@ static int hvcc_parse_nal_unit(const uint8_t *buf, uint32_t len, int type,
return 0;
}
-int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
- int size, int ps_array_completeness)
+static int write_configuration_record(AVIOContext *pb, const uint8_t *data,
+ int size, int flags)
{
HEVCDecoderConfigurationRecord hvcc;
uint8_t *buf, *end, *start = NULL;
- int flags = !!ps_array_completeness * FLAG_ARRAY_COMPLETENESS;
int ret;
if (size < 6) {
@@ -1154,7 +1233,7 @@ int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
}
}
- ret = hvcc_write(pb, &hvcc);
+ ret = hvcc_write(pb, &hvcc, flags);
goto end;
} else if (!(AV_RB24(data) == 1 || AV_RB32(data) == 1)) {
/* Not a valid Annex B start code prefix */
@@ -1183,10 +1262,24 @@ int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
buf += len;
}
- ret = hvcc_write(pb, &hvcc);
+ ret = hvcc_write(pb, &hvcc, flags);
end:
hvcc_close(&hvcc);
av_free(start);
return ret;
}
+
+int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
+ int size, int ps_array_completeness)
+{
+ return write_configuration_record(pb, data, size,
+ !!ps_array_completeness * FLAG_ARRAY_COMPLETENESS);
+}
+
+int ff_isom_write_lhvc(AVIOContext *pb, const uint8_t *data,
+ int size, int ps_array_completeness)
+{
+ return write_configuration_record(pb, data, size,
+ (!!ps_array_completeness * FLAG_ARRAY_COMPLETENESS) | FLAG_IS_LHVC);
+}
diff --git a/libavformat/hevc.h b/libavformat/hevc.h
index cb66ac66ac..12000b25a5 100644
--- a/libavformat/hevc.h
+++ b/libavformat/hevc.h
@@ -97,4 +97,21 @@ int ff_hevc_annexb2mp4_buf(const uint8_t *buf_in, uint8_t **buf_out,
int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
int size, int ps_array_completeness);
+/**
+ * Writes L-HEVC extradata (parameter sets with nuh_layer_id > 0, as a
+ * LHEVCDecoderConfigurationRecord) to the provided AVIOContext.
+ *
+ * If the extradata is Annex B format, it gets converted to lhvC format before
+ * writing. Otherwise, hvcC formated extradata is expected, not lhvC.
+ *
+ * @param pb address of the AVIOContext where the lhvC shall be written
+ * @param data address of the buffer holding the data needed to write the lhvC
+ * @param size size (in bytes) of the data buffer
+ * @param ps_array_completeness whether all parameter sets are in the lhvC (1)
+ * or there may be additional parameter sets in the bitstream (0)
+ * @return >=0 in case of success, a negative value corresponding to an AVERROR
+ * code in case of failure
+ */
+int ff_isom_write_lhvc(AVIOContext *pb, const uint8_t *data,
+ int size, int ps_array_completeness);
#endif /* AVFORMAT_HEVC_H */
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 09/11] avformat/movenc: add support for writing lhvC boxes
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (6 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 08/11] avformat/hevc: add a function to write a lhvC box James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 10/11] avformat/movenc: add support for writting vexu boxes James Almer
` (3 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/movenc.c | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index f8eb6fadf7..26a67e6e47 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1557,6 +1557,26 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
return update_size(pb, pos);
}
+static int mov_write_lhvc_tag(AVIOContext *pb, MOVTrack *track)
+{
+ int64_t pos = avio_tell(pb);
+ int ret;
+
+ avio_wb32(pb, 0);
+ ffio_wfourcc(pb, "lhvC");
+ if (track->tag == MKTAG('h','v','c','1'))
+ ret = ff_isom_write_lhvc(pb, track->vos_data, track->vos_len, 1);
+ else
+ ret = ff_isom_write_lhvc(pb, track->vos_data, track->vos_len, 0);
+
+ if (ret < 0) {
+ avio_seek(pb, pos, SEEK_SET);
+ return ret;
+ }
+
+ return update_size(pb, pos);
+}
+
static int mov_write_evcc_tag(AVIOContext *pb, MOVTrack *track)
{
int64_t pos = avio_tell(pb);
@@ -2523,9 +2543,14 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
} else if (track->par->codec_id == AV_CODEC_ID_DNXHD) {
mov_write_avid_tag(pb, track);
avid = 1;
- } else if (track->par->codec_id == AV_CODEC_ID_HEVC)
+ } else if (track->par->codec_id == AV_CODEC_ID_HEVC) {
mov_write_hvcc_tag(pb, track);
- else if (track->par->codec_id == AV_CODEC_ID_VVC)
+ if (track->st->disposition & AV_DISPOSITION_MULTILAYER) {
+ ret = mov_write_lhvc_tag(pb, track);
+ if (ret < 0)
+ av_log(mov->fc, AV_LOG_WARNING, "Not writing 'lhvC' atom for multilayer stream.\n");
+ }
+ } else if (track->par->codec_id == AV_CODEC_ID_VVC)
mov_write_vvcc_tag(pb, track);
else if (track->par->codec_id == AV_CODEC_ID_H264 && !TAG_IS_AVCI(track->tag)) {
mov_write_avcc_tag(pb, track);
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 10/11] avformat/movenc: add support for writting vexu boxes
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (7 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 09/11] avformat/movenc: add support for writing lhvC boxes James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 11/11] avformat/movenc: add support for writting hfov boxes James Almer
` (2 subsequent siblings)
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/movenc.c | 159 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 154 insertions(+), 5 deletions(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 26a67e6e47..500ea25731 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2190,6 +2190,138 @@ static int mov_write_sv3d_tag(AVFormatContext *s, AVIOContext *pb, AVSphericalMa
return update_size(pb, sv3d_pos);
}
+static inline int64_t rescale_rational(AVRational q, int b)
+{
+ return av_rescale(q.num, b, q.den);
+}
+
+static void mov_write_vexu_proj_tag(AVFormatContext *s, AVIOContext *pb,
+ const AVSphericalMapping *spherical_mapping)
+{
+ avio_wb32(pb, 24); /* size */
+ ffio_wfourcc(pb, "proj");
+ avio_wb32(pb, 16); /* size */
+ ffio_wfourcc(pb, "prji");
+ avio_wb32(pb, 0); /* version + flags */
+
+ switch (spherical_mapping->projection) {
+ case AV_SPHERICAL_RECTILINEAR:
+ ffio_wfourcc(pb, "rect");
+ break;
+ case AV_SPHERICAL_EQUIRECTANGULAR:
+ ffio_wfourcc(pb, "equi");
+ break;
+ case AV_SPHERICAL_HALF_EQUIRECTANGULAR:
+ ffio_wfourcc(pb, "hequ");
+ break;
+ case AV_SPHERICAL_FISHEYE:
+ ffio_wfourcc(pb, "fish");
+ break;
+ default:
+ av_assert0(0);
+ }
+}
+
+static int mov_write_eyes_tag(AVFormatContext *s, AVIOContext *pb,
+ const AVStereo3D *stereo3d)
+{
+ int64_t pos = avio_tell(pb);
+ int view = 0;
+
+ avio_wb32(pb, 0); /* size */
+ ffio_wfourcc(pb, "eyes");
+
+ // stri is mandatory
+ avio_wb32(pb, 13); /* size */
+ ffio_wfourcc(pb, "stri");
+ avio_wb32(pb, 0); /* version + flags */
+ switch (stereo3d->view) {
+ case AV_STEREO3D_VIEW_LEFT:
+ view |= 1 << 0;
+ break;
+ case AV_STEREO3D_VIEW_RIGHT:
+ view |= 1 << 1;
+ break;
+ case AV_STEREO3D_VIEW_PACKED:
+ view |= (1 << 0) | (1 << 1);
+ break;
+ }
+ view |= !!(stereo3d->flags & AV_STEREO3D_FLAG_INVERT) << 3;
+ avio_w8(pb, view);
+
+ // hero is optional
+ if (stereo3d->primary_eye != AV_PRIMARY_EYE_NONE) {
+ avio_wb32(pb, 13); /* size */
+ ffio_wfourcc(pb, "hero");
+ avio_wb32(pb, 0); /* version + flags */
+ avio_w8(pb, stereo3d->primary_eye);
+ }
+
+ // it's not clear if cams is mandatory or optional
+ if (stereo3d->baseline) {
+ avio_wb32(pb, 24); /* size */
+ ffio_wfourcc(pb, "cams");
+ avio_wb32(pb, 16); /* size */
+ ffio_wfourcc(pb, "blin");
+ avio_wb32(pb, 0); /* version + flags */
+ avio_wb32(pb, stereo3d->baseline);
+ }
+
+ // it's not clear if cmfy is mandatory or optional
+ if (stereo3d->horizontal_disparity_adjustment.num) {
+ avio_wb32(pb, 24); /* size */
+ ffio_wfourcc(pb, "cmfy");
+ avio_wb32(pb, 16); /* size */
+ ffio_wfourcc(pb, "dadj");
+ avio_wb32(pb, 0); /* version + flags */
+ avio_wb32(pb, rescale_rational(stereo3d->horizontal_disparity_adjustment, 10000));
+ }
+
+ return update_size(pb, pos);
+}
+
+static int mov_write_vexu_tag(AVFormatContext *s, AVIOContext *pb,
+ const AVStereo3D *stereo3d,
+ const AVSphericalMapping *spherical_mapping)
+{
+ int64_t pos;
+
+ if (spherical_mapping &&
+ spherical_mapping->projection != AV_SPHERICAL_RECTILINEAR &&
+ spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR &&
+ spherical_mapping->projection != AV_SPHERICAL_HALF_EQUIRECTANGULAR &&
+ spherical_mapping->projection != AV_SPHERICAL_FISHEYE) {
+ av_log(s, AV_LOG_WARNING, "Unsupported projection %d. proj not written.\n",
+ spherical_mapping->projection);
+ spherical_mapping = NULL;
+ }
+
+ if (stereo3d && (stereo3d->type == AV_STEREO3D_2D ||
+ (!(stereo3d->flags & AV_STEREO3D_FLAG_INVERT) &&
+ stereo3d->view == AV_STEREO3D_VIEW_UNSPEC &&
+ stereo3d->primary_eye == AV_PRIMARY_EYE_NONE &&
+ !stereo3d->baseline &&
+ !stereo3d->horizontal_disparity_adjustment.num))) {
+ av_log(s, AV_LOG_WARNING, "Unsupported stereo 3d metadata. eyes not written.\n");
+ stereo3d = NULL;
+ }
+
+ if (!spherical_mapping && !stereo3d)
+ return 0;
+
+ pos = avio_tell(pb);
+ avio_wb32(pb, 0); /* size */
+ ffio_wfourcc(pb, "vexu");
+
+ if (spherical_mapping)
+ mov_write_vexu_proj_tag(s, pb, spherical_mapping);
+
+ if (stereo3d)
+ mov_write_eyes_tag(s, pb, stereo3d);
+
+ return update_size(pb, pos);
+}
+
static int mov_write_dvcc_dvvc_tag(AVFormatContext *s, AVIOContext *pb, AVDOVIDecoderConfigurationRecord *dovi)
{
uint8_t buf[ISOM_DVCC_DVVC_SIZE];
@@ -2326,11 +2458,6 @@ static int mov_write_clli_tag(AVIOContext *pb, MOVTrack *track)
return 12;
}
-static inline int64_t rescale_rational(AVRational q, int b)
-{
- return av_rescale(q.num, b, q.den);
-}
-
static int mov_write_mdcv_tag(AVIOContext *pb, MOVTrack *track)
{
const int chroma_den = 50000;
@@ -2623,6 +2750,28 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
mov_write_sv3d_tag(mov->fc, pb, (AVSphericalMapping*)spherical_mapping->data);
}
+ if (track->mode == MODE_MOV || (track->mode == MODE_MP4 &&
+ mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL)) {
+ const AVPacketSideData *sd;
+ const AVStereo3D *stereo3d = NULL;
+ const AVSphericalMapping *spherical_mapping = NULL;
+
+ sd = av_packet_side_data_get(track->st->codecpar->coded_side_data,
+ track->st->codecpar->nb_coded_side_data,
+ AV_PKT_DATA_STEREO3D);
+ if (sd)
+ stereo3d = (AVStereo3D *)sd->data;
+
+ sd = av_packet_side_data_get(track->st->codecpar->coded_side_data,
+ track->st->codecpar->nb_coded_side_data,
+ AV_PKT_DATA_SPHERICAL);
+ if (sd)
+ spherical_mapping = (AVSphericalMapping *)sd->data;
+
+ if (stereo3d || spherical_mapping)
+ mov_write_vexu_tag(s, pb, stereo3d, spherical_mapping);
+ }
+
if (track->mode == MODE_MP4) {
const AVPacketSideData *dovi = av_packet_side_data_get(track->st->codecpar->coded_side_data,
track->st->codecpar->nb_coded_side_data,
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* [FFmpeg-devel] [PATCH 11/11] avformat/movenc: add support for writting hfov boxes
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (8 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 10/11] avformat/movenc: add support for writting vexu boxes James Almer
@ 2024-07-03 21:26 ` James Almer
2024-07-07 15:21 ` [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
2024-07-07 15:43 ` Andreas Rheinhardt
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-03 21:26 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavformat/movenc.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 500ea25731..5f4c1cb6ea 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2195,6 +2195,17 @@ static inline int64_t rescale_rational(AVRational q, int b)
return av_rescale(q.num, b, q.den);
}
+static void mov_write_hfov_tag(AVFormatContext *s, AVIOContext *pb,
+ const AVStereo3D *stereo3d)
+{
+ if (!stereo3d->horizontal_field_of_view.num)
+ return;
+
+ avio_wb32(pb, 12); /* size */
+ ffio_wfourcc(pb, "hfov");
+ avio_wb32(pb, rescale_rational(stereo3d->horizontal_field_of_view, 1000));
+}
+
static void mov_write_vexu_proj_tag(AVFormatContext *s, AVIOContext *pb,
const AVSphericalMapping *spherical_mapping)
{
@@ -2770,6 +2781,8 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex
if (stereo3d || spherical_mapping)
mov_write_vexu_tag(s, pb, stereo3d, spherical_mapping);
+ if (stereo3d)
+ mov_write_hfov_tag(s, pb, stereo3d);
}
if (track->mode == MODE_MP4) {
--
2.45.2
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (9 preceding siblings ...)
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 11/11] avformat/movenc: add support for writting hfov boxes James Almer
@ 2024-07-07 15:21 ` James Almer
2024-07-07 15:43 ` Andreas Rheinhardt
11 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-07 15:21 UTC (permalink / raw)
To: ffmpeg-devel
On 7/3/2024 6:26 PM, James Almer wrote:
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavformat/mov.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 48 insertions(+)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index a3951a6942..30e8086855 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -8157,6 +8157,53 @@ static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> return ff_isom_parse_dvcc_dvvc(c->fc, st, buf, read_size);
> }
>
> +static int mov_read_lhvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> +{
> + AVStream *st;
> + uint8_t *buf;
> + int ret, old_size, num_arrays;
> +
> + if (c->fc->nb_streams < 1)
> + return 0;
> + st = c->fc->streams[c->fc->nb_streams-1];
> +
> + if (!st->codecpar->extradata_size)
> + // TODO: handle lhvC when present before hvcC
> + return 0;
> +
> + if (atom.size < 6 || st->codecpar->extradata_size < 23)
> + return AVERROR_INVALIDDATA;
> +
> + buf = av_malloc(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
> + if (!buf)
> + return AVERROR(ENOMEM);
> + memset(buf + atom.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> +
> + ret = ffio_read_size(pb, buf, atom.size);
> + if (ret < 0) {
> + av_free(buf);
> + av_log(c->fc, AV_LOG_WARNING, "lhvC atom truncated\n");
> + return 0;
> + }
> +
> + num_arrays = buf[5];
> + old_size = st->codecpar->extradata_size;
> + atom.size -= 8 /* account for mov_realloc_extradata offseting */
> + + 6 /* lhvC bytes before the arrays*/;
> +
> + ret = mov_realloc_extradata(st->codecpar, atom);
> + if (ret < 0) {
> + av_free(buf);
> + return ret;
> + }
> +
> + st->codecpar->extradata[22] += num_arrays;
> + memcpy(st->codecpar->extradata + old_size, buf + 6, atom.size + 8);
> +
> + av_free(buf);
> + return 0;
> +}
> +
> static int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> {
> AVFormatContext *ctx = c->fc;
> @@ -8943,6 +8990,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
> { MKTAG('i','p','r','p'), mov_read_iprp },
> { MKTAG('i','i','n','f'), mov_read_iinf },
> { MKTAG('a','m','v','e'), mov_read_amve }, /* ambient viewing environment box */
> +{ MKTAG('l','h','v','C'), mov_read_lhvc },
> #if CONFIG_IAMFDEC
> { MKTAG('i','a','c','b'), mov_read_iacb },
> #endif
Will apply set.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
` (10 preceding siblings ...)
2024-07-07 15:21 ` [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
@ 2024-07-07 15:43 ` Andreas Rheinhardt
2024-07-07 16:18 ` James Almer
11 siblings, 1 reply; 16+ messages in thread
From: Andreas Rheinhardt @ 2024-07-07 15:43 UTC (permalink / raw)
To: ffmpeg-devel
James Almer:
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavformat/mov.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 48 insertions(+)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index a3951a6942..30e8086855 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -8157,6 +8157,53 @@ static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> return ff_isom_parse_dvcc_dvvc(c->fc, st, buf, read_size);
> }
>
> +static int mov_read_lhvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> +{
> + AVStream *st;
> + uint8_t *buf;
> + int ret, old_size, num_arrays;
> +
> + if (c->fc->nb_streams < 1)
> + return 0;
> + st = c->fc->streams[c->fc->nb_streams-1];
> +
> + if (!st->codecpar->extradata_size)
> + // TODO: handle lhvC when present before hvcC
> + return 0;
> +
> + if (atom.size < 6 || st->codecpar->extradata_size < 23)
> + return AVERROR_INVALIDDATA;
> +
> + buf = av_malloc(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
> + if (!buf)
> + return AVERROR(ENOMEM);
> + memset(buf + atom.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> +
> + ret = ffio_read_size(pb, buf, atom.size);
> + if (ret < 0) {
> + av_free(buf);
> + av_log(c->fc, AV_LOG_WARNING, "lhvC atom truncated\n");
> + return 0;
> + }
> +
> + num_arrays = buf[5];
> + old_size = st->codecpar->extradata_size;
> + atom.size -= 8 /* account for mov_realloc_extradata offseting */
> + + 6 /* lhvC bytes before the arrays*/;
> +
> + ret = mov_realloc_extradata(st->codecpar, atom);
> + if (ret < 0) {
> + av_free(buf);
> + return ret;
> + }
> +
> + st->codecpar->extradata[22] += num_arrays;
> + memcpy(st->codecpar->extradata + old_size, buf + 6, atom.size + 8);
> +
> + av_free(buf);
> + return 0;
> +}
> +
> static int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> {
> AVFormatContext *ctx = c->fc;
> @@ -8943,6 +8990,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
> { MKTAG('i','p','r','p'), mov_read_iprp },
> { MKTAG('i','i','n','f'), mov_read_iinf },
> { MKTAG('a','m','v','e'), mov_read_amve }, /* ambient viewing environment box */
> +{ MKTAG('l','h','v','C'), mov_read_lhvc },
> #if CONFIG_IAMFDEC
> { MKTAG('i','a','c','b'), mov_read_iacb },
> #endif
Could this also explain what this box is supposed to be good for?
- Andreas
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [FFmpeg-devel] [PATCH 04/11] avformat/hevc: don't write NALUs with nuh_layer_id > 0 in hvcC boxes
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 04/11] avformat/hevc: don't write NALUs with nuh_layer_id > 0 in hvcC boxes James Almer
@ 2024-07-07 15:46 ` Andreas Rheinhardt
2024-07-07 16:09 ` James Almer
0 siblings, 1 reply; 16+ messages in thread
From: Andreas Rheinhardt @ 2024-07-07 15:46 UTC (permalink / raw)
To: ffmpeg-devel
James Almer:
> hvcC should only contain nuh_layer_id == 0 NALUs. Support for a box meant to
> contain higher layer NALUs will be added in a following patch.
> To achieve this, all sources are parsed and filtered, including hvcC source
> that until now were propagated untouched. This is reflected in how the affected
> reference files now have ps_array_completeness set to 0 instead of 1 for some
> non-PS NALUs.
Was the earlier stuff wrong?
>
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
> libavformat/hevc.c | 140 ++++++++++++++++-----
> libavformat/hevc.h | 3 +-
> tests/ref/fate/enhanced-flv-hevc | 4 +-
> tests/ref/fate/matroska-dovi-write-config8 | 4 +-
> tests/ref/lavf-fate/hevc.flv | 2 +-
> 5 files changed, 118 insertions(+), 35 deletions(-)
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [FFmpeg-devel] [PATCH 04/11] avformat/hevc: don't write NALUs with nuh_layer_id > 0 in hvcC boxes
2024-07-07 15:46 ` Andreas Rheinhardt
@ 2024-07-07 16:09 ` James Almer
0 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-07 16:09 UTC (permalink / raw)
To: ffmpeg-devel
On 7/7/2024 12:46 PM, Andreas Rheinhardt wrote:
> James Almer:
>> hvcC should only contain nuh_layer_id == 0 NALUs. Support for a box meant to
>> contain higher layer NALUs will be added in a following patch.
>> To achieve this, all sources are parsed and filtered, including hvcC source
>> that until now were propagated untouched. This is reflected in how the affected
>> reference files now have ps_array_completeness set to 0 instead of 1 for some
>> non-PS NALUs.
>
> Was the earlier stuff wrong?
Probably, but it's unlikely that any nuh_layer_id > 0 NALU was ever
written as it would have required either a broken isobmff source (where
such NALUs were wrongly put in hvcC for us to then blindly copy), or a
raw multilayer annex-b source.
>
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>> libavformat/hevc.c | 140 ++++++++++++++++-----
>> libavformat/hevc.h | 3 +-
>> tests/ref/fate/enhanced-flv-hevc | 4 +-
>> tests/ref/fate/matroska-dovi-write-config8 | 4 +-
>> tests/ref/lavf-fate/hevc.flv | 2 +-
>> 5 files changed, 118 insertions(+), 35 deletions(-)
>>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing
2024-07-07 15:43 ` Andreas Rheinhardt
@ 2024-07-07 16:18 ` James Almer
0 siblings, 0 replies; 16+ messages in thread
From: James Almer @ 2024-07-07 16:18 UTC (permalink / raw)
To: ffmpeg-devel
On 7/7/2024 12:43 PM, Andreas Rheinhardt wrote:
> James Almer:
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>> libavformat/mov.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 48 insertions(+)
>>
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index a3951a6942..30e8086855 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -8157,6 +8157,53 @@ static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>> return ff_isom_parse_dvcc_dvvc(c->fc, st, buf, read_size);
>> }
>>
>> +static int mov_read_lhvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>> +{
>> + AVStream *st;
>> + uint8_t *buf;
>> + int ret, old_size, num_arrays;
>> +
>> + if (c->fc->nb_streams < 1)
>> + return 0;
>> + st = c->fc->streams[c->fc->nb_streams-1];
>> +
>> + if (!st->codecpar->extradata_size)
>> + // TODO: handle lhvC when present before hvcC
>> + return 0;
>> +
>> + if (atom.size < 6 || st->codecpar->extradata_size < 23)
>> + return AVERROR_INVALIDDATA;
>> +
>> + buf = av_malloc(atom.size + AV_INPUT_BUFFER_PADDING_SIZE);
>> + if (!buf)
>> + return AVERROR(ENOMEM);
>> + memset(buf + atom.size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
>> +
>> + ret = ffio_read_size(pb, buf, atom.size);
>> + if (ret < 0) {
>> + av_free(buf);
>> + av_log(c->fc, AV_LOG_WARNING, "lhvC atom truncated\n");
>> + return 0;
>> + }
>> +
>> + num_arrays = buf[5];
>> + old_size = st->codecpar->extradata_size;
>> + atom.size -= 8 /* account for mov_realloc_extradata offseting */
>> + + 6 /* lhvC bytes before the arrays*/;
>> +
>> + ret = mov_realloc_extradata(st->codecpar, atom);
>> + if (ret < 0) {
>> + av_free(buf);
>> + return ret;
>> + }
>> +
>> + st->codecpar->extradata[22] += num_arrays;
>> + memcpy(st->codecpar->extradata + old_size, buf + 6, atom.size + 8);
>> +
>> + av_free(buf);
>> + return 0;
>> +}
>> +
>> static int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>> {
>> AVFormatContext *ctx = c->fc;
>> @@ -8943,6 +8990,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
>> { MKTAG('i','p','r','p'), mov_read_iprp },
>> { MKTAG('i','i','n','f'), mov_read_iinf },
>> { MKTAG('a','m','v','e'), mov_read_amve }, /* ambient viewing environment box */
>> +{ MKTAG('l','h','v','C'), mov_read_lhvc },
>> #if CONFIG_IAMFDEC
>> { MKTAG('i','a','c','b'), mov_read_iacb },
>> #endif
>
> Could this also explain what this box is supposed to be good for?
It contains the global nuh_layer_id > 0 PS NALUs to handle L-HEVC
(layered) streams. It's described in ISO 14496-15 section 9.4.3.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2024-07-07 16:19 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-07-03 21:26 [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 02/11] avformat: Add a new stream disposition for multilayer video James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 03/11] avformat/mov: Mark streams with a layered HEVC box as multilayer James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 04/11] avformat/hevc: don't write NALUs with nuh_layer_id > 0 in hvcC boxes James Almer
2024-07-07 15:46 ` Andreas Rheinhardt
2024-07-07 16:09 ` James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 05/11] avformat/hevc: don't write the same array values per nal addition James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 06/11] avformat/hevc: use a single array for per-PS NALUs James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 07/11] avformat/hevc: store parameter set and layer IDs in HVCCNALUnit James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 08/11] avformat/hevc: add a function to write a lhvC box James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 09/11] avformat/movenc: add support for writing lhvC boxes James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 10/11] avformat/movenc: add support for writting vexu boxes James Almer
2024-07-03 21:26 ` [FFmpeg-devel] [PATCH 11/11] avformat/movenc: add support for writting hfov boxes James Almer
2024-07-07 15:21 ` [FFmpeg-devel] [PATCH 01/11] avformat/mov: add support for lhvC box parsing James Almer
2024-07-07 15:43 ` Andreas Rheinhardt
2024-07-07 16:18 ` James Almer
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git