vp9_entropymode.c 24.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
 */


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

16

17
static const unsigned int kf_y_mode_cts[8][VP9_YMODES] = {
John Koleszar's avatar
John Koleszar committed
18 19 20 21 22 23 24 25 26
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 BPRED */
  {12,  6,  5,  5,  5,  5,  5,  5,  5,  2, 22, 200},
  {25, 13, 13,  7,  7,  7,  7,  7,  7,  6, 27, 160},
  {31, 17, 18,  8,  8,  8,  8,  8,  8,  9, 26, 139},
  {40, 22, 23,  8,  8,  8,  8,  8,  8, 12, 27, 116},
  {53, 26, 28,  8,  8,  8,  8,  8,  8, 13, 26,  94},
  {68, 33, 35,  8,  8,  8,  8,  8,  8, 17, 20,  68},
  {78, 38, 38,  8,  8,  8,  8,  8,  8, 19, 16,  52},
  {89, 42, 42,  8,  8,  8,  8,  8,  8, 21, 12,  34},
27
};
28

29
static const unsigned int y_mode_cts  [VP9_YMODES] = {
John Koleszar's avatar
John Koleszar committed
30
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 BPRED */
Deb Mukherjee's avatar
Deb Mukherjee committed
31 32
  98, 19, 15, 14, 14, 14, 14, 12, 12, 13, 16, 70
};
33

34
static const unsigned int uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
35 36 37 38 39 40 41 42 43 44 45 46 47
  /* DC   V   H  D45 135 117 153 D27 D63 TM */
  { 200, 15, 15, 10, 10, 10, 10, 10, 10,  6}, /* DC */
  { 130, 75, 10, 10, 10, 10, 10, 10, 10,  6}, /* V */
  { 130, 10, 75, 10, 10, 10, 10, 10, 10,  6}, /* H */
  { 130, 15, 10, 75, 10, 10, 10, 10, 10,  6}, /* D45 */
  { 150, 15, 10, 10, 75, 10, 10, 10, 10,  6}, /* D135 */
  { 150, 15, 10, 10, 10, 75, 10, 10, 10,  6}, /* D117 */
  { 150, 15, 10, 10, 10, 10, 75, 10, 10,  6}, /* D153 */
  { 150, 15, 10, 10, 10, 10, 10, 75, 10,  6}, /* D27 */
  { 150, 15, 10, 10, 10, 10, 10, 10, 75,  6}, /* D63 */
  { 160, 30, 30, 10, 10, 10, 10, 10, 10, 16}, /* TM */
  { 132, 46, 40, 10, 10, 10, 10, 10, 10, 18}, /* i8x8 - never used */
  { 150, 35, 41, 10, 10, 10, 10, 10, 10, 10}, /* BPRED */
48 49
};

50
static const unsigned int i8x8_mode_cts  [VP9_I8X8_MODES] = {
John Koleszar's avatar
John Koleszar committed
51
  /* DC V   H D45 135 117 153 D27 D63  TM */
Deb Mukherjee's avatar
Deb Mukherjee committed
52 53
  73, 49, 61, 30, 30, 30, 30, 30, 30, 13
};
54

55
static const unsigned int kf_uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
56 57 58 59 60 61 62 63 64 65 66 67 68
  // DC   V   H  D45 135 117 153 D27 D63 TM
  { 160, 24, 24, 20, 20, 20, 20, 20, 20,  8}, /* DC */
  { 102, 64, 30, 20, 20, 20, 20, 20, 20, 10}, /* V */
  { 102, 30, 64, 20, 20, 20, 20, 20, 20, 10}, /* H */
  { 102, 33, 20, 64, 20, 20, 20, 20, 20, 14}, /* D45 */
  { 102, 33, 20, 20, 64, 20, 20, 20, 20, 14}, /* D135 */
  { 122, 33, 20, 20, 20, 64, 20, 20, 20, 14}, /* D117 */
  { 102, 33, 20, 20, 20, 20, 64, 20, 20, 14}, /* D153 */
  { 102, 33, 20, 20, 20, 20, 20, 64, 20, 14}, /* D27 */
  { 102, 33, 20, 20, 20, 20, 20, 20, 64, 14}, /* D63 */
  { 132, 36, 30, 20, 20, 20, 20, 20, 20, 18}, /* TM */
  { 122, 41, 35, 20, 20, 20, 20, 20, 20, 18}, /* i8x8 - never used */
  { 122, 41, 35, 20, 20, 20, 20, 20, 20, 18}, /* BPRED */
