This is an automated email from the git hooks/post-receive script.
Git pushed a commit to branch master
in repository ffmpeg.
The following commit(s) were added to refs/heads/master by this push:
new d998016f92 avformat/mov: Support rndr track reference type
d998016f92 is described below
commit d998016f921cd7a909cd64296c39a981722b1be2
Author: Vignesh Venkat <[email protected]>
AuthorDate: Tue Jul 14 14:23:00 2026 -0700
Commit: James Almer <[email protected]>
CommitDate: Tue Aug 18 22:26:29 2026 +0000
avformat/mov: Support rndr track reference type
This is similar to `cdsc` but intended for rendering metadata.
From a demuxer's point of view both of them are essentially the
same.
Added in the draft spec here: https://www.mpeg.org/standards/MPEG-4/12/
Link to the newly added fate sample:
https://drive.google.com/file/d/1qfRALYT6ZCcijKEAkrWWjIDq_E2dm3Ix/view?usp=drive_link
Signed-off-by: Vignesh Venkat <[email protected]>
---
libavformat/mov.c | 67 ++++++++++++----------
tests/fate/mov.mak | 3 +
tests/ref/fate/mov-t35-cdsc-track | 2 +-
.../{mov-t35-cdsc-track => mov-t35-rndr-track} | 2 +-
4 files changed, 43 insertions(+), 31 deletions(-)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index fcec8d1633..8318082471 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -2700,7 +2700,7 @@ static MovTref *mov_add_tref_tag(MOVStreamContext *sc,
uint32_t name)
return tag;
}
-static int mov_read_cdsc(MOVContext* c, AVIOContext* pb, MOVAtom atom)
+static int mov_read_cdsc_rndr(MOVContext* c, AVIOContext* pb, MOVAtom atom)
{
AVStream* st;
MOVStreamContext* sc;
@@ -2709,7 +2709,7 @@ static int mov_read_cdsc(MOVContext* c, AVIOContext* pb,
MOVAtom atom)
return 0;
if (atom.size > 4) {
- av_log(c->fc, AV_LOG_ERROR, "Only a single tref of type cdsc is
supported\n");
+ av_log(c->fc, AV_LOG_ERROR, "Only a single tref of type cdsc/rndr is
supported\n");
return AVERROR_PATCHWELCOME;
}
if (atom.size < 4)
@@ -10026,7 +10026,8 @@ static const MOVParseTableEntry
mov_default_parse_table[] = {
{ MKTAG('a','v','c','C'), mov_read_glbl },
{ MKTAG('p','a','s','p'), mov_read_pasp },
{ MKTAG('c','l','a','p'), mov_read_clap },
-{ MKTAG('c','d','s','c'), mov_read_cdsc },
+{ MKTAG('c','d','s','c'), mov_read_cdsc_rndr },
+{ MKTAG('r','n','d','r'), mov_read_cdsc_rndr },
{ MKTAG('s','b','a','s'), mov_read_sbas },
{ MKTAG('v','d','e','p'), mov_read_vdep },
{ MKTAG('s','i','d','x'), mov_read_sidx },
@@ -11352,8 +11353,13 @@ static AVStream
*mov_find_reference_track(AVFormatContext *s, AVStream *st,
return NULL;
}
-static int mov_parse_cdsc_streams(AVFormatContext *s)
+static int mov_parse_cdsc_and_rndr_streams(AVFormatContext *s)
{
+ static const uint32_t tref_tags[] = {
+ MKTAG('c','d','s','c'),
+ MKTAG('r','n','d','r'),
+ };
+
int err;
// Don't try to add a group if there's only one track
@@ -11361,39 +11367,42 @@ static int mov_parse_cdsc_streams(AVFormatContext *s)
return 0;
for (int i = 0; i < s->nb_streams; i++) {
- AVStreamGroup *stg;
AVStream *st = s->streams[i];
- AVStream *st_ref;
MOVStreamContext *sc = st->priv_data;
- MovTref *tag = mov_find_tref_tag(sc, MKTAG('c','d','s','c'));
- if (!tag)
- continue;
+ for (int c = 0; c < FF_ARRAY_ELEMS(tref_tags); c++) {
+ AVStreamGroup *stg;
+ AVStream *st_ref;
+ MovTref *tag = mov_find_tref_tag(sc, tref_tags[c]);
- st_ref = mov_find_reference_track(s, st, tag->id, tag->nb_id, 0);
- if (!st_ref) {
- int loglevel = (s->error_recognition & AV_EF_EXPLODE) ?
AV_LOG_ERROR : AV_LOG_WARNING;
- av_log(s, loglevel, "Failed to find referenced stream\n");
- if (s->error_recognition & AV_EF_EXPLODE)
- return AVERROR_INVALIDDATA;
- continue;
- }
+ if (!tag)
+ continue;
- stg = avformat_stream_group_create(s, AV_STREAM_GROUP_PARAMS_TREF,
NULL);
- if (!stg)
- return AVERROR(ENOMEM);
+ st_ref = mov_find_reference_track(s, st, tag->id, tag->nb_id, 0);
+ if (!st_ref) {
+ int loglevel = (s->error_recognition & AV_EF_EXPLODE) ?
AV_LOG_ERROR : AV_LOG_WARNING;
+ av_log(s, loglevel, "Failed to find referenced stream\n");
+ if (s->error_recognition & AV_EF_EXPLODE)
+ return AVERROR_INVALIDDATA;
+ continue;
+ }
- stg->id = st->id;
+ stg = avformat_stream_group_create(s, AV_STREAM_GROUP_PARAMS_TREF,
NULL);
+ if (!stg)
+ return AVERROR(ENOMEM);
- err = avformat_stream_group_add_stream(stg, st_ref);
- if (err < 0)
- return err;
+ stg->id = st_ref->id;
- err = avformat_stream_group_add_stream(stg, st);
- if (err < 0)
- return err;
+ err = avformat_stream_group_add_stream(stg, st_ref);
+ if (err < 0)
+ return err;
- stg->params.tref->metadata_index = stg->nb_streams - 1;
+ err = avformat_stream_group_add_stream(stg, st);
+ if (err < 0)
+ return err;
+
+ stg->params.tref->metadata_index = stg->nb_streams - 1;
+ }
}
return 0;
@@ -11620,7 +11629,7 @@ static int mov_read_header(AVFormatContext *s)
}
/* Create metadata stream groups. */
- err = mov_parse_cdsc_streams(s);
+ err = mov_parse_cdsc_and_rndr_streams(s);
if (err < 0)
return err;
diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
index 94b0d80c5b..1a81962626 100644
--- a/tests/fate/mov.mak
+++ b/tests/fate/mov.mak
@@ -39,6 +39,7 @@ FATE_MOV_FFPROBE-$(call FRAMEMD5, MOV, H264, H264_PARSER) +=
fate-mov-neg-firstp
fate-mov-mp4-with-mov-in24-ver \
fate-mov-mime-codecstring \
fate-mov-t35-cdsc-track \
+ fate-mov-t35-rndr-track \
FATE_MOV_FFPROBE-$(call FRAMEMD5, MOV, MPEG4, H264_PARSER) +=
fate-mov-mp4-extended-atom \
@@ -172,6 +173,8 @@ fate-mov-mime-codecstring: CMD = run
ffprobe$(PROGSSUF)$(EXESUF) -show_entries s
fate-mov-t35-cdsc-track: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries
stream_group=index,id,nb_streams,type:stream_group_stream=index,id,codec_name,codec_type,codec_tag_string,extradata_size
$(TARGET_SAMPLES)/mov/mov-t35-cdsc-track.mp4
+fate-mov-t35-rndr-track: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries
stream_group=index,id,nb_streams,type:stream_group_stream=index,id,codec_name,codec_type,codec_tag_string,extradata_size
$(TARGET_SAMPLES)/mov/mov-t35-rndr-track.mp4
+
FATE_MOV_FFMPEG_FFPROBE_SAMPLES-$(call REMUX, MP4 MOV, OGG_DEMUXER
VORBIS_DECODER) \
+= fate-mov-mp4-chapters
fate-mov-mp4-chapters: CMD = transcode ogg
$(TARGET_SAMPLES)/vorbis/vorbis_chapter_extension_demo.ogg mp4 "-c copy" "-c
copy -t 0.1" "-show_chapters"
diff --git a/tests/ref/fate/mov-t35-cdsc-track
b/tests/ref/fate/mov-t35-cdsc-track
index 29fbab1c13..bdc8df85c8 100644
--- a/tests/ref/fate/mov-t35-cdsc-track
+++ b/tests/ref/fate/mov-t35-cdsc-track
@@ -1,6 +1,6 @@
[STREAM_GROUP]
index=0
-id=0x2
+id=0x1
nb_streams=2
type=Track Reference
[STREAM]
diff --git a/tests/ref/fate/mov-t35-cdsc-track
b/tests/ref/fate/mov-t35-rndr-track
similarity index 97%
copy from tests/ref/fate/mov-t35-cdsc-track
copy to tests/ref/fate/mov-t35-rndr-track
index 29fbab1c13..bdc8df85c8 100644
--- a/tests/ref/fate/mov-t35-cdsc-track
+++ b/tests/ref/fate/mov-t35-rndr-track
@@ -1,6 +1,6 @@
[STREAM_GROUP]
index=0
-id=0x2
+id=0x1
nb_streams=2
type=Track Reference
[STREAM]
--
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]