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