vp9_entropymode.c 23.5 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

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

156
157
158
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
159
  -B_V_PRED, 6,                       /* 2 = V_NODE */
160
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
161
162
163
164
165
  -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 */
166
167
168
169
170
171
172
173
};

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
174
  -B_V_PRED, -B_H_PRED
175
176
177
178
#elif CONTEXT_PRED_REPLACEMENTS == 4
  -B_DC_PRED, 2,
  -B_TM_PRED, 4,
  6, 8,
Yaowu Xu's avatar
Yaowu Xu committed
179
  -B_V_PRED, -B_H_PRED,
180
  10, -(B_CONTEXT_PRED - CONTEXT_PRED_REPLACEMENTS),
Yaowu Xu's avatar
Yaowu Xu committed
181
  -B_D135_PRED, -B_D45_PRED,
182
183
184
#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
185
  -B_V_PRED, 6,                       /* 2 = V_NODE */
186
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
187
188
189
190
191
192
  -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 */
193
194
195
196
#endif
#else
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
197
  -B_V_PRED, 6,                       /* 2 = V_NODE */
198
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
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, -B_D27_PRED           /* 8 = D153_NODE */
204
#endif
John Koleszar's avatar
John Koleszar committed
205
206
};

207
208
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
209
const vp9_tree_index vp9_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
210
211
212
213
214
215
216
217
218
219
  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
220
  -I4X4_PRED, -I8X8_PRED
221
222
};

223
const vp9_tree_index vp9_kf_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
224
225
226
227
228
229
230
231
232
233
  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
234
  -I4X4_PRED, -I8X8_PRED
235
236
};

237
const vp9_tree_index vp9_i8x8_mode_tree[VP9_I8X8_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
238
239
240
241
242
243
244
245
246
  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
247
248
};

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

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

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

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

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

286
287
288
289
290
291
292
293
294
295
296
297
298
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
299

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

303
304
305
306
  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
307
308
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
309
    for (i = 0; i < 8; i++) {
310
311
312
      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,
313
                                       x->sb_kf_ymode_prob[i], bct,
314
                                       kf_y_mode_cts[i], 0);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
315
    }
John Koleszar's avatar
John Koleszar committed
316
317
318
  }
  {
    int i;
319
    for (i = 0; i < VP9_YMODES; i++) {
320
321
322
323
      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);
324
    }
John Koleszar's avatar
John Koleszar committed
325
  }
326

327
328
  vp9_tree_probs_from_distribution(vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
                                   bct, i8x8_mode_cts, 0);
329

330
331
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
332
333
334
  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));
335
336
337
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
338
339
340
  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
341
342
343
344
}


static void intra_bmode_probs_from_distribution(
345
346
347
  vp9_prob p[VP9_NKF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_NKF_BINTRAMODES]) {
348
  vp9_tree_probs_from_distribution(vp9_bmode_tree, p, branch_ct, events, 0);
John Koleszar's avatar
John Koleszar committed
349
350
}

351
352
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
353
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
354
355
}

356
357
358
359
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]) {
360
  vp9_tree_probs_from_distribution(vp9_kf_bmode_tree, p, branch_ct, events, 0);
361
362
363
364
365
366
}

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

369
370
371
372
  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]);
373
374
    }
  }
John Koleszar's avatar
John Koleszar committed
375
376
}

377
378
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
379
380
381
  -0, 2,
  -1, -2
};
382
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
383
#if CONFIG_ENABLE_6TAP
384
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
Adrian Grange's avatar
Adrian Grange committed
385
386
387
388
389
390
391
  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
392
393
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
394
395
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
396
397
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
398
399
  -0, -1,
};
400
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
401
402
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
403
404
405
406
  {248},
  { 64},
  {192},
};
407
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
408
  EIGHTTAP, EIGHTTAP_SHARP};
Adrian Grange's avatar
Adrian Grange committed
409
410
411
412
413
#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
414
415
416
417
418
419
420
421
#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};
422
#endif
John Koleszar's avatar
John Koleszar committed
423

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

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

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

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

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

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

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

488
489
  mode_context = pc->fc.vp9_mode_contexts;

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

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

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

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

Deb Mukherjee's avatar
Deb Mukherjee committed
527
528
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
529
static void update_mode_probs(int n_modes,
530
                              const vp9_tree_index *tree, unsigned int *cnt,
531
532
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
533
534
535
536
537
538
#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);
539
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
540
541
542
543
544
545
546
547
548
  for (t = 0; t < n_modes - 1; ++t) {
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    dst_probs[t] = weighted_prob(pre_probs[t], probs[t], factor);
  }
}

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

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

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

    interintra_prob = get_binary_prob(cm->fc.interintra_counts[0],
                                      cm->fc.interintra_counts[1]);
627
628
629
    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);
630
631
    cm->fc.interintra_prob = weighted_prob(cm->fc.pre_interintra_prob,
                                           interintra_prob, factor);
632
633
  }
#endif
634
}
635
636
637
638
639
640
641
642
643
644

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
645
  xd->mode_lf_deltas[0] = 4;               // I4X4_PRED
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
  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;
}