Put angle estimation under a speed feature Change-Id: I181cb9c34ba4a0d7c7300f60a7ebc973b3262413
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index c9b9403..e429810 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -166,8 +166,6 @@ ((1 << ALTREF_FRAME) | (1 << ALTREF2_FRAME) | (1 << BWDREF_FRAME) | \ (1 << GOLDEN_FRAME) | (1 << LAST2_FRAME) | 0x01) -#define ANGLE_SKIP_THRESH 10 - static const double ADST_FLIP_SVM[8] = { /* vertical */ -6.6623, -2.8062, -3.2531, 3.1671, @@ -4235,18 +4233,14 @@ static void angle_estimation(const uint8_t *src, int src_stride, int rows, int cols, BLOCK_SIZE bsize, uint8_t *directional_mode_skip_mask) { - memset(directional_mode_skip_mask, 0, - INTRA_MODES * sizeof(*directional_mode_skip_mask)); // Check if angle_delta is used if (!av1_use_angle_delta(bsize)) return; - uint64_t hist[DIRECTIONAL_MODES]; - memset(hist, 0, DIRECTIONAL_MODES * sizeof(hist[0])); + uint64_t hist[DIRECTIONAL_MODES] = { 0 }; src += src_stride; - int r, c, dx, dy; - for (r = 1; r < rows; ++r) { - for (c = 1; c < cols; ++c) { - dx = src[c] - src[c - 1]; - dy = src[c] - src[c - src_stride]; + for (int r = 1; r < rows; ++r) { + for (int c = 1; c < cols; ++c) { + int dx = src[c] - src[c - 1]; + int dy = src[c] - src[c - src_stride]; int index; const int temp = dx * dx + dy * dy; if (dy == 0) { @@ -4280,8 +4274,8 @@ score += hist[angle_bin + 1]; ++weight; } - if (score * ANGLE_SKIP_THRESH < hist_sum * weight) - directional_mode_skip_mask[i] = 1; + const int thresh = 10; + if (score * thresh < hist_sum * weight) directional_mode_skip_mask[i] = 1; } } } @@ -4289,19 +4283,15 @@ static void highbd_angle_estimation(const uint8_t *src8, int src_stride, int rows, int cols, BLOCK_SIZE bsize, uint8_t *directional_mode_skip_mask) { - memset(directional_mode_skip_mask, 0, - INTRA_MODES * sizeof(*directional_mode_skip_mask)); // Check if angle_delta is used if (!av1_use_angle_delta(bsize)) return; uint16_t *src = CONVERT_TO_SHORTPTR(src8); - uint64_t hist[DIRECTIONAL_MODES]; - memset(hist, 0, DIRECTIONAL_MODES * sizeof(hist[0])); + uint64_t hist[DIRECTIONAL_MODES] = { 0 }; src += src_stride; - int r, c, dx, dy; - for (r = 1; r < rows; ++r) { - for (c = 1; c < cols; ++c) { - dx = src[c] - src[c - 1]; - dy = src[c] - src[c - src_stride]; + for (int r = 1; r < rows; ++r) { + for (int c = 1; c < cols; ++c) { + int dx = src[c] - src[c - 1]; + int dy = src[c] - src[c - src_stride]; int index; const int temp = dx * dx + dy * dy; if (dy == 0) { @@ -4335,8 +4325,8 @@ score += hist[angle_bin + 1]; ++weight; } - if (score * ANGLE_SKIP_THRESH < hist_sum * weight) - directional_mode_skip_mask[i] = 1; + const int thresh = 10; + if (score * thresh < hist_sum * weight) directional_mode_skip_mask[i] = 1; } } } @@ -4389,9 +4379,7 @@ const int rows = block_size_high[bsize]; const int cols = block_size_wide[bsize]; int is_directional_mode; - uint8_t directional_mode_skip_mask[INTRA_MODES]; - const int src_stride = x->plane[0].src.stride; - const uint8_t *src = x->plane[0].src.buf; + uint8_t directional_mode_skip_mask[INTRA_MODES] = { 0 }; int beat_best_rd = 0; const int *bmode_costs; PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info; @@ -4408,12 +4396,17 @@ bmode_costs = x->y_mode_costs[above_ctx][left_ctx]; mbmi->angle_delta[PLANE_TYPE_Y] = 0; - if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) - highbd_angle_estimation(src, src_stride, rows, cols, bsize, - directional_mode_skip_mask); - else - angle_estimation(src, src_stride, rows, cols, bsize, - directional_mode_skip_mask); + if (cpi->sf.intra_angle_estimation) { + const int src_stride = x->plane[0].src.stride; + const uint8_t *src = x->plane[0].src.buf; + if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { + highbd_angle_estimation(src, src_stride, rows, cols, bsize, + directional_mode_skip_mask); + } else { + angle_estimation(src, src_stride, rows, cols, bsize, + directional_mode_skip_mask); + } + } mbmi->filter_intra_mode_info.use_filter_intra = 0; pmi->palette_size[0] = 0; @@ -10691,6 +10684,7 @@ search_state->best_intra_rd = INT64_MAX; search_state->angle_stats_ready = 0; + av1_zero(search_state->directional_mode_skip_mask); search_state->best_pred_sse = UINT_MAX; @@ -10960,15 +10954,16 @@ if (is_directional_mode && av1_use_angle_delta(bsize)) { int rate_dummy; int64_t model_rd = INT64_MAX; - if (!search_state->angle_stats_ready) { + if (sf->intra_angle_estimation && !search_state->angle_stats_ready) { const int src_stride = x->plane[0].src.stride; const uint8_t *src = x->plane[0].src.buf; - if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) + if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { highbd_angle_estimation(src, src_stride, rows, cols, bsize, search_state->directional_mode_skip_mask); - else + } else { angle_estimation(src, src_stride, rows, cols, bsize, search_state->directional_mode_skip_mask); + } search_state->angle_stats_ready = 1; } if (search_state->directional_mode_skip_mask[mbmi->mode]) return INT64_MAX;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index c8865bb..60a910a 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -197,6 +197,7 @@ sf->gm_disable_recode = 1; sf->use_fast_interpolation_filter_search = 1; sf->intra_tx_size_search_init_depth_sqr = 1; + sf->intra_angle_estimation = 1; if (speed >= 1) { sf->gm_erroradv_type = GM_ERRORADV_TR_1; @@ -453,6 +454,7 @@ sf->jnt_comp_fast_tx_search = 0; sf->use_jnt_comp_flag = JNT_COMP_ENABLED; sf->reuse_inter_intra_mode = 0; + sf->intra_angle_estimation = 0; for (i = 0; i < TX_SIZES; i++) { sf->intra_y_mode_mask[i] = INTRA_ALL;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h index 3fcda3d..7e850f2 100644 --- a/av1/encoder/speed_features.h +++ b/av1/encoder/speed_features.h
@@ -570,6 +570,9 @@ // flag to skip NEWMV mode in drl if the motion search result is the same int skip_repeated_newmv; + + // Prune intra mode candidates based on source block gradient stats. + int intra_angle_estimation; } SPEED_FEATURES; struct AV1_COMP;