From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 19EB14A489 for ; Thu, 28 Mar 2024 11:49:15 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7E4F768D6E9; Thu, 28 Mar 2024 13:49:13 +0200 (EET) Received: from mail-il1-f173.google.com (mail-il1-f173.google.com [209.85.166.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DA39B68D171 for ; Thu, 28 Mar 2024 13:49:06 +0200 (EET) Received: by mail-il1-f173.google.com with SMTP id e9e14a558f8ab-368a360bb1aso4242495ab.0 for ; Thu, 28 Mar 2024 04:49:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711626545; x=1712231345; darn=ffmpeg.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=hoWFIvo1GUGsNfJWjrINaq8cm9LKQmXlRJsKkAif+Uo=; b=Fug/YKWAELzoeCmCp8E1TsG6lxCSMBP4FEmpjdsXcEpDr9nuJ3QRBk9aZKxJta2hdr IM0G5phoPWzC+4uSCDXqYtXshJiW/bn38JbW9R0fQWeeZ+rBoIc6Mq8gqEamicr6t2KY E8Z20d6Cen8erWEGroBjXij5Hu+SxNCtiiBVJKj2rmiIHRX1EEyRcnnnLqUTK5DwSXqn vAcy+e2nC0SLpQ3srXsfYbElwf6KxmOIRRqY03cTG/LmBC0VxdPhAOaLlJflwFSmkJ7A 0ZeyaYxh69ciSvxqJ/xuWy7cFsEOQ/4oqDs8NBNLUJEnJvtqG78gR1bpAYlYGezSaFUH 66xA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711626545; x=1712231345; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=hoWFIvo1GUGsNfJWjrINaq8cm9LKQmXlRJsKkAif+Uo=; b=BPGwH7eU6Iub35sLLcf2o9F3XnoVZHnMOubkr1SB4xmv4SUsBA7KkfgC/jjIb/rKwt KCVpZr+DtnzlIHf79G+J9zyA0S2JtWAs8MyvQSyZLl/fNS6Zf/9SC04RrFKj6wovEuDK lgMe0enJevClJaHJAvooBV7i6K8avRWSBDRxNHU54ZP7OoWOkVVK8KYTcALNtiygeqZU GXEh+V1tU0cAf1WOjpA6odT8UQxLP7X5bwumRNfdjMkhhfM5hoLNzOzg4jrM4Z64jU6d MTBTg5ez6p5pyA+PjU0cbwqFquCgR3OE1puEERCODXDhP+uwsPV2oI/AWhfaWG6efQCB kC5w== X-Gm-Message-State: AOJu0YyldHuREPZkkxCCMDiIOhn8pBF4l65D7WNLYF7vq62F1YkpgPWE e/L9Jn+vHimHmE/fpN/bWDcMY0TK72LBMWXGB3TqJ3Dz0TEwpa2T+4nt6m2y X-Google-Smtp-Source: AGHT+IHrz+V4ylf+qJRRNWmTJAONNIIcX4TCSz8A11r3sSAR3/lXLQzhYjNlEcve6zw20Zx/+I046Q== X-Received: by 2002:a92:d5ce:0:b0:366:ab6f:f6a with SMTP id d14-20020a92d5ce000000b00366ab6f0f6amr2698672ilq.24.1711626544725; Thu, 28 Mar 2024 04:49:04 -0700 (PDT) Received: from [192.168.0.15] ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id x8-20020a656aa8000000b005b7dd356f75sm1011704pgu.32.2024.03.28.04.49.03 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 28 Mar 2024 04:49:04 -0700 (PDT) Message-ID: <91096d51-c7c3-4d46-85ce-61fee7e3be0c@gmail.com> Date: Thu, 28 Mar 2024 08:49:08 -0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <20240328031210.21407-1-jamrial@gmail.com> <20240328031210.21407-2-jamrial@gmail.com> <171162527283.7287.16403425396625504098@lain.khirnov.net> Content-Language: en-US From: James Almer In-Reply-To: <171162527283.7287.16403425396625504098@lain.khirnov.net> Subject: Re: [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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 3/28/2024 8:27 AM, Anton Khirnov wrote: > Quoting James Almer (2024-03-28 04:12:05) >> 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)) > > Overzealous checks like these tend to hide bugs. Any of these conditions > being false means the caller is insane and we should crash. I'll remove some, but others simplify the code below (like knowing beforehand that *pbuf is not NULL). > >> + 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; > > This again looks like a minor variation of the block you've added twice > already. > >> + } >> + } >> + >> + 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) > > Who needs this? Someone who wants to keep the reference around, like when attaching a buffer to several outputs (global to individual output frames). _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".