entropymode.c 21 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
#include "onyxc_int.h"
13
#include "modecont.h"
John Koleszar's avatar
John Koleszar committed
14
#include "vpx_mem/vpx_mem.h"
15

16

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

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

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

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

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

71
static const unsigned int bmode_cts[VP9_BINTRAMODES] = {
John Koleszar's avatar
John Koleszar committed
72 73
  /* DC    TM     VE     HE   LD    RD    VR    VL    HD    HU */
  43891, 17694, 10036, 3920, 3363, 2546, 5119, 3221, 2471, 1723
John Koleszar's avatar
John Koleszar committed
74 75
};

John Koleszar's avatar
John Koleszar committed
76 77 78 79 80 81
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
82 83
} sumvfref_t;

84
int vp9_mv_cont(const int_mv *l, const int_mv *a) {
John Koleszar's avatar
John Koleszar committed
85 86 87
  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
88

John Koleszar's avatar
John Koleszar committed
89 90
  if (lea && lez)
    return SUBMVREF_LEFT_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
91

John Koleszar's avatar
John Koleszar committed
92 93
  if (lea)
    return SUBMVREF_LEFT_ABOVE_SAME;
John Koleszar's avatar
John Koleszar committed
94

John Koleszar's avatar
John Koleszar committed
95 96
  if (aez)
    return SUBMVREF_ABOVE_ZED;
John Koleszar's avatar
John Koleszar committed
97

John Koleszar's avatar
John Koleszar committed
98 99
  if (lez)
    return SUBMVREF_LEFT_ZED;
John Koleszar's avatar
John Koleszar committed
100

John Koleszar's avatar
John Koleszar committed
101
  return SUBMVREF_NORMAL;
John Koleszar's avatar
John Koleszar committed
102 103
}

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

106
const vp9_prob vp9_sub_mv_ref_prob2 [SUBMVREF_COUNT][VP9_SUBMVREFS - 1] = {
John Koleszar's avatar
John Koleszar committed
107 108 109 110 111
  { 147, 136, 18 },
  { 106, 145, 1  },
  { 179, 121, 1  },
  { 223, 1, 34 },
  { 208, 1, 1  }
John Koleszar's avatar
John Koleszar committed
112 113
};

114
vp9_mbsplit vp9_mbsplits [VP9_NUMMBSPLITS] = {
John Koleszar's avatar
John Koleszar committed
115 116 117 118 119
  {
    0,  0,  0,  0,
    0,  0,  0,  0,
    1,  1,  1,  1,
    1,  1,  1,  1,
120
  }, {
John Koleszar's avatar
John Koleszar committed
121 122 123 124
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
    0,  0,  1,  1,
125
  }, {
John Koleszar's avatar
John Koleszar committed
126 127 128 129
    0,  0,  1,  1,
    0,  0,  1,  1,
    2,  2,  3,  3,
    2,  2,  3,  3,
130
  }, {
John Koleszar's avatar
John Koleszar committed
131 132 133 134 135
    0,  1,  2,  3,
    4,  5,  6,  7,
    8,  9,  10, 11,
    12, 13, 14, 15,
  },
John Koleszar's avatar
John Koleszar committed
136 137
};

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

140
const vp9_prob vp9_mbsplit_probs [VP9_NUMMBSPLITS - 1] = { 110, 111, 150};
John Koleszar's avatar
John Koleszar committed
141 142 143

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

144
const vp9_tree_index vp9_bmode_tree[VP9_BINTRAMODES * 2 - 2] = /* INTRAMODECONTEXTNODE value */
John Koleszar's avatar
John Koleszar committed
145
{
John Koleszar's avatar
John Koleszar committed
146 147 148 149 150 151 152 153 154
  -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 */
John Koleszar's avatar
John Koleszar committed
155 156
};

157 158
/* Again, these trees use the same probability indices as their
   explicitly-programmed predecessors. */
