190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <math.h>
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <stdio.h>
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <string.h>
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <assert.h>
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "onyx_int.h"
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "tokenize.h"
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h"
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* Global event counters used for accumulating statistics across several
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber   compressions, then generating context.c = initial stats. */
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef ENTROPY_STATS
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber_int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens];
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ;
27f71323e297a928af368937089d3ed71239786f86Andreas Hubervoid vp8_fix_contexts(MACROBLOCKD *x);
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2979f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic TOKENVALUE dct_value_tokens[DCT_MAX_VALUE*2];
30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberconst TOKENVALUE *vp8_dct_value_tokens_ptr;
3179f15823c34ae1e423108295e416213200bb280fAndreas Huberstatic int dct_value_cost[DCT_MAX_VALUE*2];
32f71323e297a928af368937089d3ed71239786f86Andreas Huberconst int *vp8_dct_value_cost_ptr;
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint skip_true_count = 0;
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint skip_false_count = 0;
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void fill_value_tokens()
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4079f15823c34ae1e423108295e416213200bb280fAndreas Huber    TOKENVALUE *const t = dct_value_tokens + DCT_MAX_VALUE;
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_extra_bit_struct *const e = vp8_extra_bits;
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i = -DCT_MAX_VALUE;
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int sign = 1;
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    do
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!i)
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            sign = 0;
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const int a = sign ? -i : i;
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int eb = sign;
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (a > 4)
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                int j = 4;
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                while (++j < 11  &&  e[j].base_val <= a) {}
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                t[i].Token = --j;
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                eb |= (a - e[j].base_val) << 1;
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            else
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                t[i].Token = a;
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            t[i].Extra = eb;
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        // initialize the cost for extra bits for all possible coefficient value.
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int cost = 0;
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vp8_extra_bit_struct *p = vp8_extra_bits + t[i].Token;
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (p->base_val)
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                const int extra = t[i].Extra;
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                const int Length = p->Len;
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                if (Length)
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    cost += vp8_treed_cost(p->tree, p->prob, extra >> 1, Length);
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                cost += vp8_cost_bit(vp8_prob_half, extra & 1); /* sign */
8479f15823c34ae1e423108295e416213200bb280fAndreas Huber                dct_value_cost[i + DCT_MAX_VALUE] = cost;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (++i < DCT_MAX_VALUE);
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9279f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE;
9379f15823c34ae1e423108295e416213200bb280fAndreas Huber    vp8_dct_value_cost_ptr   = dct_value_cost + DCT_MAX_VALUE;
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void tokenize2nd_order_b
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const BLOCKD *const b,
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA **tp,
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int type,     /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const FRAME_TYPE frametype,
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *a,
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *l,
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMP *cpi
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int pt; /* near block/prev token context index */
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int c = 0;          /* start at DC */
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int eob = b->eob;     /* one beyond last nonzero coeff */
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA *t = *tp;        /* store tokens starting here */
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int x;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short *qcoeff_ptr = b->qcoeff;
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    do
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        const int band = vp8_coef_bands[c];
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (c < eob)
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int rc = vp8_default_zig_zag1d[c];
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const int v = qcoeff_ptr[rc];
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            assert(-DCT_MAX_VALUE <= v  &&  v < (DCT_MAX_VALUE));
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x        = vp8_dct_value_tokens_ptr[v].Token;
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x = DCT_EOB_TOKEN;
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        t->Token = x;
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        t->skip_eob_node = pt == 0 && ((band > 0 && type > 0) || (band > 1 && type == 0));
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ++cpi->coef_counts       [type] [band] [pt] [x];
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (pt = vp8_prev_token_class[x], ++t, c < eob  &&  ++c < 16);
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *tp = t;
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    pt = (c != !type); /* 0 <-> all coeff data is zero */
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *a = *l = pt;
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void tokenize1st_order_b
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const BLOCKD *const b,
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA **tp,
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int type,     /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const FRAME_TYPE frametype,
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *a,
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *l,
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMP *cpi
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int pt; /* near block/prev token context index */
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int c = type ? 0 : 1;       /* start at DC unless type 0 */
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int eob = b->eob;     /* one beyond last nonzero coeff */
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA *t = *tp;        /* store tokens starting here */
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int x;
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const short *qcoeff_ptr = b->qcoeff;
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    do
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        const int band = vp8_coef_bands[c];
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x = DCT_EOB_TOKEN;
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (c < eob)
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            int rc = vp8_default_zig_zag1d[c];
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const int v = qcoeff_ptr[rc];
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            assert(-DCT_MAX_VALUE <= v  &&  v < (DCT_MAX_VALUE));
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            t->Extra = vp8_dct_value_tokens_ptr[v].Extra;
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x        = vp8_dct_value_tokens_ptr[v].Token;
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        t->Token = x;
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt];
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        t->skip_eob_node = pt == 0 && ((band > 0 && type > 0) || (band > 1 && type == 0));
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        ++cpi->coef_counts       [type] [band] [pt] [x];
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (pt = vp8_prev_token_class[x], ++t, c < eob  &&  ++c < 16);
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *tp = t;
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    pt = (c != !type); /* 0 <-> all coeff data is zero */
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *a = *l = pt;
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
198538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
199538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic int mb_is_skippable(MACROBLOCKD *x)
200538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
201538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int has_y2_block;
202538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int skip = 1;
203538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int i = 0;
204538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
205538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    has_y2_block = (x->mode_info_context->mbmi.mode != B_PRED
206538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber                    && x->mode_info_context->mbmi.mode != SPLITMV);
207538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    if (has_y2_block)
208538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
209538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        for (i = 0; i < 16; i++)
210538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber            skip &= (x->block[i].eob < 2);
211538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
212538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
213538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (; i < 24 + has_y2_block; i++)
214538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        skip &= (!x->block[i].eob);
215538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
216538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    return skip;
217538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
218538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
219538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t)
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
222f71323e297a928af368937089d3ed71239786f86Andreas Huber    ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context;
223f71323e297a928af368937089d3ed71239786f86Andreas Huber    ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context;
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int plane_type;
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int b;
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA *start = *t;
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA *tp = *t;
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
230f71323e297a928af368937089d3ed71239786f86Andreas Huber    x->mode_info_context->mbmi.dc_diff = 1;
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (x->mbmi.force_no_skip)
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x->mbmi.mb_skip_coeff = 1;
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        //reset for next_mb.
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x->mbmi.force_no_skip = 0;
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 1
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
245538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    x->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable(x);
246f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.mb_skip_coeff)
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        cpi->skip_true_count++;
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (!cpi->common.mb_no_coeff_skip)
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vp8_stuff_mb(cpi, x, t) ;
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
255f71323e297a928af368937089d3ed71239786f86Andreas Huber            vp8_fix_contexts(x);
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
258f71323e297a928af368937089d3ed71239786f86Andreas Huber        if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
259f71323e297a928af368937089d3ed71239786f86Andreas Huber            x->mode_info_context->mbmi.dc_diff = 0;
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
261f71323e297a928af368937089d3ed71239786f86Andreas Huber            x->mode_info_context->mbmi.dc_diff = 1;
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return;
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    cpi->skip_false_count++;
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memcpy(cpi->coef_counts_backup, cpi->coef_counts, sizeof(cpi->coef_counts));
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
273f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.mode == B_PRED || x->mode_info_context->mbmi.mode == SPLITMV)
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        plane_type = 3;
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        tokenize2nd_order_b(x->block + 24, t, 1, x->frame_type,
280f71323e297a928af368937089d3ed71239786f86Andreas Huber                   A + vp8_block2above[24], L + vp8_block2left[24], cpi);
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        plane_type = 0;
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (b = 0; b < 16; b++)
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        tokenize1st_order_b(x->block + b, t, plane_type, x->frame_type,
287f71323e297a928af368937089d3ed71239786f86Andreas Huber                            A + vp8_block2above[b],
288f71323e297a928af368937089d3ed71239786f86Andreas Huber                            L + vp8_block2left[b], cpi);
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (b = 16; b < 24; b++)
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        tokenize1st_order_b(x->block + b, t, 2, x->frame_type,
292f71323e297a928af368937089d3ed71239786f86Andreas Huber                            A + vp8_block2above[b],
293f71323e297a928af368937089d3ed71239786f86Andreas Huber                            L + vp8_block2left[b], cpi);
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if 0
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    if (cpi->common.mb_no_coeff_skip)
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int skip = 1;
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while ((tp != *t) && skip)
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            skip = (skip && (tp->Token == DCT_EOB_TOKEN));
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            tp ++;
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (skip != x->mbmi.mb_skip_coeff)
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            skip += 0;
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        x->mbmi.mb_skip_coeff = skip;
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if (x->mbmi.mb_skip_coeff == 1)
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            x->mbmi.dc_diff = 0;
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //redo the coutnts
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_memcpy(cpi->coef_counts, cpi->coef_counts_backup, sizeof(cpi->coef_counts));
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            *t = start;
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->skip_true_count++;
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //skip_true_count++;
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        else
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            cpi->skip_false_count++;
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            //skip_false_count++;
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
332f71323e297a928af368937089d3ed71239786f86Andreas Huber
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef ENTROPY_STATS
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid init_context_counters(void)
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memset(context_counters, 0, sizeof(context_counters));
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid print_context_counters()
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int type, band, pt, t;
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    FILE *const f = fopen("context.c", "w");
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fprintf(f, "#include \"entropy.h\"\n");
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fprintf(f, "\n/* *** GENERATED FILE: DO NOT EDIT *** */\n\n");
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fprintf(f, "int Contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens];\n\n");
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fprintf(f, "const int default_contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens] = {");
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber# define Comma( X) (X? ",":"")
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    type = 0;
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    do
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fprintf(f, "%s\n  { /* block Type %d */", Comma(type), type);
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        band = 0;
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        do
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, "%s\n    { /* Coeff Band %d */", Comma(band), band);
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            pt = 0;
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            do
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fprintf(f, "%s\n      {", Comma(pt));
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                t = 0;
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                do
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                {
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    const _int64 x = context_counters [type] [band] [pt] [t];
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    const int y = (int) x;
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    assert(x == (_int64) y);  /* no overflow handling yet */
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                    fprintf(f, "%s %d", Comma(t), y);
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                }
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                while (++t < vp8_coef_tokens);
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                fprintf(f, "}");
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            }
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            while (++pt < PREV_COEF_CONTEXTS);
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            fprintf(f, "\n    }");
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        while (++band < COEF_BANDS);
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        fprintf(f, "\n  }");
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    while (++type < BLOCK_TYPES);
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fprintf(f, "\n};\n");
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fclose(f);
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_tokenize_initialize()
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    fill_value_tokens();
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic __inline void stuff2nd_order_b
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const BLOCKD *const b,
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA **tp,
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int type,     /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const FRAME_TYPE frametype,
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *a,
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *l,
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMP *cpi
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int pt; /* near block/prev token context index */
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA *t = *tp;        /* store tokens starting here */
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) frametype;
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) type;
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) b;
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->Token = DCT_EOB_TOKEN;
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt];
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->skip_eob_node = 0;
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ++cpi->coef_counts       [1] [0] [pt] [DCT_EOB_TOKEN];
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ++t;
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *tp = t;
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    pt = 0;
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *a = *l = pt;
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic __inline void stuff1st_order_b
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const BLOCKD *const b,
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA **tp,
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int type,     /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const FRAME_TYPE frametype,
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *a,
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *l,
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMP *cpi
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int pt; /* near block/prev token context index */
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA *t = *tp;        /* store tokens starting here */
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) frametype;
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) type;
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) b;
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->Token = DCT_EOB_TOKEN;
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->context_tree = cpi->common.fc.coef_probs [0] [1] [pt];
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->skip_eob_node = 0;
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ++cpi->coef_counts       [0] [1] [pt] [DCT_EOB_TOKEN];
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ++t;
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *tp = t;
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    pt = 0; /* 0 <-> all coeff data is zero */
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *a = *l = pt;
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic __inline
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid stuff1st_order_buv
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber(
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const BLOCKD *const b,
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA **tp,
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const int type,     /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const FRAME_TYPE frametype,
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *a,
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ENTROPY_CONTEXT *l,
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMP *cpi
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber)
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int pt; /* near block/prev token context index */
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    TOKENEXTRA *t = *tp;        /* store tokens starting here */
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) frametype;
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) type;
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    (void) b;
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->Token = DCT_EOB_TOKEN;
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt];
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    t->skip_eob_node = 0;
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ++cpi->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN];
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    ++t;
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *tp = t;
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    pt = 0; /* 0 <-> all coeff data is zero */
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *a = *l = pt;
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t)
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
504f71323e297a928af368937089d3ed71239786f86Andreas Huber    ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context;
505f71323e297a928af368937089d3ed71239786f86Andreas Huber    ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context;
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int plane_type;
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int b;
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    stuff2nd_order_b(x->block + 24, t, 1, x->frame_type,
510f71323e297a928af368937089d3ed71239786f86Andreas Huber                     A + vp8_block2above[24], L + vp8_block2left[24], cpi);
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    plane_type = 0;
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
514f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
515f71323e297a928af368937089d3ed71239786f86Andreas Huber        x->mode_info_context->mbmi.dc_diff = 0;
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    else
517f71323e297a928af368937089d3ed71239786f86Andreas Huber        x->mode_info_context->mbmi.dc_diff = 1;
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (b = 0; b < 16; b++)
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        stuff1st_order_b(x->block + b, t, plane_type, x->frame_type,
522f71323e297a928af368937089d3ed71239786f86Andreas Huber                         A + vp8_block2above[b],
523f71323e297a928af368937089d3ed71239786f86Andreas Huber                         L + vp8_block2left[b], cpi);
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (b = 16; b < 24; b++)
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        stuff1st_order_buv(x->block + b, t, 2, x->frame_type,
527f71323e297a928af368937089d3ed71239786f86Andreas Huber                           A + vp8_block2above[b],
528f71323e297a928af368937089d3ed71239786f86Andreas Huber                           L + vp8_block2left[b], cpi);
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
531f71323e297a928af368937089d3ed71239786f86Andreas Hubervoid vp8_fix_contexts(MACROBLOCKD *x)
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
533f71323e297a928af368937089d3ed71239786f86Andreas Huber    /* Clear entropy contexts for Y2 blocks */
534f71323e297a928af368937089d3ed71239786f86Andreas Huber    if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
536f71323e297a928af368937089d3ed71239786f86Andreas Huber        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
537f71323e297a928af368937089d3ed71239786f86Andreas Huber        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
539f71323e297a928af368937089d3ed71239786f86Andreas Huber    else
540f71323e297a928af368937089d3ed71239786f86Andreas Huber    {
541f71323e297a928af368937089d3ed71239786f86Andreas Huber        vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
542f71323e297a928af368937089d3ed71239786f86Andreas Huber        vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
543f71323e297a928af368937089d3ed71239786f86Andreas Huber    }
544f71323e297a928af368937089d3ed71239786f86Andreas Huber
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
546