vp9_entropymode.c 20.8 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
20
21
22
23
24
25
26
27
28
29
static const vp9_prob default_kf_uv_probs[VP9_INTRA_MODES]
                                         [VP9_INTRA_MODES - 1] = {
  { 149,  13,  48, 141, 174, 131,  54,  61, 109 } /* y = dc */,
  { 120,  17, 119, 132, 103, 103,  54, 100, 130 } /* y = v */,
  { 114,  16,  19, 177, 220, 145,  31,  33, 122 } /* y = h */,
  { 119,  12,  43, 102, 133, 133,  77,  90, 102 } /* y = d45 */,
  { 110,  10,  28, 144,  78, 158,  40,  49, 161 } /* y = d135 */,
  { 114,  10,  46, 169,  50,  96,  48,  70, 150 } /* y = d117 */,
  { 116,  10,  24, 125, 134, 168,  26,  27, 193 } /* y = d153 */,
  { 121,  14,  26, 124, 175, 143,  36,  37,  79 } /* y = d27 */,
  { 116,  13,  54, 100, 105, 122,  58, 126, 122 } /* y = d63 */,
  {  98,  22,  60, 147, 159, 124,  45,  68, 128 } /* y = tm */
30
};
31

32
33
34
35
36
37
static const vp9_prob default_if_y_probs[BLOCK_SIZE_GROUPS]
                                        [VP9_INTRA_MODES - 1] = {
  {  42,  31,  23, 150, 161, 193,  32,  53, 100 } /* block_size < 8x8 */,
  { 132,  58,  30, 160, 209, 195,  52,  47,  76 } /* block_size < 16x16 */,
  { 179,  85,  24, 168, 236, 198,  87,  45,  46 } /* block_size < 32x32 */,
  { 221, 176,  63, 133, 233, 121, 125, 105,  34 } /* block_size >= 32x32 */
38
39
};

40
41
42
43
44
45
46
47
48
49
50
51
static const vp9_prob default_if_uv_probs[VP9_INTRA_MODES]
                                         [VP9_INTRA_MODES - 1] = {
  { 115,   7,  78, 180, 210, 127,  34,  57, 104 } /* y = dc */,
  {  43,   9, 165, 140, 112,  93,  45, 125, 117 } /* y = v */,
  {  68,   6,  25, 206, 241, 154,  16,  23, 102 } /* y = h */,
  {  90,   5,  48, 117, 155, 134,  61,  88,  96 } /* y = d45 */,
  {  77,   5,  43, 148, 100, 147,  37,  60, 146 } /* y = d135 */,
  {  75,   5,  57, 167,  62,  91,  45,  76, 139 } /* y = d117 */,
  {  86,   4,  34, 155, 185, 163,  22,  29, 160 } /* y = d153 */,
  {  82,   5,  34, 155, 207, 144,  26,  38,  79 } /* y = d27 */,
  {  69,   6,  65, 105, 104, 122,  48, 131, 116 } /* y = d63 */,
  {  86,  16, 114, 177, 189, 108,  28,  72, 120 } /* 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  { /* frame_type = keyframe */
    /* 8x8 -> 4x4 */
    { 164, 121, 109 } /* a/l both not split */,
    {  69,  11, 129 } /* a split, l not split */,
    {  52, 181,  37 } /* l split, a not split */,
    {  66,  71,  93 } /* a/l both split */,
    /* 16x16 -> 8x8 */
    { 154,  48,  43 } /* a/l both not split */,
    {  81,  11,  63 } /* a split, l not split */,
    {  67,  65,  17 } /* l split, a not split */,
    {  57,  18,  24 } /* a/l both split */,
    /* 32x32 -> 16x16 */
    { 156,  42,  35 } /* a/l both not split */,
    {  74,  10,  40 } /* a split, l not split */,
    {  59,  53,  10 } /* l split, a not split */,
    {  28,  10,   9 } /* a/l both split */,
    /* 64x64 -> 32x32 */
    { 168,  32,  43 } /* a/l both not split */,
    {  59,  13,  41 } /* a split, l not split */,
    {  60,  25,  10 } /* l split, a not split */,
    {  13,   5,   4 } /* a/l both split */
  }, { /* frame_type = interframe */
    /* 8x8 -> 4x4 */
    { 192, 121, 151 } /* a/l both not split */,
    { 134,  63, 162 } /* a split, l not split */,
    { 136, 134, 127 } /* l split, a not split */,
    { 101,  97, 131 } /* a/l both split */,
    /* 16x16 -> 8x8 */
    { 167,  67,  80 } /* a/l both not split */,
    {  87,  36,  70 } /* a split, l not split */,
    {  90,  61,  45 } /* l split, a not split */,
    {  46,  31,  32 } /* a/l both split */,
    /* 32x32 -> 16x16 */
    { 167,  63,  75 } /* a/l both not split */,
    {  67,  27,  61 } /* a split, l not split */,
    {  56,  87,  31 } /* l split, a not split */,
    {  15,  13,  11 } /* a/l both split */,
    /* 64x64 -> 32x32 */
    { 222,  45,  44 } /* a/l both not split */,
    {  62,  17,  62 } /* a split, l not split */,
    {  52,  65,  16 } /* l split, a not split */,
    {   9,   7,   6 } /* a/l both split */
  }
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
static const vp9_prob default_intra_inter_p[INTRA_INTER_CONTEXTS] = {
  6, 87, 165, 213
};

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] = {
  36, 93, 136, 205, 236
};

