vp9_entropymode.c 21.8 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  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.
John Koleszar's avatar
John Koleszar committed
9
10
11
 */


12
13
#include "vp9/common/vp9_onyxc_int.h"
#include "vp9/common/vp9_modecont.h"
John Koleszar's avatar
John Koleszar committed
14
#include "vpx_mem/vpx_mem.h"
15

16

17
static const unsigned int kf_y_mode_cts[8][VP9_YMODES] = {
John Koleszar's avatar
John Koleszar committed
18
19
20
21
22
23
24
25
26
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 BPRED */
  {12,  6,  5,  5,  5,  5,  5,  5,  5,  2, 22, 200},
  {25, 13, 13,  7,  7,  7,  7,  7,  7,  6, 27, 160},
  {31, 17, 18,  8,  8,  8,  8,  8,  8,  9, 26, 139},
  {40, 22, 23,  8,  8,  8,  8,  8,  8, 12, 27, 116},
  {53, 26, 28,  8,  8,  8,  8,  8,  8, 13, 26,  94},
  {68, 33, 35,  8,  8,  8,  8,  8,  8, 17, 20,  68},
  {78, 38, 38,  8,  8,  8,  8,  8,  8, 19, 16,  52},
  {89, 42, 42,  8,  8,  8,  8,  8,  8, 21, 12,  34},
27
};
28

29
static const unsigned int y_mode_cts  [VP9_YMODES] = {
John Koleszar's avatar
John Koleszar committed
30
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 BPRED */
Deb Mukherjee's avatar
Deb Mukherjee committed
31
32
  98, 19, 15, 14, 14, 14, 14, 12, 12, 13, 16, 70
};
33

34
static const unsigned int uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
35
36
37
38
39
40
41
42
43
44
45
46
47
  /* DC   V   H  D45 135 117 153 D27 D63 TM */
  { 200, 15, 15, 10, 10, 10, 10, 10, 10,  6}, /* DC */
  { 130, 75, 10, 10, 10, 10, 10, 10, 10,  6}, /* V */
  { 130, 10, 75, 10, 10, 10, 10, 10, 10,  6}, /* H */
  { 130, 15, 10, 75, 10, 10, 10, 10, 10,  6}, /* D45 */
  { 150, 15, 10, 10, 75, 10, 10, 10, 10,  6}, /* D135 */
  { 150, 15, 10, 10, 10, 75, 10, 10, 10,  6}, /* D117 */
  { 150, 15, 10, 10, 10, 10, 75, 10, 10,  6}, /* D153 */
  { 150, 15, 10, 10, 10, 10, 10, 75, 10,  6}, /* D27 */
  { 150, 15, 10, 10, 10, 10, 10, 10, 75,  6}, /* D63 */
  { 160, 30, 30, 10, 10, 10, 10, 10, 10, 16}, /* TM */
  { 132, 46, 40, 10, 10, 10, 10, 10, 10, 18}, /* i8x8 - never used */
  { 150, 35, 41, 10, 10, 10, 10, 10, 10, 10}, /* BPRED */
48
49
};

50
static const unsigned int i8x8_mode_cts  [VP9_I8X8_MODES] = {
John Koleszar's avatar
John Koleszar committed
51
  /* DC V   H D45 135 117 153 D27 D63  TM */
Deb Mukherjee's avatar
Deb Mukherjee committed
52
53
  73, 49, 61, 30, 30, 30, 30, 30, 30, 13
};
54

55
static const unsigned int kf_uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
56
57
58
59
60
61
62
63
64
65
66
67
68
  // DC   V   H  D45 135 117 153 D27 D63 TM
  { 160, 24, 24, 20, 20, 20, 20, 20, 20,  8}, /* DC */
  { 102, 64, 30, 20, 20, 20, 20, 20, 20, 10}, /* V */
  { 102, 30, 64, 20, 20, 20, 20, 20, 20, 10}, /* H */
  { 102, 33, 20, 64, 20, 20, 20, 20, 20, 14}, /* D45 */
  { 102, 33, 20, 20, 64, 20, 20, 20, 20, 14}, /* D135 */
  { 122, 33, 20, 20, 20, 64, 20, 20, 20, 14}, /* D117 */
  { 102, 33, 20, 20, 20, 20, 64, 20, 20, 14}, /* D153 */
  { 102, 33, 20, 20, 20, 20, 20, 64, 20, 14}, /* D27 */
  { 102, 33, 20, 20, 20, 20, 20, 20, 64, 14}, /* D63 */
  { 132, 36, 30, 20, 20, 20, 20, 20, 20, 18}, /* TM */
  { 122, 41, 35, 20, 20, 20, 20, 20, 20, 18}, /* i8x8 - never used */
  { 122, 41, 35, 20, 20, 20, 20, 20, 20, 18}, /* BPRED */
