vp9_tokenize.c 30.6 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
43
44
45
46
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];
#if CONFIG_TX32X32
vp9_coeff_accum context_counters_32x32[BLOCK_TYPES_32X32];
#endif

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];
#if CONFIG_TX32X32
extern vp9_coeff_stats tree_update_hist_32x32[BLOCK_TYPES_32X32];
#endif
47
48
#endif  /* ENTROPY_STATS */

John Koleszar's avatar
John Koleszar committed
49
static TOKENVALUE dct_value_tokens[DCT_MAX_VALUE * 2];
50
const TOKENVALUE *vp9_dct_value_tokens_ptr;
John Koleszar's avatar
John Koleszar committed
51
static int dct_value_cost[DCT_MAX_VALUE * 2];
52
const int *vp9_dct_value_cost_ptr;
53

John Koleszar's avatar
John Koleszar committed
54
static void fill_value_tokens() {
John Koleszar's avatar
John Koleszar committed
55

John Koleszar's avatar
John Koleszar committed
56
  TOKENVALUE *const t = dct_value_tokens + DCT_MAX_VALUE;
57
  vp9_extra_bit_struct *const e = vp9_extra_bits;
John Koleszar's avatar
John Koleszar committed
58

John Koleszar's avatar
John Koleszar committed
59
60
  int i = -DCT_MAX_VALUE;
  int sign = 1;
John Koleszar's avatar
John Koleszar committed
61

John Koleszar's avatar
John Koleszar committed
62
63
64
  do {
    if (!i)
      sign = 0;
John Koleszar's avatar
John Koleszar committed
65

John Koleszar's avatar
John Koleszar committed
66
67
68
    {
      const int a = sign ? -i : i;
      int eb = sign;
John Koleszar's avatar
John Koleszar committed
69

John Koleszar's avatar
John Koleszar committed
70
71
      if (a > 4) {
        int j = 4;
John Koleszar's avatar
John Koleszar committed
72

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

John Koleszar's avatar
John Koleszar committed
75
76
77
78
        t[i].Token = --j;
        eb |= (a - e[j].base_val) << 1;
      } else
        t[i].Token = a;
John Koleszar's avatar
John Koleszar committed
79

John Koleszar's avatar
John Koleszar committed
80
81
      t[i].Extra = eb;
    }
John Koleszar's avatar
John Koleszar committed
82

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

John Koleszar's avatar
John Koleszar committed
88
89
90
      if (p->base_val) {
        const int extra = t[i].Extra;
        const int Length = p->Len;
John Koleszar's avatar
John Koleszar committed
91

John Koleszar's avatar
John Koleszar committed
92
        if (Length)
93
          cost += treed_cost(p->tree, p->prob, extra >> 1, Length);
John Koleszar's avatar
John Koleszar committed
94

95
        cost += vp9_cost_bit(vp9_prob_half, extra & 1); /* sign */
John Koleszar's avatar
John Koleszar committed
96
97
        dct_value_cost[i + DCT_MAX_VALUE] = cost;
      }
John Koleszar's avatar
John Koleszar committed
98
99
100

    }

John Koleszar's avatar
John Koleszar committed
101
102
  } while (++i < DCT_MAX_VALUE);

103
104
  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
105
}
106
107
108
109
110
111
112

#if CONFIG_NEWCOEFCONTEXT
#define PT pn
#else
#define PT pt
#endif

113
static void tokenize_b(VP9_COMP *cpi,
114
                       MACROBLOCKD *xd,
Yaowu Xu's avatar
Yaowu Xu committed
115
                       const int ib,
116
117
118
119
                       TOKENEXTRA **tp,
                       PLANE_TYPE type,
                       TX_SIZE tx_size,
                       int dry_run) {
Daniel Kang's avatar
Daniel Kang committed
120
  int pt; /* near block/prev token context index */
121
  int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0;
Yaowu Xu's avatar
Yaowu Xu committed
122
  const BLOCKD * const b = xd->block + ib;
123
  int eob = b->eob;     /* one beyond last nonzero coeff */
Daniel Kang's avatar
Daniel Kang committed
124
125
  TOKENEXTRA *t = *tp;        /* store tokens starting here */
  const short *qcoeff_ptr = b->qcoeff;
126
  int seg_eob;
Yaowu Xu's avatar
Yaowu Xu committed
127
  const int segment_id = xd->mode_info_context->mbmi.segment_id;
128
  const int *bands, *scan;
129
130
  vp9_coeff_count *counts;
  vp9_coeff_probs *probs;
131
132
  const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
                          get_tx_type(xd, b) : DCT_DCT;
133
134
135
136
#if CONFIG_NEWCOEFCONTEXT
  const int *neighbors;
  int pn;
#endif
Daniel Kang's avatar
Daniel Kang committed
137

Yaowu Xu's avatar
Yaowu Xu committed
138
139
140
141
142
143
  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;

144
145
146
147
148
149
150
151
#if CONFIG_SUPERBLOCKS && CONFIG_TX32X32
  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];
