From: <ale...@us...> - 2023-12-15 12:07:57
|
Revision: 6529 http://sourceforge.net/p/lame/svn/6529 Author: aleidinger Date: 2023-12-15 12:07:55 +0000 (Fri, 15 Dec 2023) Log Message: ----------- Fix UTF8 id3tag support. Modified Paths: -------------- trunk/lame/frontend/parse.c trunk/lame/include/lame.def trunk/lame/include/lame.h trunk/lame/libmp3lame/id3tag.c Modified: trunk/lame/frontend/parse.c =================================================================== --- trunk/lame/frontend/parse.c 2023-12-14 09:13:45 UTC (rev 6528) +++ trunk/lame/frontend/parse.c 2023-12-15 12:07:55 UTC (rev 6529) @@ -698,9 +698,7 @@ " --id3v1-only add only a version 1 tag\n" " --id3v2-only add only a version 2 tag\n" #ifdef ID3TAGS_EXTENDED -#ifdef UTF8BROKEN " --id3v2-utf8 add following options in unicode UTF-8 text encoding\n" -#endif " --id3v2-utf16 add following options in unicode UTF-16 text encoding\n" " --id3v2-latin1 add following options in latin-1 text encoding\n" #endif @@ -1830,11 +1828,9 @@ id3_tenc = TENC_UTF16; id3tag_add_v2(gfp); -#ifdef UTF8BROKEN T_ELIF("id3v2-utf8") id3_tenc = TENC_UTF8; id3tag_add_v2_4_UTF8(gfp); -#endif T_ELIF("id3v2-latin1") id3_tenc = TENC_LATIN1; Modified: trunk/lame/include/lame.def =================================================================== --- trunk/lame/include/lame.def 2023-12-14 09:13:45 UTC (rev 6528) +++ trunk/lame/include/lame.def 2023-12-15 12:07:55 UTC (rev 6529) @@ -300,8 +300,9 @@ id3tag_set_comment_utf16 @2024 id3tag_set_textinfo_utf16 @2025 id3tag_set_fieldvalue_utf16 @2026 -id3tag_set_textinfo_utf8 @2027 +id3tag_set_comment_utf8 @2027 +id3tag_set_textinfo_utf8 @2028 ; two external functions for ID3v2.4 tag support -id3tag_add_v2_4_UTF8 @2028 -id3tag_v2_4_UTF8_only @2029 +id3tag_add_v2_4_UTF8 @2029 +id3tag_v2_4_UTF8_only @2030 Modified: trunk/lame/include/lame.h =================================================================== --- trunk/lame/include/lame.h 2023-12-14 09:13:45 UTC (rev 6528) +++ trunk/lame/include/lame.h 2023-12-15 12:07:55 UTC (rev 6529) @@ -1305,7 +1305,10 @@ /* experimental */ int CDECL id3tag_set_textinfo_utf8(lame_t gfp, char const *id, unsigned short const *text); +/* experimental */ +int CDECL id3tag_set_comment_utf8(lame_t gfp, char const *lang, char const *desc, char const *text); + /*********************************************************************** * * list of valid bitrates [kbps] & sample frequencies [Hz]. Modified: trunk/lame/libmp3lame/id3tag.c =================================================================== --- trunk/lame/libmp3lame/id3tag.c 2023-12-14 09:13:45 UTC (rev 6528) +++ trunk/lame/libmp3lame/id3tag.c 2023-12-15 12:07:55 UTC (rev 6529) @@ -216,9 +216,9 @@ static int id3v2_add_latin1_lng(lame_t gfp, uint32_t frame_id, char const *desc, char const *text); -// forward-declare the id3v2_add_utf8 function to be used in copyV1ToV2 +// forward-declare the id3v2_add_utf8_lng function to be used in copyV1ToV2 static int -id3v2_add_utf8(lame_t gfp, uint32_t frame_id, char const *lng, char const *desc, char const *text); +id3v2_add_utf8_lng(lame_t gfp, uint32_t frame_id, char const *desc, char const *text); static void @@ -233,8 +233,7 @@ // if we are writing UTF-8 ID3v2.4 tag if (test_tag_spec_flags(gfc, V2_4_UTF8_FLAG)) { - char const* lang = id3v2_get_language(gfp); - id3v2_add_utf8(gfp, frame_id, lang, 0, s); + id3v2_add_utf8_lng(gfp, frame_id, 0, s); } else { // if we are writing latin1 ID3v2.3 tag id3v2_add_latin1_lng(gfp, frame_id, 0, s); } @@ -659,7 +658,7 @@ return 0; } } - ret = id3v2_add_ucs2_lng(gfp, ID_GENRE, 0, text); + ret = id3v2_add_utf8_lng(gfp, ID_GENRE, 0, text); if (ret == 0) { gfc->tag_spec.flags |= CHANGED_FLAG; gfc->tag_spec.genre_id3v1 = GENRE_INDEX_OTHER; @@ -1055,6 +1054,13 @@ } static int +id3v2_add_utf8_lng(lame_t gfp, uint32_t frame_id, char const *desc, char const *text) +{ + char const* lang = id3v2_get_language(gfp); + return id3v2_add_utf8(gfp, frame_id, lang, desc, text); +} + +static int id3v2_add_ucs2_lng(lame_t gfp, uint32_t frame_id, unsigned short const *desc, unsigned short const *text) { char const* lang = id3v2_get_language(gfp); @@ -1085,6 +1091,22 @@ } static int +id3tag_set_userinfo_utf8(lame_t gfp, uint32_t id, char const *fieldvalue) +{ + char const separator = '='; + int rc = -7; + int a = local_char_pos(fieldvalue, separator); + if (a >= 0) { + char* dup = 0; + local_strdup(&dup, fieldvalue); + dup[a] = 0; + rc = id3v2_add_utf8_lng(gfp, id, dup, dup+a+1); + free(dup); + } + return rc; +} + +static int id3tag_set_userinfo_ucs2(lame_t gfp, uint32_t id, unsigned short const *fieldvalue) { unsigned short const separator = fromLatin1Char(fieldvalue,'='); @@ -1116,19 +1138,19 @@ return 0; } if (frame_id == ID_TXXX || frame_id == ID_WXXX || frame_id == ID_COMMENT) { - return id3tag_set_userinfo_ucs2(gfp, frame_id, text); + return id3tag_set_userinfo_utf8(gfp, frame_id, text); } if (frame_id == ID_GENRE) { return id3tag_set_genre_utf8(gfp, text); } if (frame_id == ID_PCST) { - return id3v2_add_ucs2_lng(gfp, frame_id, 0, text); + return id3v2_add_utf8_lng(gfp, frame_id, 0, text); } if (frame_id == ID_USER) { - return id3v2_add_ucs2_lng(gfp, frame_id, text, 0); + return id3v2_add_utf8_lng(gfp, frame_id, text, 0); } if (frame_id == ID_WFED) { - return id3v2_add_ucs2_lng(gfp, frame_id, text, 0); /* iTunes expects WFED to be a text frame */ + return id3v2_add_utf8_lng(gfp, frame_id, text, 0); /* iTunes expects WFED to be a text frame */ } if (isFrameIdMatching(frame_id, FRAME_ID('T', 0, 0, 0)) ||isFrameIdMatching(frame_id, FRAME_ID('W', 0, 0, 0))) { @@ -1137,7 +1159,7 @@ return -2; /* must be Latin-1 encoded */ } #endif - return id3v2_add_ucs2_lng(gfp, frame_id, 0, text); + return id3v2_add_utf8_lng(gfp, frame_id, 0, text); } return -255; /* not supported by now */ } @@ -1239,7 +1261,16 @@ return id3v2_add_latin1(gfp, ID_COMMENT, lang, desc, text); } +int +id3tag_set_comment_utf8(lame_t gfp, char const *lang, char const *desc, char const *text) +{ + if (is_lame_internal_flags_null(gfp)) { + return 0; + } + return id3v2_add_utf8(gfp, ID_COMMENT, lang, desc, text); +} + int id3tag_set_comment_utf16(lame_t gfp, char const *lang, unsigned short const *desc, unsigned short const *text) { |