69
};
John Koleszar's avatar
John Koleszar committed
70

71
72
73
74
75
76
77
78
79
80
81
82
83
static const unsigned int bmode_cts[VP9_NKF_BINTRAMODES] = {
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
  /* DC    TM     VE     HE   CONTEXT */
  43891, 17694, 10036, 3920, 20000
#elif CONTEXT_PRED_REPLACEMENTS == 4
  /* DC    TM     VE     HE   LD    RD   CONTEXT */
  43891, 17694, 10036, 3920, 3363, 2546, 14000
#elif CONTEXT_PRED_REPLACEMENTS == 0
  /* DC    TM     VE     HE   LD    RD   VR    VL    HD    HU   CONTEXT */
  43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723, 50000
#endif
#else
John Koleszar's avatar
John Koleszar committed
84
85
  /* DC    TM     VE     HE   LD    RD    VR    VL    HD    HU */
  43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723
86
#endif
John Koleszar's avatar
John Koleszar committed
87
88
};

John Koleszar's avatar
John Koleszar committed
89
90
91
92
93
94
typedef enum {
  SUBMVREF_NORMAL,
  SUBMVREF_LEFT_ZED,
  SUBMVREF_ABOVE_ZED,
  SUBMVREF_LEFT_ABOVE_SAME,
  SUBMVREF_LEFT_ABOVE_ZED
John Koleszar's avatar
John Koleszar committed
95
96
} sumvfref_t;

97
int vp9_mv_cont(const int_mv *l, const int_mv *a) {
John Koleszar's avatar
John Koleszar committed
98
99
100
  int lez = (l->as_int == 0);
  int aez = (a->as_int == 0);
  int lea = (l->as_int == a->as_int);
John Koleszar's avatar
John Koleszar committed
101

John Koleszar's avatar
John Koleszar committed
102
103
  if (lea && lez)
    return SUBMVREF_LEFT_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
104

John Koleszar's avatar
John Koleszar committed
105
106
  if (lea)
    return SUBMVREF_LEFT_ABOVE_SAME;
John Koleszar's avatar
John Koleszar committed
107

John Koleszar's avatar
John Koleszar committed
108
109
  if (aez)
    return SUBMVREF_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
110

John Koleszar's avatar
John Koleszar committed
111
112
  if (lez)
    return SUBMVREF_LEFT_ZED;
John Koleszar's avatar
John Koleszar committed
113

John Koleszar's avatar
John Koleszar committed
114
  return SUBMVREF_NORMAL;
John Koleszar's avatar
John Koleszar committed
115
116
}

117
const vp9_prob vp9_sub_mv_ref_prob [VP9_SUBMVREFS - 1] = { 180, 162, 25};
John Koleszar's avatar
John Koleszar committed
118

119
const vp9_prob vp9_sub_mv_ref_prob2 [SUBMVREF_COUNT][VP9_SUBMVREFS - 1] = {
John Koleszar's avatar
John Koleszar committed
120
121
122
123
124
  { 147, 136, 18 },
  { 106, 145, 1  },
  { 179, 121, 1  },
  { 223, 1, 34 },
  { 208, 1, 1  }
John Koleszar's avatar
John Koleszar committed
125
126
};

127
vp9_mbsplit vp9_mbsplits [VP9_NUMMBSPLITS] = {
John Koleszar's avatar
John Koleszar committed
128
129
130
131
132
  {
    0,  0,  0,  0,
    0,  0,  0,  0,
    1,  1,  1,  1,
    1,  1,  1,  1,
133
  }, {
John Koleszar's avatar
John Koleszar committed
134
135
136
137
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
138
  }, {
John Koleszar's avatar
John Koleszar committed
139
140
141
142
    0,  0,  1,  1,
    0,  0,  1,  1,
    2,  2,  3,  3,
    2,  2,  3,  3,
143
  }, {
John Koleszar's avatar
John Koleszar committed
144
145
146
147
148
    0,  1,  2,  3,
    4,  5,  6,  7,
    8,  9,  10, 11,
    12, 13, 14, 15,
  },
John Koleszar's avatar
John Koleszar committed
149
150
};

