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 "vp9/common/vp9_onyxc_int.h" | 12 #include "vp9/common/vp9_onyxc_int.h" |
13 #include "vp9/common/vp9_entropymv.h" | 13 #include "vp9/common/vp9_entropymv.h" |
14 | 14 |
15 #define MV_COUNT_SAT 20 | 15 #define MV_COUNT_SAT 20 |
16 #define MV_MAX_UPDATE_FACTOR 128 | 16 #define MV_MAX_UPDATE_FACTOR 128 |
17 | 17 |
18 /* Integer pel reference mv threshold for use of high-precision 1/8 mv */ | 18 /* Integer pel reference mv threshold for use of high-precision 1/8 mv */ |
19 #define COMPANDED_MVREF_THRESH 8 | 19 #define COMPANDED_MVREF_THRESH 8 |
20 | 20 |
21 const vp9_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = { | 21 const vp9_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = { |
22 -MV_JOINT_ZERO, 2, | 22 -MV_JOINT_ZERO, 2, |
23 -MV_JOINT_HNZVZ, 4, | 23 -MV_JOINT_HNZVZ, 4, |
24 -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ | 24 -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ |
25 }; | 25 }; |
26 struct vp9_token vp9_mv_joint_encodings[MV_JOINTS]; | |
27 | 26 |
28 const vp9_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = { | 27 const vp9_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = { |
29 -MV_CLASS_0, 2, | 28 -MV_CLASS_0, 2, |
30 -MV_CLASS_1, 4, | 29 -MV_CLASS_1, 4, |
31 6, 8, | 30 6, 8, |
32 -MV_CLASS_2, -MV_CLASS_3, | 31 -MV_CLASS_2, -MV_CLASS_3, |
33 10, 12, | 32 10, 12, |
34 -MV_CLASS_4, -MV_CLASS_5, | 33 -MV_CLASS_4, -MV_CLASS_5, |
35 -MV_CLASS_6, 14, | 34 -MV_CLASS_6, 14, |
36 16, 18, | 35 16, 18, |
37 -MV_CLASS_7, -MV_CLASS_8, | 36 -MV_CLASS_7, -MV_CLASS_8, |
38 -MV_CLASS_9, -MV_CLASS_10, | 37 -MV_CLASS_9, -MV_CLASS_10, |
39 }; | 38 }; |
40 struct vp9_token vp9_mv_class_encodings[MV_CLASSES]; | |
41 | 39 |
42 const vp9_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = { | 40 const vp9_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = { |
43 -0, -1, | 41 -0, -1, |
44 }; | 42 }; |
45 struct vp9_token vp9_mv_class0_encodings[CLASS0_SIZE]; | |
46 | 43 |
47 const vp9_tree_index vp9_mv_fp_tree[TREE_SIZE(4)] = { | 44 const vp9_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = { |
48 -0, 2, | 45 -0, 2, |
49 -1, 4, | 46 -1, 4, |
50 -2, -3 | 47 -2, -3 |
51 }; | 48 }; |
52 struct vp9_token vp9_mv_fp_encodings[4]; | |
53 | 49 |
54 static const nmv_context default_nmv_context = { | 50 static const nmv_context default_nmv_context = { |
55 {32, 64, 96}, | 51 {32, 64, 96}, |
56 { // NOLINT | 52 { // NOLINT |
57 { /* vert component */ // NOLINT | 53 { /* vert component */ // NOLINT |
58 128, /* sign */ | 54 128, /* sign */ |
59 {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, /* class */ | 55 {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, /* class */ |
60 {216}, /* class0 */ | 56 {216}, /* class0 */ |
61 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, /* bits */ | 57 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, /* bits */ |
62 {{128, 128, 64}, {96, 112, 64}}, /* class0_fp */ | 58 {{128, 128, 64}, {96, 112, 64}}, /* class0_fp */ |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 inc_mv_component(mv->row, &counts->comps[0], 1, 1); | 180 inc_mv_component(mv->row, &counts->comps[0], 1, 1); |
185 } | 181 } |
186 | 182 |
187 if (mv_joint_horizontal(j)) { | 183 if (mv_joint_horizontal(j)) { |
188 inc_mv_component(mv->col, &counts->comps[1], 1, 1); | 184 inc_mv_component(mv->col, &counts->comps[1], 1, 1); |
189 } | 185 } |
190 } | 186 } |
191 } | 187 } |
192 | 188 |
193 static vp9_prob adapt_prob(vp9_prob prep, const unsigned int ct[2]) { | 189 static vp9_prob adapt_prob(vp9_prob prep, const unsigned int ct[2]) { |
194 return merge_probs2(prep, ct, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR); | 190 return merge_probs(prep, ct, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR); |
195 } | 191 } |
196 | 192 |
197 static unsigned int adapt_probs(unsigned int i, | 193 static void adapt_probs(const vp9_tree_index *tree, const vp9_prob *pre_probs, |
198 vp9_tree tree, | 194 const unsigned int *counts, vp9_prob *probs) { |
199 vp9_prob this_probs[], | 195 tree_merge_probs(tree, pre_probs, counts, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR, |
200 const vp9_prob last_probs[], | 196 probs); |
201 const unsigned int num_events[]) { | |
202 const unsigned int left = tree[i] <= 0 | |
203 ? num_events[-tree[i]] | |
204 : adapt_probs(tree[i], tree, this_probs, last_probs, num_events); | |
205 | |
206 const unsigned int right = tree[i + 1] <= 0 | |
207 ? num_events[-tree[i + 1]] | |
208 : adapt_probs(tree[i + 1], tree, this_probs, last_probs, num_events); | |
209 const unsigned int ct[2] = { left, right }; | |
210 this_probs[i >> 1] = adapt_prob(last_probs[i >> 1], ct); | |
211 return left + right; | |
212 } | 197 } |
213 | 198 |
214 | |
215 void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) { | 199 void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) { |
216 int i, j; | 200 int i, j; |
217 | 201 |
218 const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx]; | 202 nmv_context *fc = &cm->fc.nmvc; |
| 203 const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc; |
| 204 const nmv_context_counts *counts = &cm->counts.mv; |
219 | 205 |
220 nmv_context *ctx = &cm->fc.nmvc; | 206 adapt_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints, fc->joints); |
221 const nmv_context *pre_ctx = &pre_fc->nmvc; | |
222 const nmv_context_counts *cts = &cm->counts.mv; | |
223 | |
224 adapt_probs(0, vp9_mv_joint_tree, ctx->joints, pre_ctx->joints, cts->joints); | |
225 | 207 |
226 for (i = 0; i < 2; ++i) { | 208 for (i = 0; i < 2; ++i) { |
227 ctx->comps[i].sign = adapt_prob(pre_ctx->comps[i].sign, cts->comps[i].sign); | 209 nmv_component *comp = &fc->comps[i]; |
228 adapt_probs(0, vp9_mv_class_tree, ctx->comps[i].classes, | 210 const nmv_component *pre_comp = &pre_fc->comps[i]; |
229 pre_ctx->comps[i].classes, cts->comps[i].classes); | 211 const nmv_component_counts *c = &counts->comps[i]; |
230 adapt_probs(0, vp9_mv_class0_tree, ctx->comps[i].class0, | 212 |
231 pre_ctx->comps[i].class0, cts->comps[i].class0); | 213 comp->sign = adapt_prob(pre_comp->sign, c->sign); |
| 214 adapt_probs(vp9_mv_class_tree, pre_comp->classes, c->classes, |
| 215 comp->classes); |
| 216 adapt_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0, comp->class0); |
232 | 217 |
233 for (j = 0; j < MV_OFFSET_BITS; ++j) | 218 for (j = 0; j < MV_OFFSET_BITS; ++j) |
234 ctx->comps[i].bits[j] = adapt_prob(pre_ctx->comps[i].bits[j], | 219 comp->bits[j] = adapt_prob(pre_comp->bits[j], c->bits[j]); |
235 cts->comps[i].bits[j]); | |
236 | 220 |
237 for (j = 0; j < CLASS0_SIZE; ++j) | 221 for (j = 0; j < CLASS0_SIZE; ++j) |
238 adapt_probs(0, vp9_mv_fp_tree, ctx->comps[i].class0_fp[j], | 222 adapt_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j], c->class0_fp[j], |
239 pre_ctx->comps[i].class0_fp[j], cts->comps[i].class0_fp[j]); | 223 comp->class0_fp[j]); |
240 | 224 |
241 adapt_probs(0, vp9_mv_fp_tree, ctx->comps[i].fp, pre_ctx->comps[i].fp, | 225 adapt_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp); |
242 cts->comps[i].fp); | |
243 | 226 |
244 if (allow_hp) { | 227 if (allow_hp) { |
245 ctx->comps[i].class0_hp = adapt_prob(pre_ctx->comps[i].class0_hp, | 228 comp->class0_hp = adapt_prob(pre_comp->class0_hp, c->class0_hp); |
246 cts->comps[i].class0_hp); | 229 comp->hp = adapt_prob(pre_comp->hp, c->hp); |
247 ctx->comps[i].hp = adapt_prob(pre_ctx->comps[i].hp, cts->comps[i].hp); | |
248 } | 230 } |
249 } | 231 } |
250 } | 232 } |
251 | 233 |
252 void vp9_entropy_mv_init() { | |
253 vp9_tokens_from_tree(vp9_mv_joint_encodings, vp9_mv_joint_tree); | |
254 vp9_tokens_from_tree(vp9_mv_class_encodings, vp9_mv_class_tree); | |
255 vp9_tokens_from_tree(vp9_mv_class0_encodings, vp9_mv_class0_tree); | |
256 vp9_tokens_from_tree(vp9_mv_fp_encodings, vp9_mv_fp_tree); | |
257 } | |
258 | |
259 void vp9_init_mv_probs(VP9_COMMON *cm) { | 234 void vp9_init_mv_probs(VP9_COMMON *cm) { |
260 cm->fc.nmvc = default_nmv_context; | 235 cm->fc.nmvc = default_nmv_context; |
261 } | 236 } |
OLD | NEW |