vp9_entropymode.c 18.6 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
137
138
139
140
};

static const vp9_prob default_comp_inter_p[COMP_INTER_CONTEXTS] = {
  25, 66, 106, 142, 183
};

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
154
155
156
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
void tx_counts_to_branch_counts(unsigned int *tx_count_32x32p,
                                unsigned int *tx_count_16x16p,
                                unsigned int *tx_count_8x8p,
                                unsigned int (*ct)[2]) {
#if TX_SIZE_PROBS == 6
  ct[0][0] = tx_count_8x8p[TX_4X4];
  ct[0][1] = tx_count_8x8p[TX_8X8];
  ct[1][0] = tx_count_16x16p[TX_4X4];
  ct[1][1] = tx_count_16x16p[TX_8X8] + tx_count_16x16p[TX_16X16];
  ct[2][0] = tx_count_16x16p[TX_8X8];
  ct[2][1] = tx_count_16x16p[TX_16X16];
  ct[3][0] = tx_count_32x32p[TX_4X4];
  ct[3][1] = tx_count_32x32p[TX_8X8] + tx_count_32x32p[TX_16X16] +
             tx_count_32x32p[TX_32X32];
  ct[4][0] = tx_count_32x32p[TX_8X8];
  ct[4][1] = tx_count_32x32p[TX_16X16] + tx_count_32x32p[TX_32X32];
  ct[5][0] = tx_count_32x32p[TX_16X16];
  ct[5][1] = tx_count_32x32p[TX_32X32];
#else
  ct[0][0] = tx_count_32x32p[TX_4X4] +
             tx_count_16x16p[TX_4X4] +
             tx_count_8x8p[TX_4X4];
  ct[0][1] = tx_count_32x32p[TX_8X8] +
             tx_count_32x32p[TX_16X16] +
             tx_count_32x32p[TX_32X32] +
             tx_count_16x16p[TX_8X8] +
             tx_count_16x16p[TX_16X16] +
             tx_count_8x8p[TX_8X8];
  ct[1][0] = tx_count_32x32p[TX_8X8] +
             tx_count_16x16p[TX_8X8];
  ct[1][1] = tx_count_32x32p[TX_16X16] +
             tx_count_32x32p[TX_32X32] +
             tx_count_16x16p[TX_16X16];
  ct[2][0] = tx_count_32x32p[TX_16X16];
  ct[2][1] = tx_count_32x32p[TX_32X32];
#endif
}

#if TX_SIZE_PROBS == 6
const vp9_prob vp9_default_tx_probs[TX_SIZE_PROBS] = {
  96, 96, 96, 96, 96, 96
};
#else
const vp9_prob vp9_default_tx_probs[TX_SIZE_PROBS] = {
  96, 96, 96
};
#endif

200
void vp9_init_mbmode_probs(VP9_COMMON *x) {
201
202
203
204
205
206
  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));
207

208
209
  vpx_memcpy(x->fc.switchable_interp_prob, vp9_switchable_interp_prob,
             sizeof(vp9_switchable_interp_prob));
210
211
212
213

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

Ronald S. Bultje's avatar
Ronald S. Bultje committed
214
215
216
217
218
219
220
221
  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));
222
223
  vpx_memcpy(x->fc.tx_probs, vp9_default_tx_probs,
             sizeof(vp9_default_tx_probs));
John Koleszar's avatar
John Koleszar committed
224
225
}

226
227
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
228
229
230
  -0, 2,
  -1, -2
};
231
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
232
233
234
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};
235
236
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
237
238
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
239
240
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
241
242
  -0, -1,
};
243
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
244
245
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
246
247
248
249
  {248},
  { 64},
  {192},
};
250
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
251
  EIGHTTAP, EIGHTTAP_SHARP};
Adrian Grange's avatar
Adrian Grange committed
252
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, 0, 1, -1, -1};
253
254
255
256
257
#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
258

259
void vp9_entropy_mode_init() {
260
  vp9_tokens_from_tree(vp9_intra_mode_encodings, vp9_intra_mode_tree);
261
262
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);
263
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
264
265
266

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

