Refactor motion vector residual coding process
This commit separates the predicted motion vector from the nearestmv
motion vector in the coding process for both regular and sub8x8
block sizes.
Change-Id: I703490513b0194e6669ebf719352db015facb3e1
diff --git a/vp10/common/blockd.h b/vp10/common/blockd.h
index de91431..92a0885 100644
--- a/vp10/common/blockd.h
+++ b/vp10/common/blockd.h
@@ -102,7 +102,7 @@
PREDICTION_MODE as_mode;
int_mv as_mv[2]; // first, second inter predictor motion vectors
#if CONFIG_REF_MV
- int_mv pred_mv[2];
+ int_mv pred_mv_s8[2];
#endif
#if CONFIG_EXT_INTER
int_mv ref_mv[2];
diff --git a/vp10/common/mvref_common.c b/vp10/common/mvref_common.c
index 2a8bc78..30d7790 100644
--- a/vp10/common/mvref_common.c
+++ b/vp10/common/mvref_common.c
@@ -811,11 +811,12 @@
ref_mv_stack[above_count] = tmp_mv;
}
- for (idx = 0; idx < VPXMIN(MAX_MV_REF_CANDIDATES, *ref_mv_count); ++idx) {
- mv_list[idx].as_int = ref_mv_stack[idx].this_mv.as_int;
- clamp_mv_ref(&mv_list[idx].as_mv,
+ for (idx = 0; idx < *ref_mv_count; ++idx)
+ clamp_mv_ref(&ref_mv_stack[idx].this_mv.as_mv,
xd->n8_w << 3, xd->n8_h << 3, xd);
- }
+
+ for (idx = 0; idx < VPXMIN(MAX_MV_REF_CANDIDATES, *ref_mv_count); ++idx)
+ mv_list[idx].as_int = ref_mv_stack[idx].this_mv.as_int;
#endif
near_mv->as_int = 0;
diff --git a/vp10/common/mvref_common.h b/vp10/common/mvref_common.h
index 76530e9..3a68b4d 100644
--- a/vp10/common/mvref_common.h
+++ b/vp10/common/mvref_common.h
@@ -156,7 +156,7 @@
int search_col, int block_idx) {
return block_idx >= 0 && candidate->mbmi.sb_type < BLOCK_8X8
? candidate->bmi[idx_n_column_to_subblock[block_idx][search_col == 0]]
- .pred_mv[which_mv]
+ .pred_mv_s8[which_mv]
: candidate->mbmi.pred_mv[which_mv];
}
#endif
diff --git a/vp10/decoder/decodemv.c b/vp10/decoder/decodemv.c
index 5b2fa1f..a76d5d8 100644
--- a/vp10/decoder/decodemv.c
+++ b/vp10/decoder/decodemv.c
@@ -933,7 +933,7 @@
MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
BLOCK_SIZE bsize = mbmi->sb_type;
int_mv *pred_mv = (bsize >= BLOCK_8X8) ?
- mbmi->pred_mv : xd->mi[0]->bmi[block].pred_mv;
+ mbmi->pred_mv : xd->mi[0]->bmi[block].pred_mv_s8;
#endif
switch (mode) {
@@ -1366,6 +1366,7 @@
for (idx = 0; idx < 2; idx += num_4x4_w) {
int_mv block[2];
const int j = idy * 2 + idx;
+ int_mv ref_mv_s8[2];
#if CONFIG_REF_MV
#if CONFIG_EXT_INTER
if (!is_compound)
@@ -1423,6 +1424,13 @@
#endif // CONFIG_EXT_INTER
}
+ for (ref = 0; ref < 2; ++ref) {
+ ref_mv_s8[ref] = nearestmv[ref];
+ }
+#if CONFIG_EXT_INTER
+ (void)ref_mv_s8;
+#endif
+
if (!assign_mv(cm, xd, b_mode,
#if CONFIG_REF_MV
j,
@@ -1431,7 +1439,7 @@
#if CONFIG_EXT_INTER
ref_mv[mv_idx],
#else
- nearestmv,
+ ref_mv_s8,
#endif // CONFIG_EXT_INTER
nearest_sub8x8, near_sub8x8,
is_compound, allow_hp, r)) {
@@ -1451,8 +1459,8 @@
}
#if CONFIG_REF_MV
- mbmi->pred_mv[0].as_int = mi->bmi[3].pred_mv[0].as_int;
- mbmi->pred_mv[1].as_int = mi->bmi[3].pred_mv[1].as_int;
+ mbmi->pred_mv[0].as_int = mi->bmi[3].pred_mv_s8[0].as_int;
+ mbmi->pred_mv[1].as_int = mi->bmi[3].pred_mv_s8[1].as_int;
#endif
mi->mbmi.mode = b_mode;
@@ -1460,19 +1468,19 @@
mbmi->mv[1].as_int = mi->bmi[3].as_mv[1].as_int;
} else {
int ref;
+ int_mv ref_mv[2] = { nearestmv[0], nearestmv[1] };
for (ref = 0; ref < 1 + is_compound && mbmi->mode == NEWMV; ++ref) {
- int_mv ref_mv = nearestmv[ref];
#if CONFIG_REF_MV
uint8_t ref_frame_type = vp10_ref_frame_type(mbmi->ref_frame);
if (xd->ref_mv_count[ref_frame_type] > 1) {
- ref_mv = (ref == 0) ?
+ ref_mv[ref] = (ref == 0) ?
xd->ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx].this_mv :
xd->ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx].comp_mv;
- clamp_mv_ref(&ref_mv.as_mv, xd->n8_w << 3, xd->n8_h << 3, xd);
- lower_mv_precision(&ref_mv.as_mv, allow_hp);
+ clamp_mv_ref(&ref_mv[ref].as_mv, xd->n8_w << 3, xd->n8_h << 3, xd);
+ lower_mv_precision(&ref_mv[ref].as_mv, allow_hp);
}
#endif
- nearestmv[ref] = ref_mv;
+ nearestmv[ref] = ref_mv[ref];
}
xd->corrupted |= !assign_mv(cm, xd, mbmi->mode,
@@ -1484,7 +1492,7 @@
mbmi->mode == NEWFROMNEARMV ?
nearmv : nearestmv,
#else
- nearestmv,
+ ref_mv,
#endif // CONFIG_EXT_INTER
nearestmv, nearmv, is_compound, allow_hp, r);
}
diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c
index a4a7d9f..c0767dc 100644
--- a/vp10/encoder/bitstream.c
+++ b/vp10/encoder/bitstream.c
@@ -1186,7 +1186,11 @@
#if CONFIG_EXT_INTER
&mi->bmi[j].ref_mv[ref].as_mv,
#else
+#if CONFIG_REF_MV
+ &mi->bmi[j].pred_mv_s8[ref].as_mv,
+#else
&mbmi_ext->ref_mvs[mbmi->ref_frame[ref]][0].as_mv,
+#endif // CONFIG_REF_MV
#endif // CONFIG_EXT_INTER
nmvc, allow_hp);
}
diff --git a/vp10/encoder/encodemv.c b/vp10/encoder/encodemv.c
index 7941363..a5bfd1a 100644
--- a/vp10/encoder/encodemv.c
+++ b/vp10/encoder/encodemv.c
@@ -268,6 +268,9 @@
#if CONFIG_EXT_INTER
static void inc_mvs(const MB_MODE_INFO *mbmi, const MB_MODE_INFO_EXT *mbmi_ext,
const int_mv mvs[2],
+#if CONFIG_REF_MV
+ const int_mv pred_mvs[2],
+#endif
nmv_context_counts *nmv_counts) {
int i;
PREDICTION_MODE mode = mbmi->mode;
@@ -285,6 +288,7 @@
int nmv_ctx = vp10_nmv_ctx(mbmi_ext->ref_mv_count[mbmi->ref_frame[i]],
mbmi_ext->ref_mv_stack[mbmi->ref_frame[i]]);
nmv_context_counts *counts = &nmv_counts[nmv_ctx];
+ (void)pred_mvs;
#endif
vp10_inc_mv(&diff, counts, vp10_use_mv_hp(ref));
}
@@ -363,6 +367,9 @@
#else
static void inc_mvs(const MB_MODE_INFO *mbmi, const MB_MODE_INFO_EXT *mbmi_ext,
const int_mv mvs[2],
+#if CONFIG_REF_MV
+ const int_mv pred_mvs[2],
+#endif
nmv_context_counts *nmv_counts) {
int i;
#if !CONFIG_REF_MV
@@ -374,8 +381,10 @@
int nmv_ctx = vp10_nmv_ctx(mbmi_ext->ref_mv_count[mbmi->ref_frame[i]],
mbmi_ext->ref_mv_stack[mbmi->ref_frame[i]]);
nmv_context_counts *counts = &nmv_counts[nmv_ctx];
-#endif
+ const MV *ref = &pred_mvs[i].as_mv;
+#else
const MV *ref = &mbmi_ext->ref_mvs[mbmi->ref_frame[i]][0].as_mv;
+#endif
const MV diff = {mvs[i].as_mv.row - ref->row,
mvs[i].as_mv.col - ref->col};
vp10_inc_mv(&diff, counts, vp10_use_mv_hp(ref));
@@ -411,6 +420,7 @@
if (mi->bmi[i].as_mode == NEWMV)
inc_mvs(mbmi, mbmi_ext, mi->bmi[i].as_mv,
#if CONFIG_REF_MV
+ mi->bmi[i].pred_mv_s8,
td->counts->mv);
#else
&td->counts->mv);
@@ -426,6 +436,7 @@
#endif // CONFIG_EXT_INTER
inc_mvs(mbmi, mbmi_ext, mbmi->mv,
#if CONFIG_REF_MV
+ mbmi->pred_mv,
td->counts->mv);
#else
&td->counts->mv);
diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c
index fb6e0c3..9d6a088 100644
--- a/vp10/encoder/rdopt.c
+++ b/vp10/encoder/rdopt.c
@@ -4207,15 +4207,13 @@
#if CONFIG_REF_MV
if (mode == NEWMV) {
- mic->bmi[i].pred_mv[0].as_int =
- mbmi_ext->ref_mvs[mbmi->ref_frame[0]][0].as_int;
+ mic->bmi[i].pred_mv_s8[0].as_int = best_ref_mv[0]->as_int;
if (is_compound)
- mic->bmi[i].pred_mv[1].as_int =
- mbmi_ext->ref_mvs[mbmi->ref_frame[1]][0].as_int;
+ mic->bmi[i].pred_mv_s8[1].as_int = best_ref_mv[1]->as_int;
} else {
- mic->bmi[i].pred_mv[0].as_int = this_mv[0].as_int;
+ mic->bmi[i].pred_mv_s8[0].as_int = this_mv[0].as_int;
if (is_compound)
- mic->bmi[i].pred_mv[1].as_int = this_mv[1].as_int;
+ mic->bmi[i].pred_mv_s8[1].as_int = this_mv[1].as_int;
}
#endif
@@ -4355,6 +4353,9 @@
int64_t bsse;
int64_t brdcost;
int_mv mvs[2];
+#if CONFIG_REF_MV
+ int_mv pred_mv[2];
+#endif
#if CONFIG_EXT_INTER
int_mv ref_mv[2];
#endif // CONFIG_EXT_INTER
@@ -4853,6 +4854,12 @@
#endif // CONFIG_EXT_INTER
&frame_mv[NEARESTMV][frame],
&frame_mv[NEARMV][frame]);
+
+#if CONFIG_REF_MV
+ if (ref_mv_count[ref] > 0)
+ bsi->ref_mv[ref] = &ref_mv_stack[ref][0].this_mv;
+#endif
+
#if CONFIG_EXT_INTER
mv_ref_list[0].as_int = frame_mv[NEARESTMV][frame].as_int;
mv_ref_list[1].as_int = frame_mv[NEARMV][frame].as_int;
@@ -5138,6 +5145,16 @@
if (num_4x4_blocks_high > 1)
bsi->rdstat[i + 2][mode_idx].mvs[ref].as_int =
mode_mv[this_mode][ref].as_int;
+#if CONFIG_REF_MV
+ bsi->rdstat[i][mode_idx].pred_mv[ref].as_int =
+ mi->bmi[i].pred_mv_s8[ref].as_int;
+ if (num_4x4_blocks_wide > 1)
+ bsi->rdstat[i + 1][mode_idx].pred_mv[ref].as_int =
+ mi->bmi[i].pred_mv_s8[ref].as_int;
+ if (num_4x4_blocks_high > 1)
+ bsi->rdstat[i + 2][mode_idx].pred_mv[ref].as_int =
+ mi->bmi[i].pred_mv_s8[ref].as_int;
+#endif
#if CONFIG_EXT_INTER
bsi->rdstat[i][mode_idx].ref_mv[ref].as_int =
bsi->ref_mv[ref]->as_int;
@@ -5312,6 +5329,11 @@
mi->bmi[i].as_mv[0].as_int = bsi->rdstat[i][mode_idx].mvs[0].as_int;
if (has_second_ref(mbmi))
mi->bmi[i].as_mv[1].as_int = bsi->rdstat[i][mode_idx].mvs[1].as_int;
+#if CONFIG_REF_MV
+ mi->bmi[i].pred_mv_s8[0] = bsi->rdstat[i][mode_idx].pred_mv[0];
+ if (has_second_ref(mbmi))
+ mi->bmi[i].pred_mv_s8[1] = bsi->rdstat[i][mode_idx].pred_mv[1];
+#endif
#if CONFIG_EXT_INTER
mi->bmi[i].ref_mv[0].as_int = bsi->rdstat[i][mode_idx].ref_mv[0].as_int;
if (has_second_rf)
@@ -9641,8 +9663,8 @@
mbmi->mv[0].as_int = xd->mi[0]->bmi[3].as_mv[0].as_int;
mbmi->mv[1].as_int = xd->mi[0]->bmi[3].as_mv[1].as_int;
#if CONFIG_REF_MV
- mbmi->pred_mv[0].as_int = xd->mi[0]->bmi[3].pred_mv[0].as_int;
- mbmi->pred_mv[1].as_int = xd->mi[0]->bmi[3].pred_mv[1].as_int;
+ mbmi->pred_mv[0].as_int = xd->mi[0]->bmi[3].pred_mv_s8[0].as_int;
+ mbmi->pred_mv[1].as_int = xd->mi[0]->bmi[3].pred_mv_s8[1].as_int;
#endif
}