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 // Integer pel reference mv threshold for use of high-precision 1/8 mv
15 #define COMPANDED_MVREF_THRESH 8
16
17 const vpx_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = {
18 -MV_JOINT_ZERO, 2,
19 -MV_JOINT_HNZVZ, 4,
20 -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
21 };
22
23 const vpx_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = {
24 -MV_CLASS_0, 2,
25 -MV_CLASS_1, 4,
26 6, 8,
27 -MV_CLASS_2, -MV_CLASS_3,
28 10, 12,
29 -MV_CLASS_4, -MV_CLASS_5,
30 -MV_CLASS_6, 14,
31 16, 18,
32 -MV_CLASS_7, -MV_CLASS_8,
33 -MV_CLASS_9, -MV_CLASS_10,
34 };
35
36 const vpx_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = {
37 -0, -1,
38 };
39
40 const vpx_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = {
41 -0, 2,
42 -1, 4,
43 -2, -3
44 };
45
46 static const nmv_context default_nmv_context = {
47 {32, 64, 96},
48 {
49 { // Vertical component
50 128, // sign
51 {224, 144, 192, 168, 192, 176, 192, 198, 198, 245}, // class
52 {216}, // class0
53 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits
54 {{128, 128, 64}, {96, 112, 64}}, // class0_fp
55 {64, 96, 64}, // fp
56 160, // class0_hp bit
57 128, // hp
58 },
59 { // Horizontal component
60 128, // sign
61 {216, 128, 176, 160, 176, 176, 192, 198, 198, 208}, // class
62 {208}, // class0
63 {136, 140, 148, 160, 176, 192, 224, 234, 234, 240}, // bits
64 {{128, 128, 64}, {96, 112, 64}}, // class0_fp
65 {64, 96, 64}, // fp
66 160, // class0_hp bit
67 128, // hp
68 }
69 },
70 };
71
72 static const uint8_t log_in_base_2[] = {
73 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
74 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
75 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
76 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
77 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
78 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
79 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
80 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
81 7, 7, 7, 7, 7, 7, 7, 7, 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, 8, 8, 8, 8, 8, 8, 8, 8,
84 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
85 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
86 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
95 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
96 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
97 9, 9, 9, 9, 9, 9, 9, 9, 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, 10
116 };
117
mv_class_base(MV_CLASS_TYPE c)118 static INLINE int mv_class_base(MV_CLASS_TYPE c) {
119 return c ? CLASS0_SIZE << (c + 2) : 0;
120 }
121
vp9_get_mv_class(int z,int * offset)122 MV_CLASS_TYPE vp9_get_mv_class(int z, int *offset) {
123 const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096) ?
124 MV_CLASS_10 : (MV_CLASS_TYPE)log_in_base_2[z >> 3];
125 if (offset)
126 *offset = z - mv_class_base(c);
127 return c;
128 }
129
vp9_use_mv_hp(const MV * ref)130 int vp9_use_mv_hp(const MV *ref) {
131 return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH &&
132 (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH;
133 }
134
inc_mv_component(int v,nmv_component_counts * comp_counts,int incr,int usehp)135 static void inc_mv_component(int v, nmv_component_counts *comp_counts,
136 int incr, int usehp) {
137 int s, z, c, o, d, e, f;
138 assert(v != 0); /* should not be zero */
139 s = v < 0;
140 comp_counts->sign[s] += incr;
141 z = (s ? -v : v) - 1; /* magnitude - 1 */
142
143 c = vp9_get_mv_class(z, &o);
144 comp_counts->classes[c] += incr;
145
146 d = (o >> 3); /* int mv data */
147 f = (o >> 1) & 3; /* fractional pel mv data */
148 e = (o & 1); /* high precision mv data */
149
150 if (c == MV_CLASS_0) {
151 comp_counts->class0[d] += incr;
152 comp_counts->class0_fp[d][f] += incr;
153 comp_counts->class0_hp[e] += usehp * incr;
154 } else {
155 int i;
156 int b = c + CLASS0_BITS - 1; // number of bits
157 for (i = 0; i < b; ++i)
158 comp_counts->bits[i][((d >> i) & 1)] += incr;
159 comp_counts->fp[f] += incr;
160 comp_counts->hp[e] += usehp * incr;
161 }
162 }
163
vp9_inc_mv(const MV * mv,nmv_context_counts * counts)164 void vp9_inc_mv(const MV *mv, nmv_context_counts *counts) {
165 if (counts != NULL) {
166 const MV_JOINT_TYPE j = vp9_get_mv_joint(mv);
167 ++counts->joints[j];
168
169 if (mv_joint_vertical(j)) {
170 inc_mv_component(mv->row, &counts->comps[0], 1, 1);
171 }
172
173 if (mv_joint_horizontal(j)) {
174 inc_mv_component(mv->col, &counts->comps[1], 1, 1);
175 }
176 }
177 }
178
vp9_adapt_mv_probs(VP9_COMMON * cm,int allow_hp)179 void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) {
180 int i, j;
181
182 nmv_context *fc = &cm->fc->nmvc;
183 const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc;
184 const nmv_context_counts *counts = &cm->counts.mv;
185
186 vpx_tree_merge_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints,
187 fc->joints);
188
189 for (i = 0; i < 2; ++i) {
190 nmv_component *comp = &fc->comps[i];
191 const nmv_component *pre_comp = &pre_fc->comps[i];
192 const nmv_component_counts *c = &counts->comps[i];
193
194 comp->sign = mode_mv_merge_probs(pre_comp->sign, c->sign);
195 vpx_tree_merge_probs(vp9_mv_class_tree, pre_comp->classes, c->classes,
196 comp->classes);
197 vpx_tree_merge_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0,
198 comp->class0);
199
200 for (j = 0; j < MV_OFFSET_BITS; ++j)
201 comp->bits[j] = mode_mv_merge_probs(pre_comp->bits[j], c->bits[j]);
202
203 for (j = 0; j < CLASS0_SIZE; ++j)
204 vpx_tree_merge_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j],
205 c->class0_fp[j], comp->class0_fp[j]);
206
207 vpx_tree_merge_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp);
208
209 if (allow_hp) {
210 comp->class0_hp = mode_mv_merge_probs(pre_comp->class0_hp, c->class0_hp);
211 comp->hp = mode_mv_merge_probs(pre_comp->hp, c->hp);
212 }
213 }
214 }
215
vp9_init_mv_probs(VP9_COMMON * cm)216 void vp9_init_mv_probs(VP9_COMMON *cm) {
217 cm->fc->nmvc = default_nmv_context;
218 }
219