Index: source/libvpx/vp9/encoder/vp9_encodeframe.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_encodeframe.c (revision 223160) |
+++ source/libvpx/vp9/encoder/vp9_encodeframe.c (working copy) |
@@ -1316,7 +1316,6 @@ |
save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
x->fast_ms = 0; |
- x->pred_mv.as_int = 0; |
x->subblock_ref = 0; |
if (cpi->sf.adjust_partitioning_from_last_frame) { |
@@ -1710,10 +1709,6 @@ |
// Set fast motion search level. |
x->fast_ms = 1; |
- // Calculate prediction MV. |
- x->pred_mv.as_mv.row = (mvr0 + mvr1 + mvr2 + mvr3) >> 2; |
- x->pred_mv.as_mv.col = (mvc0 + mvc1 + mvc2 + mvc3) >> 2; |
- |
if (ref0 == ref1 && ref1 == ref2 && ref2 == ref3 && |
d01 < 2 && d23 < 2 && d02 < 2 && d13 < 2) { |
// Set fast motion search level. |
@@ -1729,6 +1724,14 @@ |
} |
} |
+static INLINE void store_pred_mv(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx) { |
+ vpx_memcpy(ctx->pred_mv, x->pred_mv, sizeof(x->pred_mv)); |
+} |
+ |
+static INLINE void load_pred_mv(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx) { |
+ vpx_memcpy(x->pred_mv, ctx->pred_mv, sizeof(x->pred_mv)); |
+} |
+ |
// TODO(jingning,jimbankoski,rbultje): properly skip partition types that are |
// unlikely to be selected depending on previous rate-distortion optimization |
// results, for encoding speed-up. |
@@ -1837,6 +1840,10 @@ |
restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); |
} |
+ // store estimated motion vector |
+ if (cpi->sf.adaptive_motion_search) |
+ store_pred_mv(x, get_block_context(x, bsize)); |
+ |
// PARTITION_SPLIT |
sum_rd = 0; |
// TODO(jingning): use the motion vectors given by the above search as |
@@ -1851,7 +1858,8 @@ |
continue; |
*get_sb_index(xd, subsize) = i; |
- |
+ if (cpi->sf.adaptive_motion_search) |
+ load_pred_mv(x, get_block_context(x, bsize)); |
rd_pick_partition(cpi, tp, mi_row + y_idx, mi_col + x_idx, subsize, |
&this_rate, &this_dist, i != 3, best_rd - sum_rd); |
@@ -1885,7 +1893,6 @@ |
} |
x->fast_ms = 0; |
- x->pred_mv.as_int = 0; |
x->subblock_ref = 0; |
if (partition_split_done && |
@@ -1897,6 +1904,8 @@ |
if (partition_horz_allowed && do_rect) { |
subsize = get_subsize(bsize, PARTITION_HORZ); |
*get_sb_index(xd, subsize) = 0; |
+ if (cpi->sf.adaptive_motion_search) |
+ load_pred_mv(x, get_block_context(x, bsize)); |
pick_sb_modes(cpi, mi_row, mi_col, &sum_rate, &sum_dist, subsize, |
get_block_context(x, subsize), best_rd); |
sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); |
@@ -1906,6 +1915,8 @@ |
encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); |
*get_sb_index(xd, subsize) = 1; |
+ if (cpi->sf.adaptive_motion_search) |
+ load_pred_mv(x, get_block_context(x, bsize)); |
pick_sb_modes(cpi, mi_row + ms, mi_col, &this_rate, |
&this_dist, subsize, get_block_context(x, subsize), |
best_rd - sum_rd); |
@@ -1937,6 +1948,8 @@ |
subsize = get_subsize(bsize, PARTITION_VERT); |
*get_sb_index(xd, subsize) = 0; |
+ if (cpi->sf.adaptive_motion_search) |
+ load_pred_mv(x, get_block_context(x, bsize)); |
pick_sb_modes(cpi, mi_row, mi_col, &sum_rate, &sum_dist, subsize, |
get_block_context(x, subsize), best_rd); |
sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); |
@@ -1945,6 +1958,8 @@ |
encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); |
*get_sb_index(xd, subsize) = 1; |
+ if (cpi->sf.adaptive_motion_search) |
+ load_pred_mv(x, get_block_context(x, bsize)); |
pick_sb_modes(cpi, mi_row, mi_col + ms, &this_rate, |
&this_dist, subsize, get_block_context(x, subsize), |
best_rd - sum_rd); |