rtc: Avoid scene detection on resize Don't enter scene detection under external resize. Add rc->prev_coded_width/height to track the previous encoded frame eweight/height. The rc is part of layer context so this will be per spatial layer for SVC. This fixes the buffer overflow issue below. Bug: chromium:1393384 Change-Id: I4b11818a27c439c2d2c42036dff7b8777f70a86e (cherry picked from commit bee1caded272127a6d6b70ac79479083d183d5d0)
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c index 85e7d79..834c930 100644 --- a/av1/encoder/ratectrl.c +++ b/av1/encoder/ratectrl.c
@@ -2159,6 +2159,8 @@ if (current_frame->frame_type == KEY_FRAME) rc->frames_since_key = 0; if (cpi->refresh_frame.golden_frame) rc->frame_num_last_gf_refresh = current_frame->frame_number; + rc->prev_coded_width = cm->width; + rc->prev_coded_height = cm->height; // if (current_frame->frame_number == 1 && cm->show_frame) /* rc->this_frame_target = @@ -2175,6 +2177,8 @@ cpi->rc.rc_2_frame = 0; cpi->rc.rc_1_frame = 0; cpi->rc.prev_avg_frame_bandwidth = cpi->rc.avg_frame_bandwidth; + cpi->rc.prev_coded_width = cpi->common.width; + cpi->rc.prev_coded_height = cpi->common.height; } int av1_find_qindex(double desired_q, aom_bit_depth_t bit_depth, @@ -3162,8 +3166,15 @@ } } // Check for scene change: for SVC check on base spatial layer only. - if (cpi->sf.rt_sf.check_scene_detection && svc->spatial_layer_id == 0) - rc_scene_detection_onepass_rt(cpi, frame_input); + if (cpi->sf.rt_sf.check_scene_detection && svc->spatial_layer_id == 0) { + if (rc->prev_coded_width == cm->width && + rc->prev_coded_height == cm->height) { + rc_scene_detection_onepass_rt(cpi, frame_input); + } else if (cpi->src_sad_blk_64x64) { + aom_free(cpi->src_sad_blk_64x64); + cpi->src_sad_blk_64x64 = NULL; + } + } // Check for dynamic resize, for single spatial layer for now. // For temporal layers only check on base temporal layer. if (cpi->oxcf.resize_cfg.resize_mode == RESIZE_DYNAMIC) {
diff --git a/av1/encoder/ratectrl.h b/av1/encoder/ratectrl.h index 3e41283..06a1176 100644 --- a/av1/encoder/ratectrl.h +++ b/av1/encoder/ratectrl.h
@@ -258,6 +258,9 @@ double frame_level_rate_correction_factors[RATE_FACTOR_LEVELS]; int frame_num_last_gf_refresh; + + int prev_coded_width; + int prev_coded_height; /*!\endcond */ } RATE_CONTROL;