rtc-screen: Improve conditions for better motion search For screen: increased motion search was set based on high_num_blocks_motion. This CL changes that and sets it based on source sad metrics, and updated/added new metrics in the scene detection. This makes the increased motion search setting more aggressive but also more targeted. Stats for speed 10 screen: avg_psnr/ovr_psnr/ssim, IC speedup -2.7/-3.7/-4.1, -1.2% youtube clip has gains: -9/-12/-11, but 7% IC slowdown Change-Id: I984d35b09b4a251aa19790eb1b3c621ee0ab9db5
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c index 33b6b6d..315bae6 100644 --- a/av1/encoder/ratectrl.c +++ b/av1/encoder/ratectrl.c
@@ -2761,7 +2761,8 @@ return; } rc->high_source_sad = 0; - rc->high_num_blocks_with_motion = 0; + rc->percent_blocks_with_motion = 0; + rc->max_block_source_sad = 0; rc->prev_avg_source_sad = rc->avg_source_sad; if (src_width == last_src_width && src_height == last_src_height) { const int num_mi_cols = cm->mi_params.mi_cols; @@ -2815,6 +2816,8 @@ avg_sad += tmp_sad; num_samples++; if (tmp_sad == 0) num_zero_temp_sad++; + if (tmp_sad > rc->max_block_source_sad) + rc->max_block_source_sad = tmp_sad; src_y += 64; last_src_y += 64; @@ -2840,9 +2843,9 @@ rc->high_source_sad = 0; rc->avg_source_sad = (3 * rc->avg_source_sad + avg_sad) >> 2; rc->frame_source_sad = avg_sad; - - if (num_zero_temp_sad < (3 * num_samples >> 2)) - rc->high_num_blocks_with_motion = 1; + if (num_samples > 0) + rc->percent_blocks_with_motion = + ((num_samples - num_zero_temp_sad) * 100) / num_samples; } cpi->svc.high_source_sad_superframe = rc->high_source_sad; }
diff --git a/av1/encoder/ratectrl.h b/av1/encoder/ratectrl.h index 6a678b7..df177b9 100644 --- a/av1/encoder/ratectrl.h +++ b/av1/encoder/ratectrl.h
@@ -238,7 +238,10 @@ int cnt_zeromv; // signals if number of blocks with motion is high - int high_num_blocks_with_motion; + int percent_blocks_with_motion; + + // Maximum value of source sad across all blocks of frame. + uint64_t max_block_source_sad; // For dynamic resize, 1 pass cbr. RESIZE_STATE resize_state;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index ab3ef83..8c545ff 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -1449,7 +1449,9 @@ sf->rt_sf.intra_y_mode_bsize_mask_nrd[i] = INTRA_DC_H_V; } } - if (cpi->rc.high_num_blocks_with_motion && speed >= 6) { + if (cpi->rc.max_block_source_sad > 20000 && + cpi->rc.frame_source_sad > 100 && + cpi->rc.percent_blocks_with_motion > 1 && speed >= 6) { sf->mv_sf.search_method = NSTEP; sf->rt_sf.fullpel_search_step_param = 2; }