vp9_entropymode.c 24.4 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_prob [VP9_SUBMVREFS - 1] = { 180, 162, 25};
John Koleszar's avatar
John Koleszar committed
119

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

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

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

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

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

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 206
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
207 208
};

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

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

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

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

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

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

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
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};

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

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

298 299 300
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
301

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

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

336 337
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
338
                                   bct, i8x8_mode_cts);
339

340 341
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
342 343 344
  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));
345 346 347
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
348 349 350
  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
351 352 353 354
}


static void intra_bmode_probs_from_distribution(
355 356 357 358
  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,
359
                                   vp9_bmode_tree, p, branch_ct, events);
John Koleszar's avatar
John Koleszar committed
360 361
}

362 363
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
364
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
365 366
}

367 368 369 370 371
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,
372
                                   vp9_kf_bmode_tree, p, branch_ct, events);
373 374 375 376 377 378
}

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

381 382 383 384
  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]);
385 386
    }
  }
John Koleszar's avatar
John Koleszar committed
387 388
}

389 390
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
391 392 393
  -0, 2,
  -1, -2
};
394
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
395
#if CONFIG_ENABLE_6TAP
396
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
Adrian Grange's avatar
Adrian Grange committed
397 398 399 400 401 402 403
  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
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};
Adrian Grange's avatar
Adrian Grange committed
421 422 423 424 425
#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
426 427 428 429 430 431 432 433
#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};
434
#endif
John Koleszar's avatar
John Koleszar committed
435

436
void vp9_entropy_mode_init() {
437
  vp9_tokens_from_tree(vp9_kf_bmode_encodings,   vp9_kf_bmode_tree);
438 439 440
  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);
441 442
  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);
443 444 445 446 447 448 449 450 451 452 453 454
  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
455
}
Yaowu Xu's avatar
Yaowu Xu committed
456

457
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
458
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
459 460 461
  vpx_memcpy(pc->fc.vp9_mode_contexts,
             vp9_default_mode_contexts,
             sizeof(vp9_default_mode_contexts));
Yaowu Xu's avatar
Yaowu Xu committed
462 463
}

464
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
465
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
466
                       const int context) {
Jim Bankoski's avatar
Jim Bankoski committed
467
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
468

469
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
470 471

  if (m == ZEROMV) {
Paul Wilkins's avatar
Paul Wilkins committed
472
    ++mv_ref_ct[context][0][0];
John Koleszar's avatar
John Koleszar committed
473
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
474
    ++mv_ref_ct[context][0][1];
John Koleszar's avatar
John Koleszar committed
475
    if (m == NEARESTMV) {
Paul Wilkins's avatar
Paul Wilkins committed
476
      ++mv_ref_ct[context][1][0];
John Koleszar's avatar
John Koleszar committed
477
    } else {
Paul Wilkins's avatar
Paul Wilkins committed
478
      ++mv_ref_ct[context][1][1];
John Koleszar's avatar
John Koleszar committed
479
      if (m == NEARMV) {
Paul Wilkins's avatar
Paul Wilkins committed
480
        ++mv_ref_ct[context][2][0];
John Koleszar's avatar
John Koleszar committed
481
      } else {
Paul Wilkins's avatar
Paul Wilkins committed
482
        ++mv_ref_ct[context][2][1];
John Koleszar's avatar
John Koleszar committed
483
        if (m == NEWMV) {
Paul Wilkins's avatar
Paul Wilkins committed
484
          ++mv_ref_ct[context][3][0];
John Koleszar's avatar
John Koleszar committed
485
        } else {
Paul Wilkins's avatar
Paul Wilkins committed
486
          ++mv_ref_ct[context][3][1];
Yaowu Xu's avatar
Yaowu Xu committed
487
        }
John Koleszar's avatar
John Koleszar committed
488
      }
Yaowu Xu's avatar
Yaowu Xu committed
489
    }
John Koleszar's avatar
John Koleszar committed
490
  }
Yaowu Xu's avatar
Yaowu Xu committed
491 492
}

493
#define MVREF_COUNT_SAT 20
494
#define MVREF_MAX_UPDATE_FACTOR 128
495
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
496
  int i, j;