159
const vp9_tree_index vp9_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
160 161 162 163 164 165 166 167 168 169 170
  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
171 172
};

173
const vp9_tree_index vp9_kf_ymode_tree[VP9_YMODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
174 175 176 177 178 179 180 181 182 183 184
  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
185 186
};

187
const vp9_tree_index vp9_i8x8_mode_tree[VP9_I8X8_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
188 189 190 191 192 193 194 195 196
  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
197 198
};

199
const vp9_tree_index vp9_uv_mode_tree[VP9_UV_MODES * 2 - 2] = {
John Koleszar's avatar
John Koleszar committed
200 201 202 203 204 205 206 207 208
  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
209 210
};

211
const vp9_tree_index vp9_mbsplit_tree[6] = {
212 213 214
  -PARTITIONING_4X4,   2,
  -PARTITIONING_8X8,   4,
  -PARTITIONING_16X8, -PARTITIONING_8X16,
John Koleszar's avatar
John Koleszar committed
215 216
};

217
const vp9_tree_index vp9_mv_ref_tree[8] = {
John Koleszar's avatar
John Koleszar committed
218 219 220 221
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, 6,
  -NEWMV, -SPLITMV
John Koleszar's avatar
John Koleszar committed
222 223
};

Ronald S. Bultje's avatar
Ronald S. Bultje committed
224
#if CONFIG_SUPERBLOCKS
225
const vp9_tree_index vp9_sb_mv_ref_tree[6] = {
Ronald S. Bultje's avatar
Ronald S. Bultje committed
226 227 228 229 230 231
  -ZEROMV, 2,
  -NEARESTMV, 4,
  -NEARMV, -NEWMV
};
#endif

232
const vp9_tree_index vp9_sub_mv_ref_tree[6] = {
John Koleszar's avatar
John Koleszar committed
233 234 235
  -LEFT4X4, 2,
  -ABOVE4X4, 4,
  -ZERO4X4, -NEW4X4
John Koleszar's avatar
John Koleszar committed
236 237
};

238 239
struct vp9_token_struct vp9_bmode_encodings   [VP9_BINTRAMODES];
struct vp9_token_struct vp9_ymode_encodings   [VP9_YMODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
240
#if CONFIG_SUPERBLOCKS
241
struct vp9_token_struct vp9_sb_kf_ymode_encodings [VP9_I32X32_MODES];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
242
#endif
243 244 245 246
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
247

248
struct vp9_token_struct vp9_mv_ref_encoding_array    [VP9_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
249
#if CONFIG_SUPERBLOCKS
250
struct vp9_token_struct vp9_sb_mv_ref_encoding_array  [VP9_MVREFS];
Ronald S. Bultje's avatar
Ronald S. Bultje committed
251
#endif
252
struct vp9_token_struct vp9_sub_mv_ref_encoding_array [VP9_SUBMVREFS];
John Koleszar's avatar
John Koleszar committed
253

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

257
  vp9_tree_probs_from_distribution(VP9_YMODES, vp9_ymode_encodings,
258 259
                                   vp9_ymode_tree, x->fc.ymode_prob,
                                   bct, y_mode_cts, 256, 1);
John Koleszar's avatar
John Koleszar committed
260 261
  {
    int i;
Ronald S. Bultje's avatar
Ronald S. Bultje committed
262
    for (i = 0; i < 8; i++) {
263 264 265
      vp9_tree_probs_from_distribution(VP9_YMODES, vp9_kf_ymode_encodings,
                                       vp9_kf_ymode_tree, x->kf_ymode_prob[i],
                                       bct, kf_y_mode_cts[i], 256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
266
#if CONFIG_SUPERBLOCKS
267 268 269 270 271
      vp9_tree_probs_from_distribution(VP9_I32X32_MODES,
                                       vp9_sb_kf_ymode_encodings,
                                       vp9_sb_ymode_tree,
                                       x->sb_kf_ymode_prob[i], bct,
                                       kf_y_mode_cts[i], 256, 1);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
272 273
#endif
    }
John Koleszar's avatar
John Koleszar committed
274 275 276
  }
  {
    int i;
277
    for (i = 0; i < VP9_YMODES; i++) {
278 279 280 281 282 283
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->kf_uv_mode_prob[i],
                                       bct, kf_uv_mode_cts[i], 256, 1);
      vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                       vp9_uv_mode_tree, x->fc.uv_mode_prob[i],
                                       bct, uv_mode_cts[i], 256, 1);
284
    }
John Koleszar's avatar
John Koleszar committed
285
  }
286

287 288 289
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, x->fc.i8x8_mode_prob,
                                   bct, i8x8_mode_cts, 256, 1);
