vp9_entropymode.c 24.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
13
#include "vp9/common/vp9_onyxc_int.h"
#include "vp9/common/vp9_modecont.h"
14
15
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_alloccommon.h"
John Koleszar's avatar
John Koleszar committed
16
#include "vpx_mem/vpx_mem.h"
17

18
static const unsigned int kf_y_mode_cts[8][VP9_YMODES] = {
Yaowu Xu's avatar
Yaowu Xu committed
19
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 i4X4 */
John Koleszar's avatar
John Koleszar committed
20
21
22
23
24
25
26
27
  {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},
28
};
29

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

35
static const unsigned int uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
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 */
Yaowu Xu's avatar
Yaowu Xu committed
48
  { 150, 35, 41, 10, 10, 10, 10, 10, 10, 10}, /* i4X4 */
49
50
};

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

56
static const unsigned int kf_uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
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 */
Yaowu Xu's avatar
Yaowu Xu committed
69
  { 122, 41, 35, 20, 20, 20, 20, 20, 20, 18}, /* I4X4 */
70
};
John Koleszar's avatar
John Koleszar committed
71

72
73
74
static const unsigned int bmode_cts[VP9_NKF_BINTRAMODES] = {
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
Yaowu Xu's avatar
Yaowu Xu committed
75
  /* DC    TM     V      H   CONTEXT */
76
77
  43891, 17694, 10036, 3920, 20000
#elif CONTEXT_PRED_REPLACEMENTS == 4
Yaowu Xu's avatar
Yaowu Xu committed
78
  /* DC    TM     V      H   D45   D135   CONTEXT */
79
80
  43891, 17694, 10036, 3920, 3363, 2546, 14000
#elif CONTEXT_PRED_REPLACEMENTS == 0
Yaowu Xu's avatar
Yaowu Xu committed
81
82
  /* DC    V     H    D45   D135  D117  D153   D27   D63   TM    CONTEXT */
  43891, 10036, 3920, 3363, 2546, 5119, 2471, 1723, 3221, 17694, 50000
83
84
#endif
#else
Yaowu Xu's avatar
Yaowu Xu committed
85
86
  /* DC    V     H    D45   D135  D117  D153   D27   D63   TM  */
  43891, 10036, 3920, 3363, 2546, 5119, 2471, 1723, 3221, 17694
87
#endif
John Koleszar's avatar
John Koleszar committed
88
89
};

John Koleszar's avatar
John Koleszar committed
90
91
92
93
94
95
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
96
97
} sumvfref_t;

98
int vp9_mv_cont(const int_mv *l, const int_mv *a) {
John Koleszar's avatar
John Koleszar committed
99
100
101
  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
102

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

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

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

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

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

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

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

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

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

154
155
156
157
158
159
160
161
162
163
164
#if CONFIG_SBSEGMENT
const vp9_prob vp9_partition_probs[PARTITION_PLANES][PARTITION_TYPES - 1] = {
  {110, 111, 150},
  {110, 111, 150},
};
#else
const vp9_prob vp9_partition_probs[PARTITION_PLANES][PARTITION_TYPES - 1] = {
  {200}, {200},
};
#endif

John Koleszar's avatar
John Koleszar committed
165
166
/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */

167
168
169
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 */
Yaowu Xu's avatar
Yaowu Xu committed
170
  -B_V_PRED, 6,                       /* 2 = V_NODE */
171
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
172
173
174
175
176
  -B_H_PRED, 10,                      /* 4 = H_NODE */
  -B_D135_PRED, -B_D117_PRED,         /* 5 = D135_NODE */
  -B_D45_PRED, 14,                    /* 6 = D45_NODE */
  -B_D63_PRED, 16,                    /* 7 = D63_NODE */
  -B_D153_PRED, -B_D27_PRED           /* 8 = D153_NODE */
177
178
179
180
181
182
183
184
};

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),
Yaowu Xu's avatar
Yaowu Xu committed
185
  -B_V_PRED, -B_H_PRED