69
};
John Koleszar's avatar
John Koleszar committed
70

71 72 73 74 75 76 77 78 79 80 81 82 83
static const unsigned int bmode_cts[VP9_NKF_BINTRAMODES] = {
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
  /* DC    TM     VE     HE   CONTEXT */
  43891, 17694, 10036, 3920, 20000
#elif CONTEXT_PRED_REPLACEMENTS == 4
  /* DC    TM     VE     HE   LD    RD   CONTEXT */
  43891, 17694, 10036, 3920, 3363, 2546, 14000
#elif CONTEXT_PRED_REPLACEMENTS == 0
  /* DC    TM     VE     HE   LD    RD   VR    VL    HD    HU   CONTEXT */
  43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723, 50000
#endif
#else
John Koleszar's avatar
John Koleszar committed
84 85
  /* DC    TM     VE     HE   LD    RD    VR    VL    HD    HU */
  43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723
86
#endif
John Koleszar's avatar
John Koleszar committed
87 88
};

John Koleszar's avatar
John Koleszar committed
89 90 91 92 93 94
typedef enum {
  SUBMVREF_NORMAL,
  SUBMVREF_LEFT_ZED,
  SUBMVREF_ABOVE_ZED,
  SUBMVREF_LEFT_ABOVE_SAME,
  SUBMVREF_LEFT_ABOVE_ZED
John Koleszar's avatar
John Koleszar committed
95 96
} sumvfref_t;

97
int vp9_mv_cont(const int_mv *l, const int_mv *a) {
John Koleszar's avatar
John Koleszar committed
98 99 100
  int lez = (l->as_int == 0);
  int aez = (a->as_int == 0);
  int lea = (l->as_int == a->as_int);
John Koleszar's avatar
John Koleszar committed
101

John Koleszar's avatar
John Koleszar committed
102 103
  if (lea && lez)
    return SUBMVREF_LEFT_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
104

John Koleszar's avatar
John Koleszar committed
105 106
  if (lea)
    return SUBMVREF_LEFT_ABOVE_SAME;
John Koleszar's avatar
John Koleszar committed
107

John Koleszar's avatar
John Koleszar committed
108 109
  if (aez)
    return SUBMVREF_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
110

John Koleszar's avatar
John Koleszar committed
111 112
  if (lez)
    return SUBMVREF_LEFT_ZED;
John Koleszar's avatar
John Koleszar committed
113

John Koleszar's avatar
John Koleszar committed
114
  return SUBMVREF_NORMAL;
John Koleszar's avatar
John Koleszar committed
115 116
}

117
const vp9_prob vp9_sub_mv_ref_prob [VP9_SUBMVREFS - 1] = { 180, 162, 25};
John Koleszar's avatar
John Koleszar committed
118

119
const vp9_prob vp9_sub_mv_ref_prob2 [SUBMVREF_COUNT][VP9_SUBMVREFS - 1] = {
John Koleszar's avatar
John Koleszar committed
120 121 122 123 124
  { 147, 136, 18 },
  { 106, 145, 1  },
  { 179, 121, 1  },
  { 223, 1, 34 },
  { 208, 1, 1  }
John Koleszar's avatar
John Koleszar committed
125 126
};

127
vp9_mbsplit vp9_mbsplits [VP9_NUMMBSPLITS] = {
John Koleszar's avatar
John Koleszar committed
128 129 130 131 132
  {
    0,  0,  0,  0,
    0,  0,  0,  0,
    1,  1,  1,  1,
    1,  1,  1,  1,
133
  }, {
John Koleszar's avatar
John Koleszar committed
134 135 136 137
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
138
  }, {
John Koleszar's avatar
John Koleszar committed
139 140 141 142
    0,  0,  1,  1,
    0,  0,  1,  1,
    2,  2,  3,  3,
    2,  2,  3,  3,
143
  }, {
John Koleszar's avatar
John Koleszar committed
144 145 146 147 148
    0,  1,  2,  3,
    4,  5,  6,  7,
    8,  9,  10, 11,
    12, 13, 14, 15,
  },
John Koleszar's avatar
John Koleszar committed
149 150
};