290

291 292
  vpx_memcpy(x->fc.sub_mv_ref_prob, vp9_sub_mv_ref_prob2,
             sizeof(vp9_sub_mv_ref_prob2));
293 294 295
  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));
John Koleszar's avatar
John Koleszar committed
296 297 298 299
}


static void intra_bmode_probs_from_distribution(
300 301 302 303
  vp9_prob p [VP9_BINTRAMODES - 1],
  unsigned int branch_ct [VP9_BINTRAMODES - 1] [2],
  const unsigned int events [VP9_BINTRAMODES]) {
  vp9_tree_probs_from_distribution(VP9_BINTRAMODES, vp9_bmode_encodings,
304 305
                                   vp9_bmode_tree, p, branch_ct,
                                   events, 256, 1);
John Koleszar's avatar
John Koleszar committed
306 307
}

308 309
void vp9_default_bmode_probs(vp9_prob p [VP9_BINTRAMODES - 1]) {
  unsigned int branch_ct [VP9_BINTRAMODES - 1] [2];
John Koleszar's avatar
John Koleszar committed
310
  intra_bmode_probs_from_distribution(p, branch_ct, bmode_cts);
John Koleszar's avatar
John Koleszar committed
311 312
}

313 314 315 316
void vp9_kf_default_bmode_probs(vp9_prob p[VP9_BINTRAMODES][VP9_BINTRAMODES]
                                          [VP9_BINTRAMODES - 1]) {
  unsigned int branch_ct[VP9_BINTRAMODES - 1][2];
  int i, j;
John Koleszar's avatar
John Koleszar committed
317

318 319
  for (i = 0; i < VP9_BINTRAMODES; i++) {
    for (j = 0; j < VP9_BINTRAMODES; j++) {
John Koleszar's avatar
John Koleszar committed
320
      intra_bmode_probs_from_distribution(
321
        p[i][j], branch_ct, vp9_kf_default_bmode_counts[i][j]);
322 323
    }
  }
John Koleszar's avatar
John Koleszar committed
324 325
}

326 327
#if VP9_SWITCHABLE_FILTERS == 3
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
328 329 330
  -0, 2,
  -1, -2
};
331 332
struct vp9_token_struct vp9_switchable_interp_encodings[VP9_SWITCHABLE_FILTERS];
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
333
  EIGHTTAP, SIXTAP, EIGHTTAP_SHARP};
334
const int vp9_switchable_interp_map[SWITCHABLE+1] = {1, -1, 0, 2, -1};
335 336
const vp9_prob vp9_switchable_interp_prob [VP9_SWITCHABLE_FILTERS+1]
                                          [VP9_SWITCHABLE_FILTERS-1] = {
337 338
  {248, 192}, { 32, 248}, { 32,  32}, {192, 160}
};
339 340
#elif VP9_SWITCHABLE_FILTERS == 2
const vp9_tree_index vp9_switchable_interp_tree[VP9_SWITCHABLE_FILTERS*2-2] = {
341 342
  -0, -1,
};
343 344 345
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] = {
346 347 348 349
  {248},
  { 64},
  {192},
};
350
const INTERPOLATIONFILTERTYPE vp9_switchable_interp[VP9_SWITCHABLE_FILTERS] = {
351
  EIGHTTAP, EIGHTTAP_SHARP};