#endif


152
153
154
155
  switch (tx_size) {
    default:
    case TX_4X4:
      seg_eob = 16;
156
157
      bands = vp9_coef_bands_4x4;
      scan = vp9_default_zig_zag1d_4x4;
158
      if (tx_type != DCT_DCT) {
159
160
        counts = cpi->hybrid_coef_counts_4x4;
        probs = cpi->common.fc.hybrid_coef_probs_4x4;
161
        if (tx_type == ADST_DCT) {
162
          scan = vp9_row_scan_4x4;
163
        } else if (tx_type == DCT_ADST) {
164
          scan = vp9_col_scan_4x4;
165
166
        }
      } else {
167
168
        counts = cpi->coef_counts_4x4;
        probs = cpi->common.fc.coef_probs_4x4;
169
170
171
172
173
      }
      break;
    case TX_8X8:
      if (type == PLANE_TYPE_Y2) {
        seg_eob = 4;
174
175
        bands = vp9_coef_bands_4x4;
        scan = vp9_default_zig_zag1d_4x4;
176
      } else {
Yaowu Xu's avatar
Yaowu Xu committed
177
178
179
180
#if CONFIG_CNVCONTEXT
        a_ec = (a[0] + a[1]) != 0;
        l_ec = (l[0] + l[1]) != 0;
#endif
181
        seg_eob = 64;
182
183
        bands = vp9_coef_bands_8x8;
        scan = vp9_default_zig_zag1d_8x8;
184
185
186
187
188
189
190
191
192
193
      }
      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
194
#if CONFIG_CNVCONTEXT
Yaowu Xu's avatar
Yaowu Xu committed
195
196
197
      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;
198
199
200
201
202
#if CONFIG_SUPERBLOCKS && CONFIG_TX32X32
      } else {
        a_ec = (a[0] + a[1] + a1[0] + a1[1]) != 0;
        l_ec = (l[0] + l[1] + l1[0] + l1[1]) != 0;
#endif
Yaowu Xu's avatar
Yaowu Xu committed
203
      }
Yaowu Xu's avatar
Yaowu Xu committed
204
#endif
205
      seg_eob = 256;
206
207
      bands = vp9_coef_bands_16x16;
      scan = vp9_default_zig_zag1d_16x16;
208
209
210
211
212
213
214
      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;
      }
215
216
217
218
219
220
221
222
223
#if CONFIG_SUPERBLOCKS && CONFIG_TX32X32
      if (type == PLANE_TYPE_UV) {
        int uv_idx = (((int) (b - xd->block)) - 16) >> 2;
        qcoeff_ptr = xd->sb_coeff_data.qcoeff + 1024 + 256 * uv_idx;
      }
#endif
      break;
#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
    case TX_32X32:
224
225
226
227
228
229
230
231
#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
232
233
234
235
236
237
      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;
238
      break;
239
#endif
John Koleszar's avatar
John Koleszar committed
240
241
  }

Yaowu Xu's avatar
Yaowu Xu committed
242
  VP9_COMBINEENTROPYCONTEXTS(pt, a_ec, l_ec);
243
244
245
246
#if CONFIG_NEWCOEFCONTEXT
  neighbors = vp9_get_coef_neighbors_handle(scan);
  pn = pt;
#endif
Yaowu Xu's avatar
Yaowu Xu committed
247

248
249
  if (vp9_segfeature_active(xd, segment_id, SEG_LVL_EOB))
    seg_eob = vp9_get_segdata(xd, segment_id, SEG_LVL_EOB);
John Koleszar's avatar
John Koleszar committed
250

251
  do {
252
    const int band = bands[c];
253
254
255
    int token;

    if (c < eob) {
256
      const int rc = scan[c];
257
      const int v = qcoeff_ptr[rc];
258
259
      assert(-DCT_MAX_VALUE <= v  &&  v < DCT_MAX_VALUE);

260
261
      t->Extra = vp9_dct_value_tokens_ptr[v].Extra;
      token    = vp9_dct_value_tokens_ptr[v].Token;
262
263
264
    } else {
      token = DCT_EOB_TOKEN;
    }
John Koleszar's avatar
John Koleszar committed
265
266

    t->Token = token;
267
    t->context_tree = probs[type][band][PT];
268
269
    t->skip_eob_node = (pt == 0) && ((band > 0 && type != PLANE_TYPE_Y_NO_DC) ||
                                     (band > 1 && type == PLANE_TYPE_Y_NO_DC));
270
    assert(vp9_coef_encodings[t->Token].Len - t->skip_eob_node > 0);
271
    if (!dry_run) {
272
      ++counts[type][band][PT][token];
273
    }
274
    pt = vp9_prev_token_class[token];
275
276
277
278
279
280
281
#if CONFIG_NEWCOEFCONTEXT
    if (c < seg_eob - 1 && NEWCOEFCONTEXT_BAND_COND(bands[c + 1]))
      pn = vp9_get_coef_neighbor_context(
          qcoeff_ptr, (type == PLANE_TYPE_Y_NO_DC), neighbors, scan[c + 1]);
    else
      pn = pt;
#endif
282
    ++t;
283
284
285
  } while (c < eob && ++c < seg_eob);

  *tp = t;
