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

Git pushed a commit to branch master
in repository ffmpeg.

commit b79eae1af40f5831d5529eae6b919c43a713be00
Author:     Romain Beauxis <[email protected]>
AuthorDate: Wed Dec 17 18:47:34 2025 -0600
Commit:     Romain Beauxis <[email protected]>
CommitDate: Sat Jul 18 09:59:57 2026 -0500

    libavformat/id3v2enc.c: add write support for COMM/USLT descriptor+lang keys
---
 libavformat/avformat.h                           |   3 +
 libavformat/id3v2.c                              |   6 +-
 libavformat/id3v2enc.c                           | 285 +++++++++++++++++------
 tests/ref/fate/generic-tags-remux-mp3            |   2 +-
 tests/ref/fate/id3v2-comm                        |   4 +-
 tests/ref/fate/id3v2-comm-dashed-descriptor      |   4 +-
 tests/ref/fate/id3v2-comm-descriptor             |   4 +-
 tests/ref/fate/id3v2-comm-descriptor-no-lang     |   6 +-
 tests/ref/fate/id3v2-comm-foo-lang-as-descriptor |   6 +-
 tests/ref/fate/id3v2-comm-invalid-lang           |   4 +-
 tests/ref/fate/id3v2-comm-lang-as-descriptor     |   6 +-
 tests/ref/fate/id3v2-comm-long-descriptor        |   4 +-
 tests/ref/fate/id3v2-comm-multi-invalid-lang     |   4 +-
 tests/ref/fate/id3v2-comm-raw-key                |   4 +-
 tests/ref/fate/id3v2-comm-sort                   |   4 +-
 tests/ref/fate/id3v2-comm-sort-                  |   6 +-
 tests/ref/fate/id3v2-comm-sort-eng               |   4 +-
 tests/ref/fate/id3v2-lang-und                    |   8 +-
 tests/ref/fate/id3v2-lang-xxx-remux              |   4 +-
 tests/ref/fate/id3v2-lyrics                      |   4 +-
 tests/ref/fate/id3v2-reenc-remux-keep            |   4 +-
 21 files changed, 268 insertions(+), 108 deletions(-)

diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index e5a6481aa8..d4f10122e6 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -371,6 +371,9 @@ struct AVFrame;
  *       For example: Author-ger=Michael, Author-eng=Mike
  *       The original/default language is in the unqualified "Author" tag.
  *       A demuxer should set a default if it sets any translated tag.
