entropymode.c 23.4 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
#include "onyxc_int.h"
13
#include "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
struct vp9_token_struct vp9_sb_kf_ymode_encodings [VP9_I32X32_MODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
294
#endif
295
296
297
298
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
299

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

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

309
  vp9_tree_probs_from_distribution(VP9_YMODES, vp9_ymode_encodings,
310
311
                                   vp9_ymode_tree, x->fc.ymode_prob,
                                   bct, y_mode_cts, 256, 1);
John Koleszar's avatar
John Koleszar committed
312
313
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
314
    for (i = 0; i < 8; i++) {
315
316
317
      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
318
#if CONFIG_SUPERBLOCKS
319
320
321
322
323
      vp9_tree_probs_from_distribution(VP9_I32X32_MODES,
                                       vp9_sb_kf_ymode_encodings,
                                       vp9_sb_ymode_tree,
                                       x->sb_kf_ymode_prob[i], bct,
                                       kf_y_mode_cts[i], 256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
324
325
#endif
    }
John Koleszar's avatar
John Koleszar committed
326
327
328
  }
  {
    int i;
329
    for (i = 0; i < VP9_YMODES; i++) {
330
331
332
333
334
335
      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);
336
    }
John Koleszar's avatar
John Koleszar committed
337
  }
338

339
340
341
  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);
342

343
344
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
345
346
347
  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));
John Koleszar's avatar
John Koleszar committed
348
349
350
351
}


static void intra_bmode_probs_from_distribution(
352
353
354
355
356
  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
357
358
}

359
360
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
361
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
362
363
}

364
365
366
367
368
369
370
371
372
373
374
375
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];
376
  int i, j;
John Koleszar's avatar
John Koleszar committed
377

378
379
380
381
  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]);
382
383
    }
  }
John Koleszar's avatar
John Koleszar committed
384
385
}

386
387
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
388
389
390
  -0, 2,
  -1, -2
};
391
392
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
393
  EIGHTTAP, SIXTAP, EIGHTTAP_SHARP};
394
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, -1, 0, 2, -1};
395
396
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
397
398
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
399
400
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
401
402
  -0, -1,
};
403
404
405
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] = {
406
407
408
409
  {248},
  { 64},
  {192},
};
410
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
411
  EIGHTTAP, EIGHTTAP_SHARP};
412
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1}; //8, 8s
413
#endif
John Koleszar's avatar
John Koleszar committed
414

415
void vp9_entropy_mode_init() {
416
  vp9_tokens_from_tree(vp9_kf_bmode_encodings,   vp9_kf_bmode_tree);
417
418
419
  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
420
#if CONFIG_SUPERBLOCKS
421
  vp9_tokens_from_tree(vp9_sb_kf_ymode_encodings, vp9_sb_ymode_tree);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
422
#endif
423
424
425
426
427
428
429
430
  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
431
#if CONFIG_SUPERBLOCKS
432
433
  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
434
#endif
435
436
  vp9_tokens_from_tree_offset(vp9_sub_mv_ref_encoding_array,
                              vp9_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
437
}
Yaowu Xu's avatar
Yaowu Xu committed
438

439
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
440
441
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
  vpx_memset(pc->fc.mv_ref_ct_a, 0, sizeof(pc->fc.mv_ref_ct_a));
442

John Koleszar's avatar
John Koleszar committed
443
  vpx_memcpy(pc->fc.mode_context,
444
             vp9_default_mode_contexts,
John Koleszar's avatar
John Koleszar committed
445
446
             sizeof(pc->fc.mode_context));
  vpx_memcpy(pc->fc.mode_context_a,
447
             vp9_default_mode_contexts_a,
John Koleszar's avatar
John Koleszar committed
448
             sizeof(pc->fc.mode_context_a));
449

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,
John Koleszar's avatar
John Koleszar committed
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
                       const int ct[4]) {
  int (*mv_ref_ct)[4][2];

  if (pc->refresh_alt_ref_frame)
    mv_ref_ct = pc->fc.mv_ref_ct_a;
  else
    mv_ref_ct = pc->fc.mv_ref_ct;

  if (m == ZEROMV) {
    ++mv_ref_ct [ct[0]] [0] [0];
  } else {
    ++mv_ref_ct [ct[0]] [0] [1];
    if (m == NEARESTMV) {
      ++mv_ref_ct [ct[1]] [1] [0];
    } else {
      ++mv_ref_ct [ct[1]] [1] [1];
      if (m == NEARMV) {
        ++mv_ref_ct [ct[2]] [2] [0];
      } else {
        ++mv_ref_ct [ct[2]] [2] [1];
        if (m == NEWMV) {
          ++mv_ref_ct [ct[3]] [3] [0];
        } else {
          ++mv_ref_ct [ct[3]] [3] [1];
Yaowu Xu's avatar
Yaowu Xu committed
478
        }
John Koleszar's avatar
John Koleszar committed
479
      }
Yaowu Xu's avatar
Yaowu Xu committed
480
    }
John Koleszar's avatar
John Koleszar committed
481
  }
Yaowu Xu's avatar
Yaowu Xu committed
482
483
}

