vp9_tokenize.c 29 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
14
15
 */


#include <math.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
16
17
#include "vp9/encoder/vp9_onyx_int.h"
#include "vp9/encoder/vp9_tokenize.h"
John Koleszar's avatar
John Koleszar committed
18
19
#include "vpx_mem/vpx_mem.h"

20
21
22
#include "vp9/common/vp9_pred_common.h"
#include "vp9/common/vp9_seg_common.h"
#include "vp9/common/vp9_entropy.h"
23

John Koleszar's avatar
John Koleszar committed
24
/* Global event counters used for accumulating statistics across several
25
   compressions, then generating vp9_context.c = initial stats. */
John Koleszar's avatar
John Koleszar committed
26
27

#ifdef ENTROPY_STATS
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
vp9_coeff_accum context_counters_4x4[BLOCK_TYPES_4X4];
vp9_coeff_accum hybrid_context_counters_4x4[BLOCK_TYPES_4X4];
vp9_coeff_accum context_counters_8x8[BLOCK_TYPES_8X8];
vp9_coeff_accum hybrid_context_counters_8x8[BLOCK_TYPES_8X8];
vp9_coeff_accum context_counters_16x16[BLOCK_TYPES_16X16];
vp9_coeff_accum hybrid_context_counters_16x16[BLOCK_TYPES_16X16];
vp9_coeff_accum context_counters_32x32[BLOCK_TYPES_32X32];

extern vp9_coeff_stats tree_update_hist_4x4[BLOCK_TYPES_4X4];
extern vp9_coeff_stats hybrid_tree_update_hist_4x4[BLOCK_TYPES_4X4];
extern vp9_coeff_stats tree_update_hist_8x8[BLOCK_TYPES_8X8];
extern vp9_coeff_stats hybrid_tree_update_hist_8x8[BLOCK_TYPES_8X8];
extern vp9_coeff_stats tree_update_hist_16x16[BLOCK_TYPES_16X16];
extern vp9_coeff_stats hybrid_tree_update_hist_16x16[BLOCK_TYPES_16X16];
extern vp9_coeff_stats tree_update_hist_32x32[BLOCK_TYPES_32X32];
43
44
#endif  /* ENTROPY_STATS */

John Koleszar's avatar
John Koleszar committed
45
static TOKENVALUE dct_value_tokens[DCT_MAX_VALUE * 2];
46
const TOKENVALUE *vp9_dct_value_tokens_ptr;
John Koleszar's avatar
John Koleszar committed
47
static int dct_value_cost[DCT_MAX_VALUE * 2];
48
const int *vp9_dct_value_cost_ptr;
49

John Koleszar's avatar
John Koleszar committed
50
static void fill_value_tokens() {
John Koleszar's avatar
John Koleszar committed
51

John Koleszar's avatar
John Koleszar committed
52
  TOKENVALUE *const t = dct_value_tokens + DCT_MAX_VALUE;
53
  vp9_extra_bit_struct *const e = vp9_extra_bits;
John Koleszar's avatar
John Koleszar committed
54

John Koleszar's avatar
John Koleszar committed
55
56
  int i = -DCT_MAX_VALUE;
  int sign = 1;
John Koleszar's avatar
John Koleszar committed
57

John Koleszar's avatar
John Koleszar committed
58
59
60
  do {
    if (!i)
      sign = 0;
John Koleszar's avatar
John Koleszar committed
61

John Koleszar's avatar
John Koleszar committed
62
63
64
    {
      const int a = sign ? -i : i;
      int eb = sign;
John Koleszar's avatar
John Koleszar committed
65

John Koleszar's avatar
John Koleszar committed
66
67
      if (a > 4) {
        int j = 4;
John Koleszar's avatar
John Koleszar committed
68

John Koleszar's avatar
John Koleszar committed
69
        while (++j < 11  &&  e[j].base_val <= a) {}
John Koleszar's avatar
John Koleszar committed
70

John Koleszar's avatar
John Koleszar committed
71
72
73
74
        t[i].Token = --j;
        eb |= (a - e[j].base_val) << 1;
      } else
        t[i].Token = a;
John Koleszar's avatar
John Koleszar committed
75

John Koleszar's avatar
John Koleszar committed
76
77
      t[i].Extra = eb;
    }
John Koleszar's avatar
John Koleszar committed
78

John Koleszar's avatar
John Koleszar committed
79
80
81
    // initialize the cost for extra bits for all possible coefficient value.
    {
      int cost = 0;
82
      vp9_extra_bit_struct *p = vp9_extra_bits + t[i].Token;
John Koleszar's avatar
John Koleszar committed
83

John Koleszar's avatar
John Koleszar committed
84
85
86
      if (p->base_val) {
        const int extra = t[i].Extra;
        const int Length = p->Len;
John Koleszar's avatar
John Koleszar committed
87

John Koleszar's avatar
John Koleszar committed
88
        if (Length)
89
          cost += treed_cost(p->tree, p->prob, extra >> 1, Length);
John Koleszar's avatar
John Koleszar committed
90

91
        cost += vp9_cost_bit(vp9_prob_half, extra & 1); /* sign */
John Koleszar's avatar
John Koleszar committed
92
93
        dct_value_cost[i + DCT_MAX_VALUE] = cost;
      }
John Koleszar's avatar
John Koleszar committed
94
95
96

    }

John Koleszar's avatar
John Koleszar committed
97
98
  } while (++i < DCT_MAX_VALUE);

99
100
  vp9_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE;
  vp9_dct_value_cost_ptr   = dct_value_cost + DCT_MAX_VALUE;
John Koleszar's avatar
John Koleszar committed
101
}
102

