vp9_entropymode.c 21.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
13
#include "vp9/common/vp9_onyxc_int.h"
#include "vp9/common/vp9_modecont.h"
14
15
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_alloccommon.h"
John Koleszar's avatar
John Koleszar committed
16
#include "vpx_mem/vpx_mem.h"
17

18
19
static const vp9_prob default_kf_uv_probs[VP9_INTRA_MODES]
                                         [VP9_INTRA_MODES - 1] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
20
21
22
23
24
25
26
27
28
29
  { 144,  11,  54, 157, 195, 130,  46,  58, 108 } /* y = dc */,
  { 118,  15, 123, 148, 131, 101,  44,  93, 131 } /* y = v */,
  { 113,  12,  23, 188, 226, 142,  26,  32, 125 } /* y = h */,
  { 120,  11,  50, 123, 163, 135,  64,  77, 103 } /* y = d45 */,
  { 113,   9,  36, 155, 111, 157,  32,  44, 161 } /* y = d135 */,
  { 116,   9,  55, 176,  76,  96,  37,  61, 149 } /* y = d117 */,
  { 115,   9,  28, 141, 161, 167,  21,  25, 193 } /* y = d153 */,
  { 120,  12,  32, 145, 195, 142,  32,  38,  86 } /* y = d27 */,
  { 116,  12,  64, 120, 140, 125,  49, 115, 121 } /* y = d63 */,
  { 102,  19,  66, 162, 182, 122,  35,  59, 128 } /* y = tm */
30
};
31

32
33
static const vp9_prob default_if_y_probs[BLOCK_SIZE_GROUPS]
                                        [VP9_INTRA_MODES - 1] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
34
35
36
37
  {  65,  32,  18, 144, 162, 194,  41,  51,  98 } /* block_size < 8x8 */,
  { 132,  68,  18, 165, 217, 196,  45,  40,  78 } /* block_size < 16x16 */,
  { 173,  80,  19, 176, 240, 193,  64,  35,  46 } /* block_size < 32x32 */,
  { 221, 135,  38, 194, 248, 121,  96,  85,  29 } /* block_size >= 32x32 */
38
39
};

40
41
static const vp9_prob default_if_uv_probs[VP9_INTRA_MODES]
                                         [VP9_INTRA_MODES - 1] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
42
43
44
45
46
47
48
49
50
51
  { 120,   7,  76, 176, 208, 126,  28,  54, 103 } /* y = dc */,
  {  48,  12, 154, 155, 139,  90,  34, 117, 119 } /* y = v */,
  {  67,   6,  25, 204, 243, 158,  13,  21,  96 } /* y = h */,
  {  97,   5,  44, 131, 176, 139,  48,  68,  97 } /* y = d45 */,
  {  83,   5,  42, 156, 111, 152,  26,  49, 152 } /* y = d135 */,
  {  80,   5,  58, 178,  74,  83,  33,  62, 145 } /* y = d117 */,
  {  86,   5,  32, 154, 192, 168,  14,  22, 163 } /* y = d153 */,
  {  85,   5,  32, 156, 216, 148,  19,  29,  73 } /* y = d27 */,
  {  77,   7,  64, 116, 132, 122,  37, 126, 120 } /* y = d63 */,
  { 101,  21, 107, 181, 192, 103,  19,  67, 125 } /* y = tm */
John Koleszar's avatar
John Koleszar committed
52
53
};

