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


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

18
static const unsigned int kf_y_mode_cts[8][VP9_YMODES] = {
John Koleszar's avatar
John Koleszar committed
19 20 21 22 23 24 25 26 27
  /* 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},
28
};
29

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

35
static const unsigned int uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
36 37 38 39 40 41 42 43 44 45 46 47 48
  /* 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 */
49 50
};

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

56
static const unsigned int kf_uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
John Koleszar's avatar
John Koleszar committed
57 58 59 60 61 62 63 64 65 66 67 68 69
  // 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 */
70
};
John Koleszar's avatar
John Koleszar committed
71

72 73 74 75 76 77 78 79 80 81 82 83 84
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
85 86
  /* DC    TM     VE     HE   LD    RD    VR    VL    HD    HU */
  43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723
87
#endif
John Koleszar's avatar
John Koleszar committed
88 89
};

John Koleszar's avatar
John Koleszar committed
90 91 92 93 94 95
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
96 97
} sumvfref_t;

98
int vp9_mv_cont(const int_mv *l, const int_mv *a) {
John Koleszar's avatar
John Koleszar committed
99 100 101
  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
102

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

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

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

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

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

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

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

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

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

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

156 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
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
205 206
};

207 208
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
209
const vp9_tree_index vp9_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
210 211 212 213 214 215 216 217 218 219 220
  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
221 222
};

223
const vp9_tree_index vp9_kf_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
224 225 226 227 228 229 230 231 232 233 234
  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
235 236
};

237
const vp9_tree_index vp9_i8x8_mode_tree[VP9_I8X8_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
238 239 240 241 242 243 244 245 246
  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
247 248
};

249
const vp9_tree_index vp9_uv_mode_tree[VP9_UV_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
250 251 252 253 254 255 256 257 258
  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
259 260
};

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

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

274
const vp9_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
275 276 277 278 279
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};

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

286 287 288
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];
289 290
struct vp9_token_struct vp9_sb_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token_struct vp9_sb_kf_ymode_encodings[VP9_I32X32_MODES];
291 292 293 294
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
295

296 297 298
struct vp9_token_struct vp9_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token_struct vp9_sb_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token_struct vp9_sub_mv_ref_encoding_array[VP9_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
299

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

303 304 305 306
  vp9_tree_probs_from_distribution(vp9_ymode_tree, x->fc.ymode_prob,
                                   bct, y_mode_cts, 0);
  vp9_tree_probs_from_distribution(vp9_sb_ymode_tree, x->fc.sb_ymode_prob,
                                   bct, y_mode_cts, 0);
John Koleszar's avatar
John Koleszar committed
307 308
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
309
    for (i = 0; i < 8; i++) {
310 311 312
      vp9_tree_probs_from_distribution(vp9_kf_ymode_tree, x->kf_ymode_prob[i],
                                       bct, kf_y_mode_cts[i], 0);
      vp9_tree_probs_from_distribution(vp9_sb_kf_ymode_tree,
313
                                       x->sb_kf_ymode_prob[i], bct,
314
                                       kf_y_mode_cts[i], 0);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
315
    }
John Koleszar's avatar
John Koleszar committed
316 317 318
  }
  {
    int i;
319
    for (i = 0; i < VP9_YMODES; i++) {
320 321 322 323
      vp9_tree_probs_from_distribution(vp9_uv_mode_tree, x->kf_uv_mode_prob[i],
                                       bct, kf_uv_mode_cts[i], 0);
      vp9_tree_probs_from_distribution(vp9_uv_mode_tree, x->fc.uv_mode_prob[i],
                                       bct, uv_mode_cts[i], 0);
324
    }
John Koleszar's avatar
John Koleszar committed
325
  }
326

327 328
  vp9_tree_probs_from_distribution(vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
                                   bct, i8x8_mode_cts, 0);
329

330 331
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
332 333 334
  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));
335 336 337
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
338 339 340
  x->ref_pred_probs[0] = 120;
  x->ref_pred_probs[1] = 80;
  x->ref_pred_probs[2] = 40;
John Koleszar's avatar
John Koleszar committed
341 342 343 344
}


static void intra_bmode_probs_from_distribution(
345 346 347
  vp9_prob p[VP9_NKF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_NKF_BINTRAMODES]) {
348
  vp9_tree_probs_from_distribution(vp9_bmode_tree, p, branch_ct, events, 0);
John Koleszar's avatar
John Koleszar committed
349 350
}

351 352
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
353
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
354 355
}

356 357 358 359
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]) {
360
  vp9_tree_probs_from_distribution(vp9_kf_bmode_tree, p, branch_ct, events, 0);
361 362 363 364 365 366
}

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];
367
  int i, j;
John Koleszar's avatar
John Koleszar committed
368

369 370 371 372
  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]);
