From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <ffmpeg-devel-bounces@ffmpeg.org>
Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100])
	by master.gitmailbox.com (Postfix) with ESMTPS id 700954BD8E
	for <ffmpegdev@gitmailbox.com>; Fri,  4 Apr 2025 16:18:19 +0000 (UTC)
Received: from [127.0.1.1] (localhost [127.0.0.1])
	by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4C682689D65;
	Fri,  4 Apr 2025 19:18:15 +0300 (EEST)
Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com
 [209.85.218.47])
 by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C2087687BFB
 for <ffmpeg-devel@ffmpeg.org>; Fri,  4 Apr 2025 19:18:08 +0300 (EEST)
Received: by mail-ej1-f47.google.com with SMTP id
 a640c23a62f3a-ac28e66c0e1so338648566b.0
 for <ffmpeg-devel@ffmpeg.org>; Fri, 04 Apr 2025 09:18:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1743783487; x=1744388287; 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=MC2zZ4lxQnUqFxlxvieqmnY20zH8QX42I0ZfSk98vIQ=;
 b=Q5fTR96MiQBhPgHxjlYOXvJ6kPD7FX65hvLdZg0YHvEtHgDikKsfMHv3XnByC6loxG
 rytW1mg+yndNR2nVhRj7aggYHuF92UdxpvmgnOlNMhAa/ZMaDeUdEDzqyKugWJ/5XNOH
 Vq/C77uA+QaYgVvDfS6gYqM8wtfZYwzD2c2sGgxd4E4YgCVBwEVO5s+3Kg/kAFb/YU2J
 kJctXpDG2ekOf1KGcB7mTlS7/3MgDLCTfzm1zX2U9JXQS+l2CnL4aPWaO/dReinyqp/t
 9DQssR89hM0vUg6rAdwWPRrXvKFnoKC3jss3ULqGZ1Np6BS3nxCnOogJtskta7CTRhH/
 yBRw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1743783487; x=1744388287;
 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=MC2zZ4lxQnUqFxlxvieqmnY20zH8QX42I0ZfSk98vIQ=;
 b=G0/vyRdsRYsl+inErtHGNl+A/zXaGbD4LISYYum996q3rFWrmVMBkRQKptS0FsorkN
 gctLSrKw+M/zkeAObxSxF0ZuxB/bgYEoZnlf560V2Wgdu6clrQ4X0+H1XjoRVm0jL0Sn
 ex2jiIw062J0YxrtpZpqGzUc7ntU2qmqK2scaUYameNeIAXG6kHO9WEoiOmkr1qglMhe
 RjPme63m5l4xxdJupymIAbRcVHJIpOVl6IhomFh1Azcn7iIuY2PQcOtivR5QZ5toxmQF
 Qgfgq4id6zpW9z3rYvkOB+PD2Kgu1cDzr/KpsiQmVDT/EYBFGZZyVElbXUMI8sfWVIqi
 /0ng==
X-Gm-Message-State: AOJu0YxCFyU8UZoxls9U0XlqplbeyU72eZvWHGPF1k7SjlZo2PrUXoVx
 /wwe2IZpIBBq+bLSFDvIJoUrRK1W60/Upn46or3Le2jty0IgFOcUuAxS1624kaA=
X-Gm-Gg: ASbGncsFV8DKcizHBuSwTtsaejHqB6DRydm1IaePQHJ2ypYma7LxgpRpx2zPAnmvDkh
 KiAIXeuisPSeklSaBUO+PdMFDHqbh53SQ49yoKJYtIiszAbTfr4OR2Vo67sGHXZXu7BFU+btjmm
 2q4wjbR/Oy+gKJ/GsjKQC5oq8T62B3+bCPMBEf12F1s834PBk2gbgweI54om+Knvxzw5NUYdLtN
 dIhp/Jo3ZC7hxVTiWerny8t8PsK0lVeHr9i+rBDbDiTdn7qr08S+UhfTq03KFsXxzsDYVQ5hPUj
 48aWiWXBzP2Vc6IXXIIkOQOglcEXYEKyuMdEMfRusHSdceeFolOkEaG0G2+K8hYtIsvgPpe1yqn
 JjVXa0woc/VyDptzw
