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 ESMTPS id 13E0E4BDF6 for ; Wed, 22 Jan 2025 02:55:34 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 821D668B890; Wed, 22 Jan 2025 04:54:34 +0200 (EET) Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 12B6B68B870 for ; Wed, 22 Jan 2025 04:54:28 +0200 (EET) Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2165cb60719so106613555ad.0 for ; Tue, 21 Jan 2025 18:54:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1737514465; x=1738119265; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=QXavtl9TAiZNJMs0cWpwyCIt8AFLbWFf0JhWR10rG9U=; b=jRmItbXK4miQoOXyHv0L0DX/NtxmSZv7CjNyhc/3QSWonn6zgM+9yDndDbq9h31QnE cEQnAUaJNZUVU35xXoYKpk94UN+SA4Yq8S6TwUU31qmbfeHkTxMz8yovJ/R32ESyY8MR i4GaikBUAKwJCMkL7OP9rgC9LJOtYVxJFG4k917tQmtX9enyXQZnRN96XIJm5wi1Fj5f 6cVvYfCL36WOt9RHO7r1KAKGhM6+TIZjcnKtBf1oj0a8+inKTi067o5JhOOz849StDiq Ln/sTnt+UNhphvFjvhmF8wyTCNUbbkr5m3hSzXoi+aJsd26OVKl617cx6YpPJvlSI18O mVrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737514465; x=1738119265; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QXavtl9TAiZNJMs0cWpwyCIt8AFLbWFf0JhWR10rG9U=; b=YrhiI749SVgbGWiCeoAW88+TfRZVctf6+UETvSO0d1U52ftOOeWIEjffkSsJki2IvU hOq2q0sK78MN9ETW30Pb5xY0Szywi2AgFjjBpxwxUgCahy1QHFM3ScGe4kF9iPUftfnQ rV4SP28SLeXVhI847eVObBRLZfPzGoTiFHKlxqtlaxuRlgJAs2h5SDAmoWkr/lW1dQzh RZb89CeTtm2TRFd3kd4L1iUyY7Ysh64L33M4a7nYWxn+puXdOC8ts4vXyRYC6p8+qTzP /3RzISdROetA5RIW4rzOYEK6m+YRYtYa4gjksuf7HM+AFxzAFg8tXXzLZMYAry7WPSmO DCeA== X-Gm-Message-State: AOJu0YwquY46ZvZddkhDGLdR8gKGcc+lHsK7D/twtpYjE3F2FZkvDvJ0 t+T3mZAFzrYQu1/JxniElzQfsEo/aj7RDTveLqn0srXjb/sTGP3vKuNm9A== X-Gm-Gg: ASbGncsRFZlk+Ls/7xx3gjnQw+Tvbs4hHB4rJ2vyEeZWKKH8P9pAMIModAt2znxyMfN Sh0mmR88orV4XVj+0L7j2ucPh6uKeV1P2F3jo8DSNfH7e7ngm3ftGS+rslkmcidlKAlqnk4o7aF Fz1w7e59U3i1YjUyuY/cTtS+yU4UdlHHErXVHFAp+FIoNOBWbqvI6ydCPjwz1pYJ2b1/GrLTWVw BIBBRdfg19lXqosr8pIOf8MaZuu+RKoq7Jzk2YneLUNgpoF4EnrBkCqr9AVn7vAUQqHOS5cqhRv qyw/Gm8JHA== X-Google-Smtp-Source: AGHT+IEH7uK9Y8AMB9ed/favgaMEZxZT6Qq9fPt+iQJSWDIdRZVS4z+eT742Hg79Eh9mhVp9M4hCmQ== X-Received: by 2002:a17:902:e548:b0:215:e98c:c5bb with SMTP id d9443c01a7336-21c3555353dmr302378995ad.28.1737514465452; Tue, 21 Jan 2025 18:54:25 -0800 (PST) Received: from localhost.localdomain ([2800:2121:b040:c:5b7:a27f:554b:498a]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-21c2d3efb4csm84817225ad.201.2025.01.21.18.54.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2025 18:54:24 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Jan 2025 23:54:03 -0300 Message-ID: <20250122025403.14457-7-jamrial@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250122025403.14457-1-jamrial@gmail.com> References: <20250122025403.14457-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/7] avcodec/libx264: add support for param change frame side data 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-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: Signed-off-by: James Almer --- libavcodec/libx264.c | 98 ++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 409f45fc7d..c64c2a28b0 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -194,54 +194,64 @@ static int encode_nals(AVCodecContext *ctx, AVPacket *pkt, return 1; } -static void reconfig_encoder(AVCodecContext *ctx, const AVFrame *frame) +static void reconfig_encoder(AVCodecContext *ctx) { X264Context *x4 = ctx->priv_data; - AVFrameSideData *side_data; + if (x4->avcintra_class >= 0) + return; - if (x4->avcintra_class < 0) { - if (x4->params.b_interlaced && x4->params.b_tff != !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST)) { + if (x4->params.vui.i_sar_height*ctx->sample_aspect_ratio.num != ctx->sample_aspect_ratio.den * x4->params.vui.i_sar_width) { + x4->params.vui.i_sar_height = ctx->sample_aspect_ratio.den; + x4->params.vui.i_sar_width = ctx->sample_aspect_ratio.num; + x264_encoder_reconfig(x4->enc, &x4->params); + } - x4->params.b_tff = !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST); - x264_encoder_reconfig(x4->enc, &x4->params); - } - if (x4->params.vui.i_sar_height*ctx->sample_aspect_ratio.num != ctx->sample_aspect_ratio.den * x4->params.vui.i_sar_width) { - x4->params.vui.i_sar_height = ctx->sample_aspect_ratio.den; - x4->params.vui.i_sar_width = ctx->sample_aspect_ratio.num; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->params.rc.i_vbv_buffer_size != ctx->rc_buffer_size / 1000 || + x4->params.rc.i_vbv_max_bitrate != ctx->rc_max_rate / 1000) { + x4->params.rc.i_vbv_buffer_size = ctx->rc_buffer_size / 1000; + x4->params.rc.i_vbv_max_bitrate = ctx->rc_max_rate / 1000; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->params.rc.i_vbv_buffer_size != ctx->rc_buffer_size / 1000 || - x4->params.rc.i_vbv_max_bitrate != ctx->rc_max_rate / 1000) { - x4->params.rc.i_vbv_buffer_size = ctx->rc_buffer_size / 1000; - x4->params.rc.i_vbv_max_bitrate = ctx->rc_max_rate / 1000; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->params.rc.i_rc_method == X264_RC_ABR && + x4->params.rc.i_bitrate != ctx->bit_rate / 1000) { + x4->params.rc.i_bitrate = ctx->bit_rate / 1000; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->params.rc.i_rc_method == X264_RC_ABR && - x4->params.rc.i_bitrate != ctx->bit_rate / 1000) { - x4->params.rc.i_bitrate = ctx->bit_rate / 1000; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->crf >= 0 && + x4->params.rc.i_rc_method == X264_RC_CRF && + x4->params.rc.f_rf_constant != x4->crf) { + x4->params.rc.f_rf_constant = x4->crf; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->crf >= 0 && - x4->params.rc.i_rc_method == X264_RC_CRF && - x4->params.rc.f_rf_constant != x4->crf) { - x4->params.rc.f_rf_constant = x4->crf; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->params.rc.i_rc_method == X264_RC_CQP && + x4->cqp >= 0 && + x4->params.rc.i_qp_constant != x4->cqp) { + x4->params.rc.i_qp_constant = x4->cqp; + x264_encoder_reconfig(x4->enc, &x4->params); + } - if (x4->params.rc.i_rc_method == X264_RC_CQP && - x4->cqp >= 0 && - x4->params.rc.i_qp_constant != x4->cqp) { - x4->params.rc.i_qp_constant = x4->cqp; - x264_encoder_reconfig(x4->enc, &x4->params); - } + if (x4->crf_max >= 0 && + x4->params.rc.f_rf_constant_max != x4->crf_max) { + x4->params.rc.f_rf_constant_max = x4->crf_max; + x264_encoder_reconfig(x4->enc, &x4->params); + } +} - if (x4->crf_max >= 0 && - x4->params.rc.f_rf_constant_max != x4->crf_max) { - x4->params.rc.f_rf_constant_max = x4->crf_max; +static void reconfig_encoder_from_frame(AVCodecContext *ctx, const AVFrame *frame) +{ + X264Context *x4 = ctx->priv_data; + AVFrameSideData *side_data; + + reconfig_encoder(ctx); + + if (x4->avcintra_class < 0) { + if (x4->params.b_interlaced && x4->params.b_tff != !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST)) { + + x4->params.b_tff = !!(frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST); x264_encoder_reconfig(x4->enc, &x4->params); } } @@ -528,7 +538,7 @@ static int setup_frame(AVCodecContext *ctx, const AVFrame *frame, pic->i_type = X264_TYPE_AUTO; break; } - reconfig_encoder(ctx, frame); + reconfig_encoder_from_frame(ctx, frame); if (x4->a53_cc) { void *sei_data; @@ -759,6 +769,14 @@ static void X264_flush(AVCodecContext *avctx) x4->sei_size = -x4->sei_size; } +static av_cold int X264_reconf(AVCodecContext *avctx) +{ + X264Context *x4 = avctx->priv_data; + + reconfig_encoder(avctx); + return 0; +} + static av_cold int X264_close(AVCodecContext *avctx) { X264Context *x4 = avctx->priv_data; @@ -1624,6 +1642,7 @@ const FFCodec ff_libx264_encoder = { AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE | AV_CODEC_CAP_ENCODER_FLUSH | + AV_CODEC_CAP_PARAM_CHANGE | AV_CODEC_CAP_ENCODER_RECON_FRAME, .p.priv_class = &x264_class, .p.wrapper_name = "libx264", @@ -1631,6 +1650,7 @@ const FFCodec ff_libx264_encoder = { .init = X264_init, FF_CODEC_ENCODE_CB(X264_frame), .flush = X264_flush, + .reconf = X264_reconf, .close = X264_close, .defaults = x264_defaults, .p.pix_fmts = pix_fmts_all, -- 2.48.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".