151
const int vp9_mbsplit_count [VP9_NUMMBSPLITS] = { 2, 2, 4, 16};
John Koleszar's avatar
John Koleszar committed
152

153
const vp9_prob vp9_mbsplit_probs [VP9_NUMMBSPLITS - 1] = { 110, 111, 150};
John Koleszar's avatar
John Koleszar committed
154 155 156

/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */

157 158 159 160 161 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 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
const vp9_tree_index vp9_kf_bmode_tree[VP9_KF_BINTRAMODES * 2 - 2] = {
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
  -B_VE_PRED, 6,                      /* 2 = VE_NODE */
  8, 12,                              /* 3 = COM_NODE */
  -B_HE_PRED, 10,                     /* 4 = HE_NODE */
  -B_RD_PRED, -B_VR_PRED,             /* 5 = RD_NODE */
  -B_LD_PRED, 14,                     /* 6 = LD_NODE */
  -B_VL_PRED, 16,                     /* 7 = VL_NODE */
  -B_HD_PRED, -B_HU_PRED              /* 8 = HD_NODE */
};

const vp9_tree_index vp9_bmode_tree[VP9_NKF_BINTRAMODES * 2 - 2] = {
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
  -B_DC_PRED, 2,
  -B_TM_PRED, 4,
  6, -(B_CONTEXT_PRED - CONTEXT_PRED_REPLACEMENTS),
  -B_VE_PRED, -B_HE_PRED
#elif CONTEXT_PRED_REPLACEMENTS == 4
  -B_DC_PRED, 2,
  -B_TM_PRED, 4,
  6, 8,
  -B_VE_PRED, -B_HE_PRED,
  10, -(B_CONTEXT_PRED - CONTEXT_PRED_REPLACEMENTS),
  -B_RD_PRED, -B_LD_PRED,
#elif CONTEXT_PRED_REPLACEMENTS == 0
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
  -B_VE_PRED, 6,                      /* 2 = VE_NODE */
  8, 12,                              /* 3 = COM_NODE */
  -B_HE_PRED, 10,                     /* 4 = HE_NODE */
  -B_RD_PRED, -B_VR_PRED,             /* 5 = RD_NODE */
  -B_LD_PRED, 14,                     /* 6 = LD_NODE */
  -B_VL_PRED, 16,                     /* 7 = VL_NODE */
  -B_HD_PRED, 18,
  -B_HU_PRED, -B_CONTEXT_PRED
#endif
#else
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
  -B_VE_PRED, 6,                      /* 2 = VE_NODE */
  8, 12,                              /* 3 = COM_NODE */
  -B_HE_PRED, 10,                     /* 4 = HE_NODE */
  -B_RD_PRED, -B_VR_PRED,             /* 5 = RD_NODE */
  -B_LD_PRED, 14,                     /* 6 = LD_NODE */
  -B_VL_PRED, 16,                     /* 7 = VL_NODE */
  -B_HD_PRED, -B_HU_PRED              /* 8 = HD_NODE */
#endif
John Koleszar's avatar
John Koleszar committed
206 207
};

208 209
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
210
const vp9_tree_index vp9_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
211 212 213 214 215 216 217 218 219 220 221
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  16, 18,
  -V_PRED, -H_PRED,
  -TM_PRED, 20,
  -B_PRED, -I8X8_PRED
222 223
};

224
const vp9_tree_index vp9_kf_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
225 226 227 228 229 230 231 232 233 234 235
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  16, 18,
  -V_PRED, -H_PRED,
  -TM_PRED, 20,
  -B_PRED, -I8X8_PRED
236 237
};

238
const vp9_tree_index vp9_i8x8_mode_tree[VP9_I8X8_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
239 240 241 242 243 244 245 246 247
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  -V_PRED, 16,
  -H_PRED, -TM_PRED
248 249
};