352
const int vp9_switchable_interp_map[SWITCHABLE+1] = {-1, -1, 0, 1, -1}; //8, 8s
353
#endif
John Koleszar's avatar
John Koleszar committed
354

355
void vp9_entropy_mode_init() {
356 357 358
  vp9_tokens_from_tree(vp9_bmode_encodings,   vp9_bmode_tree);
  vp9_tokens_from_tree(vp9_ymode_encodings,   vp9_ymode_tree);
  vp9_tokens_from_tree(vp9_kf_ymode_encodings, vp9_kf_ymode_tree);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
359
#if CONFIG_SUPERBLOCKS
360
  vp9_tokens_from_tree(vp9_sb_kf_ymode_encodings, vp9_sb_ymode_tree);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
361
#endif
362 363 364 365 366 367 368 369
  vp9_tokens_from_tree(vp9_uv_mode_encodings,  vp9_uv_mode_tree);
  vp9_tokens_from_tree(vp9_i8x8_mode_encodings,  vp9_i8x8_mode_tree);
  vp9_tokens_from_tree(vp9_mbsplit_encodings, vp9_mbsplit_tree);
  vp9_tokens_from_tree(vp9_switchable_interp_encodings,
                       vp9_switchable_interp_tree);

  vp9_tokens_from_tree_offset(vp9_mv_ref_encoding_array,
                              vp9_mv_ref_tree, NEARESTMV);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
370
#if CONFIG_SUPERBLOCKS
371 372
  vp9_tokens_from_tree_offset(vp9_sb_mv_ref_encoding_array,
                              vp9_sb_mv_ref_tree, NEARESTMV);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
373
#endif
374 375
  vp9_tokens_from_tree_offset(vp9_sub_mv_ref_encoding_array,
                              vp9_sub_mv_ref_tree, LEFT4X4);
John Koleszar's avatar
John Koleszar committed
376
}
Yaowu Xu's avatar
Yaowu Xu committed
377

378
void vp9_init_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
379 380
  vpx_memset(pc->fc.mv_ref_ct, 0, sizeof(pc->fc.mv_ref_ct));
  vpx_memset(pc->fc.mv_ref_ct_a, 0, sizeof(pc->fc.mv_ref_ct_a));
381

John Koleszar's avatar
John Koleszar committed
382
  vpx_memcpy(pc->fc.mode_context,
383
             vp9_default_mode_contexts,
John Koleszar's avatar
John Koleszar committed
384 385
             sizeof(pc->fc.mode_context));
  vpx_memcpy(pc->fc.mode_context_a,
386
             vp9_default_mode_contexts_a,
John Koleszar's avatar
John Koleszar committed
387
             sizeof(pc->fc.mode_context_a));
388

Yaowu Xu's avatar
Yaowu Xu committed
389 390
}

391
void vp9_accum_mv_refs(VP9_COMMON *pc,
Yaowu Xu's avatar
Yaowu Xu committed
392
                       MB_PREDICTION_MODE m,
John Koleszar's avatar
John Koleszar committed
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
                       const int ct[4]) {
  int (*mv_ref_ct)[4][2];

  if (pc->refresh_alt_ref_frame)
    mv_ref_ct = pc->fc.mv_ref_ct_a;
  else
    mv_ref_ct = pc->fc.mv_ref_ct;

  if (m == ZEROMV) {
    ++mv_ref_ct [ct[0]] [0] [0];
  } else {
    ++mv_ref_ct [ct[0]] [0] [1];
    if (m == NEARESTMV) {
      ++mv_ref_ct [ct[1]] [1] [0];
    } else {
      ++mv_ref_ct [ct[1]] [1] [1];
      if (m == NEARMV) {
        ++mv_ref_ct [ct[2]] [2] [0];
      } else {
        ++mv_ref_ct [ct[2]] [2] [1];
        if (m == NEWMV) {
          ++mv_ref_ct [ct[3]] [3] [0];
        } else {
          ++mv_ref_ct [ct[3]] [3] [1];
Yaowu Xu's avatar
Yaowu Xu committed
417
        }
John Koleszar's avatar
John Koleszar committed
418
      }
Yaowu Xu's avatar
Yaowu Xu committed
419
    }
John Koleszar's avatar
John Koleszar committed
420
  }
Yaowu Xu's avatar
Yaowu Xu committed
421 422
}