static const vp9_prob default_single_ref_p[REF_CONTEXTS][2] = {
  { 30, 17 },
  { 80, 66 },
  { 142, 129 },
  { 192, 178 },
  { 235, 248 },
};

152
153
154
155
156
157
const vp9_prob vp9_default_tx_probs_32x32p[TX_SIZE_MAX_SB]
                                          [TX_SIZE_MAX_SB - 1] = {
  { 16, 64, 96, },
  { 32, 64, 96, },
  { 32, 64, 96, },
  { 32, 64, 96, },
158
};
159
160
161
162
163
const vp9_prob vp9_default_tx_probs_16x16p[TX_SIZE_MAX_SB - 1]
                                          [TX_SIZE_MAX_SB - 2] = {
  { 32, 96, },
  { 64, 96, },
  { 64, 96, },
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
const vp9_prob vp9_default_tx_probs_8x8p[TX_SIZE_MAX_SB - 2]
                                        [TX_SIZE_MAX_SB - 3] = {
  { 96, },
  { 96, },
};

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];
}
198

Deb Mukherjee's avatar
Deb Mukherjee committed
199
200
201
202
const vp9_prob vp9_default_mbskip_probs[MBSKIP_CONTEXTS] = {
  192, 128, 64
};

203
void vp9_init_mbmode_probs(VP9_COMMON *x) {
204
205
206
207
208
209
  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));
210

211
212
  vpx_memcpy(x->fc.switchable_interp_prob, vp9_switchable_interp_prob,
             sizeof(vp9_switchable_interp_prob));
213
214
215
216

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

Ronald S. Bultje's avatar
Ronald S. Bultje committed
217
218
219
220
221
222
223
224
  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));
225
226
227
228
229
230
  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
231
232
  vpx_memcpy(x->fc.mbskip_probs, vp9_default_mbskip_probs,
             sizeof(vp9_default_mbskip_probs));
John Koleszar's avatar
John Koleszar committed
233
234
}

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

268
void vp9_entropy_mode_init() {
269
  vp9_tokens_from_tree(vp9_intra_mode_encodings, vp9_intra_mode_tree);
270
271
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);
272
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
273
274
275

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

278
void vp9_init_mode_contexts(VP9_COMMON *pc) {
279
280
281
282
  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
283
284
}

285
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
286
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
287
                       const int context) {
288
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
289
      pc->fc.inter_mode_counts;
John Koleszar's avatar
John Koleszar committed
290
291

  if (m == ZEROMV) {
292
    ++inter_mode_counts[context][0][0];
John Koleszar's avatar
John Koleszar committed
293
  } else {
294
    ++inter_mode_counts[context][0][1];
John Koleszar's avatar
John Koleszar committed
295
    if (m == NEARESTMV) {
296
      ++inter_mode_counts[context][1][0];
John Koleszar's avatar
John Koleszar committed
297
    } else {
298
      ++inter_mode_counts[context][1][1];
John Koleszar's avatar
John Koleszar committed
299
      if (m == NEARMV) {
300
        ++inter_mode_counts[context][2][0];
John Koleszar's avatar
John Koleszar committed
301
      } else {
302
        ++inter_mode_counts[context][2][1];
John Koleszar's avatar
John Koleszar committed
303
      }
Yaowu Xu's avatar
Yaowu Xu committed
304
    }
John Koleszar's avatar
John Koleszar committed
305
  }
Yaowu Xu's avatar
Yaowu Xu committed
306
307
}

308
#define MVREF_COUNT_SAT 20
309
#define MVREF_MAX_UPDATE_FACTOR 128
310
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
311
  int i, j;
312
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
313
      pc->fc.inter_mode_counts;
314
  vp9_prob (*mode_context)[VP9_INTER_MODES - 1] = pc->fc.inter_mode_probs;
