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.")