From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 5314149EB5 for ; Wed, 15 May 2024 14:57:04 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0EDFC68D659; Wed, 15 May 2024 17:57:02 +0300 (EEST) Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E5366687F3E for ; Wed, 15 May 2024 17:56:55 +0300 (EEST) Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-1f0537e39b3so40956525ad.3 for ; Wed, 15 May 2024 07:56:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1715785013; x=1716389813; darn=ffmpeg.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=A3OXboLQpHdgFuFpm91TYabQLRCft6Mk3fpC2BPshFA=; b=F8OfAL13KPvXSheTCc+WBUICbWlkBJbtVm6snL2K3VTeZ41IX4X8zYI/ATZ9EuaKwo /8i5YdmA4+mAOq+ddH2mECtkVF7uFt2hEy3IHwDm2GrRBTz/xm1KaLc+HLLITKmxTdAR x0SJylCJRl+b7WpCxShMd9pfjemh3wTx45Oo+J0jkB+5J4yfLKbUHllNIu41PBhQ8vMm cZqj8eFJnKDBzStJ9n9ogM1t0Duljw7KA9VhLQALJjKrztdgRRpHhjvkdx1g7u+1HxrG wOQfdQpA1GH5v+EGzzHjAQrVaRL30sqzsXdsxJVfgUtsPrEQyZiBbd7YpDzsGFkzrqSJ Htxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715785013; x=1716389813; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=A3OXboLQpHdgFuFpm91TYabQLRCft6Mk3fpC2BPshFA=; b=hiKNbMVG9FM5juWTVl6buh7z2hyvm5WGSPMcsWbfr47IO1OJlDAGuVkNKGvNoSlK1c M2GPHzOg3YifD7k4VrksKpj3EKz4AglRWu3QTh9ZB1GXKwqvLs7xP20A95oyHTfnCgHz 0T+3C9EgcEMI7lCFIiw7ByvNDpxjtnVrZXWSt8hOo2/tGD5MndfQyxWz2OVIWXO7cZ65 nzj7/f37Uqr8//dFUNAJKz72hti00PczLtYzdm1OE/WIvsipqnpM4wm6yMV6k1QsCQSy OPWKYDdOEf87rRwADm0Pgi6h7xpnx6oaNKh2C9TB+JjaukOFaazaz93TqG16Gh/mGk2P QPFg== X-Gm-Message-State: AOJu0YzI6rxLpkXcD6LVhKRcQk2xcHLksMij1fO8SoMZycII771/4VVe C7M9+FsuwrrfZLaqpv3wgIu9jmOfcXj4F7RGeNVjxNWsmzvl0US2itoIwg== X-Google-Smtp-Source: AGHT+IHJNwuJUImzIhiKzpf0tHLOjJwxKT40a2i6gy55c/aCBn79zZnLOP1h7DiCZqz6BBknil4nfw== X-Received: by 2002:a17:902:ec89:b0:1eb:58d2:8739 with SMTP id d9443c01a7336-1ef43d0a009mr196811215ad.3.1715785013082; Wed, 15 May 2024 07:56:53 -0700 (PDT) Received: from [192.168.0.10] ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1ef0bad886csm119989195ad.70.2024.05.15.07.56.51 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 15 May 2024 07:56:52 -0700 (PDT) Message-ID: <0ea9cefa-c3cd-44f2-9cc1-fd6e2e3833a2@gmail.com> Date: Wed, 15 May 2024 11:57:02 -0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <59357F99-B77C-4ED5-96F9-9247AF91D0CD@svt.se> Content-Language: en-US From: James Almer In-Reply-To: <59357F99-B77C-4ED5-96F9-9247AF91D0CD@svt.se> Subject: Re: [FFmpeg-devel] [PATCH] libsvtav1: Enable 2-pass encoding 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 5/15/2024 11:14 AM, Fredrik Lundkvist via ffmpeg-devel wrote: > Currently, libsvtav1 does not send pass number or stat buffer to SVT-AV1, which means that 2-pass encoding is not possible using FFMPEG; > if a user wants to do 2-pass encoding using SVT-AV1, they have to use SvtAv1EncApp. > This patch adds 2-pass encoding support to libsvtav1 using the stats buffers provided by the AVCodecContext. > When encoding the first pass using SVT-AV1, the following should be logged: > Svt[info]: SVT [config]: preset : Pass 1 > Indicating that the encoder knows that it is performing the first pass, activating a special preset. > With the patch applied: > ffmpeg -i input.mp4 -c:v libsvtav1 -an -pass 1 -b:v 1M -f null /dev/null > [...] > Svt[info]: ------------------------------------------- > Svt[info]: SVT [config]: preset : Pass 1 > Svt[info]: ------------------------------------------- > [...] > > Signed-off-by: Fredrik Lundkvist > > --- > libavcodec/libsvtav1.c | 47 +++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 46 insertions(+), 1 deletion(-) > > diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c > index 9bc165f0cf..be2189399f 100644 > --- a/libavcodec/libsvtav1.c > +++ b/libavcodec/libsvtav1.c > @@ -25,6 +25,7 @@ > #include > #include > > +#include "libavutil/base64.h" > #include "libavutil/common.h" > #include "libavutil/frame.h" > #include "libavutil/imgutils.h" > @@ -226,6 +227,34 @@ static int config_enc_params(EbSvtAv1EncConfiguration *param, > param->max_qp_allowed = avctx->qmax; > param->min_qp_allowed = avctx->qmin; > } > + > + if (avctx->flags & AV_CODEC_FLAG_PASS2) { > + int decode_size, ret; > + if(!avctx->stats_in) { if (... > + av_log(avctx, AV_LOG_ERROR, "No stats file for second pass\n"); > + return AVERROR_INVALIDDATA; > + } > + param->rc_stats_buffer.sz = strlen(avctx->stats_in) * 3 / 4; nit: AV_BASE64_DECODE_SIZE > + ret = av_reallocp(¶m->rc_stats_buffer.buf, param->rc_stats_buffer.sz); Why realloc instead of malloc? > + if (ret < 0) { > + av_log(avctx, AV_LOG_ERROR, > + "Stat buffer alloc (%"SIZE_SPECIFIER" bytes) failed \n", > + param->rc_stats_buffer.sz > + ); > + param->rc_stats_buffer.sz = 0; > + return ret; > + } > + decode_size = av_base64_decode(param->rc_stats_buffer.buf, avctx->stats_in, param->rc_stats_buffer.sz); > + if (decode_size < 0) { Wouldn't it be safer to free rc_stats_buffer.buf and set rc_stats_buffer.sz to 0 on failure here too? > + av_log(avctx, AV_LOG_ERROR, "Stat buffer decode failed\n"); > + return AVERROR_INVALIDDATA; > + } > + param->rc_stats_buffer.sz = decode_size; > + param->pass = 2; > + } else if (avctx->flags & AV_CODEC_FLAG_PASS1) { No brackets for single line blocks. > + param->pass = 1; > + } > + > param->max_bit_rate = avctx->rc_max_rate; > if ((avctx->bit_rate > 0 || avctx->rc_max_rate > 0) && avctx->rc_buffer_size) > param->maximum_buffer_size_ms = > @@ -618,6 +647,23 @@ static int eb_receive_packet(AVCodecContext *avctx, AVPacket *pkt) > if (headerPtr->flags & EB_BUFFERFLAG_EOS) { > svt_enc->eos_flag = EOS_RECEIVED; > svt_av1_enc_release_out_buffer(&headerPtr); > + if (avctx->flags & AV_CODEC_FLAG_PASS1) { > + SvtAv1FixedBuf first_pass_stats; > + EbErrorType ret = svt_av1_enc_get_stream_info(svt_enc->svt_handle, SVT_AV1_STREAM_INFO_FIRST_PASS_STATS_OUT, &first_pass_stats); svt_ret. Don't shadow ret. Also, consider splitting this line. > + if (ret == EB_ErrorNone) { > + size_t b64_size = AV_BASE64_SIZE(first_pass_stats.sz); > + > + avctx->stats_out = av_malloc(b64_size); > + if(!avctx->stats_out) { Missing space after the if again. > + av_log(avctx, AV_LOG_ERROR, "Stat buffer alloc (%"SIZE_SPECIFIER" bytes) failed\n", > + b64_size); > + return AVERROR(ENOMEM); > + } > + av_base64_encode(avctx->stats_out, b64_size, first_pass_stats.buf, first_pass_stats.sz); Unchecked return value. > + } else { Single line block again. > + av_log(avctx, AV_LOG_ERROR, "Failed to get stream info"); > + } > + } > return AVERROR_EOF; > } > #endif > @@ -681,7 +727,6 @@ static av_cold int eb_enc_close(AVCodecContext *avctx) > svt_metadata_array_free(&svt_enc->in_buf->metadata); > av_freep(&svt_enc->in_buf); > } > - Spurious change. > av_buffer_pool_uninit(&svt_enc->pool); > av_frame_free(&svt_enc->frame); > ff_dovi_ctx_unref(&svt_enc->dovi); > -- > 2.39.3 (Apple Git-145) > _______________________________________________ > 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". _______________________________________________ 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".