151
const int vp9_mbsplit_count [VP9_NUMMBSPLITS] = { 2, 2, 4, 16};
John Koleszar's avatar
John Koleszar committed
152

153
const vp9_prob vp9_mbsplit_probs [VP9_NUMMBSPLITS - 1] = { 110, 111, 150};
John Koleszar's avatar
John Koleszar committed
154
155
156

/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */

157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
const vp9_tree_index vp9_kf_bmode_tree[VP9_KF_BINTRAMODES * 2 - 2] = {
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
  -B_VE_PRED, 6,                      /* 2 = VE_NODE */
  8, 12,                              /* 3 = COM_NODE */
  -B_HE_PRED, 10,                     /* 4 = HE_NODE */
  -B_RD_PRED, -B_VR_PRED,             /* 5 = RD_NODE */
  -B_LD_PRED, 14,                     /* 6 = LD_NODE */
  -B_VL_PRED, 16,                     /* 7 = VL_NODE */
  -B_HD_PRED, -B_HU_PRED              /* 8 = HD_NODE */
};

const vp9_tree_index vp9_bmode_tree[VP9_NKF_BINTRAMODES * 2 - 2] = {
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
  -B_DC_PRED, 2,
  -B_TM_PRED, 4,
  6, -(B_CONTEXT_PRED - CONTEXT_PRED_REPLACEMENTS),
  -B_VE_PRED, -B_HE_PRED
#elif CONTEXT_PRED_REPLACEMENTS == 4
  -B_DC_PRED, 2,
  -B_TM_PRED, 4,
  6, 8,
  -B_VE_PRED, -B_HE_PRED,
  10, -(B_CONTEXT_PRED - CONTEXT_PRED_REPLACEMENTS),
  -B_RD_PRED, -B_LD_PRED,
#elif CONTEXT_PRED_REPLACEMENTS == 0
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
  -B_VE_PRED, 6,                      /* 2 = VE_NODE */
  8, 12,                              /* 3 = COM_NODE */
  -B_HE_PRED, 10,                     /* 4 = HE_NODE */
  -B_RD_PRED, -B_VR_PRED,             /* 5 = RD_NODE */
  -B_LD_PRED, 14,                     /* 6 = LD_NODE */
  -B_VL_PRED, 16,                     /* 7 = VL_NODE */
  -B_HD_PRED, 18,
  -B_HU_PRED, -B_CONTEXT_PRED
#endif
#else
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
  -B_VE_PRED, 6,                      /* 2 = VE_NODE */
  8, 12,                              /* 3 = COM_NODE */
  -B_HE_PRED, 10,                     /* 4 = HE_NODE */
  -B_RD_PRED, -B_VR_PRED,             /* 5 = RD_NODE */
  -B_LD_PRED, 14,                     /* 6 = LD_NODE */
  -B_VL_PRED, 16,                     /* 7 = VL_NODE */
  -B_HD_PRED, -B_HU_PRED              /* 8 = HD_NODE */
#endif
John Koleszar's avatar
John Koleszar committed
206
207
};

208
209
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
210
const vp9_tree_index vp9_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
211
212
213
214
215
216
217
218
219
220
221
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  16, 18,
  -V_PRED, -H_PRED,
  -TM_PRED, 20,
  -B_PRED, -I8X8_PRED
222
223
};

224
const vp9_tree_index vp9_kf_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
225
226
227
228
229
230
231
232
233
234
235
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  16, 18,
  -V_PRED, -H_PRED,
  -TM_PRED, 20,
  -B_PRED, -I8X8_PRED
236
237
};

238
const vp9_tree_index vp9_i8x8_mode_tree[VP9_I8X8_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
239
240
241
242
243
244
245
246
247
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  -V_PRED, 16,
  -H_PRED, -TM_PRED
248
249
};

250
const vp9_tree_index vp9_uv_mode_tree[VP9_UV_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
251
252
253
254
255
256
257
258
259
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  -V_PRED, 16,
  -H_PRED, -TM_PRED
260
261
};

