Add reduced primary filter search method for CDEF
This CL introduces a reduced primary filter search method for
CDEF search. This change is applicable for cpu-used 6.
Instruction Count BD-Rate Loss(%)
cpu-used Reduction(%) avg.psnr ovr.psnr ssim
6 1.823% 0.2169% 0.2225% 0.2567%
STATS_CHANGED
Change-Id: If90421c1592ac68a6873c6ef2235bd6a330e32b6
diff --git a/av1/encoder/pickcdef.c b/av1/encoder/pickcdef.c
index a031999..b48f134 100644
--- a/av1/encoder/pickcdef.c
+++ b/av1/encoder/pickcdef.c
@@ -25,6 +25,7 @@
#define REDUCED_PRI_STRENGTHS_LVL1 8
#define REDUCED_PRI_STRENGTHS_LVL2 5
#define REDUCED_SEC_STRENGTHS_LVL3 2
+#define REDUCED_PRI_STRENGTHS_LVL4 2
#define REDUCED_TOTAL_STRENGTHS_LVL1 \
(REDUCED_PRI_STRENGTHS_LVL1 * CDEF_SEC_STRENGTHS)
@@ -32,15 +33,22 @@
(REDUCED_PRI_STRENGTHS_LVL2 * CDEF_SEC_STRENGTHS)
#define REDUCED_TOTAL_STRENGTHS_LVL3 \
(REDUCED_PRI_STRENGTHS_LVL2 * REDUCED_SEC_STRENGTHS_LVL3)
+#define REDUCED_TOTAL_STRENGTHS_LVL4 \
+ (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL3)
#define TOTAL_STRENGTHS (CDEF_PRI_STRENGTHS * CDEF_SEC_STRENGTHS)
static const int priconv_lvl1[REDUCED_PRI_STRENGTHS_LVL1] = { 0, 1, 2, 3,
5, 7, 10, 13 };
static const int priconv_lvl2[REDUCED_PRI_STRENGTHS_LVL2] = { 0, 2, 4, 8, 14 };
+static const int priconv_lvl4[REDUCED_PRI_STRENGTHS_LVL4] = { 0, 11 };
static const int secconv_lvl3[REDUCED_SEC_STRENGTHS_LVL3] = { 0, 2 };
static const int nb_cdef_strengths[CDEF_PICK_METHODS] = {
- TOTAL_STRENGTHS, REDUCED_TOTAL_STRENGTHS_LVL1, REDUCED_TOTAL_STRENGTHS_LVL2,
- REDUCED_TOTAL_STRENGTHS_LVL3, TOTAL_STRENGTHS
+ TOTAL_STRENGTHS,
+ REDUCED_TOTAL_STRENGTHS_LVL1,
+ REDUCED_TOTAL_STRENGTHS_LVL2,
+ REDUCED_TOTAL_STRENGTHS_LVL3,
+ REDUCED_TOTAL_STRENGTHS_LVL4,
+ TOTAL_STRENGTHS
};
// Get primary and secondary filter strength for the given strength index and
@@ -49,7 +57,7 @@
int *pri_strength,
int *sec_strength,
int strength_idx) {
- const int tot_sec_filter = (pick_method == CDEF_FAST_SEARCH_LVL3)
+ const int tot_sec_filter = (pick_method >= CDEF_FAST_SEARCH_LVL3)
? REDUCED_SEC_STRENGTHS_LVL3
: CDEF_SEC_STRENGTHS;
const int pri_idx = strength_idx / tot_sec_filter;
@@ -65,6 +73,10 @@
*pri_strength = priconv_lvl2[pri_idx];
*sec_strength = secconv_lvl3[sec_idx];
break;
+ case CDEF_FAST_SEARCH_LVL4:
+ *pri_strength = priconv_lvl4[pri_idx];
+ *sec_strength = secconv_lvl3[sec_idx];
+ break;
default: assert(0 && "Invalid CDEF search method");
}
}
@@ -170,7 +182,7 @@
CDEF_PICK_METHOD pick_method) {
uint64_t best_tot_mse;
int fast = (pick_method >= CDEF_FAST_SEARCH_LVL1 &&
- pick_method <= CDEF_FAST_SEARCH_LVL3);
+ pick_method <= CDEF_FAST_SEARCH_LVL4);
int i;
best_tot_mse = (uint64_t)1 << 63;
/* Greedy search: add one strength options at a time. */
@@ -396,7 +408,7 @@
int *sb_index = aom_malloc(nvfb * nhfb * sizeof(*sb_index));
const int damping = 3 + (cm->quant_params.base_qindex >> 6);
const int fast = (pick_method >= CDEF_FAST_SEARCH_LVL1 &&
- pick_method <= CDEF_FAST_SEARCH_LVL3);
+ pick_method <= CDEF_FAST_SEARCH_LVL4);
const int total_strengths = nb_cdef_strengths[pick_method];
DECLARE_ALIGNED(32, uint16_t, tmp_dst[1 << (MAX_SB_SIZE_LOG2 * 2)]);
const int num_planes = av1_num_planes(cm);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index f0aaaaf..081c0b1 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -690,6 +690,8 @@
sf->winner_mode_sf.dc_blk_pred_level = 2;
sf->winner_mode_sf.multi_winner_mode_type = MULTI_WINNER_MODE_OFF;
+
+ sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH_LVL4;
}
// Intra txb hash is currently not compatible with multi-winner mode as the
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 4190ca5..38dad36 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -163,6 +163,7 @@
CDEF_FAST_SEARCH_LVL2, /**< Search reduced subset of filters than Level 1. */
CDEF_FAST_SEARCH_LVL3, /**< Search reduced subset of secondary filters than
Level 2. */
+ CDEF_FAST_SEARCH_LVL4, /**< Search reduced subset of filters than Level 3. */
CDEF_PICK_FROM_Q, /**< Estimate filter strength based on quantizer. */
CDEF_PICK_METHODS
} CDEF_PICK_METHOD;