11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohann#include <math.h> 131b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 141b362b15af34006e6a11974088a46d42b903418eJohann#include <string.h> 151b362b15af34006e6a11974088a46d42b903418eJohann#include <assert.h> 161b362b15af34006e6a11974088a46d42b903418eJohann#include "onyx_int.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "tokenize.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 191b362b15af34006e6a11974088a46d42b903418eJohann 201b362b15af34006e6a11974088a46d42b903418eJohann/* Global event counters used for accumulating statistics across several 211b362b15af34006e6a11974088a46d42b903418eJohann compressions, then generating context.c = initial stats. */ 221b362b15af34006e6a11974088a46d42b903418eJohann 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS 241b362b15af34006e6a11974088a46d42b903418eJohann_int64 context_counters[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; 251b362b15af34006e6a11974088a46d42b903418eJohann#endif 261b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ; 271b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_fix_contexts(MACROBLOCKD *x); 281b362b15af34006e6a11974088a46d42b903418eJohann 291b362b15af34006e6a11974088a46d42b903418eJohann#include "dct_value_tokens.h" 301b362b15af34006e6a11974088a46d42b903418eJohann#include "dct_value_cost.h" 311b362b15af34006e6a11974088a46d42b903418eJohann 321b362b15af34006e6a11974088a46d42b903418eJohannconst TOKENVALUE *const vp8_dct_value_tokens_ptr = dct_value_tokens + 331b362b15af34006e6a11974088a46d42b903418eJohann DCT_MAX_VALUE; 341b362b15af34006e6a11974088a46d42b903418eJohannconst short *const vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; 351b362b15af34006e6a11974088a46d42b903418eJohann 361b362b15af34006e6a11974088a46d42b903418eJohann#if 0 371b362b15af34006e6a11974088a46d42b903418eJohannint skip_true_count = 0; 381b362b15af34006e6a11974088a46d42b903418eJohannint skip_false_count = 0; 391b362b15af34006e6a11974088a46d42b903418eJohann#endif 401b362b15af34006e6a11974088a46d42b903418eJohann 411b362b15af34006e6a11974088a46d42b903418eJohann/* function used to generate dct_value_tokens and dct_value_cost tables */ 421b362b15af34006e6a11974088a46d42b903418eJohann/* 431b362b15af34006e6a11974088a46d42b903418eJohannstatic void fill_value_tokens() 441b362b15af34006e6a11974088a46d42b903418eJohann{ 451b362b15af34006e6a11974088a46d42b903418eJohann 461b362b15af34006e6a11974088a46d42b903418eJohann TOKENVALUE *t = dct_value_tokens + DCT_MAX_VALUE; 471b362b15af34006e6a11974088a46d42b903418eJohann const vp8_extra_bit_struct *e = vp8_extra_bits; 481b362b15af34006e6a11974088a46d42b903418eJohann 491b362b15af34006e6a11974088a46d42b903418eJohann int i = -DCT_MAX_VALUE; 501b362b15af34006e6a11974088a46d42b903418eJohann int sign = 1; 511b362b15af34006e6a11974088a46d42b903418eJohann 521b362b15af34006e6a11974088a46d42b903418eJohann do 531b362b15af34006e6a11974088a46d42b903418eJohann { 541b362b15af34006e6a11974088a46d42b903418eJohann if (!i) 551b362b15af34006e6a11974088a46d42b903418eJohann sign = 0; 561b362b15af34006e6a11974088a46d42b903418eJohann 571b362b15af34006e6a11974088a46d42b903418eJohann { 581b362b15af34006e6a11974088a46d42b903418eJohann const int a = sign ? -i : i; 591b362b15af34006e6a11974088a46d42b903418eJohann int eb = sign; 601b362b15af34006e6a11974088a46d42b903418eJohann 611b362b15af34006e6a11974088a46d42b903418eJohann if (a > 4) 621b362b15af34006e6a11974088a46d42b903418eJohann { 631b362b15af34006e6a11974088a46d42b903418eJohann int j = 4; 641b362b15af34006e6a11974088a46d42b903418eJohann 651b362b15af34006e6a11974088a46d42b903418eJohann while (++j < 11 && e[j].base_val <= a) {} 661b362b15af34006e6a11974088a46d42b903418eJohann 671b362b15af34006e6a11974088a46d42b903418eJohann t[i].Token = --j; 681b362b15af34006e6a11974088a46d42b903418eJohann eb |= (a - e[j].base_val) << 1; 691b362b15af34006e6a11974088a46d42b903418eJohann } 701b362b15af34006e6a11974088a46d42b903418eJohann else 711b362b15af34006e6a11974088a46d42b903418eJohann t[i].Token = a; 721b362b15af34006e6a11974088a46d42b903418eJohann 731b362b15af34006e6a11974088a46d42b903418eJohann t[i].Extra = eb; 741b362b15af34006e6a11974088a46d42b903418eJohann } 751b362b15af34006e6a11974088a46d42b903418eJohann 761b362b15af34006e6a11974088a46d42b903418eJohann // initialize the cost for extra bits for all possible coefficient value. 771b362b15af34006e6a11974088a46d42b903418eJohann { 781b362b15af34006e6a11974088a46d42b903418eJohann int cost = 0; 791b362b15af34006e6a11974088a46d42b903418eJohann const vp8_extra_bit_struct *p = vp8_extra_bits + t[i].Token; 801b362b15af34006e6a11974088a46d42b903418eJohann 811b362b15af34006e6a11974088a46d42b903418eJohann if (p->base_val) 821b362b15af34006e6a11974088a46d42b903418eJohann { 831b362b15af34006e6a11974088a46d42b903418eJohann const int extra = t[i].Extra; 841b362b15af34006e6a11974088a46d42b903418eJohann const int Length = p->Len; 851b362b15af34006e6a11974088a46d42b903418eJohann 861b362b15af34006e6a11974088a46d42b903418eJohann if (Length) 871b362b15af34006e6a11974088a46d42b903418eJohann cost += vp8_treed_cost(p->tree, p->prob, extra >> 1, Length); 881b362b15af34006e6a11974088a46d42b903418eJohann 891b362b15af34006e6a11974088a46d42b903418eJohann cost += vp8_cost_bit(vp8_prob_half, extra & 1); // sign 901b362b15af34006e6a11974088a46d42b903418eJohann dct_value_cost[i + DCT_MAX_VALUE] = cost; 911b362b15af34006e6a11974088a46d42b903418eJohann } 921b362b15af34006e6a11974088a46d42b903418eJohann 931b362b15af34006e6a11974088a46d42b903418eJohann } 941b362b15af34006e6a11974088a46d42b903418eJohann 951b362b15af34006e6a11974088a46d42b903418eJohann } 961b362b15af34006e6a11974088a46d42b903418eJohann while (++i < DCT_MAX_VALUE); 971b362b15af34006e6a11974088a46d42b903418eJohann 981b362b15af34006e6a11974088a46d42b903418eJohann vp8_dct_value_tokens_ptr = dct_value_tokens + DCT_MAX_VALUE; 991b362b15af34006e6a11974088a46d42b903418eJohann vp8_dct_value_cost_ptr = dct_value_cost + DCT_MAX_VALUE; 1001b362b15af34006e6a11974088a46d42b903418eJohann} 1011b362b15af34006e6a11974088a46d42b903418eJohann*/ 1021b362b15af34006e6a11974088a46d42b903418eJohann 1031b362b15af34006e6a11974088a46d42b903418eJohannstatic void tokenize2nd_order_b 1041b362b15af34006e6a11974088a46d42b903418eJohann( 1051b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x, 1061b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA **tp, 1071b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi 1081b362b15af34006e6a11974088a46d42b903418eJohann) 1091b362b15af34006e6a11974088a46d42b903418eJohann{ 1101b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 1111b362b15af34006e6a11974088a46d42b903418eJohann int pt; /* near block/prev token context index */ 1121b362b15af34006e6a11974088a46d42b903418eJohann int c; /* start at DC */ 1131b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA *t = *tp;/* store tokens starting here */ 1141b362b15af34006e6a11974088a46d42b903418eJohann const BLOCKD *b; 1151b362b15af34006e6a11974088a46d42b903418eJohann const short *qcoeff_ptr; 1161b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT * a; 1171b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT * l; 1181b362b15af34006e6a11974088a46d42b903418eJohann int band, rc, v, token; 1191b362b15af34006e6a11974088a46d42b903418eJohann int eob; 1201b362b15af34006e6a11974088a46d42b903418eJohann 1211b362b15af34006e6a11974088a46d42b903418eJohann b = xd->block + 24; 1221b362b15af34006e6a11974088a46d42b903418eJohann qcoeff_ptr = b->qcoeff; 1231b362b15af34006e6a11974088a46d42b903418eJohann a = (ENTROPY_CONTEXT *)xd->above_context + 8; 1241b362b15af34006e6a11974088a46d42b903418eJohann l = (ENTROPY_CONTEXT *)xd->left_context + 8; 1251b362b15af34006e6a11974088a46d42b903418eJohann eob = xd->eobs[24]; 1261b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 1271b362b15af34006e6a11974088a46d42b903418eJohann 1281b362b15af34006e6a11974088a46d42b903418eJohann if(!eob) 1291b362b15af34006e6a11974088a46d42b903418eJohann { 1301b362b15af34006e6a11974088a46d42b903418eJohann /* c = band for this case */ 1311b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 1321b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; 1331b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 1341b362b15af34006e6a11974088a46d42b903418eJohann 1351b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; 1361b362b15af34006e6a11974088a46d42b903418eJohann t++; 1371b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 1381b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = 0; 1391b362b15af34006e6a11974088a46d42b903418eJohann return; 1401b362b15af34006e6a11974088a46d42b903418eJohann } 1411b362b15af34006e6a11974088a46d42b903418eJohann 1421b362b15af34006e6a11974088a46d42b903418eJohann v = qcoeff_ptr[0]; 1431b362b15af34006e6a11974088a46d42b903418eJohann t->Extra = vp8_dct_value_tokens_ptr[v].Extra; 1441b362b15af34006e6a11974088a46d42b903418eJohann token = vp8_dct_value_tokens_ptr[v].Token; 1451b362b15af34006e6a11974088a46d42b903418eJohann t->Token = token; 1461b362b15af34006e6a11974088a46d42b903418eJohann 1471b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; 1481b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 1491b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [1] [0] [pt] [token]; 1501b362b15af34006e6a11974088a46d42b903418eJohann pt = vp8_prev_token_class[token]; 1511b362b15af34006e6a11974088a46d42b903418eJohann t++; 1521b362b15af34006e6a11974088a46d42b903418eJohann c = 1; 1531b362b15af34006e6a11974088a46d42b903418eJohann 1541b362b15af34006e6a11974088a46d42b903418eJohann for (; c < eob; c++) 1551b362b15af34006e6a11974088a46d42b903418eJohann { 1561b362b15af34006e6a11974088a46d42b903418eJohann rc = vp8_default_zig_zag1d[c]; 1571b362b15af34006e6a11974088a46d42b903418eJohann band = vp8_coef_bands[c]; 1581b362b15af34006e6a11974088a46d42b903418eJohann v = qcoeff_ptr[rc]; 1591b362b15af34006e6a11974088a46d42b903418eJohann 1601b362b15af34006e6a11974088a46d42b903418eJohann t->Extra = vp8_dct_value_tokens_ptr[v].Extra; 1611b362b15af34006e6a11974088a46d42b903418eJohann token = vp8_dct_value_tokens_ptr[v].Token; 1621b362b15af34006e6a11974088a46d42b903418eJohann 1631b362b15af34006e6a11974088a46d42b903418eJohann t->Token = token; 1641b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; 1651b362b15af34006e6a11974088a46d42b903418eJohann 1661b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = ((pt == 0)); 1671b362b15af34006e6a11974088a46d42b903418eJohann 1681b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [1] [band] [pt] [token]; 1691b362b15af34006e6a11974088a46d42b903418eJohann 1701b362b15af34006e6a11974088a46d42b903418eJohann pt = vp8_prev_token_class[token]; 1711b362b15af34006e6a11974088a46d42b903418eJohann t++; 1721b362b15af34006e6a11974088a46d42b903418eJohann } 1731b362b15af34006e6a11974088a46d42b903418eJohann if (c < 16) 1741b362b15af34006e6a11974088a46d42b903418eJohann { 1751b362b15af34006e6a11974088a46d42b903418eJohann band = vp8_coef_bands[c]; 1761b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 1771b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [1] [band] [pt]; 1781b362b15af34006e6a11974088a46d42b903418eJohann 1791b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 1801b362b15af34006e6a11974088a46d42b903418eJohann 1811b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [1] [band] [pt] [DCT_EOB_TOKEN]; 1821b362b15af34006e6a11974088a46d42b903418eJohann 1831b362b15af34006e6a11974088a46d42b903418eJohann t++; 1841b362b15af34006e6a11974088a46d42b903418eJohann } 1851b362b15af34006e6a11974088a46d42b903418eJohann 1861b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 1871b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = 1; 1881b362b15af34006e6a11974088a46d42b903418eJohann 1891b362b15af34006e6a11974088a46d42b903418eJohann} 1901b362b15af34006e6a11974088a46d42b903418eJohann 1911b362b15af34006e6a11974088a46d42b903418eJohannstatic void tokenize1st_order_b 1921b362b15af34006e6a11974088a46d42b903418eJohann( 1931b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x, 1941b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA **tp, 1951b362b15af34006e6a11974088a46d42b903418eJohann int type, /* which plane: 0=Y no DC, 1=Y2, 2=UV, 3=Y with DC */ 1961b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi 1971b362b15af34006e6a11974088a46d42b903418eJohann) 1981b362b15af34006e6a11974088a46d42b903418eJohann{ 1991b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 2001b362b15af34006e6a11974088a46d42b903418eJohann unsigned int block; 2011b362b15af34006e6a11974088a46d42b903418eJohann const BLOCKD *b; 2021b362b15af34006e6a11974088a46d42b903418eJohann int pt; /* near block/prev token context index */ 2031b362b15af34006e6a11974088a46d42b903418eJohann int c; 2041b362b15af34006e6a11974088a46d42b903418eJohann int token; 2051b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA *t = *tp;/* store tokens starting here */ 2061b362b15af34006e6a11974088a46d42b903418eJohann const short *qcoeff_ptr; 2071b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT * a; 2081b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT * l; 2091b362b15af34006e6a11974088a46d42b903418eJohann int band, rc, v; 2101b362b15af34006e6a11974088a46d42b903418eJohann int tmp1, tmp2; 2111b362b15af34006e6a11974088a46d42b903418eJohann 2121b362b15af34006e6a11974088a46d42b903418eJohann b = xd->block; 2131b362b15af34006e6a11974088a46d42b903418eJohann /* Luma */ 2141b362b15af34006e6a11974088a46d42b903418eJohann for (block = 0; block < 16; block++, b++) 2151b362b15af34006e6a11974088a46d42b903418eJohann { 216a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian const int eob = *b->eob; 2171b362b15af34006e6a11974088a46d42b903418eJohann tmp1 = vp8_block2above[block]; 2181b362b15af34006e6a11974088a46d42b903418eJohann tmp2 = vp8_block2left[block]; 2191b362b15af34006e6a11974088a46d42b903418eJohann qcoeff_ptr = b->qcoeff; 2201b362b15af34006e6a11974088a46d42b903418eJohann a = (ENTROPY_CONTEXT *)xd->above_context + tmp1; 2211b362b15af34006e6a11974088a46d42b903418eJohann l = (ENTROPY_CONTEXT *)xd->left_context + tmp2; 2221b362b15af34006e6a11974088a46d42b903418eJohann 2231b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 2241b362b15af34006e6a11974088a46d42b903418eJohann 2251b362b15af34006e6a11974088a46d42b903418eJohann c = type ? 0 : 1; 2261b362b15af34006e6a11974088a46d42b903418eJohann 227a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if(c >= eob) 2281b362b15af34006e6a11974088a46d42b903418eJohann { 2291b362b15af34006e6a11974088a46d42b903418eJohann /* c = band for this case */ 2301b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 2311b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; 2321b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 2331b362b15af34006e6a11974088a46d42b903418eJohann 2341b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [type] [c] [pt] [DCT_EOB_TOKEN]; 2351b362b15af34006e6a11974088a46d42b903418eJohann t++; 2361b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 2371b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = 0; 2381b362b15af34006e6a11974088a46d42b903418eJohann continue; 2391b362b15af34006e6a11974088a46d42b903418eJohann } 2401b362b15af34006e6a11974088a46d42b903418eJohann 2411b362b15af34006e6a11974088a46d42b903418eJohann v = qcoeff_ptr[c]; 2421b362b15af34006e6a11974088a46d42b903418eJohann 2431b362b15af34006e6a11974088a46d42b903418eJohann t->Extra = vp8_dct_value_tokens_ptr[v].Extra; 2441b362b15af34006e6a11974088a46d42b903418eJohann token = vp8_dct_value_tokens_ptr[v].Token; 2451b362b15af34006e6a11974088a46d42b903418eJohann t->Token = token; 2461b362b15af34006e6a11974088a46d42b903418eJohann 2471b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [type] [c] [pt]; 2481b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 2491b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [type] [c] [pt] [token]; 2501b362b15af34006e6a11974088a46d42b903418eJohann pt = vp8_prev_token_class[token]; 2511b362b15af34006e6a11974088a46d42b903418eJohann t++; 2521b362b15af34006e6a11974088a46d42b903418eJohann c++; 2531b362b15af34006e6a11974088a46d42b903418eJohann 254a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian assert(eob <= 16); 255a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian for (; c < eob; c++) 2561b362b15af34006e6a11974088a46d42b903418eJohann { 2571b362b15af34006e6a11974088a46d42b903418eJohann rc = vp8_default_zig_zag1d[c]; 2581b362b15af34006e6a11974088a46d42b903418eJohann band = vp8_coef_bands[c]; 2591b362b15af34006e6a11974088a46d42b903418eJohann v = qcoeff_ptr[rc]; 2601b362b15af34006e6a11974088a46d42b903418eJohann 2611b362b15af34006e6a11974088a46d42b903418eJohann t->Extra = vp8_dct_value_tokens_ptr[v].Extra; 2621b362b15af34006e6a11974088a46d42b903418eJohann token = vp8_dct_value_tokens_ptr[v].Token; 2631b362b15af34006e6a11974088a46d42b903418eJohann 2641b362b15af34006e6a11974088a46d42b903418eJohann t->Token = token; 2651b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; 2661b362b15af34006e6a11974088a46d42b903418eJohann 2671b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = (pt == 0); 2681b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [type] [band] [pt] [token]; 2691b362b15af34006e6a11974088a46d42b903418eJohann 2701b362b15af34006e6a11974088a46d42b903418eJohann pt = vp8_prev_token_class[token]; 2711b362b15af34006e6a11974088a46d42b903418eJohann t++; 2721b362b15af34006e6a11974088a46d42b903418eJohann } 2731b362b15af34006e6a11974088a46d42b903418eJohann if (c < 16) 2741b362b15af34006e6a11974088a46d42b903418eJohann { 2751b362b15af34006e6a11974088a46d42b903418eJohann band = vp8_coef_bands[c]; 2761b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 2771b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; 2781b362b15af34006e6a11974088a46d42b903418eJohann 2791b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 2801b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; 2811b362b15af34006e6a11974088a46d42b903418eJohann 2821b362b15af34006e6a11974088a46d42b903418eJohann t++; 2831b362b15af34006e6a11974088a46d42b903418eJohann } 2841b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 2851b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = 1; 2861b362b15af34006e6a11974088a46d42b903418eJohann } 2871b362b15af34006e6a11974088a46d42b903418eJohann 2881b362b15af34006e6a11974088a46d42b903418eJohann /* Chroma */ 2891b362b15af34006e6a11974088a46d42b903418eJohann for (block = 16; block < 24; block++, b++) 2901b362b15af34006e6a11974088a46d42b903418eJohann { 291a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian const int eob = *b->eob; 2921b362b15af34006e6a11974088a46d42b903418eJohann tmp1 = vp8_block2above[block]; 2931b362b15af34006e6a11974088a46d42b903418eJohann tmp2 = vp8_block2left[block]; 2941b362b15af34006e6a11974088a46d42b903418eJohann qcoeff_ptr = b->qcoeff; 2951b362b15af34006e6a11974088a46d42b903418eJohann a = (ENTROPY_CONTEXT *)xd->above_context + tmp1; 2961b362b15af34006e6a11974088a46d42b903418eJohann l = (ENTROPY_CONTEXT *)xd->left_context + tmp2; 2971b362b15af34006e6a11974088a46d42b903418eJohann 2981b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 2991b362b15af34006e6a11974088a46d42b903418eJohann 300a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian if(!eob) 3011b362b15af34006e6a11974088a46d42b903418eJohann { 3021b362b15af34006e6a11974088a46d42b903418eJohann /* c = band for this case */ 3031b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 3041b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; 3051b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 3061b362b15af34006e6a11974088a46d42b903418eJohann 3071b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [2] [0] [pt] [DCT_EOB_TOKEN]; 3081b362b15af34006e6a11974088a46d42b903418eJohann t++; 3091b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 3101b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = 0; 3111b362b15af34006e6a11974088a46d42b903418eJohann continue; 3121b362b15af34006e6a11974088a46d42b903418eJohann } 3131b362b15af34006e6a11974088a46d42b903418eJohann 3141b362b15af34006e6a11974088a46d42b903418eJohann v = qcoeff_ptr[0]; 3151b362b15af34006e6a11974088a46d42b903418eJohann 3161b362b15af34006e6a11974088a46d42b903418eJohann t->Extra = vp8_dct_value_tokens_ptr[v].Extra; 3171b362b15af34006e6a11974088a46d42b903418eJohann token = vp8_dct_value_tokens_ptr[v].Token; 3181b362b15af34006e6a11974088a46d42b903418eJohann t->Token = token; 3191b362b15af34006e6a11974088a46d42b903418eJohann 3201b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; 3211b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 3221b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [2] [0] [pt] [token]; 3231b362b15af34006e6a11974088a46d42b903418eJohann pt = vp8_prev_token_class[token]; 3241b362b15af34006e6a11974088a46d42b903418eJohann t++; 3251b362b15af34006e6a11974088a46d42b903418eJohann c = 1; 3261b362b15af34006e6a11974088a46d42b903418eJohann 327a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian assert(eob <= 16); 328a72801d7d92ababb50eecf27a36bd222d031d2feVignesh Venkatasubramanian for (; c < eob; c++) 3291b362b15af34006e6a11974088a46d42b903418eJohann { 3301b362b15af34006e6a11974088a46d42b903418eJohann rc = vp8_default_zig_zag1d[c]; 3311b362b15af34006e6a11974088a46d42b903418eJohann band = vp8_coef_bands[c]; 3321b362b15af34006e6a11974088a46d42b903418eJohann v = qcoeff_ptr[rc]; 3331b362b15af34006e6a11974088a46d42b903418eJohann 3341b362b15af34006e6a11974088a46d42b903418eJohann t->Extra = vp8_dct_value_tokens_ptr[v].Extra; 3351b362b15af34006e6a11974088a46d42b903418eJohann token = vp8_dct_value_tokens_ptr[v].Token; 3361b362b15af34006e6a11974088a46d42b903418eJohann 3371b362b15af34006e6a11974088a46d42b903418eJohann t->Token = token; 3381b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; 3391b362b15af34006e6a11974088a46d42b903418eJohann 3401b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = (pt == 0); 3411b362b15af34006e6a11974088a46d42b903418eJohann 3421b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [2] [band] [pt] [token]; 3431b362b15af34006e6a11974088a46d42b903418eJohann 3441b362b15af34006e6a11974088a46d42b903418eJohann pt = vp8_prev_token_class[token]; 3451b362b15af34006e6a11974088a46d42b903418eJohann t++; 3461b362b15af34006e6a11974088a46d42b903418eJohann } 3471b362b15af34006e6a11974088a46d42b903418eJohann if (c < 16) 3481b362b15af34006e6a11974088a46d42b903418eJohann { 3491b362b15af34006e6a11974088a46d42b903418eJohann band = vp8_coef_bands[c]; 3501b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 3511b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [2] [band] [pt]; 3521b362b15af34006e6a11974088a46d42b903418eJohann 3531b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 3541b362b15af34006e6a11974088a46d42b903418eJohann 3551b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [2] [band] [pt] [DCT_EOB_TOKEN]; 3561b362b15af34006e6a11974088a46d42b903418eJohann 3571b362b15af34006e6a11974088a46d42b903418eJohann t++; 3581b362b15af34006e6a11974088a46d42b903418eJohann } 3591b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 3601b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = 1; 3611b362b15af34006e6a11974088a46d42b903418eJohann } 3621b362b15af34006e6a11974088a46d42b903418eJohann} 3631b362b15af34006e6a11974088a46d42b903418eJohann 3641b362b15af34006e6a11974088a46d42b903418eJohann 3651b362b15af34006e6a11974088a46d42b903418eJohannstatic int mb_is_skippable(MACROBLOCKD *x, int has_y2_block) 3661b362b15af34006e6a11974088a46d42b903418eJohann{ 3671b362b15af34006e6a11974088a46d42b903418eJohann int skip = 1; 3681b362b15af34006e6a11974088a46d42b903418eJohann int i = 0; 3691b362b15af34006e6a11974088a46d42b903418eJohann 3701b362b15af34006e6a11974088a46d42b903418eJohann if (has_y2_block) 3711b362b15af34006e6a11974088a46d42b903418eJohann { 3721b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 3731b362b15af34006e6a11974088a46d42b903418eJohann skip &= (x->eobs[i] < 2); 3741b362b15af34006e6a11974088a46d42b903418eJohann } 3751b362b15af34006e6a11974088a46d42b903418eJohann 3761b362b15af34006e6a11974088a46d42b903418eJohann for (; i < 24 + has_y2_block; i++) 3771b362b15af34006e6a11974088a46d42b903418eJohann skip &= (!x->eobs[i]); 3781b362b15af34006e6a11974088a46d42b903418eJohann 3791b362b15af34006e6a11974088a46d42b903418eJohann return skip; 3801b362b15af34006e6a11974088a46d42b903418eJohann} 3811b362b15af34006e6a11974088a46d42b903418eJohann 3821b362b15af34006e6a11974088a46d42b903418eJohann 3831b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) 3841b362b15af34006e6a11974088a46d42b903418eJohann{ 3851b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 3861b362b15af34006e6a11974088a46d42b903418eJohann int plane_type; 3871b362b15af34006e6a11974088a46d42b903418eJohann int has_y2_block; 3881b362b15af34006e6a11974088a46d42b903418eJohann 3891b362b15af34006e6a11974088a46d42b903418eJohann has_y2_block = (xd->mode_info_context->mbmi.mode != B_PRED 3901b362b15af34006e6a11974088a46d42b903418eJohann && xd->mode_info_context->mbmi.mode != SPLITMV); 3911b362b15af34006e6a11974088a46d42b903418eJohann 3921b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mb_skip_coeff = 3931b362b15af34006e6a11974088a46d42b903418eJohann mb_is_skippable(xd, has_y2_block); 3941b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_info_context->mbmi.mb_skip_coeff) 3951b362b15af34006e6a11974088a46d42b903418eJohann { 3961b362b15af34006e6a11974088a46d42b903418eJohann if (!cpi->common.mb_no_coeff_skip) 3971b362b15af34006e6a11974088a46d42b903418eJohann { 3981b362b15af34006e6a11974088a46d42b903418eJohann vp8_stuff_mb(cpi, x, t); 3991b362b15af34006e6a11974088a46d42b903418eJohann } 4001b362b15af34006e6a11974088a46d42b903418eJohann else 4011b362b15af34006e6a11974088a46d42b903418eJohann { 4021b362b15af34006e6a11974088a46d42b903418eJohann vp8_fix_contexts(xd); 4031b362b15af34006e6a11974088a46d42b903418eJohann x->skip_true_count++; 4041b362b15af34006e6a11974088a46d42b903418eJohann } 4051b362b15af34006e6a11974088a46d42b903418eJohann 4061b362b15af34006e6a11974088a46d42b903418eJohann return; 4071b362b15af34006e6a11974088a46d42b903418eJohann } 4081b362b15af34006e6a11974088a46d42b903418eJohann 4091b362b15af34006e6a11974088a46d42b903418eJohann plane_type = 3; 4101b362b15af34006e6a11974088a46d42b903418eJohann if(has_y2_block) 4111b362b15af34006e6a11974088a46d42b903418eJohann { 4121b362b15af34006e6a11974088a46d42b903418eJohann tokenize2nd_order_b(x, t, cpi); 4131b362b15af34006e6a11974088a46d42b903418eJohann plane_type = 0; 4141b362b15af34006e6a11974088a46d42b903418eJohann } 4151b362b15af34006e6a11974088a46d42b903418eJohann 4161b362b15af34006e6a11974088a46d42b903418eJohann tokenize1st_order_b(x, t, plane_type, cpi); 4171b362b15af34006e6a11974088a46d42b903418eJohann} 4181b362b15af34006e6a11974088a46d42b903418eJohann 4191b362b15af34006e6a11974088a46d42b903418eJohann 420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifdef VP8_ENTROPY_STATS 4211b362b15af34006e6a11974088a46d42b903418eJohann 4221b362b15af34006e6a11974088a46d42b903418eJohannvoid init_context_counters(void) 4231b362b15af34006e6a11974088a46d42b903418eJohann{ 4241b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(context_counters, 0, sizeof(context_counters)); 4251b362b15af34006e6a11974088a46d42b903418eJohann} 4261b362b15af34006e6a11974088a46d42b903418eJohann 4271b362b15af34006e6a11974088a46d42b903418eJohannvoid print_context_counters() 4281b362b15af34006e6a11974088a46d42b903418eJohann{ 4291b362b15af34006e6a11974088a46d42b903418eJohann 4301b362b15af34006e6a11974088a46d42b903418eJohann int type, band, pt, t; 4311b362b15af34006e6a11974088a46d42b903418eJohann 4321b362b15af34006e6a11974088a46d42b903418eJohann FILE *const f = fopen("context.c", "w"); 4331b362b15af34006e6a11974088a46d42b903418eJohann 4341b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "#include \"entropy.h\"\n"); 4351b362b15af34006e6a11974088a46d42b903418eJohann 4361b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "\n/* *** GENERATED FILE: DO NOT EDIT *** */\n\n"); 4371b362b15af34006e6a11974088a46d42b903418eJohann 4381b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "int Contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];\n\n"); 4391b362b15af34006e6a11974088a46d42b903418eJohann 4401b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "const int default_contexts[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS] = {"); 4411b362b15af34006e6a11974088a46d42b903418eJohann 4421b362b15af34006e6a11974088a46d42b903418eJohann# define Comma( X) (X? ",":"") 4431b362b15af34006e6a11974088a46d42b903418eJohann 4441b362b15af34006e6a11974088a46d42b903418eJohann type = 0; 4451b362b15af34006e6a11974088a46d42b903418eJohann 4461b362b15af34006e6a11974088a46d42b903418eJohann do 4471b362b15af34006e6a11974088a46d42b903418eJohann { 4481b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "%s\n { /* block Type %d */", Comma(type), type); 4491b362b15af34006e6a11974088a46d42b903418eJohann 4501b362b15af34006e6a11974088a46d42b903418eJohann band = 0; 4511b362b15af34006e6a11974088a46d42b903418eJohann 4521b362b15af34006e6a11974088a46d42b903418eJohann do 4531b362b15af34006e6a11974088a46d42b903418eJohann { 4541b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "%s\n { /* Coeff Band %d */", Comma(band), band); 4551b362b15af34006e6a11974088a46d42b903418eJohann 4561b362b15af34006e6a11974088a46d42b903418eJohann pt = 0; 4571b362b15af34006e6a11974088a46d42b903418eJohann 4581b362b15af34006e6a11974088a46d42b903418eJohann do 4591b362b15af34006e6a11974088a46d42b903418eJohann { 4601b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "%s\n {", Comma(pt)); 4611b362b15af34006e6a11974088a46d42b903418eJohann 4621b362b15af34006e6a11974088a46d42b903418eJohann t = 0; 4631b362b15af34006e6a11974088a46d42b903418eJohann 4641b362b15af34006e6a11974088a46d42b903418eJohann do 4651b362b15af34006e6a11974088a46d42b903418eJohann { 4661b362b15af34006e6a11974088a46d42b903418eJohann const _int64 x = context_counters [type] [band] [pt] [t]; 4671b362b15af34006e6a11974088a46d42b903418eJohann const int y = (int) x; 4681b362b15af34006e6a11974088a46d42b903418eJohann 4691b362b15af34006e6a11974088a46d42b903418eJohann assert(x == (_int64) y); /* no overflow handling yet */ 4701b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "%s %d", Comma(t), y); 4711b362b15af34006e6a11974088a46d42b903418eJohann 4721b362b15af34006e6a11974088a46d42b903418eJohann } 4731b362b15af34006e6a11974088a46d42b903418eJohann while (++t < MAX_ENTROPY_TOKENS); 4741b362b15af34006e6a11974088a46d42b903418eJohann 4751b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "}"); 4761b362b15af34006e6a11974088a46d42b903418eJohann } 4771b362b15af34006e6a11974088a46d42b903418eJohann while (++pt < PREV_COEF_CONTEXTS); 4781b362b15af34006e6a11974088a46d42b903418eJohann 4791b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "\n }"); 4801b362b15af34006e6a11974088a46d42b903418eJohann 4811b362b15af34006e6a11974088a46d42b903418eJohann } 4821b362b15af34006e6a11974088a46d42b903418eJohann while (++band < COEF_BANDS); 4831b362b15af34006e6a11974088a46d42b903418eJohann 4841b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "\n }"); 4851b362b15af34006e6a11974088a46d42b903418eJohann } 4861b362b15af34006e6a11974088a46d42b903418eJohann while (++type < BLOCK_TYPES); 4871b362b15af34006e6a11974088a46d42b903418eJohann 4881b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, "\n};\n"); 4891b362b15af34006e6a11974088a46d42b903418eJohann fclose(f); 4901b362b15af34006e6a11974088a46d42b903418eJohann} 4911b362b15af34006e6a11974088a46d42b903418eJohann#endif 4921b362b15af34006e6a11974088a46d42b903418eJohann 4931b362b15af34006e6a11974088a46d42b903418eJohann 4941b362b15af34006e6a11974088a46d42b903418eJohannstatic void stuff2nd_order_b 4951b362b15af34006e6a11974088a46d42b903418eJohann( 4961b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA **tp, 4971b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *a, 4981b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *l, 4991b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi, 5001b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x 5011b362b15af34006e6a11974088a46d42b903418eJohann) 5021b362b15af34006e6a11974088a46d42b903418eJohann{ 5031b362b15af34006e6a11974088a46d42b903418eJohann int pt; /* near block/prev token context index */ 5041b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA *t = *tp; /* store tokens starting here */ 5051b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 5061b362b15af34006e6a11974088a46d42b903418eJohann 5071b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 5081b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [1] [0] [pt]; 5091b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 5101b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [1] [0] [pt] [DCT_EOB_TOKEN]; 5111b362b15af34006e6a11974088a46d42b903418eJohann ++t; 5121b362b15af34006e6a11974088a46d42b903418eJohann 5131b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 5141b362b15af34006e6a11974088a46d42b903418eJohann pt = 0; 5151b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = pt; 5161b362b15af34006e6a11974088a46d42b903418eJohann} 5171b362b15af34006e6a11974088a46d42b903418eJohann 5181b362b15af34006e6a11974088a46d42b903418eJohannstatic void stuff1st_order_b 5191b362b15af34006e6a11974088a46d42b903418eJohann( 5201b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA **tp, 5211b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *a, 5221b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *l, 5231b362b15af34006e6a11974088a46d42b903418eJohann int type, 5241b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi, 5251b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x 5261b362b15af34006e6a11974088a46d42b903418eJohann) 5271b362b15af34006e6a11974088a46d42b903418eJohann{ 5281b362b15af34006e6a11974088a46d42b903418eJohann int pt; /* near block/prev token context index */ 5291b362b15af34006e6a11974088a46d42b903418eJohann int band; 5301b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA *t = *tp; /* store tokens starting here */ 5311b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 5321b362b15af34006e6a11974088a46d42b903418eJohann band = type ? 0 : 1; 5331b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 5341b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [type] [band] [pt]; 5351b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 5361b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts [type] [band] [pt] [DCT_EOB_TOKEN]; 5371b362b15af34006e6a11974088a46d42b903418eJohann ++t; 5381b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 5391b362b15af34006e6a11974088a46d42b903418eJohann pt = 0; /* 0 <-> all coeff data is zero */ 5401b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = pt; 5411b362b15af34006e6a11974088a46d42b903418eJohann} 5421b362b15af34006e6a11974088a46d42b903418eJohann 5431b362b15af34006e6a11974088a46d42b903418eJohannstatic 5441b362b15af34006e6a11974088a46d42b903418eJohannvoid stuff1st_order_buv 5451b362b15af34006e6a11974088a46d42b903418eJohann( 5461b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA **tp, 5471b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *a, 5481b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *l, 5491b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi, 5501b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x 5511b362b15af34006e6a11974088a46d42b903418eJohann) 5521b362b15af34006e6a11974088a46d42b903418eJohann{ 5531b362b15af34006e6a11974088a46d42b903418eJohann int pt; /* near block/prev token context index */ 5541b362b15af34006e6a11974088a46d42b903418eJohann TOKENEXTRA *t = *tp; /* store tokens starting here */ 5551b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 5561b362b15af34006e6a11974088a46d42b903418eJohann 5571b362b15af34006e6a11974088a46d42b903418eJohann t->Token = DCT_EOB_TOKEN; 5581b362b15af34006e6a11974088a46d42b903418eJohann t->context_tree = cpi->common.fc.coef_probs [2] [0] [pt]; 5591b362b15af34006e6a11974088a46d42b903418eJohann t->skip_eob_node = 0; 5601b362b15af34006e6a11974088a46d42b903418eJohann ++x->coef_counts[2] [0] [pt] [DCT_EOB_TOKEN]; 5611b362b15af34006e6a11974088a46d42b903418eJohann ++t; 5621b362b15af34006e6a11974088a46d42b903418eJohann *tp = t; 5631b362b15af34006e6a11974088a46d42b903418eJohann pt = 0; /* 0 <-> all coeff data is zero */ 5641b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = pt; 5651b362b15af34006e6a11974088a46d42b903418eJohann} 5661b362b15af34006e6a11974088a46d42b903418eJohann 5671b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) 5681b362b15af34006e6a11974088a46d42b903418eJohann{ 5691b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 5701b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)xd->above_context; 5711b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)xd->left_context; 5721b362b15af34006e6a11974088a46d42b903418eJohann int plane_type; 5731b362b15af34006e6a11974088a46d42b903418eJohann int b; 5741b362b15af34006e6a11974088a46d42b903418eJohann plane_type = 3; 5751b362b15af34006e6a11974088a46d42b903418eJohann if((xd->mode_info_context->mbmi.mode != B_PRED 5761b362b15af34006e6a11974088a46d42b903418eJohann && xd->mode_info_context->mbmi.mode != SPLITMV)) 5771b362b15af34006e6a11974088a46d42b903418eJohann { 5781b362b15af34006e6a11974088a46d42b903418eJohann stuff2nd_order_b(t, 5791b362b15af34006e6a11974088a46d42b903418eJohann A + vp8_block2above[24], L + vp8_block2left[24], cpi, x); 5801b362b15af34006e6a11974088a46d42b903418eJohann plane_type = 0; 5811b362b15af34006e6a11974088a46d42b903418eJohann } 5821b362b15af34006e6a11974088a46d42b903418eJohann 5831b362b15af34006e6a11974088a46d42b903418eJohann for (b = 0; b < 16; b++) 5841b362b15af34006e6a11974088a46d42b903418eJohann stuff1st_order_b(t, 5851b362b15af34006e6a11974088a46d42b903418eJohann A + vp8_block2above[b], 5861b362b15af34006e6a11974088a46d42b903418eJohann L + vp8_block2left[b], plane_type, cpi, x); 5871b362b15af34006e6a11974088a46d42b903418eJohann 5881b362b15af34006e6a11974088a46d42b903418eJohann for (b = 16; b < 24; b++) 5891b362b15af34006e6a11974088a46d42b903418eJohann stuff1st_order_buv(t, 5901b362b15af34006e6a11974088a46d42b903418eJohann A + vp8_block2above[b], 5911b362b15af34006e6a11974088a46d42b903418eJohann L + vp8_block2left[b], cpi, x); 5921b362b15af34006e6a11974088a46d42b903418eJohann 5931b362b15af34006e6a11974088a46d42b903418eJohann} 5941b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_fix_contexts(MACROBLOCKD *x) 5951b362b15af34006e6a11974088a46d42b903418eJohann{ 5961b362b15af34006e6a11974088a46d42b903418eJohann /* Clear entropy contexts for Y2 blocks */ 5971b362b15af34006e6a11974088a46d42b903418eJohann if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV) 5981b362b15af34006e6a11974088a46d42b903418eJohann { 5991b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); 6001b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); 6011b362b15af34006e6a11974088a46d42b903418eJohann } 6021b362b15af34006e6a11974088a46d42b903418eJohann else 6031b362b15af34006e6a11974088a46d42b903418eJohann { 6041b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); 6051b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1); 6061b362b15af34006e6a11974088a46d42b903418eJohann } 6071b362b15af34006e6a11974088a46d42b903418eJohann 6081b362b15af34006e6a11974088a46d42b903418eJohann} 609