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
20const 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
26const 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
39const vp9_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = {
40  -0, -1,
41};
42
43const vp9_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = {
44  -0, 2,
45  -1, 4,
46  -2, -3
47};
48
49static 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
75static 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
121static INLINE int mv_class_base(MV_CLASS_TYPE c) {
122  return c ? CLASS0_SIZE << (c + 2) : 0;
123}
124
125MV_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
133int 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
138int vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) {
139  return mv_class_base(c) + offset;
140}
141
142static 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
171void 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
186static 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
190static 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
196void 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
231void vp9_init_mv_probs(VP9_COMMON *cm) {
232  cm->fc.nmvc = default_nmv_context;
233}
234