AV1 RT: Introducing CDEF search level 5
For RTC test set for speed 8:
- BDRate improvement 3.1% (some clips 9%)
- Slowdown ~4%
For RTC test set for speed 7:
- BDRate improvement 2.6%
- Slowdown 3%
Change-Id: Ie71d99a5072daa5ec8dcb439f03964507a78371b
diff --git a/av1/encoder/pickcdef.c b/av1/encoder/pickcdef.c
index 4346caf..234a553 100644
--- a/av1/encoder/pickcdef.c
+++ b/av1/encoder/pickcdef.c
@@ -28,9 +28,11 @@
int *pri_strength,
int *sec_strength,
int strength_idx) {
- const int tot_sec_filter = (pick_method >= CDEF_FAST_SEARCH_LVL3)
- ? REDUCED_SEC_STRENGTHS_LVL3
- : CDEF_SEC_STRENGTHS;
+ const int tot_sec_filter =
+ (pick_method == CDEF_FAST_SEARCH_LVL5)
+ ? REDUCED_SEC_STRENGTHS_LVL5
+ : ((pick_method >= CDEF_FAST_SEARCH_LVL3) ? REDUCED_SEC_STRENGTHS_LVL3
+ : CDEF_SEC_STRENGTHS);
const int pri_idx = strength_idx / tot_sec_filter;
const int sec_idx = strength_idx % tot_sec_filter;
*pri_strength = pri_idx;
@@ -48,6 +50,10 @@
*pri_strength = priconv_lvl4[pri_idx];
*sec_strength = secconv_lvl3[sec_idx];
break;
+ case CDEF_FAST_SEARCH_LVL5:
+ *pri_strength = priconv_lvl4[pri_idx];
+ *sec_strength = secconv_lvl5[sec_idx];
+ break;
default: assert(0 && "Invalid CDEF search method");
}
}
@@ -153,7 +159,7 @@
CDEF_PICK_METHOD pick_method) {
uint64_t best_tot_mse;
int fast = (pick_method >= CDEF_FAST_SEARCH_LVL1 &&
- pick_method <= CDEF_FAST_SEARCH_LVL4);
+ pick_method <= CDEF_FAST_SEARCH_LVL5);
int i;
best_tot_mse = (uint64_t)1 << 63;
/* Greedy search: add one strength options at a time. */
@@ -574,7 +580,7 @@
const CommonModeInfoParams *const mi_params = &cm->mi_params;
const int damping = 3 + (cm->quant_params.base_qindex >> 6);
const int fast = (pick_method >= CDEF_FAST_SEARCH_LVL1 &&
- pick_method <= CDEF_FAST_SEARCH_LVL4);
+ pick_method <= CDEF_FAST_SEARCH_LVL5);
const int num_planes = av1_num_planes(cm);
CdefSearchCtx cdef_search_ctx;
// Initialize parameters related to CDEF search context.
@@ -642,7 +648,6 @@
mi_params->mi_grid_base[cdef_search_ctx.sb_index[i]]->cdef_strength =
best_gi;
}
-
if (fast) {
for (int j = 0; j < cdef_info->nb_cdef_strengths; j++) {
const int luma_strength = cdef_info->cdef_strengths[j];
diff --git a/av1/encoder/pickcdef.h b/av1/encoder/pickcdef.h
index 6bea1b0..27b3888 100644
--- a/av1/encoder/pickcdef.h
+++ b/av1/encoder/pickcdef.h
@@ -24,6 +24,7 @@
#define REDUCED_PRI_STRENGTHS_LVL1 8
#define REDUCED_PRI_STRENGTHS_LVL2 5
#define REDUCED_SEC_STRENGTHS_LVL3 2
+#define REDUCED_SEC_STRENGTHS_LVL5 1
#define REDUCED_PRI_STRENGTHS_LVL4 2
#define REDUCED_TOTAL_STRENGTHS_LVL1 \
@@ -34,6 +35,8 @@
(REDUCED_PRI_STRENGTHS_LVL2 * REDUCED_SEC_STRENGTHS_LVL3)
#define REDUCED_TOTAL_STRENGTHS_LVL4 \
(REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL3)
+#define REDUCED_TOTAL_STRENGTHS_LVL5 \
+ (REDUCED_PRI_STRENGTHS_LVL4 * REDUCED_SEC_STRENGTHS_LVL5)
#define TOTAL_STRENGTHS (CDEF_PRI_STRENGTHS * CDEF_SEC_STRENGTHS)
static const int priconv_lvl1[REDUCED_PRI_STRENGTHS_LVL1] = { 0, 1, 2, 3,
@@ -41,12 +44,14 @@
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 secconv_lvl5[REDUCED_SEC_STRENGTHS_LVL5] = { 0 };
static const int nb_cdef_strengths[CDEF_PICK_METHODS] = {
TOTAL_STRENGTHS,
REDUCED_TOTAL_STRENGTHS_LVL1,
REDUCED_TOTAL_STRENGTHS_LVL2,
REDUCED_TOTAL_STRENGTHS_LVL3,
REDUCED_TOTAL_STRENGTHS_LVL4,
+ REDUCED_TOTAL_STRENGTHS_LVL5,
TOTAL_STRENGTHS
};
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index acbd42d..dfb9ea9 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1182,6 +1182,7 @@
if (!is_360p_or_larger) {
if (speed >= 6) sf->rt_sf.force_tx_search_off = 1;
+ if (speed >= 7) sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
if (speed >= 8) {
sf->rt_sf.use_modeled_non_rd_cost = 0;
sf->rt_sf.use_nonrd_filter_search = 0;
@@ -1446,8 +1447,8 @@
sf->intra_sf.intra_y_mode_mask[i] = INTRA_ALL;
}
- sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
sf->lpf_sf.lpf_pick = LPF_PICK_FROM_Q;
+ sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH_LVL5;
sf->rt_sf.mode_search_skip_flags |= FLAG_SKIP_INTRA_DIRMISMATCH;
sf->rt_sf.nonrd_prune_ref_frame_search = 1;
@@ -1483,7 +1484,8 @@
// not bitexact on rtc testset, its very close (< ~0.01 bdrate), but not
// always bitexact.
if (cpi->ppi->use_svc && cpi->svc.non_reference_frame &&
- sf->lpf_sf.cdef_pick_method == CDEF_PICK_FROM_Q &&
+ (sf->lpf_sf.cdef_pick_method == CDEF_PICK_FROM_Q ||
+ sf->lpf_sf.cdef_pick_method == CDEF_FAST_SEARCH_LVL5) &&
sf->lpf_sf.lpf_pick == LPF_PICK_FROM_Q)
sf->rt_sf.skip_loopfilter_non_reference = 1;
// Set mask for intra modes.
@@ -1520,6 +1522,7 @@
sf->interp_sf.cb_pred_filter_search = 1;
}
if (speed >= 9) {
+ sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
sf->rt_sf.estimate_motion_for_var_based_partition = 0;
sf->rt_sf.force_large_partition_blocks = 1;
for (int i = 0; i < BLOCK_SIZES; ++i)
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index c184bf2..1d7096b 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -160,6 +160,7 @@
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_FAST_SEARCH_LVL5, /**< Search reduced subset of filters than Level 4. */
CDEF_PICK_FROM_Q, /**< Estimate filter strength based on quantizer. */
CDEF_PICK_METHODS
} CDEF_PICK_METHOD;