From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 52DC94D1CA for ; Sun, 14 Dec 2025 19:36:33 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'PFSQutW8zWLs8MlY9Tnuk48SRBcswj97DVNoC3AKU9s=', expected b'Yp5k2oTfrleD8B/eq7zVcFmoD4Wxb0bMP9j/FPkVgI4=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1765740983; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=PFSQutW8zWLs8MlY9Tnuk48SRBcswj97DVNoC3AKU9s=; b=Ska8Cy2fDR2v6rfZluHz60jZ+aJaR7QQAvJk0b34QQA+b1AmrXdaWJdLADu4MrMkmmRS4 lPR/g9FNs0iiMKeY9ke4iKaFfhSpZhAfav9qOzDn4cZTZ1G6JHTErvFE0m5NeiR1LuWHbTX CfJl0hp+zdG/1qeF02x16gQfzgE4qX9XpPevQBFLGBsR3/6NeGN9o5AMoiVH0pzczo8pQX5 ucln1Y3BF+RQww5AuQbDKrhocrq5WHOg8WY6o3nTWoCk0m1+g/zV9zRMMz+H9kgA+reJdXJ /DU4LUO1K8YatcF1QeEE97/u18qrJOB5DhfOb+PQOmj9K4pN26w5AGTJo7OA== Received: from [172.20.0.2] (unknown [172.19.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 335D569085A; Sun, 14 Dec 2025 21:36:23 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1765740967; b=lDCng9wabl5ASliyWj0YbM2oBrjMYktvuG93w4a5DmmunG7nNz0eU0EkK1SX9uUg5alQr WzQzm/8ozu8oY8I/aCllHNWP1a/5/8yzIGNxqH68vw2szE6sgkGTkntxvv9vI/xoCSHGIL2 nJ94Un7yNSKigkwGbIfSTPE4+3Qy1NW6OPnEBx9utDKaHSfE1INTCuxZuLoQi7FsXg0I+hB HTiuQgCIsOrhxYXKLm3k2GGMEc6Dm22p2JeyCj9i7HTTQvj6oTmJf100F+xOGIr4Fltu0TD NM6e0hb8P/Yi9ryk8hhD5S1ESMCoLTFd0NRZDtKW2JioZFBwv614NcI0u6zQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1765740967; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=fN/E2qXLQBETOSriSlxhkxwFpPy5KYq/Ag0/9CTkduE=; b=VJ1gWryX1hWyOmtyGSeorGupsq0kpCyLADRJqnsv9iM4RuxbrNvPUvCyApKGr88JipbCc sgxJQ7qZFQ2lqCZbNtyndMjVGfxJjxX3HX/U3Mep2+S6vMzrQ5civGuPvtbXLdndf+FFOrY axq5wX7Wgv8oUbLovlKU6z7+J9IFeQESm3XJrIHJ7AGf4a3R0/uEvfLVSGYgUFeKt6cAAnv pEDVoqPTo83MA3g3pW6mZaxZ6+CIb5+AlyjiXVDZML2IgzlIDrBkNzr/bwtrWIQ/Q7Ke1+5 DSVdiSA2dAC4uWnEPvWhFJ4JI56CQkAsfMHTRYoezaBnCIIwALXcyZqYAqwA== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1765740959; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=Yp5k2oTfrleD8B/eq7zVcFmoD4Wxb0bMP9j/FPkVgI4=; b=elHjqm6GaVMvXDh6JkplsKvOP9zApxUjkzfZWqLpXQiQwwjPZJBRCYasbxmVcTWz9krd0 +6XcyoKhutvO4ITRZOxfVh42493TDIrT5aXzSILcLZ+yEB/deyYHTKVSi6kjSAoT90BMR0R GaUBgCFUVSVYzYzhQT+WxCR20BoALe0iJlgnCoLXCVjyyWBOWtnqc4XJS4lzr6/jYng+GVm C/VaI6tz7DPgGPpLHFN8V4LIiUol9kbUZ9+AXCDogqU3VeRB5xk9uKmGsUsB9uEy86Qx/60 HGjj3J6d+5BX/U9zJBqyQqUr7pb17U7/p769gR7Rl5bzlO4eDKjKQejMa3gA== Received: from 55ca25703178 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id CE3646907EC for ; Sun, 14 Dec 2025 21:35:59 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Sun, 14 Dec 2025 19:35:59 -0000 Message-ID: <176574095997.60.16398685080281332212@2cb04c0e5124> Message-ID-Hash: K4HCA3KP2GZVHOGNQ6TOMP5IKAPM6NQX X-Message-ID-Hash: K4HCA3KP2GZVHOGNQ6TOMP5IKAPM6NQX X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] libavformat/id3v2.c: fix lyrics parsing implementation. (PR #21199) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: toots via ffmpeg-devel Cc: toots Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #21199 opened by toots URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21199 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21199.patch >>From 797801d40d819b0cd765ba6d0c327e497181848f Mon Sep 17 00:00:00 2001 From: Romain Beauxis Date: Sun, 14 Dec 2025 13:34:48 -0600 Subject: [PATCH] libavformat/id3v2.c: fix lyrics parsing implementation. --- libavformat/id3v2.c | 59 ++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index 9d4a9802a9..0eb40a2a7b 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -371,9 +371,9 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen, AVDictionary **metadata) { - uint8_t lang[4]; + char lang[4]; uint8_t *descriptor = NULL; // 'Content descriptor' - uint8_t *text; + uint8_t *text = NULL; char *key; int encoding; int ok = 0; @@ -389,29 +389,54 @@ static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen, lang[3] = '\0'; taglen -= 3; - if (decode_str(s, pb, encoding, &descriptor, &taglen) < 0 || taglen < 0) - goto error; - - if (decode_str(s, pb, encoding, &text, &taglen) < 0 || taglen < 0) - goto error; - - // FFmpeg does not support hierarchical metadata, so concatenate the keys. - key = av_asprintf("lyrics-%s%s%s", descriptor[0] ? (char *)descriptor : "", - descriptor[0] ? "-" : "", - lang); - if (!key) { - av_free(text); - goto error; + // Empty descriptor can be one or two + // \000 characters depending on the implementation's + // choice. We can consume all \000 charaters. If that + // consumes all the remaining one, text is also empty + // which is correct. + if (!*pb->buf_ptr) { + while (taglen > 0 && !*pb->buf_ptr) { + avio_r8(pb); + taglen--; + } + descriptor = av_strdup(""); + if (!descriptor) + goto error; + } else { + if (decode_str(s, pb, encoding, &descriptor, &taglen) < 0 || taglen < 0) + goto error; + // String should be null-terminated and followed by a \000 text separator. + if (taglen <= 0 || *pb->buf_ptr) + goto error; + avio_r8(pb); + taglen--; } - av_dict_set(metadata, key, text, - AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL); + if (!taglen || !*pb->buf_ptr) { + text = av_strdup(""); + if (!text) + goto error; + } else { + if (decode_str(s, pb, encoding, &text, &taglen) < 0 || taglen < 0) + goto error; + } + + // FFmpeg does not support hierarchical metadata, so concatenate the keys. + key = av_asprintf("lyrics%s%s%s%s", descriptor[0] || strlen(lang) == 3 ? "-" : "", + descriptor[0] ? (char *)descriptor : "", + descriptor[0] ? "-" : "", + strlen(lang) == 3 ? lang : ""); + if (!key) + goto error; + + av_dict_set(metadata, key, text, AV_DICT_DONT_STRDUP_KEY); ok = 1; error: if (!ok) av_log(s, AV_LOG_ERROR, "Error reading lyrics, skipped\n"); av_free(descriptor); + av_free(text); } /** -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org