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#include "findnearmv.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst unsigned char vp8_mbsplit_offset[4][16] = { 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 0, 2, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Predict motion vectors using those from already-decoded nearby blocks. 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan Note that we only consider one 4x4 subblock from each candidate 16x16 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan macroblock. */ 24233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_find_near_mvs 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd, 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *here, 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv *nearest, 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv *nearby, 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv *best_mv, 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cnt[4], 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan int refframe, 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *ref_frame_sign_bias 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *above = here - xd->mode_info_stride; 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *left = here - 1; 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *aboveleft = above - 1; 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv near_mvs[4]; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv *mv = near_mvs; 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *cntx = cnt; 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan enum {CNT_INTRA, CNT_NEAREST, CNT_NEAR, CNT_SPLITMV}; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Zero accumulators */ 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv[0].as_int = mv[1].as_int = mv[2].as_int = 0; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt[0] = cnt[1] = cnt[2] = cnt[3] = 0; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Process above */ 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (above->mbmi.ref_frame != INTRA_FRAME) 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (above->mbmi.mv.as_int) 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan (++mv)->as_int = above->mbmi.mv.as_int; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe, mv, ref_frame_sign_bias); 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++cntx; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan *cntx += 2; 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Process left */ 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (left->mbmi.ref_frame != INTRA_FRAME) 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (left->mbmi.mv.as_int) 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv this_mv; 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_mv.as_int = left->mbmi.mv.as_int; 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe, &this_mv, ref_frame_sign_bias); 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_mv.as_int != mv->as_int) 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan (++mv)->as_int = this_mv.as_int; 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++cntx; 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan *cntx += 2; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt[CNT_INTRA] += 2; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Process above left */ 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (aboveleft->mbmi.ref_frame != INTRA_FRAME) 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (aboveleft->mbmi.mv.as_int) 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv this_mv; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan this_mv.as_int = aboveleft->mbmi.mv.as_int; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe, &this_mv, ref_frame_sign_bias); 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (this_mv.as_int != mv->as_int) 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan (++mv)->as_int = this_mv.as_int; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan ++cntx; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan *cntx += 1; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt[CNT_INTRA] += 1; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* If we have three distinct MV's ... */ 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cnt[CNT_SPLITMV]) 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* See if above-left MV can be merged with NEAREST */ 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mv->as_int == near_mvs[CNT_NEAREST].as_int) 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt[CNT_NEAREST] += 1; 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt[CNT_SPLITMV] = ((above->mbmi.mode == SPLITMV) 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan + (left->mbmi.mode == SPLITMV)) * 2 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan + (aboveleft->mbmi.mode == SPLITMV); 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Swap near and nearest if necessary */ 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cnt[CNT_NEAR] > cnt[CNT_NEAREST]) 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan int tmp; 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp = cnt[CNT_NEAREST]; 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt[CNT_NEAREST] = cnt[CNT_NEAR]; 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt[CNT_NEAR] = tmp; 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan tmp = near_mvs[CNT_NEAREST].as_int; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan near_mvs[CNT_NEAREST].as_int = near_mvs[CNT_NEAR].as_int; 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan near_mvs[CNT_NEAR].as_int = tmp; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Use near_mvs[0] to store the "best" MV */ 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (cnt[CNT_NEAREST] >= cnt[CNT_INTRA]) 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan near_mvs[CNT_INTRA] = near_mvs[CNT_NEAREST]; 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Set up return values */ 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan best_mv->as_int = near_mvs[0].as_int; 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan nearest->as_int = near_mvs[CNT_NEAREST].as_int; 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan nearby->as_int = near_mvs[CNT_NEAR].as_int; 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan 140233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void invert_and_clamp_mvs(int_mv *inv, int_mv *src, MACROBLOCKD *xd) 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan inv->as_mv.row = src->as_mv.row * -1; 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan inv->as_mv.col = src->as_mv.col * -1; 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clamp_mv2(inv, xd); 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clamp_mv2(src, xd); 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan 149233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_find_near_mvs_bias 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD *xd, 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *here, 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv mode_mv_sb[2][MB_MODE_COUNT], 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv best_mv_sb[2], 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cnt[4], 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan int refframe, 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *ref_frame_sign_bias 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sign_bias = ref_frame_sign_bias[refframe]; 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_find_near_mvs(xd, 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan here, 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan &mode_mv_sb[sign_bias][NEARESTMV], 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan &mode_mv_sb[sign_bias][NEARMV], 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan &best_mv_sb[sign_bias], 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan cnt, 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan refframe, 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan ref_frame_sign_bias); 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan invert_and_clamp_mvs(&mode_mv_sb[!sign_bias][NEARESTMV], 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan &mode_mv_sb[sign_bias][NEARESTMV], xd); 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan invert_and_clamp_mvs(&mode_mv_sb[!sign_bias][NEARMV], 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan &mode_mv_sb[sign_bias][NEARMV], xd); 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan invert_and_clamp_mvs(&best_mv_sb[!sign_bias], 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan &best_mv_sb[sign_bias], xd); 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan return sign_bias; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan 182233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_prob *vp8_mv_ref_probs( 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4] 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan p[0] = vp8_mode_contexts [near_mv_ref_ct[0]] [0]; 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan p[1] = vp8_mode_contexts [near_mv_ref_ct[1]] [1]; 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan p[2] = vp8_mode_contexts [near_mv_ref_ct[2]] [2]; 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan p[3] = vp8_mode_contexts [near_mv_ref_ct[3]] [3]; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan /*p[3] = vp8_mode_contexts [near_mv_ref_ct[1] + near_mv_ref_ct[2] + near_mv_ref_ct[3]] [3];*/ 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan return p; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 194