entropymode.c 20 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 "modecont.h"
John Koleszar's avatar
John Koleszar committed
13
#include "entropymode.h"
14
#include "entropymv.h"
John Koleszar's avatar
John Koleszar committed
15
16
#include "entropy.h"
#include "vpx_mem/vpx_mem.h"
17

18

John Koleszar's avatar
John Koleszar committed
19
const unsigned int kf_y_mode_cts[8][VP8_YMODES] = {
20
#if CONFIG_NEWINTRAMODES
John Koleszar's avatar
John Koleszar committed
21
22
23
24
25
26
27
28
29
  /* 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},
30
#else
John Koleszar's avatar
John Koleszar committed
31
32
33
34
35
36
37
38
  {17,  6,  5,  2, 22, 203},
  {27, 13, 13,  6, 27, 170},
  {35, 17, 18,  9, 26, 152},
  {45, 22, 24, 12, 27, 126},
  {58, 26, 29, 13, 26, 104},
  {73, 33, 36, 17, 20,  78},
  {88, 38, 39, 19, 16,  57},
  {99, 42, 43, 21, 12,  39},
39
#endif
40
};
41

42
43
static const unsigned int y_mode_cts  [VP8_YMODES] =
#if CONFIG_NEWINTRAMODES
John Koleszar's avatar
John Koleszar committed
44
45
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 BPRED */
{98, 19, 15, 14, 14, 14, 14, 12, 12, 13, 16, 70};
46
#else
John Koleszar's avatar
John Koleszar committed
47
48
49
  {
    106, 25, 21, 13, 16, 74
  };
50
#endif
51

John Koleszar's avatar
John Koleszar committed
52
static const unsigned int uv_mode_cts [VP8_YMODES] [VP8_UV_MODES] = {
53
#if CONFIG_NEWINTRAMODES
John Koleszar's avatar
John Koleszar committed
54
55
56
57
58
59
60
61
62
63
64
65
66
  /* 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 */
67
#else
John Koleszar's avatar
John Koleszar committed
68
69
70
71
72
73
  { 210, 20, 20,  6},
  { 180, 60, 10,  6},
  { 150, 20, 80,  6},
  { 170, 35, 35, 16},
  { 142, 51, 45, 18}, /* never used */
  { 160, 40, 46, 10},
74
#endif
75
76
};

77
78
static const unsigned int i8x8_mode_cts  [VP8_I8X8_MODES] =
#if CONFIG_NEWINTRAMODES
John Koleszar's avatar
John Koleszar committed
79
80
  /* DC V   H D45 135 117 153 D27 D63  TM */
{73, 49, 61, 30, 30, 30, 30, 30, 30, 13};
81
#else
John Koleszar's avatar
John Koleszar committed
82
83
84
  {
    93, 69, 81, 13
  };
85
#endif
86

John Koleszar's avatar
John Koleszar committed
87
static const unsigned int kf_uv_mode_cts [VP8_YMODES] [VP8_UV_MODES] = {
88
#if CONFIG_NEWINTRAMODES
John Koleszar's avatar
John Koleszar committed
89
90
91
92
93
94
95
96
97
98
99
100
101
  // 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 */
102
#else
John Koleszar's avatar
John Koleszar committed
103
104
105
106
107
108
  { 180, 34, 34,  8},
  { 132, 74, 40, 10},
  { 132, 40, 74, 10},
  { 152, 46, 40, 18},
  { 142, 51, 45, 18}, /* never used */
  { 142, 51, 45, 18},
109
#endif
110
};
John Koleszar's avatar
John Koleszar committed
111

John Koleszar's avatar
John Koleszar committed
112
113
114
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
115
116
};

John Koleszar's avatar
John Koleszar committed
117
118
119
120
121
122
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
123
124
} sumvfref_t;

John Koleszar's avatar
John Koleszar committed
125
126
127
128
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
129

John Koleszar's avatar
John Koleszar committed
130
131
  if (lea && lez)
    return SUBMVREF_LEFT_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