103
static void tokenize_b(VP9_COMP *cpi,
104
                       MACROBLOCKD *xd,
Yaowu Xu's avatar
Yaowu Xu committed
105
                       const int ib,
106
107
108
109
                       TOKENEXTRA **tp,
                       PLANE_TYPE type,
                       TX_SIZE tx_size,
                       int dry_run) {
Daniel Kang's avatar
Daniel Kang committed
110
  int pt; /* near block/prev token context index */
111
  int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0;
Yaowu Xu's avatar
Yaowu Xu committed
112
  const BLOCKD * const b = xd->block + ib;
113
  const int eob = b->eob;     /* one beyond last nonzero coeff */
Daniel Kang's avatar
Daniel Kang committed
114
  TOKENEXTRA *t = *tp;        /* store tokens starting here */
115
  int16_t *qcoeff_ptr = b->qcoeff;
116
  int seg_eob;
Yaowu Xu's avatar
Yaowu Xu committed
117
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
118
  const int *bands, *scan;
119
120
  vp9_coeff_count *counts;
  vp9_coeff_probs *probs;
121
122
  const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
                          get_tx_type(xd, b) : DCT_DCT;
Daniel Kang's avatar
Daniel Kang committed
123

Yaowu Xu's avatar
Yaowu Xu committed
124
125
126
127
128
129
  ENTROPY_CONTEXT *const a = (ENTROPY_CONTEXT *)xd->above_context +
      vp9_block2above[tx_size][ib];
  ENTROPY_CONTEXT *const l = (ENTROPY_CONTEXT *)xd->left_context +
      vp9_block2left[tx_size][ib];
  ENTROPY_CONTEXT a_ec = *a, l_ec = *l;

130
131
132
133
134
135
  ENTROPY_CONTEXT *const a1 = (ENTROPY_CONTEXT *)(&xd->above_context[1]) +
      vp9_block2above[tx_size][ib];
  ENTROPY_CONTEXT *const l1 = (ENTROPY_CONTEXT *)(&xd->left_context[1]) +
      vp9_block2left[tx_size][ib];


136
137
138
139
  switch (tx_size) {
    default:
    case TX_4X4:
      seg_eob = 16;
140
141
      bands = vp9_coef_bands_4x4;
      scan = vp9_default_zig_zag1d_4x4;
142
      if (tx_type != DCT_DCT) {
143
144
        counts = cpi->hybrid_coef_counts_4x4;
        probs = cpi->common.fc.hybrid_coef_probs_4x4;
145
        if (tx_type == ADST_DCT) {
146
          scan = vp9_row_scan_4x4;
147
        } else if (tx_type == DCT_ADST) {
148
          scan = vp9_col_scan_4x4;
149
150
        }
      } else {
151
152
        counts = cpi->coef_counts_4x4;
        probs = cpi->common.fc.coef_probs_4x4;
153
154
155
156
157
      }
      break;
    case TX_8X8:
      if (type == PLANE_TYPE_Y2) {
        seg_eob = 4;
158
159
        bands = vp9_coef_bands_4x4;
        scan = vp9_default_zig_zag1d_4x4;
160
      } else {
Yaowu Xu's avatar
Yaowu Xu committed
161
162
163
164
#if CONFIG_CNVCONTEXT
        a_ec = (a[0] + a[1]) != 0;
        l_ec = (l[0] + l[1]) != 0;
#endif
165
        seg_eob = 64;
166
167
        bands = vp9_coef_bands_8x8;
        scan = vp9_default_zig_zag1d_8x8;
168
169
170
171
172
173
174
175
176
177
      }
      if (tx_type != DCT_DCT) {
        counts = cpi->hybrid_coef_counts_8x8;
        probs = cpi->common.fc.hybrid_coef_probs_8x8;
      } else {
        counts = cpi->coef_counts_8x8;
        probs = cpi->common.fc.coef_probs_8x8;
      }
      break;
    case TX_16X16:
Yaowu Xu's avatar
Yaowu Xu committed
178
#if CONFIG_CNVCONTEXT
Yaowu Xu's avatar
Yaowu Xu committed
179
180
181
      if (type != PLANE_TYPE_UV) {
        a_ec = (a[0] + a[1] + a[2] + a[3]) != 0;
        l_ec = (l[0] + l[1] + l[2] + l[3]) != 0;
182
183
184
      } else {
        a_ec = (a[0] + a[1] + a1[0] + a1[1]) != 0;
        l_ec = (l[0] + l[1] + l1[0] + l1[1]) != 0;
Yaowu Xu's avatar
Yaowu Xu committed
185
      }
Yaowu Xu's avatar
Yaowu Xu committed
186
#endif
187
      seg_eob = 256;
188
189
      bands = vp9_coef_bands_16x16;
      scan = vp9_default_zig_zag1d_16x16;
190
191
192
193
194
195
196
      if (tx_type != DCT_DCT) {
        counts = cpi->hybrid_coef_counts_16x16;
        probs = cpi->common.fc.hybrid_coef_probs_16x16;
      } else {
        counts = cpi->coef_counts_16x16;
        probs = cpi->common.fc.coef_probs_16x16;
      }
197
      if (type == PLANE_TYPE_UV) {
198
        int uv_idx = (ib - 16) >> 2;
199
200
201
202
        qcoeff_ptr = xd->sb_coeff_data.qcoeff + 1024 + 256 * uv_idx;
      }
      break;
    case TX_32X32:
203
204
205
206
207
208
209
210
#if CONFIG_CNVCONTEXT
      a_ec = a[0] + a[1] + a[2] + a[3] +
             a1[0] + a1[1] + a1[2] + a1[3];
      l_ec = l[0] + l[1] + l[2] + l[3] +
             l1[0] + l1[1] + l1[2] + l1[3];
      a_ec = a_ec != 0;
      l_ec = l_ec != 0;
#endif
211
212
213
214
215
216
      seg_eob = 1024;
      bands = vp9_coef_bands_32x32;
      scan = vp9_default_zig_zag1d_32x32;
      counts = cpi->coef_counts_32x32;
      probs = cpi->common.fc.coef_probs_32x32;
      qcoeff_ptr = xd->sb_coeff_data.qcoeff;
217
      break;
John Koleszar's avatar
John Koleszar committed
218
219
  }

Yaowu Xu's avatar
Yaowu Xu committed
220
221
  VP9_COMBINEENTROPYCONTEXTS(pt, a_ec, l_ec);

Paul Wilkins's avatar
Paul Wilkins committed
222
223
  if (vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP))
    seg_eob = 0;
John Koleszar's avatar
John Koleszar committed
224

225
  do {
226
    const int band = bands[c];
227
228
229
    int token;

    if (c < eob) {
230
      const int rc = scan[c];
231
      const int v = qcoeff_ptr[rc];
232
233
      assert(-DCT_MAX_VALUE <= v  &&  v < DCT_MAX_VALUE);

234
235
      t->Extra = vp9_dct_value_tokens_ptr[v].Extra;
      token    = vp9_dct_value_tokens_ptr[v].Token;
236
237
238
    } else {
      token = DCT_EOB_TOKEN;
    }
John Koleszar's avatar
John Koleszar committed
239
240

    t->Token = token;
241
    t->context_tree = probs[type][band][pt];
242
243
    t->skip_eob_node = (pt == 0) && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) ||
                                     (band > 1 && type == PLANE_TYPE_Y_NO_DC));