Yaowu Xu's avatar
Yaowu Xu committed
286
287
288
289
290
291
292
293
  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
294
295
296
297
298
    if (type != PLANE_TYPE_UV) {
      a[1] = a[2] = a[3] = a_ec;
      l[1] = l[2] = l[3] = l_ec;
#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
    } else {
299
300
      a1[0] = a1[1] = a[1] = a_ec;
      l1[0] = l1[1] = l[1] = l_ec;
Yaowu Xu's avatar
Yaowu Xu committed
301
302
#endif
    }
303
304
305
306
307
308
309
#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
  } 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;
#endif
Yaowu Xu's avatar
Yaowu Xu committed
310
  }
John Koleszar's avatar
John Koleszar committed
311
312
}

313
int vp9_mby_is_skippable_4x4(MACROBLOCKD *xd, int has_2nd_order) {
John Koleszar's avatar
John Koleszar committed
314
315
  int skip = 1;
  int i = 0;
316

317
  if (has_2nd_order) {
John Koleszar's avatar
John Koleszar committed
318
    for (i = 0; i < 16; i++)
Paul Wilkins's avatar
Paul Wilkins committed
319
320
      skip &= (xd->block[i].eob < 2);
    skip &= (!xd->block[24].eob);
John Koleszar's avatar
John Koleszar committed
321
322
  } else {
    for (i = 0; i < 16; i++)
Paul Wilkins's avatar
Paul Wilkins committed
323
      skip &= (!xd->block[i].eob);
John Koleszar's avatar
John Koleszar committed
324
325
  }
  return skip;
326
}
327

328
int vp9_mbuv_is_skippable_4x4(MACROBLOCKD *xd) {
John Koleszar's avatar
John Koleszar committed
329
330
  int skip = 1;
  int i;
331

John Koleszar's avatar
John Koleszar committed
332
  for (i = 16; i < 24; i++)
Paul Wilkins's avatar
Paul Wilkins committed
333
    skip &= (!xd->block[i].eob);
John Koleszar's avatar
John Koleszar committed
334
  return skip;
335
336
}

337
338
static int mb_is_skippable_4x4(MACROBLOCKD *xd, int has_2nd_order) {
  return (vp9_mby_is_skippable_4x4(xd, has_2nd_order) &
339
          vp9_mbuv_is_skippable_4x4(xd));
340
}
Yaowu Xu's avatar
Yaowu Xu committed
341

342
int vp9_mby_is_skippable_8x8(MACROBLOCKD *xd, int has_2nd_order) {
John Koleszar's avatar
John Koleszar committed
343
344
  int skip = 1;
  int i = 0;
345

346
  if (has_2nd_order) {
Deb Mukherjee's avatar
Deb Mukherjee committed
347
348
349
350
351
352
353
    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
354
  return skip;
355
}
356

357
int vp9_mbuv_is_skippable_8x8(MACROBLOCKD *xd) {
Paul Wilkins's avatar
Paul Wilkins committed
358
  return (!xd->block[16].eob) & (!xd->block[20].eob);
359
}
360

361
362
static int mb_is_skippable_8x8(MACROBLOCKD *xd, int has_2nd_order) {
  return (vp9_mby_is_skippable_8x8(xd, has_2nd_order) &
363
          vp9_mbuv_is_skippable_8x8(xd));
Deb Mukherjee's avatar
Deb Mukherjee committed
364
365
}

366
367
static int mb_is_skippable_8x8_4x4uv(MACROBLOCKD *xd, int has_2nd_order) {
  return (vp9_mby_is_skippable_8x8(xd, has_2nd_order) &
368
          vp9_mbuv_is_skippable_4x4(xd));
369
}
Yaowu Xu's avatar
Yaowu Xu committed
370

371
int vp9_mby_is_skippable_16x16(MACROBLOCKD *xd) {
Daniel Kang's avatar
Daniel Kang committed
372
  int skip = 1;
Paul Wilkins's avatar
Paul Wilkins committed
373
  skip &= !xd->block[0].eob;
Daniel Kang's avatar
Daniel Kang committed
374
375
376
  return skip;
}

377
378
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
379
}
380