186
187
188
189
#elif CONTEXT_PRED_REPLACEMENTS == 4
  -B_DC_PRED, 2,
  -B_TM_PRED, 4,
  6, 8,
Yaowu Xu's avatar
Yaowu Xu committed
190
  -B_V_PRED, -B_H_PRED,
191
  10, -(B_CONTEXT_PRED - CONTEXT_PRED_REPLACEMENTS),
Yaowu Xu's avatar
Yaowu Xu committed
192
  -B_D135_PRED, -B_D45_PRED,
193
194
195
#elif CONTEXT_PRED_REPLACEMENTS == 0
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
196
  -B_V_PRED, 6,                       /* 2 = V_NODE */
197
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
198
199
200
201
202
203
  -B_H_PRED, 10,                      /* 4 = H_NODE */
  -B_D135_PRED, -B_D117_PRED,         /* 5 = D135_NODE */
  -B_D45_PRED, 14,                    /* 6 = D45_NODE */
  -B_D63_PRED, 16,                    /* 7 = D63_NODE */
  -B_D153_PRED, 18,                   /* 8 = D153_NODE */
  -B_D27_PRED, -B_CONTEXT_PRED        /* 9 = D27_NODE */
204
205
206
207
#endif
#else
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
208
  -B_V_PRED, 6,                       /* 2 = V_NODE */
209
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
210
211
212
213
214
  -B_H_PRED, 10,                      /* 4 = H_NODE */
  -B_D135_PRED, -B_D117_PRED,         /* 5 = D135_NODE */
  -B_D45_PRED, 14,                    /* 6 = D45_NODE */
  -B_D63_PRED, 16,                    /* 7 = D63_NODE */
  -B_D153_PRED, -B_D27_PRED           /* 8 = D153_NODE */
215
#endif
John Koleszar's avatar
John Koleszar committed
216
217
};

218
219
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
220
const vp9_tree_index vp9_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
221
222
223
224
225
226
227
228
229
230
  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,
Yaowu Xu's avatar
Yaowu Xu committed
231
  -I4X4_PRED, -I8X8_PRED
232
233
};

234
const vp9_tree_index vp9_kf_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
235
236
237
238
239
240
241
242
243
244
  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,
Yaowu Xu's avatar
Yaowu Xu committed
245
  -I4X4_PRED, -I8X8_PRED
246
247
};

248
const vp9_tree_index vp9_i8x8_mode_tree[VP9_I8X8_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
249
250
251
252
253
254
255
256
257
  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
258
259
};

260
const vp9_tree_index vp9_uv_mode_tree[VP9_UV_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
261
262
263
264
265
266
267
268
269
  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
270
271
};

272
const vp9_tree_index vp9_mbsplit_tree[6] = {
273
274
275
  -PARTITIONING_4X4,   2,
  -PARTITIONING_8X8,   4,
  -PARTITIONING_16X8, -PARTITIONING_8X16,
John Koleszar's avatar
John Koleszar committed
276
277
};

278
const vp9_tree_index vp9_mv_ref_tree[8] = {
John Koleszar's avatar
John Koleszar committed
279
280
281
282
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, 6,
  -NEWMV, -SPLITMV
John Koleszar's avatar
John Koleszar committed
283
284
};

285
const vp9_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
286
287
288
289
290
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};

291
const vp9_tree_index vp9_sub_mv_ref_tree[6] = {
John Koleszar's avatar
John Koleszar committed
292
293
294
  -LEFT4X4, 2,
  -ABOVE4X4, 4,
  -ZERO4X4, -NEW4X4
John Koleszar's avatar
John Koleszar committed
295
296
};

