11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VP8_COMMON_FINDNEARMV_H_ 13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP8_COMMON_FINDNEARMV_H_ 141b362b15af34006e6a11974088a46d42b903418eJohann 151b362b15af34006e6a11974088a46d42b903418eJohann#include "mv.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "blockd.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "modecont.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "treecoder.h" 191b362b15af34006e6a11974088a46d42b903418eJohann 20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 241b362b15af34006e6a11974088a46d42b903418eJohann 251b362b15af34006e6a11974088a46d42b903418eJohannstatic void mv_bias(int refmb_ref_frame_sign_bias, int refframe, int_mv *mvp, 261b362b15af34006e6a11974088a46d42b903418eJohann const int *ref_frame_sign_bias) 271b362b15af34006e6a11974088a46d42b903418eJohann{ 281b362b15af34006e6a11974088a46d42b903418eJohann if (refmb_ref_frame_sign_bias != ref_frame_sign_bias[refframe]) 291b362b15af34006e6a11974088a46d42b903418eJohann { 301b362b15af34006e6a11974088a46d42b903418eJohann mvp->as_mv.row *= -1; 311b362b15af34006e6a11974088a46d42b903418eJohann mvp->as_mv.col *= -1; 321b362b15af34006e6a11974088a46d42b903418eJohann } 331b362b15af34006e6a11974088a46d42b903418eJohann} 341b362b15af34006e6a11974088a46d42b903418eJohann 351b362b15af34006e6a11974088a46d42b903418eJohann#define LEFT_TOP_MARGIN (16 << 3) 361b362b15af34006e6a11974088a46d42b903418eJohann#define RIGHT_BOTTOM_MARGIN (16 << 3) 371b362b15af34006e6a11974088a46d42b903418eJohannstatic void vp8_clamp_mv2(int_mv *mv, const MACROBLOCKD *xd) 381b362b15af34006e6a11974088a46d42b903418eJohann{ 391b362b15af34006e6a11974088a46d42b903418eJohann if (mv->as_mv.col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN)) 401b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.col = xd->mb_to_left_edge - LEFT_TOP_MARGIN; 411b362b15af34006e6a11974088a46d42b903418eJohann else if (mv->as_mv.col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN) 421b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.col = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN; 431b362b15af34006e6a11974088a46d42b903418eJohann 441b362b15af34006e6a11974088a46d42b903418eJohann if (mv->as_mv.row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN)) 451b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.row = xd->mb_to_top_edge - LEFT_TOP_MARGIN; 461b362b15af34006e6a11974088a46d42b903418eJohann else if (mv->as_mv.row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN) 471b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN; 481b362b15af34006e6a11974088a46d42b903418eJohann} 491b362b15af34006e6a11974088a46d42b903418eJohann 501b362b15af34006e6a11974088a46d42b903418eJohannstatic void vp8_clamp_mv(int_mv *mv, int mb_to_left_edge, int mb_to_right_edge, 511b362b15af34006e6a11974088a46d42b903418eJohann int mb_to_top_edge, int mb_to_bottom_edge) 521b362b15af34006e6a11974088a46d42b903418eJohann{ 531b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.col = (mv->as_mv.col < mb_to_left_edge) ? 541b362b15af34006e6a11974088a46d42b903418eJohann mb_to_left_edge : mv->as_mv.col; 551b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.col = (mv->as_mv.col > mb_to_right_edge) ? 561b362b15af34006e6a11974088a46d42b903418eJohann mb_to_right_edge : mv->as_mv.col; 571b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.row = (mv->as_mv.row < mb_to_top_edge) ? 581b362b15af34006e6a11974088a46d42b903418eJohann mb_to_top_edge : mv->as_mv.row; 591b362b15af34006e6a11974088a46d42b903418eJohann mv->as_mv.row = (mv->as_mv.row > mb_to_bottom_edge) ? 601b362b15af34006e6a11974088a46d42b903418eJohann mb_to_bottom_edge : mv->as_mv.row; 611b362b15af34006e6a11974088a46d42b903418eJohann} 621b362b15af34006e6a11974088a46d42b903418eJohannstatic unsigned int vp8_check_mv_bounds(int_mv *mv, int mb_to_left_edge, 631b362b15af34006e6a11974088a46d42b903418eJohann int mb_to_right_edge, int mb_to_top_edge, 641b362b15af34006e6a11974088a46d42b903418eJohann int mb_to_bottom_edge) 651b362b15af34006e6a11974088a46d42b903418eJohann{ 661b362b15af34006e6a11974088a46d42b903418eJohann unsigned int need_to_clamp; 671b362b15af34006e6a11974088a46d42b903418eJohann need_to_clamp = (mv->as_mv.col < mb_to_left_edge); 681b362b15af34006e6a11974088a46d42b903418eJohann need_to_clamp |= (mv->as_mv.col > mb_to_right_edge); 691b362b15af34006e6a11974088a46d42b903418eJohann need_to_clamp |= (mv->as_mv.row < mb_to_top_edge); 701b362b15af34006e6a11974088a46d42b903418eJohann need_to_clamp |= (mv->as_mv.row > mb_to_bottom_edge); 711b362b15af34006e6a11974088a46d42b903418eJohann return need_to_clamp; 721b362b15af34006e6a11974088a46d42b903418eJohann} 731b362b15af34006e6a11974088a46d42b903418eJohann 741b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_find_near_mvs 751b362b15af34006e6a11974088a46d42b903418eJohann( 761b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd, 771b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *here, 781b362b15af34006e6a11974088a46d42b903418eJohann int_mv *nearest, int_mv *nearby, int_mv *best, 791b362b15af34006e6a11974088a46d42b903418eJohann int near_mv_ref_cts[4], 801b362b15af34006e6a11974088a46d42b903418eJohann int refframe, 811b362b15af34006e6a11974088a46d42b903418eJohann int *ref_frame_sign_bias 821b362b15af34006e6a11974088a46d42b903418eJohann); 831b362b15af34006e6a11974088a46d42b903418eJohann 841b362b15af34006e6a11974088a46d42b903418eJohann 851b362b15af34006e6a11974088a46d42b903418eJohannint vp8_find_near_mvs_bias 861b362b15af34006e6a11974088a46d42b903418eJohann( 871b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd, 881b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *here, 891b362b15af34006e6a11974088a46d42b903418eJohann int_mv mode_mv_sb[2][MB_MODE_COUNT], 901b362b15af34006e6a11974088a46d42b903418eJohann int_mv best_mv_sb[2], 911b362b15af34006e6a11974088a46d42b903418eJohann int cnt[4], 921b362b15af34006e6a11974088a46d42b903418eJohann int refframe, 931b362b15af34006e6a11974088a46d42b903418eJohann int *ref_frame_sign_bias 941b362b15af34006e6a11974088a46d42b903418eJohann); 951b362b15af34006e6a11974088a46d42b903418eJohann 961b362b15af34006e6a11974088a46d42b903418eJohann 971b362b15af34006e6a11974088a46d42b903418eJohannvp8_prob *vp8_mv_ref_probs( 981b362b15af34006e6a11974088a46d42b903418eJohann vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4] 991b362b15af34006e6a11974088a46d42b903418eJohann); 1001b362b15af34006e6a11974088a46d42b903418eJohann 1011b362b15af34006e6a11974088a46d42b903418eJohannextern const unsigned char vp8_mbsplit_offset[4][16]; 1021b362b15af34006e6a11974088a46d42b903418eJohann 1031b362b15af34006e6a11974088a46d42b903418eJohann 1041b362b15af34006e6a11974088a46d42b903418eJohannstatic int left_block_mv(const MODE_INFO *cur_mb, int b) 1051b362b15af34006e6a11974088a46d42b903418eJohann{ 1061b362b15af34006e6a11974088a46d42b903418eJohann if (!(b & 3)) 1071b362b15af34006e6a11974088a46d42b903418eJohann { 1081b362b15af34006e6a11974088a46d42b903418eJohann /* On L edge, get from MB to left of us */ 1091b362b15af34006e6a11974088a46d42b903418eJohann --cur_mb; 1101b362b15af34006e6a11974088a46d42b903418eJohann 1111b362b15af34006e6a11974088a46d42b903418eJohann if(cur_mb->mbmi.mode != SPLITMV) 1121b362b15af34006e6a11974088a46d42b903418eJohann return cur_mb->mbmi.mv.as_int; 1131b362b15af34006e6a11974088a46d42b903418eJohann b += 4; 1141b362b15af34006e6a11974088a46d42b903418eJohann } 1151b362b15af34006e6a11974088a46d42b903418eJohann 1161b362b15af34006e6a11974088a46d42b903418eJohann return (cur_mb->bmi + b - 1)->mv.as_int; 1171b362b15af34006e6a11974088a46d42b903418eJohann} 1181b362b15af34006e6a11974088a46d42b903418eJohann 1191b362b15af34006e6a11974088a46d42b903418eJohannstatic int above_block_mv(const MODE_INFO *cur_mb, int b, int mi_stride) 1201b362b15af34006e6a11974088a46d42b903418eJohann{ 1211b362b15af34006e6a11974088a46d42b903418eJohann if (!(b >> 2)) 1221b362b15af34006e6a11974088a46d42b903418eJohann { 1231b362b15af34006e6a11974088a46d42b903418eJohann /* On top edge, get from MB above us */ 1241b362b15af34006e6a11974088a46d42b903418eJohann cur_mb -= mi_stride; 1251b362b15af34006e6a11974088a46d42b903418eJohann 1261b362b15af34006e6a11974088a46d42b903418eJohann if(cur_mb->mbmi.mode != SPLITMV) 1271b362b15af34006e6a11974088a46d42b903418eJohann return cur_mb->mbmi.mv.as_int; 1281b362b15af34006e6a11974088a46d42b903418eJohann b += 16; 1291b362b15af34006e6a11974088a46d42b903418eJohann } 1301b362b15af34006e6a11974088a46d42b903418eJohann 1315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang return (cur_mb->bmi + (b - 4))->mv.as_int; 1321b362b15af34006e6a11974088a46d42b903418eJohann} 1331b362b15af34006e6a11974088a46d42b903418eJohannstatic B_PREDICTION_MODE left_block_mode(const MODE_INFO *cur_mb, int b) 1341b362b15af34006e6a11974088a46d42b903418eJohann{ 1351b362b15af34006e6a11974088a46d42b903418eJohann if (!(b & 3)) 1361b362b15af34006e6a11974088a46d42b903418eJohann { 1371b362b15af34006e6a11974088a46d42b903418eJohann /* On L edge, get from MB to left of us */ 1381b362b15af34006e6a11974088a46d42b903418eJohann --cur_mb; 1391b362b15af34006e6a11974088a46d42b903418eJohann switch (cur_mb->mbmi.mode) 1401b362b15af34006e6a11974088a46d42b903418eJohann { 1411b362b15af34006e6a11974088a46d42b903418eJohann case B_PRED: 1421b362b15af34006e6a11974088a46d42b903418eJohann return (cur_mb->bmi + b + 3)->as_mode; 1431b362b15af34006e6a11974088a46d42b903418eJohann case DC_PRED: 1441b362b15af34006e6a11974088a46d42b903418eJohann return B_DC_PRED; 1451b362b15af34006e6a11974088a46d42b903418eJohann case V_PRED: 1461b362b15af34006e6a11974088a46d42b903418eJohann return B_VE_PRED; 1471b362b15af34006e6a11974088a46d42b903418eJohann case H_PRED: 1481b362b15af34006e6a11974088a46d42b903418eJohann return B_HE_PRED; 1491b362b15af34006e6a11974088a46d42b903418eJohann case TM_PRED: 1501b362b15af34006e6a11974088a46d42b903418eJohann return B_TM_PRED; 1511b362b15af34006e6a11974088a46d42b903418eJohann default: 1521b362b15af34006e6a11974088a46d42b903418eJohann return B_DC_PRED; 1531b362b15af34006e6a11974088a46d42b903418eJohann } 1541b362b15af34006e6a11974088a46d42b903418eJohann } 1551b362b15af34006e6a11974088a46d42b903418eJohann 1561b362b15af34006e6a11974088a46d42b903418eJohann return (cur_mb->bmi + b - 1)->as_mode; 1571b362b15af34006e6a11974088a46d42b903418eJohann} 1581b362b15af34006e6a11974088a46d42b903418eJohann 1591b362b15af34006e6a11974088a46d42b903418eJohannstatic B_PREDICTION_MODE above_block_mode(const MODE_INFO *cur_mb, int b, int mi_stride) 1601b362b15af34006e6a11974088a46d42b903418eJohann{ 1611b362b15af34006e6a11974088a46d42b903418eJohann if (!(b >> 2)) 1621b362b15af34006e6a11974088a46d42b903418eJohann { 1631b362b15af34006e6a11974088a46d42b903418eJohann /* On top edge, get from MB above us */ 1641b362b15af34006e6a11974088a46d42b903418eJohann cur_mb -= mi_stride; 1651b362b15af34006e6a11974088a46d42b903418eJohann 1661b362b15af34006e6a11974088a46d42b903418eJohann switch (cur_mb->mbmi.mode) 1671b362b15af34006e6a11974088a46d42b903418eJohann { 1681b362b15af34006e6a11974088a46d42b903418eJohann case B_PRED: 1691b362b15af34006e6a11974088a46d42b903418eJohann return (cur_mb->bmi + b + 12)->as_mode; 1701b362b15af34006e6a11974088a46d42b903418eJohann case DC_PRED: 1711b362b15af34006e6a11974088a46d42b903418eJohann return B_DC_PRED; 1721b362b15af34006e6a11974088a46d42b903418eJohann case V_PRED: 1731b362b15af34006e6a11974088a46d42b903418eJohann return B_VE_PRED; 1741b362b15af34006e6a11974088a46d42b903418eJohann case H_PRED: 1751b362b15af34006e6a11974088a46d42b903418eJohann return B_HE_PRED; 1761b362b15af34006e6a11974088a46d42b903418eJohann case TM_PRED: 1771b362b15af34006e6a11974088a46d42b903418eJohann return B_TM_PRED; 1781b362b15af34006e6a11974088a46d42b903418eJohann default: 1791b362b15af34006e6a11974088a46d42b903418eJohann return B_DC_PRED; 1801b362b15af34006e6a11974088a46d42b903418eJohann } 1811b362b15af34006e6a11974088a46d42b903418eJohann } 1821b362b15af34006e6a11974088a46d42b903418eJohann 1831b362b15af34006e6a11974088a46d42b903418eJohann return (cur_mb->bmi + b - 4)->as_mode; 1841b362b15af34006e6a11974088a46d42b903418eJohann} 1851b362b15af34006e6a11974088a46d42b903418eJohann 186b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 187b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} // extern "C" 1881b362b15af34006e6a11974088a46d42b903418eJohann#endif 189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 190b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif // VP8_COMMON_FINDNEARMV_H_ 191