tokenize.c 14.7 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 23
 */


#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. */

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

29
static TOKENVALUE dct_value_tokens[DCT_MAX_VALUE*2];
30
const TOKENVALUE *vp8_dct_value_tokens_ptr;
31
static int dct_value_cost[DCT_MAX_VALUE*2];
32
const int *vp8_dct_value_cost_ptr;
John Koleszar's avatar
John Koleszar committed
33 34 35 36 37 38 39
#if 0
int skip_true_count = 0;
int skip_false_count = 0;
#endif
static void fill_value_tokens()
{

40
    TOKENVALUE *const t = dct_value_tokens + DCT_MAX_VALUE;
John Koleszar's avatar
John Koleszar committed
41 42 43 44 45 46 47 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 79 80 81 82 83
    vp8_extra_bit_struct *const e = vp8_extra_bits;

    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;
            vp8_extra_bit_struct *p = vp8_extra_bits + t[i].Token;

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

                cost += vp8_cost_bit(vp8_prob_half, extra & 1); /* sign */
84
                dct_value_cost[i + DCT_MAX_VALUE] = cost;
John Koleszar's avatar
John Koleszar committed
85 86 87 88 89 90 91
            }

        }

    }
    while (++i < DCT_MAX_VALUE);

92 93
    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
94 95 96 97
}

static void tokenize2nd_order_b
(
Tero Rintaluoma's avatar
Tero Rintaluoma committed
98
    MACROBLOCKD *x,
John Koleszar's avatar
John Koleszar committed
99 100 101 102
    TOKENEXTRA **tp,
    VP8_COMP *cpi
)
{
Tero Rintaluoma's avatar
Tero Rintaluoma committed
103 104 105 106 107 108 109 110
    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;
111
    int eob;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
112 113 114 115 116

    b = x->block + 24;
    qcoeff_ptr = b->qcoeff;
    a = (ENTROPY_CONTEXT *)x->above_context + 8;
    l = (ENTROPY_CONTEXT *)x->left_context + 8;
117
    eob = x->eobs[24];
John Koleszar's avatar
John Koleszar committed
118 119
    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);

120
    if(!eob)
