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] = {
Yaowu Xu's avatar
Yaowu Xu committed
19
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 i4X4 */
John Koleszar's avatar
John Koleszar committed
20 21 22 23 24 25 26 27
  {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] = {
Yaowu Xu's avatar
Yaowu Xu committed
31
  /* DC V   H  D45 135 117 153 D27 D63 TM i8x8 i4X4 */
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
  /* 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 */
Yaowu Xu's avatar
Yaowu Xu committed
48
  { 150, 35, 41, 10, 10, 10, 10, 10, 10, 10}, /* i4X4 */
49 50
};

51
static const unsigned int i8x8_mode_cts  [VP9_I8X8_MODES] = {
Yaowu Xu's avatar
Yaowu Xu 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
  // 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 */
Yaowu Xu's avatar
Yaowu Xu committed
69
  { 122, 41, 35, 20, 20, 20, 20, 20, 20, 18}, /* I4X4 */
70
};
John Koleszar's avatar
John Koleszar committed
71

72 73 74
static const unsigned int bmode_cts[VP9_NKF_BINTRAMODES] = {
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
Yaowu Xu's avatar
Yaowu Xu committed
75
  /* DC    TM     V      H   CONTEXT */
76 77
  43891, 17694, 10036, 3920, 20000
#elif CONTEXT_PRED_REPLACEMENTS == 4
Yaowu Xu's avatar
Yaowu Xu committed
78
  /* DC    TM     V      H   D45   D135   CONTEXT */
79 80
  43891, 17694, 10036, 3920, 3363, 2546, 14000
#elif CONTEXT_PRED_REPLACEMENTS == 0
Yaowu Xu's avatar
Yaowu Xu committed
81 82
  /* DC    V     H    D45   D135  D117  D153   D27   D63   TM    CONTEXT */
  43891, 10036, 3920, 3363, 2546, 5119, 2471, 1723, 3221, 17694, 50000
83 84
#endif
#else
Yaowu Xu's avatar
Yaowu Xu committed
85 86
  /* DC    V     H    D45   D135  D117  D153   D27   D63   TM  */
  43891, 10036, 3920, 3363, 2546, 5119, 2471, 1723, 3221, 17694
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 156 157 158 159 160 161 162 163 164
#if CONFIG_SBSEGMENT
const vp9_prob vp9_partition_probs[PARTITION_PLANES][PARTITION_TYPES - 1] = {
  {110, 111, 150},
  {110, 111, 150},
};
#else
const vp9_prob vp9_partition_probs[PARTITION_PLANES][PARTITION_TYPES - 1] = {
  {200}, {200},
};
#endif

John Koleszar's avatar
John Koleszar committed
165 166
/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */

167 168 169
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 */
Yaowu Xu's avatar
Yaowu Xu committed
170
  -B_V_PRED, 6,                       /* 2 = V_NODE */
171
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
172 173 174 175 176
  -B_H_PRED, 10,                      /* 4 = H_NODE */
  -B_D135_PRED, -B_D117_PRED,         /* 5 = D135_NODE */
  -B_D45_PRED, 14,                    /* 6 = D45_NODE */
  -B_D63_PRED, 16,                    /* 7 = D63_NODE */
  -B_D153_PRED, -B_D27_PRED           /* 8 = D153_NODE */
177 178 179 180 181 182 183 184
};

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),
Yaowu Xu's avatar
Yaowu Xu committed
185
  -B_V_PRED, -B_H_PRED
186 187 188 189
#elif CONTEXT_PRED_REPLACEMENTS == 4
  -B_DC_PRED, 2,
  -B_TM_PRED, 4,
  6, 8,
Yaowu Xu's avatar
Yaowu Xu committed
190
  -B_V_PRED, -B_H_PRED,
191
  10, -(B_CONTEXT_PRED - CONTEXT_PRED_REPLACEMENTS),
Yaowu Xu's avatar
Yaowu Xu committed
192
  -B_D135_PRED, -B_D45_PRED,
193 194 195
#elif CONTEXT_PRED_REPLACEMENTS == 0
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
196
  -B_V_PRED, 6,                       /* 2 = V_NODE */
