Implement Variance Boost strength

Use the existing AV1E_SET_DELTAQ_STRENGTH codec control to specify
Variance Boost strength.

The provided value is specified as a percentage. For example, to
make Variance Boost 25% stronger, use `--deltaq-strength=125`.

Bug: aomedia:401234702
Change-Id: I74c75d3d1e71a3ec68681681c1b123202b5f1927
diff --git a/av1/arg_defs.c b/av1/arg_defs.c
index eccaea9..81d00c4 100644
--- a/av1/arg_defs.c
+++ b/av1/arg_defs.c
@@ -560,7 +560,7 @@
               "Variance Boost all intra); requires --enable-tpl-model=1"),
   .deltaq_strength = ARG_DEF(NULL, "deltaq-strength", 1,
                              "Deltaq strength for"
-                             " --deltaq-mode=4 (%)"),
+                             " --deltaq-mode=4 and --deltaq-mode=6 (%)"),
   .deltalf_mode = ARG_DEF(NULL, "delta-lf-mode", 1,
                           "Enable delta-lf-mode (0: off (default), 1: on)"),
   .frame_periodic_boost =
diff --git a/av1/encoder/allintra_vis.c b/av1/encoder/allintra_vis.c
index b9398e4..50e0ba2 100644
--- a/av1/encoder/allintra_vis.c
+++ b/av1/encoder/allintra_vis.c
@@ -1077,11 +1077,15 @@
   // Variance Boost only supports 64x64 SBs.
   assert(cm->seq_params->sb_size == BLOCK_64X64);
 
-  // Strength is currently hard-coded and optimized for still pictures. In the
-  // future, we might want to expose this as a parameter that can be fine-tuned
-  // by the caller.
-  const int strength = 3;
   unsigned int variance = av1_get_variance_boost_block_variance(cpi, x);
+  // Compute Variance Boost strength from the deltaq_strength value.
+  double strength = (cpi->oxcf.q_cfg.deltaq_strength / 100.0) * 3.0;
+
+  // Clamp strength to a reasonable range.
+  // deltaq_strength can go up to 1000%, which is too strong for the Variance
+  // Boost scaling. Testing revealed strengths as high as 6 (200%) are still
+  // reasonable for some specific scenarios.
+  strength = fclamp(strength, 0.0, 6.0);
 
   // Variance = 0 areas are either completely flat patches or have very fine
   // gradients. Boost these blocks as if they have a variance of 1.
@@ -1092,8 +1096,6 @@
   // Compute a boost based on a fast-growing formula.
   // High and medium variance SBs essentially get no boost, while lower variance
   // SBs get increasingly stronger boosts.
-  assert(strength >= 1 && strength <= 4);
-
   // Still picture curve, with variance crossover point at 1024.
   double qstep_ratio = 0.15 * strength * (-log2((double)variance) + 10.0) + 1.0;
   qstep_ratio = fclamp(qstep_ratio, 1.0, VAR_BOOST_MAX_BOOST);