Simplify nested loops in var_based_partitioning for readability
Simplified code in av1_choose_var_based_partitioning through
refactoring conditions in nested loops for better readability.
Change-Id: I92f01361427294e450177ab3484961b647654d1e
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index 682edf0..9e1d30f 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -1108,8 +1108,7 @@
force_split[0] = PART_EVAL_ONLY_SPLIT;
}
}
- }
- if (is_key_frame) {
+ } else {
force_split[split_index] = PART_EVAL_ALL;
// Go down to 4x4 down-sampling for variance.
variance4x4downsample[lvl1_scale_idx + lvl2_idx] = 1;
@@ -1467,26 +1466,25 @@
const int lvl1_scale_idx = (blk64_scale_idx + lvl1_idx) << 2;
for (int lvl2_idx = 0; lvl2_idx < 4; lvl2_idx++) {
const int split_index = 21 + lvl1_scale_idx + lvl2_idx;
- if (variance4x4downsample[lvl1_scale_idx + lvl2_idx] == 1) {
- VP16x16 *vtemp =
- (!is_key_frame)
- ? &vt2[lvl1_scale_idx + lvl2_idx]
- : &vt->split[blk64_idx].split[lvl1_idx].split[lvl2_idx];
- for (int lvl3_idx = 0; lvl3_idx < 4; lvl3_idx++)
- fill_variance_tree(&vtemp->split[lvl3_idx], BLOCK_8X8);
- fill_variance_tree(vtemp, BLOCK_16X16);
- // If variance of this 16x16 block is above the threshold, force block
- // to split. This also forces a split on the upper levels.
- get_variance(&vtemp->part_variances.none);
- if (vtemp->part_variances.none.variance > thresholds[3]) {
- force_split[split_index] =
- cpi->sf.rt_sf.vbp_prune_16x16_split_using_min_max_sub_blk_var
- ? get_part_eval_based_on_sub_blk_var(vtemp, thresholds[3])
- : PART_EVAL_ONLY_SPLIT;
- force_split[5 + blk64_scale_idx + lvl1_idx] = PART_EVAL_ONLY_SPLIT;
- force_split[blk64_idx + 1] = PART_EVAL_ONLY_SPLIT;
- force_split[0] = PART_EVAL_ONLY_SPLIT;
- }
+ if (variance4x4downsample[lvl1_scale_idx + lvl2_idx] != 1) continue;
+ VP16x16 *vtemp =
+ (!is_key_frame)
+ ? &vt2[lvl1_scale_idx + lvl2_idx]
+ : &vt->split[blk64_idx].split[lvl1_idx].split[lvl2_idx];
+ for (int lvl3_idx = 0; lvl3_idx < 4; lvl3_idx++)
+ fill_variance_tree(&vtemp->split[lvl3_idx], BLOCK_8X8);
+ fill_variance_tree(vtemp, BLOCK_16X16);
+ // If variance of this 16x16 block is above the threshold, force block
+ // to split. This also forces a split on the upper levels.
+ get_variance(&vtemp->part_variances.none);
+ if (vtemp->part_variances.none.variance > thresholds[3]) {
+ force_split[split_index] =
+ cpi->sf.rt_sf.vbp_prune_16x16_split_using_min_max_sub_blk_var
+ ? get_part_eval_based_on_sub_blk_var(vtemp, thresholds[3])
+ : PART_EVAL_ONLY_SPLIT;
+ force_split[5 + blk64_scale_idx + lvl1_idx] = PART_EVAL_ONLY_SPLIT;
+ force_split[blk64_idx + 1] = PART_EVAL_ONLY_SPLIT;
+ force_split[0] = PART_EVAL_ONLY_SPLIT;
}
}
fill_variance_tree(&vt->split[blk64_idx].split[lvl1_idx], BLOCK_32X32);
@@ -1580,46 +1578,44 @@
// Now go through the entire structure, splitting every block size until
// we get to one that's got a variance lower than our threshold.
- if (!set_vt_partitioning(cpi, xd, tile, &vt->split[blk64_idx],
- BLOCK_64X64, mi_row + y64_idx, mi_col + x64_idx,
- thresholds[1], BLOCK_16X16,
- force_split[1 + blk64_idx])) {
- for (int lvl1_idx = 0; lvl1_idx < 4; ++lvl1_idx) {
- const int x32_idx = ((lvl1_idx & 1) << 3);
- const int y32_idx = ((lvl1_idx >> 1) << 3);
- const int lvl1_scale_idx = (blk64_scale_idx + lvl1_idx) << 2;
- if (!set_vt_partitioning(
- cpi, xd, tile, &vt->split[blk64_idx].split[lvl1_idx],
- BLOCK_32X32, (mi_row + y64_idx + y32_idx),
- (mi_col + x64_idx + x32_idx), thresholds[2], BLOCK_16X16,
- force_split[5 + blk64_scale_idx + lvl1_idx])) {
- for (int lvl2_idx = 0; lvl2_idx < 4; ++lvl2_idx) {
- const int x16_idx = ((lvl2_idx & 1) << 2);
- const int y16_idx = ((lvl2_idx >> 1) << 2);
- const int split_index = 21 + lvl1_scale_idx + lvl2_idx;
- // For inter frames: if variance4x4downsample[] == 1 for this
- // 16x16 block, then the variance is based on 4x4 down-sampling,
- // so use vt2 in set_vt_partioning(), otherwise use vt.
- VP16x16 *vtemp =
- (!is_key_frame &&
- variance4x4downsample[lvl1_scale_idx + lvl2_idx] == 1)
- ? &vt2[lvl1_scale_idx + lvl2_idx]
- : &vt->split[blk64_idx].split[lvl1_idx].split[lvl2_idx];
- if (!set_vt_partitioning(cpi, xd, tile, vtemp, BLOCK_16X16,
- mi_row + y64_idx + y32_idx + y16_idx,
- mi_col + x64_idx + x32_idx + x16_idx,
- thresholds[3], BLOCK_8X8,
- force_split[split_index])) {
- for (int lvl3_idx = 0; lvl3_idx < 4; ++lvl3_idx) {
- const int x8_idx = (lvl3_idx & 1) << 1;
- const int y8_idx = (lvl3_idx >> 1) << 1;
- set_block_size(
- cpi, (mi_row + y64_idx + y32_idx + y16_idx + y8_idx),
- (mi_col + x64_idx + x32_idx + x16_idx + x8_idx),
- BLOCK_8X8);
- }
- }
- }
+ if (set_vt_partitioning(cpi, xd, tile, &vt->split[blk64_idx], BLOCK_64X64,
+ mi_row + y64_idx, mi_col + x64_idx, thresholds[1],
+ BLOCK_16X16, force_split[1 + blk64_idx]))
+ continue;
+ for (int lvl1_idx = 0; lvl1_idx < 4; ++lvl1_idx) {
+ const int x32_idx = ((lvl1_idx & 1) << 3);
+ const int y32_idx = ((lvl1_idx >> 1) << 3);
+ const int lvl1_scale_idx = (blk64_scale_idx + lvl1_idx) << 2;
+ if (set_vt_partitioning(
+ cpi, xd, tile, &vt->split[blk64_idx].split[lvl1_idx],
+ BLOCK_32X32, (mi_row + y64_idx + y32_idx),
+ (mi_col + x64_idx + x32_idx), thresholds[2], BLOCK_16X16,
+ force_split[5 + blk64_scale_idx + lvl1_idx]))
+ continue;
+ for (int lvl2_idx = 0; lvl2_idx < 4; ++lvl2_idx) {
+ const int x16_idx = ((lvl2_idx & 1) << 2);
+ const int y16_idx = ((lvl2_idx >> 1) << 2);
+ const int split_index = 21 + lvl1_scale_idx + lvl2_idx;
+ // For inter frames: if variance4x4downsample[] == 1 for this
+ // 16x16 block, then the variance is based on 4x4 down-sampling,
+ // so use vt2 in set_vt_partioning(), otherwise use vt.
+ VP16x16 *vtemp =
+ (!is_key_frame &&
+ variance4x4downsample[lvl1_scale_idx + lvl2_idx] == 1)
+ ? &vt2[lvl1_scale_idx + lvl2_idx]
+ : &vt->split[blk64_idx].split[lvl1_idx].split[lvl2_idx];
+ if (set_vt_partitioning(cpi, xd, tile, vtemp, BLOCK_16X16,
+ mi_row + y64_idx + y32_idx + y16_idx,
+ mi_col + x64_idx + x32_idx + x16_idx,
+ thresholds[3], BLOCK_8X8,
+ force_split[split_index]))
+ continue;
+ for (int lvl3_idx = 0; lvl3_idx < 4; ++lvl3_idx) {
+ const int x8_idx = (lvl3_idx & 1) << 1;
+ const int y8_idx = (lvl3_idx >> 1) << 1;
+ set_block_size(cpi, (mi_row + y64_idx + y32_idx + y16_idx + y8_idx),
+ (mi_col + x64_idx + x32_idx + x16_idx + x8_idx),
+ BLOCK_8X8);
}
}
}