vp9_entropymode.c 20.5 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
const vp9_prob vp9_default_tx_probs_32x32p[TX_SIZE_CONTEXTS]
153
                                          [TX_SIZE_MAX_SB - 1] = {
154 155
  { 3, 136, 37, },
  { 5, 52, 13, },
156
};
157
const vp9_prob vp9_default_tx_probs_16x16p[TX_SIZE_CONTEXTS]
158
                                          [TX_SIZE_MAX_SB - 2] = {
159 160
  { 20, 152, },
  { 15, 101, },
161
};
162
const vp9_prob vp9_default_tx_probs_8x8p[TX_SIZE_CONTEXTS]
163
                                        [TX_SIZE_MAX_SB - 3] = {
164 165
  { 100, },
  { 66, },
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
};

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

Deb Mukherjee's avatar
Deb Mukherjee committed
196 197 198 199
const vp9_prob vp9_default_mbskip_probs[MBSKIP_CONTEXTS] = {
  192, 128, 64
};

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 224 225 226 227
  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
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
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
233 234 235
  -0, 2,
  -1, -2
};
236
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
237 238 239
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};
240 241
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
242 243 244 245
  { 235, 162, },
  { 36, 255, },
  { 34, 3, },
  { 149, 144, },
246
};
247 248

// Indicates if the filter is interpolating or non-interpolating
Deb Mukherjee's avatar
Deb Mukherjee committed
249
const int vp9_is_interpolating_filter[SWITCHABLE + 1] = {1, 1, 1, 1, -1};
John Koleszar's avatar
John Koleszar committed
250

251
void vp9_entropy_mode_init() {
252
  vp9_tokens_from_tree(vp9_intra_mode_encodings, vp9_intra_mode_tree);
253 254
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);
255
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
256 257 258

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

261
void vp9_init_mode_contexts(VP9_COMMON *pc) {
262 263 264 265
  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
266 267
}

268
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
269
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
270
                       const int context) {
271
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
272
      pc->fc.inter_mode_counts;
John Koleszar's avatar
John Koleszar committed
273 274

  if (m == ZEROMV) {
275
    ++inter_mode_counts[context][0][0];
John Koleszar's avatar
John Koleszar committed
276
  } else {
277
    ++inter_mode_counts[context][0][1];
John Koleszar's avatar
John Koleszar committed
278
    if (m == NEARESTMV) {
279
      ++inter_mode_counts[context][1][0];
John Koleszar's avatar
John Koleszar committed
280
    } else {
281
      ++inter_mode_counts[context][1][1];
John Koleszar's avatar
John Koleszar committed
282
      if (m == NEARMV) {
283
        ++inter_mode_counts[context][2][0];
John Koleszar's avatar
John Koleszar committed
284
      } else {
285
        ++inter_mode_counts[context][2][1];
John Koleszar's avatar
John Koleszar committed
286
      }
Yaowu Xu's avatar
Yaowu Xu committed
287
    }
John Koleszar's avatar
John Koleszar committed
288
  }
Yaowu Xu's avatar
Yaowu Xu committed
289 290
}

291
#define MVREF_COUNT_SAT 20
292
#define MVREF_MAX_UPDATE_FACTOR 128
293
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
294
  int i, j;
295
  unsigned int (*inter_mode_counts)[VP9_INTER_MODES - 1][2] =
296
      pc->fc.inter_mode_counts;
297
  vp9_prob (*mode_context)[VP9_INTER_MODES - 1] = pc->fc.inter_mode_probs;
John Koleszar's avatar
John Koleszar committed
298

Paul Wilkins's avatar
Paul Wilkins committed
299
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
300
    for (i = 0; i < VP9_INTER_MODES - 1; i++) {
301 302
      int count = inter_mode_counts[j][i][0] + inter_mode_counts[j][i][1];
      int factor;
303 304
      count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
      factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
305 306 307 308 309
      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
310
    }
John Koleszar's avatar
John Koleszar committed
311
  }
Yaowu Xu's avatar
Yaowu Xu committed
312
}
313

Deb Mukherjee's avatar
Deb Mukherjee committed
314
#define MODE_COUNT_SAT 20
315
#define MODE_MAX_UPDATE_FACTOR 128
Deb Mukherjee's avatar
Deb Mukherjee committed
316
static int update_mode_ct(vp9_prob pre_prob, vp9_prob prob,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
317 318 319 320 321 322 323
                          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);
}

