tokenize.c 15.1 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
16
17
18
19
20
21
22
 */


#include <math.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "onyx_int.h"
#include "tokenize.h"
#include "vpx_mem/vpx_mem.h"

/* Global event counters used for accumulating statistics across several
   compressions, then generating context.c = initial stats. */

23
#ifdef VP8_ENTROPY_STATS
24
_int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
John Koleszar's avatar
John Koleszar committed
25
#endif
26
void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ;
27
void vp8_fix_contexts(MACROBLOCKD *x);
John Koleszar's avatar
John Koleszar committed
28

29
30
31
32
33
34
35
#include "dct_value_tokens.h"
#include "dct_value_cost.h"

const TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens +
        DCT_MAX_VALUE;
const short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE;

John Koleszar's avatar
John Koleszar committed
36
37
38
39
#if 0
int skip_true_count = 0;
int skip_false_count = 0;
#endif
40
41
42

/* function used to generate dct_value_tokens and dct_value_cost tables */
/*
John Koleszar's avatar
John Koleszar committed
43
44
45
static void fill_value_tokens()
{

46
47
    TOKENVALUE *t = dct_value_tokens + DCT_MAX_VALUE;
    const vp8_extra_bit_struct *e = vp8_extra_bits;
John Koleszar's avatar
John Koleszar committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

    int i = -DCT_MAX_VALUE;
    int sign = 1;

    do
    {
        if (!i)
            sign = 0;

        {
            const int a = sign ? -i : i;
            int eb = sign;

            if (a > 4)
            {
                int j = 4;

                while (++j < 11  &&  e[j].base_val <= a) {}

                t[i].Token = --j;
                eb |= (a - e[j].base_val) << 1;
            }
            else
                t[i].Token = a;

            t[i].Extra = eb;
        }

        // initialize the cost for extra bits for all possible coefficient value.
        {
            int cost = 0;
79
            const vp8_extra_bit_struct *p = vp8_extra_bits + t[i].Token;
John Koleszar's avatar
John Koleszar committed
80
81
82
83
84
85
86
87
88

            if (p->base_val)
            {
                const int extra = t[i].Extra;
                const int Length = p->Len;

                if (Length)
                    cost += vp8_treed_cost(p->tree, p->prob, extra >> 1, Length);

89
                cost += vp8_cost_bit(vp8_prob_half, extra & 1); // sign
90
                dct_value_cost[i + DCT_MAX_VALUE] = cost;
John Koleszar's avatar
John Koleszar committed
91
92
93
94
95
96
97
            }

        }

    }
    while (++i < DCT_MAX_VALUE);

98
99
    vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE;
    vp8_dct_value_cost_ptr   = dct_value_cost + DCT_MAX_VALUE;
John Koleszar's avatar
John Koleszar committed
100
}
101
*/
John Koleszar's avatar
John Koleszar committed
102
103
104

static void tokenize2nd_order_b
(
105
    MACROBLOCK *x,
John Koleszar's avatar
John Koleszar committed
106
107
108
109
    TOKENEXTRA **tp,
    VP8_COMP *cpi
)
{
110
    MACROBLOCKD *xd = &x->e_mbd;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
111
112
113
114
115
116
117
118
    int pt;             /* near block/prev token context index */
    int c;              /* start at DC */
    TOKENEXTRA *t = *tp;/* store tokens starting here */
    const BLOCKD *b;
    const short *qcoeff_ptr;
    ENTROPY_CONTEXT * a;
    ENTROPY_CONTEXT * l;
    int band, rc, v, token;
119
    int eob;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
120

121
    b = xd->block + 24;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
122
    qcoeff_ptr = b->qcoeff;
123
124
125
    a = (ENTROPY_CONTEXT *)xd->above_context + 8;
    l = (ENTROPY_CONTEXT *)xd->left_context + 8;
    eob = xd->eobs[24];
John Koleszar's avatar
John Koleszar committed
126
127
    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);

128
    if(!eob)
Scott LaVarnway's avatar
Scott LaVarnway committed
129
130
131
132
133
134
    {
        /* c = band for this case */
        t->Token = DCT_EOB_TOKEN;
        t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
        t->skip_eob_node = 0;

135
        ++x->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
Scott LaVarnway's avatar
Scott LaVarnway committed
136
137
138
139
140
141
142
143
144
145
146
147
148
        t++;
        *tp = t;
        *a = *l = 0;
        return;
    }

    v = qcoeff_ptr[0];
    t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
    token    = vp8_dct_value_tokens_ptr[v].Token;
    t->Token = token;

    t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
    t->skip_eob_node = 0;
