This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit 504c135f8ccb2542fb170577dd2809b25c671102
Author:     Tau Gärtli <[email protected]>
AuthorDate: Thu Apr 30 20:53:07 2026 +0200
Commit:     Tau Gärtli <[email protected]>
CommitDate: Sat May 23 16:07:57 2026 +0200

    libavformat: Add generic `disc_subtitle` tag mapping for MOV/MP4
    
    The mapping is taken from Picard's [1] and taglib's [2] documentation.
    
    [1]: 
https://picard-docs.musicbrainz.org/en/appendices/tag_mapping.html#disc-subtitle
    [2]: https://taglib.org/api/p_propertymapping.html
---
 libavformat/mov.c                     |  6 ++++++
 libavformat/movenc.c                  | 40 +++++++++++++++++++++++++++++++++++
 tests/ref/fate/generic-tags-remux-mov |  5 +++--
 3 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index e4e8036a4a..1cda7a1d05 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -5524,6 +5524,12 @@ static int mov_read_custom(MOVContext *c, AVIOContext 
*pb, MOVAtom atom)
                     sc->start_pad = priming;
             }
         }
+        if (strcmp(mean, "com.apple.iTunes") == 0 &&
+            strcmp(key, "DISCSUBTITLE") == 0) {
+            av_dict_set(&c->fc->metadata, "disc_subtitle", val,
+                        AV_DICT_DONT_STRDUP_VAL);
+            val = NULL;
+        }
         if (strcmp(key, "cdec") != 0) {
             av_dict_set(&c->fc->metadata, key, val,
                         AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 10ea818dd3..586a378c4e 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -4595,6 +4595,35 @@ static int mov_write_string_tag(AVIOContext *pb, const 
char *name,
     return size;
 }
 
+static int mov_write_freeform_tag(AVIOContext *pb, const char *mean,
+                                  const char *name, const char *data)
+{
+    if (!data || !data[0])
+        return 0;
+
+    static const char stub_flags[4] = {0, 0, 0, 0};
+
+    int64_t entry_pos = avio_tell(pb);
+    avio_wb32(pb, 0); /* size */
+    ffio_wfourcc(pb, "----"); /* freeform */
+
+    size_t mean_len = strlen(mean);
+    avio_wb32(pb, 12 + mean_len);
+    ffio_wfourcc(pb, "mean");
+    avio_write(pb, &stub_flags[0], sizeof(stub_flags));
+    avio_write(pb, mean, mean_len);
+
+    size_t name_len = strlen(name);
+    avio_wb32(pb, 12 + name_len);
+    ffio_wfourcc(pb, "name");
+    avio_write(pb, &stub_flags[0], sizeof(stub_flags));
+    avio_write(pb, name, name_len);
+
+    mov_write_string_data_tag(pb, data, 0, 1);
+
+    return update_size(pb, entry_pos);
+}
+
 static AVDictionaryEntry *get_metadata_lang(AVFormatContext *s,
                                             const char *tag, int *lang)
 {
@@ -4631,6 +4660,16 @@ static int mov_write_string_metadata(AVFormatContext *s, 
AVIOContext *pb,
     return mov_write_string_tag(pb, name, t->value, lang, long_style);
 }
 
+static int mov_write_custom_metadata(AVFormatContext *s, AVIOContext *pb,
+                                     const char *mean, const char *name,
+                                     const char *tag)
+{
+    AVDictionaryEntry *t = av_dict_get(s->metadata, tag, NULL, 0);
+    if (!t)
+        return 0;
+    return mov_write_freeform_tag(pb, mean, name, t->value);
+}
+
 /* iTunes bpm number */
 static int mov_write_tmpo_tag(AVIOContext *pb, AVFormatContext *s)
 {
@@ -4819,6 +4858,7 @@ static int mov_write_ilst_tag(AVIOContext *pb, 
MOVMuxContext *mov,
     mov_write_trkn_tag(pb, mov, s, 0); // track number
     mov_write_trkn_tag(pb, mov, s, 1); // disc number
     mov_write_tmpo_tag(pb, s);
+    mov_write_custom_metadata(s, pb, "com.apple.iTunes", "DISCSUBTITLE", 
"disc_subtitle");
     return update_size(pb, pos);
 }
 
diff --git a/tests/ref/fate/generic-tags-remux-mov 
b/tests/ref/fate/generic-tags-remux-mov
index eb8c8f4e42..41dd43fcbf 100644
--- a/tests/ref/fate/generic-tags-remux-mov
+++ b/tests/ref/fate/generic-tags-remux-mov
@@ -1,5 +1,5 @@
-7b4885e9116562745df4c6bdc03b3bce *tests/data/fate/generic-tags-remux-mov.mp4
-10325 tests/data/fate/generic-tags-remux-mov.mp4
+e08290a2eaf72d1565f4a77a5b9093f8 *tests/data/fate/generic-tags-remux-mov.mp4
+10409 tests/data/fate/generic-tags-remux-mov.mp4
 #extradata 0:        5, 0x03460155
 #tb 0: 1/44100
 #media_type 0: audio
@@ -66,4 +66,5 @@ TAG:genre=Electronic
 TAG:copyright=2011 M83 Recording Inc
 TAG:track=1/11
 TAG:disc=1
+TAG:disc_subtitle=Hurry Up
 [/FORMAT]

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to