297
298
299
300
301
302
303
304
305
306
307
308
#if CONFIG_SBSEGMENT
const vp9_tree_index vp9_partition_tree[6] = {
  -PARTITION_NONE, 2,
  -PARTITION_HORZ, 4,
  -PARTITION_VERT, -PARTITION_SPLIT
};
#else
const vp9_tree_index vp9_partition_tree[2] = {
  -PARTITION_NONE, -PARTITION_SPLIT
};
#endif

309
310
311
312
313
314
315
316
317
318
319
320
321
struct vp9_token vp9_bmode_encodings[VP9_NKF_BINTRAMODES];
struct vp9_token vp9_kf_bmode_encodings[VP9_KF_BINTRAMODES];
struct vp9_token vp9_ymode_encodings[VP9_YMODES];
struct vp9_token vp9_sb_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token vp9_sb_kf_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token vp9_kf_ymode_encodings[VP9_YMODES];
struct vp9_token vp9_uv_mode_encodings[VP9_UV_MODES];
struct vp9_token vp9_i8x8_mode_encodings[VP9_I8X8_MODES];
struct vp9_token vp9_mbsplit_encodings[VP9_NUMMBSPLITS];

struct vp9_token vp9_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token vp9_sb_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token vp9_sub_mv_ref_encoding_array[VP9_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
322

323
324
struct vp9_token vp9_partition_encodings[PARTITION_TYPES];

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

328
329
330
331
  vp9_tree_probs_from_distribution(vp9_ymode_tree, x->fc.ymode_prob,
                                   bct, y_mode_cts, 0);
  vp9_tree_probs_from_distribution(vp9_sb_ymode_tree, x->fc.sb_ymode_prob,
                                   bct, y_mode_cts, 0);
John Koleszar's avatar
John Koleszar committed
332
333
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
334
    for (i = 0; i < 8; i++) {
335
336
337
      vp9_tree_probs_from_distribution(vp9_kf_ymode_tree, x->kf_ymode_prob[i],
                                       bct, kf_y_mode_cts[i], 0);
      vp9_tree_probs_from_distribution(vp9_sb_kf_ymode_tree,
338
                                       x->sb_kf_ymode_prob[i], bct,
339
                                       kf_y_mode_cts[i], 0);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
340
    }
John Koleszar's avatar
John Koleszar committed
341
342
343
  }
  {
    int i;
344
    for (i = 0; i < VP9_YMODES; i++) {
345
346
347
348
      vp9_tree_probs_from_distribution(vp9_uv_mode_tree, x->kf_uv_mode_prob[i],
                                       bct, kf_uv_mode_cts[i], 0);
      vp9_tree_probs_from_distribution(vp9_uv_mode_tree, x->fc.uv_mode_prob[i],
                                       bct, uv_mode_cts[i], 0);
349
    }
John Koleszar's avatar
John Koleszar committed
350
  }
351

352
353
  vp9_tree_probs_from_distribution(vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
                                   bct, i8x8_mode_cts, 0);
354

355
356
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
357
358
359
  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));
360
361
362
363

  vpx_memcpy(x->fc.partition_prob, vp9_partition_probs,
             sizeof(vp9_partition_probs));

364
365
366
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
367
368
369
  x->ref_pred_probs[0] = 120;
  x->ref_pred_probs[1] = 80;
  x->ref_pred_probs[2] = 40;
John Koleszar's avatar
John Koleszar committed
370
371
372
373
}


static void intra_bmode_probs_from_distribution(
374
375
376
  vp9_prob p[VP9_NKF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_NKF_BINTRAMODES]) {
377
  vp9_tree_probs_from_distribution(vp9_bmode_tree, p, branch_ct, events, 0);
John Koleszar's avatar
John Koleszar committed
378
379
}

380
381
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
382
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
383
384
}

385
386
387
388
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]) {
389
  vp9_tree_probs_from_distribution(vp9_kf_bmode_tree, p, branch_ct, events, 0);
390
391
392
393
394
395
}

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

