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]

Reply via email to