132

John Koleszar's avatar
John Koleszar committed
133
134
  if (lea)
    return SUBMVREF_LEFT_ABOVE_SAME;
John Koleszar's avatar
John Koleszar committed
135

John Koleszar's avatar
John Koleszar committed
136
137
  if (aez)
    return SUBMVREF_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
138

John Koleszar's avatar
John Koleszar committed
139
140
  if (lez)
    return SUBMVREF_LEFT_ZED;
John Koleszar's avatar
John Koleszar committed
141

John Koleszar's avatar
John Koleszar committed
142
  return SUBMVREF_NORMAL;
John Koleszar's avatar
John Koleszar committed
143
144
}

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

John Koleszar's avatar
John Koleszar committed
147
148
149
150
151
152
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
153
154
155
156
};



John Koleszar's avatar
John Koleszar committed
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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
182
183
184
185
};

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

John Koleszar's avatar
John Koleszar committed
186
const vp8_prob vp8_mbsplit_probs [VP8_NUMMBSPLITS - 1] = { 110, 111, 150};
John Koleszar's avatar
John Koleszar committed
187
188
189
190


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

John Koleszar's avatar
John Koleszar committed
191
const vp8_tree_index vp8_bmode_tree[VP8_BINTRAMODES * 2 - 2] = /* INTRAMODECONTEXTNODE value */
John Koleszar's avatar
John Koleszar committed
192
{
John Koleszar's avatar
John Koleszar committed
193
194
195
196
197
198
199
200
201
  -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
202
203
};

204
205
206
#if CONFIG_NEWINTRAMODES
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
John Koleszar's avatar
John Koleszar committed
207
208
209
210
211
212
213
214
215
216
217
218
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
219
220
};

John Koleszar's avatar
John Koleszar committed
221
222
223
224
225
226
227
228
229
230
231
232
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
233
234
};

John Koleszar's avatar
John Koleszar committed
235
236
237
238
239
240
241
242
243
244
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
245
246
};

John Koleszar's avatar
John Koleszar committed
247
248
249
250
251
252
253
254
255
256
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
257
258
259
260
};

#else  /* CONFIG_NEWINTRAMODES */

John Koleszar's avatar
John Koleszar committed
261
262
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
John Koleszar's avatar
John Koleszar committed
263
264
265
266
267
268
const vp8_tree_index vp8_ymode_tree[10] = {
  -DC_PRED, 2,
  4, 6,
  -V_PRED, -H_PRED,
  -TM_PRED, 8,
  -B_PRED, -I8X8_PRED
John Koleszar's avatar
John Koleszar committed
269
270
};

John Koleszar's avatar
John Koleszar committed
271
272
273
274
275
276
const vp8_tree_index vp8_kf_ymode_tree[10] = {
  -B_PRED, 2,
  4, 6,
  -DC_PRED, -V_PRED,
  -H_PRED, 8,
  -TM_PRED, -I8X8_PRED
Yaowu Xu's avatar
Yaowu Xu committed
277
278
};

John Koleszar's avatar
John Koleszar committed
279
280
281
282
const vp8_tree_index vp8_i8x8_mode_tree[6] = {
  -DC_PRED, 2,
  -V_PRED, 4,
  -H_PRED, -TM_PRED
John Koleszar's avatar
John Koleszar committed
283
};
John Koleszar's avatar
John Koleszar committed
284
285
286
287
const vp8_tree_index vp8_uv_mode_tree[6] = {
  -DC_PRED, 2,
  -V_PRED, 4,
  -H_PRED, -TM_PRED
John Koleszar's avatar
John Koleszar committed
288
289
};

290
291
#endif  /* CONFIG_NEWINTRAMODES */

John Koleszar's avatar
John Koleszar committed
292
293
294
295
const vp8_tree_index vp8_mbsplit_tree[6] = {
  -3, 2,
  -2, 4,
  -0, -1
John Koleszar's avatar
John Koleszar committed
296
297
};