244
    assert(vp9_coef_encodings[t->Token].Len - t->skip_eob_node > 0);
245
    if (!dry_run) {
246
      ++counts[type][band][pt][token];
247
    }
248
    pt = vp9_prev_token_class[token];
249
    ++t;
250
251
252
  } while (c < eob && ++c < seg_eob);

  *tp = t;
Yaowu Xu's avatar
Yaowu Xu committed
253
254
255
256
257
258
259
260
  a_ec = l_ec = (c > !type); /* 0 <-> all coeff data is zero */
  a[0] = a_ec;
  l[0] = l_ec;

  if (tx_size == TX_8X8 && type != PLANE_TYPE_Y2) {
    a[1] = a_ec;
    l[1] = l_ec;
  } else if (tx_size == TX_16X16) {
Yaowu Xu's avatar
Yaowu Xu committed
261
262
263
264
    if (type != PLANE_TYPE_UV) {
      a[1] = a[2] = a[3] = a_ec;
      l[1] = l[2] = l[3] = l_ec;
    } else {
265
266
      a1[0] = a1[1] = a[1] = a_ec;
      l1[0] = l1[1] = l[1] = l_ec;
Yaowu Xu's avatar
Yaowu Xu committed
267
    }
268
269
270
271
272
  } else if (tx_size == TX_32X32) {
    a[1] = a[2] = a[3] = a_ec;
    l[1] = l[2] = l[3] = l_ec;
    a1[0] = a1[1] = a1[2] = a1[3] = a_ec;
    l1[0] = l1[1] = l1[2] = l1[3] = l_ec;
Yaowu Xu's avatar
Yaowu Xu committed
273
  }
John Koleszar's avatar
John Koleszar committed
274
275
}

276
int vp9_mby_is_skippable_4x4(MACROBLOCKD *xd, int has_2nd_order) {
John Koleszar's avatar
John Koleszar committed
277
278
  int skip = 1;
  int i = 0;
279

280
  if (has_2nd_order) {
John Koleszar's avatar
John Koleszar committed
281
    for (i = 0; i < 16; i++)
Paul Wilkins's avatar
Paul Wilkins committed
282
283
      skip &= (xd->block[i].eob < 2);
    skip &= (!xd->block[24].eob);
John Koleszar's avatar
John Koleszar committed
284
285
  } else {
    for (i = 0; i < 16; i++)
Paul Wilkins's avatar
Paul Wilkins committed
286
      skip &= (!xd->block[i].eob);
John Koleszar's avatar
John Koleszar committed
287
288
  }
  return skip;
289
}
290

291
int vp9_mbuv_is_skippable_4x4(MACROBLOCKD *xd) {
John Koleszar's avatar
John Koleszar committed
292
293
  int skip = 1;
  int i;
294

John Koleszar's avatar
John Koleszar committed
295
  for (i = 16; i < 24; i++)
Paul Wilkins's avatar
Paul Wilkins committed
296
    skip &= (!xd->block[i].eob);
John Koleszar's avatar
John Koleszar committed
297
  return skip;
298
299
}

300
301
static int mb_is_skippable_4x4(MACROBLOCKD *xd, int has_2nd_order) {
  return (vp9_mby_is_skippable_4x4(xd, has_2nd_order) &
302
          vp9_mbuv_is_skippable_4x4(xd));
303
}
Yaowu Xu's avatar
Yaowu Xu committed
304

305
int vp9_mby_is_skippable_8x8(MACROBLOCKD *xd, int has_2nd_order) {
John Koleszar's avatar
John Koleszar committed
306
307
  int skip = 1;
  int i = 0;
308

309
  if (has_2nd_order) {
Deb Mukherjee's avatar
Deb Mukherjee committed
310
311
312
313
314
315
316
    for (i = 0; i < 16; i += 4)
      skip &= (xd->block[i].eob < 2);
    skip &= (!xd->block[24].eob);
  } else {
    for (i = 0; i < 16; i += 4)
      skip &= (!xd->block[i].eob);
  }
John Koleszar's avatar
John Koleszar committed
317
  return skip;
318
}
319

320
int vp9_mbuv_is_skippable_8x8(MACROBLOCKD *xd) {
Paul Wilkins's avatar
Paul Wilkins committed
321
  return (!xd->block[16].eob) & (!xd->block[20].eob);
322
}
323

324
325
static int mb_is_skippable_8x8(MACROBLOCKD *xd, int has_2nd_order) {
  return (vp9_mby_is_skippable_8x8(xd, has_2nd_order) &
326
          vp9_mbuv_is_skippable_8x8(xd));
Deb Mukherjee's avatar
Deb Mukherjee committed
327
328
}

329
330
static int mb_is_skippable_8x8_4x4uv(MACROBLOCKD *xd, int has_2nd_order) {
  return (vp9_mby_is_skippable_8x8(xd, has_2nd_order) &
331
          vp9_mbuv_is_skippable_4x4(xd));
332
}
Yaowu Xu's avatar
Yaowu Xu committed
333

334
int vp9_mby_is_skippable_16x16(MACROBLOCKD *xd) {
Daniel Kang's avatar
Daniel Kang committed
335
  int skip = 1;
Paul Wilkins's avatar
Paul Wilkins committed
336
  skip &= !xd->block[0].eob;
Daniel Kang's avatar
Daniel Kang committed
337
338
339
  return skip;
}

340
341
static int mb_is_skippable_16x16(MACROBLOCKD *xd) {
  return (vp9_mby_is_skippable_16x16(xd) & vp9_mbuv_is_skippable_8x8(xd));
Daniel Kang's avatar
Daniel Kang committed
342
}
343

344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
int vp9_sby_is_skippable_32x32(MACROBLOCKD *xd) {
  int skip = 1;
  skip &= !xd->block[0].eob;
  return skip;
}

int vp9_sbuv_is_skippable_16x16(MACROBLOCKD *xd) {
  return (!xd->block[16].eob) & (!xd->block[20].eob);
}

static int sb_is_skippable_32x32(MACROBLOCKD *xd) {
  return vp9_sby_is_skippable_32x32(xd) &&
         vp9_sbuv_is_skippable_16x16(xd);
}

