Index: source/libvpx/vp9/common/vp9_findnearmv.c |
=================================================================== |
--- source/libvpx/vp9/common/vp9_findnearmv.c (revision 240950) |
+++ source/libvpx/vp9/common/vp9_findnearmv.c (working copy) |
@@ -36,50 +36,49 @@ |
void vp9_append_sub8x8_mvs_for_idx(VP9_COMMON *cm, MACROBLOCKD *xd, |
const TileInfo *const tile, |
- int_mv *dst_nearest, |
- int_mv *dst_near, |
- int block_idx, int ref_idx, |
- int mi_row, int mi_col) { |
- int_mv dst_list[MAX_MV_REF_CANDIDATES]; |
+ int block, int ref, int mi_row, int mi_col, |
+ int_mv *nearest, int_mv *near) { |
int_mv mv_list[MAX_MV_REF_CANDIDATES]; |
MODE_INFO *const mi = xd->mi_8x8[0]; |
+ b_mode_info *bmi = mi->bmi; |
+ int n; |
- assert(ref_idx == 0 || ref_idx == 1); |
- assert(MAX_MV_REF_CANDIDATES == 2); // makes code here slightly easier |
+ assert(MAX_MV_REF_CANDIDATES == 2); |
- vp9_find_mv_refs_idx(cm, xd, tile, mi, xd->last_mi, |
- mi->mbmi.ref_frame[ref_idx], |
- mv_list, block_idx, mi_row, mi_col); |
+ vp9_find_mv_refs_idx(cm, xd, tile, mi, xd->last_mi, mi->mbmi.ref_frame[ref], |
+ mv_list, block, mi_row, mi_col); |
- dst_list[1].as_int = 0; |
- if (block_idx == 0) { |
- vpx_memcpy(dst_list, mv_list, MAX_MV_REF_CANDIDATES * sizeof(int_mv)); |
- } else if (block_idx == 1 || block_idx == 2) { |
- int dst = 0, n; |
- b_mode_info *bmi = mi->bmi; |
+ near->as_int = 0; |
+ switch (block) { |
+ case 0: |
+ nearest->as_int = mv_list[0].as_int; |
+ near->as_int = mv_list[1].as_int; |
+ break; |
+ case 1: |
+ case 2: |
+ nearest->as_int = bmi[0].as_mv[ref].as_int; |
+ for (n = 0; n < MAX_MV_REF_CANDIDATES; ++n) |
+ if (nearest->as_int != mv_list[n].as_int) { |
+ near->as_int = mv_list[n].as_int; |
+ break; |
+ } |
+ break; |
+ case 3: { |
+ int_mv candidates[2 + MAX_MV_REF_CANDIDATES]; |
+ candidates[0] = bmi[1].as_mv[ref]; |
+ candidates[1] = bmi[0].as_mv[ref]; |
+ candidates[2] = mv_list[0]; |
+ candidates[3] = mv_list[1]; |
- dst_list[dst++].as_int = bmi[0].as_mv[ref_idx].as_int; |
- for (n = 0; dst < MAX_MV_REF_CANDIDATES && |
- n < MAX_MV_REF_CANDIDATES; n++) |
- if (mv_list[n].as_int != dst_list[0].as_int) |
- dst_list[dst++].as_int = mv_list[n].as_int; |
- } else { |
- int dst = 0, n; |
- b_mode_info *bmi = mi->bmi; |
- |
- assert(block_idx == 3); |
- dst_list[dst++].as_int = bmi[2].as_mv[ref_idx].as_int; |
- if (dst_list[0].as_int != bmi[1].as_mv[ref_idx].as_int) |
- dst_list[dst++].as_int = bmi[1].as_mv[ref_idx].as_int; |
- if (dst < MAX_MV_REF_CANDIDATES && |
- dst_list[0].as_int != bmi[0].as_mv[ref_idx].as_int) |
- dst_list[dst++].as_int = bmi[0].as_mv[ref_idx].as_int; |
- for (n = 0; dst < MAX_MV_REF_CANDIDATES && |
- n < MAX_MV_REF_CANDIDATES; n++) |
- if (mv_list[n].as_int != dst_list[0].as_int) |
- dst_list[dst++].as_int = mv_list[n].as_int; |
+ nearest->as_int = bmi[2].as_mv[ref].as_int; |
+ for (n = 0; n < 2 + MAX_MV_REF_CANDIDATES; ++n) |
+ if (nearest->as_int != candidates[n].as_int) { |
+ near->as_int = candidates[n].as_int; |
+ break; |
+ } |
+ break; |
+ } |
+ default: |
+ assert("Invalid block index."); |
} |
- |
- dst_nearest->as_int = dst_list[0].as_int; |
- dst_near->as_int = dst_list[1].as_int; |
} |