From patchwork Thu Mar 10 04:37:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 34654 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:3486:0:0:0:0 with SMTP id ek6csp388443nkb; Wed, 9 Mar 2022 20:38:14 -0800 (PST) X-Google-Smtp-Source: ABdhPJyOUzxrpjC0wl+b5zs7rOJeI+IC3Y6bjSVS3jFK7m9UANDaA0NMk55nuumituVc2E2CwNSe X-Received: by 2002:a05:6402:510b:b0:416:9d56:20e with SMTP id m11-20020a056402510b00b004169d56020emr2531815edd.264.1646887094458; Wed, 09 Mar 2022 20:38:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646887094; cv=none; d=google.com; s=arc-20160816; b=Nvy2rQJYPQThNOOimdtm0ahW2nG+5vaAw5ultBbV2ywmKJLxLltFCkHChl/4J2fmDi ASAyA16UY3lqC7JrOv79+mW8krRsPUnljlvbgGQLUTJKdvbXARj3arT9N0tula2glvVP bWPGxVtwzfsjFG8IEwtGyLNTlqvuPf2P8SPvEqgQxFiWbZQ+dnBDhwQetvJEPXAow37v 75iLF2LdVJUBJyhI08wh0+vzqukeGDixiA4p7/al4yReyUAz8t2+Xm1t5c5d6WZ0sBOG vAKnRH3PQM/NC4qJdc7wQuJyemLl4K4NYW8dvKxmYJx5zX/M88u/bXyjwrKBptr4Y7iY vLig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to; bh=ch7/jKBgmCIUXJshgWqtASZaYrS4ZB983j6s1BvrKSg=; b=chzlbvH7MHOIlVH7W8wLMxO6b+JnnKCOPBfJvmz/5HwiYJ7usmX7aujVIfAzo/Txkp v3p5T+a9DSc24SVYjqaytOyTqUGo6lLq0hd6oy0J1UmNWajYWOp7mP8HF+Hmwgkvw+lC qoPJ7G6894SV1T/jfPhalZpgT/ez2sKzafT10CXIq4SBpFRB8g2mHlim1+PjgvGrnKqn Zi+Qgd7qTXs/wMphTCf/KIZ+YZltEPfF4FkWtqSgrgOJYYDwMgBGtbomM2ZeI5srJsPp T23XtJfq8CgEQnL58zRdxzQKeLJSCwrI1gqvIz4VUKg2dQkYs701vddmLp6zki5ghc7F ebqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=YBnf9UMI; 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=NONE dis=NONE) header.from=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o20-20020a056402439400b0041697d1a688si2299857edc.145.2022.03.09.20.38.13; Wed, 09 Mar 2022 20:38:14 -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=@foxmail.com header.s=s201512 header.b=YBnf9UMI; 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=NONE dis=NONE) header.from=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1C88B68B122; Thu, 10 Mar 2022 06:38:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out203-205-221-236.mail.qq.com (out203-205-221-236.mail.qq.com [203.205.221.236]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 274DB68B121 for ; Thu, 10 Mar 2022 06:38:01 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1646887077; bh=rfLbGFMCNe5Vv08YjCFQDy+LLra9fq3cpWlOejWr1W8=; h=From:To:Cc:Subject:Date; b=YBnf9UMIrKj2oE58erSqyB/973WxoPkyvUFyaK4ORxnywyGQmz73/k3QZ7o3J+o+g XsjvmQd3WRhApZ71s7Fk+W0L4BnZB/xk/8X6v8pIsmySHrfDYakPcJVR9n6nQozM2n FD6Glo6ucTsJceAiC4SAo3Ddv+zY5+f0jJUQpYHw= Received: from ZHILIZHAO-MB2.tencent.com ([219.133.100.3]) by newxmesmtplogicsvrszb7.qq.com (NewEsmtp) with SMTP id 978084B0; Thu, 10 Mar 2022 12:37:56 +0800 X-QQ-mid: xmsmtpt1646887076twmewmmmf Message-ID: X-QQ-XMAILINFO: N7h1OCCDntujG60AHAhBd3vPOUpMRq3u5A5JtKdV/Wo7UlEUrcA2P47YRpESWs al6PyDpyTaBxg7Bke4WjlnpZBtH/tmfPTAv06lGtFcC92AhQtNz5BeVD0W1OS4hK9IRLIcenfg41 LV9YlhAdS74ekJKBXget/8xtg46s72GjjRdRa5eGgpMYttkkXxKzpl9HWVCXviYHAcBPD06eshVM lWGOU/o2DYlhGYcNyRNMVvpTF2HQ09cU1oDHutOb9NfdU7Les+O21RzQyBwkCKrsX3snayP1Jt7t Gj+IXW/kzTVexjVQd/Q7swt5KMQfxHgeZ4Tothe0c62ned5JhSKrs9TpQGwxpB4WHneo+y0Mz3pK BKZ8dQAaFGIFyzj+oNHAkMQEZizAWMsirb2WVMFmXXFD12yJit02Dhlhh5hHXt07r7fkZSzAEJwR Xc+IeXtUpRvit3NeSBRbY+Iz1YjHSDlGp6Hz3g7VZH/GRClcfscUf6AR2PVe86fmxBzEnafi9ls+ TUR0ym+oEMYYxI9Bw0mSLddE01KsRRNEtBQj72LaglbpoKfMPBrDuCQii2YSeI3K/Jhrawz9eQVs jSuUD2h+NuF1aGsq+AbnQ7br3IplTyPGvX8SO39UHlKBmwGsgqu2O5HwCN6kB4G8/97ZiohAdNE/ 4Kzvqn1wJtsXqMl6vRPd3ziVoPgvSrWn6+pikMMMSpF1gfI2CrzbxTohl1qeAXB4w0X2MYOxxwK8 1uZ7WxBso2mTC+UZHKZUgSSpFgXhgRb82HQY0GQ2khiPmtnwJW92kwNFUe4h5YNSD2N+b+epcgWx Z7ireuDWc6TYRln50O2aOKhHIL8zIM6FIVIKHz8Nd+icP76QorcrK6vRtY5D/tc8zZyjO6rEanF0 vSF7Sac7/T65gRUsEyKYZnXSJzlfWc45/0FTzXMJNigEH4nT/IwfM= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Thu, 10 Mar 2022 12:37:53 +0800 X-OQ-MSGID: <20220310043754.53262-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avutil/hwcontext_videotoolbox: create real buffer pool 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 Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: nb/FLksztjDk vt_get_buffer shouldn't do buffer pool's job. --- libavutil/hwcontext_videotoolbox.c | 71 ++++++++++++++---------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c index 026127d412..e442a95007 100644 --- a/libavutil/hwcontext_videotoolbox.c +++ b/libavutil/hwcontext_videotoolbox.c @@ -210,9 +210,36 @@ static int vt_pool_alloc(AVHWFramesContext *ctx) return AVERROR_EXTERNAL; } -static AVBufferRef *vt_dummy_pool_alloc(void *opaque, size_t size) +static void videotoolbox_buffer_release(void *opaque, uint8_t *data) +{ + CVPixelBufferRelease((CVPixelBufferRef)data); +} + +static AVBufferRef *vt_pool_alloc_buffer(void *opaque, size_t size) { - return NULL; + CVPixelBufferRef pixbuf; + AVBufferRef *buf; + CVReturn err; + AVHWFramesContext *ctx = opaque; + VTFramesContext *fctx = ctx->internal->priv; + + err = CVPixelBufferPoolCreatePixelBuffer( + NULL, + fctx->pool, + &pixbuf + ); + if (err != kCVReturnSuccess) { + av_log(ctx, AV_LOG_ERROR, "Failed to create pixel buffer from pool: %d\n", err); + return NULL; + } + + buf = av_buffer_create((uint8_t *)pixbuf, size, + videotoolbox_buffer_release, NULL, 0); + if (!buf) { + CVPixelBufferRelease(pixbuf); + return NULL; + } + return buf; } static void vt_frames_uninit(AVHWFramesContext *ctx) @@ -238,9 +265,9 @@ static int vt_frames_init(AVHWFramesContext *ctx) return AVERROR(ENOSYS); } - // create a dummy pool so av_hwframe_get_buffer doesn't EINVAL if (!ctx->pool) { - ctx->internal->pool_internal = av_buffer_pool_init2(0, ctx, vt_dummy_pool_alloc, NULL); + ctx->internal->pool_internal = av_buffer_pool_init2( + sizeof(CVPixelBufferRef), ctx, vt_pool_alloc_buffer, NULL); if (!ctx->internal->pool_internal) return AVERROR(ENOMEM); } @@ -252,41 +279,11 @@ static int vt_frames_init(AVHWFramesContext *ctx) return 0; } -static void videotoolbox_buffer_release(void *opaque, uint8_t *data) -{ - CVPixelBufferRelease((CVPixelBufferRef)data); -} - static int vt_get_buffer(AVHWFramesContext *ctx, AVFrame *frame) { - VTFramesContext *fctx = ctx->internal->priv; - - if (ctx->pool && ctx->pool->size != 0) { - frame->buf[0] = av_buffer_pool_get(ctx->pool); - if (!frame->buf[0]) - return AVERROR(ENOMEM); - } else { - CVPixelBufferRef pixbuf; - AVBufferRef *buf = NULL; - CVReturn err; - - err = CVPixelBufferPoolCreatePixelBuffer( - NULL, - fctx->pool, - &pixbuf - ); - if (err != kCVReturnSuccess) { - av_log(ctx, AV_LOG_ERROR, "Failed to create pixel buffer from pool: %d\n", err); - return AVERROR_EXTERNAL; - } - - buf = av_buffer_create((uint8_t *)pixbuf, 1, videotoolbox_buffer_release, NULL, 0); - if (!buf) { - CVPixelBufferRelease(pixbuf); - return AVERROR(ENOMEM); - } - frame->buf[0] = buf; - } + frame->buf[0] = av_buffer_pool_get(ctx->pool); + if (!frame->buf[0]) + return AVERROR(ENOMEM); frame->data[3] = frame->buf[0]->data; frame->format = AV_PIX_FMT_VIDEOTOOLBOX;