entropymode.c 20.2 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][VP8_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

Deb Mukherjee's avatar
Deb Mukherjee committed
29
static const unsigned int y_mode_cts  [VP8_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

John Koleszar's avatar
John Koleszar committed
34
35
36
37
38
39
40
41
42
43
44
45
46
47
static const unsigned int uv_mode_cts [VP8_YMODES] [VP8_UV_MODES] = {
  /* 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
};

Deb Mukherjee's avatar
Deb Mukherjee committed
50
static const unsigned int i8x8_mode_cts  [VP8_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

John Koleszar's avatar
John Koleszar committed
55
56
57
58
59
60
61
62
63
64
65
66
67
68
static const unsigned int kf_uv_mode_cts [VP8_YMODES] [VP8_UV_MODES] = {
  // 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

John Koleszar's avatar
John Koleszar committed
71
72
73
static const unsigned int bmode_cts[VP8_BINTRAMODES] = {
  /* DC    TM     VE     HE   LD    RD    VR    VL    HD    HU */
  43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723
John Koleszar's avatar
John Koleszar committed
74
75
};

John Koleszar's avatar
John Koleszar committed
76
77
78
79
80
81
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
82
83
} sumvfref_t;

84
int vp9_mv_cont(const int_mv *l, const int_mv *a) {
John Koleszar's avatar
John Koleszar committed
85
86
87
  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
88

John Koleszar's avatar
John Koleszar committed
89
90
  if (lea && lez)
    return SUBMVREF_LEFT_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
91

John Koleszar's avatar
John Koleszar committed
92
93
  if (lea)
    return SUBMVREF_LEFT_ABOVE_SAME;
John Koleszar's avatar
John Koleszar committed
94

John Koleszar's avatar
John Koleszar committed
95
96
  if (aez)
    return SUBMVREF_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
97

John Koleszar's avatar
John Koleszar committed
98
99
  if (lez)
    return SUBMVREF_LEFT_ZED;
John Koleszar's avatar
John Koleszar committed
100

John Koleszar's avatar
John Koleszar committed
101
  return SUBMVREF_NORMAL;
John Koleszar's avatar
John Koleszar committed
102
103
}

104
const vp8_prob vp9_sub_mv_ref_prob [VP8_SUBMVREFS - 1] = { 180, 162, 25};
John Koleszar's avatar
John Koleszar committed
105

106
const vp8_prob vp9_sub_mv_ref_prob2 [SUBMVREF_COUNT][VP8_SUBMVREFS - 1] = {
John Koleszar's avatar
John Koleszar committed
107
108
109
110
111
  { 147, 136, 18 },
  { 106, 145, 1  },
  { 179, 121, 1  },
  { 223, 1, 34 },
  { 208, 1, 1  }
John Koleszar's avatar
John Koleszar committed
112
113
114
115
};



116
vp9_mbsplit vp9_mbsplits [VP8_NUMMBSPLITS] = {
John Koleszar's avatar
John Koleszar committed
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  {
    0,  0,  0,  0,
    0,  0,  0,  0,
    1,  1,  1,  1,
    1,  1,  1,  1,
  },
  {
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
  },
  {
    0,  0,  1,  1,
    0,  0,  1,  1,
    2,  2,  3,  3,
    2,  2,  3,  3,
  },
  {
    0,  1,  2,  3,
    4,  5,  6,  7,
    8,  9,  10, 11,
    12, 13, 14, 15,
  },
John Koleszar's avatar
John Koleszar committed
141
142
};

143
const int vp9_mbsplit_count [VP8_NUMMBSPLITS] = { 2, 2, 4, 16};
John Koleszar's avatar
John Koleszar committed
144

145
const vp8_prob vp9_mbsplit_probs [VP8_NUMMBSPLITS - 1] = { 110, 111, 150};
John Koleszar's avatar
John Koleszar committed
146
147
148
149


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

150
const vp8_tree_index vp9_bmode_tree[VP8_BINTRAMODES * 2 - 2] = /* INTRAMODECONTEXTNODE value */
John Koleszar's avatar
John Koleszar committed
151
{
John Koleszar's avatar
John Koleszar committed
152
153
154
155
156
157
158
159
160
  -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 */
John Koleszar's avatar
John Koleszar committed
161
162
};

163
164
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
165
const vp8_tree_index vp9_ymode_tree[VP8_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
166
167
168
169
170
171
172
173
174
175
176
  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
177
178
};

179
const vp8_tree_index vp9_kf_ymode_tree[VP8_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
180
181
182
183
184
185
186
187
188
189
190
  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
191
192
};

193
const vp8_tree_index vp9_i8x8_mode_tree[VP8_I8X8_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
194
195
196
197
198
199
200
201
202
  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
203
204
};

205
const vp8_tree_index vp9_uv_mode_tree[VP8_UV_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
206
207
208
209
210
211
212
213
214
  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
215
216
};

217
const vp8_tree_index vp9_mbsplit_tree[6] = {
218
219
220
  -PARTITIONING_4X4,   2,
  -PARTITIONING_8X8,   4,
  -PARTITIONING_16X8, -PARTITIONING_8X16,
John Koleszar's avatar
John Koleszar committed
221
222
};

223
const vp8_tree_index vp9_mv_ref_tree[8] = {
John Koleszar's avatar
John Koleszar committed
224
225
226
227
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, 6,
  -NEWMV, -SPLITMV
John Koleszar's avatar
John Koleszar committed
228
229
};

Ronald S. Bultje's avatar
Ronald S. Bultje committed
230
#if CONFIG_SUPERBLOCKS
231
const vp8_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
232
233
234
235
236
237
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};
#endif

