vp9_entropy.c 17.1 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 <stdio.h>

14
#include "vp9/common/vp9_entropy.h"
John Koleszar's avatar
John Koleszar committed
15
#include "string.h"
16 17 18
#include "vp9/common/vp9_blockd.h"
#include "vp9/common/vp9_onyxc_int.h"
#include "vp9/common/vp9_entropymode.h"
19
#include "vpx_mem/vpx_mem.h"
John Koleszar's avatar
John Koleszar committed
20 21 22 23 24 25 26

#define uchar unsigned char     /* typedefs can clash */
#define uint  unsigned int

typedef const uchar cuchar;
typedef const uint cuint;

27
typedef vp9_prob Prob;
John Koleszar's avatar
John Koleszar committed
28

29
#include "vp9/common/vp9_coefupdateprobs.h"
John Koleszar's avatar
John Koleszar committed
30

31
const int vp9_i8x8_block[4] = {0, 2, 8, 10};
32

33
DECLARE_ALIGNED(16, const unsigned char, vp9_norm[256]) = {
John Koleszar's avatar
John Koleszar committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
  0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
50 51
};

52
DECLARE_ALIGNED(16, const int, vp9_coef_bands[16]) = {
Deb Mukherjee's avatar
Deb Mukherjee committed
53 54
  0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7
};
55

56
DECLARE_ALIGNED(16, cuchar, vp9_prev_token_class[MAX_ENTROPY_TOKENS]) = {
Deb Mukherjee's avatar
Deb Mukherjee committed
57 58
  0, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 0
};
59

60
DECLARE_ALIGNED(16, const int, vp9_default_zig_zag1d[16]) = {
John Koleszar's avatar
John Koleszar committed
61 62 63 64
  0,  1,  4,  8,
  5,  2,  3,  6,
  9, 12, 13, 10,
  7, 11, 14, 15,
John Koleszar's avatar
John Koleszar committed
65
};
Jingning Han's avatar
Jingning Han committed
66

67
DECLARE_ALIGNED(16, const int, vp9_col_scan[16]) = {
Jingning Han's avatar
Jingning Han committed
68 69 70 71 72
  0, 4,  8, 12,
  1, 5,  9, 13,
  2, 6, 10, 14,
  3, 7, 11, 15
};
73
DECLARE_ALIGNED(16, const int, vp9_row_scan[16]) = {
Jingning Han's avatar
Jingning Han committed
74 75 76 77 78 79 80
  0,   1,  2,  3,
  4,   5,  6,  7,
  8,   9, 10, 11,
  12, 13, 14, 15
};


81
DECLARE_ALIGNED(64, const int, vp9_coef_bands_8x8[64]) = { 0, 1, 2, 3, 5, 4, 4, 5,
Daniel Kang's avatar
Daniel Kang committed
82 83 84 85 86 87 88 89
                                                           5, 3, 6, 3, 5, 4, 6, 6,
                                                           6, 5, 5, 6, 6, 6, 6, 6,
                                                           6, 6, 6, 6, 6, 6, 6, 6,
                                                           6, 6, 6, 6, 7, 7, 7, 7,
                                                           7, 7, 7, 7, 7, 7, 7, 7,
                                                           7, 7, 7, 7, 7, 7, 7, 7,
                                                           7, 7, 7, 7, 7, 7, 7, 7
                                                         };
90
DECLARE_ALIGNED(64, const int, vp9_default_zig_zag1d_8x8[64]) = {
John Koleszar's avatar
John Koleszar committed
91 92 93 94
  0,  1,  8, 16,  9,  2,  3, 10, 17, 24, 32, 25, 18, 11,  4,  5,
  12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13,  6,  7, 14, 21, 28,
  35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
  58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63,
95
};
John Koleszar's avatar
John Koleszar committed
96