423
#define MVREF_COUNT_SAT 20
Deb Mukherjee's avatar
Deb Mukherjee committed
424
#define MVREF_MAX_UPDATE_FACTOR 144
425
void vp9_update_mode_context(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
  int i, j;
  int (*mv_ref_ct)[4][2];
  int (*mode_context)[4];

  if (pc->refresh_alt_ref_frame) {
    mv_ref_ct = pc->fc.mv_ref_ct_a;
    mode_context = pc->fc.mode_context_a;
  } else {
    mv_ref_ct = pc->fc.mv_ref_ct;
    mode_context = pc->fc.mode_context;
  }

  for (j = 0; j < 6; j++) {
    for (i = 0; i < 4; i++) {
      int this_prob;
      int count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1];
      int factor;
      {
        this_prob = count > 0 ? 256 * mv_ref_ct[j][i][0] / count : 128;
        count = count > MVREF_COUNT_SAT ? MVREF_COUNT_SAT : count;
        factor = (MVREF_MAX_UPDATE_FACTOR * count / MVREF_COUNT_SAT);
        this_prob = (pc->fc.vp8_mode_contexts[j][i] * (256 - factor) +
                     this_prob * factor + 128) >> 8;
        this_prob = this_prob ? (this_prob < 255 ? this_prob : 255) : 1;
        mode_context[j][i] = this_prob;
      }
Yaowu Xu's avatar
Yaowu Xu committed
452
    }
John Koleszar's avatar
John Koleszar committed
453
  }
Yaowu Xu's avatar
Yaowu Xu committed
454
}
455

456
#ifdef MODE_STATS
Yaowu Xu's avatar
Yaowu Xu committed
457
#include "vp8/common/modecont.h"
458
void print_mode_contexts(VP9_COMMON *pc) {
John Koleszar's avatar
John Koleszar committed
459 460 461 462 463
  int j, i;
  printf("\n====================\n");
  for (j = 0; j < 6; j++) {
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context[j][i]);
Yaowu Xu's avatar
Yaowu Xu committed
464
    }
John Koleszar's avatar
John Koleszar committed
465 466 467 468 469 470
    printf("\n");
  }
  printf("====================\n");
  for (j = 0; j < 6; j++) {
    for (i = 0; i < 4; i++) {
      printf("%4d ", pc->fc.mode_context_a[j][i]);
471
    }
John Koleszar's avatar
John Koleszar committed
472 473
    printf("\n");
  }
Yaowu Xu's avatar
Yaowu Xu committed
474
}
475
#endif
476