X-Google-Smtp-Source: AGHT+IFv3Q66nCf93pbHjl0ur4/YUJtPAEDbKuV+h1B6DmjPrwhwFaD8qcI6EwEp2eaJ60xZVuSj1w==
X-Received: by 2002:a17:907:3e1b:b0:ac7:7d43:4535 with SMTP id
 a640c23a62f3a-ac7d6927509mr278262566b.0.1743783487013; 
 Fri, 04 Apr 2025 09:18:07 -0700 (PDT)
Received: from localhost.localdomain ([87.116.182.236])
 by smtp.gmail.com with ESMTPSA id
 a640c23a62f3a-ac7c0186250sm273150166b.155.2025.04.04.09.18.05
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Fri, 04 Apr 2025 09:18:06 -0700 (PDT)
From: Dmitrii Ovchinnikov <ovchinnikov.dmitrii@gmail.com>
To: ffmpeg-devel@ffmpeg.org
Date: Fri,  4 Apr 2025 18:17:52 +0200
Message-ID: <20250404161752.1244-1-ovchinnikov.dmitrii@gmail.com>
X-Mailer: git-send-email 2.47.1.windows.1
MIME-Version: 1.0
Subject: [FFmpeg-devel] [PATCH] avcodec/amfenc_av1: Add B-frame QP control
X-BeenThere: ffmpeg-devel@ffmpeg.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org>
List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe>
List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel>
List-Post: <mailto:ffmpeg-devel@ffmpeg.org>
List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help>
List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>,
 <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe>
Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Cc: Dmitrii Ovchinnikov <ovchinnikov.dmitrii@gmail.com>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: ffmpeg-devel-bounces@ffmpeg.org
Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org>
Archived-At: <https://master.gitmailbox.com/ffmpegdev/20250404161752.1244-1-ovchinnikov.dmitrii@gmail.com/>
List-Archive: <https://master.gitmailbox.com/ffmpegdev/>
List-Post: <mailto:ffmpegdev@gitmailbox.com>