484
#define MVREF_COUNT_SAT 20
Deb Mukherjee's avatar
Deb Mukherjee committed
485
#define MVREF_MAX_UPDATE_FACTOR 144
486
void vp9_update_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
  int i, j;
  int (*mv_ref_ct)[4][2];
  int (*mode_context)[4];

  if (pc->refresh_alt_ref_frame) {
    mv_ref_ct = pc->fc.mv_ref_ct_a;
    mode_context = pc->fc.mode_context_a;
  } else {
    mv_ref_ct = pc->fc.mv_ref_ct;
    mode_context = pc->fc.mode_context;
  }

  for (j = 0; j < 6; j++) {
    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);
508
        this_prob = (pc->fc.vp9_mode_contexts[j][i] * (256 - factor) +
John Koleszar's avatar
John Koleszar committed
509
510
511
512
                     this_prob * factor + 128) >> 8;
        this_prob = this_prob ? (this_prob < 255 ? this_prob : 255) : 1;
        mode_context[j][i] = this_prob;
      }
Yaowu Xu's avatar
Yaowu Xu committed
513
    }
John Koleszar's avatar
John Koleszar committed
514
  }
Yaowu Xu's avatar
Yaowu Xu committed
515
}
516

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

John Koleszar's avatar
John Koleszar committed
538
// #define MODE_COUNT_TESTING
Deb Mukherjee's avatar
Deb Mukherjee committed
539
540
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
541
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
John Koleszar's avatar
John Koleszar committed
542
543
  int i, t, count, factor;
  unsigned int branch_ct[32][2];
544
545
  vp9_prob ymode_probs[VP9_YMODES - 1];
  vp9_prob uvmode_probs[VP9_UV_MODES - 1];
546
  vp9_prob bmode_probs[VP9_NKF_BINTRAMODES - 1];
547
548
549
  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];
550
#ifdef MODE_COUNT_TESTING
John Koleszar's avatar
John Koleszar committed
551
  printf("static const unsigned int\nymode_counts"
552
553
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
554
555
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
556
557
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
558
    printf("  {");
559
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
560
561
562
563
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
564
565
566
         "[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
567
568
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
569
570
         "[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
571
572
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
573
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
574
575
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
576
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
577
578
579
580
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
581
582
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
583
  printf("};\n");
584
#endif
585
  vp9_tree_probs_from_distribution(
586
    VP9_YMODES, vp9_ymode_encodings, vp9_ymode_tree,
John Koleszar's avatar
John Koleszar committed
587
588
    ymode_probs, branch_ct, cm->fc.ymode_counts,
    256, 1);
589
  for (t = 0; t < VP9_YMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
590
591
592
593
594
595
596
597
598
599
    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;
    if (prob <= 0) cm->fc.ymode_prob[t] = 1;
    else if (prob > 255) cm->fc.ymode_prob[t] = 255;
    else cm->fc.ymode_prob[t] = prob;
  }
600
  for (i = 0; i < VP9_YMODES; ++i) {
601
602
603
    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);
604
    for (t = 0; t < VP9_UV_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
605
606
607
608
609
610
611
612
613
      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;
      if (prob <= 0) cm->fc.uv_mode_prob[i][t] = 1;
      else if (prob > 255) cm->fc.uv_mode_prob[i][t] = 255;
      else cm->fc.uv_mode_prob[i][t] = prob;
614
    }
John Koleszar's avatar
John Koleszar committed
615
  }
616
  vp9_tree_probs_from_distribution(VP9_NKF_BINTRAMODES, vp9_bmode_encodings,
617
618
                                   vp9_bmode_tree, bmode_probs, branch_ct,
                                   cm->fc.bmode_counts, 256, 1);
619
  for (t = 0; t < VP9_NKF_BINTRAMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
620
621
622
623
624
625
626
627
628
629
    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;
    if (prob <= 0) cm->fc.bmode_prob[t] = 1;
    else if (prob > 255) cm->fc.bmode_prob[t] = 255;
    else cm->fc.bmode_prob[t] = prob;
  }
630
631
632
  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);
633
  for (t = 0; t < VP9_I8X8_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
634
635
636
637
638
639
640
641
642
643
644
    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;
    if (prob <= 0) cm->fc.i8x8_mode_prob[t] = 1;
    else if (prob > 255) cm->fc.i8x8_mode_prob[t] = 255;
    else cm->fc.i8x8_mode_prob[t] = prob;
  }
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
645
646
647
648
649
    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);
650
    for (t = 0; t < VP9_SUBMVREFS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
651
652
653
654
655
656
657
658
659
      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;
      if (prob <= 0) cm->fc.sub_mv_ref_prob[i][t] = 1;
      else if (prob > 255) cm->fc.sub_mv_ref_prob[i][t] = 255;
      else cm->fc.sub_mv_ref_prob[i][t] = prob;
660
    }
John Koleszar's avatar
John Koleszar committed
661
  }
662
663
664
  vp9_tree_probs_from_distribution(VP9_NUMMBSPLITS, vp9_mbsplit_encodings,
                                   vp9_mbsplit_tree, mbsplit_probs, branch_ct,
                                   cm->fc.mbsplit_counts, 256, 1);
665
  for (t = 0; t < VP9_NUMMBSPLITS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
666
667
668
669
670
671
672
673
674
675
    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;
    if (prob <= 0) cm->fc.mbsplit_prob[t] = 1;
    else if (prob > 255) cm->fc.mbsplit_prob[t] = 255;
    else cm->fc.mbsplit_prob[t] = prob;
  }
676
}