149
    ++x->coef_counts       [1] [0] [pt] [token];
Scott LaVarnway's avatar
Scott LaVarnway committed
150
151
152
153
    pt = vp8_prev_token_class[token];
    t++;
    c = 1;

154
    for (; c < eob; c++)
John Koleszar's avatar
John Koleszar committed
155
    {
Tero Rintaluoma's avatar
Tero Rintaluoma committed
156
157
158
        rc = vp8_default_zig_zag1d[c];
        band = vp8_coef_bands[c];
        v = qcoeff_ptr[rc];
John Koleszar's avatar
John Koleszar committed
159

Tero Rintaluoma's avatar
Tero Rintaluoma committed
160
161
162
163
164
165
        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
        token    = vp8_dct_value_tokens_ptr[v].Token;

        t->Token = token;
        t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];

Scott LaVarnway's avatar
Scott LaVarnway committed
166
        t->skip_eob_node = ((pt == 0));
Tero Rintaluoma's avatar
Tero Rintaluoma committed
167

168
        ++x->coef_counts       [1] [band] [pt] [token];
Tero Rintaluoma's avatar
Tero Rintaluoma committed
169
170
171
172
173
174
175
176
177

        pt = vp8_prev_token_class[token];
        t++;
    }
    if (c < 16)
    {
        band = vp8_coef_bands[c];
        t->Token = DCT_EOB_TOKEN;
        t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt];
John Koleszar's avatar
John Koleszar committed
178

Scott LaVarnway's avatar
Scott LaVarnway committed
179
        t->skip_eob_node = 0;
180

181
        ++x->coef_counts       [1] [band] [pt] [DCT_EOB_TOKEN];
John Koleszar's avatar
John Koleszar committed
182

Tero Rintaluoma's avatar
Tero Rintaluoma committed
183
        t++;
John Koleszar's avatar
John Koleszar committed
184
185
186
    }

    *tp = t;
Scott LaVarnway's avatar
Scott LaVarnway committed
187
    *a = *l = 1;
John Koleszar's avatar
John Koleszar committed
188
189
190
191
192

}

static void tokenize1st_order_b
(
193
    MACROBLOCK *x,
John Koleszar's avatar
John Koleszar committed
194
    TOKENEXTRA **tp,
Tero Rintaluoma's avatar
Tero Rintaluoma committed
195
    int type,           /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
John Koleszar's avatar
John Koleszar committed
196
197
198
    VP8_COMP *cpi
)
{
199
    MACROBLOCKD *xd = &x->e_mbd;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
200
201
202
203
204
205
206
207
208
209
210
211
    unsigned int block;
    const BLOCKD *b;
    int pt;             /* near block/prev token context index */
    int c;
    int token;
    TOKENEXTRA *t = *tp;/* store tokens starting here */
    const short *qcoeff_ptr;
    ENTROPY_CONTEXT * a;
    ENTROPY_CONTEXT * l;
    int band, rc, v;
    int tmp1, tmp2;

212
    b = xd->block;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
213
214
    /* Luma */
    for (block = 0; block < 16; block++, b++)
John Koleszar's avatar
John Koleszar committed
215
    {
216
        const int eob = *b->eob;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
217
218
219
        tmp1 = vp8_block2above[block];
        tmp2 = vp8_block2left[block];
        qcoeff_ptr = b->qcoeff;
220
221
        a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
        l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
222
223

        VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
John Koleszar's avatar
John Koleszar committed
224

Tero Rintaluoma's avatar
Tero Rintaluoma committed
225
        c = type ? 0 : 1;
John Koleszar's avatar
John Koleszar committed
226

227
        if(c >= eob)
Scott LaVarnway's avatar
Scott LaVarnway committed
228
229
230
231
232
233
        {
            /* c = band for this case */
            t->Token = DCT_EOB_TOKEN;
            t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
            t->skip_eob_node = 0;

234
            ++x->coef_counts       [type] [c] [pt] [DCT_EOB_TOKEN];
Scott LaVarnway's avatar
Scott LaVarnway committed
235
236
237
238
239
240
241
242
243
244
245
246
247
248
            t++;
            *tp = t;
            *a = *l = 0;
            continue;
        }

        v = qcoeff_ptr[c];

        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
        token    = vp8_dct_value_tokens_ptr[v].Token;
        t->Token = token;

        t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt];
        t->skip_eob_node = 0;
249
        ++x->coef_counts       [type] [c] [pt] [token];
Scott LaVarnway's avatar
Scott LaVarnway committed
250
251
252
253
        pt = vp8_prev_token_class[token];
        t++;
        c++;

254
255
        assert(eob <= 16);
        for (; c < eob; c++)
John Koleszar's avatar
John Koleszar committed
256
        {
Tero Rintaluoma's avatar
Tero Rintaluoma committed
257
258
259
260
            rc = vp8_default_zig_zag1d[c];
            band = vp8_coef_bands[c];
            v = qcoeff_ptr[rc];

John Koleszar's avatar
John Koleszar committed
261
            t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
262
263
264
265
266
            token    = vp8_dct_value_tokens_ptr[v].Token;

            t->Token = token;
            t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];

Scott LaVarnway's avatar
Scott LaVarnway committed
267
            t->skip_eob_node = (pt == 0);
268
            ++x->coef_counts       [type] [band] [pt] [token];
Tero Rintaluoma's avatar
Tero Rintaluoma committed
269
270
271

            pt = vp8_prev_token_class[token];
            t++;
John Koleszar's avatar
John Koleszar committed
272
        }
