vp9_entropymode.c 19 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

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

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

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

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

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

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

265
void vp9_entropy_mode_init() {
266
  vp9_tokens_from_tree(vp9_intra_mode_encodings, vp9_intra_mode_tree);
267 268
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);
269
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
270 271 272

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

275
void vp9_init_mode_contexts(VP9_COMMON *pc) {
276 277 278 279
  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
280 281
}

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

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

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

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

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

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

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

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

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

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

410 411 412 413
  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);
414

415 416
  for (i = 0; i < VP9_INTRA_MODES; ++i)
    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
417 418 419
                      fc->uv_mode_counts[i], fc->pre_uv_mode_prob[i],
                      fc->uv_mode_prob[i], 0);

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

  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);
    }
  }
433 434 435 436 437 438 439 440 441 442 443 444 445 446
  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);
    }
  }
Deb Mukherjee's avatar
Deb Mukherjee committed
447 448 449
  for (i = 0; i < MBSKIP_CONTEXTS; ++i)
    fc->mbskip_probs[i] = update_mode_ct2(fc->pre_mbskip_probs[i],
                                          fc->mbskip_count[i]);
450
}
451 452 453 454 455

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

456
  xd->ref_lf_deltas[INTRA_FRAME] = 1;
457
  xd->ref_lf_deltas[LAST_FRAME] = 0;
458 459
  xd->ref_lf_deltas[GOLDEN_FRAME] = -1;
  xd->ref_lf_deltas[ALTREF_FRAME] = -1;
460

461 462
  xd->mode_lf_deltas[0] = 0;              // Zero
  xd->mode_lf_deltas[1] = 0;               // New mv
463 464 465 466 467 468 469 470 471
}

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

474
  // Reset the mode ref deltas for loop filter
475 476 477 478 479 480
  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);
481
  vpx_memcpy(cm->kf_y_mode_prob, vp9_kf_default_bmode_probs,
482
             sizeof(vp9_kf_default_bmode_probs));
483
  vp9_init_mv_probs(cm);
484

485 486 487 488 489
  // To force update of the sharpness
  cm->last_sharpness_level = -1;

  vp9_init_mode_contexts(cm);

490
  for (i = 0; i < NUM_FRAME_CONTEXTS; i++)
491 492 493
    vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));

  vpx_memset(cm->prev_mip, 0,
494
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
495
  vpx_memset(cm->mip, 0,
496
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
497 498 499 500

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

501 502 503
  vp9_update_mode_info_border(cm, cm->prev_mip);
  vp9_update_mode_info_in_image(cm, cm->prev_mi);

504
  vpx_memset(cm->ref_frame_sign_bias, 0, sizeof(cm->ref_frame_sign_bias));
505 506 507

  cm->frame_context_idx = 0;
}