54
const vp9_prob vp9_partition_probs[NUM_FRAME_TYPES][NUM_PARTITION_CONTEXTS]
55
                                  [PARTITION_TYPES - 1] = {
56
57
  { /* frame_type = keyframe */
    /* 8x8 -> 4x4 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
58
59
60
61
    { 158,  97,  94 } /* a/l both not split */,
    {  93,  24,  99 } /* a split, l not split */,
    {  85, 119,  44 } /* l split, a not split */,
    {  62,  59,  67 } /* a/l both split */,
62
    /* 16x16 -> 8x8 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
63
64
65
66
    { 149,  53,  53 } /* a/l both not split */,
    {  94,  20,  48 } /* a split, l not split */,
    {  83,  53,  24 } /* l split, a not split */,
    {  52,  18,  18 } /* a/l both split */,
67
    /* 32x32 -> 16x16 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
68
69
70
71
    { 150,  40,  39 } /* a/l both not split */,
    {  78,  12,  26 } /* a split, l not split */,
    {  67,  33,  11 } /* l split, a not split */,
    {  24,   7,   5 } /* a/l both split */,
72
    /* 64x64 -> 32x32 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
73
74
75
76
    { 174,  35,  49 } /* a/l both not split */,
    {  68,  11,  27 } /* a split, l not split */,
    {  57,  15,   9 } /* l split, a not split */,
    {  12,   3,   3 } /* a/l both split */
77
78
  }, { /* frame_type = interframe */
    /* 8x8 -> 4x4 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
79
80
81
82
    { 199, 122, 141 } /* a/l both not split */,
    { 147,  63, 159 } /* a split, l not split */,
    { 148, 133, 118 } /* l split, a not split */,
    { 121, 104, 114 } /* a/l both split */,
83
    /* 16x16 -> 8x8 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
84
85
86
87
    { 174,  73,  87 } /* a/l both not split */,
    {  92,  41,  83 } /* a split, l not split */,
    {  82,  99,  50 } /* l split, a not split */,
    {  53,  39,  39 } /* a/l both split */,
88
    /* 32x32 -> 16x16 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
89
90
91
92
    { 177,  58,  59 } /* a/l both not split */,
    {  68,  26,  63 } /* a split, l not split */,
    {  52,  79,  25 } /* l split, a not split */,
    {  17,  14,  12 } /* a/l both split */,
93
    /* 64x64 -> 32x32 */
Ronald S. Bultje's avatar
Ronald S. Bultje committed
94
95
96
97
    { 222,  34,  30 } /* a/l both not split */,
    {  72,  16,  44 } /* a split, l not split */,
    {  58,  32,  12 } /* l split, a not split */,
    {  10,   7,   6 } /* a/l both split */
98
  }
99
100
};

John Koleszar's avatar
John Koleszar committed
101
/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */
102
const vp9_tree_index vp9_intra_mode_tree[VP9_INTRA_MODES * 2 - 2] = {
Yaowu Xu's avatar
Yaowu Xu committed
103
104
105
106
107
108
109
110
111
  -DC_PRED, 2,                      /* 0 = DC_NODE */
  -TM_PRED, 4,                      /* 1 = TM_NODE */
  -V_PRED, 6,                       /* 2 = V_NODE */
  8, 12,                            /* 3 = COM_NODE */
  -H_PRED, 10,                      /* 4 = H_NODE */
  -D135_PRED, -D117_PRED,           /* 5 = D135_NODE */
  -D45_PRED, 14,                    /* 6 = D45_NODE */
  -D63_PRED, 16,                    /* 7 = D63_NODE */
  -D153_PRED, -D27_PRED             /* 8 = D153_NODE */
John Koleszar's avatar
John Koleszar committed
112
113
};

114
const vp9_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
115
116
117
118
119
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};

120
121
122
123
124
125
const vp9_tree_index vp9_partition_tree[6] = {
  -PARTITION_NONE, 2,
  -PARTITION_HORZ, 4,
  -PARTITION_VERT, -PARTITION_SPLIT
};

126
struct vp9_token vp9_intra_mode_encodings[VP9_INTRA_MODES];
127

128
struct vp9_token vp9_sb_mv_ref_encoding_array[VP9_INTER_MODES];
John Koleszar's avatar
John Koleszar committed
129

130
131
struct vp9_token vp9_partition_encodings[PARTITION_TYPES];

Ronald S. Bultje's avatar
Ronald S. Bultje committed
132
static const vp9_prob default_intra_inter_p[INTRA_INTER_CONTEXTS] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
133
  9, 102, 187, 225
Ronald S. Bultje's avatar
Ronald S. Bultje committed
134
135
136
};

static const vp9_prob default_comp_inter_p[COMP_INTER_CONTEXTS] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
137
  239, 183, 119,  96,  41
Ronald S. Bultje's avatar
Ronald S. Bultje committed
138
139
140
};

static const vp9_prob default_comp_ref_p[REF_CONTEXTS] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
141
  50, 126, 123, 221, 226
