vp9_entropymode.c 21.6 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
#include "vpx_mem/vpx_mem.h"
John Koleszar's avatar
John Koleszar committed
12

13
#include "vp9/common/vp9_alloccommon.h"
14
#include "vp9/common/vp9_onyxc_int.h"
15
#include "vp9/common/vp9_seg_common.h"
16

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
const vp9_prob vp9_kf_y_mode_prob[INTRA_MODES][INTRA_MODES][INTRA_MODES - 1] = {
  {  // above = dc
    { 137,  30,  42, 148, 151, 207,  70,  52,  91 },  // left = dc
    {  92,  45, 102, 136, 116, 180,  74,  90, 100 },  // left = v
    {  73,  32,  19, 187, 222, 215,  46,  34, 100 },  // left = h
    {  91,  30,  32, 116, 121, 186,  93,  86,  94 },  // left = d45
    {  72,  35,  36, 149,  68, 206,  68,  63, 105 },  // left = d135
    {  73,  31,  28, 138,  57, 124,  55, 122, 151 },  // left = d117
    {  67,  23,  21, 140, 126, 197,  40,  37, 171 },  // left = d153
    {  86,  27,  28, 128, 154, 212,  45,  43,  53 },  // left = d207
    {  74,  32,  27, 107,  86, 160,  63, 134, 102 },  // left = d63
    {  59,  67,  44, 140, 161, 202,  78,  67, 119 }   // left = tm
  }, {  // above = v
    {  63,  36, 126, 146, 123, 158,  60,  90,  96 },  // left = dc
    {  43,  46, 168, 134, 107, 128,  69, 142,  92 },  // left = v
    {  44,  29,  68, 159, 201, 177,  50,  57,  77 },  // left = h
    {  58,  38,  76, 114,  97, 172,  78, 133,  92 },  // left = d45
    {  46,  41,  76, 140,  63, 184,  69, 112,  57 },  // left = d135
    {  38,  32,  85, 140,  46, 112,  54, 151, 133 },  // left = d117
    {  39,  27,  61, 131, 110, 175,  44,  75, 136 },  // left = d153
    {  52,  30,  74, 113, 130, 175,  51,  64,  58 },  // left = d207
    {  47,  35,  80, 100,  74, 143,  64, 163,  74 },  // left = d63
    {  36,  61, 116, 114, 128, 162,  80, 125,  82 }   // left = tm
  }, {  // above = h
    {  82,  26,  26, 171, 208, 204,  44,  32, 105 },  // left = dc
    {  55,  44,  68, 166, 179, 192,  57,  57, 108 },  // left = v
    {  42,  26,  11, 199, 241, 228,  23,  15,  85 },  // left = h
    {  68,  42,  19, 131, 160, 199,  55,  52,  83 },  // left = d45
    {  58,  50,  25, 139, 115, 232,  39,  52, 118 },  // left = d135
    {  50,  35,  33, 153, 104, 162,  64,  59, 131 },  // left = d117
    {  44,  24,  16, 150, 177, 202,  33,  19, 156 },  // left = d153
    {  55,  27,  12, 153, 203, 218,  26,  27,  49 },  // left = d207
    {  53,  49,  21, 110, 116, 168,  59,  80,  76 },  // left = d63
    {  38,  72,  19, 168, 203, 212,  50,  50, 107 }   // left = tm
  }, {  // above = d45
    { 103,  26,  36, 129, 132, 201,  83,  80,  93 },  // left = dc
    {  59,  38,  83, 112, 103, 162,  98, 136,  90 },  // left = v
    {  62,  30,  23, 158, 200, 207,  59,  57,  50 },  // left = h
    {  67,  30,  29,  84,  86, 191, 102,  91,  59 },  // left = d45
    {  60,  32,  33, 112,  71, 220,  64,  89, 104 },  // left = d135
    {  53,  26,  34, 130,  56, 149,  84, 120, 103 },  // left = d117
    {  53,  21,  23, 133, 109, 210,  56,  77, 172 },  // left = d153
    {  77,  19,  29, 112, 142, 228,  55,  66,  36 },  // left = d207
    {  61,  29,  29,  93,  97, 165,  83, 175, 162 },  // left = d63
    {  47,  47,  43, 114, 137, 181, 100,  99,  95 }   // left = tm
  }, {  // above = d135
    {  69,  23,  29, 128,  83, 199,  46,  44, 101 },  // left = dc
    {  53,  40,  55, 139,  69, 183,  61,  80, 110 },  // left = v
    {  40,  29,  19, 161, 180, 207,  43,  24,  91 },  // left = h
    {  60,  34,  19, 105,  61, 198,  53,  64,  89 },  // left = d45
    {  52,  31,  22, 158,  40, 209,  58,  62,  89 },  // left = d135
    {  44,  31,  29, 147,  46, 158,  56, 102, 198 },  // left = d117
    {  35,  19,  12, 135,  87, 209,  41,  45, 167 },  // left = d153
    {  55,  25,  21, 118,  95, 215,  38,  39,  66 },  // left = d207
    {  51,  38,  25, 113,  58, 164,  70,  93,  97 },  // left = d63
    {  47,  54,  34, 146, 108, 203,  72, 103, 151 }   // left = tm
  }, {  // above = d117
    {  64,  19,  37, 156,  66, 138,  49,  95, 133 },  // left = dc
    {  46,  27,  80, 150,  55, 124,  55, 121, 135 },  // left = v
    {  36,  23,  27, 165, 149, 166,  54,  64, 118 },  // left = h
    {  53,  21,  36, 131,  63, 163,  60, 109,  81 },  // left = d45
    {  40,  26,  35, 154,  40, 185,  51,  97, 123 },  // left = d135
    {  35,  19,  34, 179,  19,  97,  48, 129, 124 },  // left = d117
    {  36,  20,  26, 136,  62, 164,  33,  77, 154 },  // left = d153
    {  45,  18,  32, 130,  90, 157,  40,  79,  91 },  // left = d207
    {  45,  26,  28, 129,  45, 129,  49, 147, 123 },  // left = d63
    {  38,  44,  51, 136,  74, 162,  57,  97, 121 }   // left = tm
  }, {  // above = d153
    {  75,  17,  22, 136, 138, 185,  32,  34, 166 },  // left = dc
    {  56,  39,  58, 133, 117, 173,  48,  53, 187 },  // left = v
    {  35,  21,  12, 161, 212, 207,  20,  23, 145 },  // left = h
    {  56,  29,  19, 117, 109, 181,  55,  68, 112 },  // left = d45
    {  47,  29,  17, 153,  64, 220,  59,  51, 114 },  // left = d135
    {  46,  16,  24, 136,  76, 147,  41,  64, 172 },  // left = d117
    {  34,  17,  11, 108, 152, 187,  13,  15, 209 },  // left = d153
    {  51,  24,  14, 115, 133, 209,  32,  26, 104 },  // left = d207
    {  55,  30,  18, 122,  79, 179,  44,  88, 116 },  // left = d63
    {  37,  49,  25, 129, 168, 164,  41,  54, 148 }   // left = tm
  }, {  // above = d207
    {  82,  22,  32, 127, 143, 213,  39,  41,  70 },  // left = dc
    {  62,  44,  61, 123, 105, 189,  48,  57,  64 },  // left = v
    {  47,  25,  17, 175, 222, 220,  24,  30,  86 },  // left = h
    {  68,  36,  17, 106, 102, 206,  59,  74,  74 },  // left = d45
    {  57,  39,  23, 151,  68, 216,  55,  63,  58 },  // left = d135
    {  49,  30,  35, 141,  70, 168,  82,  40, 115 },  // left = d117
    {  51,  25,  15, 136, 129, 202,  38,  35, 139 },  // left = d153
    {  68,  26,  16, 111, 141, 215,  29,  28,  28 },  // left = d207
    {  59,  39,  19, 114,  75, 180,  77, 104,  42 },  // left = d63
    {  40,  61,  26, 126, 152, 206,  61,  59,  93 }   // left = tm
  }, {  // above = d63
    {  78,  23,  39, 111, 117, 170,  74, 124,  94 },  // left = dc
    {  48,  34,  86, 101,  92, 146,  78, 179, 134 },  // left = v
    {  47,  22,  24, 138, 187, 178,  68,  69,  59 },  // left = h
    {  56,  25,  33, 105, 112, 187,  95, 177, 129 },  // left = d45
    {  48,  31,  27, 114,  63, 183,  82, 116,  56 },  // left = d135
    {  43,  28,  37, 121,  63, 123,  61, 192, 169 },  // left = d117
    {  42,  17,  24, 109,  97, 177,  56,  76, 122 },  // left = d153
    {  58,  18,  28, 105, 139, 182,  70,  92,  63 },  // left = d207
    {  46,  23,  32,  74,  86, 150,  67, 183,  88 },  // left = d63
    {  36,  38,  48,  92, 122, 165,  88, 137,  91 }   // left = tm
  }, {  // above = tm
    {  65,  70,  60, 155, 159, 199,  61,  60,  81 },  // left = dc
    {  44,  78, 115, 132, 119, 173,  71, 112,  93 },  // left = v
    {  39,  38,  21, 184, 227, 206,  42,  32,  64 },  // left = h
    {  58,  47,  36, 124, 137, 193,  80,  82,  78 },  // left = d45
    {  49,  50,  35, 144,  95, 205,  63,  78,  59 },  // left = d135
    {  41,  53,  52, 148,  71, 142,  65, 128,  51 },  // left = d117
    {  40,  36,  28, 143, 143, 202,  40,  55, 137 },  // left = d153
    {  52,  34,  29, 129, 183, 227,  42,  35,  43 },  // left = d207
    {  42,  44,  44, 104, 105, 164,  64, 130,  80 },  // left = d63
    {  43,  81,  53, 140, 169, 204,  68,  84,  72 }   // left = tm
  }
129
};
130