Daniel Kang's avatar
Daniel Kang committed
97
// Table can be optimized.
98
DECLARE_ALIGNED(16, const int, vp9_coef_bands_16x16[256]) = {
Daniel Kang's avatar
Daniel Kang committed
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
    0, 1, 2, 3, 5, 4, 4, 5, 5, 3, 6, 3, 5, 4, 6, 6,
    6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
};
116
DECLARE_ALIGNED(16, const int, vp9_default_zig_zag1d_16x16[256]) = {
Daniel Kang's avatar
Daniel Kang committed
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
      0,   1,  16,  32,  17,   2,   3,  18,  33,  48,  64,  49,  34,  19,   4,   5,
     20,  35,  50,  65,  80,  96,  81,  66,  51,  36,  21,   6,   7,  22,  37,  52,
     67,  82,  97, 112, 128, 113,  98,  83,  68,  53,  38,  23,   8,   9,  24,  39,
     54,  69,  84,  99, 114, 129, 144, 160, 145, 130, 115, 100,  85,  70,  55,  40,
     25,  10,  11,  26,  41,  56,  71,  86, 101, 116, 131, 146, 161, 176, 192, 177,
    162, 147, 132, 117, 102,  87,  72,  57,  42,  27,  12,  13,  28,  43,  58,  73,
     88, 103, 118, 133, 148, 163, 178, 193, 208, 224, 209, 194, 179, 164, 149, 134,
    119, 104,  89,  74,  59,  44,  29,  14,  15,  30,  45,  60,  75,  90, 105, 120,
    135, 150, 165, 180, 195, 210, 225, 240, 241, 226, 211, 196, 181, 166, 151, 136,
    121, 106,  91,  76,  61,  46,  31,  47,  62,  77,  92, 107, 122, 137, 152, 167,
    182, 197, 212, 227, 242, 243, 228, 213, 198, 183, 168, 153, 138, 123, 108,  93,
     78,  63,  79,  94, 109, 124, 139, 154, 169, 184, 199, 214, 229, 244, 245, 230,
    215, 200, 185, 170, 155, 140, 125, 110,  95, 111, 126, 141, 156, 171, 186, 201,
    216, 231, 246, 247, 232, 217, 202, 187, 172, 157, 142, 127, 143, 158, 173, 188,
    203, 218, 233, 248, 249, 234, 219, 204, 189, 174, 159, 175, 190, 205, 220, 235,
    250, 251, 236, 221, 206, 191, 207, 222, 237, 252, 253, 238, 223, 239, 254, 255,
};
134

John Koleszar's avatar
John Koleszar committed
135 136 137

/* Array indices are identical to previously-existing CONTEXT_NODE indices */

138
const vp9_tree_index vp9_coef_tree[ 22] =     /* corresponding _CONTEXT_NODEs */
John Koleszar's avatar
John Koleszar committed
139
{
John Koleszar's avatar
John Koleszar committed
140 141 142 143 144 145 146 147 148 149 150
  -DCT_EOB_TOKEN, 2,                             /* 0 = EOB */
  -ZERO_TOKEN, 4,                               /* 1 = ZERO */
  -ONE_TOKEN, 6,                               /* 2 = ONE */
  8, 12,                                      /* 3 = LOW_VAL */
  -TWO_TOKEN, 10,                            /* 4 = TWO */
  -THREE_TOKEN, -FOUR_TOKEN,                /* 5 = THREE */
  14, 16,                                    /* 6 = HIGH_LOW */
  -DCT_VAL_CATEGORY1, -DCT_VAL_CATEGORY2,   /* 7 = CAT_ONE */
  18, 20,                                   /* 8 = CAT_THREEFOUR */
  -DCT_VAL_CATEGORY3, -DCT_VAL_CATEGORY4,  /* 9 = CAT_THREE */
  -DCT_VAL_CATEGORY5, -DCT_VAL_CATEGORY6   /* 10 = CAT_FIVE */
John Koleszar's avatar
John Koleszar committed
151 152
};

153
struct vp9_token_struct vp9_coef_encodings[MAX_ENTROPY_TOKENS];
John Koleszar's avatar
John Koleszar committed
154 155 156 157 158 159 160 161 162 163

/* Trees for extra bits.  Probabilities are constant and
   do not depend on previously encoded bits */