373 374
    }
  }
John Koleszar's avatar
John Koleszar committed
375 376
}

377 378
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
379 380 381
  -0, 2,
  -1, -2
};
382
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
383
#if CONFIG_ENABLE_6TAP
384
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
Adrian Grange's avatar
Adrian Grange committed
385 386 387 388 389 390 391
  SIXTAP, EIGHTTAP, EIGHTTAP_SHARP};
const int vp9_switchable_interp_map[SWITCHABLE+1] = {0, -1, 1, 2, -1, -1};
#else
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
  EIGHTTAP, EIGHTTAP_SMOOTH, EIGHTTAP_SHARP};
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, 0, 2, -1, -1};
#endif
392 393
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
394 395
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
396 397
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
398 399
  -0, -1,
};
400 401 402
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] = {
403 404 405 406
  {248},
  { 64},
  {192},
};
407
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
408
  EIGHTTAP, EIGHTTAP_SHARP};
Adrian Grange's avatar
Adrian Grange committed
409 410 411 412 413
#if CONFIG_ENABLE_6TAP
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1, -1};
#else
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, 0, 1, -1, -1};
#endif
414 415 416 417 418 419 420 421
#endif  // VP9_SWITCHABLE_FILTERS

// Indicates if the filter is interpolating or non-interpolating
// Note currently only the EIGHTTAP_SMOOTH is non-interpolating
#if CONFIG_ENABLE_6TAP
const int vp9_is_interpolating_filter[SWITCHABLE + 1] = {1, 0, 1, 1, 1, -1};
#else
const int vp9_is_interpolating_filter[SWITCHABLE + 1] = {0, 1, 1, 1, -1};
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);
429 430
  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);
431 432 433 434 435 436 437 438 439 440 441 442
  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);
  vp9_tokens_from_tree_offset(vp9_sb_mv_ref_encoding_array,
                              vp9_sb_mv_ref_tree, NEARESTMV);
  vp9_tokens_from_tree_offset(vp9_sub_mv_ref_encoding_array,
                              vp9_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
443
}
Yaowu Xu's avatar
Yaowu Xu committed
444

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

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

457
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
458 459

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

481
#define MVREF_COUNT_SAT 20
482
#define MVREF_MAX_UPDATE_FACTOR 128
483
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
484
  int i, j;
Jim Bankoski's avatar
Jim Bankoski committed
485
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
486 487
  int (*mode_context)[4];

488 489
  mode_context = pc->fc.vp9_mode_contexts;

490
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
491

Paul Wilkins's avatar
Paul Wilkins committed
492
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
493
    for (i = 0; i < 4; i++) {
494 495 496 497 498 499 500 501
      int count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1], factor;

      count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
      factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
      mode_context[j][i] = weighted_prob(pc->fc.vp9_mode_contexts[j][i],
                                         get_binary_prob(mv_ref_ct[j][i][0],
                                                         mv_ref_ct[j][i][1]),
                                         factor);
Yaowu Xu's avatar
Yaowu Xu committed
502
    }
John Koleszar's avatar
John Koleszar committed
503
  }
Yaowu Xu's avatar
Yaowu Xu committed
504
}
505

506
#ifdef MODE_STATS
507
#include "vp9/common/vp9_modecont.h"
508
void print_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
509 510
  int j, i;
  printf("\n====================\n");
511
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
512 513
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context[j][i]);
Yaowu Xu's avatar
Yaowu Xu committed
514
    }
John Koleszar's avatar
John Koleszar committed
515 516 517
    printf("\n");
  }
  printf("====================\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_a[j][i]);
521
    }
John Koleszar's avatar
John Koleszar committed
522 523
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
524
}
525
#endif
526

Deb Mukherjee's avatar
Deb Mukherjee committed
527 528
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
529
static void update_mode_probs(int n_modes,
530
                              const vp9_tree_index *tree, unsigned int *cnt,
531 532
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
533 534 535 536 537 538
#define MAX_PROBS 32
  vp9_prob probs[MAX_PROBS];
  unsigned int branch_ct[MAX_PROBS][2];
  int t, count, factor;

  assert(n_modes - 1 < MAX_PROBS);
539
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
540 541 542 543 544 545 546 547 548
  for (t = 0; t < n_modes - 1; ++t) {
    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);
    dst_probs[t] = weighted_prob(pre_probs[t], probs[t], factor);
  }
}

// #define MODE_COUNT_TESTING
549
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
550
  int i;
551
#ifdef MODE_COUNT_TESTING
552 553
  int t;

