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


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

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

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

40 41 42 43 44 45 46 47 48 49 50 51
static const vp9_prob default_if_uv_probs[VP9_INTRA_MODES]
                                         [VP9_INTRA_MODES - 1] = {
  { 115,   7,  78, 180, 210, 127,  34,  57, 104 } /* y = dc */,
  {  43,   9, 165, 140, 112,  93,  45, 125, 117 } /* y = v */,
  {  68,   6,  25, 206, 241, 154,  16,  23, 102 } /* y = h */,
  {  90,   5,  48, 117, 155, 134,  61,  88,  96 } /* y = d45 */,
  {  77,   5,  43, 148, 100, 147,  37,  60, 146 } /* y = d135 */,
  {  75,   5,  57, 167,  62,  91,  45,  76, 139 } /* y = d117 */,
  {  86,   4,  34, 155, 185, 163,  22,  29, 160 } /* y = d153 */,
  {  82,   5,  34, 155, 207, 144,  26,  38,  79 } /* y = d27 */,
  {  69,   6,  65, 105, 104, 122,  48, 131, 116 } /* y = d63 */,
  {  86,  16, 114, 177, 189, 108,  28,  72, 120 } /* y = tm */
John Koleszar's avatar
John Koleszar committed
52 53
};

54
const vp9_prob vp9_partition_probs[NUM_FRAME_TYPES][NUM_PARTITION_CONTEXTS]
55
                                  [PARTITION_TYPES - 1] = {
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
  { /* frame_type = keyframe */
    /* 8x8 -> 4x4 */
    { 164, 121, 109 } /* a/l both not split */,
    {  69,  11, 129 } /* a split, l not split */,
    {  52, 181,  37 } /* l split, a not split */,
    {  66,  71,  93 } /* a/l both split */,
    /* 16x16 -> 8x8 */
    { 154,  48,  43 } /* a/l both not split */,
    {  81,  11,  63 } /* a split, l not split */,
    {  67,  65,  17 } /* l split, a not split */,
    {  57,  18,  24 } /* a/l both split */,
    /* 32x32 -> 16x16 */
    { 156,  42,  35 } /* a/l both not split */,
    {  74,  10,  40 } /* a split, l not split */,
    {  59,  53,  10 } /* l split, a not split */,
    {  28,  10,   9 } /* a/l both split */,
    /* 64x64 -> 32x32 */
    { 168,  32,  43 } /* a/l both not split */,
    {  59,  13,  41 } /* a split, l not split */,
    {  60,  25,  10 } /* l split, a not split */,
    {  13,   5,   4 } /* a/l both split */
  }, { /* frame_type = interframe */
    /* 8x8 -> 4x4 */
    { 192, 121, 151 } /* a/l both not split */,
    { 134,  63, 162 } /* a split, l not split */,
    { 136, 134, 127 } /* l split, a not split */,
    { 101,  97, 131 } /* a/l both split */,
    /* 16x16 -> 8x8 */
    { 167,  67,  80 } /* a/l both not split */,
    {  87,  36,  70 } /* a split, l not split */,
    {  90,  61,  45 } /* l split, a not split */,
    {  46,  31,  32 } /* a/l both split */,
    /* 32x32 -> 16x16 */
    { 167,  63,  75 } /* a/l both not split */,
    {  67,  27,  61 } /* a split, l not split */,
    {  56,  87,  31 } /* l split, a not split */,
    {  15,  13,  11 } /* a/l both split */,
    /* 64x64 -> 32x32 */
    { 222,  45,  44 } /* a/l both not split */,
    {  62,  17,  62 } /* a split, l not split */,
    {  52,  65,  16 } /* l split, a not split */,
    {   9,   7,   6 } /* a/l both split */
  }
99 100
};

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

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

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

126
struct vp9_token vp9_intra_mode_encodings[VP9_INTRA_MODES];
127

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

130 131
struct vp9_token vp9_partition_encodings[PARTITION_TYPES];

Ronald S. Bultje's avatar
Ronald S. Bultje committed
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
static const vp9_prob default_intra_inter_p[INTRA_INTER_CONTEXTS] = {
  6, 87, 165, 213
};

static const vp9_prob default_comp_inter_p[COMP_INTER_CONTEXTS] = {
  25, 66, 106, 142, 183
};

static const vp9_prob default_comp_ref_p[REF_CONTEXTS] = {
  36, 93, 136, 205, 236
};

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

152 153 154 155 156 157
const vp9_prob vp9_default_tx_probs_32x32p[TX_SIZE_MAX_SB]
                                          [TX_SIZE_MAX_SB - 1] = {
  { 16, 64, 96, },
  { 32, 64, 96, },
  { 32, 64, 96, },
  { 32, 64, 96, },
158
};
159 160 161 162 163
const vp9_prob vp9_default_tx_probs_16x16p[TX_SIZE_MAX_SB - 1]
                                          [TX_SIZE_MAX_SB - 2] = {
  { 32, 96, },
  { 64, 96, },
  { 64, 96, },
164
};
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
const vp9_prob vp9_default_tx_probs_8x8p[TX_SIZE_MAX_SB - 2]
                                        [TX_SIZE_MAX_SB - 3] = {
  { 96, },
  { 96, },
};

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

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

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

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