Ronald S. Bultje's avatar
Ronald S. Bultje committed
142
143
144
};

static const vp9_prob default_single_ref_p[REF_CONTEXTS][2] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
145
146
147
148
149
  {  33,  16 },
  {  77,  74 },
  { 142, 142 },
  { 172, 170 },
  { 238, 247 }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
150
151
};

152
153
#if TX_SIZE_CONTEXTS == 2
const vp9_prob vp9_default_tx_probs_32x32p[TX_SIZE_CONTEXTS]
154
                                          [TX_SIZE_MAX_SB - 1] = {
155
156
  { 16, 32, 64, },
  { 16, 32, 64, },
157
};
158
const vp9_prob vp9_default_tx_probs_16x16p[TX_SIZE_CONTEXTS]
159
                                          [TX_SIZE_MAX_SB - 2] = {
160
161
  { 32, 64, },
  { 32, 64, },
162
};
163
const vp9_prob vp9_default_tx_probs_8x8p[TX_SIZE_CONTEXTS]
164
                                        [TX_SIZE_MAX_SB - 3] = {
165
166
  { 64, },
  { 64, },
167
};
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#else
const vp9_prob vp9_default_tx_probs_32x32p[TX_SIZE_CONTEXTS]
                                          [TX_SIZE_MAX_SB - 1] = {
  { 16, 32, 64, },
};
const vp9_prob vp9_default_tx_probs_16x16p[TX_SIZE_CONTEXTS]
                                          [TX_SIZE_MAX_SB - 2] = {
  { 32, 64, },
};
const vp9_prob vp9_default_tx_probs_8x8p[TX_SIZE_CONTEXTS]
                                        [TX_SIZE_MAX_SB - 3] = {
  { 64, },
};
#endif
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209

void tx_counts_to_branch_counts_32x32(unsigned int *tx_count_32x32p,
                                      unsigned int (*ct_32x32p)[2]) {
  ct_32x32p[0][0] = tx_count_32x32p[TX_4X4];
  ct_32x32p[0][1] = tx_count_32x32p[TX_8X8] +
                    tx_count_32x32p[TX_16X16] +
                    tx_count_32x32p[TX_32X32];
  ct_32x32p[1][0] = tx_count_32x32p[TX_8X8];
  ct_32x32p[1][1] = tx_count_32x32p[TX_16X16] +
                    tx_count_32x32p[TX_32X32];
  ct_32x32p[2][0] = tx_count_32x32p[TX_16X16];
  ct_32x32p[2][1] = tx_count_32x32p[TX_32X32];
}

void tx_counts_to_branch_counts_16x16(unsigned int *tx_count_16x16p,
                                      unsigned int (*ct_16x16p)[2]) {
  ct_16x16p[0][0] = tx_count_16x16p[TX_4X4];
  ct_16x16p[0][1] = tx_count_16x16p[TX_8X8] +
                    tx_count_16x16p[TX_16X16];
  ct_16x16p[1][0] = tx_count_16x16p[TX_8X8];
  ct_16x16p[1][1] = tx_count_16x16p[TX_16X16];
}

void tx_counts_to_branch_counts_8x8(unsigned int *tx_count_8x8p,
                                    unsigned int (*ct_8x8p)[2]) {
  ct_8x8p[0][0] =   tx_count_8x8p[TX_4X4];
  ct_8x8p[0][1] =   tx_count_8x8p[TX_8X8];
}
210

Deb Mukherjee's avatar
Deb Mukherjee committed
211
212
213
214
const vp9_prob vp9_default_mbskip_probs[MBSKIP_CONTEXTS] = {
  192, 128, 64
};