void vp9_tokenize_sb(VP9_COMP *cpi,
                     MACROBLOCKD *xd,
                     TOKENEXTRA **t,
                     int dry_run) {
  VP9_COMMON * const cm = &cpi->common;
  MB_MODE_INFO * const mbmi = &xd->mode_info_context->mbmi;
  TOKENEXTRA *t_backup = *t;
  ENTROPY_CONTEXT *A[2] = { (ENTROPY_CONTEXT *) (xd->above_context + 0),
                            (ENTROPY_CONTEXT *) (xd->above_context + 1), };
  ENTROPY_CONTEXT *L[2] = { (ENTROPY_CONTEXT *) (xd->left_context + 0),
                            (ENTROPY_CONTEXT *) (xd->left_context + 1), };
  const int mb_skip_context = vp9_get_pred_context(cm, xd, PRED_MBSKIP);
  const int segment_id = mbmi->segment_id;
Paul Wilkins's avatar
Paul Wilkins committed
372
  const int skip_inc = !vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP);
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
  int b;

  mbmi->mb_skip_coeff = sb_is_skippable_32x32(xd);

  if (mbmi->mb_skip_coeff) {
    if (!dry_run)
      cpi->skip_true_count[mb_skip_context] += skip_inc;
    if (!cm->mb_no_coeff_skip) {
      vp9_stuff_sb(cpi, xd, t, dry_run);
    } else {
      vp9_fix_contexts_sb(xd);
    }
    if (dry_run)
      *t = t_backup;
    return;
  }

  if (!dry_run)
    cpi->skip_false_count[mb_skip_context] += skip_inc;

393
394
  tokenize_b(cpi, xd, 0, t, PLANE_TYPE_Y_WITH_DC,
             TX_32X32, dry_run);
395
396

  for (b = 16; b < 24; b += 4) {
397
    tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV,
398
399
               TX_16X16, dry_run);
  }
400
  A[0][8] = L[0][8] = A[1][8] = L[1][8] = 0;
401
402
403
404
  if (dry_run)
    *t = t_backup;
}

405
void vp9_tokenize_mb(VP9_COMP *cpi,
Paul Wilkins's avatar
Paul Wilkins committed
406
                     MACROBLOCKD *xd,
407
408
                     TOKENEXTRA **t,
                     int dry_run) {
409
  PLANE_TYPE plane_type;
410
  int has_2nd_order;
John Koleszar's avatar
John Koleszar committed
411
  int b;
412
  int tx_size = xd->mode_info_context->mbmi.txfm_size;
Paul Wilkins's avatar
Paul Wilkins committed
413
  int mb_skip_context = vp9_get_pred_context(&cpi->common, xd, PRED_MBSKIP);
414
  TOKENEXTRA *t_backup = *t;
Paul Wilkins's avatar
Paul Wilkins committed
415

John Koleszar's avatar
John Koleszar committed
416
417
418
419
  // If the MB is going to be skipped because of a segment level flag
  // exclude this from the skip count stats used to calculate the
  // transmitted skip probability;
  int skip_inc;
Paul Wilkins's avatar
Paul Wilkins committed
420
  int segment_id = xd->mode_info_context->mbmi.segment_id;
421

Paul Wilkins's avatar
Paul Wilkins committed
422
  if (!vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)) {
John Koleszar's avatar
John Koleszar committed
423
424
425
    skip_inc = 1;
  } else
    skip_inc = 0;
426

427
  has_2nd_order = get_2nd_order_usage(xd);
John Koleszar's avatar
John Koleszar committed
428

429
  switch (tx_size) {
Daniel Kang's avatar
Daniel Kang committed
430
    case TX_16X16:
431

Daniel Kang's avatar
Daniel Kang committed
432
      xd->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable_16x16(xd);
Daniel Kang's avatar
Daniel Kang committed
433
434
      break;
    case TX_8X8:
435
436
      if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
          xd->mode_info_context->mbmi.mode == SPLITMV)
437
438
        xd->mode_info_context->mbmi.mb_skip_coeff =
            mb_is_skippable_8x8_4x4uv(xd, 0);
Deb Mukherjee's avatar
Deb Mukherjee committed
439
      else
440
441
        xd->mode_info_context->mbmi.mb_skip_coeff =
            mb_is_skippable_8x8(xd, has_2nd_order);
Daniel Kang's avatar
Daniel Kang committed
442
      break;
Deb Mukherjee's avatar
Deb Mukherjee committed
443

Daniel Kang's avatar
Daniel Kang committed
444
    default:
445
446
      xd->mode_info_context->mbmi.mb_skip_coeff =
          mb_is_skippable_4x4(xd, has_2nd_order);
Daniel Kang's avatar
Daniel Kang committed
447
448
      break;
  }
449

Paul Wilkins's avatar
Paul Wilkins committed
450
  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
451
452
    if (!dry_run)
      cpi->skip_true_count[mb_skip_context] += skip_inc;
John Koleszar's avatar
John Koleszar committed
453
    if (!cpi->common.mb_no_coeff_skip) {
454
      vp9_stuff_mb(cpi, xd, t, dry_run);
John Koleszar's avatar
John Koleszar committed
455
    } else {
Yaowu Xu's avatar
Yaowu Xu committed
456
      vp9_reset_mb_tokens_context(xd);
John Koleszar's avatar
John Koleszar committed
457
    }
Yaowu Xu's avatar
Yaowu Xu committed
458

459
460
    if (dry_run)
      *t = t_backup;
John Koleszar's avatar
John Koleszar committed
461
462
463
    return;
  }

464
465
  if (!dry_run)
    cpi->skip_false_count[mb_skip_context] += skip_inc;
466

467
  if (has_2nd_order) {
Yaowu Xu's avatar
Yaowu Xu committed
468
    tokenize_b(cpi, xd, 24, t, PLANE_TYPE_Y2, tx_size, dry_run);
469
    plane_type = PLANE_TYPE_Y_NO_DC;
Yaowu Xu's avatar
Yaowu Xu committed
470
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
471
472
    xd->above_context->y2 = 0;
    xd->left_context->y2 = 0;
473
    plane_type = PLANE_TYPE_Y_WITH_DC;
Yaowu Xu's avatar
Yaowu Xu committed
474
  }
John Koleszar's avatar
John Koleszar committed
475