Tero Rintaluoma's avatar
Tero Rintaluoma committed
273
274
275
276
277
        if (c < 16)
        {
            band = vp8_coef_bands[c];
            t->Token = DCT_EOB_TOKEN;
            t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
John Koleszar's avatar
John Koleszar committed
278

Scott LaVarnway's avatar
Scott LaVarnway committed
279
            t->skip_eob_node = 0;
280
            ++x->coef_counts       [type] [band] [pt] [DCT_EOB_TOKEN];
Tero Rintaluoma's avatar
Tero Rintaluoma committed
281
282
283
284

            t++;
        }
        *tp = t;
Scott LaVarnway's avatar
Scott LaVarnway committed
285
        *a = *l = 1;
John Koleszar's avatar
John Koleszar committed
286
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
287

Tero Rintaluoma's avatar
Tero Rintaluoma committed
288
289
290
    /* Chroma */
    for (block = 16; block < 24; block++, b++)
    {
291
        const int eob = *b->eob;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
292
293
294
        tmp1 = vp8_block2above[block];
        tmp2 = vp8_block2left[block];
        qcoeff_ptr = b->qcoeff;
295
296
        a = (ENTROPY_CONTEXT *)xd->above_context + tmp1;
        l = (ENTROPY_CONTEXT *)xd->left_context + tmp2;
John Koleszar's avatar
John Koleszar committed
297

Tero Rintaluoma's avatar
Tero Rintaluoma committed
298
299
        VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);

300
        if(!eob)
Scott LaVarnway's avatar
Scott LaVarnway committed
301
302
303
304
305
306
        {
            /* c = band for this case */
            t->Token = DCT_EOB_TOKEN;
            t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
            t->skip_eob_node = 0;

307
            ++x->coef_counts       [2] [0] [pt] [DCT_EOB_TOKEN];
Scott LaVarnway's avatar
Scott LaVarnway committed
308
309
310
311
312
313
314
315
316
317
318
319
320
321
            t++;
            *tp = t;
            *a = *l = 0;
            continue;
        }

        v = qcoeff_ptr[0];

        t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
        token    = vp8_dct_value_tokens_ptr[v].Token;
        t->Token = token;

        t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
        t->skip_eob_node = 0;
322
        ++x->coef_counts       [2] [0] [pt] [token];
Scott LaVarnway's avatar
Scott LaVarnway committed
323
324
325
326
        pt = vp8_prev_token_class[token];
        t++;
        c = 1;

327
328
        assert(eob <= 16);
        for (; c < eob; c++)
Tero Rintaluoma's avatar
Tero Rintaluoma committed
329
330
331
332
333
334
335
336
337
338
339
        {
            rc = vp8_default_zig_zag1d[c];
            band = vp8_coef_bands[c];
            v = qcoeff_ptr[rc];

            t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
            token    = vp8_dct_value_tokens_ptr[v].Token;

            t->Token = token;
            t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];

Scott LaVarnway's avatar
Scott LaVarnway committed
340
            t->skip_eob_node = (pt == 0);
Tero Rintaluoma's avatar
Tero Rintaluoma committed
341

342
            ++x->coef_counts       [2] [band] [pt] [token];
