vp9_entropymode.c 21.2 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5 6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9 10 11
 */


12 13
#include "vp9/common/vp9_onyxc_int.h"
#include "vp9/common/vp9_modecont.h"
14 15
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_alloccommon.h"
John Koleszar's avatar
John Koleszar committed
16
#include "vpx_mem/vpx_mem.h"
17

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

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

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

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

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

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

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

126
struct vp9_token vp9_intra_mode_encodings[VP9_INTRA_MODES];
127

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

130 131
struct vp9_token vp9_partition_encodings[PARTITION_TYPES];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  vp9_init_mode_contexts(cm);

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

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

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

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

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

  cm->frame_context_idx = 0;
}