476
  if (tx_size == TX_16X16) {
Yaowu Xu's avatar
Yaowu Xu committed
477
    tokenize_b(cpi, xd, 0, t, PLANE_TYPE_Y_WITH_DC, TX_16X16, dry_run);
Daniel Kang's avatar
Daniel Kang committed
478
    for (b = 16; b < 24; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
479
      tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_8X8, dry_run);
Daniel Kang's avatar
Daniel Kang committed
480
    }
481
  } else if (tx_size == TX_8X8) {
John Koleszar's avatar
John Koleszar committed
482
    for (b = 0; b < 16; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
483
      tokenize_b(cpi, xd, b, t, plane_type, TX_8X8, dry_run);
John Koleszar's avatar
John Koleszar committed
484
    }
485
486
    if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
        xd->mode_info_context->mbmi.mode == SPLITMV) {
487
      for (b = 16; b < 24; b++) {
Yaowu Xu's avatar
Yaowu Xu committed
488
        tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_4X4, dry_run);
489
      }
490
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
491
      for (b = 16; b < 24; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
492
        tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_8X8, dry_run);
Deb Mukherjee's avatar
Deb Mukherjee committed
493
      }
494
    }
Jingning Han's avatar
Jingning Han committed
495
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
496
497
498
499
    for (b = 0; b < 24; b++) {
      if (b >= 16)
        plane_type = PLANE_TYPE_UV;
      tokenize_b(cpi, xd, b, t, plane_type, TX_4X4, dry_run);
500
    }
Jingning Han's avatar
Jingning Han committed
501
  }
502
503
  if (dry_run)
    *t = t_backup;
John Koleszar's avatar
John Koleszar committed
504
}
505

John Koleszar's avatar
John Koleszar committed
506
#ifdef ENTROPY_STATS
John Koleszar's avatar
John Koleszar committed
507
508
509
void init_context_counters(void) {
  FILE *f = fopen("context.bin", "rb");
  if (!f) {
510
511
512
    vpx_memset(context_counters_4x4, 0, sizeof(context_counters_4x4));
    vpx_memset(hybrid_context_counters_4x4, 0,
               sizeof(hybrid_context_counters_4x4));
John Koleszar's avatar
John Koleszar committed
513
    vpx_memset(context_counters_8x8, 0, sizeof(context_counters_8x8));
514
515
    vpx_memset(hybrid_context_counters_8x8, 0,
               sizeof(hybrid_context_counters_8x8));
Daniel Kang's avatar
Daniel Kang committed
516
    vpx_memset(context_counters_16x16, 0, sizeof(context_counters_16x16));
517
518
519
    vpx_memset(hybrid_context_counters_16x16, 0,
               sizeof(hybrid_context_counters_16x16));
    vpx_memset(context_counters_32x32, 0, sizeof(context_counters_32x32));
John Koleszar's avatar
John Koleszar committed
520
  } else {
521
522
523
    fread(context_counters_4x4, sizeof(context_counters_4x4), 1, f);
    fread(hybrid_context_counters_4x4,
          sizeof(hybrid_context_counters_4x4), 1, f);
John Koleszar's avatar
John Koleszar committed
524
    fread(context_counters_8x8, sizeof(context_counters_8x8), 1, f);
525
526
    fread(hybrid_context_counters_8x8,
          sizeof(hybrid_context_counters_8x8), 1, f);
Daniel Kang's avatar
Daniel Kang committed
527
    fread(context_counters_16x16, sizeof(context_counters_16x16), 1, f);
528
529
530
    fread(hybrid_context_counters_16x16,
          sizeof(hybrid_context_counters_16x16), 1, f);
    fread(context_counters_32x32, sizeof(context_counters_32x32), 1, f);
John Koleszar's avatar
John Koleszar committed
531
532
533
534
535
    fclose(f);
  }

  f = fopen("treeupdate.bin", "rb");
  if (!f) {
536
537
538
    vpx_memset(tree_update_hist_4x4, 0, sizeof(tree_update_hist_4x4));
    vpx_memset(hybrid_tree_update_hist_4x4, 0,
               sizeof(hybrid_tree_update_hist_4x4));
John Koleszar's avatar
John Koleszar committed
539
    vpx_memset(tree_update_hist_8x8, 0, sizeof(tree_update_hist_8x8));
540
541
    vpx_memset(hybrid_tree_update_hist_8x8, 0,
               sizeof(hybrid_tree_update_hist_8x8));
Daniel Kang's avatar
Daniel Kang committed
542
    vpx_memset(tree_update_hist_16x16, 0, sizeof(tree_update_hist_16x16));
543
544
545
    vpx_memset(hybrid_tree_update_hist_16x16, 0,
               sizeof(hybrid_tree_update_hist_16x16));
    vpx_memset(tree_update_hist_32x32, 0, sizeof(tree_update_hist_32x32));
John Koleszar's avatar
John Koleszar committed
546
  } else {
547
548
549
    fread(tree_update_hist_4x4, sizeof(tree_update_hist_4x4), 1, f);
    fread(hybrid_tree_update_hist_4x4,
          sizeof(hybrid_tree_update_hist_4x4), 1, f);
John Koleszar's avatar
John Koleszar committed
550
    fread(tree_update_hist_8x8, sizeof(tree_update_hist_8x8), 1, f);
551
552
    fread(hybrid_tree_update_hist_8x8,
          sizeof(hybrid_tree_update_hist_8x8), 1, f);
Daniel Kang's avatar
Daniel Kang committed
553
    fread(tree_update_hist_16x16, sizeof(tree_update_hist_16x16), 1, f);
554
555
556
    fread(hybrid_tree_update_hist_16x16,
          sizeof(hybrid_tree_update_hist_16x16), 1, f);
    fread(tree_update_hist_32x32, sizeof(tree_update_hist_32x32), 1, f);
John Koleszar's avatar
John Koleszar committed
557
558
    fclose(f);
  }
John Koleszar's avatar
John Koleszar committed
559
560
}