250
const vp9_tree_index vp9_uv_mode_tree[VP9_UV_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
251 252 253 254 255 256 257 258 259
  2, 14,
  -DC_PRED, 4,
  6, 8,
  -D45_PRED, -D135_PRED,
  10, 12,
  -D117_PRED, -D153_PRED,
  -D27_PRED, -D63_PRED,
  -V_PRED, 16,
  -H_PRED, -TM_PRED
260 261
};

262
const vp9_tree_index vp9_mbsplit_tree[6] = {
263 264 265
  -PARTITIONING_4X4,   2,
  -PARTITIONING_8X8,   4,
  -PARTITIONING_16X8, -PARTITIONING_8X16,
John Koleszar's avatar
John Koleszar committed
266 267
};

268
const vp9_tree_index vp9_mv_ref_tree[8] = {
John Koleszar's avatar
John Koleszar committed
269 270 271 272
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, 6,
  -NEWMV, -SPLITMV
John Koleszar's avatar
John Koleszar committed
273 274
};

Ronald S. Bultje's avatar
Ronald S. Bultje committed
275
#if CONFIG_SUPERBLOCKS
276
const vp9_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
277 278 279 280 281 282
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};
#endif

283
const vp9_tree_index vp9_sub_mv_ref_tree[6] = {
John Koleszar's avatar
John Koleszar committed
284 285 286
  -LEFT4X4, 2,
  -ABOVE4X4, 4,
  -ZERO4X4, -NEW4X4
John Koleszar's avatar
John Koleszar committed
287 288
};

