Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
michael@0 | 1 | /* |
michael@0 | 2 | * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
michael@0 | 3 | * |
michael@0 | 4 | * Use of this source code is governed by a BSD-style license |
michael@0 | 5 | * that can be found in the LICENSE file in the root of the source |
michael@0 | 6 | * tree. An additional intellectual property rights grant can be found |
michael@0 | 7 | * in the file PATENTS. All contributing project authors may |
michael@0 | 8 | * be found in the AUTHORS file in the root of the source tree. |
michael@0 | 9 | */ |
michael@0 | 10 | |
michael@0 | 11 | #include "vp9/common/vp9_findnearmv.h" |
michael@0 | 12 | #include "vp9/common/vp9_mvref_common.h" |
michael@0 | 13 | |
michael@0 | 14 | static void lower_mv_precision(MV *mv, int allow_hp) { |
michael@0 | 15 | const int use_hp = allow_hp && vp9_use_mv_hp(mv); |
michael@0 | 16 | if (!use_hp) { |
michael@0 | 17 | if (mv->row & 1) |
michael@0 | 18 | mv->row += (mv->row > 0 ? -1 : 1); |
michael@0 | 19 | if (mv->col & 1) |
michael@0 | 20 | mv->col += (mv->col > 0 ? -1 : 1); |
michael@0 | 21 | } |
michael@0 | 22 | } |
michael@0 | 23 | |
michael@0 | 24 | |
michael@0 | 25 | void vp9_find_best_ref_mvs(MACROBLOCKD *xd, int allow_hp, |
michael@0 | 26 | int_mv *mvlist, int_mv *nearest, int_mv *near) { |
michael@0 | 27 | int i; |
michael@0 | 28 | // Make sure all the candidates are properly clamped etc |
michael@0 | 29 | for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i) { |
michael@0 | 30 | lower_mv_precision(&mvlist[i].as_mv, allow_hp); |
michael@0 | 31 | clamp_mv2(&mvlist[i].as_mv, xd); |
michael@0 | 32 | } |
michael@0 | 33 | *nearest = mvlist[0]; |
michael@0 | 34 | *near = mvlist[1]; |
michael@0 | 35 | } |
michael@0 | 36 | |
michael@0 | 37 | void vp9_append_sub8x8_mvs_for_idx(VP9_COMMON *cm, MACROBLOCKD *xd, |
michael@0 | 38 | const TileInfo *const tile, |
michael@0 | 39 | int_mv *dst_nearest, |
michael@0 | 40 | int_mv *dst_near, |
michael@0 | 41 | int block_idx, int ref_idx, |
michael@0 | 42 | int mi_row, int mi_col) { |
michael@0 | 43 | int_mv dst_list[MAX_MV_REF_CANDIDATES]; |
michael@0 | 44 | int_mv mv_list[MAX_MV_REF_CANDIDATES]; |
michael@0 | 45 | MODE_INFO *const mi = xd->mi_8x8[0]; |
michael@0 | 46 | |
michael@0 | 47 | assert(ref_idx == 0 || ref_idx == 1); |
michael@0 | 48 | assert(MAX_MV_REF_CANDIDATES == 2); // makes code here slightly easier |
michael@0 | 49 | |
michael@0 | 50 | vp9_find_mv_refs_idx(cm, xd, tile, mi, xd->last_mi, |
michael@0 | 51 | mi->mbmi.ref_frame[ref_idx], |
michael@0 | 52 | mv_list, block_idx, mi_row, mi_col); |
michael@0 | 53 | |
michael@0 | 54 | dst_list[1].as_int = 0; |
michael@0 | 55 | if (block_idx == 0) { |
michael@0 | 56 | vpx_memcpy(dst_list, mv_list, MAX_MV_REF_CANDIDATES * sizeof(int_mv)); |
michael@0 | 57 | } else if (block_idx == 1 || block_idx == 2) { |
michael@0 | 58 | int dst = 0, n; |
michael@0 | 59 | b_mode_info *bmi = mi->bmi; |
michael@0 | 60 | |
michael@0 | 61 | dst_list[dst++].as_int = bmi[0].as_mv[ref_idx].as_int; |
michael@0 | 62 | for (n = 0; dst < MAX_MV_REF_CANDIDATES && |
michael@0 | 63 | n < MAX_MV_REF_CANDIDATES; n++) |
michael@0 | 64 | if (mv_list[n].as_int != dst_list[0].as_int) |
michael@0 | 65 | dst_list[dst++].as_int = mv_list[n].as_int; |
michael@0 | 66 | } else { |
michael@0 | 67 | int dst = 0, n; |
michael@0 | 68 | b_mode_info *bmi = mi->bmi; |
michael@0 | 69 | |
michael@0 | 70 | assert(block_idx == 3); |
michael@0 | 71 | dst_list[dst++].as_int = bmi[2].as_mv[ref_idx].as_int; |
michael@0 | 72 | if (dst_list[0].as_int != bmi[1].as_mv[ref_idx].as_int) |
michael@0 | 73 | dst_list[dst++].as_int = bmi[1].as_mv[ref_idx].as_int; |
michael@0 | 74 | if (dst < MAX_MV_REF_CANDIDATES && |
michael@0 | 75 | dst_list[0].as_int != bmi[0].as_mv[ref_idx].as_int) |
michael@0 | 76 | dst_list[dst++].as_int = bmi[0].as_mv[ref_idx].as_int; |
michael@0 | 77 | for (n = 0; dst < MAX_MV_REF_CANDIDATES && |
michael@0 | 78 | n < MAX_MV_REF_CANDIDATES; n++) |
michael@0 | 79 | if (mv_list[n].as_int != dst_list[0].as_int) |
michael@0 | 80 | dst_list[dst++].as_int = mv_list[n].as_int; |
michael@0 | 81 | } |
michael@0 | 82 | |
michael@0 | 83 | dst_nearest->as_int = dst_list[0].as_int; |
michael@0 | 84 | dst_near->as_int = dst_list[1].as_int; |
michael@0 | 85 | } |