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
12#include "vp9/common/vp9_onyxc_int.h"
13#include "vp9/common/vp9_entropymv.h"
14
15#define MV_COUNT_SAT 20
16#define MV_MAX_UPDATE_FACTOR 128
17
18/* Integer pel reference mv threshold for use of high-precision 1/8 mv */
19#define COMPANDED_MVREF_THRESH 8
20
21const vp9_tree_index vp9_mv_joint_tree[2 * MV_JOINTS - 2] = {
22  -MV_JOINT_ZERO, 2,
23  -MV_JOINT_HNZVZ, 4,
24  -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
25};
26struct vp9_token vp9_mv_joint_encodings[MV_JOINTS];
27
28const vp9_tree_index vp9_mv_class_tree[2 * MV_CLASSES - 2] = {
29  -MV_CLASS_0, 2,
30  -MV_CLASS_1, 4,
31  6, 8,
32  -MV_CLASS_2, -MV_CLASS_3,
33  10, 12,
34  -MV_CLASS_4, -MV_CLASS_5,
35  -MV_CLASS_6, 14,
36  16, 18,
37  -MV_CLASS_7, -MV_CLASS_8,
38  -MV_CLASS_9, -MV_CLASS_10,
39};
40struct vp9_token vp9_mv_class_encodings[MV_CLASSES];
41
42const vp9_tree_index vp9_mv_class0_tree [2 * CLASS0_SIZE - 2] = {
43  -0, -1,
44};
45struct vp9_token vp9_mv_class0_encodings[CLASS0_SIZE];
46
47const vp9_tree_index vp9_mv_fp_tree [2 * 4 - 2] = {
48  -0, 2,
49  -1, 4,
50  -2, -3
51};
52struct vp9_token vp9_mv_fp_encodings[4];
53
54static const nmv_context default_nmv_context = {
55  {32, 64, 96},
56  {
57    { /* vert component */
58      128,                                                  /* sign */
59      {224, 144, 192, 168, 192, 176, 192, 198, 198, 245},   /* class */
60      {216},                                                /* class0 */
61      {136, 140, 148, 160, 176, 192, 224, 234, 234, 240},   /* bits */
62      {{128, 128, 64}, {96, 112, 64}},                      /* class0_fp */
63      {64, 96, 64},                                         /* fp */
64      160,                                                  /* class0_hp bit */
65      128,                                                  /* hp */
66    },
67    { /* hor component */
68      128,                                                  /* sign */
69      {216, 128, 176, 160, 176, 176, 192, 198, 198, 208},   /* class */
70      {208},                                                /* class0 */
71      {136, 140, 148, 160, 176, 192, 224, 234, 234, 240},   /* bits */
72      {{128, 128, 64}, {96, 112, 64}},                      /* class0_fp */
73      {64, 96, 64},                                         /* fp */
74      160,                                                  /* class0_hp bit */
75      128,                                                  /* hp */
76    }
77  },
78};
79
80#define mv_class_base(c) ((c) ? (CLASS0_SIZE << (c + 2)) : 0)
81
82static const uint8_t log_in_base_2[] = {
83  0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
84  4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
85  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
86  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
87  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
88  6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
89  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
90  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
91  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
92  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
93  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 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, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
98  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
99  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
100  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
101  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
102  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
103  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
104  8, 8, 8, 8, 8, 8, 8, 8, 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, 9, 9, 9, 9, 9, 9, 9, 9,
119  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
120  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
121  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
122  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
123  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
124  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
125  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
126};
127
128MV_CLASS_TYPE vp9_get_mv_class(int z, int *offset) {
129  MV_CLASS_TYPE c = MV_CLASS_0;
130  if (z >= CLASS0_SIZE * 4096)
131    c = MV_CLASS_10;
132  else
133    c = log_in_base_2[z >> 3];
134
135  if (offset)
136    *offset = z - mv_class_base(c);
137  return c;
138}
139
140int vp9_use_mv_hp(const MV *ref) {
141  return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH &&
142         (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH;
143}
144
145int vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) {
146  return mv_class_base(c) + offset;
147}
148
149static void inc_mv_component(int v, nmv_component_counts *comp_counts,
150                             int incr, int usehp) {
151  int s, z, c, o, d, e, f;
152  assert (v != 0);            /* should not be zero */
153  s = v < 0;
154  comp_counts->sign[s] += incr;
155  z = (s ? -v : v) - 1;       /* magnitude - 1 */
156
157  c = vp9_get_mv_class(z, &o);
158  comp_counts->classes[c] += incr;
159
160  d = (o >> 3);               /* int mv data */
161  f = (o >> 1) & 3;           /* fractional pel mv data */
162  e = (o & 1);                /* high precision mv data */
163
164  if (c == MV_CLASS_0) {
165    comp_counts->class0[d] += incr;
166    comp_counts->class0_fp[d][f] += incr;
167    comp_counts->class0_hp[e] += usehp * incr;
168  } else {
169    int i;
170    int b = c + CLASS0_BITS - 1;  // number of bits
171    for (i = 0; i < b; ++i)
172      comp_counts->bits[i][((d >> i) & 1)] += incr;
173    comp_counts->fp[f] += incr;
174    comp_counts->hp[e] += usehp * incr;
175  }
176}
177
178
179void vp9_inc_mv(const MV *mv,  nmv_context_counts *counts) {
180  const MV_JOINT_TYPE j = vp9_get_mv_joint(mv);
181  ++counts->joints[j];
182
183  if (mv_joint_vertical(j)) {
184    inc_mv_component(mv->row, &counts->comps[0], 1, 1);
185  }
186
187  if (mv_joint_horizontal(j)) {
188    inc_mv_component(mv->col, &counts->comps[1], 1, 1);
189  }
190}
191
192static vp9_prob adapt_prob(vp9_prob prep, const unsigned int ct[2]) {
193  return merge_probs2(prep, ct, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR);
194}
195
196static unsigned int adapt_probs(unsigned int i,
197                                vp9_tree tree,
198                                vp9_prob this_probs[],
199                                const vp9_prob last_probs[],
200                                const unsigned int num_events[]) {
201
202
203  const unsigned int left = tree[i] <= 0
204          ? num_events[-tree[i]]
205          : adapt_probs(tree[i], tree, this_probs, last_probs, num_events);
206
207  const unsigned int right = tree[i + 1] <= 0
208          ? num_events[-tree[i + 1]]
209          : adapt_probs(tree[i + 1], tree, this_probs, last_probs, num_events);
210  const unsigned int ct[2] = { left, right };
211  this_probs[i >> 1] = adapt_prob(last_probs[i >> 1], ct);
212  return left + right;
213}
214
215
216void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) {
217  int i, j;
218
219  FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
220
221  nmv_context *ctx = &cm->fc.nmvc;
222  nmv_context *pre_ctx = &pre_fc->nmvc;
223  nmv_context_counts *cts = &cm->counts.mv;
224
225  adapt_probs(0, vp9_mv_joint_tree, ctx->joints, pre_ctx->joints, cts->joints);
226
227  for (i = 0; i < 2; ++i) {
228    ctx->comps[i].sign = adapt_prob(pre_ctx->comps[i].sign, cts->comps[i].sign);
229    adapt_probs(0, vp9_mv_class_tree, ctx->comps[i].classes,
230                pre_ctx->comps[i].classes, cts->comps[i].classes);
231    adapt_probs(0, vp9_mv_class0_tree, ctx->comps[i].class0,
232                pre_ctx->comps[i].class0, cts->comps[i].class0);
233
234    for (j = 0; j < MV_OFFSET_BITS; ++j)
235        ctx->comps[i].bits[j] = adapt_prob(pre_ctx->comps[i].bits[j],
236                                           cts->comps[i].bits[j]);
237
238    for (j = 0; j < CLASS0_SIZE; ++j)
239      adapt_probs(0, vp9_mv_fp_tree, ctx->comps[i].class0_fp[j],
240                  pre_ctx->comps[i].class0_fp[j], cts->comps[i].class0_fp[j]);
241
242    adapt_probs(0, vp9_mv_fp_tree, ctx->comps[i].fp, pre_ctx->comps[i].fp,
243                cts->comps[i].fp);
244
245    if (allow_hp) {
246      ctx->comps[i].class0_hp = adapt_prob(pre_ctx->comps[i].class0_hp,
247                                           cts->comps[i].class0_hp);
248      ctx->comps[i].hp = adapt_prob(pre_ctx->comps[i].hp, cts->comps[i].hp);
249    }
250  }
251}
252
253void vp9_entropy_mv_init() {
254  vp9_tokens_from_tree(vp9_mv_joint_encodings, vp9_mv_joint_tree);
255  vp9_tokens_from_tree(vp9_mv_class_encodings, vp9_mv_class_tree);
256  vp9_tokens_from_tree(vp9_mv_class0_encodings, vp9_mv_class0_tree);
257  vp9_tokens_from_tree(vp9_mv_fp_encodings, vp9_mv_fp_tree);
258}
259
260void vp9_init_mv_probs(VP9_COMMON *cm) {
261  cm->fc.nmvc = default_nmv_context;
262}
263