Scott LaVarnway's avatar
Scott LaVarnway committed
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
    {
        /* 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;

        ++cpi->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
        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;
    ++cpi->coef_counts       [1] [0] [pt] [token];
    pt = vp8_prev_token_class[token];
    t++;
    c = 1;

146
    for (; c < eob; c++)
John Koleszar's avatar
John Koleszar committed
147
    {
Tero Rintaluoma's avatar
Tero Rintaluoma committed
148 149 150
        rc = vp8_default_zig_zag1d[c];
        band = vp8_coef_bands[c];
        v = qcoeff_ptr[rc];
John Koleszar's avatar
John Koleszar committed
151

Tero Rintaluoma's avatar
Tero Rintaluoma committed
152 153 154 155 156 157
        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
158
        t->skip_eob_node = ((pt == 0));
Tero Rintaluoma's avatar
Tero Rintaluoma committed
159 160 161 162 163 164 165 166 167 168 169

        ++cpi->coef_counts       [1] [band] [pt] [token];

        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
170

Scott LaVarnway's avatar
Scott LaVarnway committed
171
        t->skip_eob_node = 0;
172

Tero Rintaluoma's avatar
Tero Rintaluoma committed
173
        ++cpi->coef_counts       [1] [band] [pt] [DCT_EOB_TOKEN];
John Koleszar's avatar
John Koleszar committed
174

Tero Rintaluoma's avatar
Tero Rintaluoma committed
175
        t++;
John Koleszar's avatar
John Koleszar committed
176 177 178
    }

    *tp = t;
Scott LaVarnway's avatar
Scott LaVarnway committed
179
    *a = *l = 1;
John Koleszar's avatar
John Koleszar committed
180 181 182 183 184

}

static void tokenize1st_order_b
(
Tero Rintaluoma's avatar
Tero Rintaluoma committed
185
    MACROBLOCKD *x,
John Koleszar's avatar
John Koleszar committed
186
    TOKENEXTRA **tp,
Tero Rintaluoma's avatar
Tero Rintaluoma committed
187
    int type,           /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
John Koleszar's avatar
John Koleszar committed
188 189 190
    VP8_COMP *cpi
)
{
Tero Rintaluoma's avatar
Tero Rintaluoma committed
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
    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;

    b = x->block;
    /* Luma */
    for (block = 0; block < 16; block++, b++)
John Koleszar's avatar
John Koleszar committed
206
    {
Tero Rintaluoma's avatar
Tero Rintaluoma committed
207 208 209 210 211 212 213
        tmp1 = vp8_block2above[block];
        tmp2 = vp8_block2left[block];
        qcoeff_ptr = b->qcoeff;
        a = (ENTROPY_CONTEXT *)x->above_context + tmp1;
        l = (ENTROPY_CONTEXT *)x->left_context + tmp2;

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

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

217
        if(c >= *b->eob)
Scott LaVarnway's avatar
Scott LaVarnway committed
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
        {
            /* 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;

            ++cpi->coef_counts       [type] [c] [pt] [DCT_EOB_TOKEN];
            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;
        ++cpi->coef_counts       [type] [c] [pt] [token];
        pt = vp8_prev_token_class[token];
        t++;
        c++;

244
        for (; c < *b->eob; c++)
John Koleszar's avatar
John Koleszar committed
245
        {
Tero Rintaluoma's avatar
Tero Rintaluoma committed
246 247 248 249
            rc = vp8_default_zig_zag1d[c];
            band = vp8_coef_bands[c];
            v = qcoeff_ptr[rc];

John Koleszar's avatar
John Koleszar committed
250
            t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
251 252 253 254 255
            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
256
            t->skip_eob_node = (pt == 0);
Tero Rintaluoma's avatar
Tero Rintaluoma committed
257 258 259 260
            ++cpi->coef_counts       [type] [band] [pt] [token];

            pt = vp8_prev_token_class[token];
            t++;
John Koleszar's avatar
John Koleszar committed
261
        }
Tero Rintaluoma's avatar
Tero Rintaluoma committed
262 263 264 265 266
        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
267

Scott LaVarnway's avatar
Scott LaVarnway committed
268
            t->skip_eob_node = 0;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
269 270 271 272 273
            ++cpi->coef_counts       [type] [band] [pt] [DCT_EOB_TOKEN];

            t++;
        }
        *tp = t;
Scott LaVarnway's avatar
Scott LaVarnway committed
274
        *a = *l = 1;
John Koleszar's avatar
John Koleszar committed
275
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
276

Tero Rintaluoma's avatar
Tero Rintaluoma committed
277 278 279 280 281 282 283 284
    /* Chroma */
    for (block = 16; block < 24; block++, b++)
    {
        tmp1 = vp8_block2above[block];
        tmp2 = vp8_block2left[block];
        qcoeff_ptr = b->qcoeff;
        a = (ENTROPY_CONTEXT *)x->above_context + tmp1;
        l = (ENTROPY_CONTEXT *)x->left_context + tmp2;
John Koleszar's avatar
John Koleszar committed
285

Tero Rintaluoma's avatar
Tero Rintaluoma committed
286 287
        VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);

288
        if(!(*b->eob))
Scott LaVarnway's avatar
Scott LaVarnway committed
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
        {
            /* 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;

            ++cpi->coef_counts       [2] [0] [pt] [DCT_EOB_TOKEN];
            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;
        ++cpi->coef_counts       [2] [0] [pt] [token];
        pt = vp8_prev_token_class[token];
        t++;
        c = 1;

315
        for (; c < *b->eob; c++)
Tero Rintaluoma's avatar
Tero Rintaluoma committed
316 317 318 319 320 321 322 323 324 325 326
        {
            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
327
            t->skip_eob_node = (pt == 0);
Tero Rintaluoma's avatar
Tero Rintaluoma committed
328 329 330 331 332 333 334 335 336 337 338 339

            ++cpi->coef_counts       [2] [band] [pt] [token];

            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
340
            t->skip_eob_node = 0;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
341 342 343 344 345 346

            ++cpi->coef_counts       [2] [band] [pt] [DCT_EOB_TOKEN];

            t++;
        }
        *tp = t;
Scott LaVarnway's avatar
Scott LaVarnway committed
347
        *a = *l = 1;
Tero Rintaluoma's avatar
Tero Rintaluoma committed
348
    }
John Koleszar's avatar
John Koleszar committed
349 350
}

351

352
static int mb_is_skippable(MACROBLOCKD *x, int has_y2_block)
353 354 355 356 357 358 359
{
    int skip = 1;
    int i = 0;

    if (has_y2_block)
    {
        for (i = 0; i < 16; i++)
360
            skip &= (x->eobs[i] < 2);
361 362 363
    }

    for (; i < 24 + has_y2_block; i++)
364
        skip &= (!x->eobs[i]);
365 366 367 368 369

    return skip;
}


John Koleszar's avatar
John Koleszar committed
370 371 372
void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t)
{
    int plane_type;
373 374 375 376
    int has_y2_block;

    has_y2_block = (x->mode_info_context->mbmi.mode != B_PRED
                    && x->mode_info_context->mbmi.mode != SPLITMV);
John Koleszar's avatar
John Koleszar committed
377

378
    x->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable(x, has_y2_block);
379
    if (x->mode_info_context->mbmi.mb_skip_coeff)
John Koleszar's avatar
John Koleszar committed
380 381
    {
        if (!cpi->common.mb_no_coeff_skip)
382 383 384
        {
            vp8_stuff_mb(cpi, x, t);
        }
John Koleszar's avatar
John Koleszar committed
385 386
        else
        {
387
            vp8_fix_contexts(x);
388
            cpi->skip_true_count++;
John Koleszar's avatar
John Koleszar committed
389 390 391 392 393
        }

        return;
    }

394 395
    plane_type = 3;
    if(has_y2_block)
John Koleszar's avatar
John Koleszar committed
396
    {
Tero Rintaluoma's avatar
Tero Rintaluoma committed
397
        tokenize2nd_order_b(x, t, cpi);
John Koleszar's avatar
John Koleszar committed
398 399 400
        plane_type = 0;
    }

Tero Rintaluoma's avatar
Tero Rintaluoma committed
401
    tokenize1st_order_b(x, t, plane_type, cpi);
John Koleszar's avatar
John Koleszar committed
402
}
403

John Koleszar's avatar
John Koleszar committed
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422

#ifdef ENTROPY_STATS

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

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

425
    fprintf(f, "const int default_contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {");
John Koleszar's avatar
John Koleszar committed
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457

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

                }
458
                while (++t < MAX_ENTROPY_TOKENS);
John Koleszar's avatar
John Koleszar committed
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513

                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


void vp8_tokenize_initialize()
{
    fill_value_tokens();
}


static __inline void stuff2nd_order_b
(
    TOKENEXTRA **tp,
    ENTROPY_CONTEXT *a,
    ENTROPY_CONTEXT *l,
    VP8_COMP *cpi
)
{
    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;
    ++cpi->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
    ++t;

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

}

static __inline void stuff1st_order_b
(
    TOKENEXTRA **tp,
    ENTROPY_CONTEXT *a,
    ENTROPY_CONTEXT *l,
514
    int type,
John Koleszar's avatar
John Koleszar committed
515 516 517 518
    VP8_COMP *cpi
)
{
    int pt; /* near block/prev token context index */
519
    int band;
John Koleszar's avatar
John Koleszar committed
520 521
    TOKENEXTRA *t = *tp;        /* store tokens starting here */
    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
522
    band = type ? 0 : 1;
John Koleszar's avatar
John Koleszar committed
523
    t->Token = DCT_EOB_TOKEN;
524
    t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
John Koleszar's avatar
John Koleszar committed
525
    t->skip_eob_node = 0;
526
    ++cpi->coef_counts       [type] [band] [pt] [DCT_EOB_TOKEN];
John Koleszar's avatar
John Koleszar committed
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
    ++t;
    *tp = t;
    pt = 0; /* 0 <-> all coeff data is zero */
    *a = *l = pt;

}
static __inline
void stuff1st_order_buv
(
    TOKENEXTRA **tp,
    ENTROPY_CONTEXT *a,
    ENTROPY_CONTEXT *l,
    VP8_COMP *cpi
)
{
    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;
    ++cpi->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN];
    ++t;
    *tp = t;
    pt = 0; /* 0 <-> all coeff data is zero */
    *a = *l = pt;

}

void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t)
{
559 560
    ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context;
    ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context;
John Koleszar's avatar
John Koleszar committed
561 562
    int plane_type;
    int b;
563 564 565 566 567
    plane_type = 3;
    if((x->mode_info_context->mbmi.mode != B_PRED
                        && x->mode_info_context->mbmi.mode != SPLITMV))
    {
        stuff2nd_order_b(t,
568
                     A + vp8_block2above[24], L + vp8_block2left[24], cpi);
569 570
        plane_type = 0;
    }
John Koleszar's avatar
John Koleszar committed
571 572

    for (b = 0; b < 16; b++)
573
        stuff1st_order_b(t,
574
                         A + vp8_block2above[b],
575
                         L + vp8_block2left[b], plane_type, cpi);
John Koleszar's avatar
John Koleszar committed
576 577

    for (b = 16; b < 24; b++)
578
        stuff1st_order_buv(t,
579 580
                           A + vp8_block2above[b],
                           L + vp8_block2left[b], cpi);
John Koleszar's avatar
John Koleszar committed
581 582

}
583
void vp8_fix_contexts(MACROBLOCKD *x)
John Koleszar's avatar
John Koleszar committed
584
{
585
    /* Clear entropy contexts for Y2 blocks */
586
    if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
John Koleszar's avatar
John Koleszar committed
587
    {
588 589
        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
590
    }
591 592 593 594 595 596
    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
597
}