381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
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;
  const int skip_inc =  !vp9_segfeature_active(xd, segment_id, SEG_LVL_EOB) ||
                        (vp9_get_segdata(xd, segment_id, SEG_LVL_EOB) != 0);
  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;

432
433
  tokenize_b(cpi, xd, 0, t, PLANE_TYPE_Y_WITH_DC,
             TX_32X32, dry_run);
434
435

  for (b = 16; b < 24; b += 4) {
436
    tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV,
437
438
               TX_16X16, dry_run);
  }
439
  A[0][8] = L[0][8] = A[1][8] = L[1][8] = 0;
440
441
442
443
444
  if (dry_run)
    *t = t_backup;
}
#endif

445
void vp9_tokenize_mb(VP9_COMP *cpi,
Paul Wilkins's avatar
Paul Wilkins committed
446
                     MACROBLOCKD *xd,
447
448
                     TOKENEXTRA **t,
                     int dry_run) {
449
  PLANE_TYPE plane_type;
450
  int has_2nd_order;
John Koleszar's avatar
John Koleszar committed
451
  int b;
452
  int tx_size = xd->mode_info_context->mbmi.txfm_size;
Paul Wilkins's avatar
Paul Wilkins committed
453
  int mb_skip_context = vp9_get_pred_context(&cpi->common, xd, PRED_MBSKIP);
454
  TOKENEXTRA *t_backup = *t;
Paul Wilkins's avatar
Paul Wilkins committed
455

John Koleszar's avatar
John Koleszar committed
456
457
458
459
  // 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
460
  int segment_id = xd->mode_info_context->mbmi.segment_id;
461

462
463
  if (!vp9_segfeature_active(xd, segment_id, SEG_LVL_EOB) ||
      (vp9_get_segdata(xd, segment_id, SEG_LVL_EOB) != 0)) {
John Koleszar's avatar
John Koleszar committed
464
465
466
    skip_inc = 1;
  } else
    skip_inc = 0;
467

468
  has_2nd_order = get_2nd_order_usage(xd);
John Koleszar's avatar
John Koleszar committed
469

470
  switch (tx_size) {
Daniel Kang's avatar
Daniel Kang committed
471
    case TX_16X16:
472

Daniel Kang's avatar
Daniel Kang committed
473
      xd->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable_16x16(xd);
Daniel Kang's avatar
Daniel Kang committed
474
475
      break;
    case TX_8X8:
476
477
      if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
          xd->mode_info_context->mbmi.mode == SPLITMV)
478
479
        xd->mode_info_context->mbmi.mb_skip_coeff =
            mb_is_skippable_8x8_4x4uv(xd, 0);
Deb Mukherjee's avatar
Deb Mukherjee committed
480
      else
481
482
        xd->mode_info_context->mbmi.mb_skip_coeff =
            mb_is_skippable_8x8(xd, has_2nd_order);
Daniel Kang's avatar
Daniel Kang committed
483
      break;
Deb Mukherjee's avatar
Deb Mukherjee committed
484

Daniel Kang's avatar
Daniel Kang committed
485
    default:
486
487
      xd->mode_info_context->mbmi.mb_skip_coeff =
          mb_is_skippable_4x4(xd, has_2nd_order);
Daniel Kang's avatar
Daniel Kang committed
488
489
      break;
  }
490

Paul Wilkins's avatar
Paul Wilkins committed
491
  if (xd->mode_info_context->mbmi.mb_skip_coeff) {
492
493
    if (!dry_run)
      cpi->skip_true_count[mb_skip_context] += skip_inc;
John Koleszar's avatar
John Koleszar committed
494
    if (!cpi->common.mb_no_coeff_skip) {
495
      vp9_stuff_mb(cpi, xd, t, dry_run);
John Koleszar's avatar
John Koleszar committed
496
    } else {
Yaowu Xu's avatar
Yaowu Xu committed
497
      vp9_reset_mb_tokens_context(xd);
John Koleszar's avatar
John Koleszar committed
498
    }
Yaowu Xu's avatar
Yaowu Xu committed
499

500
501
    if (dry_run)
      *t = t_backup;
John Koleszar's avatar
John Koleszar committed
502
503
504
    return;
  }

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

508
  if (has_2nd_order) {
Yaowu Xu's avatar
Yaowu Xu committed
509
    tokenize_b(cpi, xd, 24, t, PLANE_TYPE_Y2, tx_size, dry_run);
510
    plane_type = PLANE_TYPE_Y_NO_DC;
Yaowu Xu's avatar
Yaowu Xu committed
511
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
512
513
    xd->above_context->y2 = 0;
    xd->left_context->y2 = 0;
514
    plane_type = PLANE_TYPE_Y_WITH_DC;
Yaowu Xu's avatar
Yaowu Xu committed
515
  }