static const Prob Pcat1[] = { 159};
static const Prob Pcat2[] = { 165, 145};
static const Prob Pcat3[] = { 173, 148, 140};
static const Prob Pcat4[] = { 176, 155, 140, 135};
static const Prob Pcat5[] = { 180, 157, 141, 134, 130};
static const Prob Pcat6[] =
Yaowu Xu's avatar
Yaowu Xu committed
164
{ 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129};
John Koleszar's avatar
John Koleszar committed
165

166
static vp9_tree_index cat1[2], cat2[4], cat3[6], cat4[8], cat5[10], cat6[26];
John Koleszar's avatar
John Koleszar committed
167

168
static void init_bit_tree(vp9_tree_index *p, int n) {
John Koleszar's avatar
John Koleszar committed
169
  int i = 0;
John Koleszar's avatar
John Koleszar committed
170

John Koleszar's avatar
John Koleszar committed
171 172 173 174
  while (++i < n) {
    p[0] = p[1] = i << 1;
    p += 2;
  }
John Koleszar's avatar
John Koleszar committed
175

John Koleszar's avatar
John Koleszar committed
176
  p[0] = p[1] = 0;
John Koleszar's avatar
John Koleszar committed
177 178
}

John Koleszar's avatar
John Koleszar committed
179 180 181 182 183 184 185
static void init_bit_trees() {
  init_bit_tree(cat1, 1);
  init_bit_tree(cat2, 2);
  init_bit_tree(cat3, 3);
  init_bit_tree(cat4, 4);
  init_bit_tree(cat5, 5);
  init_bit_tree(cat6, 13);
John Koleszar's avatar
John Koleszar committed
186 187
}

188
vp9_extra_bit_struct vp9_extra_bits[12] = {
John Koleszar's avatar
John Koleszar committed
189 190 191 192 193 194 195 196 197 198 199 200
  { 0, 0, 0, 0},
  { 0, 0, 0, 1},
  { 0, 0, 0, 2},
  { 0, 0, 0, 3},
  { 0, 0, 0, 4},
  { cat1, Pcat1, 1, 5},
  { cat2, Pcat2, 2, 7},
  { cat3, Pcat3, 3, 11},
  { cat4, Pcat4, 4, 19},
  { cat5, Pcat5, 5, 35},
  { cat6, Pcat6, 13, 67},
  { 0, 0, 0, 0}
John Koleszar's avatar
John Koleszar committed
201
};
202

203
#include "vp9/common/vp9_default_coef_probs.h"
John Koleszar's avatar
John Koleszar committed
204

205
void vp9_default_coef_probs(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
206
  vpx_memcpy(pc->fc.coef_probs, default_coef_probs,
Daniel Kang's avatar
Daniel Kang committed
207
             sizeof(pc->fc.coef_probs));
208 209
  vpx_memcpy(pc->fc.hybrid_coef_probs, default_hybrid_coef_probs,
             sizeof(pc->fc.hybrid_coef_probs));
210

211
  vpx_memcpy(pc->fc.coef_probs_8x8, default_coef_probs_8x8,
Daniel Kang's avatar
Daniel Kang committed
212
             sizeof(pc->fc.coef_probs_8x8));
213 214
  vpx_memcpy(pc->fc.hybrid_coef_probs_8x8, default_hybrid_coef_probs_8x8,
             sizeof(pc->fc.hybrid_coef_probs_8x8));
Yaowu Xu's avatar
Yaowu Xu committed
215

216
  vpx_memcpy(pc->fc.coef_probs_16x16, default_coef_probs_16x16,
Daniel Kang's avatar
Daniel Kang committed
217
             sizeof(pc->fc.coef_probs_16x16));
218 219 220
  vpx_memcpy(pc->fc.hybrid_coef_probs_16x16,
             default_hybrid_coef_probs_16x16,
             sizeof(pc->fc.hybrid_coef_probs_16x16));
221
}
John Koleszar's avatar
John Koleszar committed
222

223
void vp9_coef_tree_initialize() {
John Koleszar's avatar
John Koleszar committed
224
  init_bit_trees();
225
  vp9_tokens_from_tree(vp9_coef_encodings, vp9_coef_tree);
John Koleszar's avatar
John Koleszar committed
226
}
227

John Koleszar's avatar
John Koleszar committed
228
// #define COEF_COUNT_TESTING
229 230 231 232 233 234 235 236