238
const vp8_tree_index vp9_sub_mv_ref_tree[6] = {
John Koleszar's avatar
John Koleszar committed
239
240
241
  -LEFT4X4, 2,
  -ABOVE4X4, 4,
  -ZERO4X4, -NEW4X4
John Koleszar's avatar
John Koleszar committed
242
243
244
};


245
246
struct vp8_token_struct vp9_bmode_encodings   [VP8_BINTRAMODES];
struct vp8_token_struct vp9_ymode_encodings   [VP8_YMODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
247
#if CONFIG_SUPERBLOCKS
248
struct vp8_token_struct vp9_sb_kf_ymode_encodings [VP8_I32X32_MODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
249
#endif
250
251
252
253
struct vp8_token_struct vp9_kf_ymode_encodings [VP8_YMODES];
struct vp8_token_struct vp9_uv_mode_encodings  [VP8_UV_MODES];
struct vp8_token_struct vp9_i8x8_mode_encodings  [VP8_I8X8_MODES];
struct vp8_token_struct vp9_mbsplit_encodings [VP8_NUMMBSPLITS];
John Koleszar's avatar
John Koleszar committed
254

255
struct vp8_token_struct vp9_mv_ref_encoding_array    [VP8_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
256
#if CONFIG_SUPERBLOCKS
257
struct vp8_token_struct vp9_sb_mv_ref_encoding_array  [VP8_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
258
#endif
259
struct vp8_token_struct vp9_sub_mv_ref_encoding_array [VP8_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
260

261
262


263
void vp9_init_mbmode_probs(VP8_COMMON *x) {
John Koleszar's avatar
John Koleszar committed
264
  unsigned int bct [VP8_YMODES] [2];      /* num Ymodes > num UV modes */
John Koleszar's avatar
John Koleszar committed
265

266
267
  vp9_tree_probs_from_distribution(VP8_YMODES, vp9_ymode_encodings,
    vp9_ymode_tree, x->fc.ymode_prob, bct, y_mode_cts, 256, 1);
John Koleszar's avatar
John Koleszar committed
268
269
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
270
    for (i = 0; i < 8; i++) {
271
      vp9_tree_probs_from_distribution(
272
        VP8_YMODES, vp9_kf_ymode_encodings, vp9_kf_ymode_tree,
John Koleszar's avatar
John Koleszar committed
273
        x->kf_ymode_prob[i], bct, kf_y_mode_cts[i],
Daniel Kang's avatar
Daniel Kang committed
274
        256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
275
#if CONFIG_SUPERBLOCKS
276
      vp9_tree_probs_from_distribution(
277
        VP8_I32X32_MODES, vp9_sb_kf_ymode_encodings, vp8_sb_ymode_tree,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
278
279
280
281
        x->sb_kf_ymode_prob[i], bct, kf_y_mode_cts[i],
        256, 1);
#endif
    }
John Koleszar's avatar
John Koleszar committed
282
283
284
285
  }
  {
    int i;
    for (i = 0; i < VP8_YMODES; i++) {
286
      vp9_tree_probs_from_distribution(
287
        VP8_UV_MODES, vp9_uv_mode_encodings, vp9_uv_mode_tree,
John Koleszar's avatar
John Koleszar committed
288
289
        x->kf_uv_mode_prob[i], bct, kf_uv_mode_cts[i],
        256, 1);
290
      vp9_tree_probs_from_distribution(
291
        VP8_UV_MODES, vp9_uv_mode_encodings, vp9_uv_mode_tree,
John Koleszar's avatar
John Koleszar committed
292
293
        x->fc.uv_mode_prob[i], bct, uv_mode_cts[i],
        256, 1);
294
    }
John Koleszar's avatar
John Koleszar committed
295
  }
296

297
  vp9_tree_probs_from_distribution(
298
    VP8_I8X8_MODES, vp9_i8x8_mode_encodings, vp9_i8x8_mode_tree,
John Koleszar's avatar
John Koleszar committed
299
300
    x->fc.i8x8_mode_prob, bct, i8x8_mode_cts,
    256, 1);
301

302
303
304
305
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2, sizeof(vp9_sub_mv_ref_prob2));
  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
306
307
308
309
}


static void intra_bmode_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
310
311
  vp8_prob p [VP8_BINTRAMODES - 1],
  unsigned int branch_ct [VP8_BINTRAMODES - 1] [2],
Daniel Kang's avatar
Daniel Kang committed
312
  const unsigned int events [VP8_BINTRAMODES]) {
313
314
  vp9_tree_probs_from_distribution(VP8_BINTRAMODES, vp9_bmode_encodings,
    vp9_bmode_tree, p, branch_ct, events, 256, 1);
John Koleszar's avatar
John Koleszar committed
315
316
}

317
void vp9_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES - 1]) {
John Koleszar's avatar
John Koleszar committed
318
319
  unsigned int branch_ct [VP8_BINTRAMODES - 1] [2];
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
320
321
}

322
void vp9_kf_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES - 1]) {
John Koleszar's avatar
John Koleszar committed
323
  unsigned int branch_ct [VP8_BINTRAMODES - 1] [2];
John Koleszar's avatar
John Koleszar committed
324

John Koleszar's avatar
John Koleszar committed
325
  int i = 0;
John Koleszar's avatar
John Koleszar committed
326

John Koleszar's avatar
John Koleszar committed
327
328
  do {
    int j = 0;
John Koleszar's avatar
John Koleszar committed
329

John Koleszar's avatar
John Koleszar committed
330
331
    do {
      intra_bmode_probs_from_distribution(
332
        p[i][j], branch_ct, vp9_kf_default_bmode_counts[i][j]);
John Koleszar's avatar
John Koleszar committed
333

John Koleszar's avatar
John Koleszar committed
334
335
    } while (++j < VP8_BINTRAMODES);
  } while (++i < VP8_BINTRAMODES);
John Koleszar's avatar
John Koleszar committed
336
337
}