197
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
198 199 200 201 202 203
  -B_H_PRED, 10,                      /* 4 = H_NODE */
  -B_D135_PRED, -B_D117_PRED,         /* 5 = D135_NODE */
  -B_D45_PRED, 14,                    /* 6 = D45_NODE */
  -B_D63_PRED, 16,                    /* 7 = D63_NODE */
  -B_D153_PRED, 18,                   /* 8 = D153_NODE */
  -B_D27_PRED, -B_CONTEXT_PRED        /* 9 = D27_NODE */
204 205 206 207
#endif
#else
  -B_DC_PRED, 2,                      /* 0 = DC_NODE */
  -B_TM_PRED, 4,                      /* 1 = TM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
208
  -B_V_PRED, 6,                       /* 2 = V_NODE */
209
  8, 12,                              /* 3 = COM_NODE */
Yaowu Xu's avatar
Yaowu Xu committed
210 211 212 213 214
  -B_H_PRED, 10,                      /* 4 = H_NODE */
  -B_D135_PRED, -B_D117_PRED,         /* 5 = D135_NODE */
  -B_D45_PRED, 14,                    /* 6 = D45_NODE */
  -B_D63_PRED, 16,                    /* 7 = D63_NODE */
  -B_D153_PRED, -B_D27_PRED           /* 8 = D153_NODE */
215
#endif
John Koleszar's avatar
John Koleszar committed
216 217
};

218 219
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
220
const vp9_tree_index vp9_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
221 222 223 224 225 226 227 228 229 230
  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,
Yaowu Xu's avatar
Yaowu Xu committed
231
  -I4X4_PRED, -I8X8_PRED
232 233
};

234
const vp9_tree_index vp9_kf_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
235 236 237 238 239 240 241 242 243 244
  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,
Yaowu Xu's avatar
Yaowu Xu committed
245
  -I4X4_PRED, -I8X8_PRED
246 247
};

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

260
const vp9_tree_index vp9_uv_mode_tree[VP9_UV_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
261 262 263 264 265 266 267 268 269
  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
270 271
};

272
const vp9_tree_index vp9_mbsplit_tree[6] = {
273 274 275
  -PARTITIONING_4X4,   2,
  -PARTITIONING_8X8,   4,
  -PARTITIONING_16X8, -PARTITIONING_8X16,
John Koleszar's avatar
John Koleszar committed
276 277
};

278
const vp9_tree_index vp9_mv_ref_tree[8] = {
John Koleszar's avatar
John Koleszar committed
279 280 281 282
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, 6,
  -NEWMV, -SPLITMV
John Koleszar's avatar
John Koleszar committed
283 284
};

285
const vp9_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
286 287 288 289 290
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};

291
const vp9_tree_index vp9_sub_mv_ref_tree[6] = {
John Koleszar's avatar
John Koleszar committed
292 293 294
  -LEFT4X4, 2,
  -ABOVE4X4, 4,
  -ZERO4X4, -NEW4X4
John Koleszar's avatar
John Koleszar committed
295 296
};

297 298 299 300 301 302 303 304 305 306 307 308
#if CONFIG_SBSEGMENT
const vp9_tree_index vp9_partition_tree[6] = {
  -PARTITION_NONE, 2,
  -PARTITION_HORZ, 4,
  -PARTITION_VERT, -PARTITION_SPLIT
};
#else
const vp9_tree_index vp9_partition_tree[2] = {
  -PARTITION_NONE, -PARTITION_SPLIT
};
#endif

309 310 311 312 313 314 315 316 317 318 319 320 321
struct vp9_token vp9_bmode_encodings[VP9_NKF_BINTRAMODES];
struct vp9_token vp9_kf_bmode_encodings[VP9_KF_BINTRAMODES];
struct vp9_token vp9_ymode_encodings[VP9_YMODES];
struct vp9_token vp9_sb_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token vp9_sb_kf_ymode_encodings[VP9_I32X32_MODES];
struct vp9_token vp9_kf_ymode_encodings[VP9_YMODES];
struct vp9_token vp9_uv_mode_encodings[VP9_UV_MODES];
struct vp9_token vp9_i8x8_mode_encodings[VP9_I8X8_MODES];
struct vp9_token vp9_mbsplit_encodings[VP9_NUMMBSPLITS];