269
void vp9_init_mode_contexts(VP9_COMMON *pc) {
270
271
272
273
  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
274
275
}

276
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
277
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
278
                       const int context) {
279
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
280
      pc->fc.inter_mode_counts;
John Koleszar's avatar
John Koleszar committed
281
282

  if (m == ZEROMV) {
283
    ++inter_mode_counts[context][0][0];
John Koleszar's avatar
John Koleszar committed
284
  } else {
285
    ++inter_mode_counts[context][0][1];
John Koleszar's avatar
John Koleszar committed
286
    if (m == NEARESTMV) {
287
      ++inter_mode_counts[context][1][0];
John Koleszar's avatar
John Koleszar committed
288
    } else {
289
      ++inter_mode_counts[context][1][1];
John Koleszar's avatar
John Koleszar committed
290
      if (m == NEARMV) {
291
        ++inter_mode_counts[context][2][0];
John Koleszar's avatar
John Koleszar committed
292
      } else {
293
        ++inter_mode_counts[context][2][1];
John Koleszar's avatar
John Koleszar committed
294
      }
Yaowu Xu's avatar
Yaowu Xu committed
295
    }
John Koleszar's avatar
John Koleszar committed
296
  }
Yaowu Xu's avatar
Yaowu Xu committed
297
298
}

299
#define MVREF_COUNT_SAT 20
300
#define MVREF_MAX_UPDATE_FACTOR 128
301
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
302
  int i, j;
303
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
304
      pc->fc.inter_mode_counts;
305
  vp9_prob (*mode_context)[VP9_INTER_MODES - 1] = pc->fc.inter_mode_probs;
John Koleszar's avatar
John Koleszar committed
306

Paul Wilkins's avatar
Paul Wilkins committed
307
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
308
    for (i = 0; i < VP9_INTER_MODES - 1; i++) {
309
310
      int count = inter_mode_counts[j][i][0] + inter_mode_counts[j][i][1];
      int factor;
311
312
      count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
      factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
313
314
315
316
317
      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
318
    }
John Koleszar's avatar
John Koleszar committed
319
  }
Yaowu Xu's avatar
Yaowu Xu committed
320
}
321

Deb Mukherjee's avatar
Deb Mukherjee committed
322
323
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
Ronald S. Bultje's avatar
Ronald S. Bultje committed
324
325
326
327
328
329
330
331
static int update_mode_ct(int pre_prob, int prob,
                          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);
}

332
static void update_mode_probs(int n_modes,
333
                              const vp9_tree_index *tree, unsigned int *cnt,
334
335
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
336
337
338
#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
339
  int t;
340
341

  assert(n_modes - 1 < MAX_PROBS);
342
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
343
344
345
346
347
348
349
  for (t = 0; t < n_modes - 1; ++t)
    dst_probs[t] = update_mode_ct(pre_probs[t], probs[t], branch_ct[t]);
}

static int update_mode_ct2(int pre_prob, unsigned int branch_ct[2]) {
  return update_mode_ct(pre_prob, get_binary_prob(branch_ct[0],
                                                  branch_ct[1]), branch_ct);
350
351
352
}

// #define MODE_COUNT_TESTING
353
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
354
  int i, j;
355
  FRAME_CONTEXT *fc = &cm->fc;
356
#ifdef MODE_COUNT_TESTING
357
358
  int t;

John Koleszar's avatar
John Koleszar committed
359
  printf("static const unsigned int\nymode_counts"
360
361
         "[VP9_INTRA_MODES] = {\n");
  for (t = 0; t < VP9_INTRA_MODES; ++t)
362
    printf("%d, ", fc->ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
363
364
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
365
366
         "[VP9_INTRA_MODES] [VP9_INTRA_MODES] = {\n");
  for (i = 0; i < VP9_INTRA_MODES; ++i) {
John Koleszar's avatar
John Koleszar committed
367
    printf("  {");
368
    for (t = 0; t < VP9_INTRA_MODES; ++t)
369
      printf("%d, ", fc->uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
370
371
372
373
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
374
375
         "[VP9_NKF_BINTRAMODES] = {\n");
  for (t = 0; t < VP9_NKF_BINTRAMODES; ++t)
376
    printf("%d, ", fc->bmode_counts[t]);
John Koleszar's avatar
John Koleszar committed
377
378
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
379
         "[VP9_I8X8_MODES] = {\n");