561
562
static void print_counter(FILE *f, vp9_coeff_accum *context_counters,
                          int block_types, const char *header) {
John Koleszar's avatar
John Koleszar committed
563
  int type, band, pt, t;
John Koleszar's avatar
John Koleszar committed
564

565
  fprintf(f, "static const vp9_coeff_count %s = {\n", header);
John Koleszar's avatar
John Koleszar committed
566

567
#define Comma(X) (X ? "," : "")
John Koleszar's avatar
John Koleszar committed
568
569
570
571
572
573
574
575
576
577
578
579
  type = 0;
  do {
    fprintf(f, "%s\n  { /* block Type %d */", Comma(type), type);
    band = 0;
    do {
      fprintf(f, "%s\n    { /* Coeff Band %d */", Comma(band), band);
      pt = 0;
      do {
        fprintf(f, "%s\n      {", Comma(pt));

        t = 0;
        do {
John Koleszar's avatar
John Koleszar committed
580
          const int64_t x = context_counters[type][band][pt][t];
John Koleszar's avatar
John Koleszar committed
581
          const int y = (int) x;
582

John Koleszar's avatar
John Koleszar committed
583
          assert(x == (int64_t) y);  /* no overflow handling yet */
John Koleszar's avatar
John Koleszar committed
584
585
586
587
588
589
590
          fprintf(f, "%s %d", Comma(t), y);
        } while (++t < MAX_ENTROPY_TOKENS);
        fprintf(f, "}");
      } while (++pt < PREV_COEF_CONTEXTS);
      fprintf(f, "\n    }");
    } while (++band < COEF_BANDS);
    fprintf(f, "\n  }");
591
  } while (++type < block_types);
Daniel Kang's avatar
Daniel Kang committed
592
  fprintf(f, "\n};\n");
593
}
594

595
596
597
static void print_probs(FILE *f, vp9_coeff_accum *context_counters,
                        int block_types, const char *header) {
  int type, band, pt, t;
Daniel Kang's avatar
Daniel Kang committed
598

599
  fprintf(f, "static const vp9_coeff_probs %s = {", header);
600

John Koleszar's avatar
John Koleszar committed
601
  type = 0;
602
#define Newline(x, spaces) (x ? " " : "\n" spaces)
John Koleszar's avatar
John Koleszar committed
603
  do {
604
605
    fprintf(f, "%s%s{ /* block Type %d */",
            Comma(type), Newline(type, "  "), type);
John Koleszar's avatar
John Koleszar committed
606
607
    band = 0;
    do {
608
609
      fprintf(f, "%s%s{ /* Coeff Band %d */",
              Comma(band), Newline(band, "    "), band);
John Koleszar's avatar
John Koleszar committed
610
611
      pt = 0;
      do {
612
        unsigned int branch_ct[ENTROPY_NODES][2];
John Koleszar's avatar
John Koleszar committed
613
        unsigned int coef_counts[MAX_ENTROPY_TOKENS];
614
        vp9_prob coef_probs[ENTROPY_NODES];
615

John Koleszar's avatar
John Koleszar committed
616
        for (t = 0; t < MAX_ENTROPY_TOKENS; ++t)
617
618
619
          coef_counts[t] = context_counters[type][band][pt][t];
        vp9_tree_probs_from_distribution(MAX_ENTROPY_TOKENS,
                                         vp9_coef_encodings, vp9_coef_tree,
620
                                         coef_probs, branch_ct, coef_counts);
John Koleszar's avatar
John Koleszar committed
621
        fprintf(f, "%s\n      {", Comma(pt));
622

John Koleszar's avatar
John Koleszar committed
623
624
        t = 0;
        do {
625
          fprintf(f, "%s %3d", Comma(t), coef_probs[t]);
John Koleszar's avatar
John Koleszar committed
626
        } while (++t < ENTROPY_NODES);
627

628
        fprintf(f, " }");
John Koleszar's avatar
John Koleszar committed
629
630
631
632
      } while (++pt < PREV_COEF_CONTEXTS);
      fprintf(f, "\n    }");
    } while (++band < COEF_BANDS);
    fprintf(f, "\n  }");
633
  } while (++type < block_types);
John Koleszar's avatar
John Koleszar committed
634
  fprintf(f, "\n};\n");
635
}
636

637
638
void print_context_counters() {
  FILE *f = fopen("vp9_context.c", "w");
639

640
641
  fprintf(f, "#include \"vp9_entropy.h\"\n");
  fprintf(f, "\n/* *** GENERATED FILE: DO NOT EDIT *** */\n\n");
John Koleszar's avatar
John Koleszar committed
642

643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
  /* print counts */
  print_counter(f, context_counters_4x4, BLOCK_TYPES_4X4,
                "vp9_default_coef_counts_4x4[BLOCK_TYPES_4X4]");
  print_counter(f, hybrid_context_counters_4x4, BLOCK_TYPES_4X4,
                "vp9_default_hybrid_coef_counts_4x4[BLOCK_TYPES_4X4]");
  print_counter(f, context_counters_8x8, BLOCK_TYPES_8X8,
                "vp9_default_coef_counts_8x8[BLOCK_TYPES_8X8]");
  print_counter(f, hybrid_context_counters_8x8, BLOCK_TYPES_8X8,
                "vp9_default_hybrid_coef_counts_8x8[BLOCK_TYPES_8X8]");
  print_counter(f, context_counters_16x16, BLOCK_TYPES_16X16,
                "vp9_default_coef_counts_16x16[BLOCK_TYPES_16X16]");
  print_counter(f, hybrid_context_counters_16x16, BLOCK_TYPES_16X16,
                "vp9_default_hybrid_coef_counts_16x16[BLOCK_TYPES_16X16]");
  print_counter(f, context_counters_32x32, BLOCK_TYPES_32X32,
                "vp9_default_coef_counts_32x32[BLOCK_TYPES_32X32]");
Daniel Kang's avatar
Daniel Kang committed
658

659
660
  /* print coefficient probabilities */
  print_probs(f, context_counters_4x4, BLOCK_TYPES_4X4,
661
              "default_coef_probs_4x4[BLOCK_TYPES_4X4]");
662
  print_probs(f, hybrid_context_counters_4x4, BLOCK_TYPES_4X4,
663
              "default_hybrid_coef_probs_4x4[BLOCK_TYPES_4X4]");
664
  print_probs(f, context_counters_8x8, BLOCK_TYPES_8X8,
665
              "default_coef_probs_8x8[BLOCK_TYPES_8X8]");
666
  print_probs(f, hybrid_context_counters_8x8, BLOCK_TYPES_8X8,
667
              "default_hybrid_coef_probs_8x8[BLOCK_TYPES_8X8]");
668
  print_probs(f, context_counters_16x16, BLOCK_TYPES_16X16,
669
              "default_coef_probs_16x16[BLOCK_TYPES_16X16]");
670
  print_probs(f, hybrid_context_counters_16x16, BLOCK_TYPES_16X16,
671
              "default_hybrid_coef_probs_16x16[BLOCK_TYPES_16X16]");
672
  print_probs(f, context_counters_32x32, BLOCK_TYPES_32X32,
673
              "default_coef_probs_32x32[BLOCK_TYPES_32X32]");
Daniel Kang's avatar
Daniel Kang committed
674

John Koleszar's avatar
John Koleszar committed
675
676
677
  fclose(f);

  f = fopen("context.bin", "wb");
678
679
680
  fwrite(context_counters_4x4, sizeof(context_counters_4x4), 1, f);
  fwrite(hybrid_context_counters_4x4,
         sizeof(hybrid_context_counters_4x4), 1, f);
John Koleszar's avatar
John Koleszar committed
681
  fwrite(context_counters_8x8, sizeof(context_counters_8x8), 1, f);
682
683
  fwrite(hybrid_context_counters_8x8,
         sizeof(hybrid_context_counters_8x8), 1, f);
Daniel Kang's avatar
Daniel Kang committed
684
  fwrite(context_counters_16x16, sizeof(context_counters_16x16), 1, f);
685
686
687
  fwrite(hybrid_context_counters_16x16,
         sizeof(hybrid_context_counters_16x16), 1, f);
  fwrite(context_counters_32x32, sizeof(context_counters_32x32), 1, f);
John Koleszar's avatar
John Koleszar committed
688
  fclose(f);
John Koleszar's avatar
John Koleszar committed
689
690
691
}
#endif