struct vp9_token vp9_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token vp9_sb_mv_ref_encoding_array[VP9_MVREFS];
struct vp9_token vp9_sub_mv_ref_encoding_array[VP9_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
322

323 324
struct vp9_token vp9_partition_encodings[PARTITION_TYPES];

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

328 329 330 331
  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
332 333
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
334
    for (i = 0; i < 8; i++) {
335 336 337
      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,
338
                                       x->sb_kf_ymode_prob[i], bct,
339
                                       kf_y_mode_cts[i], 0);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
340
    }
John Koleszar's avatar
John Koleszar committed
341 342 343
  }
  {
    int i;
344
    for (i = 0; i < VP9_YMODES; i++) {
345 346 347 348
      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);
349
    }
John Koleszar's avatar
John Koleszar committed
350
  }
351

352 353
  vp9_tree_probs_from_distribution(vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
                                   bct, i8x8_mode_cts, 0);
354

355 356
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
357 358 359
  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));
360 361 362 363

  vpx_memcpy(x->fc.partition_prob, vp9_partition_probs,
             sizeof(vp9_partition_probs));

364 365 366
#if CONFIG_COMP_INTERINTRA_PRED
  x->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB;
#endif
367 368 369
  x->ref_pred_probs[0] = DEFAULT_PRED_PROB_0;
  x->ref_pred_probs[1] = DEFAULT_PRED_PROB_1;
  x->ref_pred_probs[2] = DEFAULT_PRED_PROB_2;
John Koleszar's avatar
John Koleszar committed
370 371 372 373
}


static void intra_bmode_probs_from_distribution(
374 375 376
  vp9_prob p[VP9_NKF_BINTRAMODES - 1],
  unsigned int branch_ct[VP9_NKF_BINTRAMODES - 1][2],
  const unsigned int events[VP9_NKF_BINTRAMODES]) {
377
  vp9_tree_probs_from_distribution(vp9_bmode_tree, p, branch_ct, events, 0);
John Koleszar's avatar
John Koleszar committed
378 379
}

380 381
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
382
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
383 384
}

385 386 387 388
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]) {
389
  vp9_tree_probs_from_distribution(vp9_kf_bmode_tree, p, branch_ct, events, 0);
390 391 392 393 394 395
}

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

398 399 400 401
  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]);
402 403
    }
  }
John Koleszar's avatar
John Koleszar committed
404 405
}

406 407
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
408 409 410
  -0, 2,
  -1, -2
};
411
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
Adrian Grange's avatar
Adrian Grange committed
412
#if CONFIG_ENABLE_6TAP
413
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
Adrian Grange's avatar
Adrian Grange committed
414 415 416 417 418 419 420
  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
421 422
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
423 424
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
425 426
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
427 428
  -0, -1,
};
429
struct vp9_token vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
430 431
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
432 433 434 435
  {248},
  { 64},
  {192},
};
436
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
437
  EIGHTTAP, EIGHTTAP_SHARP};
Adrian Grange's avatar
Adrian Grange committed
438 439 440 441 442
#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
443 444 445 446 447 448 449 450
#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};
451
#endif
John Koleszar's avatar
John Koleszar committed
452

453
void vp9_entropy_mode_init() {
454
  vp9_tokens_from_tree(vp9_kf_bmode_encodings,   vp9_kf_bmode_tree);
455 456 457
  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);
458 459
  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);
460 461 462 463 464
  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);
465
  vp9_tokens_from_tree(vp9_partition_encodings, vp9_partition_tree);
466 467 468 469 470 471 472

  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
473
}
Yaowu Xu's avatar
Yaowu Xu committed
474

475
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
476
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
477 478 479
  vpx_memcpy(pc->fc.vp9_mode_contexts,
             vp9_default_mode_contexts,
             sizeof(vp9_default_mode_contexts));
Yaowu Xu's avatar
Yaowu Xu committed
480 481
}

482
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
483
                       MB_PREDICTION_MODE m,
