vp9_entropymode.c 24.7 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_onyxc_int.h"
#include "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
};

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

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

289
290
291
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];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
292
#if CONFIG_SUPERBLOCKS
293
294
struct vp9_token_struct vp9_sb_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token_struct vp9_sb_kf_ymode_encodings[VP9_I32X32_MODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
295
#endif
296
297
298
299
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
300

301
struct vp9_token_struct vp9_mv_ref_encoding_array[VP9_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
302
#if CONFIG_SUPERBLOCKS
303
struct vp9_token_struct vp9_sb_mv_ref_encoding_array[VP9_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
304
#endif
305
struct vp9_token_struct vp9_sub_mv_ref_encoding_array[VP9_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
306

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

310
  vp9_tree_probs_from_distribution(VP9_YMODES, vp9_ymode_encodings,
311
312
                                   vp9_ymode_tree, x->fc.ymode_prob,
                                   bct, y_mode_cts, 256, 1);
313
314
315
316
317
#if CONFIG_SUPERBLOCKS
  vp9_tree_probs_from_distribution(VP9_I32X32_MODES, vp9_sb_ymode_encodings,
                                   vp9_sb_ymode_tree, x->fc.sb_ymode_prob,
                                   bct, y_mode_cts, 256, 1);
#endif
John Koleszar's avatar
John Koleszar committed
318
319
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
320
    for (i = 0; i < 8; i++) {
321
322
323
      vp9_tree_probs_from_distribution(VP9_YMODES, vp9_kf_ymode_encodings,
                                       vp9_kf_ymode_tree, x->kf_ymode_prob[i],
                                       bct, kf_y_mode_cts[i], 256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
324
#if CONFIG_SUPERBLOCKS
325
326
      vp9_tree_probs_from_distribution(VP9_I32X32_MODES,
                                       vp9_sb_kf_ymode_encodings,
327
                                       vp9_sb_kf_ymode_tree,
328
329
                                       x->sb_kf_ymode_prob[i], bct,
                                       kf_y_mode_cts[i], 256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
330
331
#endif
    }
John Koleszar's avatar
John Koleszar committed
332
333
334
  }
  {
    int i;
335
    for (i = 0; i < VP9_YMODES; i++) {
336
337
338
339
340
341
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->kf_uv_mode_prob[i],
                                       bct, kf_uv_mode_cts[i], 256, 1);
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->fc.uv_mode_prob[i],
                                       bct, uv_mode_cts[i], 256, 1);
342
    }
John Koleszar's avatar
John Koleszar committed
343
  }
344

345
346
347
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
                                   bct, i8x8_mode_cts, 256, 1);
348

349
350
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
351
352
353
  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));
354
355
356
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
John Koleszar's avatar
John Koleszar committed
357
358
359
360
}


static void intra_bmode_probs_from_distribution(
361
362
363
364
365
  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,
    vp9_bmode_tree, p, branch_ct, events, 256, 1);
John Koleszar's avatar
John Koleszar committed
366
367
}

368
369
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
370
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
371
372
}

373
374
375
376
377
378
379
380
381
382
383
384
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,
    vp9_kf_bmode_tree, p, branch_ct, events, 256, 1);
}

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];
385
  int i, j;
John Koleszar's avatar
John Koleszar committed
386

387
388
389
390
  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]);
391
392
    }
  }
John Koleszar's avatar
John Koleszar committed
393
394
}

395
396
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
397
398
399
  -0, 2,
  -1, -2
};
400
401
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
402
  EIGHTTAP, SIXTAP, EIGHTTAP_SHARP};
403
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, -1, 0, 2, -1};
404
405
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
406
407
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
408
409
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
410
411
  -0, -1,
};
412
413
414
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] = {
415
416
417
418
  {248},
  { 64},
  {192},
};
419
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
420
  EIGHTTAP, EIGHTTAP_SHARP};