398
399
400
401
  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]);
402
403
    }
  }
John Koleszar's avatar
John Koleszar committed
404
405
}

406
407
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
408
409
410
  -0, 2,
  -1, -2
};
411
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
412
#if CONFIG_ENABLE_6TAP
413
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
Adrian Grange's avatar
Adrian Grange committed
414
415
416
417
418
419
420
  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
421
422
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
423
424
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
425
426
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
427
428
  -0, -1,
};
429
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
430
431
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
432
433
434
435
  {248},
  { 64},
  {192},
};
436
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
437
  EIGHTTAP, EIGHTTAP_SHARP};
Adrian Grange's avatar
Adrian Grange committed
438
439
440
441
442
#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
443
444
445
446
447
448
449
450
#endif  // VP9_SWITCHABLE_FILTERS

// Indicates if the filter is interpolating or non-interpolating
// Note currently only the EIGHTTAP_SMOOTH is non-interpolating
#if CONFIG_ENABLE_6TAP
const int vp9_is_interpolating_filter[SWITCHABLE + 1] = {1, 0, 1, 1, 1, -1};
#else
const int vp9_is_interpolating_filter[SWITCHABLE + 1] = {0, 1, 1, 1, -1};
451
#endif
John Koleszar's avatar
John Koleszar committed
452

453
void vp9_entropy_mode_init() {
454
  vp9_tokens_from_tree(vp9_kf_bmode_encodings,   vp9_kf_bmode_tree);
455
456
457
  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);
458
459
  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);
460
461
462
463
464
  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);
465
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
466
467
468
469
470
471
472

  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
473
}
Yaowu Xu's avatar
Yaowu Xu committed
474

475
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
476
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
477
478
479
  vpx_memcpy(pc->fc.vp9_mode_contexts,
             vp9_default_mode_contexts,
             sizeof(vp9_default_mode_contexts));
Yaowu Xu's avatar
Yaowu Xu committed
480
481
}

482
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
483
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
484
                       const int context) {
Jim Bankoski's avatar
Jim Bankoski committed
485
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
486

487
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
488
489

  if (m == ZEROMV) {
Paul Wilkins's avatar
Paul Wilkins committed
490
    ++mv_ref_ct[context][0][0];
John Koleszar's avatar
John Koleszar committed
491
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
492
    ++mv_ref_ct[context][0][1];
John Koleszar's avatar
John Koleszar committed
493
    if (m == NEARESTMV) {
Paul Wilkins's avatar
Paul Wilkins committed
494
      ++mv_ref_ct[context][1][0];
John Koleszar's avatar
John Koleszar committed
495
    } else {
Paul Wilkins's avatar
Paul Wilkins committed
496
      ++mv_ref_ct[context][1][1];
John Koleszar's avatar
John Koleszar committed
497
      if (m == NEARMV) {
Paul Wilkins's avatar
Paul Wilkins committed
498
        ++mv_ref_ct[context][2][0];
John Koleszar's avatar
John Koleszar committed
499
      } else {
Paul Wilkins's avatar
Paul Wilkins committed
500
        ++mv_ref_ct[context][2][1];
John Koleszar's avatar
John Koleszar committed
501
        if (m == NEWMV) {
Paul Wilkins's avatar
Paul Wilkins committed
502
          ++mv_ref_ct[context][3][0];
John Koleszar's avatar
John Koleszar committed
503
        } else {
Paul Wilkins's avatar
Paul Wilkins committed
504
          ++mv_ref_ct[context][3][1];
Yaowu Xu's avatar
Yaowu Xu committed
505
        }
John Koleszar's avatar
John Koleszar committed
506
      }
Yaowu Xu's avatar
Yaowu Xu committed
507
    }
John Koleszar's avatar
John Koleszar committed
508
  }
Yaowu Xu's avatar
Yaowu Xu committed
509
510
}

