From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id DA3AA4365F for ; Mon, 20 Jun 2022 22:15:53 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A34CA68B634; Tue, 21 Jun 2022 01:15:50 +0300 (EEST) Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-oln040092074075.outbound.protection.outlook.com [40.92.74.75]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C163168B583 for ; Tue, 21 Jun 2022 01:15:44 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=f/+1Ha+JTe9DULcaT0pW1NwYd6DkwLrWAQMuESKQj/otUv77mVdhAu3H8v8l+92SflySxPcveVh54w3rLbAZPJnxkgsXNHJqKiG9UsgXEqjaTRYwDwEOUHSETUnT+dEkwJ+OsKkOXIl2L4HgW7vgNT461DPySL1upyFmd+UHCx8mCzgpqPhIB1C/diIj6C9w13BpJ5XeCHydjZlPb4TejR6DscCVDylXXYSCRzKswQZfF04EC09DisUBIHNqcAIdWgv6d4um2y28TwEuYSIaCDFgIc5rVftcv2F0vb7XCu4tYM5JWsVVcGrCVanzNwQCZlcNxwYYxhP6rtgsyjUsaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=yoEA6LAeqqgHdsoVZNMJoqDyd9ZLtGjR8jXBTbwCTm0=; b=TwDkTIlycujfk6ZmPsV0r3qgLgCA8liRBlkfEe8YTOJ4XbeIe/mB+lkCV75V7Mi4d41LbgCwE6kgaPeN8r+xgjyvLIUqokGm7ik18UgInAhao5ChNX435kIhhbSmkbqmp1W8gvdxgXqfCbPnsDhDYlKI7kuwGAbwR6lUtR2S0YKbj8s2P4H6Yb6l1ncFLaJYZiOE7SIQ5gzK00vD5IUk+9aP/52cT1IsoXlZlQwJPJR8pkTZMf030IEq3GxeTzJB1i0Hj/JaTb95XAc4uoWAQdX6nEEQuTkfFr/rLg/xWAR5oqkHNO2VvKQfpXQbcK4HqgNDp1wbwb270mLSqYY0ew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yoEA6LAeqqgHdsoVZNMJoqDyd9ZLtGjR8jXBTbwCTm0=; b=n6t50+ZccVNOijQU4k0Y+5ZasaryscLNTDVth1j9VWeSJ8s7vpnUYNYHEHXoNx7/vH/zJekMdDHY5Don5ARNPLjB+pNhjB+lGyTLa9WR8RD2AGvuSswxqyahnC81JwEwBRK3JK9uKXS5cwoKSWokvwTI325TWS3MYrwKGgsuUmdzvlbbKcmfo8vmVJeUN9jvWFwATEVN67N5hIT3hLs61N84AG4GYaKV0H7SxdsCvWQkd1NjpXkpQCnFmeLXD+ld1a/KGdZFgbgQVpe39aySbTNs/oRAzqG9zT9siP9P8c0nmzeQbcdyQytrjnpa2JPOAb1FzkpTM4JlHz82pBoViQ== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by HE1PR0102MB2585.eurprd01.prod.exchangelabs.com (2603:10a6:7:17::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.18; Mon, 20 Jun 2022 22:15:42 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5353.022; Mon, 20 Jun 2022 22:15:42 +0000 Message-ID: Date: Tue, 21 Jun 2022 00:15:40 +0200 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20220620013711.91482-1-rcombs@rcombs.me> <20220620013711.91482-2-rcombs@rcombs.me> From: Andreas Rheinhardt In-Reply-To: <20220620013711.91482-2-rcombs@rcombs.me> X-TMN: [e/9ZoPPdau+cRHmEx5Chim+dL5C1jhmR] X-ClientProxiedBy: ZR0P278CA0079.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::12) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <615814df-76ba-5919-cf2c-fb152b47f30f@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 465508b0-0e3f-4cad-f421-08da530a6a2d X-MS-TrafficTypeDiagnostic: HE1PR0102MB2585:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: s4ktsTflGEiEpFOJsfDki3rktM1RkiJXnTV0R+W96U6VFr+oD7iFUwZ2p/SWdMQrxFiH5oj1hJy9A5r1luPbBQkjzDbnxPmU7CFN8fVwM5xxW3Xqwpug+Gdb9U3hnPIwjN0HFNEo5jP65eQg5uM+cZ1fbKprEnk6uPmMvuhsHW+zXq/41Rcg6vJBGcaNzyCyGzFPZlZvMxieoK3umfr8pCwW0QzlM+NR7KuDddMm9wC1jgbmNDD12C9T1gWsn8eatto0WjKhpFA1qJ9zTf4oSaw1QQ/7PqRHPoHmYeaSkhr/3nEaNTJauAZJdGp7doNKCBX9XBu6qKrzyRzsg7brWs+FJYiWyj7hsRV38rdhhP1pqad5+XGbMPeNmwQNKemuV9HXoClmGgfHbHQLgjpE4o3MCTZgDwUhAae+r9rNpIqQCPU55GKF9gblLwzvoG3dJgbQOk7gFJ9afrOhUOaaSxGJca3VkMIp7Z1VYYDP9kV0Akm22nUgQzQOkqE97YZpmW+DciBxr5pVmqVWM9BsNf5TDxNbIgg2FAk5Rt9dmolRvWZ56/SP99RwpFHxvs+FKu+dqO/OOfz8NnV/x/OUjWNFE4it7YYspXEfnZvp6exG1mcXghdTOcA1ed/MrxT9 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Q1UwQmZPVmFUdGQ1TlhnMkJDdkpyaGNzTnllZmx5QVZkajl4MlEya0RrV1dJ?= =?utf-8?B?a3QxVjlvS21HUkRjODFUbkZRU01pVjlWVmxPTE1jOTRrOE1yNkdzMklubjRh?= =?utf-8?B?T1lUazFFNlFCbTNxOFJGaDBWdFJzQkd2c2VqUUp6dys5ZFl3cTZqRDVtZmRa?= =?utf-8?B?VVRxZTJMQzBVK3ZTZWc2WThpSHo3SldFQm9zSlQ0Q1hDdy91K0RXMmhIMk1i?= =?utf-8?B?UFF0MGdlZkFiWlc0WmJ1enFSNnI1SndFb1FZREplQjl3YnAwMkNKeUc2SDBF?= =?utf-8?B?dWJJeloxUHVoZnZIMTMzdUt2OEI3Zm5CeG9HTWszUXNBVENlNWxvMEI4ZmFx?= =?utf-8?B?TERuV1JnNGVCdDFXMk94amdzNGF4dVRscDdGejJTZTMxZGRYOTY4U3dicXNo?= =?utf-8?B?cGFTLzRGS2lqTzcxRUFTUUZCUWtCSnR6ZjV2RHJaK0d0RVp4aHU5dFY2dm5G?= =?utf-8?B?alJ2OXMvZVVvM1hkTUMwaGt4SlViYWZiNWlvVm5ibXJHUi9WeGoyVVZLakl2?= =?utf-8?B?cyt6VUxsUmF1M1V5d3B5T25kcUdrb3RyUlEwRHJZNnY2VGNZOHFDTGh6elk4?= =?utf-8?B?d3ptdmlSVU9mTTl3N291L1VsRTQzdGdBVXRNaU1Qc0JYdkZTdk8xTXhhRjlO?= =?utf-8?B?cCtoaTkzWnp6S3AvNHpHWHVYd3QzSEs2bEFDcnhUSThSckErN3RUQVo5QnJM?= =?utf-8?B?SEhndG9Va2pWZ1FjZWxXcC9HaURudmpzOXgzU0kxcUNTZERGcEVOeFVBMDR2?= =?utf-8?B?dnR4bjVoNlZHYXc3dzRQRnJZb1Y4cGYwVElxcUFaZC9QUGROU250bEt1VUFO?= =?utf-8?B?VEZEdUF5bVhMNXpMV3dZNDJ2cFIzM3c2aFZIVWZiRDBXOHVRRHNUTzZFb1JW?= =?utf-8?B?Q3crckZoekFtd0FLcG9WbDY0MGJObVp6U0dGWXB2RThSZzFwR0E4bDZzbzBL?= =?utf-8?B?REFSVmNuMWFNUkd1RElmazV0UTkxcWtqSlFJRDVJaVVUQUNYSWlISVJMa3Jx?= =?utf-8?B?OGNYclR4TmtxK0JrOVFDSjRRNXpZN2NUY2FWWHJwZXM4bjBFRjdBVW1tQ0s4?= =?utf-8?B?YlpCNzV6S081bEplZ09iclZGT3piV2pZTURzbkJWWmdsU09EY2Ywa0lpWWpS?= =?utf-8?B?WDZMWHU4QzZOZ0JFYzArVWx0RGE1WkRQVmlJSktDd0owbU9oOEJEcDNuMVht?= =?utf-8?B?ZEJZWUF2Y1VZYVR5SSs0SHF0d0syNEJLRkJ4WEIyaHQ0aHdHUkIvOERUM1B1?= =?utf-8?B?MDVFbU1lWXFpdnl3dVMxSlJjN0ZoYWdlVXRKVGRlL2FYZndhd25YbVZxWkY3?= =?utf-8?B?U2l0cEhOcjRESUZrOHRJR2RLa080b3RZZDR2ZTRiL0tKaW9QRXRqMWg5aVFz?= =?utf-8?B?T1c4aG9iV0pBMko2SHlnR3p1ZXFGcmNvdDRYRkVJTUtPUjZyTkdhc1lPbnBy?= =?utf-8?B?TG5WdWRhOTRycUpwTy9GVzJJS09sdmpFeHBiejBjdnRaUXdrMXZRVStvdUZv?= =?utf-8?B?RGpEcVIwRENzVVlMcnVkMTBScmZOZmptVmJvTHdPeGMrek5kb3A3Z2tNZmZF?= =?utf-8?B?NSttbVpYOFVrZDFOU25GSE1WbE1XbmVZaUJhTGRreGQrZEhRaTFSZ2VQYjhM?= =?utf-8?B?WXZqbytyWTZQU25WWVBMQTlac1ZxZ2R4ZVlvTVhWVnhyNXdaWWVFY0xmMVU3?= =?utf-8?B?TUkweE9qM1lwQzB5aG5CSFFNWm5RQXNpZ3ZrVTdFUmNIV3hGSUp1V0RuTjVk?= =?utf-8?B?RE83eFBMc1B1QWI5RFlmZmpxc3diR05UYnhUMEZDWFc3bVVkelJNZ3hkQnk3?= =?utf-8?B?N0VXTk1xQWNET0Q0VUpSa0FkeXZoTzBGN0RXclpLclFVM0dpRVVLS0RWUmVV?= =?utf-8?B?dnRjVDFoT2M1RGFaZzhsS2I4NXlBRTNocUpSVHNGTmV5OSswS2dEZFJRRlZl?= =?utf-8?B?MU5VczlUVWdUMHdnMEcrOHJrdmRSYzF5MlJJS0J5TEFrZEpxRGZKdmliM0p1?= =?utf-8?B?QjNJM0VqaTFnPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 465508b0-0e3f-4cad-f421-08da530a6a2d X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2022 22:15:42.6271 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0102MB2585 Subject: Re: [FFmpeg-devel] [PATCH 2/2] lavf/id3v2dec: support multiple values and TIPL frames X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: rcombs: > Fixes https://trac.ffmpeg.org/ticket/6949 > > Ordinary text frames in ID3v2 are allowed to have multiple > (null-separated) values. This technically isn't allowed in TXXX, > but it's used in practice by Picard, and supporting it is harmless. > > TIPL/IPL (Involved People List) and TMCL (Musician Credits List) work > similarly to TXXX, but alternate key-value-key-value. > --- > libavformat/id3v2.c | 49 ++++++++++++++++++++++++++------------------- > 1 file changed, 28 insertions(+), 21 deletions(-) > > diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c > index 191a305ffb..667105e9f9 100644 > --- a/libavformat/id3v2.c > +++ b/libavformat/id3v2.c > @@ -321,8 +321,12 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, > AVDictionary **metadata, const char *key) > { > uint8_t *dst; > - int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL; > + uint8_t *dst_key = NULL; > + int encoding, dict_flags = AV_DICT_MULTIKEY | AV_DICT_DONT_STRDUP_VAL; > unsigned genre; > + int count = 0; > + int is_tipl = !(strcmp(key, "TIPL") && strcmp(key, "TMCL") && > + strcmp(key, "IPL")); > > if (taglen < 1) > return; > @@ -330,30 +334,33 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, > encoding = avio_r8(pb); > taglen--; /* account for encoding type byte */ > > - if (decode_str(s, pb, encoding, &dst, &taglen) < 0) { > - av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key); > - return; > - } > - > - if (!(strcmp(key, "TCON") && strcmp(key, "TCO")) && > - (sscanf(dst, "(%d)", &genre) == 1 || sscanf(dst, "%d", &genre) == 1) && > - genre <= ID3v1_GENRE_MAX) { > - av_freep(&dst); > - dst = av_strdup(ff_id3v1_genre_str[genre]); > - } else if (!(strcmp(key, "TXXX") && strcmp(key, "TXX"))) { > - /* dst now contains the key, need to get value */ > - key = dst; > + while (taglen > 1) { > if (decode_str(s, pb, encoding, &dst, &taglen) < 0) { > av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key); > - av_freep(&key); > return; > } > - dict_flags |= AV_DICT_DONT_STRDUP_KEY; > - } else if (!*dst) > - av_freep(&dst); > > - if (dst) > - av_dict_set(metadata, key, dst, dict_flags); > + count++; > + > + if (!(strcmp(key, "TCON") && strcmp(key, "TCO")) && > + (sscanf(dst, "(%d)", &genre) == 1 || sscanf(dst, "%d", &genre) == 1) && > + genre <= ID3v1_GENRE_MAX) { > + av_freep(&dst); > + dst = av_strdup(ff_id3v1_genre_str[genre]); > + } else if (!(strcmp(key, "TXXX") && strcmp(key, "TXX")) || > + (is_tipl && (count & 1))) { > + /* dst now contains the key, need to get value */ > + av_free(dst_key); > + key = dst_key = dst; > + continue; > + } else if (!*dst) > + av_freep(&dst); > + > + if (dst) > + av_dict_set(metadata, key, dst, dict_flags); > + } > + > + av_free(dst_key); > } > > static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen, > @@ -1039,7 +1046,7 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata, > pbx = &pb_local.pub; // read from sync buffer > } > #endif > - if (tag[0] == 'T') > + if (tag[0] == 'T' || !strcmp(tag, "IPL")) > /* parse text tag */ > read_ttag(s, pbx, tlen, metadata, tag); > else if (!memcmp(tag, "USLT", 4)) >From avformat.h: "Keys are unique; there can never be 2 tags with the same key. This is also meant semantically, i.e., a demuxer should not knowingly produce several keys that are literally different but semantically identical. E.g., key=Author5, key=Author6. In this example, all authors must be placed in the same tag." If this requirement did not exist, I would have fixed #6949 and #9641 long ago. - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".