1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "vp9/common/vp9_onyxc_int.h"
12 #include "vp9/common/vp9_entropymv.h"
13
14 #define MV_COUNT_SAT 20
15 #define MV_MAX_UPDATE_FACTOR 128
16
17 // Integer pel reference mv threshold for use of high-precision 1/8 mv
18 #define COMPANDED_MVREF_THRESH 8
19
20 const vp9_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = {
21 -MV_JOINT_ZERO, 2,
22 -MV_JOINT_HNZVZ, 4,
23 -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
24 };
25
26 const vp9_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = {
27 -MV_CLASS_0, 2,
28 -MV_CLASS_1, 4,
29 6, 8,
30 -MV_CLASS_2, -MV_CLASS_3,
31 10, 12,
32 -MV_CLASS_4, -MV_CLASS_5,
33 -MV_CLASS_6, 14,
34 16, 18,
35 -MV_CLASS_7, -MV_CLASS_8,
36 -MV_CLASS_9, -MV_CLASS_10,
37 };
38
39 const vp9_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = {
40 -0, -1,
41 };
42
43 const vp9_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = {
44 -0, 2,
45 -1, 4,
46 -2, -3
47 };
48
49 static const nmv_context default_nmv_context = {
50 {32, 64, 96},
51 {
52 { // Vertical component
53 128, // sign
54 {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, // class
55 {216}, // class0
56 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits
57 {{128, 128, 64}, {96, 112, 64}}, // class0_fp
58 {64, 96, 64}, // fp
59 160, // class0_hp bit
60 128, // hp
61 },
62 { // Horizontal component
63 128, // sign
64 {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}, // class
65 {208}, // class0
66 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits
67 {{128, 128, 64}, {96, 112, 64}}, // class0_fp
68 {64, 96, 64}, // fp
69 160, // class0_hp bit
70 128, // hp
71 }
72 },
73 };
74
75 static const uint8_t log_in_base_2[] = {
76 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
77 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
78 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
79 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
80 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
81 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
82 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
83 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
84 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
85 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
86 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
87 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
88 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
89 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
90 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
91 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
92 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
93 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
94 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
95 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
96 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
97 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
98 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
99 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
100 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
101 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
102 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
103 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
104 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
105 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
106 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
107 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
108 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
109 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
110 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
111 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
112 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
113 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
114 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
115 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
116 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
117 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
118 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
119 };
120
mv_class_base(MV_CLASS_TYPE c)121 static INLINE int mv_class_base(MV_CLASS_TYPE c) {
122 return c ? CLASS0_SIZE << (c + 2) : 0;
123 }
124
vp9_get_mv_class(int z,int * offset)125 MV_CLASS_TYPE vp9_get_mv_class(int z, int *offset) {
126 const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096) ?
127 MV_CLASS_10 : (MV_CLASS_TYPE)log_in_base_2[z >> 3];
128 if (offset)
129 *offset = z - mv_class_base(c);
130 return c;
131 }
132
vp9_use_mv_hp(const MV * ref)133 int vp9_use_mv_hp(const MV *ref) {
134 return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH &&
135 (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH;
136 }
137
vp9_get_mv_mag(MV_CLASS_TYPE c,int offset)138 int vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) {
139 return mv_class_base(c) + offset;
140 }
141
inc_mv_component(int v,nmv_component_counts * comp_counts,int incr,int usehp)142 static void inc_mv_component(int v, nmv_component_counts *comp_counts,
143 int incr, int usehp) {
144 int s, z, c, o, d, e, f;
145 assert(v != 0); /* should not be zero */
146 s = v < 0;
147 comp_counts->sign[s] += incr;
148 z = (s ? -v : v) - 1; /* magnitude - 1 */
149
150 c = vp9_get_mv_class(z, &o);
151 comp_counts->classes[c] += incr;
152
153 d = (o >> 3); /* int mv data */
154 f = (o >> 1) & 3; /* fractional pel mv data */
155 e = (o & 1); /* high precision mv data */
156
157 if (c == MV_CLASS_0) {
158 comp_counts->class0[d] += incr;
159 comp_counts->class0_fp[d][f] += incr;
160 comp_counts->class0_hp[e] += usehp * incr;
161 } else {
162 int i;
163 int b = c + CLASS0_BITS - 1; // number of bits
164 for (i = 0; i < b; ++i)
165 comp_counts->bits[i][((d >> i) & 1)] += incr;
166 comp_counts->fp[f] += incr;
167 comp_counts->hp[e] += usehp * incr;
168 }
169 }
170
vp9_inc_mv(const MV * mv,nmv_context_counts * counts)171 void vp9_inc_mv(const MV *mv, nmv_context_counts *counts) {
172 if (counts != NULL) {
173 const MV_JOINT_TYPE j = vp9_get_mv_joint(mv);
174 ++counts->joints[j];
175
176 if (mv_joint_vertical(j)) {
177 inc_mv_component(mv->row, &counts->comps[0], 1, 1);
178 }
179
180 if (mv_joint_horizontal(j)) {
181 inc_mv_component(mv->col, &counts->comps[1], 1, 1);
182 }
183 }
184 }
185
adapt_prob(vp9_prob prep,const unsigned int ct[2])186 static vp9_prob adapt_prob(vp9_prob prep, const unsigned int ct[2]) {
187 return merge_probs(prep, ct, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR);
188 }
189
adapt_probs(const vp9_tree_index * tree,const vp9_prob * pre_probs,const unsigned int * counts,vp9_prob * probs)190 static void adapt_probs(const vp9_tree_index *tree, const vp9_prob *pre_probs,
191 const unsigned int *counts, vp9_prob *probs) {
192 vp9_tree_merge_probs(tree, pre_probs, counts, MV_COUNT_SAT,
193 MV_MAX_UPDATE_FACTOR, probs);
194 }
195
vp9_adapt_mv_probs(VP9_COMMON * cm,int allow_hp)196 void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) {
197 int i, j;
198
199 nmv_context *fc = &cm->fc.nmvc;
200 const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc;
201 const nmv_context_counts *counts = &cm->counts.mv;
202
203 adapt_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints, fc->joints);
204
205 for (i = 0; i < 2; ++i) {
206 nmv_component *comp = &fc->comps[i];
207 const nmv_component *pre_comp = &pre_fc->comps[i];
208 const nmv_component_counts *c = &counts->comps[i];
209
210 comp->sign = adapt_prob(pre_comp->sign, c->sign);
211 adapt_probs(vp9_mv_class_tree, pre_comp->classes, c->classes,
212 comp->classes);
213 adapt_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0, comp->class0);
214
215 for (j = 0; j < MV_OFFSET_BITS; ++j)
216 comp->bits[j] = adapt_prob(pre_comp->bits[j], c->bits[j]);
217
218 for (j = 0; j < CLASS0_SIZE; ++j)
219 adapt_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j], c->class0_fp[j],
220 comp->class0_fp[j]);
221
222 adapt_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp);
223
224 if (allow_hp) {
225 comp->class0_hp = adapt_prob(pre_comp->class0_hp, c->class0_hp);
226 comp->hp = adapt_prob(pre_comp->hp, c->hp);
227 }
228 }
229 }
230
vp9_init_mv_probs(VP9_COMMON * cm)231 void vp9_init_mv_probs(VP9_COMMON *cm) {
232 cm->fc.nmvc = default_nmv_context;
233 }
234