John Koleszar's avatar
John Koleszar committed
516

517
  if (tx_size == TX_16X16) {
Yaowu Xu's avatar
Yaowu Xu committed
518
    tokenize_b(cpi, xd, 0, t, PLANE_TYPE_Y_WITH_DC, TX_16X16, dry_run);
Daniel Kang's avatar
Daniel Kang committed
519
    for (b = 16; b < 24; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
520
      tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_8X8, dry_run);
Daniel Kang's avatar
Daniel Kang committed
521
    }
522
  } else if (tx_size == TX_8X8) {
John Koleszar's avatar
John Koleszar committed
523
    for (b = 0; b < 16; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
524
      tokenize_b(cpi, xd, b, t, plane_type, TX_8X8, dry_run);
John Koleszar's avatar
John Koleszar committed
525
    }
526
527
    if (xd->mode_info_context->mbmi.mode == I8X8_PRED ||
        xd->mode_info_context->mbmi.mode == SPLITMV) {
528
      for (b = 16; b < 24; b++) {
Yaowu Xu's avatar
Yaowu Xu committed
529
        tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_4X4, dry_run);
530
      }
531
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
532
      for (b = 16; b < 24; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
533
        tokenize_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_8X8, dry_run);
Deb Mukherjee's avatar
Deb Mukherjee committed
534
      }
535
    }
Jingning Han's avatar
Jingning Han committed
536
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
537
538
539
540
    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);
541
    }
Jingning Han's avatar
Jingning Han committed
542
  }
543
544
  if (dry_run)
    *t = t_backup;
John Koleszar's avatar
John Koleszar committed
545
}
546

John Koleszar's avatar
John Koleszar committed
547
#ifdef ENTROPY_STATS
John Koleszar's avatar
John Koleszar committed
548
549
550
void init_context_counters(void) {
  FILE *f = fopen("context.bin", "rb");
  if (!f) {
551
552
553
    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
554
    vpx_memset(context_counters_8x8, 0, sizeof(context_counters_8x8));
555
556
    vpx_memset(hybrid_context_counters_8x8, 0,
               sizeof(hybrid_context_counters_8x8));
Daniel Kang's avatar
Daniel Kang committed
557
    vpx_memset(context_counters_16x16, 0, sizeof(context_counters_16x16));
558
559
560
561
562
    vpx_memset(hybrid_context_counters_16x16, 0,
               sizeof(hybrid_context_counters_16x16));
#if CONFIG_TX32X32
    vpx_memset(context_counters_32x32, 0, sizeof(context_counters_32x32));
#endif
John Koleszar's avatar
John Koleszar committed
563
  } else {
564
565
566
    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
567
    fread(context_counters_8x8, sizeof(context_counters_8x8), 1, f);
568
569
    fread(hybrid_context_counters_8x8,
          sizeof(hybrid_context_counters_8x8), 1, f);
Daniel Kang's avatar
Daniel Kang committed
570
    fread(context_counters_16x16, sizeof(context_counters_16x16), 1, f);
571
572
573
574
575
    fread(hybrid_context_counters_16x16,
          sizeof(hybrid_context_counters_16x16), 1, f);
#if CONFIG_TX32X32
    fread(context_counters_32x32, sizeof(context_counters_32x32), 1, f);
#endif
John Koleszar's avatar
John Koleszar committed
576
577
578
579
580
    fclose(f);
  }

  f = fopen("treeupdate.bin", "rb");
  if (!f) {
581
582
583
    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
584
    vpx_memset(tree_update_hist_8x8, 0, sizeof(tree_update_hist_8x8));
585
586
    vpx_memset(hybrid_tree_update_hist_8x8, 0,
               sizeof(hybrid_tree_update_hist_8x8));
Daniel Kang's avatar
Daniel Kang committed
587
    vpx_memset(tree_update_hist_16x16, 0, sizeof(tree_update_hist_16x16));
588
589
590
591
592
    vpx_memset(hybrid_tree_update_hist_16x16, 0,
               sizeof(hybrid_tree_update_hist_16x16));
#if CONFIG_TX32X32
    vpx_memset(tree_update_hist_32x32, 0, sizeof(tree_update_hist_32x32));
#endif
John Koleszar's avatar
John Koleszar committed
593
  } else {
594
595
596
    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
597
    fread(tree_update_hist_8x8, sizeof(tree_update_hist_8x8), 1, f);
598
599
    fread(hybrid_tree_update_hist_8x8,
          sizeof(hybrid_tree_update_hist_8x8), 1, f);
Daniel Kang's avatar
Daniel Kang committed
600
    fread(tree_update_hist_16x16, sizeof(tree_update_hist_16x16), 1, f);
601
602
603
604
605
    fread(hybrid_tree_update_hist_16x16,
          sizeof(hybrid_tree_update_hist_16x16), 1, f);
#if CONFIG_TX32X32
    fread(tree_update_hist_32x32, sizeof(tree_update_hist_32x32), 1, f);
#endif
John Koleszar's avatar
John Koleszar committed
606
607
    fclose(f);
  }
John Koleszar's avatar
John Koleszar committed
608
609
}

