Add a penalty factor to dual sgr selection This is a decoder side speed optimization to make sure there aren't too many dual sgr lrus selected. Change-Id: I01d72951a89d09369a4cbf116937ea0651b7468c
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c index 55fa8e9..115f66f 100644 --- a/av1/encoder/pickrst.c +++ b/av1/encoder/pickrst.c
@@ -40,6 +40,9 @@ // Number of Wiener iterations #define NUM_WIENER_ITERS 5 +// Penalty factor for use of dual sgr +#define DUAL_SGR_PENALTY_MULT 0.01 + const int frame_level_restore_bits[RESTORE_TYPES] = { 2, 2, 2, 2 }; typedef int64_t (*sse_extractor_type)(const YV12_BUFFER_CONFIG *a, @@ -90,6 +93,9 @@ int plane_height; RestUnitSearchInfo *rusi; + // Speed features + const SPEED_FEATURES *sf; + uint8_t *dgd_buffer; int dgd_stride; const uint8_t *src_buffer; @@ -123,14 +129,16 @@ } static void init_rsc(const YV12_BUFFER_CONFIG *src, const AV1_COMMON *cm, - const MACROBLOCK *x, int plane, RestUnitSearchInfo *rusi, - YV12_BUFFER_CONFIG *dst, RestSearchCtxt *rsc) { + const MACROBLOCK *x, const SPEED_FEATURES *sf, int plane, + RestUnitSearchInfo *rusi, YV12_BUFFER_CONFIG *dst, + RestSearchCtxt *rsc) { rsc->src = src; rsc->dst = dst; rsc->cm = cm; rsc->x = x; rsc->plane = plane; rsc->rusi = rusi; + rsc->sf = sf; const YV12_BUFFER_CONFIG *dgd = cm->frame_to_show; const int is_uv = plane != AOM_PLANE_Y; @@ -563,6 +571,8 @@ RDCOST_DBL(x->rdmult, bits_none >> 4, rusi->sse[RESTORE_NONE]); double cost_sgr = RDCOST_DBL(x->rdmult, bits_sgr >> 4, rusi->sse[RESTORE_SGRPROJ]); + if (rusi->sgrproj.ep < 10) + cost_sgr *= (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->dual_sgr_penalty_level); RestorationType rtype = (cost_sgr < cost_none) ? RESTORE_SGRPROJ : RESTORE_NONE; @@ -1186,6 +1196,8 @@ const int64_t coeff_bits = coeff_pcost << AV1_PROB_COST_SHIFT; const int64_t bits = x->switchable_restore_cost[r] + coeff_bits; double cost = RDCOST_DBL(x->rdmult, bits >> 4, sse); + if (r == RESTORE_SGRPROJ && rusi->sgrproj.ep < 10) + cost *= (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->dual_sgr_penalty_level); if (r == 0 || cost < best_cost) { best_cost = cost; best_bits = bits; @@ -1252,8 +1264,8 @@ const int plane_start = AOM_PLANE_Y; const int plane_end = num_planes > 1 ? AOM_PLANE_V : AOM_PLANE_Y; for (int plane = plane_start; plane <= plane_end; ++plane) { - init_rsc(src, &cpi->common, &cpi->td.mb, plane, rusi, &cpi->trial_frame_rst, - &rsc); + init_rsc(src, &cpi->common, &cpi->td.mb, &cpi->sf, plane, rusi, + &cpi->trial_frame_rst, &rsc); const int plane_ntiles = ntiles[plane > 0]; const RestorationType num_rtypes =
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index d6161d2..d198a2b 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -168,6 +168,7 @@ sf->adaptive_txb_search_level = 2; sf->use_intra_txb_hash = 1; sf->optimize_b_precheck = 1; + sf->dual_sgr_penalty_level = 1; } if (speed >= 2) { @@ -486,6 +487,9 @@ sf->use_fast_interpolation_filter_search = 0; sf->use_hash_based_trellis = 0; + // Set decoder side speed feature to use less dual sgr modes + sf->dual_sgr_penalty_level = 0; + set_dev_sf(cpi, sf, oxcf->dev_sf); if (oxcf->mode == GOOD)
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h index 08158e4..fcada97 100644 --- a/av1/encoder/speed_features.h +++ b/av1/encoder/speed_features.h
@@ -586,6 +586,11 @@ // Skip mv search in jnt_comp int jnt_comp_skip_mv_search; + + // Decoder side speed feature to add penalty for use of dual-sgr filters. + // Takes values 0 - 10, 0 indicating no penalty and each additional level + // adding a penalty of 1% + int dual_sgr_penalty_level; } SPEED_FEATURES; struct AV1_COMP;