262
const vp9_tree_index vp9_mbsplit_tree[6] = {
263
264
265
  -PARTITIONING_4X4,   2,
  -PARTITIONING_8X8,   4,
  -PARTITIONING_16X8, -PARTITIONING_8X16,
John Koleszar's avatar
John Koleszar committed
266
267
};

268
const vp9_tree_index vp9_mv_ref_tree[8] = {
John Koleszar's avatar
John Koleszar committed
269
270
271
272
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, 6,
  -NEWMV, -SPLITMV
John Koleszar's avatar
John Koleszar committed
273
274
};

275
const vp9_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
276
277
278
279
280
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};

281
const vp9_tree_index vp9_sub_mv_ref_tree[6] = {
John Koleszar's avatar
John Koleszar committed
282
283
284
  -LEFT4X4, 2,
  -ABOVE4X4, 4,
  -ZERO4X4, -NEW4X4
John Koleszar's avatar
John Koleszar committed
285
286
};

287
288
289
struct vp9_token_struct vp9_bmode_encodings[VP9_NKF_BINTRAMODES];
struct vp9_token_struct vp9_kf_bmode_encodings[VP9_KF_BINTRAMODES];
struct vp9_token_struct vp9_ymode_encodings[VP9_YMODES];
290
291
struct vp9_token_struct vp9_sb_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token_struct vp9_sb_kf_ymode_encodings[VP9_I32X32_MODES];
292
293
294
295
struct vp9_token_struct vp9_kf_ymode_encodings[VP9_YMODES];
struct vp9_token_struct vp9_uv_mode_encodings[VP9_UV_MODES];
struct vp9_token_struct vp9_i8x8_mode_encodings[VP9_I8X8_MODES];
struct vp9_token_struct vp9_mbsplit_encodings[VP9_NUMMBSPLITS];
John Koleszar's avatar
John Koleszar committed
296

297
298
299
struct vp9_token_struct vp9_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token_struct vp9_sb_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token_struct vp9_sub_mv_ref_encoding_array[VP9_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
300

301
void vp9_init_mbmode_probs(VP9_COMMON *x) {
302
  unsigned int bct [VP9_YMODES] [2];      /* num Ymodes > num UV modes */
John Koleszar's avatar
John Koleszar committed
303

304
  vp9_tree_probs_from_distribution(VP9_YMODES, vp9_ymode_encodings,
305
                                   vp9_ymode_tree, x->fc.ymode_prob,
306
                                   bct, y_mode_cts);
307
308
  vp9_tree_probs_from_distribution(VP9_I32X32_MODES, vp9_sb_ymode_encodings,
                                   vp9_sb_ymode_tree, x->fc.sb_ymode_prob,
309
                                   bct, y_mode_cts);
John Koleszar's avatar
John Koleszar committed
310
311
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
312
    for (i = 0; i < 8; i++) {
313
314
      vp9_tree_probs_from_distribution(VP9_YMODES, vp9_kf_ymode_encodings,
                                       vp9_kf_ymode_tree, x->kf_ymode_prob[i],
315
                                       bct, kf_y_mode_cts[i]);
316
317
      vp9_tree_probs_from_distribution(VP9_I32X32_MODES,
                                       vp9_sb_kf_ymode_encodings,
318
                                       vp9_sb_kf_ymode_tree,
319
                                       x->sb_kf_ymode_prob[i], bct,
320
                                       kf_y_mode_cts[i]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
321
    }
John Koleszar's avatar
John Koleszar committed
322
323
324
  }
  {
    int i;
325
    for (i = 0; i < VP9_YMODES; i++) {
326
327
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->kf_uv_mode_prob[i],
328
                                       bct, kf_uv_mode_cts[i]);
329
330
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->fc.uv_mode_prob[i],
331
                                       bct, uv_mode_cts[i]);
332
    }
John Koleszar's avatar
John Koleszar committed
333
  }
334

335
336
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
337
                                   bct, i8x8_mode_cts);
338

339
340
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
341
342
343
  vpx_memcpy(x->fc.mbsplit_prob, vp9_mbsplit_probs, sizeof(vp9_mbsplit_probs));
  vpx_memcpy(x->fc.switchable_interp_prob, vp9_switchable_interp_prob,
             sizeof(vp9_switchable_interp_prob));
344
345
346
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
John Koleszar's avatar
John Koleszar committed
347
348
349
350
}