324
static void update_mode_probs(int n_modes,
325
                              const vp9_tree_index *tree, unsigned int *cnt,
326 327
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
328 329 330
#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
331
  int t;
332 333

  assert(n_modes - 1 < MAX_PROBS);
334
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
335 336 337 338
  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
339
static int update_mode_ct2(vp9_prob pre_prob, unsigned int branch_ct[2]) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
340 341
  return update_mode_ct(pre_prob, get_binary_prob(branch_ct[0],
                                                  branch_ct[1]), branch_ct);
342 343 344
}

// #define MODE_COUNT_TESTING
345
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
346
  int i, j;
347
  FRAME_CONTEXT *fc = &cm->fc;
348
#ifdef MODE_COUNT_TESTING
349 350
  int t;

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

Ronald S. Bultje's avatar
Ronald S. Bultje committed
382 383 384 385 386 387 388 389 390 391 392 393 394 395
  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]);

396 397 398 399
  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);
400

401 402
  for (i = 0; i < VP9_INTRA_MODES; ++i)
    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
403 404 405
                      fc->uv_mode_counts[i], fc->pre_uv_mode_prob[i],
                      fc->uv_mode_prob[i], 0);

406
  for (i = 0; i < NUM_PARTITION_CONTEXTS; i++)
407
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
408
                      fc->partition_counts[i], fc->pre_partition_prob[i],
409
                      fc->partition_prob[INTER_FRAME][i], 0);
410 411 412 413 414 415 416 417 418

  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);
    }
  }
419
  if (cm->txfm_mode == TX_MODE_SELECT) {
420 421 422 423
    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];
424
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
425 426 427 428 429 430 431 432 433 434 435 436 437
      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);
      }
    }
438
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
439 440 441 442 443 444 445 446 447 448 449 450 451
      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);
      }
    }
452
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
453 454 455 456 457 458 459 460 461 462 463 464
      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);
      }
465 466
    }
  }
Deb Mukherjee's avatar
Deb Mukherjee committed
467 468 469
  for (i = 0; i < MBSKIP_CONTEXTS; ++i)
    fc->mbskip_probs[i] = update_mode_ct2(fc->pre_mbskip_probs[i],
                                          fc->mbskip_count[i]);
470
}
471 472 473 474 475

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

476
  xd->ref_lf_deltas[INTRA_FRAME] = 1;
477
  xd->ref_lf_deltas[LAST_FRAME] = 0;
478 479
  xd->ref_lf_deltas[GOLDEN_FRAME] = -1;
  xd->ref_lf_deltas[ALTREF_FRAME] = -1;
480

481 482
  xd->mode_lf_deltas[0] = 0;              // Zero
  xd->mode_lf_deltas[1] = 0;               // New mv
483 484 485 486 487 488 489 490 491
}

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

494
  // Reset the mode ref deltas for loop filter
495 496 497 498 499 500
  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);
501
  vpx_memcpy(cm->kf_y_mode_prob, vp9_kf_default_bmode_probs,
502
             sizeof(vp9_kf_default_bmode_probs));
503
  vp9_init_mv_probs(cm);
504

505 506 507 508 509
  // To force update of the sharpness
  cm->last_sharpness_level = -1;

  vp9_init_mode_contexts(cm);

Adrian Grange's avatar
Adrian Grange committed
510 511 512 513 514 515 516 517 518 519
  if ((cm->frame_type == KEY_FRAME) ||
      cm->error_resilient_mode || (cm->reset_frame_context == 3)) {
    // Reset all frame contexts.
    for (i = 0; i < NUM_FRAME_CONTEXTS; ++i)
      vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));
  } else if (cm->reset_frame_context == 2) {
    // Reset only the frame context specified in the frame header.
    vpx_memcpy(&cm->frame_contexts[cm->frame_context_idx], &cm->fc,
               sizeof(cm->fc));
  }
520 521

  vpx_memset(cm->prev_mip, 0,
522
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
523
  vpx_memset(cm->mip, 0,
524
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
525 526 527 528

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

529 530 531
  vp9_update_mode_info_border(cm, cm->prev_mip);
  vp9_update_mode_info_in_image(cm, cm->prev_mi);

532
  vpx_memset(cm->ref_frame_sign_bias, 0, sizeof(cm->ref_frame_sign_bias));
533 534 535

  cm->frame_context_idx = 0;
}