Paul Wilkins's avatar
Paul Wilkins committed
484
                       const int context) {
Jim Bankoski's avatar
Jim Bankoski committed
485
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
486

487
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
488 489

  if (m == ZEROMV) {
Paul Wilkins's avatar
Paul Wilkins committed
490
    ++mv_ref_ct[context][0][0];
John Koleszar's avatar
John Koleszar committed
491
  } else {
Paul Wilkins's avatar
Paul Wilkins committed
492
    ++mv_ref_ct[context][0][1];
John Koleszar's avatar
John Koleszar committed
493
    if (m == NEARESTMV) {
Paul Wilkins's avatar
Paul Wilkins committed
494
      ++mv_ref_ct[context][1][0];
John Koleszar's avatar
John Koleszar committed
495
    } else {
Paul Wilkins's avatar
Paul Wilkins committed
496
      ++mv_ref_ct[context][1][1];
John Koleszar's avatar
John Koleszar committed
497
      if (m == NEARMV) {
Paul Wilkins's avatar
Paul Wilkins committed
498
        ++mv_ref_ct[context][2][0];
John Koleszar's avatar
John Koleszar committed
499
      } else {
Paul Wilkins's avatar
Paul Wilkins committed
500
        ++mv_ref_ct[context][2][1];
John Koleszar's avatar
John Koleszar committed
501
        if (m == NEWMV) {
Paul Wilkins's avatar
Paul Wilkins committed
502
          ++mv_ref_ct[context][3][0];
John Koleszar's avatar
John Koleszar committed
503
        } else {
Paul Wilkins's avatar
Paul Wilkins committed
504
          ++mv_ref_ct[context][3][1];
Yaowu Xu's avatar
Yaowu Xu committed
505
        }
John Koleszar's avatar
John Koleszar committed
506
      }
Yaowu Xu's avatar
Yaowu Xu committed
507
    }
John Koleszar's avatar
John Koleszar committed
508
  }
Yaowu Xu's avatar
Yaowu Xu committed
509 510
}

511
#define MVREF_COUNT_SAT 20
512
#define MVREF_MAX_UPDATE_FACTOR 128
513
void vp9_adapt_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
514
  int i, j;
Jim Bankoski's avatar
Jim Bankoski committed
515
  unsigned int (*mv_ref_ct)[4][2];
John Koleszar's avatar
John Koleszar committed
516 517
  int (*mode_context)[4];

518 519
  mode_context = pc->fc.vp9_mode_contexts;

520
  mv_ref_ct = pc->fc.mv_ref_ct;
John Koleszar's avatar
John Koleszar committed
521

Paul Wilkins's avatar
Paul Wilkins committed
522
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
523
    for (i = 0; i < 4; i++) {
524 525 526 527 528 529 530 531
      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
532
    }
John Koleszar's avatar
John Koleszar committed
533
  }
Yaowu Xu's avatar
Yaowu Xu committed
534
}
535

536
#ifdef MODE_STATS
537
#include "vp9/common/vp9_modecont.h"
538
void print_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
539 540
  int j, i;
  printf("\n====================\n");
541
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
542 543
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context[j][i]);
Yaowu Xu's avatar
Yaowu Xu committed
544
    }
John Koleszar's avatar
John Koleszar committed
545 546 547
    printf("\n");
  }
  printf("====================\n");
548
  for (j = 0; j < INTER_MODE_CONTEXTS; j++) {
John Koleszar's avatar
John Koleszar committed
549 550
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context_a[j][i]);
551
    }
John Koleszar's avatar
John Koleszar committed
552 553
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
554
}
555
#endif
556