static void intra_bmode_probs_from_distribution(
351
352
353
354
  vp9_prob p[VP9_NKF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_NKF_BINTRAMODES]) {
  vp9_tree_probs_from_distribution(VP9_NKF_BINTRAMODES, vp9_bmode_encodings,
355
                                   vp9_bmode_tree, p, branch_ct, events);
John Koleszar's avatar
John Koleszar committed
356
357
}

358
359
void vp9_default_bmode_probs(vp9_prob p[VP9_NKF_BINTRAMODES - 1]) {
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2];
John Koleszar's avatar
John Koleszar committed
360
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
361
362
}

363
364
365
366
367
static void intra_kf_bmode_probs_from_distribution(
  vp9_prob p[VP9_KF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_KF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_KF_BINTRAMODES]) {
  vp9_tree_probs_from_distribution(VP9_KF_BINTRAMODES, vp9_kf_bmode_encodings,
368
                                   vp9_kf_bmode_tree, p, branch_ct, events);
369
370
371
372
373
374
}

void vp9_kf_default_bmode_probs(vp9_prob p[VP9_KF_BINTRAMODES]
                                          [VP9_KF_BINTRAMODES]
                                          [VP9_KF_BINTRAMODES - 1]) {
  unsigned int branch_ct[VP9_KF_BINTRAMODES - 1][2];
375
  int i, j;
John Koleszar's avatar
John Koleszar committed
376

377
378
379
380
  for (i = 0; i < VP9_KF_BINTRAMODES; ++i) {
    for (j = 0; j < VP9_KF_BINTRAMODES; ++j) {
      intra_kf_bmode_probs_from_distribution(
          p[i][j], branch_ct, vp9_kf_default_bmode_counts[i][j]);
381
382
    }
  }
John Koleszar's avatar
John Koleszar committed
383
384
}

385
386
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
387
388
389
  -0, 2,
  -1, -2
};
390
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
391
#if CONFIG_ENABLE_6TAP
392
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
Adrian Grange's avatar
Adrian Grange committed
393
394
395
396
397
398
399
  SIXTAP, EIGHTTAP, EIGHTTAP_SHARP};
const int vp9_switchable_interp_map[SWITCHABLE+1] = {0, -1, 1, 2, -1, -1};
#else
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
  EIGHTTAP, EIGHTTAP_SMOOTH, EIGHTTAP_SHARP};
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, 0, 2, -1, -1};
#endif
400
401
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
402
403
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
404
405
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
406
407
  -0, -1,
};
408
409
410
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
411
412
413
414
  {248},
  { 64},
  {192},
};
415
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
416
  EIGHTTAP, EIGHTTAP_SHARP};
Adrian Grange's avatar
Adrian Grange committed
417
418
419
420
421
#if CONFIG_ENABLE_6TAP
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1, -1};
#else
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, 0, 1, -1, -1};
#endif
422
#endif
John Koleszar's avatar
John Koleszar committed
423

424
void vp9_entropy_mode_init() {
425
  vp9_tokens_from_tree(vp9_kf_bmode_encodings,   vp9_kf_bmode_tree);
426
427
428
  vp9_tokens_from_tree(vp9_bmode_encodings,   vp9_bmode_tree);
  vp9_tokens_from_tree(vp9_ymode_encodings,   vp9_ymode_tree);
  vp9_tokens_from_tree(vp9_kf_ymode_encodings, vp9_kf_ymode_tree);
429
430
  vp9_tokens_from_tree(vp9_sb_ymode_encodings, vp9_sb_ymode_tree);
  vp9_tokens_from_tree(vp9_sb_kf_ymode_encodings, vp9_sb_kf_ymode_tree);
431
432
433
434
435
436
437
438
439
440
441
442
  vp9_tokens_from_tree(vp9_uv_mode_encodings,  vp9_uv_mode_tree);
  vp9_tokens_from_tree(vp9_i8x8_mode_encodings,  vp9_i8x8_mode_tree);
  vp9_tokens_from_tree(vp9_mbsplit_encodings, vp9_mbsplit_tree);
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);

  vp9_tokens_from_tree_offset(vp9_mv_ref_encoding_array,
                              vp9_mv_ref_tree, NEARESTMV);
  vp9_tokens_from_tree_offset(vp9_sb_mv_ref_encoding_array,
                              vp9_sb_mv_ref_tree, NEARESTMV);
  vp9_tokens_from_tree_offset(vp9_sub_mv_ref_encoding_array,
                              vp9_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
443
}
Yaowu Xu's avatar
Yaowu Xu committed
444