289 290 291
struct vp9_token_struct vp9_bmode_encodings[VP9_NKF_BINTRAMODES];
struct vp9_token_struct vp9_kf_bmode_encodings[VP9_KF_BINTRAMODES];
struct vp9_token_struct vp9_ymode_encodings[VP9_YMODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
292
#if CONFIG_SUPERBLOCKS
293 294
struct vp9_token_struct vp9_sb_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token_struct vp9_sb_kf_ymode_encodings[VP9_I32X32_MODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
295
#endif
296 297 298 299
struct vp9_token_struct vp9_kf_ymode_encodings[VP9_YMODES];
struct vp9_token_struct vp9_uv_mode_encodings[VP9_UV_MODES];
struct vp9_token_struct vp9_i8x8_mode_encodings[VP9_I8X8_MODES];
struct vp9_token_struct vp9_mbsplit_encodings[VP9_NUMMBSPLITS];
John Koleszar's avatar
John Koleszar committed
300

301
struct vp9_token_struct vp9_mv_ref_encoding_array[VP9_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
302
#if CONFIG_SUPERBLOCKS
303
struct vp9_token_struct vp9_sb_mv_ref_encoding_array[VP9_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
304
#endif
305
struct vp9_token_struct vp9_sub_mv_ref_encoding_array[VP9_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
306

307
void vp9_init_mbmode_probs(VP9_COMMON *x) {
308
  unsigned int bct [VP9_YMODES] [2];      /* num Ymodes > num UV modes */
John Koleszar's avatar
John Koleszar committed
309

310
  vp9_tree_probs_from_distribution(VP9_YMODES, vp9_ymode_encodings,
311 312
                                   vp9_ymode_tree, x->fc.ymode_prob,
                                   bct, y_mode_cts, 256, 1);
313 314 315 316 317
#if CONFIG_SUPERBLOCKS
  vp9_tree_probs_from_distribution(VP9_I32X32_MODES, vp9_sb_ymode_encodings,
                                   vp9_sb_ymode_tree, x->fc.sb_ymode_prob,
                                   bct, y_mode_cts, 256, 1);
#endif
John Koleszar's avatar
John Koleszar committed
318 319
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
320
    for (i = 0; i < 8; i++) {
321 322 323
      vp9_tree_probs_from_distribution(VP9_YMODES, vp9_kf_ymode_encodings,
                                       vp9_kf_ymode_tree, x->kf_ymode_prob[i],
                                       bct, kf_y_mode_cts[i], 256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
324
#if CONFIG_SUPERBLOCKS
325 326
      vp9_tree_probs_from_distribution(VP9_I32X32_MODES,
                                       vp9_sb_kf_ymode_encodings,
327
                                       vp9_sb_kf_ymode_tree,
328 329
                                       x->sb_kf_ymode_prob[i], bct,
                                       kf_y_mode_cts[i], 256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
330 331
#endif
    }
John Koleszar's avatar
John Koleszar committed
332 333 334
  }
  {
    int i;
335
    for (i = 0; i < VP9_YMODES; i++) {
336 337 338 339 340 341
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->kf_uv_mode_prob[i],
                                       bct, kf_uv_mode_cts[i], 256, 1);
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->fc.uv_mode_prob[i],
                                       bct, uv_mode_cts[i], 256, 1);
342
    }
John Koleszar's avatar
John Koleszar committed
343
  }
344

345 346 347
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
                                   bct, i8x8_mode_cts, 256, 1);
348

349 350
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
351 352 353
  vpx_memcpy(x->fc.mbsplit_prob, vp9_mbsplit_probs, sizeof(vp9_mbsplit_probs));
  vpx_memcpy(x->fc.switchable_interp_prob, vp9_switchable_interp_prob,
             sizeof(vp9_switchable_interp_prob));
354 355 356
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
John Koleszar's avatar
John Koleszar committed
357 358 359 360
}


static void intra_bmode_probs_from_distribution(
361 362 363 364 365
  vp9_prob p[VP9_NKF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_NKF_BINTRAMODES]) {
  vp9_tree_probs_from_distribution(VP9_NKF_BINTRAMODES, vp9_bmode_encodings,
    vp9_bmode_tree, p, branch_ct, events, 256, 1);
John Koleszar's avatar
John Koleszar committed
366 367
}

368 369
void vp9_default_bmode_probs(vp9_prob p[VP9_NKF_BINTRAMODES - 1]) {
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2];
John Koleszar's avatar
John Koleszar committed
370
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
371 372
}

373 374 375 376 377 378 379 380 381 382 383 384
static void intra_kf_bmode_probs_from_distribution(
  vp9_prob p[VP9_KF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_KF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_KF_BINTRAMODES]) {
  vp9_tree_probs_from_distribution(VP9_KF_BINTRAMODES, vp9_kf_bmode_encodings,
    vp9_kf_bmode_tree, p, branch_ct, events, 256, 1);
}

void vp9_kf_default_bmode_probs(vp9_prob p[VP9_KF_BINTRAMODES]
                                          [VP9_KF_BINTRAMODES]
                                          [VP9_KF_BINTRAMODES - 1]) {
  unsigned int branch_ct[VP9_KF_BINTRAMODES - 1][2];
385
  int i, j;
John Koleszar's avatar
John Koleszar committed
386

387 388 389 390
  for (i = 0; i < VP9_KF_BINTRAMODES; ++i) {
    for (j = 0; j < VP9_KF_BINTRAMODES; ++j) {
      intra_kf_bmode_probs_from_distribution(
          p[i][j], branch_ct, vp9_kf_default_bmode_counts[i][j]);
391 392
    }
  }
John Koleszar's avatar
John Koleszar committed
393 394
}

395 396
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
397 398 399
  -0, 2,
  -1, -2
};
400 401
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
402
  EIGHTTAP, SIXTAP, EIGHTTAP_SHARP};
403
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, -1, 0, 2, -1};
404 405
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
406 407
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
408 409
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
410 411
  -0, -1,
};
412 413 414
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
415 416 417 418
  {248},
  { 64},
  {192},
};
419
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
420
  EIGHTTAP, EIGHTTAP_SHARP};
421
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1}; //8, 8s
422
#endif
John Koleszar's avatar
John Koleszar committed
423