John Koleszar's avatar
John Koleszar committed
315

Paul Wilkins's avatar
Paul Wilkins committed
316
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
317
    for (i = 0; i < VP9_INTER_MODES - 1; i++) {
318
319
      int count = inter_mode_counts[j][i][0] + inter_mode_counts[j][i][1];
      int factor;
320
321
      count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
      factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
322
323
324
325
326
      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
327
    }
John Koleszar's avatar
John Koleszar committed
328
  }
Yaowu Xu's avatar
Yaowu Xu committed
329
}
330

Deb Mukherjee's avatar
Deb Mukherjee committed
331
332
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
Deb Mukherjee's avatar
Deb Mukherjee committed
333
static int update_mode_ct(vp9_prob pre_prob, vp9_prob prob,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
334
335
336
337
338
339
340
                          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);
}

341
static void update_mode_probs(int n_modes,
342
                              const vp9_tree_index *tree, unsigned int *cnt,
343
344
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
345
346
347
#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
348
  int t;
349
350

  assert(n_modes - 1 < MAX_PROBS);
351
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
352
353
354
355
  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
356
static int update_mode_ct2(vp9_prob pre_prob, unsigned int branch_ct[2]) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
357
358
  return update_mode_ct(pre_prob, get_binary_prob(branch_ct[0],
                                                  branch_ct[1]), branch_ct);
359
360
361
}

// #define MODE_COUNT_TESTING
362
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
363
  int i, j;
364
  FRAME_CONTEXT *fc = &cm->fc;
365
#ifdef MODE_COUNT_TESTING
366
367
  int t;

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

Ronald S. Bultje's avatar
Ronald S. Bultje committed
399
400
401
402
403
404
405
406
407
408
409
410
411
412
  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]);

413
414
415
416
  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);
417

418
419
  for (i = 0; i < VP9_INTRA_MODES; ++i)
    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
420
421
422
                      fc->uv_mode_counts[i], fc->pre_uv_mode_prob[i],
                      fc->uv_mode_prob[i], 0);

423
  for (i = 0; i < NUM_PARTITION_CONTEXTS; i++)
424
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
425
                      fc->partition_counts[i], fc->pre_partition_prob[i],
426
                      fc->partition_prob[INTER_FRAME][i], 0);
427
428
429
430
431
432
433
434
435

  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);
    }
  }
436
  if (cm->txfm_mode == TX_MODE_SELECT) {
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
    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];
    for (i = 0; i < TX_SIZE_MAX_SB - 2; ++i) {
      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);
      }
    }
    for (i = 0; i < TX_SIZE_MAX_SB - 1; ++i) {
      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);
      }
    }
    for (i = 0; i < TX_SIZE_MAX_SB; ++i) {
      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);
      }
482
483
    }
  }
Deb Mukherjee's avatar
Deb Mukherjee committed
484
485
486
  for (i = 0; i < MBSKIP_CONTEXTS; ++i)
    fc->mbskip_probs[i] = update_mode_ct2(fc->pre_mbskip_probs[i],
                                          fc->mbskip_count[i]);
487
}
488
489
490
491
492

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

493
  xd->ref_lf_deltas[INTRA_FRAME] = 1;
494
  xd->ref_lf_deltas[LAST_FRAME] = 0;
495
496
  xd->ref_lf_deltas[GOLDEN_FRAME] = -1;
  xd->ref_lf_deltas[ALTREF_FRAME] = -1;
497

498
499
  xd->mode_lf_deltas[0] = 0;              // Zero
  xd->mode_lf_deltas[1] = 0;               // New mv
500
501
502
503
504
505
506
507
508
}

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

511
  // Reset the mode ref deltas for loop filter
512
513
514
515
516
517
  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);
518
  vpx_memcpy(cm->kf_y_mode_prob, vp9_kf_default_bmode_probs,
519
             sizeof(vp9_kf_default_bmode_probs));
520
  vp9_init_mv_probs(cm);
521

522
523
524
525
526
  // To force update of the sharpness
  cm->last_sharpness_level = -1;

  vp9_init_mode_contexts(cm);

527
  for (i = 0; i < NUM_FRAME_CONTEXTS; i++)
528
529
530
    vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));

  vpx_memset(cm->prev_mip, 0,
531
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
532
  vpx_memset(cm->mip, 0,
533
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
534
535
536
537

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

538
539
540
  vp9_update_mode_info_border(cm, cm->prev_mip);
  vp9_update_mode_info_in_image(cm, cm->prev_mi);

541
  vpx_memset(cm->ref_frame_sign_bias, 0, sizeof(cm->ref_frame_sign_bias));
542
543
544

  cm->frame_context_idx = 0;
}