| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 | 11 |
| 12 #include "findnearmv.h" | 12 #include "findnearmv.h" |
| 13 | 13 |
| 14 const unsigned char vp8_mbsplit_offset[4][16] = { | 14 const unsigned char vp8_mbsplit_offset[4][16] = { |
| 15 { 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 15 { 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 16 { 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 16 { 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 17 { 0, 2, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | 17 { 0, 2, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, |
| 18 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} | 18 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} |
| 19 }; | 19 }; |
| 20 | 20 |
| 21 /* Predict motion vectors using those from already-decoded nearby blocks. | 21 /* Predict motion vectors using those from already-decoded nearby blocks. |
| 22 Note that we only consider one 4x4 subblock from each candidate 16x16 | 22 Note that we only consider one 4x4 subblock from each candidate 16x16 |
| 23 macroblock. */ | 23 macroblock. */ |
| 24 void vp8_find_near_mvs | 24 void vp8_find_near_mvs |
| 25 ( | 25 ( |
| 26 MACROBLOCKD *xd, | 26 MACROBLOCKD *xd, |
| 27 const MODE_INFO *here, | 27 const MODE_INFO *here, |
| 28 MV *nearest, | 28 int_mv *nearest, |
| 29 MV *nearby, | 29 int_mv *nearby, |
| 30 MV *best_mv, | 30 int_mv *best_mv, |
| 31 int cnt[4], | 31 int cnt[4], |
| 32 int refframe, | 32 int refframe, |
| 33 int *ref_frame_sign_bias | 33 int *ref_frame_sign_bias |
| 34 ) | 34 ) |
| 35 { | 35 { |
| 36 const MODE_INFO *above = here - xd->mode_info_stride; | 36 const MODE_INFO *above = here - xd->mode_info_stride; |
| 37 const MODE_INFO *left = here - 1; | 37 const MODE_INFO *left = here - 1; |
| 38 const MODE_INFO *aboveleft = above - 1; | 38 const MODE_INFO *aboveleft = above - 1; |
| 39 int_mv near_mvs[4]; | 39 int_mv near_mvs[4]; |
| 40 int_mv *mv = near_mvs; | 40 int_mv *mv = near_mvs; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 tmp = near_mvs[CNT_NEAREST].as_int; | 124 tmp = near_mvs[CNT_NEAREST].as_int; |
| 125 near_mvs[CNT_NEAREST].as_int = near_mvs[CNT_NEAR].as_int; | 125 near_mvs[CNT_NEAREST].as_int = near_mvs[CNT_NEAR].as_int; |
| 126 near_mvs[CNT_NEAR].as_int = tmp; | 126 near_mvs[CNT_NEAR].as_int = tmp; |
| 127 } | 127 } |
| 128 | 128 |
| 129 /* Use near_mvs[0] to store the "best" MV */ | 129 /* Use near_mvs[0] to store the "best" MV */ |
| 130 if (cnt[CNT_NEAREST] >= cnt[CNT_INTRA]) | 130 if (cnt[CNT_NEAREST] >= cnt[CNT_INTRA]) |
| 131 near_mvs[CNT_INTRA] = near_mvs[CNT_NEAREST]; | 131 near_mvs[CNT_INTRA] = near_mvs[CNT_NEAREST]; |
| 132 | 132 |
| 133 /* Set up return values */ | 133 /* Set up return values */ |
| 134 *best_mv = near_mvs[0].as_mv; | 134 best_mv->as_int = near_mvs[0].as_int; |
| 135 *nearest = near_mvs[CNT_NEAREST].as_mv; | 135 nearest->as_int = near_mvs[CNT_NEAREST].as_int; |
| 136 *nearby = near_mvs[CNT_NEAR].as_mv; | 136 nearby->as_int = near_mvs[CNT_NEAR].as_int; |
| 137 | 137 |
| 138 vp8_clamp_mv(nearest, xd); | 138 //TODO: move clamp outside findnearmv |
| 139 vp8_clamp_mv(nearby, xd); | 139 vp8_clamp_mv2(nearest, xd); |
| 140 vp8_clamp_mv(best_mv, xd); /*TODO: move this up before the copy*/ | 140 vp8_clamp_mv2(nearby, xd); |
| 141 vp8_clamp_mv2(best_mv, xd); |
| 141 } | 142 } |
| 142 | 143 |
| 143 vp8_prob *vp8_mv_ref_probs( | 144 vp8_prob *vp8_mv_ref_probs( |
| 144 vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4] | 145 vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4] |
| 145 ) | 146 ) |
| 146 { | 147 { |
| 147 p[0] = vp8_mode_contexts [near_mv_ref_ct[0]] [0]; | 148 p[0] = vp8_mode_contexts [near_mv_ref_ct[0]] [0]; |
| 148 p[1] = vp8_mode_contexts [near_mv_ref_ct[1]] [1]; | 149 p[1] = vp8_mode_contexts [near_mv_ref_ct[1]] [1]; |
| 149 p[2] = vp8_mode_contexts [near_mv_ref_ct[2]] [2]; | 150 p[2] = vp8_mode_contexts [near_mv_ref_ct[2]] [2]; |
| 150 p[3] = vp8_mode_contexts [near_mv_ref_ct[3]] [3]; | 151 p[3] = vp8_mode_contexts [near_mv_ref_ct[3]] [3]; |
| 151 /*p[3] = vp8_mode_contexts [near_mv_ref_ct[1] + near_mv_ref_ct[2] + near_mv_
ref_ct[3]] [3];*/ | 152 /*p[3] = vp8_mode_contexts [near_mv_ref_ct[1] + near_mv_ref_ct[2] + near_mv_
ref_ct[3]] [3];*/ |
| 152 return p; | 153 return p; |
| 153 } | 154 } |
| 154 | 155 |
| 155 const B_MODE_INFO *vp8_left_bmi(const MODE_INFO *cur_mb, int b) | |
| 156 { | |
| 157 if (!(b & 3)) | |
| 158 { | |
| 159 /* On L edge, get from MB to left of us */ | |
| 160 --cur_mb; | |
| 161 b += 4; | |
| 162 } | |
| 163 | |
| 164 return cur_mb->bmi + b - 1; | |
| 165 } | |
| 166 | |
| 167 const B_MODE_INFO *vp8_above_bmi(const MODE_INFO *cur_mb, int b, int mi_stride) | |
| 168 { | |
| 169 if (!(b >> 2)) | |
| 170 { | |
| 171 /* On top edge, get from MB above us */ | |
| 172 cur_mb -= mi_stride; | |
| 173 b += 16; | |
| 174 } | |
| 175 | |
| 176 return cur_mb->bmi + b - 4; | |
| 177 } | |
| OLD | NEW |