From: Dmitry Kovalev Date: Fri, 2 Aug 2013 23:53:18 +0000 (-0700) Subject: Cleaning up vp9_build_inter_predictor function. X-Git-Tag: v1.3.0~679^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f0a52faaf8c6f57a6a72a8b4e2abcead256fc79;p=libvpx Cleaning up vp9_build_inter_predictor function. Change-Id: I94f6b4272b95ac101de6d10f048116ba065788b0 --- diff --git a/vp9/common/vp9_reconinter.c b/vp9/common/vp9_reconinter.c index 4a5ae725e..0b65e0610 100644 --- a/vp9/common/vp9_reconinter.c +++ b/vp9/common/vp9_reconinter.c @@ -220,19 +220,19 @@ static INLINE int round_mv_comp_q4(int value) { return (value < 0 ? value - 2 : value + 2) / 4; } -static int mi_mv_pred_row_q4(const MODE_INFO *mi, int idx) { - return round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.row + - mi->bmi[1].as_mv[idx].as_mv.row + - mi->bmi[2].as_mv[idx].as_mv.row + - mi->bmi[3].as_mv[idx].as_mv.row); +static MV mi_mv_pred_q4(const MODE_INFO *mi, int idx) { + MV res = { round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.row + + mi->bmi[1].as_mv[idx].as_mv.row + + mi->bmi[2].as_mv[idx].as_mv.row + + mi->bmi[3].as_mv[idx].as_mv.row), + round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.col + + mi->bmi[1].as_mv[idx].as_mv.col + + mi->bmi[2].as_mv[idx].as_mv.col + + mi->bmi[3].as_mv[idx].as_mv.col) }; + return res; } -static int mi_mv_pred_col_q4(const MODE_INFO *mi, int idx) { - return round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.col + - mi->bmi[1].as_mv[idx].as_mv.col + - mi->bmi[2].as_mv[idx].as_mv.col + - mi->bmi[3].as_mv[idx].as_mv.col); -} + // TODO(jkoleszar): yet another mv clamping function :-( MV clamp_mv_to_umv_border_sb(const MV *src_mv, @@ -299,44 +299,30 @@ static void build_inter_predictors(int plane, int block, // dest uint8_t *const dst = arg->dst[plane] + arg->dst_stride[plane] * y + x; - // motion vector - const MV *mv; - MV split_chroma_mv; - int_mv clamped_mv; - - if (mi->mbmi.sb_type < BLOCK_SIZE_SB8X8) { - if (plane == 0) { - mv = &mi->bmi[block].as_mv[which_mv].as_mv; - } else { - // TODO(jkoleszar): All chroma MVs in SPLITMV mode are taken as the - // same MV (the average of the 4 luma MVs) but we could do something - // smarter for non-4:2:0. Just punt for now, pending the changes to get - // rid of SPLITMV mode entirely. - split_chroma_mv.row = mi_mv_pred_row_q4(mi, which_mv); - split_chroma_mv.col = mi_mv_pred_col_q4(mi, which_mv); - mv = &split_chroma_mv; - } - } else { - mv = &mi->mbmi.mv[which_mv].as_mv; - } - - /* TODO(jkoleszar): This clamping is done in the incorrect place for the - * scaling case. It needs to be done on the scaled MV, not the pre-scaling - * MV. Note however that it performs the subsampling aware scaling so - * that the result is always q4. - */ - clamped_mv.as_mv = clamp_mv_to_umv_border_sb(mv, bwl, bhl, - xd->plane[plane].subsampling_x, - xd->plane[plane].subsampling_y, - xd->mb_to_left_edge, - xd->mb_to_top_edge, - xd->mb_to_right_edge, - xd->mb_to_bottom_edge); + // TODO(jkoleszar): All chroma MVs in SPLITMV mode are taken as the + // same MV (the average of the 4 luma MVs) but we could do something + // smarter for non-4:2:0. Just punt for now, pending the changes to get + // rid of SPLITMV mode entirely. + const MV mv = mi->mbmi.sb_type < BLOCK_SIZE_SB8X8 + ? (plane == 0 ? mi->bmi[block].as_mv[which_mv].as_mv + : mi_mv_pred_q4(mi, which_mv)) + : mi->mbmi.mv[which_mv].as_mv; + + // TODO(jkoleszar): This clamping is done in the incorrect place for the + // scaling case. It needs to be done on the scaled MV, not the pre-scaling + // MV. Note however that it performs the subsampling aware scaling so + // that the result is always q4. + const MV res_mv = clamp_mv_to_umv_border_sb(&mv, bwl, bhl, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y, + xd->mb_to_left_edge, + xd->mb_to_top_edge, + xd->mb_to_right_edge, + xd->mb_to_bottom_edge); scale->set_scaled_offsets(scale, arg->y + y, arg->x + x); - vp9_build_inter_predictor(pre, pre_stride, dst, arg->dst_stride[plane], - &clamped_mv.as_mv, &xd->scale_factor[which_mv], + &res_mv, &xd->scale_factor[which_mv], 4 << pred_w, 4 << pred_h, which_mv, &xd->subpix, MV_PRECISION_Q4); }