John Koleszar's avatar
John Koleszar committed
554
  printf("static const unsigned int\nymode_counts"
555 556
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
557 558
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
559 560
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
561
    printf("  {");
562
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
563 564 565 566
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
567 568 569
         "[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
570 571
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
572 573
         "[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
574 575
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
576
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
577 578
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
579
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
580 581 582 583
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
584 585
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
586
  printf("};\n");
587 588 589 590 591 592
#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
593
#endif
594

595
  update_mode_probs(VP9_YMODES, vp9_ymode_tree,
596
                    cm->fc.ymode_counts, cm->fc.pre_ymode_prob,
597 598
                    cm->fc.ymode_prob, 0);
  update_mode_probs(VP9_I32X32_MODES, vp9_sb_ymode_tree,
599
                    cm->fc.sb_ymode_counts, cm->fc.pre_sb_ymode_prob,
600
                    cm->fc.sb_ymode_prob, 0);
601
  for (i = 0; i < VP9_YMODES; ++i) {
602
    update_mode_probs(VP9_UV_MODES, vp9_uv_mode_tree,
603
                      cm->fc.uv_mode_counts[i], cm->fc.pre_uv_mode_prob[i],
604
                      cm->fc.uv_mode_prob[i], 0);
John Koleszar's avatar
John Koleszar committed
605
  }
606
  update_mode_probs(VP9_NKF_BINTRAMODES, vp9_bmode_tree,
607
                    cm->fc.bmode_counts, cm->fc.pre_bmode_prob,
608 609
                    cm->fc.bmode_prob, 0);
  update_mode_probs(VP9_I8X8_MODES,
610
                    vp9_i8x8_mode_tree, cm->fc.i8x8_mode_counts,
611
                    cm->fc.pre_i8x8_mode_prob, cm->fc.i8x8_mode_prob, 0);
John Koleszar's avatar
John Koleszar committed
612
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
613
    update_mode_probs(VP9_SUBMVREFS,
614
                      vp9_sub_mv_ref_tree, cm->fc.sub_mv_ref_counts[i],
615 616
                      cm->fc.pre_sub_mv_ref_prob[i], cm->fc.sub_mv_ref_prob[i],
                      LEFT4X4);
John Koleszar's avatar
John Koleszar committed
617
  }
618
  update_mode_probs(VP9_NUMMBSPLITS, vp9_mbsplit_tree,
619
                    cm->fc.mbsplit_counts, cm->fc.pre_mbsplit_prob,
620
                    cm->fc.mbsplit_prob, 0);
621 622
#if CONFIG_COMP_INTERINTRA_PRED
  if (cm->use_interintra) {
623 624 625 626
    int factor, interintra_prob, count;

    interintra_prob = get_binary_prob(cm->fc.interintra_counts[0],
                                      cm->fc.interintra_counts[1]);
627 628 629
    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);
630 631
    cm->fc.interintra_prob = weighted_prob(cm->fc.pre_interintra_prob,
                                           interintra_prob, factor);
632 633
  }
#endif
634
}
635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696

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

  xd->ref_lf_deltas[INTRA_FRAME] = 2;
  xd->ref_lf_deltas[LAST_FRAME] = 0;
  xd->ref_lf_deltas[GOLDEN_FRAME] = -2;
  xd->ref_lf_deltas[ALTREF_FRAME] = -2;

  xd->mode_lf_deltas[0] = 4;               // BPRED
  xd->mode_lf_deltas[1] = -2;              // Zero
  xd->mode_lf_deltas[2] = 2;               // New mv
  xd->mode_lf_deltas[3] = 4;               // Split mv
}

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

  /* reset the mode ref deltas for loop filter */
  vpx_memset(xd->last_ref_lf_deltas, 0, sizeof(xd->last_ref_lf_deltas));
  vpx_memset(xd->last_mode_lf_deltas, 0, sizeof(xd->last_mode_lf_deltas));
  set_default_lf_deltas(xd);

  vp9_default_coef_probs(cm);
  vp9_init_mbmode_probs(cm);
  vp9_default_bmode_probs(cm->fc.bmode_prob);
  vp9_kf_default_bmode_probs(cm->kf_bmode_prob);
  vp9_init_mv_probs(cm);
  // To force update of the sharpness
  cm->last_sharpness_level = -1;

  vp9_init_mode_contexts(cm);

  for (i = 0; i < NUM_FRAME_CONTEXTS; i++) {
    vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));
  }

  vpx_memset(cm->prev_mip, 0,
             (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));
  vpx_memset(cm->mip, 0,
             (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));

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

#if CONFIG_NEW_MVREF
  // Defaults probabilities for encoding the MV ref id signal
  vpx_memset(xd->mb_mv_ref_probs, VP9_DEFAULT_MV_REF_PROB,
             sizeof(xd->mb_mv_ref_probs));
#endif
  cm->ref_frame_sign_bias[GOLDEN_FRAME] = 0;
  cm->ref_frame_sign_bias[ALTREF_FRAME] = 0;

  cm->frame_context_idx = 0;
}