Tero Rintaluoma's avatar
Tero Rintaluoma committed
343
344
345
346
347
348
349
350
351
352

            pt = vp8_prev_token_class[token];
            t++;
        }
        if (c < 16)
        {
            band = vp8_coef_bands[c];
            t->Token = DCT_EOB_TOKEN;
            t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt];

Scott LaVarnway's avatar
Scott LaVarnway committed
353
            t->skip_eob_node = 0;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
354

355
            ++x->coef_counts       [2] [band] [pt] [DCT_EOB_TOKEN];
Tero Rintaluoma's avatar
Tero Rintaluoma committed
356
357
358
359

            t++;
        }
        *tp = t;
Scott LaVarnway's avatar
Scott LaVarnway committed
360
        *a = *l = 1;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
361
    }
John Koleszar's avatar
John Koleszar committed
362
363
}

364

365
static int mb_is_skippable(MACROBLOCKD *x, int has_y2_block)
366
367
368
369
370
371
372
{
    int skip = 1;
    int i = 0;

    if (has_y2_block)
    {
        for (i = 0; i < 16; i++)
373
            skip &= (x->eobs[i] < 2);
374
375
376
    }

    for (; i < 24 + has_y2_block; i++)
377
        skip &= (!x->eobs[i]);
378
379
380
381
382

    return skip;
}


383
void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
John Koleszar's avatar
John Koleszar committed
384
{
385
    MACROBLOCKD *xd = &x->e_mbd;
John Koleszar's avatar
John Koleszar committed
386
    int plane_type;
387
388
    int has_y2_block;

389
390
    has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED
                    && xd->mode_info_context->mbmi.mode != SPLITMV);
John Koleszar's avatar
John Koleszar committed
391

392
393
394
    xd->mode_info_context->mbmi.mb_skip_coeff =
        mb_is_skippable(xd, has_y2_block);
    if (xd->mode_info_context->mbmi.mb_skip_coeff)
John Koleszar's avatar
John Koleszar committed
395
396
    {
        if (!cpi->common.mb_no_coeff_skip)
397
398
399
        {
            vp8_stuff_mb(cpi, x, t);
        }
John Koleszar's avatar
John Koleszar committed
400
401
        else
        {
402
            vp8_fix_contexts(xd);
403
            x->skip_true_count++;
John Koleszar's avatar
John Koleszar committed
404
405
406
407
408
        }

        return;
    }

409
410
    plane_type = 3;
    if(has_y2_block)
John Koleszar's avatar
John Koleszar committed
411
    {
Tero Rintaluoma's avatar
Tero Rintaluoma committed
412
        tokenize2nd_order_b(x, t, cpi);
John Koleszar's avatar
John Koleszar committed
413
414
415
        plane_type = 0;
    }

Tero Rintaluoma's avatar
Tero Rintaluoma committed
416
    tokenize1st_order_b(x, t, plane_type, cpi);
John Koleszar's avatar
John Koleszar committed
417
}
418

John Koleszar's avatar
John Koleszar committed
419

420
#ifdef VP8_ENTROPY_STATS
John Koleszar's avatar
John Koleszar committed
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437

void init_context_counters(void)
{
    vpx_memset(context_counters, 0, sizeof(context_counters));
}

void print_context_counters()
{

    int type, band, pt, t;

    FILE *const f = fopen("context.c", "w");

    fprintf(f, "#include \"entropy.h\"\n");

    fprintf(f, "\n/* *** GENERATED FILE: DO NOT EDIT *** */\n\n");

438
    fprintf(f, "int Contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];\n\n");
John Koleszar's avatar
John Koleszar committed
439

440
    fprintf(f, "const int default_contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {");
John Koleszar's avatar
John Koleszar committed
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472

# define Comma( X) (X? ",":"")

    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
                {
                    const _int64 x = context_counters [type] [band] [pt] [t];
                    const int y = (int) x;

                    assert(x == (_int64) y);  /* no overflow handling yet */
                    fprintf(f, "%s %d", Comma(t), y);

                }
473
                while (++t < MAX_ENTROPY_TOKENS);
John Koleszar's avatar
John Koleszar committed
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493

                fprintf(f, "}");
            }
            while (++pt < PREV_COEF_CONTEXTS);

            fprintf(f, "\n    }");

        }
        while (++band < COEF_BANDS);

        fprintf(f, "\n  }");
    }
    while (++type < BLOCK_TYPES);

    fprintf(f, "\n};\n");
    fclose(f);
}
#endif


