FG8 combined test: Test25

Test for FG8 context reduction activity: Tests 25

STATS_CHANGED
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 83dda29..6ec926a 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1914,16 +1914,27 @@
 }
 
 #if CONFIG_IBC_BV_IMPROVEMENT
-static void read_intrabc_drl_idx(int max_ref_bv_cnt, FRAME_CONTEXT *ec_ctx,
+static void read_intrabc_drl_idx(int max_ref_bv_cnt,
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                                 FRAME_CONTEXT *ec_ctx,
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
                                  MB_MODE_INFO *mbmi, aom_reader *r) {
   mbmi->intrabc_drl_idx = 0;
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
   int bit_cnt = 0;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   for (int idx = 0; idx < max_ref_bv_cnt - 1; ++idx) {
+#if CONFIG_BYPASS_INTRABC_DRL_IDX
+    const int intrabc_drl_idx = aom_read_bit(r, ACCT_INFO());
+#else
     const int intrabc_drl_idx = aom_read_symbol(
         r, ec_ctx->intrabc_drl_idx_cdf[bit_cnt], 2, ACCT_INFO());
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
     mbmi->intrabc_drl_idx = idx + intrabc_drl_idx;
     if (!intrabc_drl_idx) break;
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
     ++bit_cnt;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   }
   assert(mbmi->intrabc_drl_idx < max_ref_bv_cnt);
 }
@@ -2016,7 +2027,11 @@
     mbmi->intrabc_mode =
         aom_read_symbol(r, ec_ctx->intrabc_mode_cdf, 2, ACCT_INFO());
 #if CONFIG_IBC_MAX_DRL
-    read_intrabc_drl_idx(cm->features.max_bvp_drl_bits + 1, ec_ctx, mbmi, r);
+    read_intrabc_drl_idx(cm->features.max_bvp_drl_bits + 1,
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                         ec_ctx,
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
+                         mbmi, r);
 #else
     read_intrabc_drl_idx(MAX_REF_BV_STACK_SIZE, ec_ctx, mbmi, r);
 #endif  // CONFIG_IBC_MAX_DRL
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 5102cbb..4668853 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3009,7 +3009,10 @@
 }
 
 #if CONFIG_IBC_BV_IMPROVEMENT
-static void write_intrabc_drl_idx(int max_ref_bv_num, FRAME_CONTEXT *ec_ctx,
+static void write_intrabc_drl_idx(int max_ref_bv_num,
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                                  FRAME_CONTEXT *ec_ctx,
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
                                   const MB_MODE_INFO *mbmi,
                                   const MB_MODE_INFO_EXT_FRAME *mbmi_ext_frame,
                                   aom_writer *w) {
@@ -3021,13 +3024,21 @@
 #endif
   assert(mbmi->intrabc_drl_idx < max_ref_bv_num);
   (void)mbmi_ext_frame;
-
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
   int bit_cnt = 0;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   for (int idx = 0; idx < max_ref_bv_num - 1; ++idx) {
+#if CONFIG_BYPASS_INTRABC_DRL_IDX
+    aom_write_bit(w, mbmi->intrabc_drl_idx != idx);
+#else
     aom_write_symbol(w, mbmi->intrabc_drl_idx != idx,
                      ec_ctx->intrabc_drl_idx_cdf[bit_cnt], 2);
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
+
     if (mbmi->intrabc_drl_idx == idx) break;
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
     ++bit_cnt;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   }
 }
 #endif  // CONFIG_IBC_BV_IMPROVEMENT
@@ -3080,7 +3091,10 @@
 #else
         MAX_REF_BV_STACK_SIZE,
 #endif  // CONFIG_IBC_MAX_DRL
-        ec_ctx, mbmi, mbmi_ext_frame, w);
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+        ec_ctx,
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
+        mbmi, mbmi_ext_frame, w);
 
 #if CONFIG_IBC_SUBPEL_PRECISION
     if (is_intraBC_bv_precision_active(mbmi->intrabc_mode)) {
diff --git a/av1/encoder/mcomp.c b/av1/encoder/mcomp.c
index b8ceec1..2714ec1 100644
--- a/av1/encoder/mcomp.c
+++ b/av1/encoder/mcomp.c
@@ -2911,15 +2911,27 @@
 #endif  // CONFIG_IBC_SUBPEL_PRECISION
 }
 