John Koleszar's avatar
John Koleszar committed
298
299
300
301
302
const vp8_tree_index vp8_mv_ref_tree[8] = {
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, 6,
  -NEWMV, -SPLITMV
John Koleszar's avatar
John Koleszar committed
303
304
};

John Koleszar's avatar
John Koleszar committed
305
306
307
308
const vp8_tree_index vp8_sub_mv_ref_tree[6] = {
  -LEFT4X4, 2,
  -ABOVE4X4, 4,
  -ZERO4X4, -NEW4X4
John Koleszar's avatar
John Koleszar committed
309
310
311
312
313
314
315
};


struct vp8_token_struct vp8_bmode_encodings   [VP8_BINTRAMODES];
struct vp8_token_struct vp8_ymode_encodings   [VP8_YMODES];
struct vp8_token_struct vp8_kf_ymode_encodings [VP8_YMODES];
struct vp8_token_struct vp8_uv_mode_encodings  [VP8_UV_MODES];
Yaowu Xu's avatar
Yaowu Xu committed
316
struct vp8_token_struct vp8_i8x8_mode_encodings  [VP8_UV_MODES];
John Koleszar's avatar
John Koleszar committed
317
318
319
320
321
struct vp8_token_struct vp8_mbsplit_encodings [VP8_NUMMBSPLITS];

struct vp8_token_struct vp8_mv_ref_encoding_array    [VP8_MVREFS];
struct vp8_token_struct vp8_sub_mv_ref_encoding_array [VP8_SUBMVREFS];

322
323


John Koleszar's avatar
John Koleszar committed
324
325
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
326

John Koleszar's avatar
John Koleszar committed
327
328
329
330
331
332
333
334
335
336
337
  vp8_tree_probs_from_distribution(
    VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
    x->fc.ymode_prob, bct, y_mode_cts,
    256, 1
  );
  {
    int i;
    for (i = 0; i < 8; i++)
      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],
John Koleszar's avatar
John Koleszar committed
338
        256, 1
John Koleszar's avatar
John Koleszar committed
339
340
341
342
343
344
345
346
347
348
349
350
351
      );
  }
  {
    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);
352
    }
John Koleszar's avatar
John Koleszar committed
353
  }
354

John Koleszar's avatar
John Koleszar committed
355
356
357
358
  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);
359

John Koleszar's avatar
John Koleszar committed
360
361
  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));
Yaowu Xu's avatar
Yaowu Xu committed
362

John Koleszar's avatar
John Koleszar committed
363
364
365
366
}


static void intra_bmode_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
367
368
369
370
371
372
373
374
375
  vp8_prob p [VP8_BINTRAMODES - 1],
  unsigned int branch_ct [VP8_BINTRAMODES - 1] [2],
  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
376
377
}

John Koleszar's avatar
John Koleszar committed
378
379
380
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
381
382
}

John Koleszar's avatar
John Koleszar committed
383
384
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
385

John Koleszar's avatar
John Koleszar committed
386
  int i = 0;
John Koleszar's avatar
John Koleszar committed
387

John Koleszar's avatar
John Koleszar committed
388
389
  do {
    int j = 0;
John Koleszar's avatar
John Koleszar committed
390

John Koleszar's avatar
John Koleszar committed
391
392
393
    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
394

John Koleszar's avatar
John Koleszar committed
395
396
    } while (++j < VP8_BINTRAMODES);
  } while (++i < VP8_BINTRAMODES);
John Koleszar's avatar
John Koleszar committed
397
398
399
}


John Koleszar's avatar
John Koleszar committed
400
401
402
403
404
405
406
407
408
409
410
411
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);
  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);

  vp8_tokens_from_tree_offset(vp8_mv_ref_encoding_array,
                              vp8_mv_ref_tree, NEARESTMV);
  vp8_tokens_from_tree_offset(vp8_sub_mv_ref_encoding_array,
                              vp8_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
412
}
Yaowu Xu's avatar
Yaowu Xu committed
413