#define COEF_COUNT_SAT 24
#define COEF_MAX_UPDATE_FACTOR 112
#define COEF_COUNT_SAT_KEY 24
#define COEF_MAX_UPDATE_FACTOR_KEY 112
#define COEF_COUNT_SAT_AFTER_KEY 24
#define COEF_MAX_UPDATE_FACTOR_AFTER_KEY 128

237
void vp9_adapt_coef_probs(VP9_COMMON *cm) {
John Koleszar's avatar
John Koleszar committed
238 239
  int t, i, j, k, count;
  unsigned int branch_ct[ENTROPY_NODES][2];
240
  vp9_prob coef_probs[ENTROPY_NODES];
John Koleszar's avatar
John Koleszar committed
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
  int update_factor; /* denominator 256 */
  int factor;
  int count_sat;

  // printf("Frame type: %d\n", cm->frame_type);
  if (cm->frame_type == KEY_FRAME) {
    update_factor = COEF_MAX_UPDATE_FACTOR_KEY;
    count_sat = COEF_COUNT_SAT_KEY;
  } else if (cm->last_frame_type == KEY_FRAME) {
    update_factor = COEF_MAX_UPDATE_FACTOR_AFTER_KEY;  /* adapt quickly */
    count_sat = COEF_COUNT_SAT_AFTER_KEY;
  } else {
    update_factor = COEF_MAX_UPDATE_FACTOR;
    count_sat = COEF_COUNT_SAT;
  }
256 257

#ifdef COEF_COUNT_TESTING
John Koleszar's avatar
John Koleszar committed
258 259 260 261 262 263 264 265 266 267
  {
    printf("static const unsigned int\ncoef_counts"
           "[BLOCK_TYPES] [COEF_BANDS]"
           "[PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {\n");
    for (i = 0; i < BLOCK_TYPES; ++i) {
      printf("  {\n");
      for (j = 0; j < COEF_BANDS; ++j) {
        printf("    {\n");
        for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
          printf("      {");
268 269
          for (t = 0; t < MAX_ENTROPY_TOKENS; ++t)
            printf("%d, ", cm->fc.coef_counts[i][j][k][t]);
John Koleszar's avatar
John Koleszar committed
270
          printf("},\n");
271
        }
John Koleszar's avatar
John Koleszar committed
272
        printf("    },\n");
273
      }
John Koleszar's avatar
John Koleszar committed
274 275 276 277 278 279 280 281 282 283 284 285
      printf("  },\n");
    }
    printf("};\n");
    printf("static const unsigned int\ncoef_counts_8x8"
           "[BLOCK_TYPES_8X8] [COEF_BANDS]"
           "[PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {\n");
    for (i = 0; i < BLOCK_TYPES_8X8; ++i) {
      printf("  {\n");
      for (j = 0; j < COEF_BANDS; ++j) {
        printf("    {\n");
        for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
          printf("      {");
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
          for (t = 0; t < MAX_ENTROPY_TOKENS; ++t)
            printf("%d, ", cm->fc.coef_counts_8x8[i][j][k][t]);
          printf("},\n");
        }
        printf("    },\n");
      }
      printf("  },\n");
    }
    printf("};\n");
    printf("static const unsigned int\nhybrid_coef_counts"
           "[BLOCK_TYPES] [COEF_BANDS]"
           "[PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {\n");
    for (i = 0; i < BLOCK_TYPES; ++i) {
      printf("  {\n");
      for (j = 0; j < COEF_BANDS; ++j) {
        printf("    {\n");
        for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
          printf("      {");
          for (t = 0; t < MAX_ENTROPY_TOKENS; ++t)
            printf("%d, ", cm->fc.hybrid_coef_counts[i][j][k][t]);
John Koleszar's avatar
John Koleszar committed
306
          printf("},\n");
307
        }
John Koleszar's avatar
John Koleszar committed
308
        printf("    },\n");
309
      }
John Koleszar's avatar
John Koleszar committed
310
      printf("  },\n");
311
    }
John Koleszar's avatar
John Koleszar committed
312 313
    printf("};\n");
  }