421
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1}; //8, 8s
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);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
429
#if CONFIG_SUPERBLOCKS
430
431
  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);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
432
#endif
433
434
435
436
437
438
439
440
  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);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
441
#if CONFIG_SUPERBLOCKS
442
443
  vp9_tokens_from_tree_offset(vp9_sb_mv_ref_encoding_array,
                              vp9_sb_mv_ref_tree, NEARESTMV);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
444
#endif
445
446
  vp9_tokens_from_tree_offset(vp9_sub_mv_ref_encoding_array,
                              vp9_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
447
}
Yaowu Xu's avatar
Yaowu Xu committed
448

449
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
450
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
451

John Koleszar's avatar
John Koleszar committed
452
  vpx_memcpy(pc->fc.mode_context,
453
             vp9_default_mode_contexts,
John Koleszar's avatar
John Koleszar committed
454
455
             sizeof(pc->fc.mode_context));
  vpx_memcpy(pc->fc.mode_context_a,
456
             vp9_default_mode_contexts_a,
John Koleszar's avatar
John Koleszar committed
457
             sizeof(pc->fc.mode_context_a));
458

Yaowu Xu's avatar
Yaowu Xu committed
459
460
}

461
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
462
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
463
                       const int context) {
John Koleszar's avatar
John Koleszar committed
464
465
  int (*mv_ref_ct)[4][2];

466
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
467
468

  if (m == ZEROMV) {
Paul Wilkins's avatar
Paul Wilkins committed
469
    ++mv_ref_ct[context][0][0];
John Koleszar's avatar
John Koleszar committed
470
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
471
    ++mv_ref_ct[context][0][1];
John Koleszar's avatar
John Koleszar committed
472
    if (m == NEARESTMV) {
Paul Wilkins's avatar
Paul Wilkins committed
473
      ++mv_ref_ct[context][1][0];
John Koleszar's avatar
John Koleszar committed
474
    } else {
Paul Wilkins's avatar
Paul Wilkins committed
475
      ++mv_ref_ct[context][1][1];
John Koleszar's avatar
John Koleszar committed
476
      if (m == NEARMV) {
Paul Wilkins's avatar
Paul Wilkins committed
477
        ++mv_ref_ct[context][2][0];
John Koleszar's avatar
John Koleszar committed
478
      } else {
Paul Wilkins's avatar
Paul Wilkins committed
479
        ++mv_ref_ct[context][2][1];
John Koleszar's avatar
John Koleszar committed
480
        if (m == NEWMV) {
Paul Wilkins's avatar
Paul Wilkins committed
481
          ++mv_ref_ct[context][3][0];
John Koleszar's avatar
John Koleszar committed
482
        } else {
Paul Wilkins's avatar
Paul Wilkins committed
483
          ++mv_ref_ct[context][3][1];
Yaowu Xu's avatar
Yaowu Xu committed
484
        }
John Koleszar's avatar
John Koleszar committed
485
      }
Yaowu Xu's avatar
Yaowu Xu committed
486
    }
John Koleszar's avatar
John Koleszar committed
487
  }
Yaowu Xu's avatar
Yaowu Xu committed
488
489
}

490
#define MVREF_COUNT_SAT 20
491
#define MVREF_MAX_UPDATE_FACTOR 128
492
void vp9_update_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
493
494
495
496
497
498
499
500
501
  int i, j;
  int (*mv_ref_ct)[4][2];
  int (*mode_context)[4];

  if (pc->refresh_alt_ref_frame) {
    mode_context = pc->fc.mode_context_a;
  } else {
    mode_context = pc->fc.mode_context;
  }
502
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
503

Paul Wilkins's avatar
Paul Wilkins committed
504
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
505
506
507
508
509
510
511
512
    for (i = 0; i < 4; i++) {
      int this_prob;
      int count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1];
      int factor;
      {
        this_prob = count > 0 ? 256 * mv_ref_ct[j][i][0] / count : 128;
        count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
        factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
513
        this_prob = (pc->fc.vp9_mode_contexts[j][i] * (256 - factor) +
John Koleszar's avatar
John Koleszar committed
514
                     this_prob * factor + 128) >> 8;
515
        mode_context[j][i] = clip_prob(this_prob);
John Koleszar's avatar
John Koleszar committed
516
      }