John Koleszar's avatar
John Koleszar committed
414
415
416
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));
417

John Koleszar's avatar
John Koleszar committed
418
419
420
421
422
423
  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));
424

Yaowu Xu's avatar
Yaowu Xu committed
425
426
427
428
}

void vp8_accum_mv_refs(VP8_COMMON *pc,
                       MB_PREDICTION_MODE m,
John Koleszar's avatar
John Koleszar committed
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
                       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
453
        }
John Koleszar's avatar
John Koleszar committed
454
      }
Yaowu Xu's avatar
Yaowu Xu committed
455
    }
John Koleszar's avatar
John Koleszar committed
456
  }
Yaowu Xu's avatar
Yaowu Xu committed
457
458
}

459
460
#define MVREF_COUNT_SAT 20
#define MVREF_MAX_UPDATE_FACTOR 128
John Koleszar's avatar
John Koleszar committed
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
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];
478
#if CONFIG_ADAPTIVE_ENTROPY
John Koleszar's avatar
John Koleszar committed
479
480
481
482
483
484
485
486
487
488
      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;
      }
489
#else
John Koleszar's avatar
John Koleszar committed
490
491
492
493
494
495
      /* preventing rare occurances from skewing the probs */
      if (count >= 4) {
        this_prob = 256 * mv_ref_ct[j][i][0] / count;
        this_prob = this_prob ? (this_prob < 255 ? this_prob : 255) : 1;
        mode_context[j][i] = this_prob;
      }
496
#endif
Yaowu Xu's avatar
Yaowu Xu committed
497
    }
John Koleszar's avatar
John Koleszar committed
498
  }
Yaowu Xu's avatar
Yaowu Xu committed
499
}
500

Yaowu Xu's avatar
Yaowu Xu committed
501
#include "vp8/common/modecont.h"
John Koleszar's avatar
John Koleszar committed
502
503
504
505
506
507
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
508
    }
John Koleszar's avatar
John Koleszar committed
509
510
511
512
513
514
    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]);
515
    }
John Koleszar's avatar
John Koleszar committed
516
517
    printf("\n");
  }
518

Yaowu Xu's avatar
Yaowu Xu committed
519
}
John Koleszar's avatar
John Koleszar committed
520
521
522
523
524
525
526
void print_mv_ref_cts(VP8_COMMON *pc) {
  int j, i;
  for (j = 0; j < 6; j++) {
    for (i = 0; i < 4; i++) {
      printf("(%4d:%4d) ",
             pc->fc.mv_ref_ct[j][i][0],
             pc->fc.mv_ref_ct[j][i][1]);
Yaowu Xu's avatar
Yaowu Xu committed
527
    }
John Koleszar's avatar
John Koleszar committed
528
529
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
530
}
531
532

#if CONFIG_ADAPTIVE_ENTROPY
John Koleszar's avatar
John Koleszar committed
533
// #define MODE_COUNT_TESTING
534
#define MODE_COUNT_SAT 16
535
#define MODE_MAX_UPDATE_FACTOR 128
John Koleszar's avatar
John Koleszar committed
536
537
538
539
540
541
542
543
544
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];
545
#ifdef MODE_COUNT_TESTING
John Koleszar's avatar
John Koleszar committed
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
  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");
578
#endif
John Koleszar's avatar
John Koleszar committed
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
  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) {
595
    vp8_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
596
597
598
599
600
601
602
603
604
605
606
607
608
      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;
609
    }
John Koleszar's avatar
John Koleszar committed
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
  }
  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) {
642
    vp8_tree_probs_from_distribution(
John Koleszar's avatar
John Koleszar committed
643
644
645
646
647
648
649
650
651
652
653
654
655
      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;
656
    }
John Koleszar's avatar
John Koleszar committed
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
  }
  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;
  }
673
674
}
#endif