511
#define MVREF_COUNT_SAT 20
512
#define MVREF_MAX_UPDATE_FACTOR 128
513
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
514
  int i, j;
Jim Bankoski's avatar
Jim Bankoski committed
515
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
516
517
  int (*mode_context)[4];

518
519
  mode_context = pc->fc.vp9_mode_contexts;

520
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
521

Paul Wilkins's avatar
Paul Wilkins committed
522
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
523
    for (i = 0; i < 4; i++) {
524
525
526
527
528
529
530
531
      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
532
    }
John Koleszar's avatar
John Koleszar committed
533
  }
Yaowu Xu's avatar
Yaowu Xu committed
534
}
535

536
#ifdef MODE_STATS
537
#include "vp9/common/vp9_modecont.h"
538
void print_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
539
540
  int j, i;
  printf("\n====================\n");
541
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
542
543
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context[j][i]);
Yaowu Xu's avatar
Yaowu Xu committed
544
    }
John Koleszar's avatar
John Koleszar committed
545
546
547
    printf("\n");
  }
  printf("====================\n");
548
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
549
550
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context_a[j][i]);
551
    }
John Koleszar's avatar
John Koleszar committed
552
553
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
554
}
555
#endif
556

Deb Mukherjee's avatar
Deb Mukherjee committed
557
558
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
559
static void update_mode_probs(int n_modes,
560
                              const vp9_tree_index *tree, unsigned int *cnt,
561
562
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
563
564
565
566
567
568
#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);
569
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
570
571
572
573
574
575
576
577
578
  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
579
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
580
  int i;
581
#ifdef MODE_COUNT_TESTING
582
583
  int t;

John Koleszar's avatar
John Koleszar committed
584
  printf("static const unsigned int\nymode_counts"
585
586
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
587
588
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
589
590
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
591
    printf("  {");
592
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
593
594
595
596
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
597
598
599
         "[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
600
601
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
602
603
         "[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
604
605
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
606
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
607
608
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
609
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
610
611
612
613
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
614
615
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
616
  printf("};\n");
617
618
619
620
621
622
#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
623
#endif
624

625
  update_mode_probs(VP9_YMODES, vp9_ymode_tree,
626
                    cm->fc.ymode_counts, cm->fc.pre_ymode_prob,
627
628
                    cm->fc.ymode_prob, 0);
  update_mode_probs(VP9_I32X32_MODES, vp9_sb_ymode_tree,
629
                    cm->fc.sb_ymode_counts, cm->fc.pre_sb_ymode_prob,
630
                    cm->fc.sb_ymode_prob, 0);
631
  for (i = 0; i < VP9_YMODES; ++i) {
632
    update_mode_probs(VP9_UV_MODES, vp9_uv_mode_tree,
633
                      cm->fc.uv_mode_counts[i], cm->fc.pre_uv_mode_prob[i],
634
                      cm->fc.uv_mode_prob[i], 0);
John Koleszar's avatar
John Koleszar committed
635
  }
636
  update_mode_probs(VP9_NKF_BINTRAMODES, vp9_bmode_tree,
637
                    cm->fc.bmode_counts, cm->fc.pre_bmode_prob,
638
639
                    cm->fc.bmode_prob, 0);
  update_mode_probs(VP9_I8X8_MODES,
640
                    vp9_i8x8_mode_tree, cm->fc.i8x8_mode_counts,
641
                    cm->fc.pre_i8x8_mode_prob, cm->fc.i8x8_mode_prob, 0);
John Koleszar's avatar
John Koleszar committed
642
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
643
    update_mode_probs(VP9_SUBMVREFS,
644
                      vp9_sub_mv_ref_tree, cm->fc.sub_mv_ref_counts[i],
645
646
                      cm->fc.pre_sub_mv_ref_prob[i], cm->fc.sub_mv_ref_prob[i],
                      LEFT4X4);
John Koleszar's avatar
John Koleszar committed
647
  }
648
  update_mode_probs(VP9_NUMMBSPLITS, vp9_mbsplit_tree,
649
                    cm->fc.mbsplit_counts, cm->fc.pre_mbsplit_prob,
650
                    cm->fc.mbsplit_prob, 0);
651
652
#if CONFIG_COMP_INTERINTRA_PRED
  if (cm->use_interintra) {
653
654
655
656
    int factor, interintra_prob, count;

    interintra_prob = get_binary_prob(cm->fc.interintra_counts[0],
                                      cm->fc.interintra_counts[1]);
657
658
659
    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);
660
661
    cm->fc.interintra_prob = weighted_prob(cm->fc.pre_interintra_prob,
                                           interintra_prob, factor);
662
663
  }