203
void vp9_init_mbmode_probs(VP9_COMMON *x) {
204 205 206 207 208 209
  vpx_memcpy(x->fc.uv_mode_prob, default_if_uv_probs,
             sizeof(default_if_uv_probs));
  vpx_memcpy(x->kf_uv_mode_prob, default_kf_uv_probs,
             sizeof(default_kf_uv_probs));
  vpx_memcpy(x->fc.y_mode_prob, default_if_y_probs,
             sizeof(default_if_y_probs));
210

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

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

Ronald S. Bultje's avatar
Ronald S. Bultje committed
217 218 219 220 221 222 223 224
  vpx_memcpy(x->fc.intra_inter_prob, default_intra_inter_p,
             sizeof(default_intra_inter_p));
  vpx_memcpy(x->fc.comp_inter_prob, default_comp_inter_p,
             sizeof(default_comp_inter_p));
  vpx_memcpy(x->fc.comp_ref_prob, default_comp_ref_p,
             sizeof(default_comp_ref_p));
  vpx_memcpy(x->fc.single_ref_prob, default_single_ref_p,
             sizeof(default_single_ref_p));
225 226 227 228 229 230
  vpx_memcpy(x->fc.tx_probs_32x32p, vp9_default_tx_probs_32x32p,
             sizeof(vp9_default_tx_probs_32x32p));
  vpx_memcpy(x->fc.tx_probs_16x16p, vp9_default_tx_probs_16x16p,
             sizeof(vp9_default_tx_probs_16x16p));
  vpx_memcpy(x->fc.tx_probs_8x8p, vp9_default_tx_probs_8x8p,
             sizeof(vp9_default_tx_probs_8x8p));
Deb Mukherjee's avatar
Deb Mukherjee committed
231 232
  vpx_memcpy(x->fc.mbskip_probs, vp9_default_mbskip_probs,
             sizeof(vp9_default_mbskip_probs));
John Koleszar's avatar
John Koleszar committed
233 234
}

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

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

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

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

278
void vp9_init_mode_contexts(VP9_COMMON *pc) {
279 280 281 282
  vpx_memset(pc->fc.inter_mode_counts, 0, sizeof(pc->fc.inter_mode_counts));
  vpx_memcpy(pc->fc.inter_mode_probs,
             vp9_default_inter_mode_probs,
             sizeof(vp9_default_inter_mode_probs));
Yaowu Xu's avatar
Yaowu Xu committed
283 284
}

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

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

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

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

Deb Mukherjee's avatar
Deb Mukherjee committed
331 332
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
Deb Mukherjee's avatar
Deb Mukherjee committed
333
static int update_mode_ct(vp9_prob pre_prob, vp9_prob prob,
Ronald S. Bultje's avatar
Ronald S. Bultje committed
334 335 336 337 338 339 340
                          unsigned int branch_ct[2]) {
  int factor, count = branch_ct[0] + branch_ct[1];
  count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
  factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
  return weighted_prob(pre_prob, prob, factor);
}

341
static void update_mode_probs(int n_modes,
342
                              const vp9_tree_index *tree, unsigned int *cnt,
343 344
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
345 346 347
#define MAX_PROBS 32
  vp9_prob probs[MAX_PROBS];
  unsigned int branch_ct[MAX_PROBS][2];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
348
  int t;
349 350

  assert(n_modes - 1 < MAX_PROBS);
351
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
352 353 354 355
  for (t = 0; t < n_modes - 1; ++t)
    dst_probs[t] = update_mode_ct(pre_probs[t], probs[t], branch_ct[t]);
}

Deb Mukherjee's avatar
Deb Mukherjee committed
356
static int update_mode_ct2(vp9_prob pre_prob, unsigned int branch_ct[2]) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
357 358
  return update_mode_ct(pre_prob, get_binary_prob(branch_ct[0],
                                                  branch_ct[1]), branch_ct);
359 360 361
}

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

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

Ronald S. Bultje's avatar
Ronald S. Bultje committed
399 400 401 402 403 404 405 406 407 408 409 410 411 412
  for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
    fc->intra_inter_prob[i] = update_mode_ct2(fc->pre_intra_inter_prob[i],
                                              fc->intra_inter_count[i]);
  for (i = 0; i < COMP_INTER_CONTEXTS; i++)
    fc->comp_inter_prob[i] = update_mode_ct2(fc->pre_comp_inter_prob[i],
                                             fc->comp_inter_count[i]);
  for (i = 0; i < REF_CONTEXTS; i++)
    fc->comp_ref_prob[i] = update_mode_ct2(fc->pre_comp_ref_prob[i],
                                           fc->comp_ref_count[i]);
  for (i = 0; i < REF_CONTEXTS; i++)
    for (j = 0; j < 2; j++)
      fc->single_ref_prob[i][j] = update_mode_ct2(fc->pre_single_ref_prob[i][j],
                                                  fc->single_ref_count[i][j]);

413 414 415 416
  for (i = 0; i < BLOCK_SIZE_GROUPS; i++)
    update_mode_probs(VP9_INTRA_MODES, vp9_intra_mode_tree,
                      fc->y_mode_counts[i], fc->pre_y_mode_prob[i],
                      fc->y_mode_prob[i], 0);
417

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

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

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

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

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

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

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

511
  // Reset the mode ref deltas for loop filter
512 513 514 515 516 517
  vpx_memset(xd->last_ref_lf_deltas, 0, sizeof(xd->last_ref_lf_deltas));
  vpx_memset(xd->last_mode_lf_deltas, 0, sizeof(xd->last_mode_lf_deltas));
  set_default_lf_deltas(xd);

  vp9_default_coef_probs(cm);
  vp9_init_mbmode_probs(cm);
518
  vpx_memcpy(cm->kf_y_mode_prob, vp9_kf_default_bmode_probs,
519
             sizeof(vp9_kf_default_bmode_probs));
520
  vp9_init_mv_probs(cm);
521

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

  vp9_init_mode_contexts(cm);

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

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

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

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

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

  cm->frame_context_idx = 0;
}