215
void vp9_init_mbmode_probs(VP9_COMMON *x) {
216
217
218
219
220
221
  vpx_memcpy(x->fc.uv_mode_prob, default_if_uv_probs,
             sizeof(default_if_uv_probs));
  vpx_memcpy(x->kf_uv_mode_prob, default_kf_uv_probs,
             sizeof(default_kf_uv_probs));
  vpx_memcpy(x->fc.y_mode_prob, default_if_y_probs,
             sizeof(default_if_y_probs));
222

223
224
  vpx_memcpy(x->fc.switchable_interp_prob, vp9_switchable_interp_prob,
             sizeof(vp9_switchable_interp_prob));
225
226
227
228

  vpx_memcpy(x->fc.partition_prob, vp9_partition_probs,
             sizeof(vp9_partition_probs));

Ronald S. Bultje's avatar
Ronald S. Bultje committed
229
230
231
232
233
234
235
236
  vpx_memcpy(x->fc.intra_inter_prob, default_intra_inter_p,
             sizeof(default_intra_inter_p));
  vpx_memcpy(x->fc.comp_inter_prob, default_comp_inter_p,
             sizeof(default_comp_inter_p));
  vpx_memcpy(x->fc.comp_ref_prob, default_comp_ref_p,
             sizeof(default_comp_ref_p));
  vpx_memcpy(x->fc.single_ref_prob, default_single_ref_p,
             sizeof(default_single_ref_p));
237
238
239
240
241
242
  vpx_memcpy(x->fc.tx_probs_32x32p, vp9_default_tx_probs_32x32p,
             sizeof(vp9_default_tx_probs_32x32p));
  vpx_memcpy(x->fc.tx_probs_16x16p, vp9_default_tx_probs_16x16p,
             sizeof(vp9_default_tx_probs_16x16p));
  vpx_memcpy(x->fc.tx_probs_8x8p, vp9_default_tx_probs_8x8p,
             sizeof(vp9_default_tx_probs_8x8p));
Deb Mukherjee's avatar
Deb Mukherjee committed
243
244
  vpx_memcpy(x->fc.mbskip_probs, vp9_default_mbskip_probs,
             sizeof(vp9_default_mbskip_probs));
John Koleszar's avatar
John Koleszar committed
245
246
}

247
248
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
249
250
251
  -0, 2,
  -1, -2
};
252
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
253
254
255
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
  EIGHTTAP, EIGHTTAP_SMOOTH, EIGHTTAP_SHARP};
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, 0, 2, -1, -1};
256
257
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
258
259
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
260
261
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
262
263
  -0, -1,
};
264
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
265
266
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
267
268
269
270
  {248},
  { 64},
  {192},
};
271
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
272
  EIGHTTAP, EIGHTTAP_SHARP};
Adrian Grange's avatar
Adrian Grange committed
273
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, 0, 1, -1, -1};
274
275
276
277
278
#endif  // VP9_SWITCHABLE_FILTERS

// Indicates if the filter is interpolating or non-interpolating
// Note currently only the EIGHTTAP_SMOOTH is non-interpolating
const int vp9_is_interpolating_filter[SWITCHABLE + 1] = {0, 1, 1, 1, -1};
John Koleszar's avatar
John Koleszar committed
279

280
void vp9_entropy_mode_init() {
281
  vp9_tokens_from_tree(vp9_intra_mode_encodings, vp9_intra_mode_tree);
282
283
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);
284
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
285
286
287

  vp9_tokens_from_tree_offset(vp9_sb_mv_ref_encoding_array,
                              vp9_sb_mv_ref_tree, NEARESTMV);
John Koleszar's avatar
John Koleszar committed
288
}
Yaowu Xu's avatar
Yaowu Xu committed
289

290
void vp9_init_mode_contexts(VP9_COMMON *pc) {
291
292
293
294
  vpx_memset(pc->fc.inter_mode_counts, 0, sizeof(pc->fc.inter_mode_counts));
  vpx_memcpy(pc->fc.inter_mode_probs,
             vp9_default_inter_mode_probs,
             sizeof(vp9_default_inter_mode_probs));
Yaowu Xu's avatar
Yaowu Xu committed
295
296
}

297
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
298
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
299
                       const int context) {
300
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
301
      pc->fc.inter_mode_counts;
John Koleszar's avatar
John Koleszar committed
302
303

  if (m == ZEROMV) {
304
    ++inter_mode_counts[context][0][0];
John Koleszar's avatar
John Koleszar committed
305
  } else {
306
    ++inter_mode_counts[context][0][1];
John Koleszar's avatar
John Koleszar committed
307
    if (m == NEARESTMV) {
308
      ++inter_mode_counts[context][1][0];
John Koleszar's avatar
John Koleszar committed
309
    } else {
310
      ++inter_mode_counts[context][1][1];
John Koleszar's avatar
John Koleszar committed
311
      if (m == NEARMV) {
312
        ++inter_mode_counts[context][2][0];
John Koleszar's avatar
John Koleszar committed
313
      } else {
314
        ++inter_mode_counts[context][2][1];
John Koleszar's avatar
John Koleszar committed
315
      }
Yaowu Xu's avatar
Yaowu Xu committed
316
    }
John Koleszar's avatar
John Koleszar committed
317
  }
Yaowu Xu's avatar
Yaowu Xu committed
318
319
}