610
611
static void print_counter(FILE *f, vp9_coeff_accum *context_counters,
                          int block_types, const char *header) {
John Koleszar's avatar
John Koleszar committed
612
  int type, band, pt, t;
John Koleszar's avatar
John Koleszar committed
613

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

616
#define Comma(X) (X ? "," : "")
John Koleszar's avatar
John Koleszar committed
617
618
619
620
621
622
623
624
625
626
627
628
  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
629
          const int64_t x = context_counters[type][band][pt][t];
John Koleszar's avatar
John Koleszar committed
630
          const int y = (int) x;
631

John Koleszar's avatar
John Koleszar committed
632
          assert(x == (int64_t) y);  /* no overflow handling yet */
John Koleszar's avatar
John Koleszar committed
633
634
635
636
637
638
639
          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  }");
640
  } while (++type < block_types);
Daniel Kang's avatar
Daniel Kang committed
641
  fprintf(f, "\n};\n");
642
}
643

644
645
646
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
647

648
  fprintf(f, "static const vp9_coeff_probs %s = {", header);
649

John Koleszar's avatar
John Koleszar committed
650
  type = 0;
651
#define Newline(x, spaces) (x ? " " : "\n" spaces)
John Koleszar's avatar
John Koleszar committed
652
  do {
653
654
    fprintf(f, "%s%s{ /* block Type %d */",
            Comma(type), Newline(type, "  "), type);
John Koleszar's avatar
John Koleszar committed
655
656
    band = 0;
    do {
657
658
      fprintf(f, "%s%s{ /* Coeff Band %d */",
              Comma(band), Newline(band, "    "), band);
John Koleszar's avatar
John Koleszar committed
659
660
      pt = 0;
      do {
661
        unsigned int branch_ct[ENTROPY_NODES][2];
John Koleszar's avatar
John Koleszar committed
662
        unsigned int coef_counts[MAX_ENTROPY_TOKENS];
663
        vp9_prob coef_probs[ENTROPY_NODES];
664

John Koleszar's avatar
John Koleszar committed
665
        for (t = 0; t < MAX_ENTROPY_TOKENS; ++t)
666
667
668
          coef_counts[t] = context_counters[type][band][pt][t];
        vp9_tree_probs_from_distribution(MAX_ENTROPY_TOKENS,
                                         vp9_coef_encodings, vp9_coef_tree,
669
                                         coef_probs, branch_ct, coef_counts);
John Koleszar's avatar
John Koleszar committed
670
        fprintf(f, "%s\n      {", Comma(pt));
671

John Koleszar's avatar
John Koleszar committed
672
673
        t = 0;
        do {
674
          fprintf(f, "%s %3d", Comma(t), coef_probs[t]);
John Koleszar's avatar
John Koleszar committed
675
        } while (++t < ENTROPY_NODES);
676

677
        fprintf(f, " }");
John Koleszar's avatar
John Koleszar committed
678
679
680
681
      } while (++pt < PREV_COEF_CONTEXTS);
      fprintf(f, "\n    }");
    } while (++band < COEF_BANDS);
    fprintf(f, "\n  }");
682
  } while (++type < block_types);
John Koleszar's avatar
John Koleszar committed
683
  fprintf(f, "\n};\n");
684
}
685