314 315
#endif

John Koleszar's avatar
John Koleszar committed
316 317 318 319 320
  for (i = 0; i < BLOCK_TYPES; ++i)
    for (j = 0; j < COEF_BANDS; ++j)
      for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
        if (k >= 3 && ((i == 0 && j == 1) || (i > 0 && j == 0)))
          continue;
321
        vp9_tree_probs_from_distribution(
322
          MAX_ENTROPY_TOKENS, vp9_coef_encodings, vp9_coef_tree,
John Koleszar's avatar
John Koleszar committed
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
          coef_probs, branch_ct, cm->fc.coef_counts [i][j][k],
          256, 1);
        for (t = 0; t < ENTROPY_NODES; ++t) {
          int prob;
          count = branch_ct[t][0] + branch_ct[t][1];
          count = count > count_sat ? count_sat : count;
          factor = (update_factor * count / count_sat);
          prob = ((int)cm->fc.pre_coef_probs[i][j][k][t] * (256 - factor) +
                  (int)coef_probs[t] * factor + 128) >> 8;
          if (prob <= 0) cm->fc.coef_probs[i][j][k][t] = 1;
          else if (prob > 255) cm->fc.coef_probs[i][j][k][t] = 255;
          else cm->fc.coef_probs[i][j][k][t] = prob;
        }
      }

338 339 340 341 342
  for (i = 0; i < BLOCK_TYPES; ++i)
    for (j = 0; j < COEF_BANDS; ++j)
      for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
        if (k >= 3 && ((i == 0 && j == 1) || (i > 0 && j == 0)))
          continue;
343
        vp9_tree_probs_from_distribution(
344
          MAX_ENTROPY_TOKENS, vp9_coef_encodings, vp9_coef_tree,
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
          coef_probs, branch_ct, cm->fc.hybrid_coef_counts [i][j][k],
          256, 1);
        for (t = 0; t < ENTROPY_NODES; ++t) {
          int prob;
          count = branch_ct[t][0] + branch_ct[t][1];
          count = count > count_sat ? count_sat : count;
          factor = (update_factor * count / count_sat);
          prob = ((int)cm->fc.pre_hybrid_coef_probs[i][j][k][t] * (256 - factor) +
                  (int)coef_probs[t] * factor + 128) >> 8;
          if (prob <= 0) cm->fc.hybrid_coef_probs[i][j][k][t] = 1;
          else if (prob > 255) cm->fc.hybrid_coef_probs[i][j][k][t] = 255;
          else cm->fc.hybrid_coef_probs[i][j][k][t] = prob;
        }
      }

John Koleszar's avatar
John Koleszar committed
360 361 362 363 364
  for (i = 0; i < BLOCK_TYPES_8X8; ++i)
    for (j = 0; j < COEF_BANDS; ++j)
      for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
        if (k >= 3 && ((i == 0 && j == 1) || (i > 0 && j == 0)))
          continue;
365
        vp9_tree_probs_from_distribution(
366
          MAX_ENTROPY_TOKENS, vp9_coef_encodings, vp9_coef_tree,
John Koleszar's avatar
John Koleszar committed
367 368 369 370 371 372 373 374 375 376 377 378 379 380
          coef_probs, branch_ct, cm->fc.coef_counts_8x8 [i][j][k],
          256, 1);
        for (t = 0; t < ENTROPY_NODES; ++t) {
          int prob;
          count = branch_ct[t][0] + branch_ct[t][1];
          count = count > count_sat ? count_sat : count;
          factor = (update_factor * count / count_sat);
          prob = ((int)cm->fc.pre_coef_probs_8x8[i][j][k][t] * (256 - factor) +
                  (int)coef_probs[t] * factor + 128) >> 8;
          if (prob <= 0) cm->fc.coef_probs_8x8[i][j][k][t] = 1;
          else if (prob > 255) cm->fc.coef_probs_8x8[i][j][k][t] = 255;
          else cm->fc.coef_probs_8x8[i][j][k][t] = prob;
        }
      }
Daniel Kang's avatar
Daniel Kang committed
381