Deb Mukherjee's avatar
Deb Mukherjee committed
557 558
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
559
static void update_mode_probs(int n_modes,
560
                              const vp9_tree_index *tree, unsigned int *cnt,
561 562
                              vp9_prob *pre_probs, vp9_prob *dst_probs,
                              unsigned int tok0_offset) {
563 564 565 566 567 568
#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);
569
  vp9_tree_probs_from_distribution(tree, probs, branch_ct, cnt, tok0_offset);
570 571 572 573 574 575 576 577 578
  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
579
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
580
  int i;
581
#ifdef MODE_COUNT_TESTING
582 583
  int t;

John Koleszar's avatar
John Koleszar committed
584
  printf("static const unsigned int\nymode_counts"
585 586
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
587 588
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
589 590
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
591
    printf("  {");
592
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
593 594 595 596
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
597 598 599
         "[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
600 601
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
602 603
         "[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
604 605
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
606
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
607 608
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
609
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
610 611 612 613
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
614 615
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
616
  printf("};\n");
617 618 619 620 621 622
#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
623
#endif
624

625
  update_mode_probs(VP9_YMODES, vp9_ymode_tree,
626
                    cm->fc.ymode_counts, cm->fc.pre_ymode_prob,
627 628
                    cm->fc.ymode_prob, 0);
  update_mode_probs(VP9_I32X32_MODES, vp9_sb_ymode_tree,
629
                    cm->fc.sb_ymode_counts, cm->fc.pre_sb_ymode_prob,
630
                    cm->fc.sb_ymode_prob, 0);
631
  for (i = 0; i < VP9_YMODES; ++i) {
632
    update_mode_probs(VP9_UV_MODES, vp9_uv_mode_tree,
633
                      cm->fc.uv_mode_counts[i], cm->fc.pre_uv_mode_prob[i],
634
                      cm->fc.uv_mode_prob[i], 0);
John Koleszar's avatar
John Koleszar committed
635
  }
636
  update_mode_probs(VP9_NKF_BINTRAMODES, vp9_bmode_tree,
637
                    cm->fc.bmode_counts, cm->fc.pre_bmode_prob,
638 639
                    cm->fc.bmode_prob, 0);
  update_mode_probs(VP9_I8X8_MODES,
640
                    vp9_i8x8_mode_tree, cm->fc.i8x8_mode_counts,
641
                    cm->fc.pre_i8x8_mode_prob, cm->fc.i8x8_mode_prob, 0);
John Koleszar's avatar
John Koleszar committed
642
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
643
    update_mode_probs(VP9_SUBMVREFS,
644
                      vp9_sub_mv_ref_tree, cm->fc.sub_mv_ref_counts[i],
645 646
                      cm->fc.pre_sub_mv_ref_prob[i], cm->fc.sub_mv_ref_prob[i],
                      LEFT4X4);
John Koleszar's avatar
John Koleszar committed
647
  }
648
  update_mode_probs(VP9_NUMMBSPLITS, vp9_mbsplit_tree,
649
                    cm->fc.mbsplit_counts, cm->fc.pre_mbsplit_prob,
650
                    cm->fc.mbsplit_prob, 0);
651 652
#if CONFIG_COMP_INTERINTRA_PRED
  if (cm->use_interintra) {
653 654 655 656
    int factor, interintra_prob, count;

    interintra_prob = get_binary_prob(cm->fc.interintra_counts[0],
                                      cm->fc.interintra_counts[1]);
657 658 659
    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);
660 661
    cm->fc.interintra_prob = weighted_prob(cm->fc.pre_interintra_prob,
                                           interintra_prob, factor);
662 663
  }
#endif
664 665 666 667
  for (i = 0; i < PARTITION_PLANES; i++)
    update_mode_probs(PARTITION_TYPES, vp9_partition_tree,
                      cm->fc.partition_counts[i], cm->fc.pre_partition_prob[i],
                      cm->fc.partition_prob[i], 0);
668
}
669 670 671 672 673

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

674
  xd->ref_lf_deltas[INTRA_FRAME] = 1;
675
  xd->ref_lf_deltas[LAST_FRAME] = 0;
676 677
  xd->ref_lf_deltas[GOLDEN_FRAME] = -1;
  xd->ref_lf_deltas[ALTREF_FRAME] = -1;
678

679 680 681 682
  xd->mode_lf_deltas[0] = 2;               // I4X4_PRED
  xd->mode_lf_deltas[1] = -1;              // Zero
  xd->mode_lf_deltas[2] = 1;               // New mv
  xd->mode_lf_deltas[3] = 2;               // Split mv
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 708 709 710 711 712 713 714 715 716 717 718 719 720
}

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

721 722 723
  vp9_update_mode_info_border(cm, cm->prev_mip);
  vp9_update_mode_info_in_image(cm, cm->prev_mi);

724 725 726 727 728
  cm->ref_frame_sign_bias[GOLDEN_FRAME] = 0;
  cm->ref_frame_sign_bias[ALTREF_FRAME] = 0;

  cm->frame_context_idx = 0;
}