Yaowu Xu's avatar
Yaowu Xu committed
517
    }
John Koleszar's avatar
John Koleszar committed
518
  }
Yaowu Xu's avatar
Yaowu Xu committed
519
}
520

521
#ifdef MODE_STATS
522
#include "vp9/common/vp9_modecont.h"
523
void print_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
524
525
  int j, i;
  printf("\n====================\n");
526
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
527
528
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context[j][i]);
Yaowu Xu's avatar
Yaowu Xu committed
529
    }
John Koleszar's avatar
John Koleszar committed
530
531
532
    printf("\n");
  }
  printf("====================\n");
533
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
534
535
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context_a[j][i]);
536
    }
John Koleszar's avatar
John Koleszar committed
537
538
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
539
}
540
#endif
541

John Koleszar's avatar
John Koleszar committed
542
// #define MODE_COUNT_TESTING
Deb Mukherjee's avatar
Deb Mukherjee committed
543
544
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
545
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
John Koleszar's avatar
John Koleszar committed
546
547
  int i, t, count, factor;
  unsigned int branch_ct[32][2];
548
  vp9_prob ymode_probs[VP9_YMODES - 1];
549
550
551
#if CONFIG_SUPERBLOCKS
  vp9_prob sb_ymode_probs[VP9_I32X32_MODES - 1];
#endif
552
  vp9_prob uvmode_probs[VP9_UV_MODES - 1];
553
  vp9_prob bmode_probs[VP9_NKF_BINTRAMODES - 1];
554
555
556
  vp9_prob i8x8_mode_probs[VP9_I8X8_MODES - 1];
  vp9_prob sub_mv_ref_probs[VP9_SUBMVREFS - 1];
  vp9_prob mbsplit_probs[VP9_NUMMBSPLITS - 1];
557
558
559
#if CONFIG_COMP_INTERINTRA_PRED
  vp9_prob interintra_prob;
#endif
560
#ifdef MODE_COUNT_TESTING
John Koleszar's avatar
John Koleszar committed
561
  printf("static const unsigned int\nymode_counts"
562
563
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
564
565
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
566
567
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
568
    printf("  {");
569
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
570
571
572
573
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
574
575
576
         "[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
577
578
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
579
580
         "[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
581
582
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
583
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
584
585
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
586
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
587
588
589
590
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
591
592
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
593
  printf("};\n");
594
595
596
597
598
599
#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
600
#endif
601
  vp9_tree_probs_from_distribution(
602
    VP9_YMODES, vp9_ymode_encodings, vp9_ymode_tree,
John Koleszar's avatar
John Koleszar committed
603
604
    ymode_probs, branch_ct, cm->fc.ymode_counts,
    256, 1);
605
  for (t = 0; t < VP9_YMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
606
607
608
609
610
611
    int prob;
    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);
    prob = ((int)cm->fc.pre_ymode_prob[t] * (256 - factor) +
            (int)ymode_probs[t] * factor + 128) >> 8;
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
    cm->fc.ymode_prob[t] = clip_prob(prob);
  }
#if CONFIG_SUPERBLOCKS
  vp9_tree_probs_from_distribution(VP9_I32X32_MODES,
                                   vp9_sb_ymode_encodings, vp9_sb_ymode_tree,
                                   sb_ymode_probs, branch_ct,
                                   cm->fc.sb_ymode_counts,
                                   256, 1);
  for (t = 0; t < VP9_I32X32_MODES - 1; ++t) {
    int prob;
    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);
    prob = ((int)cm->fc.pre_sb_ymode_prob[t] * (256 - factor) +
            (int)sb_ymode_probs[t] * factor + 128) >> 8;
    cm->fc.sb_ymode_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
