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