686
687
void print_context_counters() {
  FILE *f = fopen("vp9_context.c", "w");
688

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

692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
  /* 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]");
#if CONFIG_TX32X32
  print_counter(f, context_counters_32x32, BLOCK_TYPES_32X32,
                "vp9_default_coef_counts_32x32[BLOCK_TYPES_32X32]");
#endif
Daniel Kang's avatar
Daniel Kang committed
709

710
711
  /* print coefficient probabilities */
  print_probs(f, context_counters_4x4, BLOCK_TYPES_4X4,
712
              "default_coef_probs_4x4[BLOCK_TYPES_4X4]");
713
  print_probs(f, hybrid_context_counters_4x4, BLOCK_TYPES_4X4,
714
              "default_hybrid_coef_probs_4x4[BLOCK_TYPES_4X4]");
715
  print_probs(f, context_counters_8x8, BLOCK_TYPES_8X8,
716
              "default_coef_probs_8x8[BLOCK_TYPES_8X8]");
717
  print_probs(f, hybrid_context_counters_8x8, BLOCK_TYPES_8X8,
718
              "default_hybrid_coef_probs_8x8[BLOCK_TYPES_8X8]");
719
  print_probs(f, context_counters_16x16, BLOCK_TYPES_16X16,
720
              "default_coef_probs_16x16[BLOCK_TYPES_16X16]");
721
  print_probs(f, hybrid_context_counters_16x16, BLOCK_TYPES_16X16,
722
              "default_hybrid_coef_probs_16x16[BLOCK_TYPES_16X16]");
723
724
#if CONFIG_TX32X32
  print_probs(f, context_counters_32x32, BLOCK_TYPES_32X32,
725
              "default_coef_probs_32x32[BLOCK_TYPES_32X32]");
726
#endif
Daniel Kang's avatar
Daniel Kang committed
727

John Koleszar's avatar
John Koleszar committed
728
729
730
  fclose(f);

  f = fopen("context.bin", "wb");
731
732
733
  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
734
  fwrite(context_counters_8x8, sizeof(context_counters_8x8), 1, f);
735
736
  fwrite(hybrid_context_counters_8x8,
         sizeof(hybrid_context_counters_8x8), 1, f);
Daniel Kang's avatar
Daniel Kang committed
737
  fwrite(context_counters_16x16, sizeof(context_counters_16x16), 1, f);
738
739
740
741
742
  fwrite(hybrid_context_counters_16x16,
         sizeof(hybrid_context_counters_16x16), 1, f);
#if CONFIG_TX32X32
  fwrite(context_counters_32x32, sizeof(context_counters_32x32), 1, f);
#endif
John Koleszar's avatar
John Koleszar committed
743
  fclose(f);
John Koleszar's avatar
John Koleszar committed
744
745
746
}
#endif

747
void vp9_tokenize_initialize() {
John Koleszar's avatar
John Koleszar committed
748
  fill_value_tokens();
John Koleszar's avatar
John Koleszar committed
749
750
}

751
static __inline void stuff_b(VP9_COMP *cpi,
752
                             MACROBLOCKD *xd,
Yaowu Xu's avatar
Yaowu Xu committed
753
                             const int ib,
754
755
756
757
                             TOKENEXTRA **tp,
                             PLANE_TYPE type,
                             TX_SIZE tx_size,
                             int dry_run) {
Yaowu Xu's avatar
Yaowu Xu committed
758
  const BLOCKD * const b = xd->block + ib;
759
  const int *bands;
760
761
  vp9_coeff_count *counts;
  vp9_coeff_probs *probs;
762
763
764
765
  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
766
767
768
769
770
  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;
771
772
773
774
775
776
#if CONFIG_SUPERBLOCKS && CONFIG_TX32X32
  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];
#endif
John Koleszar's avatar
John Koleszar committed
777

778
779
780
  switch (tx_size) {
    default:
    case TX_4X4:
781
      bands = vp9_coef_bands_4x4;
782
      if (tx_type != DCT_DCT) {
783
784
        counts = cpi->hybrid_coef_counts_4x4;
        probs = cpi->common.fc.hybrid_coef_probs_4x4;
785
      } else {
786
787
        counts = cpi->coef_counts_4x4;
        probs = cpi->common.fc.coef_probs_4x4;
788
789
790
      }
      break;
    case TX_8X8:
Yaowu Xu's avatar
Yaowu Xu committed
791
792
793
794
795
796
#if CONFIG_CNVCONTEXT
      if (type != PLANE_TYPE_Y2) {
        a_ec = (a[0] + a[1]) != 0;
        l_ec = (l[0] + l[1]) != 0;
      }
#endif
797
      bands = vp9_coef_bands_8x8;
798
799
800
801
802
803
804
805
806
      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
807
#if CONFIG_CNVCONTEXT
Yaowu Xu's avatar
Yaowu Xu committed
808
809
810
      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;
811
812
813
814
815
#if CONFIG_SUPERBLOCKS && CONFIG_TX32X32
      } else {
        a_ec = (a[0] + a[1] + a1[0] + a1[1]) != 0;
        l_ec = (l[0] + l[1] + l1[0] + l1[1]) != 0;
#endif
Yaowu Xu's avatar
Yaowu Xu committed
816
      }
Yaowu Xu's avatar
Yaowu Xu committed
817
#endif
818
      bands = vp9_coef_bands_16x16;
819
820
821
822
823
824
825
826
      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;
827
828
#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
    case TX_32X32:
829
830
831
832
833
834
835
836
#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
837
838
839
840
841
      bands = vp9_coef_bands_32x32;
      counts = cpi->coef_counts_32x32;
      probs = cpi->common.fc.coef_probs_32x32;
      break;
