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 0802B4007D for ; Fri, 19 Dec 2025 11:12:05 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'mglXrJOdQ6NtDwxm+XHx//GXRy3Qw9htALZuGA4J4zM=', expected b'zO/p/wV0OhtXBPuo6rulzkmteQLFjpdEnnKYw9SxwaE=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1766142710; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=mglXrJOdQ6NtDwxm+XHx//GXRy3Qw9htALZuGA4J4zM=; b=FwdN6pEpYDimUopuk+ArqqEYeKIbB7XdIWbG5NRZhmy1BHme+WD4f8lFiO8XoNkU3Pq4A e4JXauCKrbogyv8LAaFnJZ7GS2bcsjwkqOdkreHFt9zNGgg4fYe0JRdvNrgGWbo1/0iCK2U lZDunr2mJ3Wf0idDQPd3TDbD1wa+YEDOkqHEzcm2EGDN3vNO0YlTajDX30hHlmU+io/X+Az vRLT/lTP2PHI/iaTr5xK3UadM2lHOr0RL1Pd221zY5Zse5O3smxXE4NZ1UQMnUSw6OHFTWI L657mKOhTIqV55BWFyCbt6mHNyr1nQTtCpNya0bg+Hm57L3I6cDMMm2M7dEA== Received: from [172.20.0.2] (unknown [172.19.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 8F454690A00; Fri, 19 Dec 2025 13:11:50 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1766142698; b=qwVEMtaAVK4DtQuViJAGZTThe5l6MoQkt2QpmxXZbq8L1R29ZocS7L7JduaPBzyuGggsT g30boCUbqpvhtQ6tcAA0D0696hEeDiMM9efUe3XQA8AokdZh2I3HWhP2k+ZHFIfPkROWj3u Hd3NgHouI/SFgTJZ4+RsRzASVYbW0er+Ff78n6TaozCHow1AhCSM9HCYAC8anYsTfkErTKi m0IXf3NV4whSK4tjIeLTlQp3G6Y4oVU6kL5EUcLINKlZyvgUV35M1iZPIinEKwoQQKN+rK/ F13SnmbMi1qzpCPg/MheJqR8J1xGTCONTkZe75tb/QGwI9a/Y/6xx8/+uZmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1766142698; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=Aptawmh1tlkrYrKob9neGrQ+YwuVYIsjswOQIguhV4M=; b=FrwqQAF5mfoSUDOq+mHFqSwh8VJtH6ptDzwWBaXR6YCV6q4cOcHPCiMgCcS2dg3UcHLCm nC0/+sBUhO3pA18d3RRYwnKwYJsyHX+Nl+9YafHx2T5L34hYa6YMHu9quhqVluFeU1eno/N llhRQy0iT595lBEqATp/lcP9/jFEQG02mur0V8TO32Ce1/IlcDHSYJs09G5TeUIdvfQLw40 QJFS2TEDy+PnkHmGINuB5rgMT66bWIX1bGp61oqWSscVghoo2JRaZoAmN2w7aNgMXitM7e3 lxQpZV6cIBI9kB4Jm6773wrx11pY8KPTG9hYAMcl2aAdQCSRGavb6Tj12PiA== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1766142689; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=zO/p/wV0OhtXBPuo6rulzkmteQLFjpdEnnKYw9SxwaE=; b=YVwJCBBCpRQJ9JSG7ikSZCbQeVx4o41d8yqOS/+MUpW31cijb+Hz6LoeW9KZ3jLhE20gC RsnlQwarLSgCmOIG3Z99MDRHdTY9RcPO78jwM8kONYOs2ZdEd4usVMe12Cq2lsvmnS0ulCk ZeBxx/pGEcOzT9f2Nw7yIEbsheVY4tshayJgHARwE+D73BE3EA4nkAvN0nsQR8syAr6kqsN u1CSiHmNOHy/dsvW+FImSeWqWRjy/pWhbOXGoCESTW//MKXw/KM4trcfmAlp/3SbJ+Qve2f +WC76icwODS4kAS1uIrd30pkE/+MHQDrZMnWkkIJvgHXv/K0+9FwzC0plwAA== Received: from 55ca25703178 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 4E5A1690941 for ; Fri, 19 Dec 2025 13:11:29 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Dec 2025 11:11:28 -0000 Message-ID: <176614268946.60.306124374495035774@2cb04c0e5124> Message-ID-Hash: ABPSAT34RQ3J4HBHCIT6PNFTT25KY2CM X-Message-ID-Hash: ABPSAT34RQ3J4HBHCIT6PNFTT25KY2CM X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] libsvtav1: Enable 2-pass encoding (PR #21239) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Werner Robitza via ffmpeg-devel Cc: Werner Robitza Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #21239 opened by Werner Robitza (slhck) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21239 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21239.patch This patch enables two-pass encoding for libsvtav1 by implementing support for AV_CODEC_FLAG_PASS1 and AV_CODEC_FLAG_PASS2. Previously, users requiring two-pass encoding with SVT-AV1 had to use the standalone SvtAv1EncApp tool. This patch allows 2-pass encoding directly through FFmpeg. Based on patch by Fredrik Lundkvist, with review feedback from James Almer and Andreas Rheinhardt. See: https://ffmpeg.org/pipermail/ffmpeg-devel/2024-May/327452.html Changes: - Use AV_BASE64_DECODE_SIZE macro for buffer size calculation - Allocate own buffer for rc_stats_buffer (non-ownership pointer) - Error handling with buffer cleanup Signed-off-by: Werner Robitza >>From 7b70b050c059feea1a00cc0c9b0fbbca1b8ef2ab Mon Sep 17 00:00:00 2001 From: Werner Robitza Date: Fri, 19 Dec 2025 11:37:28 +0100 Subject: [PATCH] libsvtav1: Enable 2-pass encoding This patch enables two-pass encoding for libsvtav1 by implementing support for AV_CODEC_FLAG_PASS1 and AV_CODEC_FLAG_PASS2. Previously, users requiring two-pass encoding with SVT-AV1 had to use the standalone SvtAv1EncApp tool. This patch allows 2-pass encoding directly through FFmpeg. Based on patch by Fredrik Lundkvist, with review feedback from James Almer and Andreas Rheinhardt. See: https://ffmpeg.org/pipermail/ffmpeg-devel/2024-May/327452.html Changes: - Use AV_BASE64_DECODE_SIZE macro for buffer size calculation - Allocate own buffer for rc_stats_buffer (non-ownership pointer) - Error handling with buffer cleanup Signed-off-by: Werner Robitza --- libavcodec/libsvtav1.c | 83 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c index 7047b72422..e2b589ec89 100644 --- a/libavcodec/libsvtav1.c +++ b/libavcodec/libsvtav1.c @@ -21,6 +21,7 @@ */ #include +#include #include #include #include @@ -28,6 +29,7 @@ #include "libavutil/common.h" #include "libavutil/frame.h" #include "libavutil/imgutils.h" +#include "libavutil/base64.h" #include "libavutil/intreadwrite.h" #include "libavutil/mastering_display_metadata.h" #include "libavutil/mem.h" @@ -65,6 +67,8 @@ typedef struct SvtContext { DOVIContext dovi; + uint8_t *stats_buf; + // User options. AVDictionary *svtav1_opts; int enc_mode; @@ -337,6 +341,42 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param, return AVERROR(ENOSYS); } #endif + if (avctx->flags & AV_CODEC_FLAG_PASS2) { + int stats_sz; + + if (!avctx->stats_in) { + av_log(avctx, AV_LOG_ERROR, "No stats file for second pass\n"); + return AVERROR(EINVAL); + } + + stats_sz = AV_BASE64_DECODE_SIZE(strlen(avctx->stats_in)); + if (stats_sz <= 0) { + av_log(avctx, AV_LOG_ERROR, "Invalid stats file size\n"); + return AVERROR(EINVAL); + } + + svt_enc->stats_buf = av_malloc(stats_sz); + if (!svt_enc->stats_buf) { + av_log(avctx, AV_LOG_ERROR, "Failed to allocate stats buffer\n"); + return AVERROR(ENOMEM); + } + + stats_sz = av_base64_decode(svt_enc->stats_buf, avctx->stats_in, stats_sz); + if (stats_sz < 0) { + av_log(avctx, AV_LOG_ERROR, "Failed to decode stats file\n"); + av_freep(&svt_enc->stats_buf); + return AVERROR(EINVAL); + } + + param->rc_stats_buffer.buf = svt_enc->stats_buf; + param->rc_stats_buffer.sz = stats_sz; + param->pass = 2; + + av_log(avctx, AV_LOG_INFO, "Using %d bytes of 2-pass stats\n", stats_sz); + } else if (avctx->flags & AV_CODEC_FLAG_PASS1) { + param->pass = 1; + av_log(avctx, AV_LOG_INFO, "Starting first pass\n"); + } param->source_width = avctx->width; param->source_height = avctx->height; @@ -614,9 +654,45 @@ static int eb_receive_packet(AVCodecContext *avctx, AVPacket *pkt) #if SVT_AV1_CHECK_VERSION(2, 0, 0) if (headerPtr->flags & EB_BUFFERFLAG_EOS) { - svt_enc->eos_flag = EOS_RECEIVED; - svt_av1_enc_release_out_buffer(&headerPtr); - return AVERROR_EOF; + if (avctx->flags & AV_CODEC_FLAG_PASS1) { + SvtAv1FixedBuf first_pass_stats = { NULL, 0 }; + EbErrorType svt_ret_stats; + int b64_size; + + svt_ret_stats = svt_av1_enc_get_stream_info( + svt_enc->svt_handle, + SVT_AV1_STREAM_INFO_FIRST_PASS_STATS_OUT, + &first_pass_stats); + + if (svt_ret_stats != EB_ErrorNone) { + av_log(avctx, AV_LOG_ERROR, + "Failed to get first pass stats\n"); + svt_av1_enc_release_out_buffer(&headerPtr); + return AVERROR_EXTERNAL; + } + + if (first_pass_stats.sz > 0 && first_pass_stats.buf) { + b64_size = AV_BASE64_SIZE(first_pass_stats.sz); + avctx->stats_out = av_malloc(b64_size); + if (!avctx->stats_out) { + av_log(avctx, AV_LOG_ERROR, + "Failed to allocate stats output buffer\n"); + svt_av1_enc_release_out_buffer(&headerPtr); + return AVERROR(ENOMEM); + } + + av_base64_encode(avctx->stats_out, b64_size, + first_pass_stats.buf, first_pass_stats.sz); + + av_log(avctx, AV_LOG_INFO, + "First pass stats: %"PRIu64" bytes, encoded to %d bytes\n", + first_pass_stats.sz, b64_size); + } + } + + svt_enc->eos_flag = EOS_RECEIVED; + svt_av1_enc_release_out_buffer(&headerPtr); + return AVERROR_EOF; } #endif @@ -684,6 +760,7 @@ static av_cold int eb_enc_close(AVCodecContext *avctx) av_buffer_pool_uninit(&svt_enc->pool); av_frame_free(&svt_enc->frame); ff_dovi_ctx_unref(&svt_enc->dovi); + av_freep(&svt_enc->stats_buf); return 0; } -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org