692
void vp9_tokenize_initialize() {
John Koleszar's avatar
John Koleszar committed
693
  fill_value_tokens();
John Koleszar's avatar
John Koleszar committed
694
695
}

696
697
698
699
700
701
702
static INLINE void stuff_b(VP9_COMP *cpi,
                           MACROBLOCKD *xd,
                           const int ib,
                           TOKENEXTRA **tp,
                           PLANE_TYPE type,
                           TX_SIZE tx_size,
                           int dry_run) {
Yaowu Xu's avatar
Yaowu Xu committed
703
  const BLOCKD * const b = xd->block + ib;
704
  const int *bands;
705
706
  vp9_coeff_count *counts;
  vp9_coeff_probs *probs;
707
708
709
710
  int pt, band;
  TOKENEXTRA *t = *tp;
  const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
                          get_tx_type(xd, b) : DCT_DCT;
Yaowu Xu's avatar
Yaowu Xu committed
711
712
713
714
715
  ENTROPY_CONTEXT *const a = (ENTROPY_CONTEXT *)xd->above_context +
      vp9_block2above[tx_size][ib];
  ENTROPY_CONTEXT *const l = (ENTROPY_CONTEXT *)xd->left_context +
      vp9_block2left[tx_size][ib];
  ENTROPY_CONTEXT a_ec = *a, l_ec = *l;
716
717
718
719
  ENTROPY_CONTEXT *const a1 = (ENTROPY_CONTEXT *)(&xd->above_context[1]) +
      vp9_block2above[tx_size][ib];
  ENTROPY_CONTEXT *const l1 = (ENTROPY_CONTEXT *)(&xd->left_context[1]) +
      vp9_block2left[tx_size][ib];
John Koleszar's avatar
John Koleszar committed
720

721
722
723
  switch (tx_size) {
    default:
    case TX_4X4:
724
      bands = vp9_coef_bands_4x4;
725
      if (tx_type != DCT_DCT) {
726
727
        counts = cpi->hybrid_coef_counts_4x4;
        probs = cpi->common.fc.hybrid_coef_probs_4x4;
728
      } else {
729
730
        counts = cpi->coef_counts_4x4;
        probs = cpi->common.fc.coef_probs_4x4;
731
732
733
      }
      break;
    case TX_8X8:
Yaowu Xu's avatar
Yaowu Xu committed
734
735
736
737
738
739
#if CONFIG_CNVCONTEXT
      if (type != PLANE_TYPE_Y2) {
        a_ec = (a[0] + a[1]) != 0;
        l_ec = (l[0] + l[1]) != 0;
      }
#endif
740
      bands = vp9_coef_bands_8x8;
741
742
743
744
745
746
747
748
749
      if (tx_type != DCT_DCT) {
        counts = cpi->hybrid_coef_counts_8x8;
        probs = cpi->common.fc.hybrid_coef_probs_8x8;
      } else {
        counts = cpi->coef_counts_8x8;
        probs = cpi->common.fc.coef_probs_8x8;
      }
      break;
    case TX_16X16:
Yaowu Xu's avatar
Yaowu Xu committed
750
#if CONFIG_CNVCONTEXT
Yaowu Xu's avatar
Yaowu Xu committed
751
752
753
      if (type != PLANE_TYPE_UV) {
        a_ec = (a[0] + a[1] + a[2] + a[3]) != 0;
        l_ec = (l[0] + l[1] + l[2] + l[3]) != 0;
754
755
756
      } else {
        a_ec = (a[0] + a[1] + a1[0] + a1[1]) != 0;
        l_ec = (l[0] + l[1] + l1[0] + l1[1]) != 0;
Yaowu Xu's avatar
Yaowu Xu committed
757
      }
Yaowu Xu's avatar
Yaowu Xu committed
758
#endif
759
      bands = vp9_coef_bands_16x16;
760
761
762
763
764
765
766
767
      if (tx_type != DCT_DCT) {
        counts = cpi->hybrid_coef_counts_16x16;
        probs = cpi->common.fc.hybrid_coef_probs_16x16;
      } else {
        counts = cpi->coef_counts_16x16;
        probs = cpi->common.fc.coef_probs_16x16;
      }
      break;
768
    case TX_32X32:
769
770
771
772
773
774
775
776
#if CONFIG_CNVCONTEXT
      a_ec = a[0] + a[1] + a[2] + a[3] +
             a1[0] + a1[1] + a1[2] + a1[3];
      l_ec = l[0] + l[1] + l[2] + l[3] +
             l1[0] + l1[1] + l1[2] + l1[3];
      a_ec = a_ec != 0;
      l_ec = l_ec != 0;
#endif
777
778
779
780
      bands = vp9_coef_bands_32x32;
      counts = cpi->coef_counts_32x32;
      probs = cpi->common.fc.coef_probs_32x32;
      break;
781
  }
Yaowu Xu's avatar
Yaowu Xu committed
782
783
784

  VP9_COMBINEENTROPYCONTEXTS(pt, a_ec, l_ec);

785
  band = bands[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0];
John Koleszar's avatar
John Koleszar committed
786
  t->Token = DCT_EOB_TOKEN;
787
  t->context_tree = probs[type][band][pt];
John Koleszar's avatar
John Koleszar committed
788
789
790
  t->skip_eob_node = 0;
  ++t;
  *tp = t;
791
  *a = *l = 0;
Yaowu Xu's avatar
Yaowu Xu committed
792
793
794
795
  if (tx_size == TX_8X8 && type != PLANE_TYPE_Y2) {
    a[1] = 0;
    l[1] = 0;
  } else if (tx_size == TX_16X16) {
Yaowu Xu's avatar
Yaowu Xu committed
796
797
798
799
    if (type != PLANE_TYPE_UV) {
      a[1] = a[2] = a[3] = 0;
      l[1] = l[2] = l[3] = 0;
    } else {
800
801
      a1[0] = a1[1] = a[1] = a_ec;
      l1[0] = l1[1] = l[1] = l_ec;
Yaowu Xu's avatar
Yaowu Xu committed
802
    }
803
804
805
806
807
  } else if (tx_size == TX_32X32) {
    a[1] = a[2] = a[3] = a_ec;
    l[1] = l[2] = l[3] = l_ec;
    a1[0] = a1[1] = a1[2] = a1[3] = a_ec;
    l1[0] = l1[1] = l1[2] = l1[3] = l_ec;
Yaowu Xu's avatar
Yaowu Xu committed
808
809
  }

810
  if (!dry_run) {
811
    ++counts[type][band][pt][DCT_EOB_TOKEN];
812
  }
813
814
}