380
381
  for (t = 0; t < VP9_I8X8_MODES; ++t)
    printf("%d, ", fc->i8x8_mode_counts[t]);
John Koleszar's avatar
John Koleszar committed
382
383
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
384
         "[VP9_NUMMBSPLITS] = {\n");
385
386
  for (t = 0; t < VP9_NUMMBSPLITS; ++t)
    printf("%d, ", fc->mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
387
  printf("};\n");
388
#endif
389

Ronald S. Bultje's avatar
Ronald S. Bultje committed
390
391
392
393
394
395
396
397
398
399
400
401
402
403
  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]);

404
405
406
407
  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);
408

409
410
  for (i = 0; i < VP9_INTRA_MODES; ++i)
    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
411
412
413
                      fc->uv_mode_counts[i], fc->pre_uv_mode_prob[i],
                      fc->uv_mode_prob[i], 0);

414
  for (i = 0; i < NUM_PARTITION_CONTEXTS; i++)
415
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
416
                      fc->partition_counts[i], fc->pre_partition_prob[i],
417
                      fc->partition_prob[INTER_FRAME][i], 0);
418
419
420
421
422
423
424
425
426

  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);
    }
  }
427
428
429
430
431
432
433
434
435
436
437
438
439
440
  if (cm->txfm_mode == TX_MODE_SELECT) {
    unsigned int branch_ct[TX_SIZE_PROBS][2];
    tx_counts_to_branch_counts(cm->fc.tx_count_32x32p,
                               cm->fc.tx_count_16x16p,
                               cm->fc.tx_count_8x8p, branch_ct);
    for (i = 0; i < TX_SIZE_PROBS; ++i) {
      int factor;
      int count = branch_ct[i][0] + branch_ct[i][1];
      vp9_prob prob = get_binary_prob(branch_ct[i][0], branch_ct[i][1]);
      count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
      factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
      cm->fc.tx_probs[i] = weighted_prob(cm->fc.pre_tx_probs[i], prob, factor);
    }
  }
441
}
442
443
444
445
446

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

447
  xd->ref_lf_deltas[INTRA_FRAME] = 1;
448
  xd->ref_lf_deltas[LAST_FRAME] = 0;
449
450
  xd->ref_lf_deltas[GOLDEN_FRAME] = -1;
  xd->ref_lf_deltas[ALTREF_FRAME] = -1;
451

452
453
  xd->mode_lf_deltas[0] = 0;              // Zero
  xd->mode_lf_deltas[1] = 0;               // New mv
454
455
456
457
458
459
460
461
462
}

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)
463
    vpx_memset(cm->last_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
464

465
  // Reset the mode ref deltas for loop filter
466
467
468
469
470
471
  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);
472
  vpx_memcpy(cm->kf_y_mode_prob, vp9_kf_default_bmode_probs,
473
             sizeof(vp9_kf_default_bmode_probs));
474
  vp9_init_mv_probs(cm);
475

476
477
478
479
480
  // To force update of the sharpness
  cm->last_sharpness_level = -1;

  vp9_init_mode_contexts(cm);

481
  for (i = 0; i < NUM_FRAME_CONTEXTS; i++)
482
483
484
    vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));

  vpx_memset(cm->prev_mip, 0,
485
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
486
  vpx_memset(cm->mip, 0,
487
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
488
489
490
491

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

492
493
494
  vp9_update_mode_info_border(cm, cm->prev_mip);
  vp9_update_mode_info_in_image(cm, cm->prev_mi);

495
  vpx_memset(cm->ref_frame_sign_bias, 0, sizeof(cm->ref_frame_sign_bias));
496
497
498

  cm->frame_context_idx = 0;
}