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