From patchwork Thu Mar 28 03:12:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 47568 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1048960pzb; Wed, 27 Mar 2024 20:12:51 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX4TjOESJXV9J5EscHe5CPy+j/P2bcGwAI+kjPQhVqEi4ArLJLxnT7r1Jk8SG+FMUNc3sPXZ4guN/zGPNX08qB2jEwXmyUeA9DzzQ== X-Google-Smtp-Source: AGHT+IHzjX+hdbIJ3pxlaXMC/m6MzrhZ8jrGIQQPtwYvu8Vn6qTDge3prrgJYrbnmhX2QtgoGqUz X-Received: by 2002:a17:907:9408:b0:a47:366b:21da with SMTP id dk8-20020a170907940800b00a47366b21damr726915ejc.4.1711595570838; Wed, 27 Mar 2024 20:12:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711595570; cv=none; d=google.com; s=arc-20160816; b=G4m4MSbYWJETA/Ixxe3zwDNuZoELU9EA9hg5FrB0/vJu1usp712bwkUl+RZ7+ODpqm GHyb2PwOhhmwW0wAOehBBKymVAZ63/F2K4Fc+Q2GPfJNMUGm+zZ2cqnwrmyNwnFF/EJk UZWkSAQHdQANucQOOGBFC/ErgCCua+cOiecbhiBQVq0pTUHfariH6voY1Z3YgitakrIe BrXsoU/xIkWOutrsl93pDMjzymTKVTkO0hGWksJiMy4Ko9rZT3V9Dr1N671RTQkuoYew CTGREWRzCF6xz6vfXfRtY+ifpySI20RJrWBoQ262aLUuR1oTxEYPsykxlWPGd+lVO4Hc Q7qw== 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=xGQAFddigf3yav1Adc1blruyyO0djswYMmYKJaMiPLk=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=TofmSHqXrbON14g1TkbInIJ9wJOw0lw8QXDy14mX4SvN6aoIgYcGMhlw6Fv4QJ6FHc cz9JRKcSQcmkmVplxOHp53+YIPL5fbO4DBsb5S/PTjBySghKR7LZTqPewJQXzMG9BWsS Pkcv3p0BpblQAvxsoRLIDK7p1vpQMkMBrHsnIVn5z6LFJ+L/ECXTrhciwo+pxfxSRpv1 H86kNkC4IZ9OoDZ4kIZihiZYjP3YF8NAuZrTudmUwJTFuK5dNbw4p+Gq8GNKeh+C3gU3 i8fXHJ0uyyY0kiO5+eSSMXGXASIZjYUFO1v2qaXwtcdzraP3hIgn9eCB+az1yEcpsSSR 9vXA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=iDc1KqVT; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d24-20020a1709067f1800b00a4e086884eesi221965ejr.850.2024.03.27.20.12.50; Wed, 27 Mar 2024 20:12:50 -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=@gmail.com header.s=20230601 header.b=iDc1KqVT; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 53F8E68D644; Thu, 28 Mar 2024 05:12:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oo1-f41.google.com (mail-oo1-f41.google.com [209.85.161.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4CA3768D4AD for ; Thu, 28 Mar 2024 05:12:39 +0200 (EET) Received: by mail-oo1-f41.google.com with SMTP id 006d021491bc7-5a58009fe88so279138eaf.0 for ; Wed, 27 Mar 2024 20:12:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711595556; x=1712200356; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=S2R6YXUwNAAfQ2wLP9ufw/LYrOBF8/Ghnwk7KOdB/DM=; b=iDc1KqVTZCvq0e4PPgEaOWwrpWOG4UR/Zj1jGghjYBSYeQQ9WgLydautiBvG4YDqFM e1cjtE8qXu07IqvC6hJzcleABcY1kD7BwpHt0rMT5joPaFX4jsEOtvB/9FX8drZarIHB IkfB16r4fLotP6+bmzlWaNtmsK6cfgf0jbVn+Hw+6S45WCm1Zy41cU8Ku2Qy2opEk0+P o5z0HQkvFSNm5/UtvaFOphErp5ajGAZGEjmRIH8k4pDfAR47zeYgydjSvsyc0tNkE3ER jzH5ba98L3e1CZjXgSlPnWVpu1izA7asDZrpI/kqgcqgZXCYU5ZACUCqDCZfwjzTdPoi 1Mfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711595556; x=1712200356; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=S2R6YXUwNAAfQ2wLP9ufw/LYrOBF8/Ghnwk7KOdB/DM=; b=rmhkPCC4HuigO7+RN5P08S0ArzNugJnxGNNMbPYBZGe0vGxL8KMW3ZnccvH2TFOrH4 WrwzG8IVTNukkpQdFzaN1H/IhkjczGkM+lWlMOaqaI6ZASqnKJtAUeb6MfBhP8Gm6jp2 25itmpVHUVBMxAdDIM+8o99JOJn0RFq2gJsLddyv7imfgc5/hgIM5o8B88j2kUJizXEr WO35xsIUWXpEe+AO1q0wczDiVxK6x119aiezDLS0CfATYdhKBI0Lrv6ETkAd8hpBnC/9 zT5UCvoVj+tWQDtp5NXi/J/WB4/K8CkeWN5V7jTqztvHHn+qBHxAykDZDnS5BoxLZ3XU m1Yg== X-Gm-Message-State: AOJu0YxMVsgGZpFp0Hl6Z7E3bJBJmMFZ1r2Uflfn2hvfWE1OtobMGNnL cADmxe+FLgAqw0175KUjKjRBCcYWt/xuY666t72TOorRpLgyhjksEmicW9p0 X-Received: by 2002:a05:6358:e4a5:b0:17c:1e6c:14c0 with SMTP id by37-20020a056358e4a500b0017c1e6c14c0mr1367051rwb.16.1711595555713; Wed, 27 Mar 2024 20:12:35 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id q20-20020a635054000000b005dc120fa3b2sm249964pgl.18.2024.03.27.20.12.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 20:12:35 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Mar 2024 00:12:04 -0300 Message-ID: <20240328031210.21407-1-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/7 v4] avutil/frame: add a flag to allow overwritting existing entries 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: wgbbtKBeIAdA Enable it only for side data types that don't allow more than one entry. Signed-off-by: James Almer --- libavutil/frame.c | 59 ++++++++++++++++++++++++++++--- libavutil/frame.h | 27 +++++++++----- libavutil/tests/side_data_array.c | 52 +++++++++++++++------------ tests/ref/fate/side_data_array | 22 ++++++------ 4 files changed, 115 insertions(+), 45 deletions(-) diff --git a/libavutil/frame.c b/libavutil/frame.c index ef1613c344..d9bd19b2aa 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -799,12 +799,34 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, size_t size, unsigned int flags) { - AVBufferRef *buf = av_buffer_alloc(size); + const AVSideDataDescriptor *desc = av_frame_side_data_desc(type); + AVBufferRef *buf; AVFrameSideData *ret = NULL; if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE) remove_side_data(sd, nb_sd, type); + if (!desc || !(desc->props & AV_SIDE_DATA_PROP_MULTI)) { + for (int i = 0; i < *nb_sd; i++) { + AVFrameSideData *entry = ((*sd)[i]); + if (entry->type != type) + continue; + if (!(flags & AV_FRAME_SIDE_DATA_FLAG_REPLACE)) + return NULL; + + buf = av_buffer_alloc(size); + if (!buf) + return NULL; + + av_buffer_unref(&entry->buf); + av_dict_free(&entry->metadata); + entry->buf = buf; + entry->data = buf->data; + entry->size = buf->size; + return entry; + } + } + buf = av_buffer_alloc(size); ret = add_side_data_from_buf(sd, nb_sd, type, buf); if (!ret) av_buffer_unref(&buf); @@ -815,6 +837,7 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags) { + const AVSideDataDescriptor *desc; AVBufferRef *buf = NULL; AVFrameSideData *sd_dst = NULL; int ret = AVERROR_BUG; @@ -822,13 +845,41 @@ int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, if (!sd || !src || !nb_sd || (*nb_sd && !*sd)) return AVERROR(EINVAL); + desc = av_frame_side_data_desc(src->type); + if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE) + remove_side_data(sd, nb_sd, src->type); + if (!desc || !(desc->props & AV_SIDE_DATA_PROP_MULTI)) { + for (int i = 0; i < *nb_sd; i++) { + AVFrameSideData *entry = ((*sd)[i]); + AVDictionary *dict = NULL; + + if (entry->type != src->type) + continue; + if (!(flags & AV_FRAME_SIDE_DATA_FLAG_REPLACE)) + return AVERROR(EEXIST); + + ret = av_dict_copy(&dict, src->metadata, 0); + if (ret < 0) + return ret; + + ret = av_buffer_replace(&entry->buf, src->buf); + if (ret < 0) { + av_dict_free(&dict); + return ret; + } + + av_dict_free(&entry->metadata); + entry->metadata = dict; + entry->data = src->data; + entry->size = src->size; + return 0; + } + } + buf = av_buffer_ref(src->buf); if (!buf) return AVERROR(ENOMEM); - if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE) - remove_side_data(sd, nb_sd, src->type); - sd_dst = add_side_data_from_buf(sd, nb_sd, src->type, buf); if (!sd_dst) { av_buffer_unref(&buf); diff --git a/libavutil/frame.h b/libavutil/frame.h index 3b6d746a16..2ea129888e 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -1040,7 +1040,14 @@ const AVSideDataDescriptor *av_frame_side_data_desc(enum AVFrameSideDataType typ */ void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd); +/** + * Remove existing entries before adding new ones. + */ #define AV_FRAME_SIDE_DATA_FLAG_UNIQUE (1 << 0) +/** + * Don't add a new entry if another of the same type exists. + */ +#define AV_FRAME_SIDE_DATA_FLAG_REPLACE (1 << 1) /** * Add new side data entry to an array. @@ -1053,10 +1060,12 @@ void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd); * @param size size of the side data * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0. * - * @return newly added side data on success, NULL on error. In case of - * AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching - * AVFrameSideDataType will be removed before the addition is - * attempted. + * @return newly added side data on success, NULL on error. + * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of + * matching AVFrameSideDataType will be removed before the addition + * is attempted. + * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an + * entry of the same type already exists, it will be replaced instead. */ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, @@ -1074,10 +1083,12 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, * for the buffer. * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0. * - * @return negative error code on failure, >=0 on success. In case of - * AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching - * AVFrameSideDataType will be removed before the addition is - * attempted. + * @return negative error code on failure, >=0 on success. + * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of + * matching AVFrameSideDataType will be removed before the addition + * is attempted. + * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an + * entry of the same type already exists, it will be replaced instead. */ int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags); diff --git a/libavutil/tests/side_data_array.c b/libavutil/tests/side_data_array.c index 793a62c009..633e9ee681 100644 --- a/libavutil/tests/side_data_array.c +++ b/libavutil/tests/side_data_array.c @@ -20,23 +20,22 @@ #include #include "libavutil/frame.c" -#include "libavutil/mastering_display_metadata.h" +#include "libavutil/internal.h" -static void print_clls(const AVFrameSideData **sd, const int nb_sd) +static void print_entries(const AVFrameSideData **sd, const int nb_sd) { for (int i = 0; i < nb_sd; i++) { const AVFrameSideData *entry = sd[i]; - printf("sd %d, %s", - i, av_frame_side_data_name(entry->type)); + printf("sd %d (size %"SIZE_SPECIFIER"), %s", + i, entry->size, av_frame_side_data_name(entry->type)); - if (entry->type != AV_FRAME_DATA_CONTENT_LIGHT_LEVEL) { + if (entry->type != AV_FRAME_DATA_SEI_UNREGISTERED) { putchar('\n'); continue; } - printf(": MaxCLL: %u\n", - ((AVContentLightMetadata *)entry->data)->MaxCLL); + printf(": %d\n", *(int32_t *)entry->data); } } @@ -51,51 +50,60 @@ int main(void) av_assert0( av_frame_side_data_new(&set.sd, &set.nb_sd, - AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, - 0, 0)); + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + sizeof(int64_t), 0)); + av_assert0( + av_frame_side_data_new(&set.sd, &set.nb_sd, + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + sizeof(int32_t), AV_FRAME_SIDE_DATA_FLAG_REPLACE)); // test entries in the middle for (int value = 1; value < 4; value++) { AVFrameSideData *sd = av_frame_side_data_new( - &set.sd, &set.nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, - sizeof(AVContentLightMetadata), 0); + &set.sd, &set.nb_sd, AV_FRAME_DATA_SEI_UNREGISTERED, + sizeof(int32_t), 0); av_assert0(sd); - ((AVContentLightMetadata *)sd->data)->MaxCLL = value; + *(int32_t *)sd->data = value; } av_assert0( av_frame_side_data_new( - &set.sd, &set.nb_sd, AV_FRAME_DATA_SPHERICAL, 0, 0)); + &set.sd, &set.nb_sd, AV_FRAME_DATA_SPHERICAL, + sizeof(int64_t), 0)); + + av_assert0( + av_frame_side_data_new( + &set.sd, &set.nb_sd, AV_FRAME_DATA_SPHERICAL, + sizeof(int32_t), AV_FRAME_SIDE_DATA_FLAG_REPLACE)); // test entries at the end for (int value = 1; value < 4; value++) { AVFrameSideData *sd = av_frame_side_data_new( - &set.sd, &set.nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, - sizeof(AVContentLightMetadata), 0); + &set.sd, &set.nb_sd, AV_FRAME_DATA_SEI_UNREGISTERED, + sizeof(int32_t), 0); av_assert0(sd); - ((AVContentLightMetadata *)sd->data)->MaxCLL = value + 3; + *(int32_t *)sd->data = value + 3; } puts("Initial addition results with duplicates:"); - print_clls((const AVFrameSideData **)set.sd, set.nb_sd); + print_entries((const AVFrameSideData **)set.sd, set.nb_sd); { AVFrameSideData *sd = av_frame_side_data_new( - &set.sd, &set.nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, - sizeof(AVContentLightMetadata), - AV_FRAME_SIDE_DATA_FLAG_UNIQUE); + &set.sd, &set.nb_sd, AV_FRAME_DATA_SEI_UNREGISTERED, + sizeof(int32_t), AV_FRAME_SIDE_DATA_FLAG_UNIQUE); av_assert0(sd); - ((AVContentLightMetadata *)sd->data)->MaxCLL = 1337; + *(int32_t *)sd->data = 1337; } puts("\nFinal state after a single 'no-duplicates' addition:"); - print_clls((const AVFrameSideData **)set.sd, set.nb_sd); + print_entries((const AVFrameSideData **)set.sd, set.nb_sd); av_frame_side_data_free(&set.sd, &set.nb_sd); diff --git a/tests/ref/fate/side_data_array b/tests/ref/fate/side_data_array index 7d8c684d8f..c1d77b0445 100644 --- a/tests/ref/fate/side_data_array +++ b/tests/ref/fate/side_data_array @@ -1,14 +1,14 @@ Initial addition results with duplicates: -sd 0, Ambient viewing environment -sd 1, Content light level metadata: MaxCLL: 1 -sd 2, Content light level metadata: MaxCLL: 2 -sd 3, Content light level metadata: MaxCLL: 3 -sd 4, Spherical Mapping -sd 5, Content light level metadata: MaxCLL: 4 -sd 6, Content light level metadata: MaxCLL: 5 -sd 7, Content light level metadata: MaxCLL: 6 +sd 0 (size 4), Content light level metadata +sd 1 (size 4), H.26[45] User Data Unregistered SEI message: 1 +sd 2 (size 4), H.26[45] User Data Unregistered SEI message: 2 +sd 3 (size 4), H.26[45] User Data Unregistered SEI message: 3 +sd 4 (size 4), Spherical Mapping +sd 5 (size 4), H.26[45] User Data Unregistered SEI message: 4 +sd 6 (size 4), H.26[45] User Data Unregistered SEI message: 5 +sd 7 (size 4), H.26[45] User Data Unregistered SEI message: 6 Final state after a single 'no-duplicates' addition: -sd 0, Ambient viewing environment -sd 1, Spherical Mapping -sd 2, Content light level metadata: MaxCLL: 1337 +sd 0 (size 4), Content light level metadata +sd 1 (size 4), Spherical Mapping +sd 2 (size 4), H.26[45] User Data Unregistered SEI message: 1337 From patchwork Thu Mar 28 03:12:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 47569 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1049022pzb; Wed, 27 Mar 2024 20:13:01 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX+OQgZ34BxfLmYzg7dLJ9f0UeYO/t+Aiz31EAxhEhbC9iuHo5NXoTD9l/pOdYsZiGkBmArSNET0qBtgAVQyUw7SjeCqt+0WO3u1g== X-Google-Smtp-Source: AGHT+IF2w7Euz7PLSPqRkEbXdBBDidpGXTs33GOZyW0qyA7L1hrx5sVOVR89G/bBzc754jJy+/Y5 X-Received: by 2002:a50:d688:0:b0:56b:b8c8:53e4 with SMTP id r8-20020a50d688000000b0056bb8c853e4mr876420edi.4.1711595581602; Wed, 27 Mar 2024 20:13:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711595581; cv=none; d=google.com; s=arc-20160816; b=pts+Bi99wWgCvUD9dbxGSGp7ItQmeAtB4zIUK3H/666vc6U7n7v0DNttaFkww1XZQl R3fjYiO82Ind3M9iVXySONbotPkXDZAzp0eT399JqLiRY3DUWwZP0V9eiersihQgq3oB AKX1mDb2fFHwuk4KeJzo04GVFL78Bg2Kw+Db+BUomexMjGchcmsRSyeL3Tc1kjsOUh6g fi/xiYrd7QqIhrf4ydOT9eBxi03URGZYFVahC7XyCPobPRozD+Tsb4/UEbGV8h3dMDqP IrygSYreBudHQ66U/+jI3vX6vvvCvMlJtHgs0X+62j6tYglrq70+8i4fN/pH+NJBg4ox KmYw== 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=PmAC9Wq/Yoc5dn0oPQh9HngM7HPEWLIZWwO7cNu1R9w=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=IYGqTQXERs399JHiG/2Aml6XwSDSyPk+avtogHfd13JOB1wvQL6RKXmrYU2NzZTqC0 Gj1ocR7dwgKrInNrZEzZNurwfCYgzn8N7Ds5DsTaFUVCdO7otBApLz70JcqbUx1Ogzgm ZqH9BpqJ8zbkTZYLCYHl8KMCZ2TCwUxUbII2qO9x8cRw/5CCdOvAaAK+jgT4nq1SD2B9 PPFpPxY/f5/FZRAAE3G0FyuXlxo7j9fQmSkcBcph0SogSeiJrRG+B2haxNRGY1Eg9x0p pOW3GjTWQ6WQueRhgtPPUCwAhNpg0n0kgKwb7WUd9uXZIRdWU4rC6VJK93KO5F1A6j0w vxPg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=P9CErzNP; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id x29-20020a50d61d000000b00568d32672f2si272642edi.403.2024.03.27.20.13.01; Wed, 27 Mar 2024 20:13:01 -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=@gmail.com header.s=20230601 header.b=P9CErzNP; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 68A2E68D6EB; Thu, 28 Mar 2024 05:12:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C1B5668D5C6 for ; Thu, 28 Mar 2024 05:12:40 +0200 (EET) Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-6e6ee9e3cffso384524b3a.1 for ; Wed, 27 Mar 2024 20:12:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711595558; x=1712200358; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=/lU0TfGjvAvrwrx7lGE12oA1DkVyxyyMMwXWC+zBpZA=; b=P9CErzNPjzbEnAlNys8MAvC2X+2fnWgxOukSrGN4wSXBR9hKiqW7d6Ilyzp6lCGDbv kJ2q0/yeQFBCgeh8Nk2rb/O5uDPQBO38fP06tNqtwqqWI+WCFF86Y5Gh1/qq8TZsu/Jq Z8eaAuZPOjUH0tLhC/Dtq4vPs2fuEtd+yfqF3RwKXeFiPMzngeckCgo0DsY+hT4gZeiX yKny7fGc+K0Z7ZL2t/1FqjBUc+plCXFZK7rYu1SMlbLxz6pV6XPWLRYv9uzP53PlE5zk QLBrs7F0d6djCy7OPRJof74l4iJHIFILVIn+ubv7GvK4IbU+0pYjzN484wBiVcbm3K2q nOeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711595558; x=1712200358; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/lU0TfGjvAvrwrx7lGE12oA1DkVyxyyMMwXWC+zBpZA=; b=cAJ6x0IfQpyMdkYdLNAb4jQZXetgJ8Wi5RmzO5K0ereq5/4dpBl8dhA7oQgUuvODaR 6aKyMx2eW4nIyc0fJt+QsbPUnHdOIbose318OynMmIqsro257vNUhXtNJ3sSH37TMelr Wtp3sm+TSS9AyyJt0ewMXjn7Ue25vQHFcDJHe+BY4keohhD+lU4FlmbH+/b60RLrs/RI nN02mHHDjqGvIhiCy2giSFBGNSq08mWPjE+BDnSor1XKdROJMO+l5PgAkZI1agZv2t0X tfnj1LmPgB5j4rPtsibUTI2Vpone9V/1qbhyT8ZNluyhFjeF9hEsnYccbWIMiU1QVuIU ul4w== X-Gm-Message-State: AOJu0YwUdrbnkG/s0voWM6s8HttNwXO6m19RbyfHq+4lKodGAcHCG3Qo IGmRLkbmoG+PzioeAbgGjPbDdlD34iJrfWfql59mEc/ts42hYToVhM2HWywY X-Received: by 2002:a05:6a20:5489:b0:1a3:5920:ae9f with SMTP id i9-20020a056a20548900b001a35920ae9fmr1604848pzk.2.1711595557605; Wed, 27 Mar 2024 20:12:37 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id q20-20020a635054000000b005dc120fa3b2sm249964pgl.18.2024.03.27.20.12.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 20:12:36 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Mar 2024 00:12:05 -0300 Message-ID: <20240328031210.21407-2-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240328031210.21407-1-jamrial@gmail.com> References: <20240328031210.21407-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/7 v4] avutil/frame: add helper for adding side data w/ AVBufferRef to array 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: G3GANNNGj95D Signed-off-by: James Almer --- libavutil/frame.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++ libavutil/frame.h | 34 ++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/libavutil/frame.c b/libavutil/frame.c index d9bd19b2aa..a165e56a64 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -834,6 +834,59 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, return ret; } +AVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd, + enum AVFrameSideDataType type, + AVBufferRef **pbuf, unsigned int flags) +{ + const AVSideDataDescriptor *desc = av_frame_side_data_desc(type); + AVFrameSideData *sd_dst = NULL; + AVBufferRef *buf; + + if (!sd || !pbuf || !*pbuf || !nb_sd || (*nb_sd && !*sd)) + return NULL; + + if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE) + remove_side_data(sd, nb_sd, type); + if (!desc || !(desc->props & AV_SIDE_DATA_PROP_MULTI)) { + for (int i = 0; i < *nb_sd; i++) { + AVFrameSideData *entry = ((*sd)[i]); + + if (entry->type != type) + continue; + if (!(flags & AV_FRAME_SIDE_DATA_FLAG_REPLACE)) + return NULL; + + buf = *pbuf; + if (flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF) { + int ret = av_buffer_replace(&entry->buf, buf); + if (ret < 0) + return NULL; + } else + *pbuf = NULL; + + av_dict_free(&entry->metadata); + entry->data = buf->data; + entry->size = buf->size; + return entry; + } + } + + buf = (flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF) ? + av_buffer_ref(*pbuf) : *pbuf; + + sd_dst = add_side_data_from_buf(sd, nb_sd, type, buf); + if (!sd_dst) { + if (flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF) + av_buffer_unref(&buf); + return NULL; + } + + if (!(flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF)) + *pbuf = NULL; + + return sd_dst; +} + int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags) { diff --git a/libavutil/frame.h b/libavutil/frame.h index 2ea129888e..3e5d170a5b 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -1048,6 +1048,10 @@ void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd); * Don't add a new entry if another of the same type exists. */ #define AV_FRAME_SIDE_DATA_FLAG_REPLACE (1 << 1) +/** + * Create a new reference instead of taking ownership of the passed in one. + */ +#define AV_FRAME_SIDE_DATA_FLAG_NEW_REF (1 << 2) /** * Add new side data entry to an array. @@ -1066,11 +1070,40 @@ void av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd); * is attempted. * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an * entry of the same type already exists, it will be replaced instead. + * @note AV_FRAME_SIDE_DATA_FLAG_NEW_REF has no effect in this function. */ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, size_t size, unsigned int flags); +/** + * Add a new side data entry to an array from an existing AVBufferRef. + * + * @param sd pointer to array of side data to which to add another entry, + * or to NULL in order to start a new array. + * @param nb_sd pointer to an integer containing the number of entries in + * the array. + * @param type type of the added side data + * @param buf Pointer to AVBufferRef to add to the array. On success, + * the function takes ownership of the AVBufferRef and *buf is + * set to NULL, unless AV_FRAME_SIDE_DATA_FLAG_NEW_REF is set + * in which case the ownership will remain with the caller. + * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0. + * + * @return newly added side data on success, NULL on error. + * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of + * matching AVFrameSideDataType will be removed before the addition + * is attempted. + * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an + * entry of the same type already exists, it will be replaced instead. + * @note In case of AV_FRAME_SIDE_DATA_FLAG_NEW_REF being set, the ownership + * of *buf will remain with the caller. + * + */ +AVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd, + enum AVFrameSideDataType type, + AVBufferRef **buf, unsigned int flags); + /** * Add a new side data entry to an array based on existing side data, taking * a reference towards the contained AVBufferRef. @@ -1089,6 +1122,7 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, * is attempted. * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an * entry of the same type already exists, it will be replaced instead. + * @note AV_FRAME_SIDE_DATA_FLAG_NEW_REF has no effect in this function. */ int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags); From patchwork Thu Mar 28 03:12:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 47570 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1049094pzb; Wed, 27 Mar 2024 20:13:10 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWBnKuFmtTio0Duv7g7ETmklM9bAD9bcNErvSP0Hk4Y3klOcS+lBmrDY7OSzMKyA/eUyPTjltUgT4jEEH2zRhjad9dyNWkN7YpCPA== X-Google-Smtp-Source: AGHT+IFyNROVwNSmwvjRuoRUQzNxPvFGehGtGQeBCjtjNvxvjxczN/uCkeQ6famoTb/7g/VZilYi X-Received: by 2002:a50:9b0b:0:b0:56b:dce0:c795 with SMTP id o11-20020a509b0b000000b0056bdce0c795mr943054edi.4.1711595590569; Wed, 27 Mar 2024 20:13:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711595590; cv=none; d=google.com; s=arc-20160816; b=0jc09jW6Ng+fWjqDMeIDiP7voBe5/A68qR6BPc/u6wziv4SHo51wB9d6Yc9VESKU3u Cjzfg2YYZmiSRNEWFpB5NaLrUNMl3HqVtXdhtMt6UDBqGz1OdH7m6viJ8OndNWDTgifv X71oAnO5OG5kczkQjb4oC6J5QZjYxLtxcioRyGdkgtb7pUa+j21hAvDP1Fr8sZX3qYKT OjrTFQ1/rAwx2qWnk9A6WL9WiBfaJeKkxUSH3hycUXcuoUrMvAH8WeDY7q4e9zK+MChd 9WNY6Vs5eBy4/yGxmoxpou2v0oaLLC8LKrNk+N3DRM9afC+Xb0dHOuHRn2ad5yjYm7p9 8H7A== 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=wsks1eszzpXsalnCYUBGURComroiryHj+T45VthfLrs=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Fijq9zm4oCvAckO9riD8zx1//GyrtcjRan7Tqo0SMTS9cqSk9pTg0p4g+AHa6tHxTW m3R6BYWPq7J9MyA0owRiQr4o/PgL/ATK1DnPXGkbS4zXW9s/Hq1g/5qZu84oIKKwzvmX SXBkKf7qp5uJqDoCtrmKzB3n44iphsWy02qMNLiB70ayZdOmFoS7arNxBTikdlNCr5ep LUHwdgB5r273PObTd/cou9he2zJPH5seOpfNXu4HUlzYg5CL+w0IiA5T++CkvQr9fgcU RMp3ZgzPKB8twFhMZZ7eKk/DFsRNodXOhOEoxFOgCzY1fodIBz0s0smuJ+IZySP2CR8j VAhQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=X08gvrfn; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q5-20020a50aa85000000b0056b9ef8f01dsi279693edc.45.2024.03.27.20.13.09; Wed, 27 Mar 2024 20:13:10 -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=@gmail.com header.s=20230601 header.b=X08gvrfn; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 82FD368D6F8; Thu, 28 Mar 2024 05:12:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DD1AD68D1AE for ; Thu, 28 Mar 2024 05:12:41 +0200 (EET) Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-6e69a9c0eaeso297421a34.3 for ; Wed, 27 Mar 2024 20:12:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711595559; x=1712200359; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=D4XKWHImBFVZyGI+3N8WOnDK82IyGtdzc5wiQ2b6UmA=; b=X08gvrfn1RpqOdjaaxRmDtptP4NTVCUtORW6ib87ECA8U9dknib8KOX8U39ExBuAio vLc/wBNFRyokUB7PF8IvbZQAVadmXCzXnZdg5gpi7ht6xKnG3t8MPIxsaokW351+v91b mFre5ywvNrBWzMSqlKgRB9ctUVtI/gztQ3fmynVYCMq6ovzZlqGjt4YNKiMxsKX1MHhH N3X/XG81VGsTPruE2YwGyKeHVn0GbZSCsqlIPpObWBFW+wnKRfFnbIrewkhRKNtLcPJ4 dtvCjbyLMjLnAxUKwUu07PjO7i/4k46WrO3rG14qpyfiEwNDv3NFYJnmXqGhKzelQRQ1 YvMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711595559; x=1712200359; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=D4XKWHImBFVZyGI+3N8WOnDK82IyGtdzc5wiQ2b6UmA=; b=N22l4CK755Hy1lb9v7NU37PVHmp9bmwWog+jbwVaeS2AIVmKanBzjl5qsPHDzb1V9S KDww/30Mbire+xAublWses8xUZFs2LbEbYFWfddUc7vUfXXr4QY5sQf4NEWVVxt7OEn6 sEV1oMdCpchoPbbwDLduJiaOpdTl+PtVcZhMdEcu30viobomchyprgfU+dMTsQjc2pQL sFJjHaKxUv9V0QDrRMukM4s+PsaocyA4bg2Ozcv1FOsEInd85YZVToEwyc/laimOglAv 0pm2ha/uqU1ttbdniKZBjpw1rP+YsPJKKjCUXzVvhpAac8Vg4+LxEk8CZhzKVMuJzAhX hGSQ== X-Gm-Message-State: AOJu0YwJ6gknzFBpc9YV8wyOp0GLsTpJI3g378RiWXqo4+s7EuGJUDjs KCJB5zX2LWrTNlcjnWugjxng9AOl0Bil7BahBkXAw5wq0cgNlUsBhMC7KAXH X-Received: by 2002:a9d:6c86:0:b0:6e5:1e4b:c3f1 with SMTP id c6-20020a9d6c86000000b006e51e4bc3f1mr1965698otr.34.1711595559293; Wed, 27 Mar 2024 20:12:39 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id q20-20020a635054000000b005dc120fa3b2sm249964pgl.18.2024.03.27.20.12.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 20:12:38 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Mar 2024 00:12:06 -0300 Message-ID: <20240328031210.21407-3-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240328031210.21407-1-jamrial@gmail.com> References: <20240328031210.21407-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/7 v4] avutil/frame: use the same data pointer as the source entry when cloning side data 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: 5YeNvrxUjj/m src->data does not need to match src->buf->data Signed-off-by: James Almer --- libavutil/frame.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/libavutil/frame.c b/libavutil/frame.c index a165e56a64..d27998d1f4 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -744,13 +744,11 @@ AVBufferRef *av_frame_get_plane_buffer(const AVFrame *frame, int plane) static AVFrameSideData *add_side_data_from_buf(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, - AVBufferRef *buf) + AVBufferRef *buf, uint8_t *data, + size_t size) { AVFrameSideData *ret, **tmp; - if (!buf) - return NULL; - // *nb_sd + 1 needs to fit into an int and a size_t. if ((unsigned)*nb_sd >= FFMIN(INT_MAX, SIZE_MAX)) return NULL; @@ -765,8 +763,8 @@ static AVFrameSideData *add_side_data_from_buf(AVFrameSideData ***sd, return NULL; ret->buf = buf; - ret->data = ret->buf->data; - ret->size = buf->size; + ret->data = data; + ret->size = size; ret->type = type; (*sd)[(*nb_sd)++] = ret; @@ -778,9 +776,13 @@ AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef *buf) { + if (!buf) + return NULL; + return add_side_data_from_buf( - &frame->side_data, &frame->nb_side_data, type, buf); + &frame->side_data, &frame->nb_side_data, type, buf, + buf->data, buf->size); } AVFrameSideData *av_frame_new_side_data(AVFrame *frame, @@ -827,7 +829,9 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, } buf = av_buffer_alloc(size); - ret = add_side_data_from_buf(sd, nb_sd, type, buf); + if (!buf) + return NULL; + ret = add_side_data_from_buf(sd, nb_sd, type, buf, buf->data, size); if (!ret) av_buffer_unref(&buf); @@ -873,8 +877,10 @@ AVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd, buf = (flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF) ? av_buffer_ref(*pbuf) : *pbuf; + if (!buf) + return NULL; - sd_dst = add_side_data_from_buf(sd, nb_sd, type, buf); + sd_dst = add_side_data_from_buf(sd, nb_sd, type, buf, buf->data, buf->size); if (!sd_dst) { if (flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF) av_buffer_unref(&buf); @@ -933,7 +939,7 @@ int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, if (!buf) return AVERROR(ENOMEM); - sd_dst = add_side_data_from_buf(sd, nb_sd, src->type, buf); + sd_dst = add_side_data_from_buf(sd, nb_sd, src->type, buf, src->data, src->size); if (!sd_dst) { av_buffer_unref(&buf); return AVERROR(ENOMEM); From patchwork Thu Mar 28 03:12:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 47571 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1049142pzb; Wed, 27 Mar 2024 20:13:18 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCV4grCsaVYT0Ki/FTEJrJ5tJseCbhIoLbxDQSNogYdUT7FUBOaD152+OBMznjYu8XcnFH/jTrShXQ2H2r/h1WSB0n3AZhyy9eCGnw== X-Google-Smtp-Source: AGHT+IGId08eZaFUU8xNIplPCkFq2p3guCBN1S3I/nGQWo3jKHD2cpMOOIPLukI8Cx112e6uK6bH X-Received: by 2002:a50:8ace:0:b0:568:64a7:cd6e with SMTP id k14-20020a508ace000000b0056864a7cd6emr950894edk.1.1711595598655; Wed, 27 Mar 2024 20:13:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711595598; cv=none; d=google.com; s=arc-20160816; b=gVK5wsxAZpOfcNLaabAWdLrktacp37gpaxMSNS2Xi5/p/5HF4HNkpDwXBf7gX3x/p3 53eAaTNYIwSvv83GtA3WcXneetBYo/e4/HaNzvWX6H3p5TvOhzJaYRNH0CHVOXcLSm2Y 9aYENKwH/4sKxgj7B76Dw5t4vm109oWud6t0ftQTdD3uL67eUln/g9JRJ4svvZ8QeVNl Sba3GbSNpLKOo2G88u+IvB8lUNtTz164RnDHAgFjx3ZpG/Bv6QMcrvyAVnZF0yxJaWWW gC5ZvRYah+YzovDsx8cZMEyO44BqwukORsSOaUSgJzpPHh+TFVS4QTV+3unBPJH8E0rE WG1w== 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=M5OJNSupNaBcvad2z4MpjQPb3ZDKg9cgW3oRzBebZ9k=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=ly1aEVgBjh/54ZvDig0VPPtbYU1stZsvp/S67PG9IGYl+o3LWfVvFNqvFoMx/qOc5M hQhK1LSuJB9EgHUIYaKyXAJLVr3slwEXkSaud2F78+KcTnrtTtMEFVlrc97l0RuxOaww bgTxzk01vrjkxuV+FTTEkfIBbA1mZfJaPFyMJBhovgE/tqf2KridjkmRuzuXHALqNPce pi3aCbi1FgSOAjfqNyLOlRhipggWWzZlkAZkscwWKn2yIwjzNrrFy+kIUhGNyWq2s7Od yA70/Z3x5ADVvFJ1COpzcwdGzP89A5Bl4Xay2RBokpo/YrfNzRyWxN+ky+SfnaysNtLH CUJg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=SEo4psK2; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 27-20020a50875b000000b0056ba7363b3dsi280193edv.28.2024.03.27.20.13.18; Wed, 27 Mar 2024 20:13:18 -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=@gmail.com header.s=20230601 header.b=SEo4psK2; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 877A968D706; Thu, 28 Mar 2024 05:12:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yw1-f177.google.com (mail-yw1-f177.google.com [209.85.128.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A15F268D6EC for ; Thu, 28 Mar 2024 05:12:43 +0200 (EET) Received: by mail-yw1-f177.google.com with SMTP id 00721157ae682-60a0579a968so5706327b3.3 for ; Wed, 27 Mar 2024 20:12:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711595561; x=1712200361; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=9dPWoA+GcJGFC8wal8ajeYcxIht0aZugqkwY6xMJPsE=; b=SEo4psK2evoiv40q8yJ+HeB7YLC0DcI70sFHzZHi5ATEheFclKAK+TdRxitSXvi/eu MNPEXSbD1WLC2sw4ycgOwemZ8Ujr3Od+Qkst4futE0indZFxaGn/2CovboUc9V+42Mb1 9ybhn8dj2px0WSJO9izlvuXk6lXd6V3vwJy5kJ7F+jEsI+D0VCmyPsnd7lXWvvVLBMSK ByTD3NbiSP9OzVmALz+WJYw76v1eZY7mi4IhkRPGPgtqlXLG20uV+rhlEAboium7+Gal iReua/1vCOxjd0dNL6wOr5cp21l9QRDrFUDIPNraaAD/FYKp9T6jD/ZeXcgM0uWwSuAm on+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711595561; x=1712200361; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9dPWoA+GcJGFC8wal8ajeYcxIht0aZugqkwY6xMJPsE=; b=J5YfnAJcUkfJW3L0r/j8rIGfLpZqSiDMkrARX5yitnHtgLVB4JLWnAhT1DRXCTczfG j+fwLH2MTp5sH5S56DdMF3KA662DF+jZ5mE0l//+eQdVpNL/ybDVXPAcR1Vvk6H42wFR ZGOEteKwoUS5vSzZm7x8vECOMG/CqYyVr5/Z94LSJZqvgUu+lUY180I5PUyXD9KNjK+o MYMp5lzL10VHVyBCavnZJe5/eK2Z3NWspsBzwEpIsBReUzjxiqlRPAeXPPxEx8X0fQHa R2nS8vfUyv5TZpA38xc7xgSC2tztd6GFMUBNYQwFi1kOB/De6RUTbLFH9SOKKThIo6Pa sOnw== X-Gm-Message-State: AOJu0YwE3ZRTkN38lS/FPDKYQb6exwGoA5u6F0N89I8v8y4R/0W9afoI C1A3CX1Rfl6DJCjPrLxVVhxtHUv+Ly6WDb7YXOO/FeG8Fvxsrg1P3BXa4jPo X-Received: by 2002:a5b:747:0:b0:dcb:d653:8ad9 with SMTP id s7-20020a5b0747000000b00dcbd6538ad9mr1687799ybq.12.1711595560858; Wed, 27 Mar 2024 20:12:40 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id q20-20020a635054000000b005dc120fa3b2sm249964pgl.18.2024.03.27.20.12.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 20:12:40 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Mar 2024 00:12:07 -0300 Message-ID: <20240328031210.21407-4-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240328031210.21407-1-jamrial@gmail.com> References: <20240328031210.21407-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/7 v4] avutil/frame: add helper to remove side data of a given type from an array 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: neCtItl9qvn+ Signed-off-by: James Almer --- libavutil/frame.c | 6 ++++++ libavutil/frame.h | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/libavutil/frame.c b/libavutil/frame.c index d27998d1f4..f54c1fa472 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -965,6 +965,12 @@ const AVFrameSideData *av_frame_side_data_get_c(const AVFrameSideData * const *s return NULL; } +void av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd, + enum AVFrameSideDataType type) +{ + remove_side_data(sd, nb_sd, type); +} + AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type) { diff --git a/libavutil/frame.h b/libavutil/frame.h index 3e5d170a5b..da78aeea7f 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -1156,6 +1156,11 @@ const AVFrameSideData *av_frame_side_data_get(AVFrameSideData * const *sd, nb_sd, type); } +/** + * Remove and free all side data instances of the given type from an array. + */ +void av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd, + enum AVFrameSideDataType type); /** * @} */ From patchwork Thu Mar 28 03:12:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 47572 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1049199pzb; Wed, 27 Mar 2024 20:13:29 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWCsCxcE+8W5SFm4fhZM5Tnps1iT+7D/zn9DdoLVaIliAfZydS9qwrqubu5nNwnv/12HIAXlmrMrCex/GDwI2lP2ZBCh9Fj76KIDw== X-Google-Smtp-Source: AGHT+IEvUpHnGNSqkTrEPItwB0WgROpGz11ct8Z+G9G4KBzBrVlKjj/gq1i1wWDL9Cq1bqCPCSSP X-Received: by 2002:a17:907:86a3:b0:a4d:f927:f747 with SMTP id qa35-20020a17090786a300b00a4df927f747mr943927ejc.4.1711595609062; Wed, 27 Mar 2024 20:13:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711595609; cv=none; d=google.com; s=arc-20160816; b=Ja0rwqYRwAKivocRbsKLSkmHBh/6lpQ+AKhLwPM0BjuTKV86xbmzeVazLzlNOnWaZ5 D9hbPnu/QQCAsz2H0COtvP272blk5F9Egd/TF8tE/QSNiqn4aezPbhACGsAJ2a2PWzSU oSt+4Dv2YEFikB6zQf+DvN0JYywVrYMve/RB1g/j4/1dkktYK+ZfQEBrWKlK1RGuwQCG bM65H3ULfrADS75a3Wm+fRMjpqCz8a+Ig5G8LW7dCGijPnaIu6cCpUZVI6uQ39x1X9i6 dUqinDDmtLDGWPIfNVIb9tTFHlyJtI1K5oLV/Kob5+kyWWb1TJ5LPiqyi8lFnvtpuA2E kXQw== 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=YgUKp8LFxZ+0EaUu5fH2E29oNpSihlb4qCOADwHyR9Q=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=BO/deLsAygMQRrT5mwp1lcDgqgECQz9c6gLn346pvYGaSbeIDguPPlLrKQ1yVsAfB9 xsxj2cbV5BkORxe5QBPHY5TbX/rv8QrdZ4LAPlqTuwLpKjiJ49YyodyCsb1aOETkgeAu mWSVBreqZXdDd85VHTM3u3A/j6V34ETeShU/UNaigvFhLm20eO3BGf+GkhBnkeHF04LJ Izy5mn/ODt0/TCo5tGfMnsqir7TYIe5KPs+6VcbOsg9O5kgUGdOk2FKev/BlvDb/GHrR 1uxYuINNUQ2cArOPNNl9YrUtLoIfVwVdphaG6od9Ig7svi7ohEBBVAOwx/DNsiZFdOFX YQYw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=iZuMVQKM; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d19-20020a170906641300b00a4e234aa251si74179ejm.61.2024.03.27.20.13.27; Wed, 27 Mar 2024 20:13:29 -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=@gmail.com header.s=20230601 header.b=iZuMVQKM; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C1A4368D70F; Thu, 28 Mar 2024 05:12:52 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oo1-f52.google.com (mail-oo1-f52.google.com [209.85.161.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0FCFF68D5F2 for ; Thu, 28 Mar 2024 05:12:45 +0200 (EET) Received: by mail-oo1-f52.google.com with SMTP id 006d021491bc7-5a47cecb98bso298766eaf.0 for ; Wed, 27 Mar 2024 20:12:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711595562; x=1712200362; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=cdmDbmhRfwrLuF1ItnfBTleLfF1gxKeLPb/7OhrUx1c=; b=iZuMVQKMkE6H5M0cSYbfbi41HveyAw+7RQVatQgIttg3cyWUmJwIw9evWk+mPrl47f yKL4H7OjrwD/34W6faT5Ym0fJAWrjiusnsScTEueSTQl43Hrpcr/75QlbhbWFj4qYZ1t 1LmOKKp4qKxQyCpRu03JM86DASXeCXmjS+QiPckSdzQM9AMjX5leVhZitt0Y0mRgRU01 bOgrbxwVJE0407o6sSgw4YIGe/LJpYH5nvGnxGjkYrzI0IWizI/Rnd3/ukvHKcaCgbta //Pia/G+LGX3q6EZL3Ns6IOOT+NF4IGsOiJvFXk4jjFvlAB5Jc71eW2gG0NglRGtSftS 8Yrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711595562; x=1712200362; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cdmDbmhRfwrLuF1ItnfBTleLfF1gxKeLPb/7OhrUx1c=; b=lHTcINaiboFXpOmjFIJRYSDoafTpNuKIc13n+cH0QSKifkDAg2FgdMGAM99kXczHw8 D9c+r93enkwPGo9NOx61JdcUHmz7fMEoi2LZ8R9zaKHq2msrsDSAXiZoWVroKDMYNfus 8D6a3Qnia55ZMOIrZuUBBk1Vi4mQkvx3RKqjmDtG810zTMEC07LfcIqGppGJaC63DdNA 3fzAuiGSub3sOoH2oq0VRT5XILXZ/MgjTJIfrvv/IuMKBJ/mIaYHiUuc04EVaECqZUWI Igb1fzisB6x2eibYgDLAlorvGFXRSYJVeyn4JxJCpSC5NP1fbG9ON+BKd1GwgFZN2fma mlZw== X-Gm-Message-State: AOJu0YwVyZ8vuYlzaKjy+HX/aNd0tcYD8AVO5saFtzWQr2tlD7LDjqfn KYwc+/wsc2lHPhk2XYKBWlc9d2eThcxdXfL4FKkgUFZ4v6966FDV9vh0vFFd X-Received: by 2002:a05:6358:71d:b0:17e:7c4b:bb56 with SMTP id e29-20020a056358071d00b0017e7c4bbb56mr1427564rwj.15.1711595562619; Wed, 27 Mar 2024 20:12:42 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id q20-20020a635054000000b005dc120fa3b2sm249964pgl.18.2024.03.27.20.12.41 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 20:12:41 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Mar 2024 00:12:08 -0300 Message-ID: <20240328031210.21407-5-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240328031210.21407-1-jamrial@gmail.com> References: <20240328031210.21407-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/7 v4] avutil/mastering_display_metadata: add a new allocator function that returns a size 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: it+GT0ANp4Pu av_mastering_display_metadata_alloc() is not useful in scenarios where you need to know the runtime size of AVMasteringDisplayMetadata. Signed-off-by: James Almer --- libavutil/mastering_display_metadata.c | 13 +++++++++++++ libavutil/mastering_display_metadata.h | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c index 6069347617..ea41f13f9d 100644 --- a/libavutil/mastering_display_metadata.c +++ b/libavutil/mastering_display_metadata.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include @@ -29,6 +30,18 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void) return av_mallocz(sizeof(AVMasteringDisplayMetadata)); } +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc_size(size_t *size) +{ + AVMasteringDisplayMetadata *mastering = av_mallocz(sizeof(AVMasteringDisplayMetadata)); + if (!mastering) + return NULL; + + if (size) + *size = sizeof(*mastering); + + return mastering; +} + AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame) { AVFrameSideData *side_data = av_frame_new_side_data(frame, diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h index c23b07c3cd..52fcef9e37 100644 --- a/libavutil/mastering_display_metadata.h +++ b/libavutil/mastering_display_metadata.h @@ -77,6 +77,15 @@ typedef struct AVMasteringDisplayMetadata { */ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); +/** + * Allocate an AVMasteringDisplayMetadata structure and set its fields to + * default values. The resulting struct can be freed using av_freep(). + * + * @return An AVMasteringDisplayMetadata filled with default values or NULL + * on failure. + */ +AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc_size(size_t *size); + /** * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. * From patchwork Thu Mar 28 03:12:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 47573 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1049252pzb; Wed, 27 Mar 2024 20:13:38 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVTM2/yxUDv0q4ipfDgVCqgnXoi3GCMISOL+K5gjanGvB3iGRH5zFsC5DOLGR9O+If59J3VwNgCtaDJSVgjZcvVcKqT+o08jEU47w== X-Google-Smtp-Source: AGHT+IFNs5ccKVrnY/2Op+a0SEAt4AUuGn58WsNKf7T+Q76fUf32Dp3BElB8huSZ8Duzwj3kRo5K X-Received: by 2002:a17:906:fb07:b0:a4d:fb81:977f with SMTP id lz7-20020a170906fb0700b00a4dfb81977fmr776600ejb.62.1711595618414; Wed, 27 Mar 2024 20:13:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711595618; cv=none; d=google.com; s=arc-20160816; b=JzPqvOpsdRSU4u0iFeLv5sCtI30+dT/pmQ3zYzmpJ0yvIoTLXEnJMAh/66scp4cf5/ K/9Q9T0/FI4Uim7yr+Vl6LcArrBOBuGL3xieO+BEbqhwLvUBPJx6O78GNLDy8vvbRHAZ 6k9m3C4+rtztOnLcDXMz+H4xucHd+BxKh+dzG+d7zlF3kk7g65o+9bdWn4GYBU5Ui+Us gLVsASX+TwYFmniJc+CBcP1z5XUOJGlpIhjNf5JDn302afYzyZxzNUMqci/5SDgHM8XS TLj+SflpXwH804kXkEElSWcEJ3IEUNK3nSHK6wROkZU1X0JrT1owpi0B+S1GDaYvcRYu OsZw== 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=WmZyJ7UYs1wIud/8yEYSj/qNNSHjfSvZ/tfeINiEmFA=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=sBc7C9eYXm1K+4tDTPvwYXnMl6/sqcvmlBrn1Pwp9SoR2GlVVKZPsmp4HzMwv8+KPR XUyuB56uZewTG2WfwtXiUFdR1eI6NpLnwsfVZZKhhnoLeDUzAgB9NAz8QPjjvWM6Kje9 8KydkRN9pdf1e3KvuZ4w3dg62piZpsm9HRUFB+s2JJw2vaynO3CVEOz87k0p+v72mVXY Hz6rh/sXwTyZnn7tjasjbnZQur6xeNHpeK9Eyt/ZyxBYlnIzWXcic+s3kcqCfIUvXVWU ELVQotRCCGW3w2CvR5UNYwetNTiLaCD9GbPGrokVPAyLGuJ3ItDKb7Bxz/bvLdHkpfva 9pig==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=M8x6lcGr; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ka4-20020a170907990400b00a473d8ebf99si221302ejc.277.2024.03.27.20.13.38; Wed, 27 Mar 2024 20:13:38 -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=@gmail.com header.s=20230601 header.b=M8x6lcGr; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D295468D716; Thu, 28 Mar 2024 05:12:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 206AF68D6FE for ; Thu, 28 Mar 2024 05:12:47 +0200 (EET) Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-6e6b22af648so1202032b3a.0 for ; Wed, 27 Mar 2024 20:12:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711595564; x=1712200364; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=qzlkIRHJeUgOck//kbcnR2JovfX/5JSAhjWyNAAq9y0=; b=M8x6lcGrmWS2m3DRWZ1SBT2Fv0s6+ZXvHqjqn84mRQy8zenu9viNZo/g0BlZ9wwbw6 mP3T0LzBjMLKwwQrhttwS5SbaZ3yTYOIWrL+vsuaUCrLkEgL+8/CMhRjPAhElxRexg3g 224fWcWjT9p8LDXT3iqQXCoz4Fpf8vI+1yLT/katYM7cQlLreTzTtf+9UmN3/3r2MLjN LBOgSzTQTHiJDAhHpVwZzOzvE6wM9H+aYcdLN0mDOoCVzkvCIwPFHWUszrSKJDJ37n8O Lo1nq++D/PWecJFhg19V3hW5s4T3yLLq1KvGRzx2xK4snhTg18u6HL6p6FJt0q2Nb56t Nhyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711595564; x=1712200364; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qzlkIRHJeUgOck//kbcnR2JovfX/5JSAhjWyNAAq9y0=; b=g6tRpscLDp8ZZZ+38v2cCn4dTnQ560toL8SlILU3k34KXJw4gXOciWAHcbJyzAo8DC 8HDJuAl1EzDr0ib6ZvOuFjqKpYAMd+GDf4H+y7V4y7t6+fwaPGG2MQVtn4qFuN/ECLX1 VlPVCzqQYAY70lAT+Js0+qo+B+z6p/KpCSLuGiE9MOK9pFateILitXue8ts6rqiaClxZ W4kDuNI8cPbFZLcAk8x3FvxnQgwKKovjOueA1QRSr00DgrJoKXOXZYUoc6zqGDaMPINU HkId6KNSvQlvX+LmCCRtfwxuKXGTwsDw4mr49vTcXzSvPNNwnqthBnWTWg3TcGVB7d67 HLhQ== X-Gm-Message-State: AOJu0Yyt/JUDfUSt/fwu2GYeHpXr61ouuzyN0uQaGoPBBr0UvQ1EfsWi hEYxrieYfT+yP9Q6qZVBfcEHrlN44atTdbdJlAfBvkcjXEZVJRcQKS3QF1C6 X-Received: by 2002:a05:6a20:4386:b0:1a3:8d32:c182 with SMTP id i6-20020a056a20438600b001a38d32c182mr1834329pzl.11.1711595564173; Wed, 27 Mar 2024 20:12:44 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id q20-20020a635054000000b005dc120fa3b2sm249964pgl.18.2024.03.27.20.12.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 20:12:43 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Mar 2024 00:12:09 -0300 Message-ID: <20240328031210.21407-6-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240328031210.21407-1-jamrial@gmail.com> References: <20240328031210.21407-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/7 v4] avcodec/decode: make the AVFrameSideData helper wrappers not depend on 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: D7W1+Cy3iOlE They will be useful to fill arrays stored in other structs. Signed-off-by: James Almer --- libavcodec/av1dec.c | 7 +-- libavcodec/cri.c | 3 +- libavcodec/decode.c | 99 +++++++++++++++++++++++++++-------------- libavcodec/decode.h | 28 ++++++------ libavcodec/dpx.c | 3 +- libavcodec/h2645_sei.c | 4 +- libavcodec/h264_slice.c | 3 +- libavcodec/hevcdec.c | 6 ++- libavcodec/libdav1d.c | 7 +-- libavcodec/libjxldec.c | 3 +- libavcodec/mjpegdec.c | 3 +- libavcodec/mpeg12dec.c | 11 +++-- libavcodec/pngdec.c | 8 ++-- libavcodec/qsvdec.c | 4 +- libavcodec/tiff.c | 3 +- libavcodec/webp.c | 3 +- 16 files changed, 120 insertions(+), 75 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 32a795e758..54bedc27e1 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -964,7 +964,8 @@ static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame, if (!ret) break; - ret = ff_frame_new_side_data_from_buf(avctx, frame, AV_FRAME_DATA_A53_CC, &buf, NULL); + ret = ff_frame_new_side_data_from_buf(avctx, &frame->side_data, &frame->nb_side_data, + AV_FRAME_DATA_A53_CC, &buf); if (ret < 0) return ret; @@ -1028,7 +1029,7 @@ static int export_metadata(AVCodecContext *avctx, AVFrame *frame) if (s->mdcv) { AVMasteringDisplayMetadata *mastering; - ret = ff_decode_mastering_display_new(avctx, frame, &mastering); + ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &mastering); if (ret < 0) return ret; @@ -1051,7 +1052,7 @@ static int export_metadata(AVCodecContext *avctx, AVFrame *frame) if (s->cll) { AVContentLightMetadata *light; - ret = ff_decode_content_light_new(avctx, frame, &light); + ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &light); if (ret < 0) return ret; diff --git a/libavcodec/cri.c b/libavcodec/cri.c index 990e52ac99..94468e7515 100644 --- a/libavcodec/cri.c +++ b/libavcodec/cri.c @@ -398,7 +398,8 @@ skip: } if (hflip || vflip) { - ff_frame_new_side_data(avctx, p, AV_FRAME_DATA_DISPLAYMATRIX, + ff_frame_new_side_data(avctx, &p->side_data, &p->nb_side_data, + AV_FRAME_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9, &rotation); if (rotation) { av_display_rotation_set((int32_t *)rotation->data, 0.f); diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 34bcb7cc64..48048cd599 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -1793,93 +1793,124 @@ int ff_decode_preinit(AVCodecContext *avctx) } /** - * Check side data preference and clear existing side data from frame + * Check side data preference and clear existing side data from sd/nb_sd * if needed. * * @retval 0 side data of this type can be added to frame * @retval 1 side data of this type should not be added to frame */ -static int side_data_pref(const AVCodecContext *avctx, AVFrame *frame, - enum AVFrameSideDataType type) +static int side_data_pref(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, enum AVFrameSideDataType type) { DecodeContext *dc = decode_ctx(avctx->internal); // Note: could be skipped for `type` without corresponding packet sd - if (av_frame_get_side_data(frame, type)) { + if (av_frame_side_data_get(*sd, *nb_sd, type)) { if (dc->side_data_pref_mask & (1ULL << type)) return 1; - av_frame_remove_side_data(frame, type); + av_frame_side_data_remove(sd, nb_sd, type); } return 0; } - -int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, - enum AVFrameSideDataType type, size_t size, +int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, enum AVFrameSideDataType type, size_t size, AVFrameSideData **psd) { - AVFrameSideData *sd; + AVFrameSideData *entry; - if (side_data_pref(avctx, frame, type)) { + if (side_data_pref(avctx, sd, nb_sd, type)) { if (psd) *psd = NULL; return 0; } - sd = av_frame_new_side_data(frame, type, size); + entry = av_frame_side_data_new(sd, nb_sd, type, size, 0); if (psd) - *psd = sd; + *psd = entry; - return sd ? 0 : AVERROR(ENOMEM); + return entry ? 0 : AVERROR(ENOMEM); } -int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, - AVFrame *frame, enum AVFrameSideDataType type, - AVBufferRef **buf, AVFrameSideData **psd) +int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, enum AVFrameSideDataType type, + AVBufferRef **buf) { - AVFrameSideData *sd = NULL; int ret = 0; - if (side_data_pref(avctx, frame, type)) + if (side_data_pref(avctx, sd, nb_sd, type)) goto finish; - sd = av_frame_new_side_data_from_buf(frame, type, *buf); - if (sd) - *buf = NULL; - else + if (!av_frame_side_data_add(sd, nb_sd, type, buf, 0)) ret = AVERROR(ENOMEM); finish: av_buffer_unref(buf); - if (psd) - *psd = sd; return ret; } -int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame, - AVMasteringDisplayMetadata **mdm) +int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, AVMasteringDisplayMetadata **mdm) { - if (side_data_pref(avctx, frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA)) { + AVBufferRef *buf; + size_t size; + + if (side_data_pref(avctx, sd, nb_sd, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA)) { *mdm = NULL; return 0; } - *mdm = av_mastering_display_metadata_create_side_data(frame); - return *mdm ? 0 : AVERROR(ENOMEM); + *mdm = av_mastering_display_metadata_alloc_size(&size); + if (!*mdm) + return AVERROR(ENOMEM); + + buf = av_buffer_create((uint8_t *)*mdm, size, NULL, NULL, 0); + if (!buf) { + av_freep(mdm); + return AVERROR(ENOMEM); + } + + if (!av_frame_side_data_add(sd, nb_sd, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, + &buf, 0)) { + *mdm = NULL; + av_buffer_unref(&buf); + return AVERROR(ENOMEM); + } + + return 0; } -int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame, - AVContentLightMetadata **clm) +int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, AVContentLightMetadata **clm) { - if (side_data_pref(avctx, frame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) { + AVBufferRef *buf; + size_t size; + + if (side_data_pref(avctx, sd, nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) { *clm = NULL; return 0; } - *clm = av_content_light_metadata_create_side_data(frame); - return *clm ? 0 : AVERROR(ENOMEM); + *clm = av_content_light_metadata_alloc(&size); + if (!*clm) + return AVERROR(ENOMEM); + + buf = av_buffer_create((uint8_t *)*clm, size, NULL, NULL, 0); + if (!buf) { + av_freep(clm); + return AVERROR(ENOMEM); + } + + if (!av_frame_side_data_add(sd, nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, + &buf, 0)) { + *clm = NULL; + av_buffer_unref(&buf); + return AVERROR(ENOMEM); + } + + return 0; } int ff_copy_palette(void *dst, const AVPacket *src, void *logctx) diff --git a/libavcodec/decode.h b/libavcodec/decode.h index 4ffbd9db8e..1026c9dae9 100644 --- a/libavcodec/decode.h +++ b/libavcodec/decode.h @@ -156,14 +156,14 @@ const AVPacketSideData *ff_get_coded_side_data(const AVCodecContext *avctx, enum AVPacketSideDataType type); /** - * Wrapper around av_frame_new_side_data, which rejects side data overridden by + * Wrapper around av_frame_side_data_new, which rejects side data overridden by * the demuxer. Returns 0 on success, and a negative error code otherwise. - * If successful and sd is not NULL, *sd may either contain a pointer to the new + * If successful and psd is not NULL, *psd may either contain a pointer to the new * side data, or NULL in case the side data was already present. */ -int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, - enum AVFrameSideDataType type, size_t size, - AVFrameSideData **sd); +int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, enum AVFrameSideDataType type, size_t size, + AVFrameSideData **psd); /** * Similar to `ff_frame_new_side_data`, but using an existing buffer ref. @@ -171,29 +171,29 @@ int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, * *buf is ALWAYS consumed by this function and NULL written in its place, even * on failure. */ -int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, - AVFrame *frame, enum AVFrameSideDataType type, - AVBufferRef **buf, AVFrameSideData **sd); +int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, enum AVFrameSideDataType type, + AVBufferRef **buf); struct AVMasteringDisplayMetadata; struct AVContentLightMetadata; /** - * Wrapper around av_mastering_display_metadata_create_side_data(), which + * Similar to av_mastering_display_metadata_create_side_data(), but * rejects side data overridden by the demuxer. Returns 0 on success, and a * negative error code otherwise. If successful, *mdm may either be a pointer to * the new side data, or NULL in case the side data was already present. */ -int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame, - struct AVMasteringDisplayMetadata **mdm); +int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, struct AVMasteringDisplayMetadata **mdm); /** - * Wrapper around av_content_light_metadata_create_side_data(), which + * Similar to av_content_light_metadata_create_side_data(), but * rejects side data overridden by the demuxer. Returns 0 on success, and a * negative error code otherwise. If successful, *clm may either be a pointer to * the new side data, or NULL in case the side data was already present. */ -int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame, - struct AVContentLightMetadata **clm); +int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrameSideData ***sd, + int *nb_sd, struct AVContentLightMetadata **clm); #endif /* AVCODEC_DECODE_H */ diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c index 80616d98a2..ff9115bf86 100644 --- a/libavcodec/dpx.c +++ b/libavcodec/dpx.c @@ -288,7 +288,8 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *p, if (i != 0xFFFFFFFF) { AVFrameSideData *tcside; - ret = ff_frame_new_side_data(avctx, p, AV_FRAME_DATA_S12M_TIMECODE, + ret = ff_frame_new_side_data(avctx, &p->side_data, &p->nb_side_data, + AV_FRAME_DATA_S12M_TIMECODE, sizeof(uint32_t) * 4, &tcside); if (ret < 0) return ret; diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c index afc103b69c..a9f4e01de8 100644 --- a/libavcodec/h2645_sei.c +++ b/libavcodec/h2645_sei.c @@ -750,7 +750,7 @@ FF_ENABLE_DEPRECATION_WARNINGS int i; AVMasteringDisplayMetadata *metadata; - ret = ff_decode_mastering_display_new(avctx, frame, &metadata); + ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata); if (ret < 0) return ret; @@ -793,7 +793,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if (sei->content_light.present) { AVContentLightMetadata *metadata; - ret = ff_decode_content_light_new(avctx, frame, &metadata); + ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata); if (ret < 0) return ret; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index e9a404e41b..6d9d2ddc14 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1253,7 +1253,8 @@ static int h264_export_frame_props(H264Context *h) uint32_t *tc_sd; char tcbuf[AV_TIMECODE_STR_SIZE]; AVFrameSideData *tcside; - ret = ff_frame_new_side_data(h->avctx, out, AV_FRAME_DATA_S12M_TIMECODE, + ret = ff_frame_new_side_data(h->avctx, &out->side_data, &out->nb_side_data, + AV_FRAME_DATA_S12M_TIMECODE, sizeof(uint32_t)*4, &tcside); if (ret < 0) return ret; diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 575836e340..d744e6f598 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -2791,7 +2791,8 @@ static int set_side_data(HEVCContext *s) uint32_t *tc_sd; char tcbuf[AV_TIMECODE_STR_SIZE]; AVFrameSideData *tcside; - ret = ff_frame_new_side_data(s->avctx, out, AV_FRAME_DATA_S12M_TIMECODE, + ret = ff_frame_new_side_data(s->avctx, &out->side_data, &out->nb_side_data, + AV_FRAME_DATA_S12M_TIMECODE, sizeof(uint32_t) * 4, &tcside); if (ret < 0) return ret; @@ -2821,7 +2822,8 @@ static int set_side_data(HEVCContext *s) if (!info_ref) return AVERROR(ENOMEM); - ret = ff_frame_new_side_data_from_buf(s->avctx, out, AV_FRAME_DATA_DYNAMIC_HDR_PLUS, &info_ref, NULL); + ret = ff_frame_new_side_data_from_buf(s->avctx, &out->side_data, &out->nb_side_data, + AV_FRAME_DATA_DYNAMIC_HDR_PLUS, &info_ref); if (ret < 0) return ret; } diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index ddcd0708b4..465c56e757 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -471,7 +471,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) if (p->mastering_display) { AVMasteringDisplayMetadata *mastering; - res = ff_decode_mastering_display_new(c, frame, &mastering); + res = ff_decode_mastering_display_new(c, &frame->side_data, &frame->nb_side_data, &mastering); if (res < 0) goto fail; @@ -493,7 +493,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) if (p->content_light) { AVContentLightMetadata *light; - res = ff_decode_content_light_new(c, frame, &light); + res = ff_decode_content_light_new(c, &frame->side_data, &frame->nb_side_data, &light); if (res < 0) goto fail; @@ -528,7 +528,8 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) if (!res) break; - res = ff_frame_new_side_data_from_buf(c, frame, AV_FRAME_DATA_A53_CC, &buf, NULL); + res = ff_frame_new_side_data_from_buf(c, &frame->side_data, &frame->nb_side_data, + AV_FRAME_DATA_A53_CC, &buf); if (res < 0) goto fail; diff --git a/libavcodec/libjxldec.c b/libavcodec/libjxldec.c index d57a27418f..6e95c79177 100644 --- a/libavcodec/libjxldec.c +++ b/libavcodec/libjxldec.c @@ -483,7 +483,8 @@ static int libjxl_receive_frame(AVCodecContext *avctx, AVFrame *frame) /* full image is one frame, even if animated */ av_log(avctx, AV_LOG_DEBUG, "FULL_IMAGE event emitted\n"); if (ctx->iccp) { - ret = ff_frame_new_side_data_from_buf(avctx, ctx->frame, AV_FRAME_DATA_ICC_PROFILE, &ctx->iccp, NULL); + ret = ff_frame_new_side_data_from_buf(avctx, &ctx->frame->side_data, &ctx->frame->nb_side_data, + AV_FRAME_DATA_ICC_PROFILE, &ctx->iccp); if (ret < 0) return ret; } diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index c9409eac6c..89443dc4cd 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -2839,7 +2839,8 @@ the_end: for (i = 0; i < s->iccnum; i++) total_size += s->iccentries[i].length; - ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_ICC_PROFILE, total_size, &sd); + ret = ff_frame_new_side_data(avctx, &frame->side_data, &frame->nb_side_data, + AV_FRAME_DATA_ICC_PROFILE, total_size, &sd); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data\n"); return ret; diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 4ad1eb6572..2665ee2f95 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1314,7 +1314,8 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size) } } - ret = ff_frame_new_side_data(s->avctx, s->current_picture_ptr->f, + ret = ff_frame_new_side_data(s->avctx, &s->current_picture_ptr->f->side_data, + &s->current_picture_ptr->f->nb_side_data, AV_FRAME_DATA_PANSCAN, sizeof(s1->pan_scan), &pan_scan); if (ret < 0) @@ -1324,8 +1325,9 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size) if (s1->a53_buf_ref) { ret = ff_frame_new_side_data_from_buf( - s->avctx, s->current_picture_ptr->f, AV_FRAME_DATA_A53_CC, - &s1->a53_buf_ref, NULL); + s->avctx, &s->current_picture_ptr->f->side_data, + &s->current_picture_ptr->f->nb_side_data, + AV_FRAME_DATA_A53_CC, &s1->a53_buf_ref); if (ret < 0) return ret; } @@ -1341,7 +1343,8 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size) if (s1->has_afd) { AVFrameSideData *sd; - ret = ff_frame_new_side_data(s->avctx, s->current_picture_ptr->f, + ret = ff_frame_new_side_data(s->avctx, &s->current_picture_ptr->f->side_data, + &s->current_picture_ptr->f->nb_side_data, AV_FRAME_DATA_AFD, 1, &sd); if (ret < 0) return ret; diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c index de50e6a5b6..68c25cb5bd 100644 --- a/libavcodec/pngdec.c +++ b/libavcodec/pngdec.c @@ -680,8 +680,8 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame) } } else if (s->iccp_data) { AVFrameSideData *sd; - ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_ICC_PROFILE, - s->iccp_data_len, &sd); + ret = ff_frame_new_side_data(avctx, &frame->side_data, &frame->nb_side_data, + AV_FRAME_DATA_ICC_PROFILE, s->iccp_data_len, &sd); if (ret < 0) return ret; if (sd) { @@ -748,7 +748,7 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame) if (s->have_clli) { AVContentLightMetadata *clli; - ret = ff_decode_content_light_new(avctx, frame, &clli); + ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &clli); if (ret < 0) return ret; @@ -765,7 +765,7 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame) if (s->have_mdvc) { AVMasteringDisplayMetadata *mdvc; - ret = ff_decode_mastering_display_new(avctx, frame, &mdvc); + ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &mdvc); if (ret < 0) return ret; diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index fd9267c6f4..de3ed3c357 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -661,7 +661,7 @@ static int qsv_export_hdr_side_data(AVCodecContext *avctx, mfxExtMasteringDispla const int luma_den = 10000; int i; - ret = ff_decode_mastering_display_new(avctx, frame, &mastering); + ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &mastering); if (ret < 0) return ret; @@ -687,7 +687,7 @@ static int qsv_export_hdr_side_data(AVCodecContext *avctx, mfxExtMasteringDispla if (clli->InsertPayloadToggle) { AVContentLightMetadata *light; - ret = ff_decode_content_light_new(avctx, frame, &light); + ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &light); if (ret < 0) return ret; diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index 7ce1ab32f6..9cde2e60e1 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -1706,7 +1706,8 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame) if (bytestream2_get_bytes_left(&gb_temp) < count) return AVERROR_INVALIDDATA; - ret = ff_frame_new_side_data(s->avctx, frame, AV_FRAME_DATA_ICC_PROFILE, count, &sd); + ret = ff_frame_new_side_data(s->avctx, &frame->side_data, &frame->nb_side_data, + AV_FRAME_DATA_ICC_PROFILE, count, &sd); if (ret < 0) return ret; if (sd) diff --git a/libavcodec/webp.c b/libavcodec/webp.c index 9308ea2b69..ec23533ef2 100644 --- a/libavcodec/webp.c +++ b/libavcodec/webp.c @@ -1501,7 +1501,8 @@ exif_end: s->has_iccp = 1; - ret = ff_frame_new_side_data(avctx, p, AV_FRAME_DATA_ICC_PROFILE, chunk_size, &sd); + ret = ff_frame_new_side_data(avctx, &p->side_data, &p->nb_side_data, + AV_FRAME_DATA_ICC_PROFILE, chunk_size, &sd); if (ret < 0) return ret; From patchwork Thu Mar 28 03:12:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 47574 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9f96:b0:1a3:b6bb:3029 with SMTP id mm22csp1049312pzb; Wed, 27 Mar 2024 20:13:47 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWHJPMsN76mHaA9gHUMJn7cgfwfriM69bwSrQzX2hEesQZ6nk260cB37IdlpCiJcPq5byaywSEidIQdUf0fR09JQjl3Hw/V6bXG9w== X-Google-Smtp-Source: AGHT+IHzscZCt+M1eW86NY7MexMy8yqcaxUbMkU0Xd605REwufdPiOwN82xWBUJoFFNrQvxT1HX2 X-Received: by 2002:a17:906:e41:b0:a47:2016:4c9e with SMTP id q1-20020a1709060e4100b00a4720164c9emr695846eji.5.1711595627537; Wed, 27 Mar 2024 20:13:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711595627; cv=none; d=google.com; s=arc-20160816; b=viCV12SQxrixq1FQB9VqKaBRb+YnPcJHVsPY3SDwhoo2KC3FCjPX66aL7NCsGDXXD0 pv9RWl4xnfV4VJRXW6jSQfwVxmPsgaGC4AISjBtlGAQPMXVkU3w73ox6rAKWVawLePia 2RyQ7F+BXW1OvV4k3KMNTALmDawfE4TpPvw1EAdnL0laGzaC3o43jJrHp+z/xiPAJm+i klmDsrtwEjRTdGdIY5AH4a/aKUUx93guHjmhitvpKbB7B4pqi9xC8bg3fR0zUaoCooAP jxu15uTiNLTx8prPXD2Ol2/Qd8tbtIe6Mke1GpnP7qlhNkWW+dL7Vq23mRRKQKa+IR7r t+rA== 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=ceGDqgiNICvBmEMYkhY5KN6lkHb1KIiitur07kk8KkI=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=m31IoCgyhPLboSMlJXOYZ6Ek71SGyuYC+tmvnCASlWSkRr4jFl4MY9eKX+UYJ9hnV7 icz4veU3syMnBqpyj9gc/uHPCh0U2CH/o0+es0jyPp/n5pLjfZ2hCUyoJf5ug9wMvt/H kC0n34Imuzo84Y3GBsFE5Ee367fULckDCdPrrd8YJ//FORDkI7oMwToQGcCQxy9qQHX7 nPms/fCfxC5KdT6wgch8GXk1Hvq0h60JTi9vBUCtGOBJW9CfkMlzZIZPJ27qlQ83+WLS uc/JGXzu/LhkzpzN9MBFnJOktxUYp5AC8OuQmcR2BxDbF6EW9s+HeBKkbJEVyQhGkEdm A4PQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=bcff3V8C; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 14-20020a170906310e00b00a47325ce46bsi226197ejx.200.2024.03.27.20.13.47; Wed, 27 Mar 2024 20:13: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=@gmail.com header.s=20230601 header.b=bcff3V8C; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B90F168D71B; Thu, 28 Mar 2024 05:12:56 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oo1-f54.google.com (mail-oo1-f54.google.com [209.85.161.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6C26B68D70B for ; Thu, 28 Mar 2024 05:12:48 +0200 (EET) Received: by mail-oo1-f54.google.com with SMTP id 006d021491bc7-5a56710cdccso165437eaf.3 for ; Wed, 27 Mar 2024 20:12:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711595566; x=1712200366; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=PUV0M+dxkEIsVabSwEouIm/7h/hzwqTMWCqvW4GGtdg=; b=bcff3V8CA1x8uHN/q8SrwMc0RM4/2os0vHqFEKZ+yjkmbSDQcMCH6wk/4JOI5ZaRfE cAO+W3xPx3AMTrdw2xib2hgEs983mIsi/jp7pgUSceOLGjzXzcJAll/itFwpIdEwWQMT xu5BokkF9bTbQZkXgS83W5zzsamyF1B85ImywcY4sfvcK2L86y2IdPrfsDC4LmWMHMaI knSeclWEybUcHDMebFrZ//2++HhR/QhBG9wrlrdkJGZd8QwWPZJ0U2svQME/BCkrYd4Y e7C6rbcWbyz1dy5aFLa+QjsHDCiJZBywgW4F+b641JJd8BT/B0h5WPLTk02OfkOSNtbG nj1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711595566; x=1712200366; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PUV0M+dxkEIsVabSwEouIm/7h/hzwqTMWCqvW4GGtdg=; b=jLc1SLcKVS5fKaIR53S52UwRe+ps//x8P4ntrcOuRN3cGsrRDehgLj5YLzgSeTRZrH S2Hhisc8NNCgPkuaDLypQ0W3HAYdJmQ71uvhHLpNwRPcMjZIQD3KKjY1L4tl556kGpjF j3CUOe5h3TlmRvAfG8STNgTik8RRCcYb63x5/5ZXPntZgsbnIpUUOR+cX1ma3QCXeqCI LniEUdDyJMm12fhDucuD89CzPAGNxzjbzIThvGgU4lgmRoKYgSvoK76f5GPMM9BeDeUq GmrjsKpiOEW3jsLzPtRLy8X9zATZmPuKtXd0FgaVm63FNOfpLVRyZ9+aXZE16UYpHiMz zsmw== X-Gm-Message-State: AOJu0YzqMrDQMVx3foj3awoerySDfm+7amZPPLWdeaw9rw4Ut66AprEs 2mglWENX8a1ktP+THqPl6qSV692H2wKfu6abAiCHJJHKoL6PLYZJizKCnvOX X-Received: by 2002:a05:6358:3992:b0:183:4cff:3266 with SMTP id b18-20020a056358399200b001834cff3266mr1387405rwe.6.1711595565994; Wed, 27 Mar 2024 20:12:45 -0700 (PDT) Received: from localhost.localdomain ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id q20-20020a635054000000b005dc120fa3b2sm249964pgl.18.2024.03.27.20.12.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 20:12:45 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Mar 2024 00:12:10 -0300 Message-ID: <20240328031210.21407-7-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240328031210.21407-1-jamrial@gmail.com> References: <20240328031210.21407-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/7 v4] avcodec/hevcdec: export global side data in AVCodecContext 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: h82++dwjtYMB Signed-off-by: James Almer --- libavcodec/avcodec.h | 2 +- libavcodec/h2645_sei.c | 215 +++++++++++++++++++++---------------- libavcodec/h2645_sei.h | 2 + libavcodec/hevcdec.c | 4 + libavcodec/pthread_frame.c | 11 ++ 5 files changed, 141 insertions(+), 93 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 83dc487251..968009a192 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2071,7 +2071,7 @@ typedef struct AVCodecContext { * - encoding: may be set by user before calling avcodec_open2() for * encoder configuration. Afterwards owned and freed by the * encoder. - * - decoding: unused + * - decoding: may be set by libavcodec in avcodec_open2(). */ AVFrameSideData **decoded_side_data; int nb_decoded_side_data; diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c index a9f4e01de8..4b7ce78a38 100644 --- a/libavcodec/h2645_sei.c +++ b/libavcodec/h2645_sei.c @@ -529,6 +529,120 @@ static int is_frame_packing_type_valid(SEIFpaType type, enum AVCodecID codec_id) type >= SEI_FPA_TYPE_SIDE_BY_SIDE; } +static int h2645_sei_to_side_data(AVCodecContext *avctx, H2645SEI *sei, + AVFrameSideData ***sd, int *nb_sd) +{ + int ret; + + for (unsigned i = 0; i < sei->unregistered.nb_buf_ref; i++) { + H2645SEIUnregistered *unreg = &sei->unregistered; + + if (unreg->buf_ref[i]) { + AVFrameSideData *entry = av_frame_side_data_add(sd, nb_sd, + AV_FRAME_DATA_SEI_UNREGISTERED, + &unreg->buf_ref[i], 0); + if (!entry) + av_buffer_unref(&unreg->buf_ref[i]); + } + } + sei->unregistered.nb_buf_ref = 0; + + if (sei->ambient_viewing_environment.present) { + H2645SEIAmbientViewingEnvironment *env = + &sei->ambient_viewing_environment; + AVBufferRef *buf; + size_t size; + + AVAmbientViewingEnvironment *dst_env = + av_ambient_viewing_environment_alloc(&size); + if (!dst_env) + return AVERROR(ENOMEM); + + buf = av_buffer_create((uint8_t *)dst_env, size, NULL, NULL, 0); + if (!buf) { + av_free(dst_env); + return AVERROR(ENOMEM); + } + + ret = ff_frame_new_side_data_from_buf(avctx, sd, nb_sd, + AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, &buf); + + if (ret < 0) + return ret; + + dst_env->ambient_illuminance = av_make_q(env->ambient_illuminance, 10000); + dst_env->ambient_light_x = av_make_q(env->ambient_light_x, 50000); + dst_env->ambient_light_y = av_make_q(env->ambient_light_y, 50000); + } + + if (sei->mastering_display.present) { + // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b + const int mapping[3] = {2, 0, 1}; + const int chroma_den = 50000; + const int luma_den = 10000; + int i; + AVMasteringDisplayMetadata *metadata; + + ret = ff_decode_mastering_display_new(avctx, sd, nb_sd, &metadata); + if (ret < 0) + return ret; + + if (metadata) { + for (i = 0; i < 3; i++) { + const int j = mapping[i]; + metadata->display_primaries[i][0].num = sei->mastering_display.display_primaries[j][0]; + metadata->display_primaries[i][0].den = chroma_den; + metadata->display_primaries[i][1].num = sei->mastering_display.display_primaries[j][1]; + metadata->display_primaries[i][1].den = chroma_den; + } + metadata->white_point[0].num = sei->mastering_display.white_point[0]; + metadata->white_point[0].den = chroma_den; + metadata->white_point[1].num = sei->mastering_display.white_point[1]; + metadata->white_point[1].den = chroma_den; + + metadata->max_luminance.num = sei->mastering_display.max_luminance; + metadata->max_luminance.den = luma_den; + metadata->min_luminance.num = sei->mastering_display.min_luminance; + metadata->min_luminance.den = luma_den; + metadata->has_luminance = 1; + metadata->has_primaries = 1; + + av_log(avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n"); + av_log(avctx, AV_LOG_DEBUG, + "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n", + av_q2d(metadata->display_primaries[0][0]), + av_q2d(metadata->display_primaries[0][1]), + av_q2d(metadata->display_primaries[1][0]), + av_q2d(metadata->display_primaries[1][1]), + av_q2d(metadata->display_primaries[2][0]), + av_q2d(metadata->display_primaries[2][1]), + av_q2d(metadata->white_point[0]), av_q2d(metadata->white_point[1])); + av_log(avctx, AV_LOG_DEBUG, + "min_luminance=%f, max_luminance=%f\n", + av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance)); + } + } + + if (sei->content_light.present) { + AVContentLightMetadata *metadata; + + ret = ff_decode_content_light_new(avctx, sd, nb_sd, &metadata); + if (ret < 0) + return ret; + + if (metadata) { + metadata->MaxCLL = sei->content_light.max_content_light_level; + metadata->MaxFALL = sei->content_light.max_pic_average_light_level; + + av_log(avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n"); + av_log(avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n", + metadata->MaxCLL, metadata->MaxFALL); + } + } + + return 0; +} + int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, enum AVCodecID codec_id, AVCodecContext *avctx, const H2645VUI *vui, @@ -625,19 +739,9 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; } - for (unsigned i = 0; i < sei->unregistered.nb_buf_ref; i++) { - H2645SEIUnregistered *unreg = &sei->unregistered; - - if (unreg->buf_ref[i]) { - AVFrameSideData *sd = av_frame_new_side_data_from_buf(frame, - AV_FRAME_DATA_SEI_UNREGISTERED, - unreg->buf_ref[i]); - if (!sd) - av_buffer_unref(&unreg->buf_ref[i]); - unreg->buf_ref[i] = NULL; - } - } - sei->unregistered.nb_buf_ref = 0; + ret = h2645_sei_to_side_data(avctx, sei, &frame->side_data, &frame->nb_side_data); + if (ret < 0) + return ret; if (sei->afd.present) { AVFrameSideData *sd = av_frame_new_side_data(frame, AV_FRAME_DATA_AFD, @@ -728,88 +832,15 @@ FF_ENABLE_DEPRECATION_WARNINGS return ret; #endif - if (sei->ambient_viewing_environment.present) { - H2645SEIAmbientViewingEnvironment *env = - &sei->ambient_viewing_environment; - - AVAmbientViewingEnvironment *dst_env = - av_ambient_viewing_environment_create_side_data(frame); - if (!dst_env) - return AVERROR(ENOMEM); - - dst_env->ambient_illuminance = av_make_q(env->ambient_illuminance, 10000); - dst_env->ambient_light_x = av_make_q(env->ambient_light_x, 50000); - dst_env->ambient_light_y = av_make_q(env->ambient_light_y, 50000); - } - - if (sei->mastering_display.present) { - // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b - const int mapping[3] = {2, 0, 1}; - const int chroma_den = 50000; - const int luma_den = 10000; - int i; - AVMasteringDisplayMetadata *metadata; - - ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata); - if (ret < 0) - return ret; - - if (metadata) { - for (i = 0; i < 3; i++) { - const int j = mapping[i]; - metadata->display_primaries[i][0].num = sei->mastering_display.display_primaries[j][0]; - metadata->display_primaries[i][0].den = chroma_den; - metadata->display_primaries[i][1].num = sei->mastering_display.display_primaries[j][1]; - metadata->display_primaries[i][1].den = chroma_den; - } - metadata->white_point[0].num = sei->mastering_display.white_point[0]; - metadata->white_point[0].den = chroma_den; - metadata->white_point[1].num = sei->mastering_display.white_point[1]; - metadata->white_point[1].den = chroma_den; - - metadata->max_luminance.num = sei->mastering_display.max_luminance; - metadata->max_luminance.den = luma_den; - metadata->min_luminance.num = sei->mastering_display.min_luminance; - metadata->min_luminance.den = luma_den; - metadata->has_luminance = 1; - metadata->has_primaries = 1; - - av_log(avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n"); - av_log(avctx, AV_LOG_DEBUG, - "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n", - av_q2d(metadata->display_primaries[0][0]), - av_q2d(metadata->display_primaries[0][1]), - av_q2d(metadata->display_primaries[1][0]), - av_q2d(metadata->display_primaries[1][1]), - av_q2d(metadata->display_primaries[2][0]), - av_q2d(metadata->display_primaries[2][1]), - av_q2d(metadata->white_point[0]), av_q2d(metadata->white_point[1])); - av_log(avctx, AV_LOG_DEBUG, - "min_luminance=%f, max_luminance=%f\n", - av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance)); - } - } - - if (sei->content_light.present) { - AVContentLightMetadata *metadata; - - ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata); - if (ret < 0) - return ret; - - if (metadata) { - metadata->MaxCLL = sei->content_light.max_content_light_level; - metadata->MaxFALL = sei->content_light.max_pic_average_light_level; - - av_log(avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n"); - av_log(avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n", - metadata->MaxCLL, metadata->MaxFALL); - } - } - return 0; } +int ff_h2645_sei_to_context(AVCodecContext *avctx, H2645SEI *sei) +{ + return h2645_sei_to_side_data(avctx, sei, &avctx->decoded_side_data, + &avctx->nb_decoded_side_data); +} + void ff_h2645_sei_reset(H2645SEI *s) { av_buffer_unref(&s->a53_caption.buf_ref); diff --git a/libavcodec/h2645_sei.h b/libavcodec/h2645_sei.h index b9a6c7587b..488dbcad7e 100644 --- a/libavcodec/h2645_sei.h +++ b/libavcodec/h2645_sei.h @@ -168,4 +168,6 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, unsigned bit_depth_luma, unsigned bit_depth_chroma, int seed); +int ff_h2645_sei_to_context(AVCodecContext *avctx, H2645SEI *sei); + #endif /* AVCODEC_H2645_SEI_H */ diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index d744e6f598..70d22e5976 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -3658,6 +3658,10 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx) if (ret < 0) { return ret; } + + ret = ff_h2645_sei_to_context(avctx, &s->sei.common); + if (ret < 0) + return ret; } sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF); diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index fd356bd190..a693e12670 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -334,6 +334,15 @@ FF_ENABLE_DEPRECATION_WARNINGS if (for_user) { if (codec->update_thread_context_for_user) err = codec->update_thread_context_for_user(dst, src); + + av_frame_side_data_free(&dst->decoded_side_data, &dst->nb_decoded_side_data); + for (int i = 0; i < src->nb_decoded_side_data; i++) { + int ret = av_frame_side_data_clone(&dst->decoded_side_data, + &dst->nb_decoded_side_data, + src->decoded_side_data[i], 0); + if (ret < 0) + return ret; + } } else { const PerThreadContext *p_src = src->internal->thread_ctx; PerThreadContext *p_dst = dst->internal->thread_ctx; @@ -767,6 +776,8 @@ static av_cold int init_thread(PerThreadContext *p, int *threads_to_free, if (!copy) return AVERROR(ENOMEM); copy->priv_data = NULL; + copy->decoded_side_data = NULL; + copy->nb_decoded_side_data = 0; /* From now on, this PerThreadContext will be cleaned up by * ff_frame_thread_free in case of errors. */