1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP8_COMMON_FINDNEARMV_H_ 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP8_COMMON_FINDNEARMV_H_ 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "mv.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "blockd.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "modecont.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "treecoder.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 21233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan 25233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void mv_bias(int refmb_ref_frame_sign_bias, int refframe, int_mv *mvp, 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int *ref_frame_sign_bias) 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (refmb_ref_frame_sign_bias != ref_frame_sign_bias[refframe]) 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan mvp->as_mv.row *= -1; 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan mvp->as_mv.col *= -1; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define LEFT_TOP_MARGIN (16 << 3) 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RIGHT_BOTTOM_MARGIN (16 << 3) 37233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void vp8_clamp_mv2(int_mv *mv, const MACROBLOCKD *xd) 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv->as_mv.col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN)) 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.col = xd->mb_to_left_edge - LEFT_TOP_MARGIN; 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv->as_mv.col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN) 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.col = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv->as_mv.row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN)) 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.row = xd->mb_to_top_edge - LEFT_TOP_MARGIN; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mv->as_mv.row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN) 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void vp8_clamp_mv(int_mv *mv, int mb_to_left_edge, int mb_to_right_edge, 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_to_top_edge, int mb_to_bottom_edge) 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.col = (mv->as_mv.col < mb_to_left_edge) ? 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_to_left_edge : mv->as_mv.col; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.col = (mv->as_mv.col > mb_to_right_edge) ? 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_to_right_edge : mv->as_mv.col; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.row = (mv->as_mv.row < mb_to_top_edge) ? 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_to_top_edge : mv->as_mv.row; 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv->as_mv.row = (mv->as_mv.row > mb_to_bottom_edge) ? 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_to_bottom_edge : mv->as_mv.row; 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 62233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic unsigned int vp8_check_mv_bounds(int_mv *mv, int mb_to_left_edge, 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_to_right_edge, int mb_to_top_edge, 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_to_bottom_edge) 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int need_to_clamp; 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan need_to_clamp = (mv->as_mv.col < mb_to_left_edge); 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan need_to_clamp |= (mv->as_mv.col > mb_to_right_edge); 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan need_to_clamp |= (mv->as_mv.row < mb_to_top_edge); 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan need_to_clamp |= (mv->as_mv.row > mb_to_bottom_edge); 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan return need_to_clamp; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan 74233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_find_near_mvs 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd, 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *here, 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv *nearest, int_mv *nearby, int_mv *best, 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan int near_mv_ref_cts[4], 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan int refframe, 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *ref_frame_sign_bias 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan); 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan 85233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_find_near_mvs_bias 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd, 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *here, 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv mode_mv_sb[2][MB_MODE_COUNT], 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv best_mv_sb[2], 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cnt[4], 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan int refframe, 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *ref_frame_sign_bias 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan); 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan 97233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_prob *vp8_mv_ref_probs( 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4] 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan); 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 101233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern const unsigned char vp8_mbsplit_offset[4][16]; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan 104233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int left_block_mv(const MODE_INFO *cur_mb, int b) 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(b & 3)) 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* On L edge, get from MB to left of us */ 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan --cur_mb; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(cur_mb->mbmi.mode != SPLITMV) 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan return cur_mb->mbmi.mv.as_int; 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan b += 4; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (cur_mb->bmi + b - 1)->mv.as_int; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan 119233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int above_block_mv(const MODE_INFO *cur_mb, int b, int mi_stride) 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(b >> 2)) 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* On top edge, get from MB above us */ 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan cur_mb -= mi_stride; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan if(cur_mb->mbmi.mode != SPLITMV) 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan return cur_mb->mbmi.mv.as_int; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan b += 16; 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (cur_mb->bmi + (b - 4))->mv.as_int; 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 133233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic B_PREDICTION_MODE left_block_mode(const MODE_INFO *cur_mb, int b) 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(b & 3)) 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* On L edge, get from MB to left of us */ 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan --cur_mb; 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (cur_mb->mbmi.mode) 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_PRED: 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (cur_mb->bmi + b + 3)->as_mode; 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan case DC_PRED: 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_DC_PRED; 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan case V_PRED: 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_VE_PRED; 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan case H_PRED: 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_HE_PRED; 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan case TM_PRED: 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_TM_PRED; 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_DC_PRED; 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (cur_mb->bmi + b - 1)->as_mode; 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan 159233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic B_PREDICTION_MODE above_block_mode(const MODE_INFO *cur_mb, int b, int mi_stride) 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(b >> 2)) 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* On top edge, get from MB above us */ 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan cur_mb -= mi_stride; 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (cur_mb->mbmi.mode) 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan case B_PRED: 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (cur_mb->bmi + b + 12)->as_mode; 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan case DC_PRED: 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_DC_PRED; 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan case V_PRED: 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_VE_PRED; 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan case H_PRED: 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_HE_PRED; 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan case TM_PRED: 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_TM_PRED; 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan return B_DC_PRED; 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan return (cur_mb->bmi + b - 4)->as_mode; 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // extern "C" 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // VP8_COMMON_FINDNEARMV_H_ 191