338
#if VP8_SWITCHABLE_FILTERS == 3
339
const vp8_tree_index vp9_switchable_interp_tree[VP8_SWITCHABLE_FILTERS*2-2] = {
340
341
342
  -0, 2,
  -1, -2
};
343
344
struct vp8_token_struct vp9_switchable_interp_encodings[VP8_SWITCHABLE_FILTERS];
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP8_SWITCHABLE_FILTERS] = {
345
  EIGHTTAP, SIXTAP, EIGHTTAP_SHARP};
346
347
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, -1, 0, 2, -1};
const vp8_prob vp9_switchable_interp_prob [VP8_SWITCHABLE_FILTERS+1]
348
349
350
351
                                          [VP8_SWITCHABLE_FILTERS-1] = {
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
#elif VP8_SWITCHABLE_FILTERS == 2
352
const vp8_tree_index vp9_switchable_interp_tree[VP8_SWITCHABLE_FILTERS*2-2] = {
353
354
  -0, -1,
};
355
356
struct vp8_token_struct vp9_switchable_interp_encodings[VP8_SWITCHABLE_FILTERS];
const vp8_prob vp9_switchable_interp_prob [VP8_SWITCHABLE_FILTERS+1]
357
358
359
360
361
                                          [VP8_SWITCHABLE_FILTERS-1] = {
  {248},
  { 64},
  {192},
};
362
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP8_SWITCHABLE_FILTERS] = {
363
  EIGHTTAP, EIGHTTAP_SHARP};
