From patchwork Sat Dec 3 16:07:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rick Kern X-Patchwork-Id: 39577 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp2086620pzb; Sat, 3 Dec 2022 08:08:28 -0800 (PST) X-Google-Smtp-Source: AA0mqf6jFqdZ9jH1VRX8yTXeeq48Ixf5eY7OkidlrTaA960Bf+JouLzy0kF5a3YSKRslifLryIq+ X-Received: by 2002:a17:906:3a56:b0:7c0:54f2:af97 with SMTP id a22-20020a1709063a5600b007c054f2af97mr16628537ejf.360.1670083708367; Sat, 03 Dec 2022 08:08:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670083708; cv=none; d=google.com; s=arc-20160816; b=tpMfdWI9nMdU2kdzhWYWNPZAaOcUJh7gEPWSwsjp+ajf8vxAxqJEpyo8rx6eSAXNpW b0Rngmai10p+sbsmqMSh4dJeoWXHiAKrr6Sd3GLnu5iYHE+YltdlYUYFNM7W0AL9E11l MsSi0Jscmar6iBBOfe2uFe7D1L6o2+bPUMGQ+zYAdtC6qmmWC6U0vQHFk0mFZam1AGbl FD6Qxrsec6/1Y9JrERZOhWn3OXSAmLDI2EKuQJvajdnLV+oTafOiMfFaTiavMbR3rLnh fTVMQcopNqqiI9Rl/UOUrrCAktqbKaXJjJLHmWlNcoGXNpEwiXgey2DVdshu6c+fqm// Lmmg== 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=NbkJzjVLnLyKLBBQDtq2/O/iLULJTVwwEt83+WPz4Gg=; b=P3DVQuU4s/liLzXrF3v09lczt+D4F+0J9ZQlNEupsCnKsg4AhdnBe3qFOl3nMvOdKJ 0f2KSil7xzl3xw4H8fFGLJdDi/F5M63r9lSXN8LMnJ7/9MfFOiTaUu14ZBTUVFgpa7/B Nhu1qrnDW2TvRyCzD+LghwyZg+WXl1Xp97s1iBU1YKx/1ueuNu7rhKa88cY11Q/LRR6E 6s+EiFfQlcClv1u9hHROfvgmnY7BlQjT3ypcvr3IiOd01wiG4Oq8Qazc5bBOkm2I8coj 2tTQE/cSrHHT6lq24bfXrioaE15jwzdralnDdII1bBw/aRz7K5+EboCsOD8ropmU4v0O vOSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=ajThI1Zi; 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 h7-20020a05640250c700b0046af9fdf3f5si8416192edb.282.2022.12.03.08.08.28; Sat, 03 Dec 2022 08:08:28 -0800 (PST) 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=20210112 header.b=ajThI1Zi; 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 2291D68BA6D; Sat, 3 Dec 2022 18:08:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f41.google.com (mail-qv1-f41.google.com [209.85.219.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D765168B9EC for ; Sat, 3 Dec 2022 18:08:03 +0200 (EET) Received: by mail-qv1-f41.google.com with SMTP id u10so5420530qvp.4 for ; Sat, 03 Dec 2022 08:08:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; 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=BGYheYaUIEH/EglLnbtgBVPl6dnxrEP+1VBI94ysfRI=; b=ajThI1ZiPtY65pPZeRFhWytWImDpYnHGcgduV79QH1Gotqr8/YFRBN/phNXiP0T+Hb 71GjKtogUIyg2Mm9ehzQdkYTfmkzwShR5U/kLoCmLOmQSwacYvKYGq4ZIuK77f+x+Txv X2ZGfy867VyBf71CFTyLsbM+aal/EWqgO8uQcJ9HtMzObpOhB/I6EepjAX94+EUp0CQB ItA6KvO85yU/Ug8FZNxDn9SzyJzo/YUOiv8hsaC+byfqkD6TOWe/YAdhn3lgIyC+HxGW DFfyJBjtM6EUfu6bcYP/ZccOqXWzXSqPtZQ237sOTs/7kncH+NFlfwolzqVKbuWWqRWA Zzhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BGYheYaUIEH/EglLnbtgBVPl6dnxrEP+1VBI94ysfRI=; b=VlCot8TJeD/hj9DmKuwpEUAUNHt4J52jMYQzn0gUT50SYZZkjxAyTxk42EH1yUdbvv 1uezF3Wu4Af3Gkgl7evcjhP9IShqzz8bdHByRaYVV1cPcKtXuz+dc2zVEDgPg7+7xvfm iRNyFN3LS7e/psqoUJqtMlGHPiSPbVpZwGjltc2T3uRGQbQ+yw7fM46PrX/l5lMprzto 9T/BOI8mQLng5+5Z6o/xqYwd8LvX7akaPeAFqeP/lHnYZfMad29zgJu2dsUe1VXLSlSt YsjD+SNrvM3UF6/bzb4xN0i9+U7YXBxQ8GjXgpcuaY0jAUPn42dS0V7h8MC45Vxj+m6n F2Pg== X-Gm-Message-State: ANoB5pmJBtB9DAU8H5gjSOwIiWPjnHqBxDG8EvkZNPioUwTv0blE5beM FEK47gWQJ/EPFdoeJi4neEZYQc7W4AnCpA== X-Received: by 2002:a05:6214:2d41:b0:4c7:2438:e326 with SMTP id na1-20020a0562142d4100b004c72438e326mr14221662qvb.85.1670083682167; Sat, 03 Dec 2022 08:08:02 -0800 (PST) Received: from localhost.localdomain ([2603:3007:2608:b900:38fa:c53b:cbdc:b66a]) by smtp.gmail.com with ESMTPSA id o21-20020a05620a2a1500b006eeb3165554sm8395723qkp.19.2022.12.03.08.08.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Dec 2022 08:08:01 -0800 (PST) From: Rick Kern To: ffmpeg-devel@ffmpeg.org Date: Sat, 3 Dec 2022 11:07:57 -0500 Message-Id: <20221203160757.74546-3-kernrj@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221203160757.74546-1-kernrj@gmail.com> References: <20221203155056.74093-1-kernrj@gmail.com> <20221203160757.74546-1-kernrj@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 2/2] lavc/videotoolboxenc: use objectpool for encoder output information 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: qf0RG6pzZwbe Instead of allocating/freeing, use objpool for data passed from an input frame to an output packet. Signed-off-by: Rick Kern --- libavcodec/videotoolboxenc.c | 80 ++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c index dc9e321d3d..184feb029b 100644 --- a/libavcodec/videotoolboxenc.c +++ b/libavcodec/videotoolboxenc.c @@ -24,6 +24,7 @@ #include #include #include "avcodec.h" +#include "libavutil/objpool.h" #include "libavutil/opt.h" #include "libavutil/avassert.h" #include "libavutil/avstring.h" @@ -251,8 +252,49 @@ typedef struct VTEncContext { /* can't be bool type since AVOption will access it as int */ int a53_cc; + + AVObjPool *output_node_pool; } VTEncContext; +static BufNode *output_node_alloc(void) { return av_mallocz(sizeof(BufNode)); } +static void output_node_free(BufNode **node) { av_freep(node); } +static void output_node_reset(BufNode *node) { + if (node->cm_buffer != NULL) { + CFRelease(node->cm_buffer); + } + + if (node->sei != NULL) { + if (node->sei->data != NULL) { + av_free(node->sei->data); + } + + av_free(node->sei); + } + + memset(node, 0, sizeof(*node)); +} + +static int alloc_output_node_pool(AVObjPool **pool_out) { + AVObjPool *pool = NULL; + + if (pool_out == NULL) { + return AVERROR(EINVAL); + } + + pool = av_objpool_alloc( + (AVObjPoolCBAlloc)output_node_alloc, + (AVObjPoolCBReset)output_node_reset, + (AVObjPoolCBFree)output_node_free); + + if (pool == NULL) { + return AVERROR(ENOMEM); + } + + *pool_out = pool; + + return 0; +} + static int vtenc_populate_extradata(AVCodecContext *avctx, CMVideoCodecType codec_type, CFStringRef profile_level, @@ -285,8 +327,7 @@ static void set_async_error(VTEncContext *vtctx, int err) while (info) { BufNode *next = info->next; - CFRelease(info->cm_buffer); - av_free(info); + av_objpool_release(vtctx->output_node_pool, (void**)&info); info = next; } @@ -336,22 +377,29 @@ static int vtenc_q_pop(VTEncContext *vtctx, bool wait, CMSampleBufferRef *buf, E pthread_mutex_unlock(&vtctx->lock); *buf = info->cm_buffer; + if (*buf != NULL) { + CFRetain(*buf); + } + if (sei && *buf) { *sei = info->sei; - } else if (info->sei) { - if (info->sei->data) av_free(info->sei->data); - av_free(info->sei); + info->sei = NULL; } - av_free(info); + av_objpool_release(vtctx->output_node_pool, (void**)&info); return 0; } static void vtenc_q_push(VTEncContext *vtctx, CMSampleBufferRef buffer, ExtraSEI *sei) { - BufNode *info = av_malloc(sizeof(BufNode)); - if (!info) { + BufNode *info = NULL; + int status = av_objpool_get(vtctx->output_node_pool, (void**)&info); + + if (status < 0) { + set_async_error(vtctx, status); + return; + } else if (!info) { set_async_error(vtctx, AVERROR(ENOMEM)); return; } @@ -1569,6 +1617,16 @@ static av_cold int vtenc_init(AVCodecContext *avctx) pthread_mutex_init(&vtctx->lock, NULL); pthread_cond_init(&vtctx->cv_sample_sent, NULL); + status = alloc_output_node_pool(&vtctx->output_node_pool); + + if (status < 0) { + av_log( + avctx, + AV_LOG_ERROR, + "Failed to allocate output pool (%d)\n", + status); + } + vtctx->session = NULL; status = vtenc_configure_encoder(avctx); if (status) return status; @@ -1589,7 +1647,7 @@ static av_cold int vtenc_init(AVCodecContext *avctx) } avctx->has_b_frames = vtctx->has_b_frames; - return 0; + return status; } static void vtenc_get_frame_info(CMSampleBufferRef buffer, bool *is_key_frame) @@ -2647,6 +2705,10 @@ static av_cold int vtenc_close(AVCodecContext *avctx) vtctx->ycbcr_matrix = NULL; } + if (vtctx->output_node_pool != NULL) { + av_objpool_free(&vtctx->output_node_pool); + } + return 0; }