494
static void stuff2nd_order_b
John Koleszar's avatar
John Koleszar committed
495
496
497
498
(
    TOKENEXTRA **tp,
    ENTROPY_CONTEXT *a,
    ENTROPY_CONTEXT *l,
499
500
    VP8_COMP *cpi,
    MACROBLOCK *x
John Koleszar's avatar
John Koleszar committed
501
502
503
504
505
506
507
508
509
)
{
    int pt; /* near block/prev token context index */
    TOKENEXTRA *t = *tp;        /* store tokens starting here */
    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);

    t->Token = DCT_EOB_TOKEN;
    t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
    t->skip_eob_node = 0;
510
    ++x->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
John Koleszar's avatar
John Koleszar committed
511
512
513
514
515
516
517
    ++t;

    *tp = t;
    pt = 0;
    *a = *l = pt;
}

518
static void stuff1st_order_b
John Koleszar's avatar
John Koleszar committed
519
520
521
522
(
    TOKENEXTRA **tp,
    ENTROPY_CONTEXT *a,
    ENTROPY_CONTEXT *l,
523
    int type,
524
525
    VP8_COMP *cpi,
    MACROBLOCK *x
John Koleszar's avatar
John Koleszar committed
526
527
528
)
{
    int pt; /* near block/prev token context index */
529
    int band;
John Koleszar's avatar
John Koleszar committed
530
531
    TOKENEXTRA *t = *tp;        /* store tokens starting here */
    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
532
    band = type ? 0 : 1;
John Koleszar's avatar
John Koleszar committed
533
    t->Token = DCT_EOB_TOKEN;
534
    t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
John Koleszar's avatar
John Koleszar committed
535
    t->skip_eob_node = 0;
536
    ++x->coef_counts       [type] [band] [pt] [DCT_EOB_TOKEN];
John Koleszar's avatar
John Koleszar committed
537
538
539
540
541
    ++t;
    *tp = t;
    pt = 0; /* 0 <-> all coeff data is zero */
    *a = *l = pt;
}
542

543
static
John Koleszar's avatar
John Koleszar committed
544
545
546
547
548
void stuff1st_order_buv
(
    TOKENEXTRA **tp,
    ENTROPY_CONTEXT *a,
    ENTROPY_CONTEXT *l,
549
550
    VP8_COMP *cpi,
    MACROBLOCK *x
John Koleszar's avatar
John Koleszar committed
551
552
553
554
555
556
557
558
559
)
{
    int pt; /* near block/prev token context index */
    TOKENEXTRA *t = *tp;        /* store tokens starting here */
    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);

    t->Token = DCT_EOB_TOKEN;
    t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
    t->skip_eob_node = 0;
560
    ++x->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN];
John Koleszar's avatar
John Koleszar committed
561
562
563
564
565
566
    ++t;
    *tp = t;
    pt = 0; /* 0 <-> all coeff data is zero */
    *a = *l = pt;
}

567
void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
John Koleszar's avatar
John Koleszar committed
568
{
569
570
571
    MACROBLOCKD *xd = &x->e_mbd;
    ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context;
    ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context;
John Koleszar's avatar
John Koleszar committed
572
573
    int plane_type;
    int b;
574
    plane_type = 3;
575
576
    if((xd->mode_info_context->mbmi.mode != B_PRED
                        && xd->mode_info_context->mbmi.mode != SPLITMV))
577
578
    {
        stuff2nd_order_b(t,
579
                     A + vp8_block2above[24], L + vp8_block2left[24], cpi, x);
580
581
        plane_type = 0;
    }
John Koleszar's avatar
John Koleszar committed
582
583

    for (b = 0; b < 16; b++)
584
        stuff1st_order_b(t,
585
                         A + vp8_block2above[b],
586
                         L + vp8_block2left[b], plane_type, cpi, x);
John Koleszar's avatar
John Koleszar committed
587
588

    for (b = 16; b < 24; b++)
589
        stuff1st_order_buv(t,
590
                           A + vp8_block2above[b],
591
                           L + vp8_block2left[b], cpi, x);
John Koleszar's avatar
John Koleszar committed
592
593

}
594
void vp8_fix_contexts(MACROBLOCKD *x)
John Koleszar's avatar
John Koleszar committed
595
{
596
    /* Clear entropy contexts for Y2 blocks */
597
    if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
John Koleszar's avatar
John Koleszar committed
598
    {
599
600
        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
John Koleszar's avatar
John Koleszar committed
601
    }
602
603
604
605
606
607
    else
    {
        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
    }

John Koleszar's avatar
John Koleszar committed
608
}