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;

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
}

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


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
  vp9_tree_probs_from_distribution(VP8_YMODES, vp8_ymode_encodings,
Daniel Kang's avatar
Daniel Kang committed
267
    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++) {
271
      vp9_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
272
273
        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
#if CONFIG_SUPERBLOCKS
276
      vp9_tree_probs_from_distribution(
Ronald S. Bultje's avatar
Ronald S. Bultje committed
277
278
279
280
281
        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
  }
  {
    int i;
    for (i = 0; i < VP8_YMODES; i++) {
286
      vp9_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
287
288
289
        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);
290
      vp9_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
291
292
293
        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

297
  vp9_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
298
299
300
    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
  const unsigned int events [VP8_BINTRAMODES]) {
313
  vp9_tree_probs_from_distribution(VP8_BINTRAMODES, vp8_bmode_encodings,
Daniel Kang's avatar
Daniel Kang committed
314
    vp8_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
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

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

380
  vp9_tokens_from_tree_offset(vp8_mv_ref_encoding_array,
John Koleszar's avatar
John Koleszar committed
381
                              vp8_mv_ref_tree, NEARESTMV);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
382
#if CONFIG_SUPERBLOCKS
383
  vp9_tokens_from_tree_offset(vp8_sb_mv_ref_encoding_array,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
384
385
                              vp8_sb_mv_ref_tree, NEARESTMV);
#endif
386
  vp9_tokens_from_tree_offset(vp8_sub_mv_ref_encoding_array,
John Koleszar's avatar
John Koleszar committed
387
                              vp8_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
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
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(
John Koleszar's avatar
John Koleszar committed
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
    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
    vp9_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
  vp9_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
568
569
570
571
572
573
574
575
576
577
578
579
580
581
    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;
  }
582
  vp9_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
    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
    vp9_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
  vp9_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
615
616
617
618
619
620
621
622
623
624
625
626
627
628
    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
}