424
void vp9_entropy_mode_init() {
425
  vp9_tokens_from_tree(vp9_kf_bmode_encodings,   vp9_kf_bmode_tree);
426 427 428
  vp9_tokens_from_tree(vp9_bmode_encodings,   vp9_bmode_tree);
  vp9_tokens_from_tree(vp9_ymode_encodings,   vp9_ymode_tree);
  vp9_tokens_from_tree(vp9_kf_ymode_encodings, vp9_kf_ymode_tree);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
429
#if CONFIG_SUPERBLOCKS
430 431
  vp9_tokens_from_tree(vp9_sb_ymode_encodings, vp9_sb_ymode_tree);
  vp9_tokens_from_tree(vp9_sb_kf_ymode_encodings, vp9_sb_kf_ymode_tree);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
432
#endif
433 434 435 436 437 438 439 440
  vp9_tokens_from_tree(vp9_uv_mode_encodings,  vp9_uv_mode_tree);
  vp9_tokens_from_tree(vp9_i8x8_mode_encodings,  vp9_i8x8_mode_tree);
  vp9_tokens_from_tree(vp9_mbsplit_encodings, vp9_mbsplit_tree);
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);

  vp9_tokens_from_tree_offset(vp9_mv_ref_encoding_array,
                              vp9_mv_ref_tree, NEARESTMV);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
441
#if CONFIG_SUPERBLOCKS
442 443
  vp9_tokens_from_tree_offset(vp9_sb_mv_ref_encoding_array,
                              vp9_sb_mv_ref_tree, NEARESTMV);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
444
#endif
445 446
  vp9_tokens_from_tree_offset(vp9_sub_mv_ref_encoding_array,
                              vp9_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
447
}
Yaowu Xu's avatar
Yaowu Xu committed
448

449
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
450
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
451 452 453
  vpx_memcpy(pc->fc.vp9_mode_contexts,
             vp9_default_mode_contexts,
             sizeof(vp9_default_mode_contexts));
Yaowu Xu's avatar
Yaowu Xu committed
454 455
}

456
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
457
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
458
                       const int context) {
Jim Bankoski's avatar
Jim Bankoski committed
459
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
460

461
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
462 463

  if (m == ZEROMV) {
Paul Wilkins's avatar
Paul Wilkins committed
464
    ++mv_ref_ct[context][0][0];
John Koleszar's avatar
John Koleszar committed
465
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
466
    ++mv_ref_ct[context][0][1];
John Koleszar's avatar
John Koleszar committed
467
    if (m == NEARESTMV) {
Paul Wilkins's avatar
Paul Wilkins committed
468
      ++mv_ref_ct[context][1][0];
John Koleszar's avatar
John Koleszar committed
469
    } else {
Paul Wilkins's avatar
Paul Wilkins committed
470
      ++mv_ref_ct[context][1][1];
John Koleszar's avatar
John Koleszar committed
471
      if (m == NEARMV) {
Paul Wilkins's avatar
Paul Wilkins committed
472
        ++mv_ref_ct[context][2][0];
John Koleszar's avatar
John Koleszar committed
473
      } else {
Paul Wilkins's avatar
Paul Wilkins committed
474
        ++mv_ref_ct[context][2][1];
John Koleszar's avatar
John Koleszar committed
475
        if (m == NEWMV) {
Paul Wilkins's avatar
Paul Wilkins committed
476
          ++mv_ref_ct[context][3][0];
John Koleszar's avatar
John Koleszar committed
477
        } else {
Paul Wilkins's avatar
Paul Wilkins committed
478
          ++mv_ref_ct[context][3][1];
Yaowu Xu's avatar
Yaowu Xu committed
479
        }
John Koleszar's avatar
John Koleszar committed
480
      }
Yaowu Xu's avatar
Yaowu Xu committed
481
    }
John Koleszar's avatar
John Koleszar committed
482
  }
Yaowu Xu's avatar
Yaowu Xu committed
483 484
}

485
#define MVREF_COUNT_SAT 20
486
#define MVREF_MAX_UPDATE_FACTOR 128
487
void vp9_update_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
488
  int i, j;
Jim Bankoski's avatar
Jim Bankoski committed
489
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
490 491
  int (*mode_context)[4];

492 493
  mode_context = pc->fc.vp9_mode_contexts;

494
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
495

Paul Wilkins's avatar
Paul Wilkins committed
496
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
497 498 499 500 501 502 503 504
    for (i = 0; i < 4; i++) {
      int this_prob;
      int count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1];
      int factor;
      {
        this_prob = count > 0 ? 256 * mv_ref_ct[j][i][0] / count : 128;
        count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
        factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
505
        this_prob = (pc->fc.vp9_mode_contexts[j][i] * (256 - factor) +
John Koleszar's avatar
John Koleszar committed
506
                     this_prob * factor + 128) >> 8;
507
        mode_context[j][i] = clip_prob(this_prob);
John Koleszar's avatar
John Koleszar committed
508
      }
