Index: source/libvpx/vp9/encoder/vp9_encodemv.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_encodemv.c (revision 232232) |
+++ source/libvpx/vp9/encoder/vp9_encodemv.c (working copy) |
@@ -8,13 +8,13 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
+#include <math.h> |
#include "vp9/common/vp9_common.h" |
-#include "vp9/encoder/vp9_encodemv.h" |
#include "vp9/common/vp9_entropymode.h" |
#include "vp9/common/vp9_systemdependent.h" |
+#include "vp9/encoder/vp9_encodemv.h" |
-#include <math.h> |
#ifdef ENTROPY_STATS |
extern unsigned int active_section; |
@@ -314,44 +314,34 @@ |
build_nmv_component_cost_table(mvcost[1], &mvctx->comps[1], usehp); |
} |
-void vp9_update_nmv_count(VP9_COMP *cpi, MACROBLOCK *x, |
- int_mv *best_ref_mv, int_mv *second_best_ref_mv) { |
+static void inc_mvs(int_mv mv[2], int_mv ref[2], int is_compound, |
+ nmv_context_counts *counts) { |
+ int i; |
+ for (i = 0; i < 1 + is_compound; ++i) { |
+ const MV diff = { mv[i].as_mv.row - ref[i].as_mv.row, |
+ mv[i].as_mv.col - ref[i].as_mv.col }; |
+ vp9_inc_mv(&diff, counts); |
+ } |
+} |
+ |
+void vp9_update_mv_count(VP9_COMP *cpi, MACROBLOCK *x, int_mv best_ref_mv[2]) { |
MODE_INFO *mi = x->e_mbd.mi_8x8[0]; |
MB_MODE_INFO *const mbmi = &mi->mbmi; |
- MV diff; |
- const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type]; |
- const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type]; |
- int idx, idy; |
+ const int is_compound = has_second_ref(mbmi); |
if (mbmi->sb_type < BLOCK_8X8) { |
- PARTITION_INFO *pi = x->partition_info; |
- for (idy = 0; idy < 2; idy += num_4x4_blocks_high) { |
- for (idx = 0; idx < 2; idx += num_4x4_blocks_wide) { |
- const int i = idy * 2 + idx; |
- if (pi->bmi[i].mode == NEWMV) { |
- diff.row = mi->bmi[i].as_mv[0].as_mv.row - best_ref_mv->as_mv.row; |
- diff.col = mi->bmi[i].as_mv[0].as_mv.col - best_ref_mv->as_mv.col; |
- vp9_inc_mv(&diff, &cpi->NMVcount); |
+ const int num_4x4_w = num_4x4_blocks_wide_lookup[mbmi->sb_type]; |
+ const int num_4x4_h = num_4x4_blocks_high_lookup[mbmi->sb_type]; |
+ int idx, idy; |
- if (mi->mbmi.ref_frame[1] > INTRA_FRAME) { |
- diff.row = mi->bmi[i].as_mv[1].as_mv.row - |
- second_best_ref_mv->as_mv.row; |
- diff.col = mi->bmi[i].as_mv[1].as_mv.col - |
- second_best_ref_mv->as_mv.col; |
- vp9_inc_mv(&diff, &cpi->NMVcount); |
- } |
- } |
+ for (idy = 0; idy < 2; idy += num_4x4_h) { |
+ for (idx = 0; idx < 2; idx += num_4x4_w) { |
+ const int i = idy * 2 + idx; |
+ if (mi->bmi[i].as_mode == NEWMV) |
+ inc_mvs(mi->bmi[i].as_mv, best_ref_mv, is_compound, &cpi->NMVcount); |
} |
} |
} else if (mbmi->mode == NEWMV) { |
- diff.row = mbmi->mv[0].as_mv.row - best_ref_mv->as_mv.row; |
- diff.col = mbmi->mv[0].as_mv.col - best_ref_mv->as_mv.col; |
- vp9_inc_mv(&diff, &cpi->NMVcount); |
- |
- if (mbmi->ref_frame[1] > INTRA_FRAME) { |
- diff.row = mbmi->mv[1].as_mv.row - second_best_ref_mv->as_mv.row; |
- diff.col = mbmi->mv[1].as_mv.col - second_best_ref_mv->as_mv.col; |
- vp9_inc_mv(&diff, &cpi->NMVcount); |
- } |
+ inc_mvs(mbmi->mv, best_ref_mv, is_compound, &cpi->NMVcount); |
} |
} |