John Koleszar's avatar
John Koleszar committed
477
// #define MODE_COUNT_TESTING
Deb Mukherjee's avatar
Deb Mukherjee committed
478 479
#define MODE_COUNT_SAT 20
#define MODE_MAX_UPDATE_FACTOR 144
480
void vp9_adapt_mode_probs(VP9_COMMON *cm) {
John Koleszar's avatar
John Koleszar committed
481 482
  int i, t, count, factor;
  unsigned int branch_ct[32][2];
483 484 485 486 487 488
  vp9_prob ymode_probs[VP9_YMODES - 1];
  vp9_prob uvmode_probs[VP9_UV_MODES - 1];
  vp9_prob bmode_probs[VP9_BINTRAMODES - 1];
  vp9_prob i8x8_mode_probs[VP9_I8X8_MODES - 1];
  vp9_prob sub_mv_ref_probs[VP9_SUBMVREFS - 1];
  vp9_prob mbsplit_probs[VP9_NUMMBSPLITS - 1];
489
#ifdef MODE_COUNT_TESTING
John Koleszar's avatar
John Koleszar committed
490
  printf("static const unsigned int\nymode_counts"
491 492
         "[VP9_YMODES] = {\n");
  for (t = 0; t < VP9_YMODES; ++t) printf("%d, ", cm->fc.ymode_counts[t]);
John Koleszar's avatar
John Koleszar committed
493 494
  printf("};\n");
  printf("static const unsigned int\nuv_mode_counts"
495 496
         "[VP9_YMODES] [VP9_UV_MODES] = {\n");
  for (i = 0; i < VP9_YMODES; ++i) {
John Koleszar's avatar
John Koleszar committed
497
    printf("  {");
498
    for (t = 0; t < VP9_UV_MODES; ++t) printf("%d, ", cm->fc.uv_mode_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
499 500 501 502
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nbmode_counts"
503 504
         "[VP9_BINTRAMODES] = {\n");
  for (t = 0; t < VP9_BINTRAMODES; ++t) printf("%d, ", cm->fc.bmode_counts[t]);
John Koleszar's avatar
John Koleszar committed
505 506
  printf("};\n");
  printf("static const unsigned int\ni8x8_mode_counts"
507 508
         "[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
509 510
  printf("};\n");
  printf("static const unsigned int\nsub_mv_ref_counts"
511
         "[SUBMVREF_COUNT] [VP9_SUBMVREFS] = {\n");
John Koleszar's avatar
John Koleszar committed
512 513
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
    printf("  {");
514
    for (t = 0; t < VP9_SUBMVREFS; ++t) printf("%d, ", cm->fc.sub_mv_ref_counts[i][t]);
John Koleszar's avatar
John Koleszar committed
515 516 517 518
    printf("},\n");
  }
  printf("};\n");
  printf("static const unsigned int\nmbsplit_counts"
519 520
         "[VP9_NUMMBSPLITS] = {\n");
  for (t = 0; t < VP9_NUMMBSPLITS; ++t) printf("%d, ", cm->fc.mbsplit_counts[t]);
John Koleszar's avatar
John Koleszar committed
521
  printf("};\n");
522
#endif
523
  vp9_tree_probs_from_distribution(
524
    VP9_YMODES, vp9_ymode_encodings, vp9_ymode_tree,
John Koleszar's avatar
John Koleszar committed
525 526
    ymode_probs, branch_ct, cm->fc.ymode_counts,
    256, 1);
527
  for (t = 0; t < VP9_YMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
528 529 530 531 532 533 534 535 536 537
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_ymode_prob[t] * (256 - factor) +
            (int)ymode_probs[t] * factor + 128) >> 8;
    if (prob <= 0) cm->fc.ymode_prob[t] = 1;
    else if (prob > 255) cm->fc.ymode_prob[t] = 255;
    else cm->fc.ymode_prob[t] = prob;
  }
538
  for (i = 0; i < VP9_YMODES; ++i) {
539 540 541
    vp9_tree_probs_from_distribution(VP9_UV_MODES, vp9_uv_mode_encodings,
                                     vp9_uv_mode_tree, uvmode_probs, branch_ct,
                                     cm->fc.uv_mode_counts[i], 256, 1);
542
    for (t = 0; t < VP9_UV_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
543 544 545 546 547 548 549 550 551
      int prob;
      count = branch_ct[t][0] + branch_ct[t][1];
      count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
      factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
      prob = ((int)cm->fc.pre_uv_mode_prob[i][t] * (256 - factor) +
              (int)uvmode_probs[t] * factor + 128) >> 8;
      if (prob <= 0) cm->fc.uv_mode_prob[i][t] = 1;
      else if (prob > 255) cm->fc.uv_mode_prob[i][t] = 255;
      else cm->fc.uv_mode_prob[i][t] = prob;
552
    }
John Koleszar's avatar
John Koleszar committed
553
  }
554 555 556
  vp9_tree_probs_from_distribution(VP9_BINTRAMODES, vp9_bmode_encodings,
                                   vp9_bmode_tree, bmode_probs, branch_ct,
                                   cm->fc.bmode_counts, 256, 1);
557
  for (t = 0; t < VP9_BINTRAMODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
558 559 560 561 562 563 564 565 566 567
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_bmode_prob[t] * (256 - factor) +
            (int)bmode_probs[t] * factor + 128) >> 8;
    if (prob <= 0) cm->fc.bmode_prob[t] = 1;
    else if (prob > 255) cm->fc.bmode_prob[t] = 255;
    else cm->fc.bmode_prob[t] = prob;
  }