382 383 384 385 386
  for (i = 0; i < BLOCK_TYPES_8X8; ++i)
    for (j = 0; j < COEF_BANDS; ++j)
      for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
        if (k >= 3 && ((i == 0 && j == 1) || (i > 0 && j == 0)))
          continue;
387
        vp9_tree_probs_from_distribution(
388
          MAX_ENTROPY_TOKENS, vp9_coef_encodings, vp9_coef_tree,
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
          coef_probs, branch_ct, cm->fc.hybrid_coef_counts_8x8 [i][j][k],
          256, 1);
        for (t = 0; t < ENTROPY_NODES; ++t) {
          int prob;
          count = branch_ct[t][0] + branch_ct[t][1];
          count = count > count_sat ? count_sat : count;
          factor = (update_factor * count / count_sat);
          prob = ((int)cm->fc.pre_hybrid_coef_probs_8x8[i][j][k][t] *
                  (256 - factor) +
                  (int)coef_probs[t] * factor + 128) >> 8;
          if (prob <= 0) cm->fc.hybrid_coef_probs_8x8[i][j][k][t] = 1;
          else if (prob > 255) cm->fc.hybrid_coef_probs_8x8[i][j][k][t] = 255;
          else cm->fc.hybrid_coef_probs_8x8[i][j][k][t] = prob;
        }
      }

Daniel Kang's avatar
Daniel Kang committed
405 406 407 408 409
  for (i = 0; i < BLOCK_TYPES_16X16; ++i)
    for (j = 0; j < COEF_BANDS; ++j)
      for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
        if (k >= 3 && ((i == 0 && j == 1) || (i > 0 && j == 0)))
          continue;
410
        vp9_tree_probs_from_distribution(
411
          MAX_ENTROPY_TOKENS, vp9_coef_encodings, vp9_coef_tree,
Daniel Kang's avatar
Daniel Kang committed
412 413 414 415 416 417
          coef_probs, branch_ct, cm->fc.coef_counts_16x16[i][j][k], 256, 1);
        for (t = 0; t < ENTROPY_NODES; ++t) {
          int prob;
          count = branch_ct[t][0] + branch_ct[t][1];
          count = count > count_sat ? count_sat : count;
          factor = (update_factor * count / count_sat);
418 419
          prob = ((int)cm->fc.pre_coef_probs_16x16[i][j][k][t] *
                  (256 - factor) +
Daniel Kang's avatar
Daniel Kang committed
420 421 422 423 424 425
                  (int)coef_probs[t] * factor + 128) >> 8;
          if (prob <= 0) cm->fc.coef_probs_16x16[i][j][k][t] = 1;
          else if (prob > 255) cm->fc.coef_probs_16x16[i][j][k][t] = 255;
          else cm->fc.coef_probs_16x16[i][j][k][t] = prob;
        }
      }
426 427 428 429 430 431

  for (i = 0; i < BLOCK_TYPES_16X16; ++i)
    for (j = 0; j < COEF_BANDS; ++j)
      for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
        if (k >= 3 && ((i == 0 && j == 1) || (i > 0 && j == 0)))
          continue;
432
        vp9_tree_probs_from_distribution(
433
          MAX_ENTROPY_TOKENS, vp9_coef_encodings, vp9_coef_tree,
434 435 436 437 438 439 440 441 442 443 444 445 446
          coef_probs, branch_ct, cm->fc.hybrid_coef_counts_16x16[i][j][k], 256, 1);
        for (t = 0; t < ENTROPY_NODES; ++t) {
          int prob;
          count = branch_ct[t][0] + branch_ct[t][1];
          count = count > count_sat ? count_sat : count;
          factor = (update_factor * count / count_sat);
          prob = ((int)cm->fc.pre_hybrid_coef_probs_16x16[i][j][k][t] * (256 - factor) +
                  (int)coef_probs[t] * factor + 128) >> 8;
          if (prob <= 0) cm->fc.hybrid_coef_probs_16x16[i][j][k][t] = 1;
          else if (prob > 255) cm->fc.hybrid_coef_probs_16x16[i][j][k][t] = 255;
          else cm->fc.hybrid_coef_probs_16x16[i][j][k][t] = prob;
        }
      }
447
}