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 "vpx_config.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp8_rtcd.h" 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_scale_rtcd.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "onyxd_int.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/header.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconintra4x4.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconinter.h" 191b362b15af34006e6a11974088a46d42b903418eJohann#include "detokenize.h" 20ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp8/common/common.h" 211b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/invtrans.h" 221b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/alloccommon.h" 231b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/entropymode.h" 241b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/quant_common.h" 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_scale/vpx_scale.h" 262263fc984bdc858ee931d3e35c87c404de923950Johann#include "vp8/common/reconintra.h" 271b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/setupintrarecon.h" 281b362b15af34006e6a11974088a46d42b903418eJohann 291b362b15af34006e6a11974088a46d42b903418eJohann#include "decodemv.h" 301b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/extend.h" 311b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 321b362b15af34006e6a11974088a46d42b903418eJohann#include "error_concealment.h" 331b362b15af34006e6a11974088a46d42b903418eJohann#endif 341b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 351b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/threading.h" 361b362b15af34006e6a11974088a46d42b903418eJohann#include "decoderthreading.h" 371b362b15af34006e6a11974088a46d42b903418eJohann#include "dboolhuff.h" 382263fc984bdc858ee931d3e35c87c404de923950Johann#include "vpx_dsp/vpx_dsp_common.h" 391b362b15af34006e6a11974088a46d42b903418eJohann 401b362b15af34006e6a11974088a46d42b903418eJohann#include <assert.h> 411b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 421b362b15af34006e6a11974088a46d42b903418eJohann 431b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8cx_init_de_quantizer(VP8D_COMP *pbi) 441b362b15af34006e6a11974088a46d42b903418eJohann{ 451b362b15af34006e6a11974088a46d42b903418eJohann int Q; 461b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *const pc = & pbi->common; 471b362b15af34006e6a11974088a46d42b903418eJohann 481b362b15af34006e6a11974088a46d42b903418eJohann for (Q = 0; Q < QINDEX_RANGE; Q++) 491b362b15af34006e6a11974088a46d42b903418eJohann { 501b362b15af34006e6a11974088a46d42b903418eJohann pc->Y1dequant[Q][0] = (short)vp8_dc_quant(Q, pc->y1dc_delta_q); 511b362b15af34006e6a11974088a46d42b903418eJohann pc->Y2dequant[Q][0] = (short)vp8_dc2quant(Q, pc->y2dc_delta_q); 521b362b15af34006e6a11974088a46d42b903418eJohann pc->UVdequant[Q][0] = (short)vp8_dc_uv_quant(Q, pc->uvdc_delta_q); 531b362b15af34006e6a11974088a46d42b903418eJohann 541b362b15af34006e6a11974088a46d42b903418eJohann pc->Y1dequant[Q][1] = (short)vp8_ac_yquant(Q); 551b362b15af34006e6a11974088a46d42b903418eJohann pc->Y2dequant[Q][1] = (short)vp8_ac2quant(Q, pc->y2ac_delta_q); 561b362b15af34006e6a11974088a46d42b903418eJohann pc->UVdequant[Q][1] = (short)vp8_ac_uv_quant(Q, pc->uvac_delta_q); 571b362b15af34006e6a11974088a46d42b903418eJohann } 581b362b15af34006e6a11974088a46d42b903418eJohann} 591b362b15af34006e6a11974088a46d42b903418eJohann 601b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd) 611b362b15af34006e6a11974088a46d42b903418eJohann{ 621b362b15af34006e6a11974088a46d42b903418eJohann int i; 631b362b15af34006e6a11974088a46d42b903418eJohann int QIndex; 641b362b15af34006e6a11974088a46d42b903418eJohann MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; 651b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *const pc = & pbi->common; 661b362b15af34006e6a11974088a46d42b903418eJohann 671b362b15af34006e6a11974088a46d42b903418eJohann /* Decide whether to use the default or alternate baseline Q value. */ 681b362b15af34006e6a11974088a46d42b903418eJohann if (xd->segmentation_enabled) 691b362b15af34006e6a11974088a46d42b903418eJohann { 701b362b15af34006e6a11974088a46d42b903418eJohann /* Abs Value */ 711b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA) 721b362b15af34006e6a11974088a46d42b903418eJohann QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id]; 731b362b15af34006e6a11974088a46d42b903418eJohann 741b362b15af34006e6a11974088a46d42b903418eJohann /* Delta Value */ 751b362b15af34006e6a11974088a46d42b903418eJohann else 761b362b15af34006e6a11974088a46d42b903418eJohann QIndex = pc->base_qindex + xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id]; 778f0c757aabc87185f6d39d514906dd020607296bJohann 788f0c757aabc87185f6d39d514906dd020607296bJohann QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0; /* Clamp to valid range */ 791b362b15af34006e6a11974088a46d42b903418eJohann } 801b362b15af34006e6a11974088a46d42b903418eJohann else 811b362b15af34006e6a11974088a46d42b903418eJohann QIndex = pc->base_qindex; 821b362b15af34006e6a11974088a46d42b903418eJohann 831b362b15af34006e6a11974088a46d42b903418eJohann /* Set up the macroblock dequant constants */ 841b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_y1_dc[0] = 1; 851b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_y1[0] = pc->Y1dequant[QIndex][0]; 861b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_y2[0] = pc->Y2dequant[QIndex][0]; 871b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_uv[0] = pc->UVdequant[QIndex][0]; 881b362b15af34006e6a11974088a46d42b903418eJohann 891b362b15af34006e6a11974088a46d42b903418eJohann for (i = 1; i < 16; i++) 901b362b15af34006e6a11974088a46d42b903418eJohann { 911b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_y1_dc[i] = 921b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_y1[i] = pc->Y1dequant[QIndex][1]; 931b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_y2[i] = pc->Y2dequant[QIndex][1]; 941b362b15af34006e6a11974088a46d42b903418eJohann xd->dequant_uv[i] = pc->UVdequant[QIndex][1]; 951b362b15af34006e6a11974088a46d42b903418eJohann } 961b362b15af34006e6a11974088a46d42b903418eJohann} 971b362b15af34006e6a11974088a46d42b903418eJohann 981b362b15af34006e6a11974088a46d42b903418eJohannstatic void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, 991b362b15af34006e6a11974088a46d42b903418eJohann unsigned int mb_idx) 1001b362b15af34006e6a11974088a46d42b903418eJohann{ 1011b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE mode; 1021b362b15af34006e6a11974088a46d42b903418eJohann int i; 1031b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 1041b362b15af34006e6a11974088a46d42b903418eJohann int corruption_detected = 0; 105da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#else 106da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian (void)mb_idx; 1071b362b15af34006e6a11974088a46d42b903418eJohann#endif 1081b362b15af34006e6a11974088a46d42b903418eJohann 1091b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_info_context->mbmi.mb_skip_coeff) 1101b362b15af34006e6a11974088a46d42b903418eJohann { 1111b362b15af34006e6a11974088a46d42b903418eJohann vp8_reset_mb_tokens_context(xd); 1121b362b15af34006e6a11974088a46d42b903418eJohann } 1131b362b15af34006e6a11974088a46d42b903418eJohann else if (!vp8dx_bool_error(xd->current_bc)) 1141b362b15af34006e6a11974088a46d42b903418eJohann { 1151b362b15af34006e6a11974088a46d42b903418eJohann int eobtotal; 1161b362b15af34006e6a11974088a46d42b903418eJohann eobtotal = vp8_decode_mb_tokens(pbi, xd); 1171b362b15af34006e6a11974088a46d42b903418eJohann 1181b362b15af34006e6a11974088a46d42b903418eJohann /* Special case: Force the loopfilter to skip when eobtotal is zero */ 1191b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mb_skip_coeff = (eobtotal==0); 1201b362b15af34006e6a11974088a46d42b903418eJohann } 1211b362b15af34006e6a11974088a46d42b903418eJohann 1221b362b15af34006e6a11974088a46d42b903418eJohann mode = xd->mode_info_context->mbmi.mode; 1231b362b15af34006e6a11974088a46d42b903418eJohann 1241b362b15af34006e6a11974088a46d42b903418eJohann if (xd->segmentation_enabled) 1251b362b15af34006e6a11974088a46d42b903418eJohann vp8_mb_init_dequantizer(pbi, xd); 1261b362b15af34006e6a11974088a46d42b903418eJohann 1271b362b15af34006e6a11974088a46d42b903418eJohann 1281b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 1291b362b15af34006e6a11974088a46d42b903418eJohann 1301b362b15af34006e6a11974088a46d42b903418eJohann if(pbi->ec_active) 1311b362b15af34006e6a11974088a46d42b903418eJohann { 1321b362b15af34006e6a11974088a46d42b903418eJohann int throw_residual; 1331b362b15af34006e6a11974088a46d42b903418eJohann /* When we have independent partitions we can apply residual even 1341b362b15af34006e6a11974088a46d42b903418eJohann * though other partitions within the frame are corrupt. 1351b362b15af34006e6a11974088a46d42b903418eJohann */ 1361b362b15af34006e6a11974088a46d42b903418eJohann throw_residual = (!pbi->independent_partitions && 1371b362b15af34006e6a11974088a46d42b903418eJohann pbi->frame_corrupt_residual); 1381b362b15af34006e6a11974088a46d42b903418eJohann throw_residual = (throw_residual || vp8dx_bool_error(xd->current_bc)); 1391b362b15af34006e6a11974088a46d42b903418eJohann 1401b362b15af34006e6a11974088a46d42b903418eJohann if ((mb_idx >= pbi->mvs_corrupt_from_mb || throw_residual)) 1411b362b15af34006e6a11974088a46d42b903418eJohann { 1421b362b15af34006e6a11974088a46d42b903418eJohann /* MB with corrupt residuals or corrupt mode/motion vectors. 1431b362b15af34006e6a11974088a46d42b903418eJohann * Better to use the predictor as reconstruction. 1441b362b15af34006e6a11974088a46d42b903418eJohann */ 1451b362b15af34006e6a11974088a46d42b903418eJohann pbi->frame_corrupt_residual = 1; 146da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); 1471b362b15af34006e6a11974088a46d42b903418eJohann vp8_conceal_corrupt_mb(xd); 1481b362b15af34006e6a11974088a46d42b903418eJohann 1491b362b15af34006e6a11974088a46d42b903418eJohann 1501b362b15af34006e6a11974088a46d42b903418eJohann corruption_detected = 1; 1511b362b15af34006e6a11974088a46d42b903418eJohann 1521b362b15af34006e6a11974088a46d42b903418eJohann /* force idct to be skipped for B_PRED and use the 1531b362b15af34006e6a11974088a46d42b903418eJohann * prediction only for reconstruction 1541b362b15af34006e6a11974088a46d42b903418eJohann * */ 155da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->eobs, 0, 25); 1561b362b15af34006e6a11974088a46d42b903418eJohann } 1571b362b15af34006e6a11974088a46d42b903418eJohann } 1581b362b15af34006e6a11974088a46d42b903418eJohann#endif 1591b362b15af34006e6a11974088a46d42b903418eJohann 1601b362b15af34006e6a11974088a46d42b903418eJohann /* do prediction */ 1611b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) 1621b362b15af34006e6a11974088a46d42b903418eJohann { 1631b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mbuv_s(xd, 1641b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[1], 1651b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[2], 1661b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[1], 1671b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[2], 1681b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left_stride[1], 1691b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer, xd->dst.v_buffer, 1701b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride); 1711b362b15af34006e6a11974088a46d42b903418eJohann 1721b362b15af34006e6a11974088a46d42b903418eJohann if (mode != B_PRED) 1731b362b15af34006e6a11974088a46d42b903418eJohann { 1741b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mby_s(xd, 1751b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[0], 1761b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[0], 1771b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left_stride[0], 1781b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer, 1791b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride); 1801b362b15af34006e6a11974088a46d42b903418eJohann } 1811b362b15af34006e6a11974088a46d42b903418eJohann else 1821b362b15af34006e6a11974088a46d42b903418eJohann { 1831b362b15af34006e6a11974088a46d42b903418eJohann short *DQC = xd->dequant_y1; 1841b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = xd->dst.y_stride; 1851b362b15af34006e6a11974088a46d42b903418eJohann 1861b362b15af34006e6a11974088a46d42b903418eJohann /* clear out residual eob info */ 1871b362b15af34006e6a11974088a46d42b903418eJohann if(xd->mode_info_context->mbmi.mb_skip_coeff) 188da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->eobs, 0, 25); 1891b362b15af34006e6a11974088a46d42b903418eJohann 1901b362b15af34006e6a11974088a46d42b903418eJohann intra_prediction_down_copy(xd, xd->recon_above[0] + 16); 1911b362b15af34006e6a11974088a46d42b903418eJohann 1921b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 1931b362b15af34006e6a11974088a46d42b903418eJohann { 1941b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b = &xd->block[i]; 1951b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst = xd->dst.y_buffer + b->offset; 1961b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE b_mode = 1971b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->bmi[i].as_mode; 1981b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *Above = dst - dst_stride; 1991b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *yleft = dst - 1; 2001b362b15af34006e6a11974088a46d42b903418eJohann int left_stride = dst_stride; 2011b362b15af34006e6a11974088a46d42b903418eJohann unsigned char top_left = Above[-1]; 2021b362b15af34006e6a11974088a46d42b903418eJohann 2031b362b15af34006e6a11974088a46d42b903418eJohann vp8_intra4x4_predict(Above, yleft, left_stride, b_mode, 2041b362b15af34006e6a11974088a46d42b903418eJohann dst, dst_stride, top_left); 2051b362b15af34006e6a11974088a46d42b903418eJohann 2061b362b15af34006e6a11974088a46d42b903418eJohann if (xd->eobs[i]) 2071b362b15af34006e6a11974088a46d42b903418eJohann { 2081b362b15af34006e6a11974088a46d42b903418eJohann if (xd->eobs[i] > 1) 2091b362b15af34006e6a11974088a46d42b903418eJohann { 2101b362b15af34006e6a11974088a46d42b903418eJohann vp8_dequant_idct_add(b->qcoeff, DQC, dst, dst_stride); 2111b362b15af34006e6a11974088a46d42b903418eJohann } 2121b362b15af34006e6a11974088a46d42b903418eJohann else 2131b362b15af34006e6a11974088a46d42b903418eJohann { 2141b362b15af34006e6a11974088a46d42b903418eJohann vp8_dc_only_idct_add 2151b362b15af34006e6a11974088a46d42b903418eJohann (b->qcoeff[0] * DQC[0], 2161b362b15af34006e6a11974088a46d42b903418eJohann dst, dst_stride, 2171b362b15af34006e6a11974088a46d42b903418eJohann dst, dst_stride); 218da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 2191b362b15af34006e6a11974088a46d42b903418eJohann } 2201b362b15af34006e6a11974088a46d42b903418eJohann } 2211b362b15af34006e6a11974088a46d42b903418eJohann } 2221b362b15af34006e6a11974088a46d42b903418eJohann } 2231b362b15af34006e6a11974088a46d42b903418eJohann } 2241b362b15af34006e6a11974088a46d42b903418eJohann else 2251b362b15af34006e6a11974088a46d42b903418eJohann { 2261b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_mb(xd); 2271b362b15af34006e6a11974088a46d42b903418eJohann } 2281b362b15af34006e6a11974088a46d42b903418eJohann 2291b362b15af34006e6a11974088a46d42b903418eJohann 2301b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 2311b362b15af34006e6a11974088a46d42b903418eJohann if (corruption_detected) 2321b362b15af34006e6a11974088a46d42b903418eJohann { 2331b362b15af34006e6a11974088a46d42b903418eJohann return; 2341b362b15af34006e6a11974088a46d42b903418eJohann } 2351b362b15af34006e6a11974088a46d42b903418eJohann#endif 2361b362b15af34006e6a11974088a46d42b903418eJohann 2371b362b15af34006e6a11974088a46d42b903418eJohann if(!xd->mode_info_context->mbmi.mb_skip_coeff) 2381b362b15af34006e6a11974088a46d42b903418eJohann { 2391b362b15af34006e6a11974088a46d42b903418eJohann /* dequantization and idct */ 2401b362b15af34006e6a11974088a46d42b903418eJohann if (mode != B_PRED) 2411b362b15af34006e6a11974088a46d42b903418eJohann { 2421b362b15af34006e6a11974088a46d42b903418eJohann short *DQC = xd->dequant_y1; 2431b362b15af34006e6a11974088a46d42b903418eJohann 2441b362b15af34006e6a11974088a46d42b903418eJohann if (mode != SPLITMV) 2451b362b15af34006e6a11974088a46d42b903418eJohann { 2461b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b = &xd->block[24]; 2471b362b15af34006e6a11974088a46d42b903418eJohann 2481b362b15af34006e6a11974088a46d42b903418eJohann /* do 2nd order transform on the dc block */ 2491b362b15af34006e6a11974088a46d42b903418eJohann if (xd->eobs[24] > 1) 2501b362b15af34006e6a11974088a46d42b903418eJohann { 2511b362b15af34006e6a11974088a46d42b903418eJohann vp8_dequantize_b(b, xd->dequant_y2); 2521b362b15af34006e6a11974088a46d42b903418eJohann 2531b362b15af34006e6a11974088a46d42b903418eJohann vp8_short_inv_walsh4x4(&b->dqcoeff[0], 2541b362b15af34006e6a11974088a46d42b903418eJohann xd->qcoeff); 255da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(b->qcoeff, 0, 16 * sizeof(b->qcoeff[0])); 2561b362b15af34006e6a11974088a46d42b903418eJohann } 2571b362b15af34006e6a11974088a46d42b903418eJohann else 2581b362b15af34006e6a11974088a46d42b903418eJohann { 2591b362b15af34006e6a11974088a46d42b903418eJohann b->dqcoeff[0] = b->qcoeff[0] * xd->dequant_y2[0]; 2601b362b15af34006e6a11974088a46d42b903418eJohann vp8_short_inv_walsh4x4_1(&b->dqcoeff[0], 2611b362b15af34006e6a11974088a46d42b903418eJohann xd->qcoeff); 262da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 2631b362b15af34006e6a11974088a46d42b903418eJohann } 2641b362b15af34006e6a11974088a46d42b903418eJohann 2651b362b15af34006e6a11974088a46d42b903418eJohann /* override the dc dequant constant in order to preserve the 2661b362b15af34006e6a11974088a46d42b903418eJohann * dc components 2671b362b15af34006e6a11974088a46d42b903418eJohann */ 2681b362b15af34006e6a11974088a46d42b903418eJohann DQC = xd->dequant_y1_dc; 2691b362b15af34006e6a11974088a46d42b903418eJohann } 2701b362b15af34006e6a11974088a46d42b903418eJohann 2711b362b15af34006e6a11974088a46d42b903418eJohann vp8_dequant_idct_add_y_block 2721b362b15af34006e6a11974088a46d42b903418eJohann (xd->qcoeff, DQC, 2731b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer, 2741b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, xd->eobs); 2751b362b15af34006e6a11974088a46d42b903418eJohann } 2761b362b15af34006e6a11974088a46d42b903418eJohann 2771b362b15af34006e6a11974088a46d42b903418eJohann vp8_dequant_idct_add_uv_block 2781b362b15af34006e6a11974088a46d42b903418eJohann (xd->qcoeff+16*16, xd->dequant_uv, 2791b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer, xd->dst.v_buffer, 2801b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride, xd->eobs+16); 2811b362b15af34006e6a11974088a46d42b903418eJohann } 2821b362b15af34006e6a11974088a46d42b903418eJohann} 2831b362b15af34006e6a11974088a46d42b903418eJohann 2841b362b15af34006e6a11974088a46d42b903418eJohannstatic int get_delta_q(vp8_reader *bc, int prev, int *q_update) 2851b362b15af34006e6a11974088a46d42b903418eJohann{ 2861b362b15af34006e6a11974088a46d42b903418eJohann int ret_val = 0; 2871b362b15af34006e6a11974088a46d42b903418eJohann 2881b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) 2891b362b15af34006e6a11974088a46d42b903418eJohann { 2901b362b15af34006e6a11974088a46d42b903418eJohann ret_val = vp8_read_literal(bc, 4); 2911b362b15af34006e6a11974088a46d42b903418eJohann 2921b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) 2931b362b15af34006e6a11974088a46d42b903418eJohann ret_val = -ret_val; 2941b362b15af34006e6a11974088a46d42b903418eJohann } 2951b362b15af34006e6a11974088a46d42b903418eJohann 2961b362b15af34006e6a11974088a46d42b903418eJohann /* Trigger a quantizer update if the delta-q value has changed */ 2971b362b15af34006e6a11974088a46d42b903418eJohann if (ret_val != prev) 2981b362b15af34006e6a11974088a46d42b903418eJohann *q_update = 1; 2991b362b15af34006e6a11974088a46d42b903418eJohann 3001b362b15af34006e6a11974088a46d42b903418eJohann return ret_val; 3011b362b15af34006e6a11974088a46d42b903418eJohann} 3021b362b15af34006e6a11974088a46d42b903418eJohann 3031b362b15af34006e6a11974088a46d42b903418eJohann#ifdef PACKET_TESTING 3041b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 3051b362b15af34006e6a11974088a46d42b903418eJohannFILE *vpxlog = 0; 3061b362b15af34006e6a11974088a46d42b903418eJohann#endif 3071b362b15af34006e6a11974088a46d42b903418eJohann 3081b362b15af34006e6a11974088a46d42b903418eJohannstatic void yv12_extend_frame_top_c(YV12_BUFFER_CONFIG *ybf) 3091b362b15af34006e6a11974088a46d42b903418eJohann{ 3101b362b15af34006e6a11974088a46d42b903418eJohann int i; 3111b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *src_ptr1; 3121b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dest_ptr1; 3131b362b15af34006e6a11974088a46d42b903418eJohann 3141b362b15af34006e6a11974088a46d42b903418eJohann unsigned int Border; 3151b362b15af34006e6a11974088a46d42b903418eJohann int plane_stride; 3161b362b15af34006e6a11974088a46d42b903418eJohann 3171b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3181b362b15af34006e6a11974088a46d42b903418eJohann /* Y Plane */ 3191b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3201b362b15af34006e6a11974088a46d42b903418eJohann Border = ybf->border; 3211b362b15af34006e6a11974088a46d42b903418eJohann plane_stride = ybf->y_stride; 3221b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = ybf->y_buffer - Border; 3231b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 = src_ptr1 - (Border * plane_stride); 3241b362b15af34006e6a11974088a46d42b903418eJohann 3251b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < (int)Border; i++) 3261b362b15af34006e6a11974088a46d42b903418eJohann { 327da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(dest_ptr1, src_ptr1, plane_stride); 3281b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 += plane_stride; 3291b362b15af34006e6a11974088a46d42b903418eJohann } 3301b362b15af34006e6a11974088a46d42b903418eJohann 3311b362b15af34006e6a11974088a46d42b903418eJohann 3321b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3331b362b15af34006e6a11974088a46d42b903418eJohann /* U Plane */ 3341b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3351b362b15af34006e6a11974088a46d42b903418eJohann plane_stride = ybf->uv_stride; 3361b362b15af34006e6a11974088a46d42b903418eJohann Border /= 2; 3371b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = ybf->u_buffer - Border; 3381b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 = src_ptr1 - (Border * plane_stride); 3391b362b15af34006e6a11974088a46d42b903418eJohann 3401b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < (int)(Border); i++) 3411b362b15af34006e6a11974088a46d42b903418eJohann { 342da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(dest_ptr1, src_ptr1, plane_stride); 3431b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 += plane_stride; 3441b362b15af34006e6a11974088a46d42b903418eJohann } 3451b362b15af34006e6a11974088a46d42b903418eJohann 3461b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3471b362b15af34006e6a11974088a46d42b903418eJohann /* V Plane */ 3481b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3491b362b15af34006e6a11974088a46d42b903418eJohann 3501b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = ybf->v_buffer - Border; 3511b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 = src_ptr1 - (Border * plane_stride); 3521b362b15af34006e6a11974088a46d42b903418eJohann 3531b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < (int)(Border); i++) 3541b362b15af34006e6a11974088a46d42b903418eJohann { 355da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(dest_ptr1, src_ptr1, plane_stride); 3561b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 += plane_stride; 3571b362b15af34006e6a11974088a46d42b903418eJohann } 3581b362b15af34006e6a11974088a46d42b903418eJohann} 3591b362b15af34006e6a11974088a46d42b903418eJohann 3601b362b15af34006e6a11974088a46d42b903418eJohannstatic void yv12_extend_frame_bottom_c(YV12_BUFFER_CONFIG *ybf) 3611b362b15af34006e6a11974088a46d42b903418eJohann{ 3621b362b15af34006e6a11974088a46d42b903418eJohann int i; 3631b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *src_ptr1, *src_ptr2; 3641b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dest_ptr2; 3651b362b15af34006e6a11974088a46d42b903418eJohann 3661b362b15af34006e6a11974088a46d42b903418eJohann unsigned int Border; 3671b362b15af34006e6a11974088a46d42b903418eJohann int plane_stride; 3681b362b15af34006e6a11974088a46d42b903418eJohann int plane_height; 3691b362b15af34006e6a11974088a46d42b903418eJohann 3701b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3711b362b15af34006e6a11974088a46d42b903418eJohann /* Y Plane */ 3721b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3731b362b15af34006e6a11974088a46d42b903418eJohann Border = ybf->border; 3741b362b15af34006e6a11974088a46d42b903418eJohann plane_stride = ybf->y_stride; 3751b362b15af34006e6a11974088a46d42b903418eJohann plane_height = ybf->y_height; 3761b362b15af34006e6a11974088a46d42b903418eJohann 3771b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = ybf->y_buffer - Border; 3781b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 3791b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 = src_ptr2 + plane_stride; 3801b362b15af34006e6a11974088a46d42b903418eJohann 3811b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < (int)Border; i++) 3821b362b15af34006e6a11974088a46d42b903418eJohann { 383da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(dest_ptr2, src_ptr2, plane_stride); 3841b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 += plane_stride; 3851b362b15af34006e6a11974088a46d42b903418eJohann } 3861b362b15af34006e6a11974088a46d42b903418eJohann 3871b362b15af34006e6a11974088a46d42b903418eJohann 3881b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3891b362b15af34006e6a11974088a46d42b903418eJohann /* U Plane */ 3901b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 3911b362b15af34006e6a11974088a46d42b903418eJohann plane_stride = ybf->uv_stride; 3921b362b15af34006e6a11974088a46d42b903418eJohann plane_height = ybf->uv_height; 3931b362b15af34006e6a11974088a46d42b903418eJohann Border /= 2; 3941b362b15af34006e6a11974088a46d42b903418eJohann 3951b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = ybf->u_buffer - Border; 3961b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 3971b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 = src_ptr2 + plane_stride; 3981b362b15af34006e6a11974088a46d42b903418eJohann 3991b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < (int)(Border); i++) 4001b362b15af34006e6a11974088a46d42b903418eJohann { 401da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(dest_ptr2, src_ptr2, plane_stride); 4021b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 += plane_stride; 4031b362b15af34006e6a11974088a46d42b903418eJohann } 4041b362b15af34006e6a11974088a46d42b903418eJohann 4051b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4061b362b15af34006e6a11974088a46d42b903418eJohann /* V Plane */ 4071b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4081b362b15af34006e6a11974088a46d42b903418eJohann 4091b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = ybf->v_buffer - Border; 4101b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 4111b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 = src_ptr2 + plane_stride; 4121b362b15af34006e6a11974088a46d42b903418eJohann 4131b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < (int)(Border); i++) 4141b362b15af34006e6a11974088a46d42b903418eJohann { 415da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(dest_ptr2, src_ptr2, plane_stride); 4161b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 += plane_stride; 4171b362b15af34006e6a11974088a46d42b903418eJohann } 4181b362b15af34006e6a11974088a46d42b903418eJohann} 4191b362b15af34006e6a11974088a46d42b903418eJohann 4201b362b15af34006e6a11974088a46d42b903418eJohannstatic void yv12_extend_frame_left_right_c(YV12_BUFFER_CONFIG *ybf, 4211b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *y_src, 4221b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *u_src, 4231b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *v_src) 4241b362b15af34006e6a11974088a46d42b903418eJohann{ 4251b362b15af34006e6a11974088a46d42b903418eJohann int i; 4261b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *src_ptr1, *src_ptr2; 4271b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dest_ptr1, *dest_ptr2; 4281b362b15af34006e6a11974088a46d42b903418eJohann 4291b362b15af34006e6a11974088a46d42b903418eJohann unsigned int Border; 4301b362b15af34006e6a11974088a46d42b903418eJohann int plane_stride; 4311b362b15af34006e6a11974088a46d42b903418eJohann int plane_height; 4321b362b15af34006e6a11974088a46d42b903418eJohann int plane_width; 4331b362b15af34006e6a11974088a46d42b903418eJohann 4341b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4351b362b15af34006e6a11974088a46d42b903418eJohann /* Y Plane */ 4361b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4371b362b15af34006e6a11974088a46d42b903418eJohann Border = ybf->border; 4381b362b15af34006e6a11974088a46d42b903418eJohann plane_stride = ybf->y_stride; 4391b362b15af34006e6a11974088a46d42b903418eJohann plane_height = 16; 4401b362b15af34006e6a11974088a46d42b903418eJohann plane_width = ybf->y_width; 4411b362b15af34006e6a11974088a46d42b903418eJohann 4421b362b15af34006e6a11974088a46d42b903418eJohann /* copy the left and right most columns out */ 4431b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = y_src; 4441b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 = src_ptr1 + plane_width - 1; 4451b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 = src_ptr1 - Border; 4461b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 = src_ptr2 + 1; 4471b362b15af34006e6a11974088a46d42b903418eJohann 4481b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < plane_height; i++) 4491b362b15af34006e6a11974088a46d42b903418eJohann { 450da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(dest_ptr1, src_ptr1[0], Border); 451da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(dest_ptr2, src_ptr2[0], Border); 4521b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 += plane_stride; 4531b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 += plane_stride; 4541b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 += plane_stride; 4551b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 += plane_stride; 4561b362b15af34006e6a11974088a46d42b903418eJohann } 4571b362b15af34006e6a11974088a46d42b903418eJohann 4581b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4591b362b15af34006e6a11974088a46d42b903418eJohann /* U Plane */ 4601b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4611b362b15af34006e6a11974088a46d42b903418eJohann plane_stride = ybf->uv_stride; 4621b362b15af34006e6a11974088a46d42b903418eJohann plane_height = 8; 4631b362b15af34006e6a11974088a46d42b903418eJohann plane_width = ybf->uv_width; 4641b362b15af34006e6a11974088a46d42b903418eJohann Border /= 2; 4651b362b15af34006e6a11974088a46d42b903418eJohann 4661b362b15af34006e6a11974088a46d42b903418eJohann /* copy the left and right most columns out */ 4671b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = u_src; 4681b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 = src_ptr1 + plane_width - 1; 4691b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 = src_ptr1 - Border; 4701b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 = src_ptr2 + 1; 4711b362b15af34006e6a11974088a46d42b903418eJohann 4721b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < plane_height; i++) 4731b362b15af34006e6a11974088a46d42b903418eJohann { 474da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(dest_ptr1, src_ptr1[0], Border); 475da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(dest_ptr2, src_ptr2[0], Border); 4761b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 += plane_stride; 4771b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 += plane_stride; 4781b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 += plane_stride; 4791b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 += plane_stride; 4801b362b15af34006e6a11974088a46d42b903418eJohann } 4811b362b15af34006e6a11974088a46d42b903418eJohann 4821b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4831b362b15af34006e6a11974088a46d42b903418eJohann /* V Plane */ 4841b362b15af34006e6a11974088a46d42b903418eJohann /***********/ 4851b362b15af34006e6a11974088a46d42b903418eJohann 4861b362b15af34006e6a11974088a46d42b903418eJohann /* copy the left and right most columns out */ 4871b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 = v_src; 4881b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 = src_ptr1 + plane_width - 1; 4891b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 = src_ptr1 - Border; 4901b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 = src_ptr2 + 1; 4911b362b15af34006e6a11974088a46d42b903418eJohann 4921b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < plane_height; i++) 4931b362b15af34006e6a11974088a46d42b903418eJohann { 494da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(dest_ptr1, src_ptr1[0], Border); 495da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(dest_ptr2, src_ptr2[0], Border); 4961b362b15af34006e6a11974088a46d42b903418eJohann src_ptr1 += plane_stride; 4971b362b15af34006e6a11974088a46d42b903418eJohann src_ptr2 += plane_stride; 4981b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr1 += plane_stride; 4991b362b15af34006e6a11974088a46d42b903418eJohann dest_ptr2 += plane_stride; 5001b362b15af34006e6a11974088a46d42b903418eJohann } 5011b362b15af34006e6a11974088a46d42b903418eJohann} 5021b362b15af34006e6a11974088a46d42b903418eJohann 5031b362b15af34006e6a11974088a46d42b903418eJohannstatic void decode_mb_rows(VP8D_COMP *pbi) 5041b362b15af34006e6a11974088a46d42b903418eJohann{ 5051b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *const pc = & pbi->common; 5061b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *const xd = & pbi->mb; 5071b362b15af34006e6a11974088a46d42b903418eJohann 5081b362b15af34006e6a11974088a46d42b903418eJohann MODE_INFO *lf_mic = xd->mode_info_context; 5091b362b15af34006e6a11974088a46d42b903418eJohann 5101b362b15af34006e6a11974088a46d42b903418eJohann int ibc = 0; 5111b362b15af34006e6a11974088a46d42b903418eJohann int num_part = 1 << pc->multi_token_partition; 5121b362b15af34006e6a11974088a46d42b903418eJohann 5131b362b15af34006e6a11974088a46d42b903418eJohann int recon_yoffset, recon_uvoffset; 5141b362b15af34006e6a11974088a46d42b903418eJohann int mb_row, mb_col; 5151b362b15af34006e6a11974088a46d42b903418eJohann int mb_idx = 0; 5161b362b15af34006e6a11974088a46d42b903418eJohann 5171b362b15af34006e6a11974088a46d42b903418eJohann YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 5181b362b15af34006e6a11974088a46d42b903418eJohann 5191b362b15af34006e6a11974088a46d42b903418eJohann int recon_y_stride = yv12_fb_new->y_stride; 5201b362b15af34006e6a11974088a46d42b903418eJohann int recon_uv_stride = yv12_fb_new->uv_stride; 5211b362b15af34006e6a11974088a46d42b903418eJohann 5221b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *ref_buffer[MAX_REF_FRAMES][3]; 5231b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst_buffer[3]; 5241b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *lf_dst[3]; 5251b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *eb_dst[3]; 5261b362b15af34006e6a11974088a46d42b903418eJohann int i; 5271b362b15af34006e6a11974088a46d42b903418eJohann int ref_fb_corrupted[MAX_REF_FRAMES]; 5281b362b15af34006e6a11974088a46d42b903418eJohann 5291b362b15af34006e6a11974088a46d42b903418eJohann ref_fb_corrupted[INTRA_FRAME] = 0; 5301b362b15af34006e6a11974088a46d42b903418eJohann 5311b362b15af34006e6a11974088a46d42b903418eJohann for(i = 1; i < MAX_REF_FRAMES; i++) 5321b362b15af34006e6a11974088a46d42b903418eJohann { 5331b362b15af34006e6a11974088a46d42b903418eJohann YV12_BUFFER_CONFIG *this_fb = pbi->dec_fb_ref[i]; 5341b362b15af34006e6a11974088a46d42b903418eJohann 5351b362b15af34006e6a11974088a46d42b903418eJohann ref_buffer[i][0] = this_fb->y_buffer; 5361b362b15af34006e6a11974088a46d42b903418eJohann ref_buffer[i][1] = this_fb->u_buffer; 5371b362b15af34006e6a11974088a46d42b903418eJohann ref_buffer[i][2] = this_fb->v_buffer; 5381b362b15af34006e6a11974088a46d42b903418eJohann 5391b362b15af34006e6a11974088a46d42b903418eJohann ref_fb_corrupted[i] = this_fb->corrupted; 5401b362b15af34006e6a11974088a46d42b903418eJohann } 5411b362b15af34006e6a11974088a46d42b903418eJohann 5421b362b15af34006e6a11974088a46d42b903418eJohann /* Set up the buffer pointers */ 5431b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0] = lf_dst[0] = dst_buffer[0] = yv12_fb_new->y_buffer; 5441b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1] = lf_dst[1] = dst_buffer[1] = yv12_fb_new->u_buffer; 5451b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2] = lf_dst[2] = dst_buffer[2] = yv12_fb_new->v_buffer; 5461b362b15af34006e6a11974088a46d42b903418eJohann 5471b362b15af34006e6a11974088a46d42b903418eJohann xd->up_available = 0; 5481b362b15af34006e6a11974088a46d42b903418eJohann 5491b362b15af34006e6a11974088a46d42b903418eJohann /* Initialize the loop filter for this frame. */ 5501b362b15af34006e6a11974088a46d42b903418eJohann if(pc->filter_level) 5511b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_frame_init(pc, xd, pc->filter_level); 5521b362b15af34006e6a11974088a46d42b903418eJohann 5531b362b15af34006e6a11974088a46d42b903418eJohann vp8_setup_intra_recon_top_line(yv12_fb_new); 5541b362b15af34006e6a11974088a46d42b903418eJohann 5551b362b15af34006e6a11974088a46d42b903418eJohann /* Decode the individual macro block */ 5561b362b15af34006e6a11974088a46d42b903418eJohann for (mb_row = 0; mb_row < pc->mb_rows; mb_row++) 5571b362b15af34006e6a11974088a46d42b903418eJohann { 5581b362b15af34006e6a11974088a46d42b903418eJohann if (num_part > 1) 5591b362b15af34006e6a11974088a46d42b903418eJohann { 5601b362b15af34006e6a11974088a46d42b903418eJohann xd->current_bc = & pbi->mbc[ibc]; 5611b362b15af34006e6a11974088a46d42b903418eJohann ibc++; 5621b362b15af34006e6a11974088a46d42b903418eJohann 5631b362b15af34006e6a11974088a46d42b903418eJohann if (ibc == num_part) 5641b362b15af34006e6a11974088a46d42b903418eJohann ibc = 0; 5651b362b15af34006e6a11974088a46d42b903418eJohann } 5661b362b15af34006e6a11974088a46d42b903418eJohann 5671b362b15af34006e6a11974088a46d42b903418eJohann recon_yoffset = mb_row * recon_y_stride * 16; 5681b362b15af34006e6a11974088a46d42b903418eJohann recon_uvoffset = mb_row * recon_uv_stride * 8; 5691b362b15af34006e6a11974088a46d42b903418eJohann 5701b362b15af34006e6a11974088a46d42b903418eJohann /* reset contexts */ 5711b362b15af34006e6a11974088a46d42b903418eJohann xd->above_context = pc->above_context; 572da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); 5731b362b15af34006e6a11974088a46d42b903418eJohann 5741b362b15af34006e6a11974088a46d42b903418eJohann xd->left_available = 0; 5751b362b15af34006e6a11974088a46d42b903418eJohann 5765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang xd->mb_to_top_edge = -((mb_row * 16) << 3); 5771b362b15af34006e6a11974088a46d42b903418eJohann xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 5781b362b15af34006e6a11974088a46d42b903418eJohann 5791b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[0] = dst_buffer[0] + recon_yoffset; 5801b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[1] = dst_buffer[1] + recon_uvoffset; 5811b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[2] = dst_buffer[2] + recon_uvoffset; 5821b362b15af34006e6a11974088a46d42b903418eJohann 5831b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[0] = xd->recon_above[0] - 1; 5841b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[1] = xd->recon_above[1] - 1; 5851b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[2] = xd->recon_above[2] - 1; 5861b362b15af34006e6a11974088a46d42b903418eJohann 5871b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[0] -= xd->dst.y_stride; 5881b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[1] -= xd->dst.uv_stride; 5891b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[2] -= xd->dst.uv_stride; 5901b362b15af34006e6a11974088a46d42b903418eJohann 5911b362b15af34006e6a11974088a46d42b903418eJohann /* TODO: move to outside row loop */ 5921b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left_stride[0] = xd->dst.y_stride; 5931b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left_stride[1] = xd->dst.uv_stride; 5941b362b15af34006e6a11974088a46d42b903418eJohann 5951b362b15af34006e6a11974088a46d42b903418eJohann setup_intra_recon_left(xd->recon_left[0], xd->recon_left[1], 5961b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[2], xd->dst.y_stride, 5971b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride); 5981b362b15af34006e6a11974088a46d42b903418eJohann 5991b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < pc->mb_cols; mb_col++) 6001b362b15af34006e6a11974088a46d42b903418eJohann { 6011b362b15af34006e6a11974088a46d42b903418eJohann /* Distance of Mb to the various image edges. 6021b362b15af34006e6a11974088a46d42b903418eJohann * These are specified to 8th pel as they are always compared to values 6031b362b15af34006e6a11974088a46d42b903418eJohann * that are in 1/8th pel units 6041b362b15af34006e6a11974088a46d42b903418eJohann */ 6051b362b15af34006e6a11974088a46d42b903418eJohann xd->mb_to_left_edge = -((mb_col * 16) << 3); 6061b362b15af34006e6a11974088a46d42b903418eJohann xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 6071b362b15af34006e6a11974088a46d42b903418eJohann 6081b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 6091b362b15af34006e6a11974088a46d42b903418eJohann { 6101b362b15af34006e6a11974088a46d42b903418eJohann int corrupt_residual = (!pbi->independent_partitions && 6111b362b15af34006e6a11974088a46d42b903418eJohann pbi->frame_corrupt_residual) || 6121b362b15af34006e6a11974088a46d42b903418eJohann vp8dx_bool_error(xd->current_bc); 6131b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && 6141b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME && 6151b362b15af34006e6a11974088a46d42b903418eJohann corrupt_residual) 6161b362b15af34006e6a11974088a46d42b903418eJohann { 6171b362b15af34006e6a11974088a46d42b903418eJohann /* We have an intra block with corrupt coefficients, better to 6181b362b15af34006e6a11974088a46d42b903418eJohann * conceal with an inter block. Interpolate MVs from neighboring 6191b362b15af34006e6a11974088a46d42b903418eJohann * MBs. 6201b362b15af34006e6a11974088a46d42b903418eJohann * 6211b362b15af34006e6a11974088a46d42b903418eJohann * Note that for the first mb with corrupt residual in a frame, 6221b362b15af34006e6a11974088a46d42b903418eJohann * we might not discover that before decoding the residual. That 6231b362b15af34006e6a11974088a46d42b903418eJohann * happens after this check, and therefore no inter concealment 6241b362b15af34006e6a11974088a46d42b903418eJohann * will be done. 6251b362b15af34006e6a11974088a46d42b903418eJohann */ 6261b362b15af34006e6a11974088a46d42b903418eJohann vp8_interpolate_motion(xd, 6271b362b15af34006e6a11974088a46d42b903418eJohann mb_row, mb_col, 6281b362b15af34006e6a11974088a46d42b903418eJohann pc->mb_rows, pc->mb_cols, 6291b362b15af34006e6a11974088a46d42b903418eJohann pc->mode_info_stride); 6301b362b15af34006e6a11974088a46d42b903418eJohann } 6311b362b15af34006e6a11974088a46d42b903418eJohann } 6321b362b15af34006e6a11974088a46d42b903418eJohann#endif 6331b362b15af34006e6a11974088a46d42b903418eJohann 6341b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer = dst_buffer[0] + recon_yoffset; 6351b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer = dst_buffer[1] + recon_uvoffset; 6361b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer = dst_buffer[2] + recon_uvoffset; 6371b362b15af34006e6a11974088a46d42b903418eJohann 638ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian if (xd->mode_info_context->mbmi.ref_frame >= LAST_FRAME) { 639da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian const MV_REFERENCE_FRAME ref = xd->mode_info_context->mbmi.ref_frame; 640ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian xd->pre.y_buffer = ref_buffer[ref][0] + recon_yoffset; 641ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian xd->pre.u_buffer = ref_buffer[ref][1] + recon_uvoffset; 642ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian xd->pre.v_buffer = ref_buffer[ref][2] + recon_uvoffset; 643ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } else { 644ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // ref_frame is INTRA_FRAME, pre buffer should not be used. 645ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian xd->pre.y_buffer = 0; 646ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian xd->pre.u_buffer = 0; 647ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian xd->pre.v_buffer = 0; 648ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 6491b362b15af34006e6a11974088a46d42b903418eJohann 6501b362b15af34006e6a11974088a46d42b903418eJohann /* propagate errors from reference frames */ 6511b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= ref_fb_corrupted[xd->mode_info_context->mbmi.ref_frame]; 6521b362b15af34006e6a11974088a46d42b903418eJohann 6531b362b15af34006e6a11974088a46d42b903418eJohann decode_macroblock(pbi, xd, mb_idx); 6541b362b15af34006e6a11974088a46d42b903418eJohann 6551b362b15af34006e6a11974088a46d42b903418eJohann mb_idx++; 6561b362b15af34006e6a11974088a46d42b903418eJohann xd->left_available = 1; 6571b362b15af34006e6a11974088a46d42b903418eJohann 6581b362b15af34006e6a11974088a46d42b903418eJohann /* check if the boolean decoder has suffered an error */ 6591b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(xd->current_bc); 6601b362b15af34006e6a11974088a46d42b903418eJohann 6611b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[0] += 16; 6621b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[1] += 8; 6631b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_above[2] += 8; 6641b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[0] += 16; 6651b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[1] += 8; 6661b362b15af34006e6a11974088a46d42b903418eJohann xd->recon_left[2] += 8; 6671b362b15af34006e6a11974088a46d42b903418eJohann 6681b362b15af34006e6a11974088a46d42b903418eJohann recon_yoffset += 16; 6691b362b15af34006e6a11974088a46d42b903418eJohann recon_uvoffset += 8; 6701b362b15af34006e6a11974088a46d42b903418eJohann 6711b362b15af34006e6a11974088a46d42b903418eJohann ++xd->mode_info_context; /* next mb */ 6721b362b15af34006e6a11974088a46d42b903418eJohann 6731b362b15af34006e6a11974088a46d42b903418eJohann xd->above_context++; 6741b362b15af34006e6a11974088a46d42b903418eJohann } 6751b362b15af34006e6a11974088a46d42b903418eJohann 6761b362b15af34006e6a11974088a46d42b903418eJohann /* adjust to the next row of mbs */ 6771b362b15af34006e6a11974088a46d42b903418eJohann vp8_extend_mb_row(yv12_fb_new, xd->dst.y_buffer + 16, 6781b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer + 8, xd->dst.v_buffer + 8); 6791b362b15af34006e6a11974088a46d42b903418eJohann 6801b362b15af34006e6a11974088a46d42b903418eJohann ++xd->mode_info_context; /* skip prediction column */ 6811b362b15af34006e6a11974088a46d42b903418eJohann xd->up_available = 1; 6821b362b15af34006e6a11974088a46d42b903418eJohann 6831b362b15af34006e6a11974088a46d42b903418eJohann if(pc->filter_level) 6841b362b15af34006e6a11974088a46d42b903418eJohann { 6851b362b15af34006e6a11974088a46d42b903418eJohann if(mb_row > 0) 6861b362b15af34006e6a11974088a46d42b903418eJohann { 6871b362b15af34006e6a11974088a46d42b903418eJohann if (pc->filter_type == NORMAL_LOOPFILTER) 6881b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_row_normal(pc, lf_mic, mb_row-1, 6891b362b15af34006e6a11974088a46d42b903418eJohann recon_y_stride, recon_uv_stride, 6901b362b15af34006e6a11974088a46d42b903418eJohann lf_dst[0], lf_dst[1], lf_dst[2]); 6911b362b15af34006e6a11974088a46d42b903418eJohann else 6921b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_row_simple(pc, lf_mic, mb_row-1, 6931b362b15af34006e6a11974088a46d42b903418eJohann recon_y_stride, recon_uv_stride, 6941b362b15af34006e6a11974088a46d42b903418eJohann lf_dst[0], lf_dst[1], lf_dst[2]); 6951b362b15af34006e6a11974088a46d42b903418eJohann if(mb_row > 1) 6961b362b15af34006e6a11974088a46d42b903418eJohann { 6971b362b15af34006e6a11974088a46d42b903418eJohann yv12_extend_frame_left_right_c(yv12_fb_new, 6981b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0], 6991b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1], 7001b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2]); 7011b362b15af34006e6a11974088a46d42b903418eJohann 7021b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0] += recon_y_stride * 16; 7031b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1] += recon_uv_stride * 8; 7041b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2] += recon_uv_stride * 8; 7051b362b15af34006e6a11974088a46d42b903418eJohann } 7061b362b15af34006e6a11974088a46d42b903418eJohann 7071b362b15af34006e6a11974088a46d42b903418eJohann lf_dst[0] += recon_y_stride * 16; 7081b362b15af34006e6a11974088a46d42b903418eJohann lf_dst[1] += recon_uv_stride * 8; 7091b362b15af34006e6a11974088a46d42b903418eJohann lf_dst[2] += recon_uv_stride * 8; 7101b362b15af34006e6a11974088a46d42b903418eJohann lf_mic += pc->mb_cols; 7111b362b15af34006e6a11974088a46d42b903418eJohann lf_mic++; /* Skip border mb */ 7121b362b15af34006e6a11974088a46d42b903418eJohann } 7131b362b15af34006e6a11974088a46d42b903418eJohann } 7141b362b15af34006e6a11974088a46d42b903418eJohann else 7151b362b15af34006e6a11974088a46d42b903418eJohann { 7161b362b15af34006e6a11974088a46d42b903418eJohann if(mb_row > 0) 7171b362b15af34006e6a11974088a46d42b903418eJohann { 7181b362b15af34006e6a11974088a46d42b903418eJohann /**/ 7191b362b15af34006e6a11974088a46d42b903418eJohann yv12_extend_frame_left_right_c(yv12_fb_new, 7201b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0], 7211b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1], 7221b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2]); 7231b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0] += recon_y_stride * 16; 7241b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1] += recon_uv_stride * 8; 7251b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2] += recon_uv_stride * 8; 7261b362b15af34006e6a11974088a46d42b903418eJohann } 7271b362b15af34006e6a11974088a46d42b903418eJohann } 7281b362b15af34006e6a11974088a46d42b903418eJohann } 7291b362b15af34006e6a11974088a46d42b903418eJohann 7301b362b15af34006e6a11974088a46d42b903418eJohann if(pc->filter_level) 7311b362b15af34006e6a11974088a46d42b903418eJohann { 7321b362b15af34006e6a11974088a46d42b903418eJohann if (pc->filter_type == NORMAL_LOOPFILTER) 7331b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_row_normal(pc, lf_mic, mb_row-1, recon_y_stride, 7341b362b15af34006e6a11974088a46d42b903418eJohann recon_uv_stride, lf_dst[0], lf_dst[1], 7351b362b15af34006e6a11974088a46d42b903418eJohann lf_dst[2]); 7361b362b15af34006e6a11974088a46d42b903418eJohann else 7371b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_row_simple(pc, lf_mic, mb_row-1, recon_y_stride, 7381b362b15af34006e6a11974088a46d42b903418eJohann recon_uv_stride, lf_dst[0], lf_dst[1], 7391b362b15af34006e6a11974088a46d42b903418eJohann lf_dst[2]); 7401b362b15af34006e6a11974088a46d42b903418eJohann 7411b362b15af34006e6a11974088a46d42b903418eJohann yv12_extend_frame_left_right_c(yv12_fb_new, 7421b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0], 7431b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1], 7441b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2]); 7451b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0] += recon_y_stride * 16; 7461b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1] += recon_uv_stride * 8; 7471b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2] += recon_uv_stride * 8; 7481b362b15af34006e6a11974088a46d42b903418eJohann } 7491b362b15af34006e6a11974088a46d42b903418eJohann yv12_extend_frame_left_right_c(yv12_fb_new, 7501b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[0], 7511b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[1], 7521b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2]); 7532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian yv12_extend_frame_top_c(yv12_fb_new); 7541b362b15af34006e6a11974088a46d42b903418eJohann yv12_extend_frame_bottom_c(yv12_fb_new); 7551b362b15af34006e6a11974088a46d42b903418eJohann 7561b362b15af34006e6a11974088a46d42b903418eJohann} 7571b362b15af34006e6a11974088a46d42b903418eJohann 758ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic unsigned int read_partition_size(VP8D_COMP *pbi, 759ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *cx_size) 7601b362b15af34006e6a11974088a46d42b903418eJohann{ 761ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned char temp[3]; 762ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->decrypt_cb) 763ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 764ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->decrypt_cb(pbi->decrypt_state, cx_size, temp, 3); 765ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cx_size = temp; 766ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 767ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return cx_size[0] + (cx_size[1] << 8) + (cx_size[2] << 16); 7681b362b15af34006e6a11974088a46d42b903418eJohann} 7691b362b15af34006e6a11974088a46d42b903418eJohann 7701b362b15af34006e6a11974088a46d42b903418eJohannstatic int read_is_valid(const unsigned char *start, 7711b362b15af34006e6a11974088a46d42b903418eJohann size_t len, 7721b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *end) 7731b362b15af34006e6a11974088a46d42b903418eJohann{ 7741b362b15af34006e6a11974088a46d42b903418eJohann return (start + len > start && start + len <= end); 7751b362b15af34006e6a11974088a46d42b903418eJohann} 7761b362b15af34006e6a11974088a46d42b903418eJohann 7771b362b15af34006e6a11974088a46d42b903418eJohannstatic unsigned int read_available_partition_size( 7781b362b15af34006e6a11974088a46d42b903418eJohann VP8D_COMP *pbi, 7791b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *token_part_sizes, 7801b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *fragment_start, 7811b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *first_fragment_end, 7821b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *fragment_end, 7831b362b15af34006e6a11974088a46d42b903418eJohann int i, 7841b362b15af34006e6a11974088a46d42b903418eJohann int num_part) 7851b362b15af34006e6a11974088a46d42b903418eJohann{ 7861b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON* pc = &pbi->common; 7871b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char *partition_size_ptr = token_part_sizes + i * 3; 7881b362b15af34006e6a11974088a46d42b903418eJohann unsigned int partition_size = 0; 7891b362b15af34006e6a11974088a46d42b903418eJohann ptrdiff_t bytes_left = fragment_end - fragment_start; 7901b362b15af34006e6a11974088a46d42b903418eJohann /* Calculate the length of this partition. The last partition 7911b362b15af34006e6a11974088a46d42b903418eJohann * size is implicit. If the partition size can't be read, then 7921b362b15af34006e6a11974088a46d42b903418eJohann * either use the remaining data in the buffer (for EC mode) 7931b362b15af34006e6a11974088a46d42b903418eJohann * or throw an error. 7941b362b15af34006e6a11974088a46d42b903418eJohann */ 7951b362b15af34006e6a11974088a46d42b903418eJohann if (i < num_part - 1) 7961b362b15af34006e6a11974088a46d42b903418eJohann { 7971b362b15af34006e6a11974088a46d42b903418eJohann if (read_is_valid(partition_size_ptr, 3, first_fragment_end)) 798ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang partition_size = read_partition_size(pbi, partition_size_ptr); 7991b362b15af34006e6a11974088a46d42b903418eJohann else if (pbi->ec_active) 8001b362b15af34006e6a11974088a46d42b903418eJohann partition_size = (unsigned int)bytes_left; 8011b362b15af34006e6a11974088a46d42b903418eJohann else 8021b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 8031b362b15af34006e6a11974088a46d42b903418eJohann "Truncated partition size data"); 8041b362b15af34006e6a11974088a46d42b903418eJohann } 8051b362b15af34006e6a11974088a46d42b903418eJohann else 8061b362b15af34006e6a11974088a46d42b903418eJohann partition_size = (unsigned int)bytes_left; 8071b362b15af34006e6a11974088a46d42b903418eJohann 8081b362b15af34006e6a11974088a46d42b903418eJohann /* Validate the calculated partition length. If the buffer 8091b362b15af34006e6a11974088a46d42b903418eJohann * described by the partition can't be fully read, then restrict 8101b362b15af34006e6a11974088a46d42b903418eJohann * it to the portion that can be (for EC mode) or throw an error. 8111b362b15af34006e6a11974088a46d42b903418eJohann */ 8121b362b15af34006e6a11974088a46d42b903418eJohann if (!read_is_valid(fragment_start, partition_size, fragment_end)) 8131b362b15af34006e6a11974088a46d42b903418eJohann { 8141b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active) 8151b362b15af34006e6a11974088a46d42b903418eJohann partition_size = (unsigned int)bytes_left; 8161b362b15af34006e6a11974088a46d42b903418eJohann else 8171b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 8181b362b15af34006e6a11974088a46d42b903418eJohann "Truncated packet or corrupt partition " 8191b362b15af34006e6a11974088a46d42b903418eJohann "%d length", i + 1); 8201b362b15af34006e6a11974088a46d42b903418eJohann } 8211b362b15af34006e6a11974088a46d42b903418eJohann return partition_size; 8221b362b15af34006e6a11974088a46d42b903418eJohann} 8231b362b15af34006e6a11974088a46d42b903418eJohann 8241b362b15af34006e6a11974088a46d42b903418eJohann 8251b362b15af34006e6a11974088a46d42b903418eJohannstatic void setup_token_decoder(VP8D_COMP *pbi, 8261b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char* token_part_sizes) 8271b362b15af34006e6a11974088a46d42b903418eJohann{ 8281b362b15af34006e6a11974088a46d42b903418eJohann vp8_reader *bool_decoder = &pbi->mbc[0]; 8291b362b15af34006e6a11974088a46d42b903418eJohann unsigned int partition_idx; 8301b362b15af34006e6a11974088a46d42b903418eJohann unsigned int fragment_idx; 8311b362b15af34006e6a11974088a46d42b903418eJohann unsigned int num_token_partitions; 832ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *first_fragment_end = pbi->fragments.ptrs[0] + 833ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.sizes[0]; 8341b362b15af34006e6a11974088a46d42b903418eJohann 8351b362b15af34006e6a11974088a46d42b903418eJohann TOKEN_PARTITION multi_token_partition = 8361b362b15af34006e6a11974088a46d42b903418eJohann (TOKEN_PARTITION)vp8_read_literal(&pbi->mbc[8], 2); 8371b362b15af34006e6a11974088a46d42b903418eJohann if (!vp8dx_bool_error(&pbi->mbc[8])) 8381b362b15af34006e6a11974088a46d42b903418eJohann pbi->common.multi_token_partition = multi_token_partition; 8391b362b15af34006e6a11974088a46d42b903418eJohann num_token_partitions = 1 << pbi->common.multi_token_partition; 8401b362b15af34006e6a11974088a46d42b903418eJohann 8411b362b15af34006e6a11974088a46d42b903418eJohann /* Check for partitions within the fragments and unpack the fragments 8421b362b15af34006e6a11974088a46d42b903418eJohann * so that each fragment pointer points to its corresponding partition. */ 843ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (fragment_idx = 0; fragment_idx < pbi->fragments.count; ++fragment_idx) 8441b362b15af34006e6a11974088a46d42b903418eJohann { 845ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int fragment_size = pbi->fragments.sizes[fragment_idx]; 846ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *fragment_end = pbi->fragments.ptrs[fragment_idx] + 8471b362b15af34006e6a11974088a46d42b903418eJohann fragment_size; 8481b362b15af34006e6a11974088a46d42b903418eJohann /* Special case for handling the first partition since we have already 8491b362b15af34006e6a11974088a46d42b903418eJohann * read its size. */ 8501b362b15af34006e6a11974088a46d42b903418eJohann if (fragment_idx == 0) 8511b362b15af34006e6a11974088a46d42b903418eJohann { 8521b362b15af34006e6a11974088a46d42b903418eJohann /* Size of first partition + token partition sizes element */ 8531b362b15af34006e6a11974088a46d42b903418eJohann ptrdiff_t ext_first_part_size = token_part_sizes - 854ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.ptrs[0] + 3 * (num_token_partitions - 1); 8551b362b15af34006e6a11974088a46d42b903418eJohann fragment_size -= (unsigned int)ext_first_part_size; 8561b362b15af34006e6a11974088a46d42b903418eJohann if (fragment_size > 0) 8571b362b15af34006e6a11974088a46d42b903418eJohann { 858ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.sizes[0] = (unsigned int)ext_first_part_size; 8591b362b15af34006e6a11974088a46d42b903418eJohann /* The fragment contains an additional partition. Move to 8601b362b15af34006e6a11974088a46d42b903418eJohann * next. */ 8611b362b15af34006e6a11974088a46d42b903418eJohann fragment_idx++; 862ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.ptrs[fragment_idx] = pbi->fragments.ptrs[0] + 863ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.sizes[0]; 8641b362b15af34006e6a11974088a46d42b903418eJohann } 8651b362b15af34006e6a11974088a46d42b903418eJohann } 8661b362b15af34006e6a11974088a46d42b903418eJohann /* Split the chunk into partitions read from the bitstream */ 8671b362b15af34006e6a11974088a46d42b903418eJohann while (fragment_size > 0) 8681b362b15af34006e6a11974088a46d42b903418eJohann { 8691b362b15af34006e6a11974088a46d42b903418eJohann ptrdiff_t partition_size = read_available_partition_size( 8701b362b15af34006e6a11974088a46d42b903418eJohann pbi, 8711b362b15af34006e6a11974088a46d42b903418eJohann token_part_sizes, 872ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.ptrs[fragment_idx], 8731b362b15af34006e6a11974088a46d42b903418eJohann first_fragment_end, 8741b362b15af34006e6a11974088a46d42b903418eJohann fragment_end, 8751b362b15af34006e6a11974088a46d42b903418eJohann fragment_idx - 1, 8761b362b15af34006e6a11974088a46d42b903418eJohann num_token_partitions); 877ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.sizes[fragment_idx] = (unsigned int)partition_size; 8781b362b15af34006e6a11974088a46d42b903418eJohann fragment_size -= (unsigned int)partition_size; 8791b362b15af34006e6a11974088a46d42b903418eJohann assert(fragment_idx <= num_token_partitions); 8801b362b15af34006e6a11974088a46d42b903418eJohann if (fragment_size > 0) 8811b362b15af34006e6a11974088a46d42b903418eJohann { 8821b362b15af34006e6a11974088a46d42b903418eJohann /* The fragment contains an additional partition. 8831b362b15af34006e6a11974088a46d42b903418eJohann * Move to next. */ 8841b362b15af34006e6a11974088a46d42b903418eJohann fragment_idx++; 885ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.ptrs[fragment_idx] = 886ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.ptrs[fragment_idx - 1] + partition_size; 8871b362b15af34006e6a11974088a46d42b903418eJohann } 8881b362b15af34006e6a11974088a46d42b903418eJohann } 8891b362b15af34006e6a11974088a46d42b903418eJohann } 8901b362b15af34006e6a11974088a46d42b903418eJohann 891ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.count = num_token_partitions + 1; 8921b362b15af34006e6a11974088a46d42b903418eJohann 893ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (partition_idx = 1; partition_idx < pbi->fragments.count; ++partition_idx) 8941b362b15af34006e6a11974088a46d42b903418eJohann { 8951b362b15af34006e6a11974088a46d42b903418eJohann if (vp8dx_start_decode(bool_decoder, 896ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.ptrs[partition_idx], 897ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->fragments.sizes[partition_idx], 898ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->decrypt_cb, pbi->decrypt_state)) 8991b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR, 9001b362b15af34006e6a11974088a46d42b903418eJohann "Failed to allocate bool decoder %d", 9011b362b15af34006e6a11974088a46d42b903418eJohann partition_idx); 9021b362b15af34006e6a11974088a46d42b903418eJohann 9031b362b15af34006e6a11974088a46d42b903418eJohann bool_decoder++; 9041b362b15af34006e6a11974088a46d42b903418eJohann } 9051b362b15af34006e6a11974088a46d42b903418eJohann 9061b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD 9071b362b15af34006e6a11974088a46d42b903418eJohann /* Clamp number of decoder threads */ 9081b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->decoding_thread_count > num_token_partitions - 1) 9091b362b15af34006e6a11974088a46d42b903418eJohann pbi->decoding_thread_count = num_token_partitions - 1; 9101b362b15af34006e6a11974088a46d42b903418eJohann#endif 9111b362b15af34006e6a11974088a46d42b903418eJohann} 9121b362b15af34006e6a11974088a46d42b903418eJohann 9131b362b15af34006e6a11974088a46d42b903418eJohann 9141b362b15af34006e6a11974088a46d42b903418eJohannstatic void init_frame(VP8D_COMP *pbi) 9151b362b15af34006e6a11974088a46d42b903418eJohann{ 9161b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *const pc = & pbi->common; 9171b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *const xd = & pbi->mb; 9181b362b15af34006e6a11974088a46d42b903418eJohann 9191b362b15af34006e6a11974088a46d42b903418eJohann if (pc->frame_type == KEY_FRAME) 9201b362b15af34006e6a11974088a46d42b903418eJohann { 9211b362b15af34006e6a11974088a46d42b903418eJohann /* Various keyframe initializations */ 922da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(pc->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context)); 9231b362b15af34006e6a11974088a46d42b903418eJohann 9241b362b15af34006e6a11974088a46d42b903418eJohann vp8_init_mbmode_probs(pc); 9251b362b15af34006e6a11974088a46d42b903418eJohann 9261b362b15af34006e6a11974088a46d42b903418eJohann vp8_default_coef_probs(pc); 9271b362b15af34006e6a11974088a46d42b903418eJohann 9281b362b15af34006e6a11974088a46d42b903418eJohann /* reset the segment feature data to 0 with delta coding (Default state). */ 929da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data)); 9301b362b15af34006e6a11974088a46d42b903418eJohann xd->mb_segement_abs_delta = SEGMENT_DELTADATA; 9311b362b15af34006e6a11974088a46d42b903418eJohann 9321b362b15af34006e6a11974088a46d42b903418eJohann /* reset the mode ref deltasa for loop filter */ 933da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->ref_lf_deltas, 0, sizeof(xd->ref_lf_deltas)); 934da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->mode_lf_deltas, 0, sizeof(xd->mode_lf_deltas)); 9351b362b15af34006e6a11974088a46d42b903418eJohann 9361b362b15af34006e6a11974088a46d42b903418eJohann /* All buffers are implicitly updated on key frames. */ 9371b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_golden_frame = 1; 9381b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_alt_ref_frame = 1; 9391b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_gf = 0; 9401b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_arf = 0; 9411b362b15af34006e6a11974088a46d42b903418eJohann 9421b362b15af34006e6a11974088a46d42b903418eJohann /* Note that Golden and Altref modes cannot be used on a key frame so 9431b362b15af34006e6a11974088a46d42b903418eJohann * ref_frame_sign_bias[] is undefined and meaningless 9441b362b15af34006e6a11974088a46d42b903418eJohann */ 9451b362b15af34006e6a11974088a46d42b903418eJohann pc->ref_frame_sign_bias[GOLDEN_FRAME] = 0; 9461b362b15af34006e6a11974088a46d42b903418eJohann pc->ref_frame_sign_bias[ALTREF_FRAME] = 0; 9471b362b15af34006e6a11974088a46d42b903418eJohann } 9481b362b15af34006e6a11974088a46d42b903418eJohann else 9491b362b15af34006e6a11974088a46d42b903418eJohann { 9501b362b15af34006e6a11974088a46d42b903418eJohann /* To enable choice of different interploation filters */ 9511b362b15af34006e6a11974088a46d42b903418eJohann if (!pc->use_bilinear_mc_filter) 9521b362b15af34006e6a11974088a46d42b903418eJohann { 9531b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict = vp8_sixtap_predict4x4; 9541b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict8x4 = vp8_sixtap_predict8x4; 9551b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict8x8 = vp8_sixtap_predict8x8; 9561b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict16x16 = vp8_sixtap_predict16x16; 9571b362b15af34006e6a11974088a46d42b903418eJohann } 9581b362b15af34006e6a11974088a46d42b903418eJohann else 9591b362b15af34006e6a11974088a46d42b903418eJohann { 9601b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict = vp8_bilinear_predict4x4; 9611b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict8x4 = vp8_bilinear_predict8x4; 9621b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict8x8 = vp8_bilinear_predict8x8; 9631b362b15af34006e6a11974088a46d42b903418eJohann xd->subpixel_predict16x16 = vp8_bilinear_predict16x16; 9641b362b15af34006e6a11974088a46d42b903418eJohann } 9651b362b15af34006e6a11974088a46d42b903418eJohann 9661b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->decoded_key_frame && pbi->ec_enabled && !pbi->ec_active) 9671b362b15af34006e6a11974088a46d42b903418eJohann pbi->ec_active = 1; 9681b362b15af34006e6a11974088a46d42b903418eJohann } 9691b362b15af34006e6a11974088a46d42b903418eJohann 9701b362b15af34006e6a11974088a46d42b903418eJohann xd->left_context = &pc->left_context; 9711b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context = pc->mi; 9721b362b15af34006e6a11974088a46d42b903418eJohann xd->frame_type = pc->frame_type; 9731b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mode = DC_PRED; 9741b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_stride = pc->mode_info_stride; 9751b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted = 0; /* init without corruption */ 9761b362b15af34006e6a11974088a46d42b903418eJohann 9771b362b15af34006e6a11974088a46d42b903418eJohann xd->fullpixel_mask = 0xffffffff; 9781b362b15af34006e6a11974088a46d42b903418eJohann if(pc->full_pixel) 9791b362b15af34006e6a11974088a46d42b903418eJohann xd->fullpixel_mask = 0xfffffff8; 9801b362b15af34006e6a11974088a46d42b903418eJohann 9811b362b15af34006e6a11974088a46d42b903418eJohann} 9821b362b15af34006e6a11974088a46d42b903418eJohann 9831b362b15af34006e6a11974088a46d42b903418eJohannint vp8_decode_frame(VP8D_COMP *pbi) 9841b362b15af34006e6a11974088a46d42b903418eJohann{ 985ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp8_reader *const bc = &pbi->mbc[8]; 986ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP8_COMMON *const pc = &pbi->common; 987ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MACROBLOCKD *const xd = &pbi->mb; 988ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *data = pbi->fragments.ptrs[0]; 989ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *data_end = data + pbi->fragments.sizes[0]; 9901b362b15af34006e6a11974088a46d42b903418eJohann ptrdiff_t first_partition_length_in_bytes; 9911b362b15af34006e6a11974088a46d42b903418eJohann 9921b362b15af34006e6a11974088a46d42b903418eJohann int i, j, k, l; 9931b362b15af34006e6a11974088a46d42b903418eJohann const int *const mb_feature_data_bits = vp8_mb_feature_data_bits; 9941b362b15af34006e6a11974088a46d42b903418eJohann int corrupt_tokens = 0; 9951b362b15af34006e6a11974088a46d42b903418eJohann int prev_independent_partitions = pbi->independent_partitions; 9961b362b15af34006e6a11974088a46d42b903418eJohann 9971b362b15af34006e6a11974088a46d42b903418eJohann YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 9981b362b15af34006e6a11974088a46d42b903418eJohann 9991b362b15af34006e6a11974088a46d42b903418eJohann /* start with no corruption of current frame */ 10001b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted = 0; 10011b362b15af34006e6a11974088a46d42b903418eJohann yv12_fb_new->corrupted = 0; 10021b362b15af34006e6a11974088a46d42b903418eJohann 10031b362b15af34006e6a11974088a46d42b903418eJohann if (data_end - data < 3) 10041b362b15af34006e6a11974088a46d42b903418eJohann { 10051b362b15af34006e6a11974088a46d42b903418eJohann if (!pbi->ec_active) 10061b362b15af34006e6a11974088a46d42b903418eJohann { 10071b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 10081b362b15af34006e6a11974088a46d42b903418eJohann "Truncated packet"); 10091b362b15af34006e6a11974088a46d42b903418eJohann } 10101b362b15af34006e6a11974088a46d42b903418eJohann 10111b362b15af34006e6a11974088a46d42b903418eJohann /* Declare the missing frame as an inter frame since it will 10121b362b15af34006e6a11974088a46d42b903418eJohann be handled as an inter frame when we have estimated its 10131b362b15af34006e6a11974088a46d42b903418eJohann motion vectors. */ 10141b362b15af34006e6a11974088a46d42b903418eJohann pc->frame_type = INTER_FRAME; 10151b362b15af34006e6a11974088a46d42b903418eJohann pc->version = 0; 10161b362b15af34006e6a11974088a46d42b903418eJohann pc->show_frame = 1; 10171b362b15af34006e6a11974088a46d42b903418eJohann first_partition_length_in_bytes = 0; 10181b362b15af34006e6a11974088a46d42b903418eJohann } 10191b362b15af34006e6a11974088a46d42b903418eJohann else 10201b362b15af34006e6a11974088a46d42b903418eJohann { 1021ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned char clear_buffer[10]; 1022ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const unsigned char *clear = data; 1023ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->decrypt_cb) 1024ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 10252263fc984bdc858ee931d3e35c87c404de923950Johann int n = (int)VPXMIN(sizeof(clear_buffer), data_end - data); 1026ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->decrypt_cb(pbi->decrypt_state, data, clear_buffer, n); 1027ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang clear = clear_buffer; 1028ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 1029ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1030ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pc->frame_type = (FRAME_TYPE)(clear[0] & 1); 1031ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pc->version = (clear[0] >> 1) & 7; 1032ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pc->show_frame = (clear[0] >> 4) & 1; 10331b362b15af34006e6a11974088a46d42b903418eJohann first_partition_length_in_bytes = 1034ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (clear[0] | (clear[1] << 8) | (clear[2] << 16)) >> 5; 10351b362b15af34006e6a11974088a46d42b903418eJohann 1036ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!pbi->ec_active && 1037ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang (data + first_partition_length_in_bytes > data_end 10381b362b15af34006e6a11974088a46d42b903418eJohann || data + first_partition_length_in_bytes < data)) 10391b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 10401b362b15af34006e6a11974088a46d42b903418eJohann "Truncated packet or corrupt partition 0 length"); 10411b362b15af34006e6a11974088a46d42b903418eJohann 10421b362b15af34006e6a11974088a46d42b903418eJohann data += 3; 1043ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang clear += 3; 10441b362b15af34006e6a11974088a46d42b903418eJohann 10451b362b15af34006e6a11974088a46d42b903418eJohann vp8_setup_version(pc); 10461b362b15af34006e6a11974088a46d42b903418eJohann 10471b362b15af34006e6a11974088a46d42b903418eJohann 10481b362b15af34006e6a11974088a46d42b903418eJohann if (pc->frame_type == KEY_FRAME) 10491b362b15af34006e6a11974088a46d42b903418eJohann { 10501b362b15af34006e6a11974088a46d42b903418eJohann /* vet via sync code */ 10511b362b15af34006e6a11974088a46d42b903418eJohann /* When error concealment is enabled we should only check the sync 10521b362b15af34006e6a11974088a46d42b903418eJohann * code if we have enough bits available 10531b362b15af34006e6a11974088a46d42b903418eJohann */ 10541b362b15af34006e6a11974088a46d42b903418eJohann if (!pbi->ec_active || data + 3 < data_end) 10551b362b15af34006e6a11974088a46d42b903418eJohann { 1056ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (clear[0] != 0x9d || clear[1] != 0x01 || clear[2] != 0x2a) 10571b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_UNSUP_BITSTREAM, 10581b362b15af34006e6a11974088a46d42b903418eJohann "Invalid frame sync code"); 10591b362b15af34006e6a11974088a46d42b903418eJohann } 10601b362b15af34006e6a11974088a46d42b903418eJohann 10611b362b15af34006e6a11974088a46d42b903418eJohann /* If error concealment is enabled we should only parse the new size 10621b362b15af34006e6a11974088a46d42b903418eJohann * if we have enough data. Otherwise we will end up with the wrong 10631b362b15af34006e6a11974088a46d42b903418eJohann * size. 10641b362b15af34006e6a11974088a46d42b903418eJohann */ 10651b362b15af34006e6a11974088a46d42b903418eJohann if (!pbi->ec_active || data + 6 < data_end) 10661b362b15af34006e6a11974088a46d42b903418eJohann { 1067ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pc->Width = (clear[3] | (clear[4] << 8)) & 0x3fff; 1068ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pc->horiz_scale = clear[4] >> 6; 1069ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pc->Height = (clear[5] | (clear[6] << 8)) & 0x3fff; 1070ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pc->vert_scale = clear[6] >> 6; 10711b362b15af34006e6a11974088a46d42b903418eJohann } 10721b362b15af34006e6a11974088a46d42b903418eJohann data += 7; 10731b362b15af34006e6a11974088a46d42b903418eJohann } 10741b362b15af34006e6a11974088a46d42b903418eJohann else 10751b362b15af34006e6a11974088a46d42b903418eJohann { 1076da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(&xd->pre, yv12_fb_new, sizeof(YV12_BUFFER_CONFIG)); 1077da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(&xd->dst, yv12_fb_new, sizeof(YV12_BUFFER_CONFIG)); 10781b362b15af34006e6a11974088a46d42b903418eJohann } 10791b362b15af34006e6a11974088a46d42b903418eJohann } 10801b362b15af34006e6a11974088a46d42b903418eJohann if ((!pbi->decoded_key_frame && pc->frame_type != KEY_FRAME)) 10811b362b15af34006e6a11974088a46d42b903418eJohann { 10821b362b15af34006e6a11974088a46d42b903418eJohann return -1; 10831b362b15af34006e6a11974088a46d42b903418eJohann } 10841b362b15af34006e6a11974088a46d42b903418eJohann 10851b362b15af34006e6a11974088a46d42b903418eJohann init_frame(pbi); 10861b362b15af34006e6a11974088a46d42b903418eJohann 1087ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (vp8dx_start_decode(bc, data, (unsigned int)(data_end - data), 1088ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->decrypt_cb, pbi->decrypt_state)) 10891b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 10901b362b15af34006e6a11974088a46d42b903418eJohann "Failed to allocate bool decoder 0"); 10911b362b15af34006e6a11974088a46d42b903418eJohann if (pc->frame_type == KEY_FRAME) { 109291037db265ecdd914a26e056cf69207b4f50924ehkuang (void)vp8_read_bit(bc); // colorspace 10931b362b15af34006e6a11974088a46d42b903418eJohann pc->clamp_type = (CLAMP_TYPE)vp8_read_bit(bc); 10941b362b15af34006e6a11974088a46d42b903418eJohann } 10951b362b15af34006e6a11974088a46d42b903418eJohann 10961b362b15af34006e6a11974088a46d42b903418eJohann /* Is segmentation enabled */ 10971b362b15af34006e6a11974088a46d42b903418eJohann xd->segmentation_enabled = (unsigned char)vp8_read_bit(bc); 10981b362b15af34006e6a11974088a46d42b903418eJohann 10991b362b15af34006e6a11974088a46d42b903418eJohann if (xd->segmentation_enabled) 11001b362b15af34006e6a11974088a46d42b903418eJohann { 11011b362b15af34006e6a11974088a46d42b903418eJohann /* Signal whether or not the segmentation map is being explicitly updated this frame. */ 11021b362b15af34006e6a11974088a46d42b903418eJohann xd->update_mb_segmentation_map = (unsigned char)vp8_read_bit(bc); 11031b362b15af34006e6a11974088a46d42b903418eJohann xd->update_mb_segmentation_data = (unsigned char)vp8_read_bit(bc); 11041b362b15af34006e6a11974088a46d42b903418eJohann 11051b362b15af34006e6a11974088a46d42b903418eJohann if (xd->update_mb_segmentation_data) 11061b362b15af34006e6a11974088a46d42b903418eJohann { 11071b362b15af34006e6a11974088a46d42b903418eJohann xd->mb_segement_abs_delta = (unsigned char)vp8_read_bit(bc); 11081b362b15af34006e6a11974088a46d42b903418eJohann 1109da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data)); 11101b362b15af34006e6a11974088a46d42b903418eJohann 11111b362b15af34006e6a11974088a46d42b903418eJohann /* For each segmentation feature (Quant and loop filter level) */ 11121b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < MB_LVL_MAX; i++) 11131b362b15af34006e6a11974088a46d42b903418eJohann { 11141b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < MAX_MB_SEGMENTS; j++) 11151b362b15af34006e6a11974088a46d42b903418eJohann { 11161b362b15af34006e6a11974088a46d42b903418eJohann /* Frame level data */ 11171b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) 11181b362b15af34006e6a11974088a46d42b903418eJohann { 11191b362b15af34006e6a11974088a46d42b903418eJohann xd->segment_feature_data[i][j] = (signed char)vp8_read_literal(bc, mb_feature_data_bits[i]); 11201b362b15af34006e6a11974088a46d42b903418eJohann 11211b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) 11221b362b15af34006e6a11974088a46d42b903418eJohann xd->segment_feature_data[i][j] = -xd->segment_feature_data[i][j]; 11231b362b15af34006e6a11974088a46d42b903418eJohann } 11241b362b15af34006e6a11974088a46d42b903418eJohann else 11251b362b15af34006e6a11974088a46d42b903418eJohann xd->segment_feature_data[i][j] = 0; 11261b362b15af34006e6a11974088a46d42b903418eJohann } 11271b362b15af34006e6a11974088a46d42b903418eJohann } 11281b362b15af34006e6a11974088a46d42b903418eJohann } 11291b362b15af34006e6a11974088a46d42b903418eJohann 11301b362b15af34006e6a11974088a46d42b903418eJohann if (xd->update_mb_segmentation_map) 11311b362b15af34006e6a11974088a46d42b903418eJohann { 11321b362b15af34006e6a11974088a46d42b903418eJohann /* Which macro block level features are enabled */ 1133da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs)); 11341b362b15af34006e6a11974088a46d42b903418eJohann 11351b362b15af34006e6a11974088a46d42b903418eJohann /* Read the probs used to decode the segment id for each macro block. */ 11361b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) 11371b362b15af34006e6a11974088a46d42b903418eJohann { 11381b362b15af34006e6a11974088a46d42b903418eJohann /* If not explicitly set value is defaulted to 255 by memset above */ 11391b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) 11401b362b15af34006e6a11974088a46d42b903418eJohann xd->mb_segment_tree_probs[i] = (vp8_prob)vp8_read_literal(bc, 8); 11411b362b15af34006e6a11974088a46d42b903418eJohann } 11421b362b15af34006e6a11974088a46d42b903418eJohann } 11431b362b15af34006e6a11974088a46d42b903418eJohann } 11441b362b15af34006e6a11974088a46d42b903418eJohann else 11451b362b15af34006e6a11974088a46d42b903418eJohann { 11461b362b15af34006e6a11974088a46d42b903418eJohann /* No segmentation updates on this frame */ 11471b362b15af34006e6a11974088a46d42b903418eJohann xd->update_mb_segmentation_map = 0; 11481b362b15af34006e6a11974088a46d42b903418eJohann xd->update_mb_segmentation_data = 0; 11491b362b15af34006e6a11974088a46d42b903418eJohann } 11501b362b15af34006e6a11974088a46d42b903418eJohann 11511b362b15af34006e6a11974088a46d42b903418eJohann /* Read the loop filter level and type */ 11521b362b15af34006e6a11974088a46d42b903418eJohann pc->filter_type = (LOOPFILTERTYPE) vp8_read_bit(bc); 11531b362b15af34006e6a11974088a46d42b903418eJohann pc->filter_level = vp8_read_literal(bc, 6); 11541b362b15af34006e6a11974088a46d42b903418eJohann pc->sharpness_level = vp8_read_literal(bc, 3); 11551b362b15af34006e6a11974088a46d42b903418eJohann 11561b362b15af34006e6a11974088a46d42b903418eJohann /* Read in loop filter deltas applied at the MB level based on mode or ref frame. */ 11571b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_ref_lf_delta_update = 0; 11581b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_ref_lf_delta_enabled = (unsigned char)vp8_read_bit(bc); 11591b362b15af34006e6a11974088a46d42b903418eJohann 11601b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_ref_lf_delta_enabled) 11611b362b15af34006e6a11974088a46d42b903418eJohann { 11621b362b15af34006e6a11974088a46d42b903418eJohann /* Do the deltas need to be updated */ 11631b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_ref_lf_delta_update = (unsigned char)vp8_read_bit(bc); 11641b362b15af34006e6a11974088a46d42b903418eJohann 11651b362b15af34006e6a11974088a46d42b903418eJohann if (xd->mode_ref_lf_delta_update) 11661b362b15af34006e6a11974088a46d42b903418eJohann { 11671b362b15af34006e6a11974088a46d42b903418eJohann /* Send update */ 11681b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < MAX_REF_LF_DELTAS; i++) 11691b362b15af34006e6a11974088a46d42b903418eJohann { 11701b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) 11711b362b15af34006e6a11974088a46d42b903418eJohann { 11721b362b15af34006e6a11974088a46d42b903418eJohann /*sign = vp8_read_bit( bc );*/ 11731b362b15af34006e6a11974088a46d42b903418eJohann xd->ref_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6); 11741b362b15af34006e6a11974088a46d42b903418eJohann 11751b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) /* Apply sign */ 11761b362b15af34006e6a11974088a46d42b903418eJohann xd->ref_lf_deltas[i] = xd->ref_lf_deltas[i] * -1; 11771b362b15af34006e6a11974088a46d42b903418eJohann } 11781b362b15af34006e6a11974088a46d42b903418eJohann } 11791b362b15af34006e6a11974088a46d42b903418eJohann 11801b362b15af34006e6a11974088a46d42b903418eJohann /* Send update */ 11811b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < MAX_MODE_LF_DELTAS; i++) 11821b362b15af34006e6a11974088a46d42b903418eJohann { 11831b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) 11841b362b15af34006e6a11974088a46d42b903418eJohann { 11851b362b15af34006e6a11974088a46d42b903418eJohann /*sign = vp8_read_bit( bc );*/ 11861b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6); 11871b362b15af34006e6a11974088a46d42b903418eJohann 11881b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read_bit(bc)) /* Apply sign */ 11891b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_lf_deltas[i] = xd->mode_lf_deltas[i] * -1; 11901b362b15af34006e6a11974088a46d42b903418eJohann } 11911b362b15af34006e6a11974088a46d42b903418eJohann } 11921b362b15af34006e6a11974088a46d42b903418eJohann } 11931b362b15af34006e6a11974088a46d42b903418eJohann } 11941b362b15af34006e6a11974088a46d42b903418eJohann 11951b362b15af34006e6a11974088a46d42b903418eJohann setup_token_decoder(pbi, data + first_partition_length_in_bytes); 11961b362b15af34006e6a11974088a46d42b903418eJohann 11971b362b15af34006e6a11974088a46d42b903418eJohann xd->current_bc = &pbi->mbc[0]; 11981b362b15af34006e6a11974088a46d42b903418eJohann 11991b362b15af34006e6a11974088a46d42b903418eJohann /* Read the default quantizers. */ 12001b362b15af34006e6a11974088a46d42b903418eJohann { 12011b362b15af34006e6a11974088a46d42b903418eJohann int Q, q_update; 12021b362b15af34006e6a11974088a46d42b903418eJohann 12031b362b15af34006e6a11974088a46d42b903418eJohann Q = vp8_read_literal(bc, 7); /* AC 1st order Q = default */ 12041b362b15af34006e6a11974088a46d42b903418eJohann pc->base_qindex = Q; 12051b362b15af34006e6a11974088a46d42b903418eJohann q_update = 0; 12061b362b15af34006e6a11974088a46d42b903418eJohann pc->y1dc_delta_q = get_delta_q(bc, pc->y1dc_delta_q, &q_update); 12071b362b15af34006e6a11974088a46d42b903418eJohann pc->y2dc_delta_q = get_delta_q(bc, pc->y2dc_delta_q, &q_update); 12081b362b15af34006e6a11974088a46d42b903418eJohann pc->y2ac_delta_q = get_delta_q(bc, pc->y2ac_delta_q, &q_update); 12091b362b15af34006e6a11974088a46d42b903418eJohann pc->uvdc_delta_q = get_delta_q(bc, pc->uvdc_delta_q, &q_update); 12101b362b15af34006e6a11974088a46d42b903418eJohann pc->uvac_delta_q = get_delta_q(bc, pc->uvac_delta_q, &q_update); 12111b362b15af34006e6a11974088a46d42b903418eJohann 12121b362b15af34006e6a11974088a46d42b903418eJohann if (q_update) 12131b362b15af34006e6a11974088a46d42b903418eJohann vp8cx_init_de_quantizer(pbi); 12141b362b15af34006e6a11974088a46d42b903418eJohann 12151b362b15af34006e6a11974088a46d42b903418eJohann /* MB level dequantizer setup */ 12161b362b15af34006e6a11974088a46d42b903418eJohann vp8_mb_init_dequantizer(pbi, &pbi->mb); 12171b362b15af34006e6a11974088a46d42b903418eJohann } 12181b362b15af34006e6a11974088a46d42b903418eJohann 12191b362b15af34006e6a11974088a46d42b903418eJohann /* Determine if the golden frame or ARF buffer should be updated and how. 12201b362b15af34006e6a11974088a46d42b903418eJohann * For all non key frames the GF and ARF refresh flags and sign bias 12211b362b15af34006e6a11974088a46d42b903418eJohann * flags must be set explicitly. 12221b362b15af34006e6a11974088a46d42b903418eJohann */ 12231b362b15af34006e6a11974088a46d42b903418eJohann if (pc->frame_type != KEY_FRAME) 12241b362b15af34006e6a11974088a46d42b903418eJohann { 12251b362b15af34006e6a11974088a46d42b903418eJohann /* Should the GF or ARF be updated from the current frame */ 12261b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_golden_frame = vp8_read_bit(bc); 12271b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 12281b362b15af34006e6a11974088a46d42b903418eJohann /* Assume we shouldn't refresh golden if the bit is missing */ 12291b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(bc); 12301b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && xd->corrupted) 12311b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_golden_frame = 0; 12321b362b15af34006e6a11974088a46d42b903418eJohann#endif 12331b362b15af34006e6a11974088a46d42b903418eJohann 12341b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_alt_ref_frame = vp8_read_bit(bc); 12351b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 12361b362b15af34006e6a11974088a46d42b903418eJohann /* Assume we shouldn't refresh altref if the bit is missing */ 12371b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(bc); 12381b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && xd->corrupted) 12391b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_alt_ref_frame = 0; 12401b362b15af34006e6a11974088a46d42b903418eJohann#endif 12411b362b15af34006e6a11974088a46d42b903418eJohann 12421b362b15af34006e6a11974088a46d42b903418eJohann /* Buffer to buffer copy flags. */ 12431b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_gf = 0; 12441b362b15af34006e6a11974088a46d42b903418eJohann 12451b362b15af34006e6a11974088a46d42b903418eJohann if (!pc->refresh_golden_frame) 12461b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_gf = vp8_read_literal(bc, 2); 12471b362b15af34006e6a11974088a46d42b903418eJohann 12481b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 12491b362b15af34006e6a11974088a46d42b903418eJohann /* Assume we shouldn't copy to the golden if the bit is missing */ 12501b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(bc); 12511b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && xd->corrupted) 12521b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_gf = 0; 12531b362b15af34006e6a11974088a46d42b903418eJohann#endif 12541b362b15af34006e6a11974088a46d42b903418eJohann 12551b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_arf = 0; 12561b362b15af34006e6a11974088a46d42b903418eJohann 12571b362b15af34006e6a11974088a46d42b903418eJohann if (!pc->refresh_alt_ref_frame) 12581b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_arf = vp8_read_literal(bc, 2); 12591b362b15af34006e6a11974088a46d42b903418eJohann 12601b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 12611b362b15af34006e6a11974088a46d42b903418eJohann /* Assume we shouldn't copy to the alt-ref if the bit is missing */ 12621b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(bc); 12631b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && xd->corrupted) 12641b362b15af34006e6a11974088a46d42b903418eJohann pc->copy_buffer_to_arf = 0; 12651b362b15af34006e6a11974088a46d42b903418eJohann#endif 12661b362b15af34006e6a11974088a46d42b903418eJohann 12671b362b15af34006e6a11974088a46d42b903418eJohann 12681b362b15af34006e6a11974088a46d42b903418eJohann pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp8_read_bit(bc); 12691b362b15af34006e6a11974088a46d42b903418eJohann pc->ref_frame_sign_bias[ALTREF_FRAME] = vp8_read_bit(bc); 12701b362b15af34006e6a11974088a46d42b903418eJohann } 12711b362b15af34006e6a11974088a46d42b903418eJohann 12721b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_entropy_probs = vp8_read_bit(bc); 12731b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 12741b362b15af34006e6a11974088a46d42b903418eJohann /* Assume we shouldn't refresh the probabilities if the bit is 12751b362b15af34006e6a11974088a46d42b903418eJohann * missing */ 12761b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(bc); 12771b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && xd->corrupted) 12781b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_entropy_probs = 0; 12791b362b15af34006e6a11974088a46d42b903418eJohann#endif 12801b362b15af34006e6a11974088a46d42b903418eJohann if (pc->refresh_entropy_probs == 0) 12811b362b15af34006e6a11974088a46d42b903418eJohann { 1282da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc)); 12831b362b15af34006e6a11974088a46d42b903418eJohann } 12841b362b15af34006e6a11974088a46d42b903418eJohann 12851b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_last_frame = pc->frame_type == KEY_FRAME || vp8_read_bit(bc); 12861b362b15af34006e6a11974088a46d42b903418eJohann 12871b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 12881b362b15af34006e6a11974088a46d42b903418eJohann /* Assume we should refresh the last frame if the bit is missing */ 12891b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(bc); 12901b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && xd->corrupted) 12911b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_last_frame = 1; 12921b362b15af34006e6a11974088a46d42b903418eJohann#endif 12931b362b15af34006e6a11974088a46d42b903418eJohann 12941b362b15af34006e6a11974088a46d42b903418eJohann if (0) 12951b362b15af34006e6a11974088a46d42b903418eJohann { 12961b362b15af34006e6a11974088a46d42b903418eJohann FILE *z = fopen("decodestats.stt", "a"); 12971b362b15af34006e6a11974088a46d42b903418eJohann fprintf(z, "%6d F:%d,G:%d,A:%d,L:%d,Q:%d\n", 12981b362b15af34006e6a11974088a46d42b903418eJohann pc->current_video_frame, 12991b362b15af34006e6a11974088a46d42b903418eJohann pc->frame_type, 13001b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_golden_frame, 13011b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_alt_ref_frame, 13021b362b15af34006e6a11974088a46d42b903418eJohann pc->refresh_last_frame, 13031b362b15af34006e6a11974088a46d42b903418eJohann pc->base_qindex); 13041b362b15af34006e6a11974088a46d42b903418eJohann fclose(z); 13051b362b15af34006e6a11974088a46d42b903418eJohann } 13061b362b15af34006e6a11974088a46d42b903418eJohann 13071b362b15af34006e6a11974088a46d42b903418eJohann { 13081b362b15af34006e6a11974088a46d42b903418eJohann pbi->independent_partitions = 1; 13091b362b15af34006e6a11974088a46d42b903418eJohann 13101b362b15af34006e6a11974088a46d42b903418eJohann /* read coef probability tree */ 13111b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < BLOCK_TYPES; i++) 13121b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < COEF_BANDS; j++) 13131b362b15af34006e6a11974088a46d42b903418eJohann for (k = 0; k < PREV_COEF_CONTEXTS; k++) 13141b362b15af34006e6a11974088a46d42b903418eJohann for (l = 0; l < ENTROPY_NODES; l++) 13151b362b15af34006e6a11974088a46d42b903418eJohann { 13161b362b15af34006e6a11974088a46d42b903418eJohann 13171b362b15af34006e6a11974088a46d42b903418eJohann vp8_prob *const p = pc->fc.coef_probs [i][j][k] + l; 13181b362b15af34006e6a11974088a46d42b903418eJohann 13191b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_read(bc, vp8_coef_update_probs [i][j][k][l])) 13201b362b15af34006e6a11974088a46d42b903418eJohann { 13211b362b15af34006e6a11974088a46d42b903418eJohann *p = (vp8_prob)vp8_read_literal(bc, 8); 13221b362b15af34006e6a11974088a46d42b903418eJohann 13231b362b15af34006e6a11974088a46d42b903418eJohann } 13241b362b15af34006e6a11974088a46d42b903418eJohann if (k > 0 && *p != pc->fc.coef_probs[i][j][k-1][l]) 13251b362b15af34006e6a11974088a46d42b903418eJohann pbi->independent_partitions = 0; 13261b362b15af34006e6a11974088a46d42b903418eJohann 13271b362b15af34006e6a11974088a46d42b903418eJohann } 13281b362b15af34006e6a11974088a46d42b903418eJohann } 13291b362b15af34006e6a11974088a46d42b903418eJohann 13301b362b15af34006e6a11974088a46d42b903418eJohann /* clear out the coeff buffer */ 1331da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); 13321b362b15af34006e6a11974088a46d42b903418eJohann 13331b362b15af34006e6a11974088a46d42b903418eJohann vp8_decode_mode_mvs(pbi); 13341b362b15af34006e6a11974088a46d42b903418eJohann 13351b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 13361b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->ec_active && 13371b362b15af34006e6a11974088a46d42b903418eJohann pbi->mvs_corrupt_from_mb < (unsigned int)pc->mb_cols * pc->mb_rows) 13381b362b15af34006e6a11974088a46d42b903418eJohann { 13391b362b15af34006e6a11974088a46d42b903418eJohann /* Motion vectors are missing in this frame. We will try to estimate 13401b362b15af34006e6a11974088a46d42b903418eJohann * them and then continue decoding the frame as usual */ 13411b362b15af34006e6a11974088a46d42b903418eJohann vp8_estimate_missing_mvs(pbi); 13421b362b15af34006e6a11974088a46d42b903418eJohann } 13431b362b15af34006e6a11974088a46d42b903418eJohann#endif 13441b362b15af34006e6a11974088a46d42b903418eJohann 1345da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols); 13461b362b15af34006e6a11974088a46d42b903418eJohann pbi->frame_corrupt_residual = 0; 13471b362b15af34006e6a11974088a46d42b903418eJohann 13481b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD 13491b362b15af34006e6a11974088a46d42b903418eJohann if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION) 13501b362b15af34006e6a11974088a46d42b903418eJohann { 1351ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang unsigned int thread; 13521b362b15af34006e6a11974088a46d42b903418eJohann vp8mt_decode_mb_rows(pbi, xd); 13531b362b15af34006e6a11974088a46d42b903418eJohann vp8_yv12_extend_frame_borders(yv12_fb_new); 1354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (thread = 0; thread < pbi->decoding_thread_count; ++thread) 1355ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang corrupt_tokens |= pbi->mb_row_di[thread].mbd.corrupted; 13561b362b15af34006e6a11974088a46d42b903418eJohann } 13571b362b15af34006e6a11974088a46d42b903418eJohann else 13581b362b15af34006e6a11974088a46d42b903418eJohann#endif 13591b362b15af34006e6a11974088a46d42b903418eJohann { 13601b362b15af34006e6a11974088a46d42b903418eJohann decode_mb_rows(pbi); 13611b362b15af34006e6a11974088a46d42b903418eJohann corrupt_tokens |= xd->corrupted; 13621b362b15af34006e6a11974088a46d42b903418eJohann } 13631b362b15af34006e6a11974088a46d42b903418eJohann 13641b362b15af34006e6a11974088a46d42b903418eJohann /* Collect information about decoder corruption. */ 13651b362b15af34006e6a11974088a46d42b903418eJohann /* 1. Check first boolean decoder for errors. */ 13661b362b15af34006e6a11974088a46d42b903418eJohann yv12_fb_new->corrupted = vp8dx_bool_error(bc); 13671b362b15af34006e6a11974088a46d42b903418eJohann /* 2. Check the macroblock information */ 13681b362b15af34006e6a11974088a46d42b903418eJohann yv12_fb_new->corrupted |= corrupt_tokens; 13691b362b15af34006e6a11974088a46d42b903418eJohann 13701b362b15af34006e6a11974088a46d42b903418eJohann if (!pbi->decoded_key_frame) 13711b362b15af34006e6a11974088a46d42b903418eJohann { 13721b362b15af34006e6a11974088a46d42b903418eJohann if (pc->frame_type == KEY_FRAME && 13731b362b15af34006e6a11974088a46d42b903418eJohann !yv12_fb_new->corrupted) 13741b362b15af34006e6a11974088a46d42b903418eJohann pbi->decoded_key_frame = 1; 13751b362b15af34006e6a11974088a46d42b903418eJohann else 13761b362b15af34006e6a11974088a46d42b903418eJohann vpx_internal_error(&pbi->common.error, VPX_CODEC_CORRUPT_FRAME, 13771b362b15af34006e6a11974088a46d42b903418eJohann "A stream must start with a complete key frame"); 13781b362b15af34006e6a11974088a46d42b903418eJohann } 13791b362b15af34006e6a11974088a46d42b903418eJohann 13801b362b15af34006e6a11974088a46d42b903418eJohann /* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes \n",bc->pos+pbi->bc2.pos); */ 13811b362b15af34006e6a11974088a46d42b903418eJohann 13821b362b15af34006e6a11974088a46d42b903418eJohann if (pc->refresh_entropy_probs == 0) 13831b362b15af34006e6a11974088a46d42b903418eJohann { 1384da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian memcpy(&pc->fc, &pc->lfc, sizeof(pc->fc)); 13851b362b15af34006e6a11974088a46d42b903418eJohann pbi->independent_partitions = prev_independent_partitions; 13861b362b15af34006e6a11974088a46d42b903418eJohann } 13871b362b15af34006e6a11974088a46d42b903418eJohann 13881b362b15af34006e6a11974088a46d42b903418eJohann#ifdef PACKET_TESTING 13891b362b15af34006e6a11974088a46d42b903418eJohann { 13901b362b15af34006e6a11974088a46d42b903418eJohann FILE *f = fopen("decompressor.VP8", "ab"); 13911b362b15af34006e6a11974088a46d42b903418eJohann unsigned int size = pbi->bc2.pos + pbi->bc.pos + 8; 13921b362b15af34006e6a11974088a46d42b903418eJohann fwrite((void *) &size, 4, 1, f); 13931b362b15af34006e6a11974088a46d42b903418eJohann fwrite((void *) pbi->Source, size, 1, f); 13941b362b15af34006e6a11974088a46d42b903418eJohann fclose(f); 13951b362b15af34006e6a11974088a46d42b903418eJohann } 13961b362b15af34006e6a11974088a46d42b903418eJohann#endif 13971b362b15af34006e6a11974088a46d42b903418eJohann 13981b362b15af34006e6a11974088a46d42b903418eJohann return 0; 13991b362b15af34006e6a11974088a46d42b903418eJohann} 1400