Yaowu Xu's avatar
Yaowu Xu committed
509
    }
John Koleszar's avatar
John Koleszar committed
510
  }
Yaowu Xu's avatar
Yaowu Xu committed
511
}
512

513
#ifdef MODE_STATS
514
#include "vp9/common/vp9_modecont.h"
515
void print_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
516 517
  int j, i;
  printf("\n====================\n");
518
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
519 520
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context[j][i]);
Yaowu Xu's avatar
Yaowu Xu committed
521
    }
John Koleszar's avatar
John Koleszar committed
522 523 524
    printf("\n");
  }
  printf("====================\n");
525
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
526 527
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context_a[j][i]);
528
    }
John Koleszar's avatar
John Koleszar committed
529 530
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
531
}
532
#endif
533

John Koleszar's avatar
John Koleszar committed
534
// #define MODE_COUNT_TESTING
Deb Mukherjee's avatar
Deb Mukherjee committed
535 536
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
537
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
John Koleszar's avatar
John Koleszar committed
538 539
  int i, t, count, factor;
  unsigned int branch_ct[32][2];
540
  vp9_prob ymode_probs[VP9_YMODES - 1];
541 542 543
#if CONFIG_SUPERBLOCKS
  vp9_prob sb_ymode_probs[VP9_I32X32_MODES - 1];
#endif
544
  vp9_prob uvmode_probs[VP9_UV_MODES - 1];
545
  vp9_prob bmode_probs[VP9_NKF_BINTRAMODES - 1];
546 547 548
  vp9_prob i8x8_mode_probs[VP9_I8X8_MODES - 1];
  vp9_prob sub_mv_ref_probs[VP9_SUBMVREFS - 1];
  vp9_prob mbsplit_probs[VP9_NUMMBSPLITS - 1];
549 550 551
#if CONFIG_COMP_INTERINTRA_PRED
  vp9_prob interintra_prob;
#endif
552
#ifdef MODE_COUNT_TESTING
John Koleszar's avatar
John Koleszar committed
553
  printf("static const unsigned int\nymode_counts"
554 555
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
556 557
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
558 559
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
560
    printf("  {");
561
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
562 563 564 565
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
566 567 568
         "[VP9_NKF_BINTRAMODES] = {\n");
  for (t = 0; t < VP9_NKF_BINTRAMODES; ++t)
    printf("%d, ", cm->fc.bmode_counts[t]);
John Koleszar's avatar
John Koleszar committed
569 570
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
571 572
         "[VP9_I8X8_MODES] = {\n");
  for (t = 0; t < VP9_I8X8_MODES; ++t) printf("%d, ", cm->fc.i8x8_mode_counts[t]);
John Koleszar's avatar
John Koleszar committed
573 574
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
575
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
576 577
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
578
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
579 580 581 582
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
583 584
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
585
  printf("};\n");
586 587 588 589 590 591
#if CONFIG_COMP_INTERINTRA_PRED
  printf("static const unsigned int\ninterintra_counts"
         "[2] = {\n");
  for (t = 0; t < 2; ++t) printf("%d, ", cm->fc.interintra_counts[t]);
  printf("};\n");
#endif
592
#endif
593
  vp9_tree_probs_from_distribution(
594
    VP9_YMODES, vp9_ymode_encodings, vp9_ymode_tree,
John Koleszar's avatar
John Koleszar committed
595 596
    ymode_probs, branch_ct, cm->fc.ymode_counts,
    256, 1);
597
  for (t = 0; t < VP9_YMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
598 599 600 601 602 603
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_ymode_prob[t] * (256 - factor) +
            (int)ymode_probs[t] * factor + 128) >> 8;
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
    cm->fc.ymode_prob[t] = clip_prob(prob);
  }
#if CONFIG_SUPERBLOCKS
  vp9_tree_probs_from_distribution(VP9_I32X32_MODES,
                                   vp9_sb_ymode_encodings, vp9_sb_ymode_tree,
                                   sb_ymode_probs, branch_ct,
                                   cm->fc.sb_ymode_counts,
                                   256, 1);
  for (t = 0; t < VP9_I32X32_MODES - 1; ++t) {
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_sb_ymode_prob[t] * (256 - factor) +
            (int)sb_ymode_probs[t] * factor + 128) >> 8;
    cm->fc.sb_ymode_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