Jim Bankoski's avatar
Jim Bankoski committed
497
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
498 499
  int (*mode_context)[4];

500 501
  mode_context = pc->fc.vp9_mode_contexts;

502
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
503

Paul Wilkins's avatar
Paul Wilkins committed
504
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
505
    for (i = 0; i < 4; i++) {
506 507 508 509 510 511 512 513
      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
514
    }
John Koleszar's avatar
John Koleszar committed
515
  }
Yaowu Xu's avatar
Yaowu Xu committed
516
}
517

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

Deb Mukherjee's avatar
Deb Mukherjee committed
539 540
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
static void update_mode_probs(int n_modes, struct vp9_token_struct *encoding,
                              const vp9_tree_index *tree, unsigned int *cnt,
                              vp9_prob *pre_probs, vp9_prob *dst_probs) {
#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);
  vp9_tree_probs_from_distribution(n_modes, encoding, tree, probs,
                                   branch_ct, cnt);
  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
561
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
562
  int i;
563
#ifdef MODE_COUNT_TESTING
564 565
  int t;

John Koleszar's avatar
John Koleszar committed
566
  printf("static const unsigned int\nymode_counts"
567 568
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
569 570
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
571 572
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
573
    printf("  {");
574
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
575 576 577 578
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
579 580 581
         "[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
582 583
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
584 585
         "[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
586 587
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
588
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
589 590
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
591
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
592 593 594 595
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
596 597
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
598
  printf("};\n");
599 600 601 602 603 604
#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
605
#endif
606 607 608 609 610 611 612

  update_mode_probs(VP9_YMODES, vp9_ymode_encodings, vp9_ymode_tree,
                    cm->fc.ymode_counts, cm->fc.pre_ymode_prob,
                    cm->fc.ymode_prob);
  update_mode_probs(VP9_I32X32_MODES, vp9_sb_ymode_encodings, vp9_sb_ymode_tree,
                    cm->fc.sb_ymode_counts, cm->fc.pre_sb_ymode_prob,
                    cm->fc.sb_ymode_prob);
613
  for (i = 0; i < VP9_YMODES; ++i) {
614 615 616
    update_mode_probs(VP9_UV_MODES, vp9_uv_mode_encodings, vp9_uv_mode_tree,
                      cm->fc.uv_mode_counts[i], cm->fc.pre_uv_mode_prob[i],
                      cm->fc.uv_mode_prob[i]);
John Koleszar's avatar
John Koleszar committed
617
  }
618 619 620 621 622 623
  update_mode_probs(VP9_NKF_BINTRAMODES, vp9_bmode_encodings, vp9_bmode_tree,
                    cm->fc.bmode_counts, cm->fc.pre_bmode_prob,
                    cm->fc.bmode_prob);
  update_mode_probs(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                    vp9_i8x8_mode_tree, cm->fc.i8x8_mode_counts,
                    cm->fc.pre_i8x8_mode_prob, cm->fc.i8x8_mode_prob);
John Koleszar's avatar
John Koleszar committed
624
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
625 626 627
    update_mode_probs(VP9_SUBMVREFS, vp9_sub_mv_ref_encoding_array,
                      vp9_sub_mv_ref_tree, cm->fc.sub_mv_ref_counts[i],
                      cm->fc.pre_sub_mv_ref_prob[i], cm->fc.sub_mv_ref_prob[i]);
John Koleszar's avatar
John Koleszar committed
628
  }
629 630 631
  update_mode_probs(VP9_NUMMBSPLITS, vp9_mbsplit_encodings, vp9_mbsplit_tree,
                    cm->fc.mbsplit_counts, cm->fc.pre_mbsplit_prob,
                    cm->fc.mbsplit_prob);
632 633
#if CONFIG_COMP_INTERINTRA_PRED
  if (cm->use_interintra) {
634 635 636 637
    int factor, interintra_prob, count;

    interintra_prob = get_binary_prob(cm->fc.interintra_counts[0],
                                      cm->fc.interintra_counts[1]);
638 639 640
    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);
641 642
    cm->fc.interintra_prob = weighted_prob(cm->fc.pre_interintra_prob,
                                           interintra_prob, factor);
643 644
  }
#endif
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 697 698 699 700 701 702 703 704 705 706 707

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;
}