+ *       When a language is required by the format but not specified in the key
+ *       (e.g. ID3v2 COMM and USLT frames), the default is left to the
+ *       underlying implementation (ID3v2 defaults to "und").
  *    -  sorting  -- a modified version of a tag that should be used for
  *       sorting will have '-sort' appended. E.g. artist="The Beatles",
  *       artist-sort="Beatles, The".
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index 1b4d4e65ef..ad670052ff 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -47,6 +47,7 @@
 #include "id3v2.h"
 
 const AVMetadataConv ff_id3v2_34_metadata_conv[] = {
+    { "COMM", "comment"      },
     { "TALB", "album"        },
     { "TCOM", "composer"     },
     { "TCON", "genre"        },
@@ -404,7 +405,10 @@ static void read_lang_descr_tag(AVFormatContext *s, 
AVIOContext *pb,
         *p = av_tolower(*p);
 
     // Some libraries set XXX for unknown language.
-    if (!strcmp(language, "xxx"))
+    if (!strcmp(language, "xxx") ||
+        // By convention, "und" is represented as a key with
+        // no language, e.g. "comment" or "lyrics"
+        !strcmp(language, "und"))
         memset(language, 0, sizeof(language));
 
     taglen -= 4;
diff --git a/libavformat/id3v2enc.c b/libavformat/id3v2enc.c
index ac907c2758..12b0400541 100644
--- a/libavformat/id3v2enc.c
+++ b/libavformat/id3v2enc.c
@@ -24,7 +24,9 @@
 #include "libavutil/avstring.h"
 #include "libavutil/dict.h"
 #include "libavutil/intreadwrite.h"
+#include "libavutil/mem.h"
 #include "avformat.h"
+#include "avlanguage.h"
 #include "avio.h"
 #include "avio_internal.h"
 #include "id3v2.h"
@@ -58,43 +60,93 @@ static void id3v2_encode_string(AVIOContext *pb, const 
uint8_t *str,
     put(pb, str);
 }
 
+static int id3v2_put_frame(ID3v2EncContext *id3, AVIOContext *avioc, 
AVIOContext *dyn_buf,
+                           const uint32_t tag, const uint8_t flags)
+{
+    int len;
+    uint8_t *pb;
+    len = avio_get_dyn_buf(dyn_buf, &pb);
+
+    avio_wb32(avioc, tag);
+    /* ID3v2.3 frame size is not sync-safe */
+    if (id3->version == 3)
+        avio_wb32(avioc, len);
+    else
+        id3v2_put_size(avioc, len);
+    avio_wb16(avioc, flags);
+    avio_write(avioc, pb, len);
+
+    id3->len += len + ID3v2_HEADER_SIZE;
+
+    ffio_free_dyn_buf(&dyn_buf);
+    return 1;
+}
+
 /**
- * Write a text frame with one (normal frames) or two (TXXX frames) strings
+ * Write a frame containing lang, descr and text such as COMM and USLT
  * according to encoding (only UTF-8 or UTF-16+BOM supported).
  * @return number of bytes written or a negative error code.
  */
-static int id3v2_put_ttag(ID3v2EncContext *id3, AVIOContext *avioc, const char 
*str1, const char *str2,
-                          uint32_t tag, enum ID3v2Encoding enc)
+static int id3v2_put_lang_descr_tag(
+    ID3v2EncContext *id3, AVIOContext *avioc,
+    const uint32_t tag, const uint8_t flags,
+    const char *lang, const char *descr,
+    const char *comment, enum ID3v2Encoding enc)
 {
-    int len, ret;
-    uint8_t *pb;
+    int ret;
     AVIOContext *dyn_buf;
     if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
         return ret;
 
     /* check if the strings are ASCII-only and use UTF16 only if
      * they're not */
-    if (enc == ID3v2_ENCODING_UTF16BOM && string_is_ascii(str1) &&
-        (!str2 || string_is_ascii(str2)))
+    if (enc == ID3v2_ENCODING_UTF16BOM && string_is_ascii(comment) &&
+        (!descr || string_is_ascii(descr)))
         enc = ID3v2_ENCODING_ISO8859;
 
     avio_w8(dyn_buf, enc);
-    id3v2_encode_string(dyn_buf, str1, enc);
-    if (str2)
-        id3v2_encode_string(dyn_buf, str2, enc);
-    len = avio_get_dyn_buf(dyn_buf, &pb);
+    avio_write(dyn_buf, lang, 3);
+    // avio_put_str can handle NULL pointer but avio_put_str16le cannot.
+    id3v2_encode_string(dyn_buf, descr ? descr : "", enc);
+    id3v2_encode_string(dyn_buf, comment, enc);
 
-    avio_wb32(avioc, tag);
-    /* ID3v2.3 frame size is not sync-safe */
-    if (id3->version == 3)
-        avio_wb32(avioc, len);
-    else
-        id3v2_put_size(avioc, len);
-    avio_wb16(avioc, 0);
-    avio_write(avioc, pb, len);
+    return id3v2_put_frame(id3, avioc, dyn_buf, tag, flags);
+}
 
-    ffio_free_dyn_buf(&dyn_buf);
-    return len + ID3v2_HEADER_SIZE;
+/**
+ * Write a text frame with multiple text string according to encoding (only
+ * UTF-8 or UTF-16+BOM supported).
+ * @return number of bytes written or a negative error code.
+ */
+static int id3v2_put_text_tag(
+    ID3v2EncContext *id3, AVIOContext *avioc,
+    const uint32_t tag, const uint8_t flags,
+    const char **strings, int len,
+    enum ID3v2Encoding enc)
+{
+    int i, ret;
+    AVIOContext *dyn_buf;
+    if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
+        return ret;
+
+    /* check if the strings are ASCII-only and use UTF16 only if
+     * they're not */
+    if (enc == ID3v2_ENCODING_UTF16BOM) {
+        enc = ID3v2_ENCODING_ISO8859;
+        for (i = 0; i < len; i++) {
+            if (!string_is_ascii((const uint8_t *)strings[i])) {
+                enc = ID3v2_ENCODING_UTF16BOM;
+                break;
+            }
+        }
+    }
+
+    avio_w8(dyn_buf, enc);
+
+    for (i = 0; i < len; i++)
+        id3v2_encode_string(dyn_buf, strings[i], enc);
+
+    return id3v2_put_frame(id3, avioc, dyn_buf, tag, flags);
 }
 
 /**
@@ -102,10 +154,12 @@ static int id3v2_put_ttag(ID3v2EncContext *id3, 
AVIOContext *avioc, const char *
  * ID3v2_PRIV_METADATA_PREFIX. 'data' is provided as a string. Any \xXX
  * (where 'X' is a valid hex digit) will be unescaped to the byte value.
  */
-static int id3v2_put_priv(ID3v2EncContext *id3, AVIOContext *avioc, const char 
*key, const char *data)
+static int id3v2_put_priv(
+    ID3v2EncContext *id3, AVIOContext *avioc,
+    const uint8_t flags, const char *key,
+    const char *data)
 {
-    int len, ret;
-    uint8_t *pb;
+    int ret;
     AVIOContext *dyn_buf;
 
     if (!av_strstart(key, ID3v2_PRIV_METADATA_PREFIX, &key)) {
@@ -135,19 +189,104 @@ static int id3v2_put_priv(ID3v2EncContext *id3, 
AVIOContext *avioc, const char *
         }
     }
 
-    len = avio_get_dyn_buf(dyn_buf, &pb);
+    return id3v2_put_frame(id3, avioc, dyn_buf, MKBETAG('P', 'R', 'I', 'V'),
+                           flags);
+}
 
-    avio_wb32(avioc, MKBETAG('P', 'R', 'I', 'V'));
-    if (id3->version == 3)
-        avio_wb32(avioc, len);
-    else
-        id3v2_put_size(avioc, len);
-    avio_wb16(avioc, 0);
-    avio_write(avioc, pb, len);
+struct LangDescrTagMap {
+    const char * const key;
+    uint32_t tag;
+};
 
-    ffio_free_dyn_buf(&dyn_buf);
+static const struct LangDescrTagMap id3v2_lang_descr_tags[] = {
+    {.key = "comment", .tag = MKBETAG('C', 'O', 'M', 'M')},
+    {.key = "lyrics", .tag = MKBETAG('U', 'S', 'L', 'T')},
+    {.key = NULL, .tag = 0}
+};
 
-    return len + ID3v2_HEADER_SIZE;
+static int is_valid_lang(const char *s)
+{
+    return strlen(s) == 3 && ff_convert_lang_to(s, AV_LANG_ISO639_2_BIBL);
+}
+
+static int id3v2_check_write_lang_descr_tag(
+    ID3v2EncContext *id3, AVIOContext *pb, const AVDictionaryEntry *t,
+    enum ID3v2Encoding enc)
+{
+    int i, key_len;
+    const char *key, *after_dash, *last_dash;
+    uint32_t tag, ff_tag = 0;
+    char lang[4] = "und";
+
+    /* Raw 4CC key (e.g. "COMM"): only exact match, no suffix modifiers. */
+    if (strlen(t->key) == 4)
+        ff_tag = AV_RB32(t->key);
+
+    for (i = 0; id3v2_lang_descr_tags[i].key; i++) {
+        tag = id3v2_lang_descr_tags[i].tag;
+        key = id3v2_lang_descr_tags[i].key;
+        key_len = strlen(key);
+
+        if (ff_tag == tag)
+            return id3v2_put_lang_descr_tag(id3, pb, tag, 0,
+                                            lang, NULL, t->value, enc);
+
+        /* Generic key (e.g. "comment"): require exact match or '-' separator. 
*/
+        if (strncmp(t->key, key, key_len) ||
+            (t->key[key_len] != '\0' && t->key[key_len] != '-'))
+            continue;
+
+        if (t->key[key_len] == '\0')
+            return id3v2_put_lang_descr_tag(id3, pb, tag, 0,
+                                            lang, NULL, t->value, enc);
+
+        /* Has suffix(es) after '-'. */
+        after_dash = t->key + key_len + 1;
+        last_dash  = strrchr(after_dash, '-');
+        const char *suffix = NULL;
+        const char *middle = NULL;
+
+        if (last_dash) {
+            middle = after_dash;
+            suffix = last_dash + 1;
+        } else {
+            suffix = after_dash;
+        }
+
+        if (!middle) {
+            /* <tag>-<suffix>: valid lang → lang only; otherwise →
+             * descriptor only. */
+            const char *descr = NULL;
+            if (is_valid_lang(suffix))
+                memcpy(lang, suffix, 3);
+            else
+                descr = suffix;
+            return id3v2_put_lang_descr_tag(id3, pb, tag, 0, lang,
+                                            descr, t->value, enc);
+        } else {
+            /* <tag>-<middle>-<suffix>: valid lang suffix → lang+descriptor;
+             * otherwise → full suffix after first '-' is the descriptor. */
+            if (is_valid_lang(suffix) || *suffix == '\0') {
+                /* Valid lang suffix or trailing dash (explicit empty lang):
+                 * descriptor = everything before the last '-'. */
+                size_t descr_len = last_dash - after_dash;
+                char *descr = av_strndup(middle, descr_len);
+                int ret;
+                if (!descr)
+                    return AVERROR(ENOMEM);
+                if (*suffix)
+                    memcpy(lang, suffix, 3);
+                ret = id3v2_put_lang_descr_tag(id3, pb, tag, 0,
+                                               lang, descr, t->value, enc);
+                av_freep(&descr);
+                return ret;
+            }
+            return id3v2_put_lang_descr_tag(id3, pb, tag, 0,
+                                            lang, after_dash, t->value, enc);
+        }
+    }
+
+    return 0;
 }
 
 static int id3v2_check_write_tag(ID3v2EncContext *id3, AVIOContext *pb, const 
AVDictionaryEntry *t,
@@ -157,12 +296,16 @@ static int id3v2_check_write_tag(ID3v2EncContext *id3, 
AVIOContext *pb, const AV
     int i;
 
     if (t->key[0] != 'T' || strlen(t->key) != 4)
-        return -1;
+        return 0;
+
     tag = AV_RB32(t->key);
     for (i = 0; *table[i]; i++)
-        if (tag == AV_RB32(table[i]))
-            return id3v2_put_ttag(id3, pb, t->value, NULL, tag, enc);
-    return -1;
+        if (tag == AV_RB32(table[i])) {
+            const char *strings[] = {t->value};
+            return id3v2_put_text_tag(id3, pb, tag, 0, strings, 1, enc);
+        }
+
+    return 0;
 }
 
 static void id3v2_3_metadata_split_date(AVDictionary **pm)
@@ -230,27 +373,36 @@ static int write_metadata(AVIOContext *pb, AVDictionary 
**metadata,
         ff_metadata_conv(metadata, ff_id3v2_4_metadata_conv, NULL);
 
     while ((t = av_dict_iterate(*metadata, t))) {
-        if ((ret = id3v2_check_write_tag(id3, pb, t, ff_id3v2_tags, enc)) > 0) 
{
-            id3->len += ret;
+        if ((ret = id3v2_check_write_lang_descr_tag(id3, pb, t, enc)) > 0)
             continue;
-        }
+
+        if (ret < 0)
+            return ret;
+
+        if ((ret = id3v2_check_write_tag(id3, pb, t, ff_id3v2_tags, enc)) > 0)
+            continue;
+
+        if (ret < 0)
+            return ret;
+
         if ((ret = id3v2_check_write_tag(id3, pb, t, id3->version == 3 ?
-                                         ff_id3v2_3_tags : ff_id3v2_4_tags, 
enc)) > 0) {
-            id3->len += ret;
+                                         ff_id3v2_3_tags : ff_id3v2_4_tags, 
enc)) > 0)
             continue;
-        }
 
-        if ((ret = id3v2_put_priv(id3, pb, t->key, t->value)) > 0) {
-            id3->len += ret;
+        if (ret < 0)
+            return ret;
+
+        if ((ret = id3v2_put_priv(id3, pb, 0, t->key, t->value)) > 0)
             continue;
-        } else if (ret < 0) {
+
+        if (ret < 0)
             return ret;
-        }
 
         /* unknown tag, write as TXXX frame */
-        if ((ret = id3v2_put_ttag(id3, pb, t->key, t->value, MKBETAG('T', 'X', 
'X', 'X'), enc)) < 0)
+        const char *strings[] = {t->key, t->value};
+        if ((ret = id3v2_put_text_tag(id3, pb, MKBETAG('T', 'X', 'X', 'X'),
+                                      0, strings, 2, enc)) < 0)
             return ret;
-        id3->len += ret;
     }
 
     return 0;
@@ -258,10 +410,9 @@ static int write_metadata(AVIOContext *pb, AVDictionary 
**metadata,
 
 static int write_ctoc(AVFormatContext *s, ID3v2EncContext *id3, int enc)
 {
-    uint8_t *dyn_buf;
     AVIOContext *dyn_bc;
     char name[123];
-    int len, ret;
+    int ret;
 
     if (s->nb_chapters == 0)
         return 0;
@@ -276,17 +427,9 @@ static int write_ctoc(AVFormatContext *s, ID3v2EncContext 
*id3, int enc)
         snprintf(name, 122, "ch%d", i);
         avio_put_str(dyn_bc, name);
     }
-    len = avio_get_dyn_buf(dyn_bc, &dyn_buf);
-    id3->len += len + ID3v2_HEADER_SIZE;
-
-    avio_wb32(s->pb, MKBETAG('C', 'T', 'O', 'C'));
-    avio_wb32(s->pb, len);
-    avio_wb16(s->pb, 0);
-    avio_write(s->pb, dyn_buf, len);
 
-    ffio_free_dyn_buf(&dyn_bc);
-
-    return ret;
+    return id3v2_put_frame(id3, s->pb, dyn_bc,
+                           MKBETAG('C', 'T', 'O', 'C'), 0);
 }
 
 static int write_chapter(AVFormatContext *s, ID3v2EncContext *id3, int id, int 
enc)
@@ -355,12 +498,11 @@ int ff_id3v2_write_apic(AVFormatContext *s, 
ID3v2EncContext *id3, AVPacket *pkt)
     AVDictionaryEntry *e;
 
     AVIOContext *dyn_buf;
-    uint8_t     *buf;
     const CodecMime *mime = ff_id3v2_mime_tags;
     const char  *mimetype = NULL, *desc = "";
     int enc = id3->version == 3 ? ID3v2_ENCODING_UTF16BOM :
                                   ID3v2_ENCODING_UTF8;
-    int i, len, type = 0, ret;
+    int i, type = 0, ret;
 
     /* get the mimetype*/
     while (mime->id != AV_CODEC_ID_NONE) {
@@ -402,20 +544,9 @@ int ff_id3v2_write_apic(AVFormatContext *s, 
ID3v2EncContext *id3, AVPacket *pkt)
     avio_w8(dyn_buf, type);
     id3v2_encode_string(dyn_buf, desc, enc);
     avio_write(dyn_buf, pkt->data, pkt->size);
-    len = avio_get_dyn_buf(dyn_buf, &buf);
-
-    avio_wb32(s->pb, MKBETAG('A', 'P', 'I', 'C'));
-    if (id3->version == 3)
-        avio_wb32(s->pb, len);
-    else
-        id3v2_put_size(s->pb, len);
-    avio_wb16(s->pb, 0);
-    avio_write(s->pb, buf, len);
-    ffio_free_dyn_buf(&dyn_buf);
 
-    id3->len += len + ID3v2_HEADER_SIZE;
-
-    return 0;
+    return id3v2_put_frame(id3, s->pb, dyn_buf,
+                           MKBETAG('A', 'P', 'I', 'C'), 0);
 }
 
 void ff_id3v2_finish(ID3v2EncContext *id3, AVIOContext *pb,
diff --git a/tests/ref/fate/generic-tags-remux-mp3 
b/tests/ref/fate/generic-tags-remux-mp3
index 6fa9c1b41f..5e336673b2 100644
--- a/tests/ref/fate/generic-tags-remux-mp3
+++ b/tests/ref/fate/generic-tags-remux-mp3
@@ -1,7 +1,7 @@
 ID3v2 frame TALB (26 bytes):|.Hurry Up, We're Dreaming.|
 ID3v2 frame TPE2 (5 bytes):|.M83.|
 ID3v2 frame TPE1 (5 bytes):|.M83.|
-ID3v2 frame TXXX (20 bytes):|.comment.I love M83.|
+ID3v2 frame COMM (16 bytes):|.und.I love M83.|
 ID3v2 frame TCOM (18 bytes):|.Anthony Gonzalez.|
 ID3v2 frame TCOP (24 bytes):|.2011 M83 Recording Inc.|
 ID3v2 frame TDRC (12 bytes):|.2011-10-17.|
diff --git a/tests/ref/fate/id3v2-comm b/tests/ref/fate/id3v2-comm
index bdd34cdd91..66b3101558 100644
--- a/tests/ref/fate/id3v2-comm
+++ b/tests/ref/fate/id3v2-comm
@@ -1,4 +1,4 @@
-ID3v2 frame TXXX (14 bytes):|.comment.test.|
-ID3v2 frame TXXX (19 bytes):|.comment-eng.test2.|
+ID3v2 frame COMM (10 bytes):|.und.test.|
+ID3v2 frame COMM (11 bytes):|.eng.test2.|
 comment=test
 comment-eng=test2
diff --git a/tests/ref/fate/id3v2-comm-dashed-descriptor 
b/tests/ref/fate/id3v2-comm-dashed-descriptor
index ca01cf6eb7..74fdb60f16 100644
--- a/tests/ref/fate/id3v2-comm-dashed-descriptor
+++ b/tests/ref/fate/id3v2-comm-dashed-descriptor
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (26 bytes):|.comment-Foo-Bar-eng.test.|
+ID3v2 frame COMM (17 bytes):|.engFoo-Bar.test.|
+Deprecated: COMM descriptor 'Foo-Bar' used as metadata key. This will change 
in a future version.
+Foo-Bar=test
 comment-Foo-Bar-eng=test
diff --git a/tests/ref/fate/id3v2-comm-descriptor 
b/tests/ref/fate/id3v2-comm-descriptor
index 903d52c9e3..456de11b2a 100644
--- a/tests/ref/fate/id3v2-comm-descriptor
+++ b/tests/ref/fate/id3v2-comm-descriptor
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (33 bytes):|.comment-MusicMatch_Bio-eng.test.|
+ID3v2 frame COMM (24 bytes):|.engMusicMatch_Bio.test.|
+Deprecated: COMM descriptor 'MusicMatch_Bio' used as metadata key. This will 
change in a future version.
+MusicMatch_Bio=test
 comment-MusicMatch_Bio-eng=test
diff --git a/tests/ref/fate/id3v2-comm-descriptor-no-lang 
b/tests/ref/fate/id3v2-comm-descriptor-no-lang
index 0441abfb5d..25f68957e6 100644
--- a/tests/ref/fate/id3v2-comm-descriptor-no-lang
+++ b/tests/ref/fate/id3v2-comm-descriptor-no-lang
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (30 bytes):|.comment-MusicMatch_Bio-.test.|
-comment-MusicMatch_Bio-=test
+ID3v2 frame COMM (24 bytes):|.undMusicMatch_Bio.test.|
+Deprecated: COMM descriptor 'MusicMatch_Bio' used as metadata key. This will 
change in a future version.
+MusicMatch_Bio=test
+comment-MusicMatch_Bio=test
diff --git a/tests/ref/fate/id3v2-comm-foo-lang-as-descriptor 
b/tests/ref/fate/id3v2-comm-foo-lang-as-descriptor
index 5a698ece47..50259571e6 100644
--- a/tests/ref/fate/id3v2-comm-foo-lang-as-descriptor
+++ b/tests/ref/fate/id3v2-comm-foo-lang-as-descriptor
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (23 bytes):|.comment-foo-eng-.test.|
-comment-foo-eng-=test
+ID3v2 frame COMM (17 bytes):|.undfoo-eng.test.|
+Deprecated: COMM descriptor 'foo-eng' used as metadata key. This will change 
in a future version.
+foo-eng=test
+comment-foo-eng-und=test
diff --git a/tests/ref/fate/id3v2-comm-invalid-lang 
b/tests/ref/fate/id3v2-comm-invalid-lang
index 46c97679d0..354b063378 100644
--- a/tests/ref/fate/id3v2-comm-invalid-lang
+++ b/tests/ref/fate/id3v2-comm-invalid-lang
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (18 bytes):|.comment-xyz.test.|
+ID3v2 frame COMM (13 bytes):|.undxyz.test.|
+Deprecated: COMM descriptor 'xyz' used as metadata key. This will change in a 
future version.
+xyz=test
 comment-xyz=test
diff --git a/tests/ref/fate/id3v2-comm-lang-as-descriptor 
b/tests/ref/fate/id3v2-comm-lang-as-descriptor
index 66a57d2988..1b58d6ea5a 100644
--- a/tests/ref/fate/id3v2-comm-lang-as-descriptor
+++ b/tests/ref/fate/id3v2-comm-lang-as-descriptor
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (19 bytes):|.comment-eng-.test.|
-comment-eng-=test
+ID3v2 frame COMM (13 bytes):|.undeng.test.|
+Deprecated: COMM descriptor 'eng' used as metadata key. This will change in a 
future version.
+eng=test
+comment-eng-und=test
diff --git a/tests/ref/fate/id3v2-comm-long-descriptor 
b/tests/ref/fate/id3v2-comm-long-descriptor
index b199919b5a..722b5edfbd 100644
--- a/tests/ref/fate/id3v2-comm-long-descriptor
+++ b/tests/ref/fate/id3v2-comm-long-descriptor
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (21 bytes):|.comment-foobar.test.|
+ID3v2 frame COMM (16 bytes):|.undfoobar.test.|
+Deprecated: COMM descriptor 'foobar' used as metadata key. This will change in 
a future version.
+foobar=test
 comment-foobar=test
diff --git a/tests/ref/fate/id3v2-comm-multi-invalid-lang 
b/tests/ref/fate/id3v2-comm-multi-invalid-lang
index d3349a0b21..5164002f18 100644
--- a/tests/ref/fate/id3v2-comm-multi-invalid-lang
+++ b/tests/ref/fate/id3v2-comm-multi-invalid-lang
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (23 bytes):|.comment-desc-xyz.test.|
+ID3v2 frame COMM (18 bytes):|.unddesc-xyz.test.|
+Deprecated: COMM descriptor 'desc-xyz' used as metadata key. This will change 
in a future version.
+desc-xyz=test
 comment-desc-xyz=test
diff --git a/tests/ref/fate/id3v2-comm-raw-key 
b/tests/ref/fate/id3v2-comm-raw-key
index 911b725915..b148b481a2 100644
--- a/tests/ref/fate/id3v2-comm-raw-key
+++ b/tests/ref/fate/id3v2-comm-raw-key
@@ -1,2 +1,2 @@
-ID3v2 frame TXXX (11 bytes):|.COMM.test.|
-COMM=test
+ID3v2 frame COMM (10 bytes):|.und.test.|
+comment=test
diff --git a/tests/ref/fate/id3v2-comm-sort b/tests/ref/fate/id3v2-comm-sort
index 8b3fe87250..7a4ee1441f 100644
--- a/tests/ref/fate/id3v2-comm-sort
+++ b/tests/ref/fate/id3v2-comm-sort
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (19 bytes):|.comment-sort.test.|
+ID3v2 frame COMM (14 bytes):|.undsort.test.|
+Deprecated: COMM descriptor 'sort' used as metadata key. This will change in a 
future version.
+sort=test
 comment-sort=test
diff --git a/tests/ref/fate/id3v2-comm-sort- b/tests/ref/fate/id3v2-comm-sort-
index 436c5e4769..7a4ee1441f 100644
--- a/tests/ref/fate/id3v2-comm-sort-
+++ b/tests/ref/fate/id3v2-comm-sort-
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (20 bytes):|.comment-sort-.test.|
-comment-sort-=test
+ID3v2 frame COMM (14 bytes):|.undsort.test.|
+Deprecated: COMM descriptor 'sort' used as metadata key. This will change in a 
future version.
+sort=test
+comment-sort=test
diff --git a/tests/ref/fate/id3v2-comm-sort-eng 
b/tests/ref/fate/id3v2-comm-sort-eng
index f6873ed108..01a1f6ba1c 100644
--- a/tests/ref/fate/id3v2-comm-sort-eng
+++ b/tests/ref/fate/id3v2-comm-sort-eng
@@ -1,2 +1,4 @@
-ID3v2 frame TXXX (23 bytes):|.comment-sort-eng.test.|
+ID3v2 frame COMM (14 bytes):|.engsort.test.|
+Deprecated: COMM descriptor 'sort' used as metadata key. This will change in a 
future version.
+sort=test
 comment-sort-eng=test
diff --git a/tests/ref/fate/id3v2-lang-und b/tests/ref/fate/id3v2-lang-und
index 0356889608..c8c36a7145 100644
--- a/tests/ref/fate/id3v2-lang-und
+++ b/tests/ref/fate/id3v2-lang-und
@@ -1,4 +1,4 @@
-ID3v2 frame TXXX (17 bytes):|.lyrics-und.test.|
-ID3v2 frame TXXX (19 bytes):|.comment-und.test2.|
-lyrics-und=test
-comment-und=test2
+ID3v2 frame USLT (10 bytes):|.und.test.|
+ID3v2 frame COMM (11 bytes):|.und.test2.|
+lyrics=test
+comment=test2
diff --git a/tests/ref/fate/id3v2-lang-xxx-remux 
b/tests/ref/fate/id3v2-lang-xxx-remux
index ee7e77b8ed..8a20ae30c0 100644
--- a/tests/ref/fate/id3v2-lang-xxx-remux
+++ b/tests/ref/fate/id3v2-lang-xxx-remux
@@ -1,4 +1,4 @@
-ID3v2 frame TXXX (23 bytes):|.comment.Dummy comment.|
-ID3v2 frame TXXX (19 bytes):|.USLT.Dummy lyrics.|
+ID3v2 frame COMM (19 bytes):|.und.Dummy comment.|
+ID3v2 frame USLT (18 bytes):|.und.Dummy lyrics.|
 comment=Dummy comment
 lyrics=Dummy lyrics
diff --git a/tests/ref/fate/id3v2-lyrics b/tests/ref/fate/id3v2-lyrics
index 02e7ca2cc6..8474b0384f 100644
--- a/tests/ref/fate/id3v2-lyrics
+++ b/tests/ref/fate/id3v2-lyrics
@@ -1,4 +1,4 @@
-ID3v2 frame TXXX (11 bytes):|.USLT.test.|
-ID3v2 frame TXXX (18 bytes):|.lyrics-fra.test2.|
+ID3v2 frame USLT (10 bytes):|.und.test.|
+ID3v2 frame USLT (11 bytes):|.fra.test2.|
 lyrics=test
 lyrics-fra=test2
diff --git a/tests/ref/fate/id3v2-reenc-remux-keep 
b/tests/ref/fate/id3v2-reenc-remux-keep
index 7bf43f0612..f005e6a420 100644
--- a/tests/ref/fate/id3v2-reenc-remux-keep
+++ b/tests/ref/fate/id3v2-reenc-remux-keep
@@ -1,5 +1,5 @@
-f68df33ad53e6175269f7ea876b492e3 *tests/data/fate/id3v2-reenc-remux-keep.mp3
-192378 tests/data/fate/id3v2-reenc-remux-keep.mp3
+3183f143906fd8064f574448f26a50e6 *tests/data/fate/id3v2-reenc-remux-keep.mp3
+192351 tests/data/fate/id3v2-reenc-remux-keep.mp3
 [FORMAT]
 TAG:title=7rk
 TAG:iTunPGAP=0

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

Reply via email to