rtc: Adjustments for temporal layers. 1) Keep the same block_sad_low as in single layer case, in the variance partitioning. 2) Use the superblock source_sad (sb_sad) for setting the refresh map, with modified thresholds for base TL0. bdrate gain for speed 10, 2TL, with 70/30 allocation on rtc_derf: avg/ovr/ssim, IC% speedup: -0.230/-0.219/-0.774, -0.119 Change-Id: I6a78e73141c60f5ce80070dcb7b3352570564aed
diff --git a/av1/encoder/aq_cyclicrefresh.c b/av1/encoder/aq_cyclicrefresh.c index 86a440a..9d1d224 100644 --- a/av1/encoder/aq_cyclicrefresh.c +++ b/av1/encoder/aq_cyclicrefresh.c
@@ -331,13 +331,22 @@ if (cr->use_block_sad_scene_det && cpi->rc.frames_since_key > 30 && cr->counter_encode_maxq_scene_change > 30 && cpi->src_sad_blk_64x64 != NULL && - cpi->svc.number_temporal_layers == 1 && cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1) { sb_sad = cpi->src_sad_blk_64x64[sb_col_index + sb_cols * sb_row_index]; int scale = (cm->width * cm->height < 640 * 360) ? 6 : 8; int scale_low = 2; thresh_sad = (scale * 64 * 64); thresh_sad_low = (scale_low * 64 * 64); + // For temporal layers: the base temporal layer (temporal_layer_id = 0) + // has larger frame separation (2 or 4 frames apart), so use larger sad + // thresholds to compensate for larger frame sad. The larger thresholds + // also increase the amount of refresh, which is needed for the base + // temporal layer. + if (cpi->svc.number_temporal_layers > 1 && + cpi->svc.temporal_layer_id == 0) { + thresh_sad <<= 4; + thresh_sad_low <<= 2; + } } // cr_map only needed at 8x8 blocks. for (y = 0; y < ymis; y += 2) {
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c index 05e0383..6dd0782 100644 --- a/av1/encoder/var_based_part.c +++ b/av1/encoder/var_based_part.c
@@ -475,7 +475,6 @@ // Increase the sad thresholds for base TL0, as reference/LAST is // 2/4 frames behind (for 2/3 #TL). avg_source_sad_thresh = 40000; - block_sad_low = 35000; block_sad_high = 70000; } if (is_segment_id_boosted == false &&