rtc: Reduce superblock copy in partition decision Stopped to copy reference superblock if MV is zero. Saw slight encoder speedup (0.2%) at speed 10. No stats change (verified for speed 5 - 10). Change-Id: I482f4f3df6ab563074d3fd610699ab192582a856
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c index 74a409f..c6a31a1 100644 --- a/av1/encoder/var_based_part.c +++ b/av1/encoder/var_based_part.c
@@ -869,10 +869,13 @@ cpi->sf.rt_sf.nonrd_prune_ref_frame_search; } - set_ref_ptrs(cm, xd, mi->ref_frame[0], mi->ref_frame[1]); - av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, - cm->seq_params->sb_size, AOM_PLANE_Y, - AOM_PLANE_Y); + // 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]); + av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, + cm->seq_params->sb_size, AOM_PLANE_Y, + AOM_PLANE_Y); + } } int av1_choose_var_based_partitioning(AV1_COMP *cpi, const TileInfo *const tile, @@ -974,8 +977,16 @@ if (!is_key_frame) { setup_planes(cpi, x, &y_sad, &y_sad_g, &ref_frame_partition, mi_row, mi_col); - d = xd->plane[0].dst.buf; - dp = xd->plane[0].dst.stride; + + MB_MODE_INFO *mi = xd->mi[0]; + // Use reference SB directly for zero mv. + if (mi->mv[0].as_int != 0) { + d = xd->plane[0].dst.buf; + dp = xd->plane[0].dst.stride; + } else { + d = xd->plane[0].pre[0].buf; + dp = xd->plane[0].pre[0].stride; + } } else { d = AV1_VAR_OFFS; dp = 0;