364
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1}; //8, 8s
365
#endif
John Koleszar's avatar
John Koleszar committed
366

367
void vp9_entropy_mode_init() {
368
369
370
  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
371
#if CONFIG_SUPERBLOCKS
372
  vp9_tokens_from_tree(vp9_sb_kf_ymode_encodings, vp8_sb_ymode_tree);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
373
#endif
374
375
376
377
378
379
380
381
  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
382
#if CONFIG_SUPERBLOCKS
383
384
  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
385
#endif
386
387
  vp9_tokens_from_tree_offset(vp9_sub_mv_ref_encoding_array,
                              vp9_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
388
}
Yaowu Xu's avatar
Yaowu Xu committed
389

390
void vp9_init_mode_contexts(VP8_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
391
392
  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));
393

John Koleszar's avatar
John Koleszar committed
394
  vpx_memcpy(pc->fc.mode_context,
395
             vp9_default_mode_contexts,
John Koleszar's avatar
John Koleszar committed
396
397
             sizeof(pc->fc.mode_context));
  vpx_memcpy(pc->fc.mode_context_a,
398
             vp9_default_mode_contexts_a,
John Koleszar's avatar
John Koleszar committed
399
             sizeof(pc->fc.mode_context_a));
400

Yaowu Xu's avatar
Yaowu Xu committed
401
402
}

403
void vp9_accum_mv_refs(VP8_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
404
                       MB_PREDICTION_MODE m,
John Koleszar's avatar
John Koleszar committed
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
                       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
429
        }
John Koleszar's avatar
John Koleszar committed
430
      }
Yaowu Xu's avatar
Yaowu Xu committed
431
    }
John Koleszar's avatar
John Koleszar committed
432
  }
Yaowu Xu's avatar
Yaowu Xu committed
433
434
}

435
#define MVREF_COUNT_SAT 20
Deb Mukherjee's avatar
Deb Mukherjee committed
436
#define MVREF_MAX_UPDATE_FACTOR 144
437
void vp9_update_mode_context(VP8_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
  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);
        this_prob = (pc->fc.vp8_mode_contexts[j][i] * (256 - factor) +
                     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
464
    }
John Koleszar's avatar
John Koleszar committed
465
  }
Yaowu Xu's avatar
Yaowu Xu committed
466
}
467

468
#ifdef MODE_STATS
Yaowu Xu's avatar
Yaowu Xu committed
469
#include "vp8/common/modecont.h"
John Koleszar's avatar
John Koleszar committed
470
471
472
473
474
475
void print_mode_contexts(VP8_COMMON *pc) {
  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
476
    }
John Koleszar's avatar
John Koleszar committed
477
478
479
480
481
482
    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]);
483
    }
John Koleszar's avatar
John Koleszar committed
484
485
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
486
}
487
#endif
488

