From bde3ae0c6021e49f254b8cacb26b93fc3d40bda6 Mon Sep 17 00:00:00 2001 From: Dmitry Kovalev Date: Thu, 3 Oct 2013 20:06:32 -0700 Subject: [PATCH] Adding assign_mv() function to reduce code duplication. Change-Id: I2b4e5b842c19f64749b18946ad215c0caa57e7b7 --- vp9/decoder/vp9_decodemv.c | 120 +++++++++++++++---------------------- 1 file changed, 48 insertions(+), 72 deletions(-) diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c index 224a72489..27e5f2cda 100644 --- a/vp9/decoder/vp9_decodemv.c +++ b/vp9/decoder/vp9_decodemv.c @@ -426,6 +426,45 @@ static void read_intra_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi, mbmi->uv_mode = read_intra_mode_uv(cm, r, mbmi->mode); } +static INLINE void assign_mv(VP9_COMMON *cm, MB_PREDICTION_MODE mode, + int_mv mv[2], int_mv best_mv[2], + int_mv nearest_mv[2], int_mv near_mv[2], + int is_compound, int allow_hp, vp9_reader *r) { + int i; + + switch (mode) { + case NEWMV: + read_mv(r, &mv[0].as_mv, &best_mv[0].as_mv, + &cm->fc.nmvc, &cm->counts.mv, allow_hp); + if (is_compound) + read_mv(r, &mv[1].as_mv, &best_mv[1].as_mv, + &cm->fc.nmvc, &cm->counts.mv, allow_hp); + break; + case NEARESTMV: + mv[0].as_int = nearest_mv[0].as_int; + if (is_compound) + mv[1].as_int = nearest_mv[1].as_int; + break; + case NEARMV: + mv[0].as_int = near_mv[0].as_int; + if (is_compound) + mv[1].as_int = near_mv[1].as_int; + break; + case ZEROMV: + mv[0].as_int = 0; + if (is_compound) + mv[1].as_int = 0; + break; + default: + assert(!"Invalid inter mode value."); + } + + for (i = 0; i < 1 + is_compound; ++i) { + assert(mv[i].as_mv.row < MV_UPP && mv[i].as_mv.row > MV_LOW); + assert(mv[i].as_mv.col < MV_UPP && mv[i].as_mv.col > MV_LOW); + } +} + static int read_is_inter_block(VP9D_COMP *pbi, int segment_id, vp9_reader *r) { VP9_COMMON *const cm = &pbi->common; MACROBLOCKD *const xd = &pbi->mb; @@ -445,10 +484,7 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi, int mi_row, int mi_col, vp9_reader *r) { VP9_COMMON *const cm = &pbi->common; MACROBLOCKD *const xd = &pbi->mb; - nmv_context *const nmvc = &cm->fc.nmvc; MB_MODE_INFO *const mbmi = &mi->mbmi; - int_mv *const mv0 = &mbmi->mv[0]; - int_mv *const mv1 = &mbmi->mv[1]; const BLOCK_SIZE bsize = mbmi->sb_type; const int allow_hp = xd->allow_high_precision_mv; @@ -518,41 +554,12 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi, mi_row, mi_col); } - switch (b_mode) { - case NEWMV: - read_mv(r, &block[0].as_mv, &best[0].as_mv, nmvc, &cm->counts.mv, - allow_hp); - if (is_compound) - read_mv(r, &block[1].as_mv, &best[1].as_mv, nmvc, &cm->counts.mv, - allow_hp); - break; - case NEARESTMV: - block[0].as_int = nearest[0].as_int; - if (is_compound) - block[1].as_int = nearest[1].as_int; - break; - case NEARMV: - block[0].as_int = nearmv[0].as_int; - if (is_compound) - block[1].as_int = nearmv[1].as_int; - break; - case ZEROMV: - block[0].as_int = 0; - if (is_compound) - block[1].as_int = 0; - break; - default: - assert(!"Invalid inter mode value"); - } - mi->bmi[j].as_mv[0].as_int = block[0].as_int; - assert(block[0].as_mv.row < MV_UPP && block[0].as_mv.row > MV_LOW); - assert(block[0].as_mv.col < MV_UPP && block[0].as_mv.col > MV_LOW); + assign_mv(cm, b_mode, block, best, nearest, nearmv, + is_compound, allow_hp, r); - if (is_compound) { + mi->bmi[j].as_mv[0].as_int = block[0].as_int; + if (is_compound) mi->bmi[j].as_mv[1].as_int = block[1].as_int; - assert(block[1].as_mv.row < MV_UPP && block[1].as_mv.row > MV_LOW); - assert(block[1].as_mv.col < MV_UPP && block[1].as_mv.col > MV_LOW); - } if (num_4x4_h == 2) mi->bmi[j + 2] = mi->bmi[j]; @@ -562,43 +569,12 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi, } mi->mbmi.mode = b_mode; - mv0->as_int = mi->bmi[3].as_mv[0].as_int; - mv1->as_int = mi->bmi[3].as_mv[1].as_int; + + mbmi->mv[0].as_int = mi->bmi[3].as_mv[0].as_int; + mbmi->mv[1].as_int = mi->bmi[3].as_mv[1].as_int; } else { - switch (mbmi->mode) { - case NEARMV: - mv0->as_int = nearmv[0].as_int; - if (is_compound) - mv1->as_int = nearmv[1].as_int; - break; - - case NEARESTMV: - mv0->as_int = nearest[0].as_int; - if (is_compound) - mv1->as_int = nearest[1].as_int; - break; - - case ZEROMV: - mv0->as_int = 0; - if (is_compound) - mv1->as_int = 0; - break; - - case NEWMV: - read_mv(r, &mv0->as_mv, &best[0].as_mv, nmvc, &cm->counts.mv, allow_hp); - if (is_compound) - read_mv(r, &mv1->as_mv, &best[1].as_mv, nmvc, &cm->counts.mv, - allow_hp); - break; - default: - assert(!"Invalid inter mode value"); - } - assert(mv0->as_mv.row < MV_UPP && mv0->as_mv.row > MV_LOW); - assert(mv0->as_mv.col < MV_UPP && mv0->as_mv.col > MV_LOW); - if (is_compound) { - assert(mv1->as_mv.row < MV_UPP && mv1->as_mv.row > MV_LOW); - assert(mv1->as_mv.col < MV_UPP && mv1->as_mv.col > MV_LOW); - } + assign_mv(cm, mbmi->mode, mbmi->mv, best, nearest, nearmv, + is_compound, allow_hp, r); } }