320
#define MVREF_COUNT_SAT 20
321
#define MVREF_MAX_UPDATE_FACTOR 128
322
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
323
  int i, j;
324
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
325
      pc->fc.inter_mode_counts;
326
  vp9_prob (*mode_context)[VP9_INTER_MODES - 1] = pc->fc.inter_mode_probs;
John Koleszar's avatar
John Koleszar committed
327

Paul Wilkins's avatar
Paul Wilkins committed
328
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
329
    for (i = 0; i < VP9_INTER_MODES - 1; i++) {
330
331
      int count = inter_mode_counts[j][i][0] + inter_mode_counts[j][i][1];
      int factor;
332
333
      count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
      factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
334
335
336
337
338
      mode_context[j][i] = weighted_prob(
          pc->fc.pre_inter_mode_probs[j][i],
          get_binary_prob(inter_mode_counts[j][i][0],
                          inter_mode_counts[j][i][1]),
          factor);
Yaowu Xu's avatar
Yaowu Xu committed
339
    }
John Koleszar's avatar
John Koleszar committed
340
  }
Yaowu Xu's avatar
Yaowu Xu committed
341
}
342

Deb Mukherjee's avatar
Deb Mukherjee committed
343
344
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
Deb Mukherjee's avatar
Deb Mukherjee committed
345
static int update_mode_ct(vp9_prob pre_prob, vp9_prob prob,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
346
347
348
349
350
351
352
                          unsigned int branch_ct[2]) {
  int factor, count = branch_ct[0] + branch_ct[1];
  count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
  factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
  return weighted_prob(pre_prob, prob, factor);
}

353
static void update_mode_probs(int n_modes,
354
                              const vp9_tree_index *tree, unsigned int *cnt,
355
356
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
357
358
359
#define MAX_PROBS 32
  vp9_prob probs[MAX_PROBS];
  unsigned int branch_ct[MAX_PROBS][2];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
360
  int t;
361
362

  assert(n_modes - 1 < MAX_PROBS);
363
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
364
365
366
367
  for (t = 0; t < n_modes - 1; ++t)
    dst_probs[t] = update_mode_ct(pre_probs[t], probs[t], branch_ct[t]);
}

Deb Mukherjee's avatar
Deb Mukherjee committed
368
static int update_mode_ct2(vp9_prob pre_prob, unsigned int branch_ct[2]) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
369
370
  return update_mode_ct(pre_prob, get_binary_prob(branch_ct[0],
                                                  branch_ct[1]), branch_ct);
371
372
373
}

// #define MODE_COUNT_TESTING
374
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
375
  int i, j;
376
  FRAME_CONTEXT *fc = &cm->fc;
377
#ifdef MODE_COUNT_TESTING
378
379
  int t;

John Koleszar's avatar
John Koleszar committed
380
  printf("static const unsigned int\nymode_counts"
381
382
         "[VP9_INTRA_MODES] = {\n");
  for (t = 0; t < VP9_INTRA_MODES; ++t)
383
    printf("%d, ", fc->ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
384
385
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
386
387
         "[VP9_INTRA_MODES] [VP9_INTRA_MODES] = {\n");
  for (i = 0; i < VP9_INTRA_MODES; ++i) {
John Koleszar's avatar
John Koleszar committed
388
    printf("  {");
389
    for (t = 0; t < VP9_INTRA_MODES; ++t)
390
      printf("%d, ", fc->uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
391
392
393
394
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
395
396
         "[VP9_NKF_BINTRAMODES] = {\n");
  for (t = 0; t < VP9_NKF_BINTRAMODES; ++t)
397
    printf("%d, ", fc->bmode_counts[t]);
John Koleszar's avatar
John Koleszar committed
398
399
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
400
         "[VP9_I8X8_MODES] = {\n");