#endif
842
  }
Yaowu Xu's avatar
Yaowu Xu committed
843
844
845

  VP9_COMBINEENTROPYCONTEXTS(pt, a_ec, l_ec);

846
  band = bands[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0];
John Koleszar's avatar
John Koleszar committed
847
  t->Token = DCT_EOB_TOKEN;
848
  t->context_tree = probs[type][band][pt];
John Koleszar's avatar
John Koleszar committed
849
850
851
  t->skip_eob_node = 0;
  ++t;
  *tp = t;
852
  *a = *l = 0;
Yaowu Xu's avatar
Yaowu Xu committed
853
854
855
856
  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
857
858
859
860
861
    if (type != PLANE_TYPE_UV) {
      a[1] = a[2] = a[3] = 0;
      l[1] = l[2] = l[3] = 0;
#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
    } else {
862
863
      a1[0] = a1[1] = a[1] = a_ec;
      l1[0] = l1[1] = l[1] = l_ec;
Yaowu Xu's avatar
Yaowu Xu committed
864
865
#endif
    }
866
867
868
869
870
871
872
#if CONFIG_TX32X32 && CONFIG_SUPERBLOCKS
  } 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;
#endif
Yaowu Xu's avatar
Yaowu Xu committed
873
874
  }

875
  if (!dry_run) {
876
    ++counts[type][band][pt][DCT_EOB_TOKEN];
877
  }
878
879
}

880
881
static void stuff_mb_8x8(VP9_COMP *cpi, MACROBLOCKD *xd,
                         TOKENEXTRA **t, int dry_run) {
882
  PLANE_TYPE plane_type;
John Koleszar's avatar
John Koleszar committed
883
  int b;
884
  int has_2nd_order = get_2nd_order_usage(xd);
John Koleszar's avatar
John Koleszar committed
885

886
  if (has_2nd_order) {
Yaowu Xu's avatar
Yaowu Xu committed
887
    stuff_b(cpi, xd, 24, t, PLANE_TYPE_Y2, TX_8X8, dry_run);
888
889
    plane_type = PLANE_TYPE_Y_NO_DC;
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
890
891
892
893
#if CONFIG_CNVCONTEXT
    xd->above_context->y2 = 0;
    xd->left_context->y2 = 0;
#endif
894
895
    plane_type = PLANE_TYPE_Y_WITH_DC;
  }
John Koleszar's avatar
John Koleszar committed
896

Yaowu Xu's avatar
Yaowu Xu committed
897
898
899
900
  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
901
  }
Daniel Kang's avatar
Daniel Kang committed
902
903
}

904
905
static void stuff_mb_16x16(VP9_COMP *cpi, MACROBLOCKD *xd,
                           TOKENEXTRA **t, int dry_run) {
906
  int b;
Yaowu Xu's avatar
Yaowu Xu committed
907
  stuff_b(cpi, xd, 0, t, PLANE_TYPE_Y_WITH_DC, TX_16X16, dry_run);
Daniel Kang's avatar
Daniel Kang committed
908
909

  for (b = 16; b < 24; b += 4) {
Yaowu Xu's avatar
Yaowu Xu committed
910
911
    stuff_b(cpi, xd, b, t, PLANE_TYPE_UV, TX_8X8, dry_run);
  }
Yaowu Xu's avatar
Yaowu Xu committed
912
#if CONFIG_CNVCONTEXT
Yaowu Xu's avatar
Yaowu Xu committed
913
914
  xd->above_context->y2 = 0;
  xd->left_context->y2 = 0;
Yaowu Xu's avatar
Yaowu Xu committed
915
#endif
John Koleszar's avatar
John Koleszar committed
916
917
}

918
919
static void stuff_mb_4x4(VP9_COMP *cpi, MACROBLOCKD *xd,
                         TOKENEXTRA **t, int dry_run) {
John Koleszar's avatar
John Koleszar committed
920
  int b;
921
  PLANE_TYPE plane_type;
Yaowu Xu's avatar
Yaowu Xu committed
922
  int has_2nd_order = get_2nd_order_usage(xd);
John Koleszar's avatar
John Koleszar committed
923

924
  if (has_2nd_order) {
Yaowu Xu's avatar
Yaowu Xu committed
925
    stuff_b(cpi, xd, 24, t, PLANE_TYPE_Y2, TX_4X4, dry_run);
926
927
    plane_type = PLANE_TYPE_Y_NO_DC;
  } else {
Yaowu Xu's avatar
Yaowu Xu committed
928
929
    xd->above_context->y2 = 0;
    xd->left_context->y2 = 0;
930
931
    plane_type = PLANE_TYPE_Y_WITH_DC;
  }