John Koleszar's avatar
John Koleszar committed
489
// #define MODE_COUNT_TESTING
Deb Mukherjee's avatar
Deb Mukherjee committed
490
491
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
492
void vp9_adapt_mode_probs(VP8_COMMON *cm) {
John Koleszar's avatar
John Koleszar committed
493
494
495
496
497
498
499
500
  int i, t, count, factor;
  unsigned int branch_ct[32][2];
  vp8_prob ymode_probs[VP8_YMODES - 1];
  vp8_prob uvmode_probs[VP8_UV_MODES - 1];
  vp8_prob bmode_probs[VP8_BINTRAMODES - 1];
  vp8_prob i8x8_mode_probs[VP8_I8X8_MODES - 1];
  vp8_prob sub_mv_ref_probs[VP8_SUBMVREFS - 1];
  vp8_prob mbsplit_probs[VP8_NUMMBSPLITS - 1];
501
#ifdef MODE_COUNT_TESTING
John Koleszar's avatar
John Koleszar committed
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
  printf("static const unsigned int\nymode_counts"
         "[VP8_YMODES] = {\n");
  for (t = 0; t < VP8_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
         "[VP8_YMODES] [VP8_UV_MODES] = {\n");
  for (i = 0; i < VP8_YMODES; ++i) {
    printf("  {");
    for (t = 0; t < VP8_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
         "[VP8_BINTRAMODES] = {\n");
  for (t = 0; t < VP8_BINTRAMODES; ++t) printf("%d, ", cm->fc.bmode_counts[t]);
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
         "[VP8_I8X8_MODES] = {\n");
  for (t = 0; t < VP8_I8X8_MODES; ++t) printf("%d, ", cm->fc.i8x8_mode_counts[t]);
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
         "[SUBMVREF_COUNT] [VP8_SUBMVREFS] = {\n");
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
    for (t = 0; t < VP8_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
         "[VP8_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP8_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
  printf("};\n");
534
#endif
535
  vp9_tree_probs_from_distribution(
536
    VP8_YMODES, vp9_ymode_encodings, vp9_ymode_tree,
John Koleszar's avatar
John Koleszar committed
537
538
539
540
541
542
543
544
545
546
547
548
549
550
    ymode_probs, branch_ct, cm->fc.ymode_counts,
    256, 1);
  for (t = 0; t < VP8_YMODES - 1; ++t) {
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_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;
  }
  for (i = 0; i < VP8_YMODES; ++i) {
551
    vp9_tree_probs_from_distribution(
552
      VP8_UV_MODES, vp9_uv_mode_encodings, vp9_uv_mode_tree,
John Koleszar's avatar
John Koleszar committed
553
554
555
556
557
558
559
560
561
562
563
564
      uvmode_probs, branch_ct, cm->fc.uv_mode_counts[i],
      256, 1);
    for (t = 0; t < VP8_UV_MODES - 1; ++t) {
      int prob;
      count = branch_ct[t][0] + branch_ct[t][1];
      count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
      factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
      prob = ((int)cm->fc.pre_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;
565
    }
John Koleszar's avatar
John Koleszar committed
566
  }
567
  vp9_tree_probs_from_distribution(
568
    VP8_BINTRAMODES, vp9_bmode_encodings, vp9_bmode_tree,
John Koleszar's avatar
John Koleszar committed
569
570
571
572
573
574
575
576
577
578
579
580
581
    bmode_probs, branch_ct, cm->fc.bmode_counts,
    256, 1);
  for (t = 0; t < VP8_BINTRAMODES - 1; ++t) {
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_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;
  }
582
  vp9_tree_probs_from_distribution(
583
    VP8_I8X8_MODES, vp9_i8x8_mode_encodings, vp9_i8x8_mode_tree,
John Koleszar's avatar
John Koleszar committed
584
585
586
587
588
589
590
591
592
593
594
595
596
597
    i8x8_mode_probs, branch_ct, cm->fc.i8x8_mode_counts,
    256, 1);
  for (t = 0; t < VP8_I8X8_MODES - 1; ++t) {
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_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) {
598
    vp9_tree_probs_from_distribution(
599
      VP8_SUBMVREFS, vp9_sub_mv_ref_encoding_array, vp9_sub_mv_ref_tree,
John Koleszar's avatar
John Koleszar committed
600
601
602
603
604
605
606
607
608
609
610
611
      sub_mv_ref_probs, branch_ct, cm->fc.sub_mv_ref_counts[i],
      256, 1);
    for (t = 0; t < VP8_SUBMVREFS - 1; ++t) {
      int prob;
      count = branch_ct[t][0] + branch_ct[t][1];
      count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
      factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
      prob = ((int)cm->fc.pre_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;
612
    }
John Koleszar's avatar
John Koleszar committed
613
  }
614
  vp9_tree_probs_from_distribution(
615
    VP8_NUMMBSPLITS, vp9_mbsplit_encodings, vp9_mbsplit_tree,
John Koleszar's avatar
John Koleszar committed
616
617
618
619
620
621
622
623
624
625
626
627
628
    mbsplit_probs, branch_ct, cm->fc.mbsplit_counts,
    256, 1);
  for (t = 0; t < VP8_NUMMBSPLITS - 1; ++t) {
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_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;
  }
629
}