401
402
  for (t = 0; t < VP9_I8X8_MODES; ++t)
    printf("%d, ", fc->i8x8_mode_counts[t]);
John Koleszar's avatar
John Koleszar committed
403
404
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
405
         "[VP9_NUMMBSPLITS] = {\n");
406
407
  for (t = 0; t < VP9_NUMMBSPLITS; ++t)
    printf("%d, ", fc->mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
408
  printf("};\n");
409
#endif
410

Ronald S. Bultje's avatar
Ronald S. Bultje committed
411
412
413
414
415
416
417
418
419
420
421
422
423
424
  for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
    fc->intra_inter_prob[i] = update_mode_ct2(fc->pre_intra_inter_prob[i],
                                              fc->intra_inter_count[i]);
  for (i = 0; i < COMP_INTER_CONTEXTS; i++)
    fc->comp_inter_prob[i] = update_mode_ct2(fc->pre_comp_inter_prob[i],
                                             fc->comp_inter_count[i]);
  for (i = 0; i < REF_CONTEXTS; i++)
    fc->comp_ref_prob[i] = update_mode_ct2(fc->pre_comp_ref_prob[i],
                                           fc->comp_ref_count[i]);
  for (i = 0; i < REF_CONTEXTS; i++)
    for (j = 0; j < 2; j++)
      fc->single_ref_prob[i][j] = update_mode_ct2(fc->pre_single_ref_prob[i][j],
                                                  fc->single_ref_count[i][j]);

425
426
427
428
  for (i = 0; i < BLOCK_SIZE_GROUPS; i++)
    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
                      fc->y_mode_counts[i], fc->pre_y_mode_prob[i],
                      fc->y_mode_prob[i], 0);
429

430
431
  for (i = 0; i < VP9_INTRA_MODES; ++i)
    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
432
433
434
                      fc->uv_mode_counts[i], fc->pre_uv_mode_prob[i],
                      fc->uv_mode_prob[i], 0);

435
  for (i = 0; i < NUM_PARTITION_CONTEXTS; i++)
436
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
437
                      fc->partition_counts[i], fc->pre_partition_prob[i],
438
                      fc->partition_prob[INTER_FRAME][i], 0);
439
440
441
442
443
444
445
446
447

  if (cm->mcomp_filter_type == SWITCHABLE) {
    for (i = 0; i <= VP9_SWITCHABLE_FILTERS; i++) {
      update_mode_probs(VP9_SWITCHABLE_FILTERS, vp9_switchable_interp_tree,
                        fc->switchable_interp_count[i],
                        fc->pre_switchable_interp_prob[i],
                        fc->switchable_interp_prob[i], 0);
    }
  }
448
  if (cm->txfm_mode == TX_MODE_SELECT) {
449
450
451
452
    int j;
    unsigned int branch_ct_8x8p[TX_SIZE_MAX_SB - 3][2];
    unsigned int branch_ct_16x16p[TX_SIZE_MAX_SB - 2][2];
    unsigned int branch_ct_32x32p[TX_SIZE_MAX_SB - 1][2];
453
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
454
455
456
457
458
459
460
461
462
463
464
465
466
      tx_counts_to_branch_counts_8x8(cm->fc.tx_count_8x8p[i],
                                     branch_ct_8x8p);
      for (j = 0; j < TX_SIZE_MAX_SB - 3; ++j) {
        int factor;
        int count = branch_ct_8x8p[j][0] + branch_ct_8x8p[j][1];
        vp9_prob prob = get_binary_prob(branch_ct_8x8p[j][0],
                                        branch_ct_8x8p[j][1]);
        count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
        factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
        cm->fc.tx_probs_8x8p[i][j] = weighted_prob(
            cm->fc.pre_tx_probs_8x8p[i][j], prob, factor);
      }
    }