-int av1_get_intrabc_drl_idx_cost(int max_ref_bv_num, int intrabc_drl_idx,
-                                 const MACROBLOCK *x) {
+int av1_get_intrabc_drl_idx_cost(int max_ref_bv_num, int intrabc_drl_idx
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                                 ,
+                                 const MACROBLOCK *x
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
+) {
   assert(intrabc_drl_idx < max_ref_bv_num);
   int cost = 0;
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
   int bit_cnt = 0;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   for (int idx = 0; idx < max_ref_bv_num - 1; ++idx) {
+#if CONFIG_BYPASS_INTRABC_DRL_IDX
+    cost += av1_cost_literal(1);
+#else
     cost += x->mode_costs.intrabc_drl_idx_cost[bit_cnt][intrabc_drl_idx != idx];
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
     if (intrabc_drl_idx == idx) return cost;
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
     ++bit_cnt;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   }
   return cost;
 }
@@ -2934,7 +2946,12 @@
   ref_bv_cost += x->mode_costs.intrabc_mode_cost[intrabc_mode];
   ref_bv_cost +=
 #if CONFIG_IBC_BV_IMPROVEMENT && CONFIG_IBC_MAX_DRL
-      av1_get_intrabc_drl_idx_cost(max_bvp_drl_bits + 1, intrabc_drl_idx, x);
+      av1_get_intrabc_drl_idx_cost(max_bvp_drl_bits + 1, intrabc_drl_idx
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                                   ,
+                                   x
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
+      );
 #else
       av1_get_intrabc_drl_idx_cost(MAX_REF_BV_STACK_SIZE, intrabc_drl_idx, x);
 #endif  // CONFIG_IBC_BV_IMPROVEMENT && CONFIG_IBC_MAX_DRL
diff --git a/av1/encoder/mcomp.h b/av1/encoder/mcomp.h
index 8e78107..9641466 100644
--- a/av1/encoder/mcomp.h
+++ b/av1/encoder/mcomp.h
@@ -759,8 +759,12 @@
 void av1_init_ref_mv(MV_COST_PARAMS *mv_cost_params, const MV *ref_mv);
 
 // Compute the cost for signalling the intrabc DRL index
-int av1_get_intrabc_drl_idx_cost(int max_ref_bv_num, int intrabc_drl_idx,
-                                 const MACROBLOCK *x);
+int av1_get_intrabc_drl_idx_cost(int max_ref_bv_num, int intrabc_drl_idx
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                                 ,
+                                 const MACROBLOCK *x
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
+);
 
 // Compute the cost for signalling the intrabc mode and intrabc DRL index. This
 // is only used during the motion search
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index 17b1d74..102397a 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -1178,22 +1178,31 @@
 }
 
 #if CONFIG_IBC_BV_IMPROVEMENT
-static void update_intrabc_drl_idx_stats(int max_ref_bv_num, FRAME_CONTEXT *fc,
+static void update_intrabc_drl_idx_stats(int max_ref_bv_num,
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                                         FRAME_CONTEXT *fc,
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
                                          FRAME_COUNTS *counts,
                                          const MB_MODE_INFO *mbmi) {
 #if !CONFIG_ENTROPY_STATS
   (void)counts;
 #endif  // !CONFIG_ENTROPY_STATS
   assert(mbmi->intrabc_drl_idx < max_ref_bv_num);
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
   int bit_cnt = 0;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   for (int idx = 0; idx < max_ref_bv_num - 1; ++idx) {
-#if CONFIG_ENTROPY_STATS
+#if CONFIG_ENTROPY_STATS && !CONFIG_BYPASS_INTRABC_DRL_IDX
     counts->intrabc_drl_idx[bit_cnt][mbmi->intrabc_drl_idx != idx]++;
 #endif  // CONFIG_ENTROPY_STATS
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
     update_cdf(fc->intrabc_drl_idx_cdf[bit_cnt], mbmi->intrabc_drl_idx != idx,
                2);
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
     if (mbmi->intrabc_drl_idx == idx) break;
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
     ++bit_cnt;
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
   }
 }
 #endif  // CONFIG_IBC_BV_IMPROVEMENT
@@ -1553,7 +1562,10 @@
       ++td->counts->intrabc_mode[mbmi->intrabc_mode];
 #endif  // CONFIG_ENTROPY_STATS
 #if CONFIG_IBC_MAX_DRL
-      update_intrabc_drl_idx_stats(cm->features.max_bvp_drl_bits + 1, fc,
+      update_intrabc_drl_idx_stats(cm->features.max_bvp_drl_bits + 1,
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+                                   fc,
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
                                    td->counts, mbmi);
 #else
       update_intrabc_drl_idx_stats(MAX_REF_BV_STACK_SIZE, fc, td->counts, mbmi);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index dea90a1..27411e3 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -7629,7 +7629,12 @@
 #else
           MAX_REF_BV_STACK_SIZE,
 #endif  // CONFIG_IBC_BV_IMPROVEMENT && CONFIG_IBC_MAX_DRL
-          mbmi->intrabc_drl_idx, x);
+          mbmi->intrabc_drl_idx
+#if !CONFIG_BYPASS_INTRABC_DRL_IDX
+          ,
+          x
+#endif  // CONFIG_BYPASS_INTRABC_DRL_IDX
+      );
 #else
     // TODO(aconverse@google.com): The full motion field defining discount
     // in MV_COST_WEIGHT is too large. Explore other values.
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake
index 9e5e145..74d2605 100644
--- a/build/cmake/aom_config_defaults.cmake
+++ b/build/cmake/aom_config_defaults.cmake
@@ -200,6 +200,7 @@
   1
   "AV2 remove 2-stage search and early termination in neighbors for DMVR with 16-neighbor full search"
 )
+set_aom_config_var(CONFIG_BYPASS_INTRABC_DRL_IDX 1 "bypass coding FG8-Test25")
 set_aom_config_var(
   CONFIG_IDIF 1
   "AV2 experiment flag to enable Intra Directional Interpolation Filter.")