From e6019ed075d6d2557dc834a09c92102055837d73 Mon Sep 17 00:00:00 2001 From: Lynne Date: Fri, 30 Aug 2024 16:40:37 +0000 Subject: [PATCH] hw_base_encode: allocate DPB image upfront Vulkan requires this, as it needs to initialize state upfront. --- libavcodec/d3d12va_encode.c | 6 ------ libavcodec/hw_base_encode.c | 6 ++++++ libavcodec/vaapi_encode.c | 5 ----- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/libavcodec/d3d12va_encode.c b/libavcodec/d3d12va_encode.c index d437750598..68fb9927a8 100644 --- a/libavcodec/d3d12va_encode.c +++ b/libavcodec/d3d12va_encode.c @@ -264,12 +264,6 @@ static int d3d12va_encode_issue(AVCodecContext *avctx, av_log(avctx, AV_LOG_DEBUG, "Input surface is %p.\n", pic->input_surface->texture); - err = av_hwframe_get_buffer(base_ctx->recon_frames_ref, base_pic->recon_image, 0); - if (err < 0) { - err = AVERROR(ENOMEM); - goto fail; - } - pic->recon_surface = (AVD3D12VAFrame *)base_pic->recon_image->data[0]; av_log(avctx, AV_LOG_DEBUG, "Recon surface is %p.\n", pic->recon_surface->texture); diff --git a/libavcodec/hw_base_encode.c b/libavcodec/hw_base_encode.c index 35dac6e596..8411cc7582 100644 --- a/libavcodec/hw_base_encode.c +++ b/libavcodec/hw_base_encode.c @@ -446,6 +446,12 @@ static int hw_base_encode_send_frame(AVCodecContext *avctx, FFHWBaseEncodeContex goto fail; } + err = av_hwframe_get_buffer(ctx->recon_frames_ref, pic->recon_image, 0); + if (err < 0) { + err = AVERROR(ENOMEM); + goto fail; + } + pic->priv = av_mallocz(ctx->op->priv_size); if (!pic->priv) { err = AVERROR(ENOMEM); diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index b72e9035cb..0058e1e772 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -313,11 +313,6 @@ static int vaapi_encode_issue(AVCodecContext *avctx, av_log(avctx, AV_LOG_DEBUG, "Input surface is %#x.\n", pic->input_surface); - err = av_hwframe_get_buffer(base_ctx->recon_frames_ref, base_pic->recon_image, 0); - if (err < 0) { - err = AVERROR(ENOMEM); - goto fail; - } pic->recon_surface = (VASurfaceID)(uintptr_t)base_pic->recon_image->data[3]; av_log(avctx, AV_LOG_DEBUG, "Recon surface is %#x.\n", pic->recon_surface);