ref: bde3ae0c6021e49f254b8cacb26b93fc3d40bda6
parent: d975804e9abcff9c6c2c3c3384ceb3dc04f5c087
author: Dmitry Kovalev <[email protected]>
date: Thu Oct 3 16:06:32 EDT 2013
Adding assign_mv() function to reduce code duplication. Change-Id: I2b4e5b842c19f64749b18946ad215c0caa57e7b7
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -426,6 +426,45 @@
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 @@
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 @@
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 @@
}
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;
- } 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);
- }
+ 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 {
+ assign_mv(cm, mbmi->mode, mbmi->mv, best, nearest, nearmv,
+ is_compound, allow_hp, r);
}
}