vp9_entropymode.c 21.9 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
static const vp9_prob default_partition_probs[FRAME_TYPES][PARTITION_CONTEXTS]
165
                                             [PARTITION_TYPES - 1] = {
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 198 199 200 201 202 203 204 205 206 207
  {  // frame_type = keyframe
    // 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
  }, {  // frame_type = interframe
    // 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
208 209 210
  }
};

Dmitry Kovalev's avatar
Dmitry Kovalev committed
211
static const vp9_prob default_inter_mode_probs[INTER_MODE_CONTEXTS]
212
                                              [INTER_MODES - 1] = {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
213 214 215 216 217 218 219 220 221
  {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
222
/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */
223
const vp9_tree_index vp9_intra_mode_tree[TREE_SIZE(INTRA_MODES)] = {
Yaowu Xu's avatar
Yaowu Xu committed
224 225 226 227 228 229 230 231
  -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
232
  -D153_PRED, -D207_PRED             /* 8 = D153_NODE */
John Koleszar's avatar
John Koleszar committed
233
};
234
struct vp9_token vp9_intra_mode_encodings[INTRA_MODES];
John Koleszar's avatar
John Koleszar committed
235

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

243
const vp9_tree_index vp9_partition_tree[TREE_SIZE(PARTITION_TYPES)] = {
244 245 246 247 248 249
  -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
250
static const vp9_prob default_intra_inter_p[INTRA_INTER_CONTEXTS] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
251
  9, 102, 187, 225
Ronald S. Bultje's avatar
Ronald S. Bultje committed
252 253 254
};

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

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

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

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

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

  { { 100 },
    { 66  } }
279 280
};

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

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

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

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

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

Dmitry Kovalev's avatar
Dmitry Kovalev committed
320 321 322
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);
323 324
  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
325 326 327 328
  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);
329 330
  cm->fc.tx_probs = default_tx_probs;
  vp9_copy(cm->fc.mbskip_probs, default_mbskip_probs);
John Koleszar's avatar
John Koleszar committed
331 332
}

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

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

349 350
#define COUNT_SAT 20
#define MAX_UPDATE_FACTOR 128
351

352 353
static int update_ct(vp9_prob pre_prob, vp9_prob prob,
                     const unsigned int ct[2]) {
354
  return merge_probs(pre_prob, prob, ct, COUNT_SAT, MAX_UPDATE_FACTOR);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
355 356
}

357
static int update_ct2(vp9_prob pre_prob, const unsigned int ct[2]) {
358
  return merge_probs2(pre_prob, ct, COUNT_SAT, MAX_UPDATE_FACTOR);
359 360
}

361
static void update_mode_probs(int n_modes,
362 363 364
                              const vp9_tree_index *tree,
                              const unsigned int *cnt,
                              const vp9_prob *pre_probs, vp9_prob *dst_probs,
365
                              unsigned int tok0_offset) {
366 367 368
#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
369
  int t;
370 371

  assert(n_modes - 1 < MAX_PROBS);
372
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
373
  for (t = 0; t < n_modes - 1; ++t)
374
    dst_probs[t] = update_ct(pre_probs[t], probs[t], branch_ct[t]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
375 376
}

377
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
378
  int i, j;
379
  FRAME_CONTEXT *fc = &cm->fc;
380 381
  const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx];
  const FRAME_COUNTS *counts = &cm->counts;
382

Ronald S. Bultje's avatar
Ronald S. Bultje committed
383
  for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
