rtc Fix to scaled_ref in variance partitioning When non-zero motion is used in the variance partitioning (due to int_pro_motion()), and the LAST reference is scaled, the xd->block_ref_scale_factors must be set to no_scale before build_inter_predictors. On 360p clip at speed 7 at 100k, with superres enabled: this reduces the encode_time spent in variance partitioning by ~50%, with small ~5% overalll encoder speedup. Obsereved visual quality seems similar to slightly better with this fix. Change-Id: I9a58078c89eadc852e28d72265fe0bb5fe0afa53
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c index fda268f..5505db2 100644 --- a/av1/encoder/var_based_part.c +++ b/av1/encoder/var_based_part.c
@@ -1341,7 +1341,8 @@ static void setup_planes(AV1_COMP *cpi, MACROBLOCK *x, unsigned int *y_sad, unsigned int *y_sad_g, unsigned int *y_sad_alt, unsigned int *y_sad_last, - MV_REFERENCE_FRAME *ref_frame_partition, int mi_row, + MV_REFERENCE_FRAME *ref_frame_partition, + struct scale_factors *sf_no_scale, int mi_row, int mi_col, bool is_small_sb, bool scaled_ref_last) { AV1_COMMON *const cm = &cpi->common; MACROBLOCKD *xd = &x->e_mbd; @@ -1480,7 +1481,12 @@ // Only calculate the predictor for non-zero MV. if (mi->mv[0].as_int != 0) { - set_ref_ptrs(cm, xd, mi->ref_frame[0], mi->ref_frame[1]); + if (!scaled_ref_last) { + set_ref_ptrs(cm, xd, mi->ref_frame[0], mi->ref_frame[1]); + } else { + xd->block_ref_scale_factors[0] = sf_no_scale; + xd->block_ref_scale_factors[1] = sf_no_scale; + } av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, cm->seq_params->sb_size, AOM_PLANE_Y, num_planes - 1); @@ -1588,6 +1594,9 @@ NOISE_LEVEL noise_level = kLow; bool is_zero_motion = true; bool scaled_ref_last = false; + struct scale_factors sf_no_scale; + av1_setup_scale_factors_for_frame(&sf_no_scale, cm->width, cm->height, + cm->width, cm->height); bool is_key_frame = (frame_is_intra_only(cm) || @@ -1686,8 +1695,8 @@ if (!is_key_frame) { setup_planes(cpi, x, &y_sad, &y_sad_g, &y_sad_alt, &y_sad_last, - &ref_frame_partition, mi_row, mi_col, is_small_sb, - scaled_ref_last); + &ref_frame_partition, &sf_no_scale, mi_row, mi_col, + is_small_sb, scaled_ref_last); MB_MODE_INFO *mi = xd->mi[0]; // Use reference SB directly for zero mv.