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]