815
816
static void stuff_mb_8x8(VP9_COMP *cpi, MACROBLOCKD *xd,
                         TOKENEXTRA **t, int dry_run) {
817
  PLANE_TYPE plane_type;
John Koleszar's avatar
John Koleszar committed
818
  int b;
819
  int has_2nd_order = get_2nd_order_usage(xd);
John Koleszar's avatar
John Koleszar committed
820

821
  if (has_2nd_order) {
Yaowu Xu's avatar
Yaowu Xu committed
822
    stuff_b(cpi, xd, 24, t, PLANE_TYPE_Y2, TX_8X8, dry_run);
823
824
    plane_type = PLANE_TYPE_Y_NO_DC;
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
825
826
827
828
#if CONFIG_CNVCONTEXT
    xd->above_context->y2 = 0;
    xd->left_context->y2 = 0;
#endif
829
830
    plane_type = PLANE_TYPE_Y_WITH_DC;
  }
John Koleszar's avatar
John Koleszar committed
831

Yaowu Xu's avatar
Yaowu Xu committed
832
833
834
835
  for (b = 0; b < 24; b += 4) {
    if (b >= 16)
      plane_type = PLANE_TYPE_UV;
    stuff_b(cpi, xd, b, t, plane_type, TX_8X8, dry_run);
John Koleszar's avatar
John Koleszar committed
836
  }
Daniel Kang's avatar
Daniel Kang committed
837
838
}

839
840
static void stuff_mb_16x16(VP9_COMP *cpi, MACROBLOCKD *xd,
                           TOKENEXTRA **t, int dry_run) {
841
  int b;
Yaowu Xu's avatar
Yaowu Xu committed
842
  stuff_b(cpi, xd, 0, t, PLANE_TYPE_Y_WITH_DC, TX_16X16, dry_run);
Daniel Kang's avatar
Daniel Kang committed
843
844

  for (b = 16; b < 24; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
845
846
    stuff_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_8X8, dry_run);
  }
Yaowu Xu's avatar
Yaowu Xu committed
847
#if CONFIG_CNVCONTEXT
Yaowu Xu's avatar
Yaowu Xu committed
848
849
  xd->above_context->y2 = 0;
  xd->left_context->y2 = 0;
Yaowu Xu's avatar
Yaowu Xu committed
850
#endif
John Koleszar's avatar
John Koleszar committed
851
852
}

853
854
static void stuff_mb_4x4(VP9_COMP *cpi, MACROBLOCKD *xd,
                         TOKENEXTRA **t, int dry_run) {
John Koleszar's avatar
John Koleszar committed
855
  int b;
856
  PLANE_TYPE plane_type;
Yaowu Xu's avatar
Yaowu Xu committed
857
  int has_2nd_order = get_2nd_order_usage(xd);
John Koleszar's avatar
John Koleszar committed
858

859
  if (has_2nd_order) {
Yaowu Xu's avatar
Yaowu Xu committed
860
    stuff_b(cpi, xd, 24, t, PLANE_TYPE_Y2, TX_4X4, dry_run);
861
862
    plane_type = PLANE_TYPE_Y_NO_DC;
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
863
864
    xd->above_context->y2 = 0;
    xd->left_context->y2 = 0;
865
866
    plane_type = PLANE_TYPE_Y_WITH_DC;
  }
John Koleszar's avatar
John Koleszar committed
867

Yaowu Xu's avatar
Yaowu Xu committed
868
869
870
871
872
  for (b = 0; b < 24; b++) {
    if (b >= 16)
      plane_type = PLANE_TYPE_UV;
    stuff_b(cpi, xd, b, t, plane_type, TX_4X4, dry_run);
  }
John Koleszar's avatar
John Koleszar committed
873
}
Deb Mukherjee's avatar
Deb Mukherjee committed
874

875
876
static void stuff_mb_8x8_4x4uv(VP9_COMP *cpi, MACROBLOCKD *xd,
                               TOKENEXTRA **t, int dry_run) {
877
  PLANE_TYPE plane_type;
Deb Mukherjee's avatar
Deb Mukherjee committed
878
879
  int b;

880
881
  int has_2nd_order = get_2nd_order_usage(xd);
  if (has_2nd_order) {
Yaowu Xu's avatar
Yaowu Xu committed
882
    stuff_b(cpi, xd, 24, t, PLANE_TYPE_Y2, TX_8X8, dry_run);
883
884
    plane_type = PLANE_TYPE_Y_NO_DC;
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
885
886
    xd->above_context->y2 = 0;
    xd->left_context->y2 = 0;
887
888
889
    plane_type = PLANE_TYPE_Y_WITH_DC;
  }