#endif
664
665
666
667
  for (i = 0; i < PARTITION_PLANES; i++)
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
                      cm->fc.partition_counts[i], cm->fc.pre_partition_prob[i],
                      cm->fc.partition_prob[i], 0);
668
}
669
670
671
672
673
674
675
676
677
678

static void set_default_lf_deltas(MACROBLOCKD *xd) {
  xd->mode_ref_lf_delta_enabled = 1;
  xd->mode_ref_lf_delta_update = 1;

  xd->ref_lf_deltas[INTRA_FRAME] = 2;
  xd->ref_lf_deltas[LAST_FRAME] = 0;
  xd->ref_lf_deltas[GOLDEN_FRAME] = -2;
  xd->ref_lf_deltas[ALTREF_FRAME] = -2;

Yaowu Xu's avatar
Yaowu Xu committed
679
  xd->mode_lf_deltas[0] = 4;               // I4X4_PRED
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
  xd->mode_lf_deltas[1] = -2;              // Zero
  xd->mode_lf_deltas[2] = 2;               // New mv
  xd->mode_lf_deltas[3] = 4;               // Split mv
}

void vp9_setup_past_independence(VP9_COMMON *cm, MACROBLOCKD *xd) {
  // Reset the segment feature data to the default stats:
  // Features disabled, 0, with delta coding (Default state).
  int i;
  vp9_clearall_segfeatures(xd);
  xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
  if (cm->last_frame_seg_map)
    vpx_memset(cm->last_frame_seg_map, 0, (cm->mb_rows * cm->mb_cols));

  /* reset the mode ref deltas for loop filter */
  vpx_memset(xd->last_ref_lf_deltas, 0, sizeof(xd->last_ref_lf_deltas));
  vpx_memset(xd->last_mode_lf_deltas, 0, sizeof(xd->last_mode_lf_deltas));
  set_default_lf_deltas(xd);

  vp9_default_coef_probs(cm);
  vp9_init_mbmode_probs(cm);
  vp9_default_bmode_probs(cm->fc.bmode_prob);
  vp9_kf_default_bmode_probs(cm->kf_bmode_prob);
  vp9_init_mv_probs(cm);
  // To force update of the sharpness
  cm->last_sharpness_level = -1;

  vp9_init_mode_contexts(cm);

  for (i = 0; i < NUM_FRAME_CONTEXTS; i++) {
    vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));
  }

  vpx_memset(cm->prev_mip, 0,
             (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));
  vpx_memset(cm->mip, 0,
             (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));

  vp9_update_mode_info_border(cm, cm->mip);
  vp9_update_mode_info_in_image(cm, cm->mi);

#if CONFIG_NEW_MVREF
  // Defaults probabilities for encoding the MV ref id signal
  vpx_memset(xd->mb_mv_ref_probs, VP9_DEFAULT_MV_REF_PROB,
             sizeof(xd->mb_mv_ref_probs));
#endif
  cm->ref_frame_sign_bias[GOLDEN_FRAME] = 0;
  cm->ref_frame_sign_bias[ALTREF_FRAME] = 0;

  cm->frame_context_idx = 0;
}