445
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
446
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
447
448
449
  vpx_memcpy(pc->fc.vp9_mode_contexts,
             vp9_default_mode_contexts,
             sizeof(vp9_default_mode_contexts));
Yaowu Xu's avatar
Yaowu Xu committed
450
451
}

452
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
453
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
454
                       const int context) {
Jim Bankoski's avatar
Jim Bankoski committed
455
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
456

457
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
458
459

  if (m == ZEROMV) {
Paul Wilkins's avatar
Paul Wilkins committed
460
    ++mv_ref_ct[context][0][0];
John Koleszar's avatar
John Koleszar committed
461
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
462
    ++mv_ref_ct[context][0][1];
John Koleszar's avatar
John Koleszar committed
463
    if (m == NEARESTMV) {
Paul Wilkins's avatar
Paul Wilkins committed
464
      ++mv_ref_ct[context][1][0];
John Koleszar's avatar
John Koleszar committed
465
    } else {
Paul Wilkins's avatar
Paul Wilkins committed
466
      ++mv_ref_ct[context][1][1];
John Koleszar's avatar
John Koleszar committed
467
      if (m == NEARMV) {
Paul Wilkins's avatar
Paul Wilkins committed
468
        ++mv_ref_ct[context][2][0];
John Koleszar's avatar
John Koleszar committed
469
      } else {
Paul Wilkins's avatar
Paul Wilkins committed
470
        ++mv_ref_ct[context][2][1];
John Koleszar's avatar
John Koleszar committed
471
        if (m == NEWMV) {
Paul Wilkins's avatar
Paul Wilkins committed
472
          ++mv_ref_ct[context][3][0];
John Koleszar's avatar
John Koleszar committed
473
        } else {
Paul Wilkins's avatar
Paul Wilkins committed
474
          ++mv_ref_ct[context][3][1];
Yaowu Xu's avatar
Yaowu Xu committed
475
        }
John Koleszar's avatar
John Koleszar committed
476
      }
Yaowu Xu's avatar
Yaowu Xu committed
477
    }
John Koleszar's avatar
John Koleszar committed
478
  }
Yaowu Xu's avatar
Yaowu Xu committed
479
480
}

481
#define MVREF_COUNT_SAT 20
482
#define MVREF_MAX_UPDATE_FACTOR 128
483
void vp9_update_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
484
  int i, j;
Jim Bankoski's avatar
Jim Bankoski committed
485
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
486
487
  int (*mode_context)[4];

488
489
  mode_context = pc->fc.vp9_mode_contexts;

490
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
491

Paul Wilkins's avatar
Paul Wilkins committed
492
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
493
    for (i = 0; i < 4; i++) {
494
495
496
497
498
499
500
501
      int count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1], factor;

      count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
      factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
      mode_context[j][i] = weighted_prob(pc->fc.vp9_mode_contexts[j][i],
                                         get_binary_prob(mv_ref_ct[j][i][0],
                                                         mv_ref_ct[j][i][1]),
                                         factor);
Yaowu Xu's avatar
Yaowu Xu committed
502
    }
John Koleszar's avatar
John Koleszar committed
503
  }
Yaowu Xu's avatar
Yaowu Xu committed
504
}
505

506
#ifdef MODE_STATS
507
#include "vp9/common/vp9_modecont.h"
508
void print_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
509
510
  int j, i;
  printf("\n====================\n");
511
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
512
513
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context[j][i]);
Yaowu Xu's avatar
Yaowu Xu committed
514
    }
John Koleszar's avatar
John Koleszar committed
515
516
517
    printf("\n");
  }
  printf("====================\n");
518
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
519
520
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context_a[j][i]);
521
    }
John Koleszar's avatar
John Koleszar committed
522
523
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
524
}
525
#endif
526

Deb Mukherjee's avatar
Deb Mukherjee committed
527
528
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
static void update_mode_probs(int n_modes, struct vp9_token_struct *encoding,
                              const vp9_tree_index *tree, unsigned int *cnt,
                              vp9_prob *pre_probs, vp9_prob *dst_probs) {
#define MAX_PROBS 32
  vp9_prob probs[MAX_PROBS];
  unsigned int branch_ct[MAX_PROBS][2];
  int t, count, factor;

  assert(n_modes - 1 < MAX_PROBS);
  vp9_tree_probs_from_distribution(n_modes, encoding, tree, probs,
                                   branch_ct, cnt);
  for (t = 0; t < n_modes - 1; ++t) {
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    dst_probs[t] = weighted_prob(pre_probs[t], probs[t], factor);
  }
}