---
 libavcodec/amfenc.h     |  2 ++
 libavcodec/amfenc_av1.c | 25 +++++++++++++++++++++++--
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/libavcodec/amfenc.h b/libavcodec/amfenc.h
index aec3a3f9ec..d716215035 100644
--- a/libavcodec/amfenc.h
+++ b/libavcodec/amfenc.h
@@ -106,6 +106,8 @@ typedef struct AMFEncoderContext {
     int                 max_qp_i;
     int                 min_qp_p;
     int                 max_qp_p;
+    int                 min_qp_b;
+    int                 max_qp_b;
     int                 tier;
 
     // AV1 - specific options
diff --git a/libavcodec/amfenc_av1.c b/libavcodec/amfenc_av1.c
index 33215311cd..399c032158 100644
--- a/libavcodec/amfenc_av1.c
+++ b/libavcodec/amfenc_av1.c
@@ -113,13 +113,16 @@ static const AVOption options[] = {
 
     { "high_motion_quality_boost_enable",   "Enable High motion quality boost mode",  OFFSET(hw_high_motion_quality_boost), AV_OPT_TYPE_BOOL,   {.i64 = -1 }, -1, 1, VE },
 
-    // min_qp_i -> min_qp_intra, min_qp_p -> min_qp_inter
+    // min_qp_i -> min_qp_intra, min_qp_p -> min_qp_p min_qp_b -> min_qp_b
     { "min_qp_i",               "min quantization parameter for I-frame",   OFFSET(min_qp_i),                       AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
     { "max_qp_i",               "max quantization parameter for I-frame",   OFFSET(max_qp_i),                       AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
     { "min_qp_p",               "min quantization parameter for P-frame",   OFFSET(min_qp_p),                       AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
     { "max_qp_p",               "max quantization parameter for P-frame",   OFFSET(max_qp_p),                       AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
+    { "min_qp_b",               "min quantization parameter for B-frame",   OFFSET(min_qp_b),                       AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
+    { "max_qp_b",               "max quantization parameter for B-frame",   OFFSET(max_qp_b),                       AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
     { "qp_p",                   "quantization parameter for P-frame",       OFFSET(qp_p),                           AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
     { "qp_i",                   "quantization parameter for I-frame",       OFFSET(qp_i),                           AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
+    { "qp_b",                   "quantization parameter for B-frame",       OFFSET(qp_b),                           AV_OPT_TYPE_INT, {.i64 = -1  }, -1, 255, VE },
     { "skip_frame",             "Rate Control Based Frame Skip",            OFFSET(skip_frame),                     AV_OPT_TYPE_BOOL,{.i64 = -1  }, -1, 1, VE },
 
     { "aq_mode",                "adaptive quantization mode",       OFFSET(aq_mode),      AV_OPT_TYPE_INT, {.i64 = -1  }, -1, AMF_VIDEO_ENCODER_AV1_AQ_MODE_CAQ, VE , .unit = "adaptive_quantisation_mode" },
@@ -309,7 +312,8 @@ static av_cold int amf_encode_init_av1(AVCodecContext* avctx)
     if (ctx->rate_control_mode == AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_UNKNOWN) {
         if (ctx->min_qp_i != -1 || ctx->max_qp_i != -1 ||
             ctx->min_qp_p != -1 || ctx->max_qp_p != -1 ||
-            ctx->qp_i != -1 || ctx->qp_p != -1) {
+            ctx->min_qp_b != -1 || ctx->max_qp_b != -1 ||
+            ctx->qp_i != -1 || ctx->qp_p != -1 || ctx->qp_b != -1) {
             ctx->rate_control_mode = AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_METHOD_CONSTANT_QP;
             av_log(ctx, AV_LOG_DEBUG, "Rate control turned to CQP\n");
         }
@@ -589,6 +593,13 @@ static av_cold int amf_encode_init_av1(AVCodecContext* avctx)
         int qval = avctx->qmin > 255 ? 255 : avctx->qmin;
         AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER, qval);
     }
+    if (ctx->min_qp_b != -1) {
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER_B, ctx->min_qp_b);
+    }
+    else if (avctx->qmin != -1) {
+        int qval = avctx->qmin > 255 ? 255 : avctx->qmin;
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_MIN_Q_INDEX_INTER_B, qval);
+    }
     if (ctx->max_qp_p != -1) {
         AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER, ctx->max_qp_p);
     }
@@ -596,6 +607,13 @@ static av_cold int amf_encode_init_av1(AVCodecContext* avctx)
         int qval = avctx->qmax > 255 ? 255 : avctx->qmax;
         AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER, qval);
     }
+    if (ctx->max_qp_b != -1) {
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER_B, ctx->max_qp_b);
+    }
+    else if (avctx->qmax != -1) {
+        int qval = avctx->qmax > 255 ? 255 : avctx->qmax;
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_MAX_Q_INDEX_INTER_B, qval);
+    }
 
     if (ctx->qp_p != -1) {
         AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER, ctx->qp_p);
@@ -603,6 +621,9 @@ static av_cold int amf_encode_init_av1(AVCodecContext* avctx)
     if (ctx->qp_i != -1) {
         AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTRA, ctx->qp_i);
     }
+    if (ctx->qp_b != -1) {
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_Q_INDEX_INTER_B, ctx->qp_b);
+    }
 
     if (ctx->skip_frame != -1) {
         AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_AV1_RATE_CONTROL_SKIP_FRAME, ((ctx->skip_frame == 0) ? false : true));
-- 
2.47.1.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".