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 0E25D42CFC for ; Sun, 5 Jun 2022 15:42:52 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5DFF568B635; Sun, 5 Jun 2022 18:42:49 +0300 (EEST) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073026.outbound.protection.outlook.com [40.92.73.26]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 579E868B5D1 for ; Sun, 5 Jun 2022 18:42:42 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JCQ/Yo0f7OmRRogslcFHMYiWCRtccFwlyrXfr3YioccFKClx+vaZAKMp2Po1ZrvlhcjrHu8S3g+rW9ImZCMyE2zZ/yo1lsbkRrRTVynwDTO177a78mxk6Fa+BoOobj/VtwV1UlFmsXgiGCMMTIGSRTFVv1tLvSImKlWzbrgfTLJFYT1GG6uczOG6GM5QdjrI9d5H+MJRbYLhu+I3+ERjYbEPEAifiv3MUwiW0NOoaVl5umn8OfvDnXrrBpZTHvt+GHfrv+RPu+yjOtXHAR8BUTnI5/eET5rZ2e0sigHcwMeqPOhB9c8hybDynn2ReYG+BvGzC3xHCK6P+cse7+NIyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=KuC9VK9rEhGZGqJQ2z+yhAyMk+fS5+/4hd5WfEqy9TA=; b=ny3k88LD/9lze7htm5v3Qi5blaNXIEmCRsz3F1hUxJTJQqBMMkjorLwv+6gHcjKlMq+awcVcx/AE8mm7+yJFNVQkyixYv/HcCfWtfNjsFwMgSao0u3NSYmxk2uK7N8CkTVR8Wba4xjWwo7Y/+g5Ddn0eFlSbe1CDsCsmtT6ASEyAaP/Dd9fXF/gbl6WQBjIGeELNm2GGsRAvlLGyajDI61VMFgKqaPrL0faB2iJlpTY96Pmvh9Ld6aoiHq5dITqTgGbBOtCYFTobAN5pum53LL5zCcPnIg4T5jVdDXc7SRr9SAus3D5Uu3e1UfX7sWTDwVG1NjxYZjpYpzdL+Lic4g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=KuC9VK9rEhGZGqJQ2z+yhAyMk+fS5+/4hd5WfEqy9TA=; b=kehYhMMuP+rbGBZXZUbbgoch4g5ltTlNUZ/4TUpCRHniV5IauPiR5GfD2JelthS6gmK2wXRniXCD3jgII9DH1ejLB8xjZ3l0RLCryEtpHwAJAK3xbU3d5Dg3Xm7A5ikau1//4yI8dRDvGqV+3DjbklVuMR8+KJitVBKxMU3YT7MKs9ioNiaKe0J3Tioq+XD6UBdDGg/lOVh0FD5jufTPVVq+WSPd9l+1jzqX+AEtYa2zGf0LracpivqdxGYEtOHKnLBW4PTa/KDm9Cx9cRCDiIrbKRJvcL21L2fvUj2kJnK4hF9uXVbmW/x4/3mWtdMYR5NyCgBdsaAEhr1Dk6qYSA== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by PA4PR01MB7567.eurprd01.prod.exchangelabs.com (2603:10a6:102:c1::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5314.13; Sun, 5 Jun 2022 15:42:39 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5314.019; Sun, 5 Jun 2022 15:42:39 +0000 Message-ID: Date: Sun, 5 Jun 2022 17:42:37 +0200 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20220605152813.1888-1-jamrial@gmail.com> From: Andreas Rheinhardt In-Reply-To: <20220605152813.1888-1-jamrial@gmail.com> X-TMN: [cpymMt+4RGCqAFs5p2K7Tu42KioK4T1N] X-ClientProxiedBy: ZR0P278CA0156.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:41::6) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <2dddd665-a189-8d45-03ad-a7205d59f130@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9729197f-12ee-4e72-eb60-08da470a059b X-MS-TrafficTypeDiagnostic: PA4PR01MB7567:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CYn0O41mChLSQ0ieIkZk9Wx1jpYffgBKM2hNbxy5jP9tizyIHzGC89PZCfQW7GjJECy5atLoLW0esaiWM7bk940B0CjsTjwp6vFoXDjnROkZcj7TYfU5yZbkJIetityXTbnon+DAHwHFFAGchvQSXn/MnhZK8MTA2Exfk2ycNMiHtdBOArKCv81c/jzFKKW6qcSdeJKiu+60CfbYJQ8NUsJOm53ixk7tU0Rw6SiBszdB5lUZGZ1yOeHykQItEMRqgAuIO/59gl47UN7icNK1NQddP6oYqgfBlm5uF/JTefAgG2EGlY8UZJ86QCYR0alAJytNvMud0evTnyMxLs+zNB0+redpq/1+bl7PGPllo/ylYZUwa8pyc5jK1vYPu3EcFqp6cke3Mkw30HqtUSbN9ca0th9Z4p+ohXYVTFi9O0I36VtmvNHFjbxEJGP2Tin4jf5FZEGU66G+oSKkL8OwRWS4cDUUw5mhkBSeemg/ZS0XC85cDar50Fz3FGC/NhT/o65d8Ky3XID/PQcWZnpabjRL3znt2IsdElFL/+i++nQy4BDCXyakKEGJRCGxO6NEm8+mYYTYvLNlvW5xDy/mUw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ajZDSEV2UDFQVEhVVThWV1hsQWJvZkVnL0FFUXNaMjFpRXorQi9MYnpTZzVR?= =?utf-8?B?WG50QmtjcUwxR29jOWtGUVZaQ2hIeHhIRmZtZDFPcFRjNWt4aUowbENiTFhs?= =?utf-8?B?Njl1N1ZKdEJqUythbW96T2RsazhtMlpTbW1OYWJmNktoOWhpZUw0cUMzTjJa?= =?utf-8?B?MzZkOTJ0eHkxZ2xmbkRiMjhZSG1Yd1lTTG1tVEdhclVDNnZvL05XeDlCbHFN?= =?utf-8?B?YWYrTHlPbVJydTJwczhIUTdtUFhNL1lodTFvZTBoQ1NLZmluWExNS2hJWmNI?= =?utf-8?B?OCtpOFhYL1FlcUhZUjZlb25pcDhqMnBPWUpYWVBjK3NkTW5KdWs3Uyt2Y1lV?= =?utf-8?B?di8xM20rRWs1VlRGejdPSldPSDZrdEQrRTlOWFBMNEJoeWFBZ2E5dmtLcHhW?= =?utf-8?B?SkRVTGVMbmNJNDltWVZucGJpT1RpaEJKejhMVlNyMDZQTzRWZXlzaEtmVWEv?= =?utf-8?B?cnl5MUtheGFtblJUdW9YQ091VGpzQml4dGRFYjZPNnNrZXBuWWRBc3VoaXVy?= =?utf-8?B?NXFlZGNWYzBKb0tPRTIzaG14YTNjNFdMQlJFYTkwQVBJc3FhS010ek9id1VB?= =?utf-8?B?V0dzMU8zYjcwYjc5TUlYTlNDWWxzZldXZTdENGFjdHg2WDg0MzZHa3BWTzRa?= =?utf-8?B?bnc0ckw3ZTdDdjRRbmQrdXU3UXB0VzNWSVM0UE5HblZXZE9QbTJGVS9XOGRN?= =?utf-8?B?ZTlFazJNSjdxR3FiS2FiZitUNzg4V29KdWxUejFYai92bEVVbUlTRnpOUmJO?= =?utf-8?B?cW0zWEI2S3k1QlE4eTVPS09EWHBOZXRqTjRBcjRiVlcyV2RJWHZ5a0VPd0VI?= =?utf-8?B?L1F1ZCt2VWZIYWZyNE43NTFUeUZIQys5RWFuc0c1K0JrN21tNzFiRlVIN0FC?= =?utf-8?B?dnFMSnZpWnh0VjBML0g4RlFEOEY5V3B4T3U4N0d5Wk9uNWtmdTd2SGpNRE8r?= =?utf-8?B?RitTOTFUbjVFNmpscDJJcGkwa1FocDdKRm9JK1VaUSsyUDRxcWV5c1ROdXRx?= =?utf-8?B?ekRGVlczSkRoNXd5WjZFL1NPNDNWRnk4cDVRSzJUaTY1eTBtQThXRVBQSnhK?= =?utf-8?B?UTdvTXpYZUtHc3QzUmlXbDYvRnBLTno1b3FWeEVrakZnTldCL3VQYWovejJa?= =?utf-8?B?SUNjZnNtbEd2U3JOY3pZbkptVWFjWVhMbktURzAwUXVWVWdWNFluWElOamZx?= =?utf-8?B?NnZ2NnNxNHAwRkVvU3gyM0tZeTEwYTNLZ3pmdk1kK3pSdDJGYVFWYjJXbHoy?= =?utf-8?B?bHpoZy9zczVhY1YrOVVWTW1UMzFJUHJaVHFiWFMzOWY4aDQ3ZHVraGNsd0ZE?= =?utf-8?B?K3dIbUwzMlY1UTJWcW9IbHRUUnV0MEMwRnJTOEJPbS8wMlV1TStPM3hXSXNq?= =?utf-8?B?WFl6UnZpWXRodk4xdVI3eTkwVE01amVjNmY4dXdJZjM0MWdKVE1vM25qQThB?= =?utf-8?B?SEFBZWg5dFpRNmNyNUNyK3ZOU04xWlJob2trMmRtVUtkMmNTa1hpaE1BdWRE?= =?utf-8?B?VHBWRklRZ2RVSUQ3Q0VabGVXTjVlOE1LKzRWWk5SZXZyMjBld3NDSDFxaEE1?= =?utf-8?B?anRaSzY3QWxVczk4RER1aVN0MHpBeFQvcXZoeEp5eHRobHNJczdXTWE0VXZD?= =?utf-8?B?emsxWVFOZTNBam9WZis2OFJUR01UUWM1SGdNQXRtQkxicWxjWVhLY0JuM01B?= =?utf-8?B?dEVHdzZvK296M0Z3SjNCMkIyWlNVQUEwYTJkVE9iY2p4UmdvMDhIOU80VkRo?= =?utf-8?B?YzJ6N2xVL0RsWEFSN05iNUJFTVZWcnhuSC9OMC9qK0NQWExFQ0t1eFVlcFBo?= =?utf-8?B?SzZ4ZzNKaGdhZExTY2NKNFBhZ2hEU1NFQXhqdEdXaWVnREhIYWovSjZhU1VH?= =?utf-8?B?bkgxNUNpZ1UvckhDRCs3QTBkWDcxNHJBRkJ5L0t0ZVhIZjZyQ3FsdGp1TW14?= =?utf-8?B?ZkpYZXZadUQ0VWhQb2dyK1RXZWdKNmY1Y0pOMXZuaTM0MW5NcW8zUCtJb1Z3?= =?utf-8?B?UUlBV2kxaExnPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9729197f-12ee-4e72-eb60-08da470a059b X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jun 2022 15:42:39.8352 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR01MB7567 Subject: Re: [FFmpeg-devel] [PATCH] avutil/frame: add av_frame_replace X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: James Almer: > Signed-off-by: James Almer > --- > Now taking into account the new channel layout API fields, supporting non > refcouted src, plus changing the documentation to state that the dst frame > properties will be replaced by those from src even if the data described > by both frames is the same. > Apparently, you didn't get my point last time: What happens if dst and src coincide did not mean "what happpens if the data both frames refer to already coincides"; it meant "what happens if src == dst?" (so that there is only one AVFrame involved). You either disallow this altogether or you support it. This patch (and the last one) does neither. > Still missing APIChanges entry and version bump. > > libavutil/frame.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++ > libavutil/frame.h | 17 ++++++ > 2 files changed, 161 insertions(+) > > diff --git a/libavutil/frame.c b/libavutil/frame.c > index 4c16488c66..2a4a2c27ad 100644 > --- a/libavutil/frame.c > +++ b/libavutil/frame.c > @@ -461,6 +461,150 @@ fail: > return ret; > } > > +int av_frame_replace(AVFrame *dst, const AVFrame *src) > +{ > + int i, ret = 0; Why don't you use "for (int i = 0;" loop variables? > + > + dst->format = src->format; > + dst->width = src->width; > + dst->height = src->height; > + dst->nb_samples = src->nb_samples; > +#if FF_API_OLD_CHANNEL_LAYOUT > +FF_DISABLE_DEPRECATION_WARNINGS > + dst->channels = src->channels; > + dst->channel_layout = src->channel_layout; > + if (!av_channel_layout_check(&src->ch_layout)) { > + av_channel_layout_uninit(&dst->ch_layout); > + if (src->channel_layout) > + av_channel_layout_from_mask(&dst->ch_layout, src->channel_layout); > + else { > + dst->ch_layout.nb_channels = src->channels; > + dst->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; > + } > + } else { > +#endif > + ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout); > + if (ret < 0) > + goto fail; > +#if FF_API_OLD_CHANNEL_LAYOUT > + } > +FF_ENABLE_DEPRECATION_WARNINGS > +#endif > + > + wipe_side_data(dst); > + av_dict_free(&dst->metadata); > + ret = frame_copy_props(dst, src, 0); > + if (ret < 0) > + goto fail; > + > + /* duplicate the frame data if it's not refcounted */ > + if (!src->buf[0]) { > + for (i = 0; i < FF_ARRAY_ELEMS(dst->buf); i++) > + av_buffer_unref(&dst->buf[i]); > + for (i = 0; i < dst->nb_extended_buf; i++) > + av_buffer_unref(&dst->extended_buf[i]); > + av_freep(&dst->extended_buf); > + > + memset(dst->data, 0, sizeof(dst->data)); > + if (dst->extended_data != dst->data) > + av_freep(&dst->extended_data); > + > + ret = av_frame_get_buffer(dst, 0); > + if (ret < 0) > + goto fail; > + > + ret = av_frame_copy(dst, src); > + if (ret < 0) > + goto fail; > + > + ret = av_buffer_replace(&dst->hw_frames_ctx, src->hw_frames_ctx); > + if (ret < 0) > + goto fail; > + > + return 0; > + } > + > + /* replace the buffers */ > + for (i = 0; i < FF_ARRAY_ELEMS(src->buf); i++) { > + ret = av_buffer_replace(&dst->buf[i], src->buf[i]); > + if (ret < 0) > + goto fail; > + } > + > + if (src->extended_buf) { > + if (dst->nb_extended_buf != src->nb_extended_buf) { > + int nb_extended_buf = FFMIN(dst->nb_extended_buf, src->nb_extended_buf); > + void *tmp; > + > + for (i = nb_extended_buf; i < dst->nb_extended_buf; i++) > + av_buffer_unref(&dst->extended_buf[i]); > + > + tmp = av_realloc_array(dst->extended_buf, sizeof(*dst->extended_buf), > + src->nb_extended_buf); > + if (!tmp) { > + ret = AVERROR(ENOMEM); > + goto fail; > + } > + dst->extended_buf = tmp; > + dst->nb_extended_buf = src->nb_extended_buf; > + > + memset(&dst->extended_buf[nb_extended_buf], 0, > + (src->nb_extended_buf - nb_extended_buf) * sizeof(*dst->extended_buf)); > + } > + > + for (i = 0; i < src->nb_extended_buf; i++) { > + ret = av_buffer_replace(&dst->extended_buf[i], src->extended_buf[i]); > + if (ret < 0) > + goto fail; > + } > + } else if (dst->extended_buf) { > + for (i = 0; i < dst->nb_extended_buf; i++) > + av_buffer_unref(&dst->extended_buf[i]); > + av_freep(&dst->extended_buf); > + } > + > + ret = av_buffer_replace(&dst->hw_frames_ctx, src->hw_frames_ctx); > + if (ret < 0) > + goto fail; > + > + if (dst->extended_data != dst->data) > + av_freep(&dst->extended_data); > + > + if (src->extended_data != src->data) { > + int ch = src->ch_layout.nb_channels; > + > +#if FF_API_OLD_CHANNEL_LAYOUT > +FF_DISABLE_DEPRECATION_WARNINGS > + if (!ch) { > + ch = src->channels; > + CHECK_CHANNELS_CONSISTENCY(src); > + } > +FF_ENABLE_DEPRECATION_WARNINGS > +#endif > + if (!ch) { > + ret = AVERROR(EINVAL); > + goto fail; > + } > + > + dst->extended_data = av_malloc_array(sizeof(*dst->extended_data), ch); > + if (!dst->extended_data) { > + ret = AVERROR(ENOMEM); > + goto fail; > + } > + memcpy(dst->extended_data, src->extended_data, sizeof(*src->extended_data) * ch); > + } else > + dst->extended_data = dst->data; > + > + memcpy(dst->data, src->data, sizeof(src->data)); > + memcpy(dst->linesize, src->linesize, sizeof(src->linesize)); > + > + return 0; > + > +fail: > + av_frame_unref(dst); > + return ret; > +} > + > AVFrame *av_frame_clone(const AVFrame *src) > { > AVFrame *ret = av_frame_alloc(); > diff --git a/libavutil/frame.h b/libavutil/frame.h > index 33fac2054c..a971b1655e 100644 > --- a/libavutil/frame.h > +++ b/libavutil/frame.h > @@ -752,6 +752,23 @@ void av_frame_free(AVFrame **frame); > */ > int av_frame_ref(AVFrame *dst, const AVFrame *src); > > +/** > + * Ensure the destination frame refers to the same data described by the source > + * frame by creating a new reference for each AVBufferRef from src if they > + * differ from those in dst, or if src is not reference counted, by allocating > + * new buffers and copying data. > + * > + * Frame properties on dst will be replaced by those from src. > + * > + * @param src The source frame. If there's data described in it, it must be > + * reference counted. The text above says "if src is not reference counted, by allocating new buffers and copying data". > + * @param dst The destination frame. > + * > + * @return 0 on success, a negative AVERROR on error. On error, dst is > + * unreferenced. > + */ > +int av_frame_replace(AVFrame *dst, const AVFrame *src); > + > /** > * Create a new frame that references the same data as src. > * _______________________________________________ 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".