// #define MODE_COUNT_TESTING
549
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
550
  int i;
551
#ifdef MODE_COUNT_TESTING
552
553
  int t;

John Koleszar's avatar
John Koleszar committed
554
  printf("static const unsigned int\nymode_counts"
555
556
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
557
558
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
559
560
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
561
    printf("  {");
562
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
563
564
565
566
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
567
568
569
         "[VP9_NKF_BINTRAMODES] = {\n");
  for (t = 0; t < VP9_NKF_BINTRAMODES; ++t)
    printf("%d, ", cm->fc.bmode_counts[t]);
John Koleszar's avatar
John Koleszar committed
570
571
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
572
573
         "[VP9_I8X8_MODES] = {\n");
  for (t = 0; t < VP9_I8X8_MODES; ++t) printf("%d, ", cm->fc.i8x8_mode_counts[t]);
John Koleszar's avatar
John Koleszar committed
574
575
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
576
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
577
578
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
579
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
580
581
582
583
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
584
585
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
586
  printf("};\n");
587
588
589
590
591
592
#if CONFIG_COMP_INTERINTRA_PRED
  printf("static const unsigned int\ninterintra_counts"
         "[2] = {\n");
  for (t = 0; t < 2; ++t) printf("%d, ", cm->fc.interintra_counts[t]);
  printf("};\n");
#endif
593
#endif
594
595
596
597
598
599
600

  update_mode_probs(VP9_YMODES, vp9_ymode_encodings, vp9_ymode_tree,
                    cm->fc.ymode_counts, cm->fc.pre_ymode_prob,
                    cm->fc.ymode_prob);
  update_mode_probs(VP9_I32X32_MODES, vp9_sb_ymode_encodings, vp9_sb_ymode_tree,
                    cm->fc.sb_ymode_counts, cm->fc.pre_sb_ymode_prob,
                    cm->fc.sb_ymode_prob);
601
  for (i = 0; i < VP9_YMODES; ++i) {
602
603
604
    update_mode_probs(VP9_UV_MODES, vp9_uv_mode_encodings, vp9_uv_mode_tree,
                      cm->fc.uv_mode_counts[i], cm->fc.pre_uv_mode_prob[i],
                      cm->fc.uv_mode_prob[i]);
John Koleszar's avatar
John Koleszar committed
605
  }
606
607
608
609
610
611
  update_mode_probs(VP9_NKF_BINTRAMODES, vp9_bmode_encodings, vp9_bmode_tree,
                    cm->fc.bmode_counts, cm->fc.pre_bmode_prob,
                    cm->fc.bmode_prob);
  update_mode_probs(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                    vp9_i8x8_mode_tree, cm->fc.i8x8_mode_counts,
                    cm->fc.pre_i8x8_mode_prob, cm->fc.i8x8_mode_prob);
John Koleszar's avatar
John Koleszar committed
612
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
613
614
615
    update_mode_probs(VP9_SUBMVREFS, vp9_sub_mv_ref_encoding_array,
                      vp9_sub_mv_ref_tree, cm->fc.sub_mv_ref_counts[i],
                      cm->fc.pre_sub_mv_ref_prob[i], cm->fc.sub_mv_ref_prob[i]);
John Koleszar's avatar
John Koleszar committed
616
  }
617
618
619
  update_mode_probs(VP9_NUMMBSPLITS, vp9_mbsplit_encodings, vp9_mbsplit_tree,
                    cm->fc.mbsplit_counts, cm->fc.pre_mbsplit_prob,
                    cm->fc.mbsplit_prob);
620
621
#if CONFIG_COMP_INTERINTRA_PRED
  if (cm->use_interintra) {
622
623
624
625
    int factor, interintra_prob, count;

    interintra_prob = get_binary_prob(cm->fc.interintra_counts[0],
                                      cm->fc.interintra_counts[1]);
626
627
628
    count = cm->fc.interintra_counts[0] + cm->fc.interintra_counts[1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
629
630
    cm->fc.interintra_prob = weighted_prob(cm->fc.pre_interintra_prob,
                                           interintra_prob, factor);
631
632
  }
#endif
633
}