628
  }
629
#endif
630
  for (i = 0; i < VP9_YMODES; ++i) {
631
632
633
    vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                     vp9_uv_mode_tree, uvmode_probs, branch_ct,
                                     cm->fc.uv_mode_counts[i], 256, 1);
634
    for (t = 0; t < VP9_UV_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
635
636
637
638
639
640
      int prob;
      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);
      prob = ((int)cm->fc.pre_uv_mode_prob[i][t] * (256 - factor) +
              (int)uvmode_probs[t] * factor + 128) >> 8;
641
      cm->fc.uv_mode_prob[i][t] = clip_prob(prob);
642
    }
John Koleszar's avatar
John Koleszar committed
643
  }
644
  vp9_tree_probs_from_distribution(VP9_NKF_BINTRAMODES, vp9_bmode_encodings,
645
646
                                   vp9_bmode_tree, bmode_probs, branch_ct,
                                   cm->fc.bmode_counts, 256, 1);
647
  for (t = 0; t < VP9_NKF_BINTRAMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
648
649
650
651
652
653
    int prob;
    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);
    prob = ((int)cm->fc.pre_bmode_prob[t] * (256 - factor) +
            (int)bmode_probs[t] * factor + 128) >> 8;
654
    cm->fc.bmode_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
655
  }
656
657
658
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, i8x8_mode_probs,
                                   branch_ct, cm->fc.i8x8_mode_counts, 256, 1);
659
  for (t = 0; t < VP9_I8X8_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
660
661
662
663
664
665
    int prob;
    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);
    prob = ((int)cm->fc.pre_i8x8_mode_prob[t] * (256 - factor) +
            (int)i8x8_mode_probs[t] * factor + 128) >> 8;
666
    cm->fc.i8x8_mode_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
667
668
  }
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
669
670
671
672
673
    vp9_tree_probs_from_distribution(VP9_SUBMVREFS,
                                     vp9_sub_mv_ref_encoding_array,
                                     vp9_sub_mv_ref_tree, sub_mv_ref_probs,
                                     branch_ct, cm->fc.sub_mv_ref_counts[i],
                                     256, 1);
674
    for (t = 0; t < VP9_SUBMVREFS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
675
676
677
678
679
680
      int prob;
      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);
      prob = ((int)cm->fc.pre_sub_mv_ref_prob[i][t] * (256 - factor) +
              (int)sub_mv_ref_probs[t] * factor + 128) >> 8;
681
      cm->fc.sub_mv_ref_prob[i][t] = clip_prob(prob);
682
    }
John Koleszar's avatar
John Koleszar committed
683
  }
684
685
686
  vp9_tree_probs_from_distribution(VP9_NUMMBSPLITS, vp9_mbsplit_encodings,
                                   vp9_mbsplit_tree, mbsplit_probs, branch_ct,
                                   cm->fc.mbsplit_counts, 256, 1);
687
  for (t = 0; t < VP9_NUMMBSPLITS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
688
689
690
691
692
693
    int prob;
    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);
    prob = ((int)cm->fc.pre_mbsplit_prob[t] * (256 - factor) +
            (int)mbsplit_probs[t] * factor + 128) >> 8;
694
    cm->fc.mbsplit_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
695
  }
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
#if CONFIG_COMP_INTERINTRA_PRED
  if (cm->use_interintra) {
    int prob;
    interintra_prob = vp9_bin_prob_from_distribution(cm->fc.interintra_counts);
    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);
    prob = ((int)cm->fc.pre_interintra_prob * (256 - factor) +
            (int)interintra_prob * factor + 128) >> 8;
    if (prob <= 0)
      cm->fc.interintra_prob = 1;
    else if (prob > 255)
      cm->fc.interintra_prob = 255;
    else
      cm->fc.interintra_prob = prob;
  }
#endif
713
}