131 132 133 134 135 136 137 138 139 140 141
const vp9_prob vp9_kf_uv_mode_prob[INTRA_MODES][INTRA_MODES - 1] = {
  { 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 = d207
  { 116,  12,  64, 120, 140, 125,  49, 115, 121 },  // y = d63
  { 102,  19,  66, 162, 182, 122,  35,  59, 128 }   // y = tm
142 143
};

144 145 146 147 148
static const vp9_prob default_if_y_probs[BLOCK_SIZE_GROUPS][INTRA_MODES - 1] = {
  {  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
John Koleszar's avatar
John Koleszar committed
149 150
};

151 152 153 154 155 156 157 158 159 160 161
static const vp9_prob default_if_uv_probs[INTRA_MODES][INTRA_MODES - 1] = {
  { 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 = d207
  {  77,   7,  64, 116, 132, 122,  37, 126, 120 },  // y = d63
  { 101,  21, 107, 181, 192, 103,  19,  67, 125 }   // y = tm
162 163
};

164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
const vp9_prob vp9_kf_partition_probs[PARTITION_CONTEXTS]
                                     [PARTITION_TYPES - 1] = {
  // 8x8 -> 4x4
  { 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
  // 16x16 -> 8x8
  { 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
  // 32x32 -> 16x16
  { 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
  // 64x64 -> 32x32
  { 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
};

static const vp9_prob default_partition_probs[PARTITION_CONTEXTS]
189
                                             [PARTITION_TYPES - 1] = {
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
  // 8x8 -> 4x4
  { 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
  // 16x16 -> 8x8
  { 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
  // 32x32 -> 16x16
  { 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
  // 64x64 -> 32x32
  { 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
210 211
};

Dmitry Kovalev's avatar
Dmitry Kovalev committed
212
static const vp9_prob default_inter_mode_probs[INTER_MODE_CONTEXTS]
213
                                              [INTER_MODES - 1] = {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
214 215 216 217 218 219 220 221 222
  {2,       173,   34},  // 0 = both zero mv
  {7,       145,   85},  // 1 = one zero mv + one a predicted mv
  {7,       166,   63},  // 2 = two predicted mvs
  {7,       94,    66},  // 3 = one predicted/zero and one new mv
  {8,       64,    46},  // 4 = two new mvs
  {17,      81,    31},  // 5 = one intra neighbour + x
  {25,      29,    30},  // 6 = two intra neighbours
};

John Koleszar's avatar
John Koleszar committed
223
/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */
224
const vp9_tree_index vp9_intra_mode_tree[TREE_SIZE(INTRA_MODES)] = {
Yaowu Xu's avatar
Yaowu Xu committed
225 226 227 228 229 230 231 232
  -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 */
Dmitry Kovalev's avatar
Dmitry Kovalev committed
233
  -D153_PRED, -D207_PRED             /* 8 = D153_NODE */
John Koleszar's avatar
John Koleszar committed
234
};
235
struct vp9_token vp9_intra_mode_encodings[INTRA_MODES];
John Koleszar's avatar
John Koleszar committed
236

237
const vp9_tree_index vp9_inter_mode_tree[TREE_SIZE(INTER_MODES)] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
238 239 240 241
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};
242
struct vp9_token vp9_inter_mode_encodings[INTER_MODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
243

244
const vp9_tree_index vp9_partition_tree[TREE_SIZE(PARTITION_TYPES)] = {
245 246 247 248 249 250
  -PARTITION_NONE, 2,
  -PARTITION_HORZ, 4,
  -PARTITION_VERT, -PARTITION_SPLIT
};
struct vp9_token vp9_partition_encodings[PARTITION_TYPES];

Ronald S. Bultje's avatar
Ronald S. Bultje committed
251
static const vp9_prob default_intra_inter_p[INTRA_INTER_CONTEXTS] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
252
  9, 102, 187, 225
Ronald S. Bultje's avatar
Ronald S. Bultje committed
253 254 255
};

static const vp9_prob default_comp_inter_p[COMP_INTER_CONTEXTS] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
256
  239, 183, 119,  96,  41
Ronald S. Bultje's avatar
Ronald S. Bultje committed
257 258 259
};

static const vp9_prob default_comp_ref_p[REF_CONTEXTS] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
260
  50, 126, 123, 221, 226
Ronald S. Bultje's avatar
Ronald S. Bultje committed
261 262 263
};

static const vp9_prob default_single_ref_p[REF_CONTEXTS][2] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
264 265 266 267 268
  {  33,  16 },
  {  77,  74 },
  { 142, 142 },
  { 172, 170 },
  { 238, 247 }
Ronald S. Bultje's avatar
Ronald S. Bultje committed
269 270
};

271 272 273 274 275 276 277 278 279
static const struct tx_probs default_tx_probs = {
  { { 3, 136, 37 },
    { 5, 52,  13 } },

  { { 20, 152 },
    { 15, 101 } },

  { { 100 },
    { 66  } }
280 281
};

282
void tx_counts_to_branch_counts_32x32(const unsigned int *tx_count_32x32p,
283 284 285 286 287 288 289 290 291 292 293 294
                                      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];
}

295
void tx_counts_to_branch_counts_16x16(const unsigned int *tx_count_16x16p,
296 297
                                      unsigned int (*ct_16x16p)[2]) {
  ct_16x16p[0][0] = tx_count_16x16p[TX_4X4];
Dmitry Kovalev's avatar
Dmitry Kovalev committed
298
  ct_16x16p[0][1] = tx_count_16x16p[TX_8X8] + tx_count_16x16p[TX_16X16];
299 300 301 302
  ct_16x16p[1][0] = tx_count_16x16p[TX_8X8];
  ct_16x16p[1][1] = tx_count_16x16p[TX_16X16];
}

303
void tx_counts_to_branch_counts_8x8(const unsigned int *tx_count_8x8p,
304
                                    unsigned int (*ct_8x8p)[2]) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
305 306
  ct_8x8p[0][0] = tx_count_8x8p[TX_4X4];
  ct_8x8p[0][1] = tx_count_8x8p[TX_8X8];
307
}
308

309
static const vp9_prob default_mbskip_probs[MBSKIP_CONTEXTS] = {
Deb Mukherjee's avatar
Deb Mukherjee committed
310 311 312
  192, 128, 64
};

313 314
static const vp9_prob default_switchable_interp_prob[SWITCHABLE_FILTER_CONTEXTS]
                                                    [SWITCHABLE_FILTERS - 1] = {
315 316 317 318 319 320
  { 235, 162, },
  { 36, 255, },
  { 34, 3, },
  { 149, 144, },
};

Dmitry Kovalev's avatar
Dmitry Kovalev committed
321 322 323
void vp9_init_mbmode_probs(VP9_COMMON *cm) {
  vp9_copy(cm->fc.uv_mode_prob, default_if_uv_probs);
  vp9_copy(cm->fc.y_mode_prob, default_if_y_probs);
324 325
  vp9_copy(cm->fc.switchable_interp_prob, default_switchable_interp_prob);
  vp9_copy(cm->fc.partition_prob, default_partition_probs);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
326 327 328 329
  vp9_copy(cm->fc.intra_inter_prob, default_intra_inter_p);
  vp9_copy(cm->fc.comp_inter_prob, default_comp_inter_p);
  vp9_copy(cm->fc.comp_ref_prob, default_comp_ref_p);
  vp9_copy(cm->fc.single_ref_prob, default_single_ref_p);
330 331
  cm->fc.tx_probs = default_tx_probs;
  vp9_copy(cm->fc.mbskip_probs, default_mbskip_probs);
John Koleszar's avatar
John Koleszar committed
332 333
}

334 335
const vp9_tree_index vp9_switchable_interp_tree
                         [TREE_SIZE(SWITCHABLE_FILTERS)] = {
336 337
  -EIGHTTAP, 2,
  -EIGHTTAP_SMOOTH, -EIGHTTAP_SHARP
338
};
339
struct vp9_token vp9_switchable_interp_encodings[SWITCHABLE_FILTERS];
340

341
void vp9_entropy_mode_init() {
342
  vp9_tokens_from_tree(vp9_intra_mode_encodings, vp9_intra_mode_tree);
343 344
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);
345
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
346 347
  vp9_tokens_from_tree_offset(vp9_inter_mode_encodings,
                              vp9_inter_mode_tree, NEARESTMV);
John Koleszar's avatar
John Koleszar committed
348
}
Yaowu Xu's avatar
Yaowu Xu committed
349

350 351
#define COUNT_SAT 20
#define MAX_UPDATE_FACTOR 128
352

353 354
static int update_ct(vp9_prob pre_prob, const unsigned int ct[2]) {
  return merge_probs(pre_prob, ct, COUNT_SAT, MAX_UPDATE_FACTOR);
355 356
}

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

  assert(n_modes - 1 < MAX_PROBS);
367
  vp9_tree_probs_from_distribution(tree, branch_ct, cnt, tok0_offset);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
368
  for (t = 0; t < n_modes - 1; ++t)
369
    dst_probs[t] = update_ct(pre_probs[t], branch_ct[t]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
370 371
}

372
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
373
  int i, j;
374
  FRAME_CONTEXT *fc = &cm->fc;
375 376
  const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
  const FRAME_COUNTS *counts = &cm->counts;
377

Ronald S. Bultje's avatar
Ronald S. Bultje committed
378
  for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
379 380
    fc->intra_inter_prob[i] = update_ct(pre_fc->intra_inter_prob[i],
                                        counts->intra_inter[i]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
381
  for (i = 0; i < COMP_INTER_CONTEXTS; i++)
382 383
    fc->comp_inter_prob[i] = update_ct(pre_fc->comp_inter_prob[i],
                                       counts->comp_inter[i]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
384
  for (i = 0; i < REF_CONTEXTS; i++)
385 386
    fc->comp_ref_prob[i] = update_ct(pre_fc->comp_ref_prob[i],
                                     counts->comp_ref[i]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
387 388
  for (i = 0; i < REF_CONTEXTS; i++)
    for (j = 0; j < 2; j++)
389 390
      fc->single_ref_prob[i][j] = update_ct(pre_fc->single_ref_prob[i][j],
                                            counts->single_ref[i][j]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
391

392
  for (i = 0; i < INTER_MODE_CONTEXTS; i++)
393
    update_mode_probs(INTER_MODES, vp9_inter_mode_tree,
394 395 396
                      counts->inter_mode[i], pre_fc->inter_mode_probs[i],
                      fc->inter_mode_probs[i], NEARESTMV);

397
  for (i = 0; i < BLOCK_SIZE_GROUPS; i++)
398
    update_mode_probs(INTRA_MODES, vp9_intra_mode_tree,
399
                      counts->y_mode[i], pre_fc->y_mode_prob[i],
400
                      fc->y_mode_prob[i], 0);
401

402 403
  for (i = 0; i < INTRA_MODES; ++i)
    update_mode_probs(INTRA_MODES, vp9_intra_mode_tree,
404
                      counts->uv_mode[i], pre_fc->uv_mode_prob[i],
405 406
                      fc->uv_mode_prob[i], 0);

407
  for (i = 0; i < PARTITION_CONTEXTS; i++)
408 409
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree, counts->partition[i],
                      pre_fc->partition_prob[i], fc->partition_prob[i], 0);
410 411

  if (cm->mcomp_filter_type == SWITCHABLE) {
412
    for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++)
413
      update_mode_probs(SWITCHABLE_FILTERS, vp9_switchable_interp_tree,
414
                        counts->switchable_interp[i],
415
                        pre_fc->switchable_interp_prob[i],
416 417
                        fc->switchable_interp_prob[i], 0);
  }
418

419
  if (cm->tx_mode == TX_MODE_SELECT) {
420
    int j;
421 422 423
    unsigned int branch_ct_8x8p[TX_SIZES - 3][2];
    unsigned int branch_ct_16x16p[TX_SIZES - 2][2];
    unsigned int branch_ct_32x32p[TX_SIZES - 1][2];
424

425
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
426
      tx_counts_to_branch_counts_8x8(counts->tx.p8x8[i], branch_ct_8x8p);
427
      for (j = 0; j < TX_SIZES - 3; ++j)
428 429
        fc->tx_probs.p8x8[i][j] = update_ct(pre_fc->tx_probs.p8x8[i][j],
                                            branch_ct_8x8p[j]);
430

Dmitry Kovalev's avatar
Dmitry Kovalev committed
431
      tx_counts_to_branch_counts_16x16(counts->tx.p16x16[i], branch_ct_16x16p);
432
      for (j = 0; j < TX_SIZES - 2; ++j)
433 434
        fc->tx_probs.p16x16[i][j] = update_ct(pre_fc->tx_probs.p16x16[i][j],
                                              branch_ct_16x16p[j]);
435

Dmitry Kovalev's avatar
Dmitry Kovalev committed
436
      tx_counts_to_branch_counts_32x32(counts->tx.p32x32[i], branch_ct_32x32p);
437
      for (j = 0; j < TX_SIZES - 1; ++j)
438 439
        fc->tx_probs.p32x32[i][j] = update_ct(pre_fc->tx_probs.p32x32[i][j],
                                              branch_ct_32x32p[j]);
440 441
    }
  }
442

Deb Mukherjee's avatar
Deb Mukherjee committed
443
  for (i = 0; i < MBSKIP_CONTEXTS; ++i)
444
    fc->mbskip_probs[i] = update_ct(pre_fc->mbskip_probs[i], counts->mbskip[i]);
445
}
446

447 448 449
static void set_default_lf_deltas(struct loopfilter *lf) {
  lf->mode_ref_delta_enabled = 1;
  lf->mode_ref_delta_update = 1;
450

451 452 453 454
  lf->ref_deltas[INTRA_FRAME] = 1;
  lf->ref_deltas[LAST_FRAME] = 0;
  lf->ref_deltas[GOLDEN_FRAME] = -1;
  lf->ref_deltas[ALTREF_FRAME] = -1;
455

456 457
  lf->mode_deltas[0] = 0;
  lf->mode_deltas[1] = 0;
458 459
}

460
void vp9_setup_past_independence(VP9_COMMON *cm) {
461 462
  // Reset the segment feature data to the default stats:
  // Features disabled, 0, with delta coding (Default state).
463
  struct loopfilter *const lf = &cm->lf;
464

465
  int i;
466 467
  vp9_clearall_segfeatures(&cm->seg);
  cm->seg.abs_delta = SEGMENT_DELTADATA;
468
  if (cm->last_frame_seg_map)
469
    vpx_memset(cm->last_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
470

471
  // Reset the mode ref deltas for loop filter
472 473 474
  vp9_zero(lf->last_ref_deltas);
  vp9_zero(lf->last_mode_deltas);
  set_default_lf_deltas(lf);
475 476

  // To force update of the sharpness
477
  lf->last_sharpness_level = -1;
478

479 480 481 482
  vp9_default_coef_probs(cm);
  vp9_init_mbmode_probs(cm);
  vp9_init_mv_probs(cm);
  vp9_copy(cm->fc.inter_mode_probs, default_inter_mode_probs);
483

484 485
  if (cm->frame_type == KEY_FRAME ||
      cm->error_resilient_mode || cm->reset_frame_context == 3) {
Adrian Grange's avatar
Adrian Grange committed
486 487
    // Reset all frame contexts.
    for (i = 0; i < NUM_FRAME_CONTEXTS; ++i)
488
      cm->frame_contexts[i] = cm->fc;
Adrian Grange's avatar
Adrian Grange committed
489 490
  } else if (cm->reset_frame_context == 2) {
    // Reset only the frame context specified in the frame header.
491
    cm->frame_contexts[cm->frame_context_idx] = cm->fc;
Adrian Grange's avatar
Adrian Grange committed
492
  }
493 494

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

  vp9_update_mode_info_border(cm, cm->mip);
500 501
  vp9_update_mode_info_border(cm, cm->prev_mip);

502
  vp9_zero(cm->ref_frame_sign_bias);
503 504 505

  cm->frame_context_idx = 0;
}