467
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
468
469
470
471
472
473
474
475
476
477
478
479
480
      tx_counts_to_branch_counts_16x16(cm->fc.tx_count_16x16p[i],
                                       branch_ct_16x16p);
      for (j = 0; j < TX_SIZE_MAX_SB - 2; ++j) {
        int factor;
        int count = branch_ct_16x16p[j][0] + branch_ct_16x16p[j][1];
        vp9_prob prob = get_binary_prob(branch_ct_16x16p[j][0],
                                        branch_ct_16x16p[j][1]);
        count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
        factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
        cm->fc.tx_probs_16x16p[i][j] = weighted_prob(
            cm->fc.pre_tx_probs_16x16p[i][j], prob, factor);
      }
    }
481
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
482
483
484
485
486
487
488
489
490
491
492
493
      tx_counts_to_branch_counts_32x32(cm->fc.tx_count_32x32p[i],
                                       branch_ct_32x32p);
      for (j = 0; j < TX_SIZE_MAX_SB - 1; ++j) {
        int factor;
        int count = branch_ct_32x32p[j][0] + branch_ct_32x32p[j][1];
        vp9_prob prob = get_binary_prob(branch_ct_32x32p[j][0],
                                        branch_ct_32x32p[j][1]);
        count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
        factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
        cm->fc.tx_probs_32x32p[i][j] = weighted_prob(
            cm->fc.pre_tx_probs_32x32p[i][j], prob, factor);
      }
494
495
    }
  }
Deb Mukherjee's avatar
Deb Mukherjee committed
496
497
498
  for (i = 0; i < MBSKIP_CONTEXTS; ++i)
    fc->mbskip_probs[i] = update_mode_ct2(fc->pre_mbskip_probs[i],
                                          fc->mbskip_count[i]);
499
}
500
501
502
503
504

static void set_default_lf_deltas(MACROBLOCKD *xd) {
  xd->mode_ref_lf_delta_enabled = 1;
  xd->mode_ref_lf_delta_update = 1;

505
  xd->ref_lf_deltas[INTRA_FRAME] = 1;
506
  xd->ref_lf_deltas[LAST_FRAME] = 0;
507
508
  xd->ref_lf_deltas[GOLDEN_FRAME] = -1;
  xd->ref_lf_deltas[ALTREF_FRAME] = -1;
509

510
511
  xd->mode_lf_deltas[0] = 0;              // Zero
  xd->mode_lf_deltas[1] = 0;               // New mv
512
513
514
515
516
517
518
519
520
}

void vp9_setup_past_independence(VP9_COMMON *cm, MACROBLOCKD *xd) {
  // Reset the segment feature data to the default stats:
  // Features disabled, 0, with delta coding (Default state).
  int i;
  vp9_clearall_segfeatures(xd);
  xd->mb_segment_abs_delta = SEGMENT_DELTADATA;
  if (cm->last_frame_seg_map)
521
    vpx_memset(cm->last_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
522

523
  // Reset the mode ref deltas for loop filter
524
525
526
527
528
529
  vpx_memset(xd->last_ref_lf_deltas, 0, sizeof(xd->last_ref_lf_deltas));
  vpx_memset(xd->last_mode_lf_deltas, 0, sizeof(xd->last_mode_lf_deltas));
  set_default_lf_deltas(xd);

  vp9_default_coef_probs(cm);
  vp9_init_mbmode_probs(cm);
530
  vpx_memcpy(cm->kf_y_mode_prob, vp9_kf_default_bmode_probs,
531
             sizeof(vp9_kf_default_bmode_probs));
532
  vp9_init_mv_probs(cm);
533

534
535
536
537
538
  // To force update of the sharpness
  cm->last_sharpness_level = -1;

  vp9_init_mode_contexts(cm);

539
  for (i = 0; i < NUM_FRAME_CONTEXTS; i++)
540
541
542
    vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));

  vpx_memset(cm->prev_mip, 0,
543
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
544
  vpx_memset(cm->mip, 0,
545
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
546
547
548
549

  vp9_update_mode_info_border(cm, cm->mip);
  vp9_update_mode_info_in_image(cm, cm->mi);

550
551
552
  vp9_update_mode_info_border(cm, cm->prev_mip);
  vp9_update_mode_info_in_image(cm, cm->prev_mi);

553
  vpx_memset(cm->ref_frame_sign_bias, 0, sizeof(cm->ref_frame_sign_bias));
554
555
556

  cm->frame_context_idx = 0;
}