620
  }
621
#endif
622
  for (i = 0; i < VP9_YMODES; ++i) {
623 624 625
    vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                     vp9_uv_mode_tree, uvmode_probs, branch_ct,
                                     cm->fc.uv_mode_counts[i], 256, 1);
626
    for (t = 0; t < VP9_UV_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
627 628 629 630 631 632
      int prob;
      count = branch_ct[t][0] + branch_ct[t][1];
      count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
      factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
      prob = ((int)cm->fc.pre_uv_mode_prob[i][t] * (256 - factor) +
              (int)uvmode_probs[t] * factor + 128) >> 8;
633
      cm->fc.uv_mode_prob[i][t] = clip_prob(prob);
634
    }
John Koleszar's avatar
John Koleszar committed
635
  }
636
  vp9_tree_probs_from_distribution(VP9_NKF_BINTRAMODES, vp9_bmode_encodings,
637 638
                                   vp9_bmode_tree, bmode_probs, branch_ct,
                                   cm->fc.bmode_counts, 256, 1);
639
  for (t = 0; t < VP9_NKF_BINTRAMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
640 641 642 643 644 645
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_bmode_prob[t] * (256 - factor) +
            (int)bmode_probs[t] * factor + 128) >> 8;
646
    cm->fc.bmode_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
647
  }
648 649 650
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, i8x8_mode_probs,
                                   branch_ct, cm->fc.i8x8_mode_counts, 256, 1);
651
  for (t = 0; t < VP9_I8X8_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
652 653 654 655 656 657
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_i8x8_mode_prob[t] * (256 - factor) +
            (int)i8x8_mode_probs[t] * factor + 128) >> 8;
658
    cm->fc.i8x8_mode_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
659 660
  }
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
661 662 663 664 665
    vp9_tree_probs_from_distribution(VP9_SUBMVREFS,
                                     vp9_sub_mv_ref_encoding_array,
                                     vp9_sub_mv_ref_tree, sub_mv_ref_probs,
                                     branch_ct, cm->fc.sub_mv_ref_counts[i],
                                     256, 1);
666
    for (t = 0; t < VP9_SUBMVREFS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
667 668 669 670 671 672
      int prob;
      count = branch_ct[t][0] + branch_ct[t][1];
      count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
      factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
      prob = ((int)cm->fc.pre_sub_mv_ref_prob[i][t] * (256 - factor) +
              (int)sub_mv_ref_probs[t] * factor + 128) >> 8;
673
      cm->fc.sub_mv_ref_prob[i][t] = clip_prob(prob);
674
    }
John Koleszar's avatar
John Koleszar committed
675
  }
676 677 678
  vp9_tree_probs_from_distribution(VP9_NUMMBSPLITS, vp9_mbsplit_encodings,
                                   vp9_mbsplit_tree, mbsplit_probs, branch_ct,
                                   cm->fc.mbsplit_counts, 256, 1);
679
  for (t = 0; t < VP9_NUMMBSPLITS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
680 681 682 683 684 685
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_mbsplit_prob[t] * (256 - factor) +
            (int)mbsplit_probs[t] * factor + 128) >> 8;
686
    cm->fc.mbsplit_prob[t] = clip_prob(prob);
John Koleszar's avatar
John Koleszar committed
687
  }
688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
#if CONFIG_COMP_INTERINTRA_PRED
  if (cm->use_interintra) {
    int prob;
    interintra_prob = vp9_bin_prob_from_distribution(cm->fc.interintra_counts);
    count = cm->fc.interintra_counts[0] + cm->fc.interintra_counts[1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_interintra_prob * (256 - factor) +
            (int)interintra_prob * factor + 128) >> 8;
    if (prob <= 0)
      cm->fc.interintra_prob = 1;
    else if (prob > 255)
      cm->fc.interintra_prob = 255;
    else
      cm->fc.interintra_prob = prob;
  }
#endif
705
}