384
    fc->intra_inter_prob[i] = update_ct2(pre_fc->intra_inter_prob[i],
385
                                         counts->intra_inter[i]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
386
  for (i = 0; i < COMP_INTER_CONTEXTS; i++)
387
    fc->comp_inter_prob[i] = update_ct2(pre_fc->comp_inter_prob[i],
388
                                        counts->comp_inter[i]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
389
  for (i = 0; i < REF_CONTEXTS; i++)
390
    fc->comp_ref_prob[i] = update_ct2(pre_fc->comp_ref_prob[i],
391
                                      counts->comp_ref[i]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
392 393
  for (i = 0; i < REF_CONTEXTS; i++)
    for (j = 0; j < 2; j++)
394
      fc->single_ref_prob[i][j] = update_ct2(pre_fc->single_ref_prob[i][j],
395
                                             counts->single_ref[i][j]);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
396

397
  for (i = 0; i < INTER_MODE_CONTEXTS; i++)
398
    update_mode_probs(INTER_MODES, vp9_inter_mode_tree,
399 400 401
                      counts->inter_mode[i], pre_fc->inter_mode_probs[i],
                      fc->inter_mode_probs[i], NEARESTMV);

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

407 408
  for (i = 0; i < INTRA_MODES; ++i)
    update_mode_probs(INTRA_MODES, vp9_intra_mode_tree,
409
                      counts->uv_mode[i], pre_fc->uv_mode_prob[i],
410 411
                      fc->uv_mode_prob[i], 0);

412
  for (i = 0; i < PARTITION_CONTEXTS; i++)
413
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
414
                      counts->partition[i],
415
                      pre_fc->partition_prob[INTER_FRAME][i],
416
                      fc->partition_prob[INTER_FRAME][i], 0);
417 418

  if (cm->mcomp_filter_type == SWITCHABLE) {
419
    for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++)
420
      update_mode_probs(SWITCHABLE_FILTERS, vp9_switchable_interp_tree,
421
                        counts->switchable_interp[i],
422
                        pre_fc->switchable_interp_prob[i],
423 424
                        fc->switchable_interp_prob[i], 0);
  }
425

426
  if (cm->tx_mode == TX_MODE_SELECT) {
427
    int j;
428 429 430
    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];
431

432
    for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
433
      tx_counts_to_branch_counts_8x8(counts->tx.p8x8[i], branch_ct_8x8p);
434
      for (j = 0; j < TX_SIZES - 3; ++j)
435 436
        fc->tx_probs.p8x8[i][j] = update_ct2(pre_fc->tx_probs.p8x8[i][j],
                                             branch_ct_8x8p[j]);
437

Dmitry Kovalev's avatar
Dmitry Kovalev committed
438
      tx_counts_to_branch_counts_16x16(counts->tx.p16x16[i], branch_ct_16x16p);
439
      for (j = 0; j < TX_SIZES - 2; ++j)
440 441
        fc->tx_probs.p16x16[i][j] = update_ct2(pre_fc->tx_probs.p16x16[i][j],
                                               branch_ct_16x16p[j]);
442

Dmitry Kovalev's avatar
Dmitry Kovalev committed
443
      tx_counts_to_branch_counts_32x32(counts->tx.p32x32[i], branch_ct_32x32p);
444
      for (j = 0; j < TX_SIZES - 1; ++j)
445 446
        fc->tx_probs.p32x32[i][j] = update_ct2(pre_fc->tx_probs.p32x32[i][j],
                                               branch_ct_32x32p[j]);
447 448
    }
  }
449

Deb Mukherjee's avatar
Deb Mukherjee committed
450
  for (i = 0; i < MBSKIP_CONTEXTS; ++i)
451
    fc->mbskip_probs[i] = update_ct2(pre_fc->mbskip_probs[i],
452
                                     counts->mbskip[i]);
453
}
454

455 456 457
static void set_default_lf_deltas(struct loopfilter *lf) {
  lf->mode_ref_delta_enabled = 1;
  lf->mode_ref_delta_update = 1;
458

459 460 461 462
  lf->ref_deltas[INTRA_FRAME] = 1;
  lf->ref_deltas[LAST_FRAME] = 0;
  lf->ref_deltas[GOLDEN_FRAME] = -1;
  lf->ref_deltas[ALTREF_FRAME] = -1;
463

464 465
  lf->mode_deltas[0] = 0;
  lf->mode_deltas[1] = 0;
466 467
}

468
void vp9_setup_past_independence(VP9_COMMON *cm) {
469 470
  // Reset the segment feature data to the default stats:
  // Features disabled, 0, with delta coding (Default state).
471
  struct loopfilter *const lf = &cm->lf;
472

473
  int i;
474 475
  vp9_clearall_segfeatures(&cm->seg);
  cm->seg.abs_delta = SEGMENT_DELTADATA;
476
  if (cm->last_frame_seg_map)
477
    vpx_memset(cm->last_frame_seg_map, 0, (cm->mi_rows * cm->mi_cols));
478

479
  // Reset the mode ref deltas for loop filter
480 481 482
  vp9_zero(lf->last_ref_deltas);
  vp9_zero(lf->last_mode_deltas);
  set_default_lf_deltas(lf);
483 484

  // To force update of the sharpness
485
  lf->last_sharpness_level = -1;
486

487 488 489 490
  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);
491

492 493
  if (cm->frame_type == KEY_FRAME ||
      cm->error_resilient_mode || cm->reset_frame_context == 3) {
Adrian Grange's avatar
Adrian Grange committed
494 495
    // Reset all frame contexts.
    for (i = 0; i < NUM_FRAME_CONTEXTS; ++i)
496
      cm->frame_contexts[i] = cm->fc;
Adrian Grange's avatar
Adrian Grange committed
497 498
  } else if (cm->reset_frame_context == 2) {
    // Reset only the frame context specified in the frame header.
499
    cm->frame_contexts[cm->frame_context_idx] = cm->fc;
Adrian Grange's avatar
Adrian Grange committed
500
  }
501 502

  vpx_memset(cm->prev_mip, 0,
503
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
504
  vpx_memset(cm->mip, 0,
505
             cm->mode_info_stride * (cm->mi_rows + 1) * sizeof(MODE_INFO));
506 507

  vp9_update_mode_info_border(cm, cm->mip);
508 509
  vp9_update_mode_info_border(cm, cm->prev_mip);

510
  vp9_zero(cm->ref_frame_sign_bias);
511 512 513

  cm->frame_context_idx = 0;
}