568 569 570
  vp9_tree_probs_from_distribution(VP9_I8X8_MODES, vp9_i8x8_mode_encodings,
                                   vp9_i8x8_mode_tree, i8x8_mode_probs,
                                   branch_ct, cm->fc.i8x8_mode_counts, 256, 1);
571
  for (t = 0; t < VP9_I8X8_MODES - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
572 573 574 575 576 577 578 579 580 581 582
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_i8x8_mode_prob[t] * (256 - factor) +
            (int)i8x8_mode_probs[t] * factor + 128) >> 8;
    if (prob <= 0) cm->fc.i8x8_mode_prob[t] = 1;
    else if (prob > 255) cm->fc.i8x8_mode_prob[t] = 255;
    else cm->fc.i8x8_mode_prob[t] = prob;
  }
  for (i = 0; i < SUBMVREF_COUNT; ++i) {
583 584 585 586 587
    vp9_tree_probs_from_distribution(VP9_SUBMVREFS,
                                     vp9_sub_mv_ref_encoding_array,
                                     vp9_sub_mv_ref_tree, sub_mv_ref_probs,
                                     branch_ct, cm->fc.sub_mv_ref_counts[i],
                                     256, 1);
588
    for (t = 0; t < VP9_SUBMVREFS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
589 590 591 592 593 594 595 596 597
      int prob;
      count = branch_ct[t][0] + branch_ct[t][1];
      count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
      factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
      prob = ((int)cm->fc.pre_sub_mv_ref_prob[i][t] * (256 - factor) +
              (int)sub_mv_ref_probs[t] * factor + 128) >> 8;
      if (prob <= 0) cm->fc.sub_mv_ref_prob[i][t] = 1;
      else if (prob > 255) cm->fc.sub_mv_ref_prob[i][t] = 255;
      else cm->fc.sub_mv_ref_prob[i][t] = prob;
598
    }
John Koleszar's avatar
John Koleszar committed
599
  }
600 601 602
  vp9_tree_probs_from_distribution(VP9_NUMMBSPLITS, vp9_mbsplit_encodings,
                                   vp9_mbsplit_tree, mbsplit_probs, branch_ct,
                                   cm->fc.mbsplit_counts, 256, 1);
603
  for (t = 0; t < VP9_NUMMBSPLITS - 1; ++t) {
John Koleszar's avatar
John Koleszar committed
604 605 606 607 608 609 610 611 612 613
    int prob;
    count = branch_ct[t][0] + branch_ct[t][1];
    count = count > MODE_COUNT_SAT ? MODE_COUNT_SAT : count;
    factor = (MODE_MAX_UPDATE_FACTOR * count / MODE_COUNT_SAT);
    prob = ((int)cm->fc.pre_mbsplit_prob[t] * (256 - factor) +
            (int)mbsplit_probs[t] * factor + 128) >> 8;
    if (prob <= 0) cm->fc.mbsplit_prob[t] = 1;
    else if (prob > 255) cm->fc.mbsplit_prob[t] = 255;
    else cm->fc.mbsplit_prob[t] = prob;
  }
614
}