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

John Koleszar's avatar
John Koleszar committed
17
18
19
20
21
22
23
24
25
26
const unsigned int kf_y_mode_cts[8][VP8_YMODES] = {
  /* 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;

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

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

John Koleszar's avatar
John Koleszar committed
106
107
108
109
110
111
const vp8_prob vp8_sub_mv_ref_prob2 [SUBMVREF_COUNT][VP8_SUBMVREFS - 1] = {
  { 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
};



John Koleszar's avatar
John Koleszar committed
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
vp8_mbsplit vp8_mbsplits [VP8_NUMMBSPLITS] = {
  {
    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
144
};

const int vp8_mbsplit_count [VP8_NUMMBSPLITS] = { 2, 2, 4, 16};

John Koleszar's avatar
John Koleszar committed
145
const vp8_prob vp8_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. */

John Koleszar's avatar
John Koleszar committed
150
const vp8_tree_index vp8_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. */
John Koleszar's avatar
John Koleszar committed
165
166
167
168
169
170
171
172
173
174
175
176
const vp8_tree_index vp8_ymode_tree[VP8_YMODES * 2 - 2] = {
  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
};

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

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

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

John Koleszar's avatar
John Koleszar committed
217
const vp8_tree_index vp8_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
};

John Koleszar's avatar
John Koleszar committed
223
224
225
226
227
const vp8_tree_index vp8_mv_ref_tree[8] = {
  -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
231
232
233
234
235
236
237
#if CONFIG_SUPERBLOCKS
const vp8_tree_index vp8_sb_mv_ref_tree[6] = {
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};
#endif

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


struct vp8_token_struct vp8_bmode_encodings   [VP8_BINTRAMODES];
struct vp8_token_struct vp8_ymode_encodings   [VP8_YMODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
247
248
249
#if CONFIG_SUPERBLOCKS
struct vp8_token_struct vp8_sb_kf_ymode_encodings [VP8_I32X32_MODES];
#endif
John Koleszar's avatar
John Koleszar committed
250
251
struct vp8_token_struct vp8_kf_ymode_encodings [VP8_YMODES];
struct vp8_token_struct vp8_uv_mode_encodings  [VP8_UV_MODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
252
struct vp8_token_struct vp8_i8x8_mode_encodings  [VP8_I8X8_MODES];
John Koleszar's avatar
John Koleszar committed
253
254
255
struct vp8_token_struct vp8_mbsplit_encodings [VP8_NUMMBSPLITS];

struct vp8_token_struct vp8_mv_ref_encoding_array    [VP8_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
256
257
258
#if CONFIG_SUPERBLOCKS
struct vp8_token_struct vp8_sb_mv_ref_encoding_array  [VP8_MVREFS];
#endif
John Koleszar's avatar
John Koleszar committed
259
260
struct vp8_token_struct vp8_sub_mv_ref_encoding_array [VP8_SUBMVREFS];

261
262


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

Daniel Kang's avatar
Daniel Kang committed
266
267
  vp8_tree_probs_from_distribution(VP8_YMODES, vp8_ymode_encodings,
    vp8_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++) {
John Koleszar's avatar
John Koleszar committed
271
272
273
      vp8_tree_probs_from_distribution(
        VP8_YMODES, vp8_kf_ymode_encodings, vp8_kf_ymode_tree,
        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
276
277
278
279
280
281
#if CONFIG_SUPERBLOCKS
      vp8_tree_probs_from_distribution(
        VP8_I32X32_MODES, vp8_sb_kf_ymode_encodings, vp8_sb_ymode_tree,
        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
286
287
288
289
290
291
292
293
  }
  {
    int i;
    for (i = 0; i < VP8_YMODES; i++) {
      vp8_tree_probs_from_distribution(
        VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
        x->kf_uv_mode_prob[i], bct, kf_uv_mode_cts[i],
        256, 1);
      vp8_tree_probs_from_distribution(
        VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
        x->fc.uv_mode_prob[i], bct, uv_mode_cts[i],
        256, 1);
294
    }
John Koleszar's avatar
John Koleszar committed
295
  }
296

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

John Koleszar's avatar
John Koleszar committed
302
303
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp8_sub_mv_ref_prob2, sizeof(vp8_sub_mv_ref_prob2));
  vpx_memcpy(x->fc.mbsplit_prob, vp8_mbsplit_probs, sizeof(vp8_mbsplit_probs));
304
305
  vpx_memcpy(x->fc.switchable_interp_prob, vp8_switchable_interp_prob,
             sizeof(vp8_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
313
314
  const unsigned int events [VP8_BINTRAMODES]) {
  vp8_tree_probs_from_distribution(VP8_BINTRAMODES, vp8_bmode_encodings,
    vp8_bmode_tree, p, branch_ct, events, 256, 1);
John Koleszar's avatar
John Koleszar committed
315
316
}

John Koleszar's avatar
John Koleszar committed
317
318
319
void vp8_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES - 1]) {
  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
}

John Koleszar's avatar
John Koleszar committed
322
323
void vp8_kf_default_bmode_probs(vp8_prob p [VP8_BINTRAMODES] [VP8_BINTRAMODES] [VP8_BINTRAMODES - 1]) {
  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
332
    do {
      intra_bmode_probs_from_distribution(
        p[i][j], branch_ct, vp8_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
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
#if VP8_SWITCHABLE_FILTERS == 3
const vp8_tree_index vp8_switchable_interp_tree[VP8_SWITCHABLE_FILTERS*2-2] = {
  -0, 2,
  -1, -2
};
struct vp8_token_struct vp8_switchable_interp_encodings[VP8_SWITCHABLE_FILTERS];
const INTERPOLATIONFILTERTYPE vp8_switchable_interp[VP8_SWITCHABLE_FILTERS] = {
  EIGHTTAP, SIXTAP, EIGHTTAP_SHARP};
const int vp8_switchable_interp_map[SWITCHABLE+1] = {1, -1, 0, 2, -1};
const vp8_prob vp8_switchable_interp_prob [VP8_SWITCHABLE_FILTERS+1]
                                          [VP8_SWITCHABLE_FILTERS-1] = {
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
#elif VP8_SWITCHABLE_FILTERS == 2
const vp8_tree_index vp8_switchable_interp_tree[VP8_SWITCHABLE_FILTERS*2-2] = {
  -0, -1,
};
struct vp8_token_struct vp8_switchable_interp_encodings[VP8_SWITCHABLE_FILTERS];
const vp8_prob vp8_switchable_interp_prob [VP8_SWITCHABLE_FILTERS+1]
                                          [VP8_SWITCHABLE_FILTERS-1] = {
  {248},
  { 64},
  {192},
};
const INTERPOLATIONFILTERTYPE vp8_switchable_interp[VP8_SWITCHABLE_FILTERS] = {
  EIGHTTAP, EIGHTTAP_SHARP};
const int vp8_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1}; //8, 8s
#endif
John Koleszar's avatar
John Koleszar committed
366

John Koleszar's avatar
John Koleszar committed
367
368
369
370
void vp8_entropy_mode_init() {
  vp8_tokens_from_tree(vp8_bmode_encodings,   vp8_bmode_tree);
  vp8_tokens_from_tree(vp8_ymode_encodings,   vp8_ymode_tree);
  vp8_tokens_from_tree(vp8_kf_ymode_encodings, vp8_kf_ymode_tree);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
371
372
373
#if CONFIG_SUPERBLOCKS
  vp8_tokens_from_tree(vp8_sb_kf_ymode_encodings, vp8_sb_ymode_tree);
#endif
John Koleszar's avatar
John Koleszar committed
374
375
376
  vp8_tokens_from_tree(vp8_uv_mode_encodings,  vp8_uv_mode_tree);
  vp8_tokens_from_tree(vp8_i8x8_mode_encodings,  vp8_i8x8_mode_tree);
  vp8_tokens_from_tree(vp8_mbsplit_encodings, vp8_mbsplit_tree);
377
378
  vp8_tokens_from_tree(vp8_switchable_interp_encodings,
                       vp8_switchable_interp_tree);
John Koleszar's avatar
John Koleszar committed
379
380
381

  vp8_tokens_from_tree_offset(vp8_mv_ref_encoding_array,
                              vp8_mv_ref_tree, NEARESTMV);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
382
383
384
385
#if CONFIG_SUPERBLOCKS
  vp8_tokens_from_tree_offset(vp8_sb_mv_ref_encoding_array,
                              vp8_sb_mv_ref_tree, NEARESTMV);
#endif
John Koleszar's avatar
John Koleszar committed
386
387
  vp8_tokens_from_tree_offset(vp8_sub_mv_ref_encoding_array,
                              vp8_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
388
}
Yaowu Xu's avatar
Yaowu Xu committed
389

John Koleszar's avatar
John Koleszar committed
390
391
392
void vp8_init_mode_contexts(VP8_COMMON *pc) {
  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
395
396
397
398
399
  vpx_memcpy(pc->fc.mode_context,
             default_vp8_mode_contexts,
             sizeof(pc->fc.mode_context));
  vpx_memcpy(pc->fc.mode_context_a,
             default_vp8_mode_contexts,
             sizeof(pc->fc.mode_context_a));
400

Yaowu Xu's avatar
Yaowu Xu committed
401
402
403
404
}

void vp8_accum_mv_refs(VP8_COMMON *pc,
                       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
John Koleszar's avatar
John Koleszar committed
437
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
void vp8_update_mode_context(VP8_COMMON *pc) {
  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
John Koleszar's avatar
John Koleszar committed
492
493
494
495
496
497
498
499
500
void vp8_adapt_mode_probs(VP8_COMMON *cm) {
  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
John Koleszar's avatar
John Koleszar committed
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
  vp8_tree_probs_from_distribution(
    VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
    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
    vp8_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
552
553
554
555
556
557
558
559
560
561
562
563
564
      VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
      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
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
  }
  vp8_tree_probs_from_distribution(
    VP8_BINTRAMODES, vp8_bmode_encodings, vp8_bmode_tree,
    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;
  }
  vp8_tree_probs_from_distribution(
    VP8_I8X8_MODES, vp8_i8x8_mode_encodings, vp8_i8x8_mode_tree,
    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
    vp8_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
599
600
601
602
603
604
605
606
607
608
609
610
611
      VP8_SUBMVREFS, vp8_sub_mv_ref_encoding_array, vp8_sub_mv_ref_tree,
      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
615
616
617
618
619
620
621
622
623
624
625
626
627
628
  }
  vp8_tree_probs_from_distribution(
    VP8_NUMMBSPLITS, vp8_mbsplit_encodings, vp8_mbsplit_tree,
    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
}