From patchwork Thu Aug 25 00:27:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 37461 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp26169pzh; Wed, 24 Aug 2022 17:27:45 -0700 (PDT) X-Google-Smtp-Source: AA6agR6/M+++gJhnPETSglKMq49C5m8axKZu/MwqNibrU5N6++hCwTPvzOkFnsuWk9VD5rSY1SS+ X-Received: by 2002:a17:907:7292:b0:733:1965:3176 with SMTP id dt18-20020a170907729200b0073319653176mr863680ejc.318.1661387265681; Wed, 24 Aug 2022 17:27:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661387265; cv=none; d=google.com; s=arc-20160816; b=xqZbmy2WRAoCxJNQ85DsvXwYK/+4BPkLjHTmRqKGMAuZ/w+sBr75LqoUCagfbVPKbV 5t6Yx4Cbf7nnS3m5L1NovJDoZO2RaL4/LYOKtn7wlvpd741XGbqLGEUJShCLWIZFLq5b pha8lHJXMpmZwUVGGdfC58rtw80OA5xNh4dVIQohOLG3nTyj4QdQRab5px/Gje2k8cl5 fSwybs4k6MmWO4P5kO1JVgbww8+rTw8p61PTnKYT8nFDqfAc1szYZeiVmOf6RbChnB+I HIQsagXkLRbqMiWPQHshbaJnDQJMAoojyz8ryNK6FQFZRgSfgiEkQlPSD2rjHLjetgUZ xevw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=aVeHD5xHoVMZAAofQs9Nj/8apfxc6whDPoCrBzQXt3U=; b=QlkMFF9PC4vunURQtwxV6GeAdCO9RMdFl3T0M14WFnccdoIVR6jquyH0KnPhp0u2+3 9iDNxJ3S4GrwaPvisWdE8qa/TZO83Gz9xQQMVS9gukErp17+e68YmDRPS+Z+0Y+CpeRQ +IyMmyS23PVBWkZE6MR+bZUOmOyJq6VhJY4MNCyMAzw3/hVvBi61y4Cl3Nfw3Z3zindR s8/83p3Uji2iWp9LsOo272j+Lmf9MoLZiTsMRfpRp4JyUega2a+VVJY/r30b15aeOwaa w6Fptvyn/Oqkd2lLyFWSLgGVqX8hXUuefm9SMPWtSd7tzWLAWV3gFIXCNZObEBI6efjS W06g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=qHorpdx1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hw8-20020a170907a0c800b00734ca64fb9bsi3068981ejc.832.2022.08.24.17.27.38; Wed, 24 Aug 2022 17:27:45 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=qHorpdx1; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 884CF68B915; Thu, 25 Aug 2022 03:27:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D29DB68B8EC for ; Thu, 25 Aug 2022 03:27:29 +0300 (EEST) Received: by mail-qt1-f180.google.com with SMTP id cb8so14126334qtb.0 for ; Wed, 24 Aug 2022 17:27:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rcombs.me; s=google; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc; bh=rQAWEcKvvl1YRMqIlIAndnKAe3/sfCJqnqfevKH46HA=; b=qHorpdx1c6+NgbIiOXK3ZxjMXboUl38aRb4FyXSr/Vh54SmMuPQKOucgnWWmruxZmI A268QrTx6qsxt5r6/OD/2TttKPhmrmi1FQvimerRAlDNSeoRRC/gEpMyA6+qqGP50JrZ gQd7DH21ELRNSO5bql7ZxNH+Y+Omli+9O+l/5+04pgOjyvVklD9EGMhiXg6pn6V88GQh urFIpxspLawLzShOBxJjICrYTirVw5JQB6/wHh1q47fhIu1MvDgyrkpLeYgW415r6eMv MV+rfW7t2+RcMzmXIIdhUVIF8wd2/4rB1fri0jCh7Xg9m/SeUj9gWdAxqMqOFl7IdWRW t6LQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc; bh=rQAWEcKvvl1YRMqIlIAndnKAe3/sfCJqnqfevKH46HA=; b=Fz7PYbyAsdqfgYVytA4zSUdryudtQTvF0x73P297eGGt0a+bqFLtNKT11mBYa/t5ul 7SzWI/AG1VvngQeP/HhzgjRyFYyxy1Lvy7m/HA8ROg3XNjXbPzRzUvbYmbR6L9oDLpb9 PtcGGv7cJJpZo5NCfiIzTGqnPzDJTuQiqidjQ46GK48F30w8gdB7tkd4HXlGYgwfZUcu 5AmINrCufRDgTPoqYI8JgJ88NWS1vPtsghGWfGNlnUxGw7pHkpao2U4mcAQhLLUg66uh hJA+CqXSAwtjJL+BtgG0wPLHMZVAMk10HiLaZ3hGusoz+/kL4XzP3BCgtMoN4XgY4xXZ y67g== X-Gm-Message-State: ACgBeo3HoZE5xNPbaeUcs87hlyDzWVADb/VvCc894Wt93NH4UWM4LMWi 7Ypqr+jMu+x6Xjv+T2q87TiACGUtPSXo X-Received: by 2002:a05:622a:614:b0:343:487:45d1 with SMTP id z20-20020a05622a061400b00343048745d1mr1584724qta.443.1661387248414; Wed, 24 Aug 2022 17:27:28 -0700 (PDT) Received: from localhost.localdomain ([192.210.24.132]) by smtp.gmail.com with ESMTPSA id i22-20020a05620a405600b006bba9575621sm16521091qko.68.2022.08.24.17.27.27 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 24 Aug 2022 17:27:28 -0700 (PDT) From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Aug 2022 19:27:20 -0500 Message-Id: <20220825002722.79902-1-rcombs@rcombs.me> X-Mailer: git-send-email 2.37.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] lavu/dict: add AV_DICT_DEDUP 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HJwurbFF9Y6h This is useful when multiple metadata inputs may set the same value (e.g. both a container-specific header and an ID3 tag). --- libavutil/dict.c | 11 +++++++++++ libavutil/dict.h | 1 + 2 files changed, 12 insertions(+) diff --git a/libavutil/dict.c b/libavutil/dict.c index 9d3d96c58b..aa98f753a3 100644 --- a/libavutil/dict.c +++ b/libavutil/dict.c @@ -76,6 +76,17 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, if (!(flags & AV_DICT_MULTIKEY)) { tag = av_dict_get(m, key, NULL, flags); + } else if (flags & AV_DICT_DEDUP) { + while ((tag = av_dict_get(m, key, tag, flags))) { + if ((!value && !tag->value) || + (value && tag->value && !strcmp(value, tag->value))) { + if (flags & AV_DICT_DONT_STRDUP_KEY) + av_free((void*)key); + if (flags & AV_DICT_DONT_STRDUP_VAL) + av_free((void*)value); + return 0; + } + } } if (flags & AV_DICT_DONT_STRDUP_KEY) copy_key = (void *)key; diff --git a/libavutil/dict.h b/libavutil/dict.h index 0d1afc6c64..a957b48bf3 100644 --- a/libavutil/dict.h +++ b/libavutil/dict.h @@ -75,6 +75,7 @@ #define AV_DICT_APPEND 32 /**< If the entry already exists, append to it. Note that no delimiter is added, the strings are simply concatenated. */ #define AV_DICT_MULTIKEY 64 /**< Allow to store several equal keys in the dictionary */ +#define AV_DICT_DEDUP 128 /**< If inserting a value that already exists for a key, do nothing. Only relevant with AV_DICT_MULTIKEY. */ typedef struct AVDictionaryEntry { char *key; From patchwork Thu Aug 25 00:27:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 37462 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp26178pzh; Wed, 24 Aug 2022 17:27:47 -0700 (PDT) X-Google-Smtp-Source: AA6agR6vfGV1xPpPRdxxl3+aCfzc486EeMpeV7MQ224qwuqK0zoGux4ZD0QCk7cpwKYbLPkrl09L X-Received: by 2002:a17:907:75f9:b0:73d:6285:4c94 with SMTP id jz25-20020a17090775f900b0073d62854c94mr818236ejc.698.1661387267800; Wed, 24 Aug 2022 17:27:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661387267; cv=none; d=google.com; s=arc-20160816; b=kuqT9A88FO/fPfLaBmcjaUONv85v0AZHfJobkk0yuRer8CF/esVpQYyaqdE0xZRbC0 NOD+mZ9hDwEyNjSTx/tsINrCGPTa3PSZBbOUgb2Z7DaRdwwtOJKz5jUIpFhiKx/L45/0 cd+oYitm70JQVPTyP4Q1ddmaG2Ta9uLXYhIOWRwmX/cGSrZJi7LCS/dzOVeiUyUwfvX9 XPHiIXxFEGEiW23+xPA0X9FrnXbRKZrMAp6sFkIr1R/QfQaQ708s5PJbNEfbzmDk3BJH 2GmSk7RWvMbYEoPLIuHqT02slgKvBBgsuBK2oBA0ynorNmawLmGfTlWngo6eDspCvJ1P B7Qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=cqXmFiG2aEcDBWKugO/f8vIk5H9hVJvMJLo4L9ysQxo=; b=bb9yr7U4lcpRj65QNH1/erYyw41k9RjuA5AbmlxOQ73p+jnpsicADbEFqCW9bnGR/0 zDHFNNLP0pCtLvQcdygSuQedjj4nKm4Gz56gsV+xUB0Wdt1nUz8ONUXrTxv6dcrGE5cf kr/VWc6lgUfELTcchQ5gtS6yLeFmjix1EnddQHT1t/UhvAFxn7sSL872BtXR0bNGayIl na869n287RW25gno3l2y3vQxki4xIALac+82ouKkffaWUyuqnKqb0TxwXllnY1Z6ZsAM uCcSdFzdx1nnLPmycHGLCfapJSXAUFU0TT/jpDwMePDHLT2FvdCs0JQPbZLAPPVwlca/ 1TkA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=YnFH4ldj; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cf20-20020a170906b2d400b0073c1b04f592si2494096ejb.245.2022.08.24.17.27.46; Wed, 24 Aug 2022 17:27:47 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=YnFH4ldj; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 774FF68B988; Thu, 25 Aug 2022 03:27:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f181.google.com (mail-qk1-f181.google.com [209.85.222.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 932A568B92B for ; Thu, 25 Aug 2022 03:27:30 +0300 (EEST) Received: by mail-qk1-f181.google.com with SMTP id m5so14032127qkk.1 for ; Wed, 24 Aug 2022 17:27:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rcombs.me; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc; bh=lAlWDEqtYV5gIKzqoIXAvc9LgBo9MDfmFS20A2ONjTs=; b=YnFH4ldjnIj4JfTbQB4fMjNPVxSRKsUgE8QbdKLvU/r8zk2PAWHMQR7MOVulBB25hD o0DUlWh8FtwqkqqMSjKx+EGfxNuVdLWMLfXzgYGViMeE1aq+P4MUnXHqF6+bwatijYfV Uj2d9HX2Je0p+eRkZmlkSIllkeslqfvf+PsCCajNiMoOFEC+dfHcVAsX+agGzevggj91 9fchDRBd2bNB01g0cwxaROD1M9Xt3S8SN2pt8IXtqtmWzgGrDs6WXO0oKsH76bxbdFoH VzW+nKkHsKfrPeO5YAY5Nz0Hbnd2AF4aJphZq1qecUQuZPvbq89hzG8F8vFVypfSfbA+ Knnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc; bh=lAlWDEqtYV5gIKzqoIXAvc9LgBo9MDfmFS20A2ONjTs=; b=BF1q/YWmMtgE/PEKGEXdt44Qni5F4Ka5econ0o2DVT5rpUczbZF7+li+5wrNiTTRa/ UKoLWPxc0NgHRcNQAu4tG1fs59NNAtLxZL8CS/u5jBUrVI/LmA46bTqs9lrXX8RUnsq9 qysgIJOzhlEb4KQqtiUl4inXQVqKAYZ9Dnrd1ME1qYIKuuYB54JPUqB1yJLBnR6zJvht HIB0ADt5znJRDhJyBGcIRGJ8AXDtxLIA7tGztW/vXFcUraN4/Mtwr9vPCu1ELyvFh+Il JJpFAxwwcZ3yPGA3oJ6iqHE+B4xByMONRZUISWJ2lb59IXLBkwqQoZmtvISQ5N/UXC49 18fg== X-Gm-Message-State: ACgBeo16Aue1xgItwDl6dersJ+4bjtgZrRjFrTtrXnnh0VKm+Udc0bJG cy7ZggQaWTboBrGc4AlPc8fgvvCMgtjg X-Received: by 2002:a05:620a:e0a:b0:6bc:15e9:14fe with SMTP id y10-20020a05620a0e0a00b006bc15e914femr1406531qkm.86.1661387249085; Wed, 24 Aug 2022 17:27:29 -0700 (PDT) Received: from localhost.localdomain ([192.210.24.132]) by smtp.gmail.com with ESMTPSA id i22-20020a05620a405600b006bba9575621sm16521091qko.68.2022.08.24.17.27.28 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 24 Aug 2022 17:27:28 -0700 (PDT) From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Aug 2022 19:27:21 -0500 Message-Id: <20220825002722.79902-2-rcombs@rcombs.me> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220825002722.79902-1-rcombs@rcombs.me> References: <20220825002722.79902-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] lavf/metadata: support duplicate keys in ff_metadata_conv 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: xamJC9xfTGwj --- libavformat/metadata.c | 2 +- tests/ref/fate/cover-art-aiff-id3v2-remux | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libavformat/metadata.c b/libavformat/metadata.c index b9b6de7972..2a1ffc69e7 100644 --- a/libavformat/metadata.c +++ b/libavformat/metadata.c @@ -50,7 +50,7 @@ void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, key = dc->native; break; } - av_dict_set(&dst, key, mtag->value, 0); + av_dict_set(&dst, key, mtag->value, AV_DICT_MULTIKEY | AV_DICT_DEDUP); } av_dict_free(pm); *pm = dst; diff --git a/tests/ref/fate/cover-art-aiff-id3v2-remux b/tests/ref/fate/cover-art-aiff-id3v2-remux index 3ca2855eb8..2eac5f8d9c 100644 --- a/tests/ref/fate/cover-art-aiff-id3v2-remux +++ b/tests/ref/fate/cover-art-aiff-id3v2-remux @@ -67,10 +67,10 @@ TAG:title=third TAG:comment=Conductor [/STREAM] [FORMAT] -TAG:artist=Мельница +TAG:title=Дороги TAG:RATING=0 TAG:album=Ангелофрения -TAG:title=Дороги +TAG:artist=Мельница TAG:tracktotal=11 TAG:totaltracks=11 TAG:genre=Folk From patchwork Thu Aug 25 00:27:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 37463 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp26238pzh; Wed, 24 Aug 2022 17:27:55 -0700 (PDT) X-Google-Smtp-Source: AA6agR4g6MO/XXGwN6fIXNcMJ/lBoicKOUVguIiv81do63Xim6vz+joQu99KP4bmmUd1x9E+Lfz6 X-Received: by 2002:a17:907:75f2:b0:73d:585e:547b with SMTP id jz18-20020a17090775f200b0073d585e547bmr844651ejc.147.1661387275641; Wed, 24 Aug 2022 17:27:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661387275; cv=none; d=google.com; s=arc-20160816; b=L8D88NPmPklZV04Ex4cJDLKRlHz/KdDjaMAOe00pTjijfT28Lc8KSaN0sJBINjT4mf Feo/oA34nIIQoD7dwrQREh4kXGCcEjO1d4QTKlhvc5oOA8arRY69tE0baloSsiurUxGZ p7SCZlHpm4yrpXjypjHotQrgPSAvAeFgHEFQU1YQJnD3P+wGt5mHUe779tsxTv4O8XZf DtuJS92bV+NegiTjYhlPIs1zWubWKdvFkQMeSy9EgTh8L2+rbm/bvZvtuYScZVuYQOUL IYyTh47oGk+Zqv4bHstt4o1HSWj8MiY/HY0HvF1BOvqP5WrZ1ywEP6EvCt8K0QvDFq6N Vp/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=4VT+FGLohU0G8rRJ8WhVUHzm05EL7Qi5ZDyxr0AZyWg=; b=Jtu0o4S8DpfoW/0p2A2x0k8QzoU4sOySSCu0K/OQJinCRgM2PXrZ0/EDQK8EDJ7bER nFgpsRmXv5dhF0QkoqEdtSlGhNF2ND2bggFAvM7e2CZAaMcQaACNKEbqYXTyW7tq2u8j VYmbvHR/u2G1y1KQmqIdu55Pm6sCNjCzDeipsReY0YUmDuADoOFP5HmLbb5vZqdihBPR EwGs19CVdKL3z5l0NoaxrVcAFoX+1VlQvQ2PmlcHc4GTEVgllGHjpCokkgxwfC00dtuw 59LGVhp3bpeugP4vIp+pBFHsXAxLECiXOvcD6N06spE4pChSGOwJmksOBAYzLRZDFiKZ ADZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=r67IuHoZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f6-20020a17090631c600b00730a07ef039si2578165ejf.423.2022.08.24.17.27.55; Wed, 24 Aug 2022 17:27:55 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=r67IuHoZ; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7BCB368B993; Thu, 25 Aug 2022 03:27:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f175.google.com (mail-qt1-f175.google.com [209.85.160.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 21A9968B937 for ; Thu, 25 Aug 2022 03:27:31 +0300 (EEST) Received: by mail-qt1-f175.google.com with SMTP id a4so14085384qto.10 for ; Wed, 24 Aug 2022 17:27:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rcombs.me; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc; bh=kSRRoBFkBOWQ1BGEXZopxUfT2hRwJvMLYOw8EvMyDFI=; b=r67IuHoZybrRfJo6wcVj6f2SW64Ul8ZLSCvJwTkbbMuJL0Drh6MzuBHkr42WNxXz2x vMhMsPihnsI1bBANEOgCw+DVU/6UbsZTIWEZztbCwyCYXOvCHbFlkmQFylrPwYCX+Agd Dc7ML0SmqibvrJ+Wf3AK3qV16ZEsy4VFWa3pAUBhcCtVxyEyiLegnUydspck/PTL/bRn fjssBD28Hgxb+2ETsKvw1awzRzHGmM07CGkZkk95SCkyxiiryFKJ1GEiqVNL5Xn3+qKD wZ3+D+ZnOCXMTOZuHzF09do/J8XWvADIpYRrO5iI4U77mpTc+SglS55swlKQpVUM2G1w rvxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc; bh=kSRRoBFkBOWQ1BGEXZopxUfT2hRwJvMLYOw8EvMyDFI=; b=004XwcFDhlp/kxcsc1UxiHbG8IxPN9JeZIKAt4OEaZFl0LRtakfjihjAuwlC6+a4kP U+h5hM67wzozCvhABp3oHZVnmM9c5RHSHbPfx6x25qve90hiKKS4ryX+LKGVfXjKNFUi HrBNafq0si6u1T2lmlpQwYv9YusNlYNVxmvXN+lOULSqtNr2zEC+l9QsOZaQsOufsmgD PXFCpLEVNyE7zcI237h7cBlDZNU17eoJayY3Q+Rc5wpkCOtLjKSh17MGnu7SnKBHlmE+ XBebruzSgVRrl3O90ePJX7RvYR+8tZqhxgtb3pgoB1agWEg3A9BPQ9RhKW6novR7uSuT dNyw== X-Gm-Message-State: ACgBeo19Fxv+9qkto96q3l6BoV0Z/mA23VA7UqG40/LtLsBHc+gCmu2w Zp7eFTh1Zrdqlh/F36m8no0Xk8VXGl/H X-Received: by 2002:ac8:5cc2:0:b0:344:50c9:5308 with SMTP id s2-20020ac85cc2000000b0034450c95308mr1683021qta.602.1661387249728; Wed, 24 Aug 2022 17:27:29 -0700 (PDT) Received: from localhost.localdomain ([192.210.24.132]) by smtp.gmail.com with ESMTPSA id i22-20020a05620a405600b006bba9575621sm16521091qko.68.2022.08.24.17.27.29 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 24 Aug 2022 17:27:29 -0700 (PDT) From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Aug 2022 19:27:22 -0500 Message-Id: <20220825002722.79902-3-rcombs@rcombs.me> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220825002722.79902-1-rcombs@rcombs.me> References: <20220825002722.79902-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ztv072pfVzHP 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..335a1436b2 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 | AV_DICT_DEDUP; 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))