From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 751054E77D for ; Fri, 11 Jul 2025 17:24:54 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 9D5A8690187; Fri, 11 Jul 2025 20:24:51 +0300 (EEST) Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id DA06B69014D for ; Fri, 11 Jul 2025 20:24:44 +0300 (EEST) Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-60c9d8a16e5so4488559a12.0 for ; Fri, 11 Jul 2025 10:24:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752254684; x=1752859484; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=ryURp4vTBsJWPfcciAx/2al2PmuqStbllAS8jzsLiLQ=; b=iQqEGTjQ124E/ZB/4yUlfWU31Ed8PFmVugpHiMg3zkwHau0JbaqSeCkiKytK3Nfhio cyO3vtLEJXkqjwFQeWngeaAQ1TF+SOTxy36HBwQPQFQ5OC9Bq72/DRkeC/XTHbkXaf1j CNqd9PFUu7u3Z3Bnj80agkusDjpVicxPUEk1V1S3wGu2ItVkq8f/VBhTFo/r2Gs3kgBD 4vB0FQIBBQzg2w6vlvCMWAp0vNNp/IN8ys2ZssBzj1zSRUj/vSc3DYBRhoaHwZTZDfXe ctMEGYmktGcI7orDrfk/cxRxOOnBcqtEg7CfUuavjJSlTHw3CQZJ3US+2yRKFiegyUvS sZfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752254684; x=1752859484; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ryURp4vTBsJWPfcciAx/2al2PmuqStbllAS8jzsLiLQ=; b=vpccXS+cHIcW/CypyDAN5JgnJBYyO39OfWoD8xH7/eGXWw5xrskRaH2d3olRi7b4Bx 8eWdvz74o9CyAkL/SWh0gUUYx6rC8nhK/brevw9SAyFZS8sii+H3qeRDjolhMkSAHB+j JIldKFn8kSN+8W7N2uFhb+rsEqS/JjVV6R55Pdy7YqnOXih0TUjwp6O+sGMXHX/dy+cn sRU1A6dsLlcjvtsHgSpz0lH/QYZVruHnz+4Y8dgjnuXSbU4215Yqqi2CvYellcl483tn 6Hv5Ppj/ADt2DyiodcZ2IGDXFB/tI8lTNNfY1+J0QS8EiMkXU7Ldah82pSoImYRpbP0b 3bpw== X-Gm-Message-State: AOJu0YwL0iGPXPO/4lMwpNwMQSPRClyVtZ3Kbc/x9CpsXUGSOxEIZOmf ABGYQMvZmcGQgtPaRubqSWEqj8uO9L4rx37IjojrMvn6Vw6b328QFA8+kqf2GQ== X-Gm-Gg: ASbGncu+rmZSeuLIFjQSTBm65oZwnHxJbtTlcmdr/2oukXQu58sj7nPyZ3ADhnf1nxx ynXkZBUGe6rXr0G8qrNsAUNqRIC28lKEYfmgioAc0hwC0qKb9NeiScU163ICrIsP9U6XQd+s/rY gU92voMhtCZtevRrbRgTc8kLSJsqAlk5S31Ev7B9kjWTwtL33ZLVsfdoDlPZ/fM/yVTy5ABP9Y3 fQ4ORicWgTFRPYe3IP6RJadj0NFHrdO/2qo6XypJZZnBzmvfR5am3OV/4sq+DoTHlOf4w34K/8Z RII40xlTtz5/a2wZurD8oCuX0nGf54dDNQWAvE4B4x0ThJ0AIcGnM6geixWgkvdxBvzXLF4/DJd GAv92vWHtCBljdU6EM9ORHPUeKWesDx8UHnE14gnXuj4/t9+Jp1pKHlyUKxj6hclJn/kKOTc9cz Py2I0gbWZ53AjTOevaX01bdQ== X-Google-Smtp-Source: AGHT+IHW0bXE2WmNekXz73oDG7irm2b1QiY9LJdftDjOilDS8kExQaotf3ZpI0fEvCb8a5AtDqa+kg== X-Received: by 2002:a17:907:6ea7:b0:ad5:777d:83d8 with SMTP id a640c23a62f3a-ae6fbf26361mr439313866b.29.1752254683318; Fri, 11 Jul 2025 10:24:43 -0700 (PDT) Received: from localhost.localdomain (77-46-217-237.dynamic.isp.telekom.rs. [77.46.217.237]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae6e82dedf4sm330855966b.148.2025.07.11.10.24.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Jul 2025 10:24:42 -0700 (PDT) From: Araz Iusubov X-Google-Original-From: Araz Iusubov To: ffmpeg-devel@ffmpeg.org Date: Fri, 11 Jul 2025 17:24:30 +0200 Message-ID: <20250711152430.1471-1-Primeadvice@gmail.com> X-Mailer: git-send-email 2.49.0.windows.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] amfenc: Fix for full PA queue 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: Araz Iusubov 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: Fixes AMF_INPUT_FULL errors with pre-analysis (PA) enabled. Added wait and poll encoder output to free up internal buffers before submitting new frames. Improves stability and performance by accounting for encoder and analysis stage queue limits (incl. lookahead buffering). Reproduce: ffmpeg.exe -y -r 60 -f lavfi -i testsrc=rate=60:size=3840x2160 -t 10 -pix_fmt yuv420p -an -c:v av1_amf -preset:v high_quality -profile:v main -quality:v high_quality -usage:v high_quality --- libavcodec/amfenc.c | 75 ++++++++++++++++++++++++++++++++++++--------- libavcodec/amfenc.h | 1 + 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c index 962bf6b006..9bf8be28dd 100644 --- a/libavcodec/amfenc.c +++ b/libavcodec/amfenc.c @@ -204,6 +204,16 @@ int av_cold ff_amf_encode_close(AVCodecContext *avctx) av_buffer_unref(&ctx->device_ctx_ref); av_fifo_freep2(&ctx->timestamp_list); + if (ctx->output_list) { + // release remaining AMF output buffers + while(av_fifo_can_read(ctx->output_list)) { + AMFBuffer* buffer = NULL; + av_fifo_read(ctx->output_list, &buffer, 1); + if(buffer != NULL) + buffer->pVtbl->Release(buffer); + } + av_fifo_freep2(&ctx->output_list); + } av_freep(&ctx->pts_property_name); av_freep(&ctx->av_frame_property_name); @@ -306,6 +316,10 @@ int ff_amf_encode_init(AVCodecContext *avctx) if (!ctx->timestamp_list) { return AVERROR(ENOMEM); } + ctx->output_list = av_fifo_alloc2(2, sizeof(AMFBuffer*), AV_FIFO_FLAG_AUTO_GROW); + if (!ctx->output_list) + return AVERROR(ENOMEM); + ctx->dts_delay = 0; ctx->hwsurfaces_in_queue = 0; @@ -639,6 +653,22 @@ static int amf_submit_frame_locked(AVCodecContext *avctx, AVFrame *frame, AMFSur amf_unlock_context(avctx); return ret; } +static AMF_RESULT amf_query_output(AVCodecContext *avctx, AMFBuffer **buffer) +{ + AMFEncoderContext *ctx = avctx->priv_data; + AMFData *data = NULL; + AMF_RESULT ret = ctx->encoder->pVtbl->QueryOutput(ctx->encoder, &data); + *buffer = NULL; + if (data) { + AMFGuid guid = IID_AMFBuffer(); + data->pVtbl->QueryInterface(data, &guid, (void**)buffer); // query for buffer interface + data->pVtbl->Release(data); + if (amf_release_attached_frame_ref(ctx, *buffer) == AMF_OK) + ctx->hwsurfaces_in_queue--; + ctx->encoded_frame++; + } + return ret; +} int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) { @@ -649,7 +679,7 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) AMF_RESULT res; int ret; AMF_RESULT res_query; - AMFData *data = NULL; + AMFBuffer* buffer = NULL; AVFrame *frame = av_frame_alloc(); int block_and_wait; int64_t pts = 0; @@ -659,6 +689,14 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) av_frame_free(&frame); return AVERROR(EINVAL); } + // check if some outputs are available + av_fifo_read(ctx->output_list, &buffer, 1); + if (buffer != NULL) { // return already retrieved output + ret = amf_copy_buffer(avctx, avpkt, buffer); + buffer->pVtbl->Release(buffer); + return ret; + } + ret = ff_encode_get_frame(avctx, frame); if(ret < 0){ if(ret != AVERROR_EOF){ @@ -698,20 +736,10 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) do { block_and_wait = 0; // poll data - - res_query = ctx->encoder->pVtbl->QueryOutput(ctx->encoder, &data); - if (data) { - // copy data to packet - AMFBuffer *buffer; - AMFGuid guid = IID_AMFBuffer(); - data->pVtbl->QueryInterface(data, &guid, (void**)&buffer); // query for buffer interface + res_query = amf_query_output(avctx, &buffer); + if (buffer) { ret = amf_copy_buffer(avctx, avpkt, buffer); - if (amf_release_attached_frame_ref(ctx, buffer) == AMF_OK) { - ctx->hwsurfaces_in_queue--; - } - ctx->encoded_frame++; buffer->pVtbl->Release(buffer); - data->pVtbl->Release(data); AMF_RETURN_IF_FALSE(ctx, ret >= 0, ret, "amf_copy_buffer() failed with error %d\n", ret); @@ -737,12 +765,29 @@ int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) if (res_query == AMF_EOF) { ret = AVERROR_EOF; - } else if (data == NULL) { + } else if (buffer == NULL) { ret = AVERROR(EAGAIN); } else { if(surface) { // resubmit surface - res = ctx->encoder->pVtbl->SubmitInput(ctx->encoder, (AMFData*)surface); + do { + res = ctx->encoder->pVtbl->SubmitInput(ctx->encoder, (AMFData*)surface); + if (res != AMF_INPUT_FULL) + break; + + if (!ctx->query_timeout_supported) + av_usleep(1000); + + // Need to free up space in the encoder queue. + // The number of retrieved outputs is limited currently to 21 + amf_query_output(avctx, &buffer); + if (buffer != NULL) { + ret = av_fifo_write(ctx->output_list, &buffer, 1); + if (ret < 0) + return ret; + } + } while(res == AMF_INPUT_FULL); + surface->pVtbl->Release(surface); if (res == AMF_INPUT_FULL) { av_log(avctx, AV_LOG_WARNING, "Data acquired but delayed SubmitInput returned AMF_INPUT_FULL- should not happen\n"); diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h index 4d4cd7d30f..8f5eb5a9ef 100644 --- a/libavcodec/amfenc.h +++ b/libavcodec/amfenc.h @@ -61,6 +61,7 @@ typedef struct AMFEncoderContext { int64_t dts_delay; int64_t submitted_frame; int64_t encoded_frame; + AVFifo *output_list; // common encoder options -- 2.45.2.windows.1 _______________________________________________ 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".