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#include "vpx_config.h" 12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp8_rtcd.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_scale_rtcd.h" 141b362b15af34006e6a11974088a46d42b903418eJohann#include "onyxd_int.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/header.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconintra4x4.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconinter.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "detokenize.h" 19ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp8/common/common.h" 201b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/invtrans.h" 211b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/alloccommon.h" 221b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/entropymode.h" 231b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/quant_common.h" 24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_scale/vpx_scale.h" 25c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#include "vp8/common/reconintra.h" 261b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/setupintrarecon.h" 271b362b15af34006e6a11974088a46d42b903418eJohann 281b362b15af34006e6a11974088a46d42b903418eJohann#include "decodemv.h" 291b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/extend.h" 301b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 311b362b15af34006e6a11974088a46d42b903418eJohann#include "error_concealment.h" 321b362b15af34006e6a11974088a46d42b903418eJohann#endif 331b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 341b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/threading.h" 351b362b15af34006e6a11974088a46d42b903418eJohann#include "decoderthreading.h" 361b362b15af34006e6a11974088a46d42b903418eJohann#include "dboolhuff.h" 37c927526be9a7b72fb5edb3f29c4e8ceabe0ec98aJohann#include "vpx_dsp/vpx_dsp_common.h" 381b362b15af34006e6a11974088a46d42b903418eJohann 391b362b15af34006e6a11974088a46d42b903418eJohann#include <assert.h> 401b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 411b362b15af34006e6a11974088a46d42b903418eJohann 427bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8cx_init_de_quantizer(VP8D_COMP *pbi) { 437bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q; 447bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8_COMMON *const pc = &pbi->common; 451b362b15af34006e6a11974088a46d42b903418eJohann 467bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (Q = 0; Q < QINDEX_RANGE; ++Q) { 477bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->Y1dequant[Q][0] = (short)vp8_dc_quant(Q, pc->y1dc_delta_q); 487bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->Y2dequant[Q][0] = (short)vp8_dc2quant(Q, pc->y2dc_delta_q); 497bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->UVdequant[Q][0] = (short)vp8_dc_uv_quant(Q, pc->uvdc_delta_q); 501b362b15af34006e6a11974088a46d42b903418eJohann 517bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->Y1dequant[Q][1] = (short)vp8_ac_yquant(Q); 527bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->Y2dequant[Q][1] = (short)vp8_ac2quant(Q, pc->y2ac_delta_q); 537bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->UVdequant[Q][1] = (short)vp8_ac_uv_quant(Q, pc->uvac_delta_q); 547bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 551b362b15af34006e6a11974088a46d42b903418eJohann} 561b362b15af34006e6a11974088a46d42b903418eJohann 577bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_mb_init_dequantizer(VP8D_COMP *pbi, MACROBLOCKD *xd) { 587bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 597bc9febe8749e98a3812a0dc4380ceae75c29450Johann int QIndex; 607bc9febe8749e98a3812a0dc4380ceae75c29450Johann MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; 617bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8_COMMON *const pc = &pbi->common; 627bc9febe8749e98a3812a0dc4380ceae75c29450Johann 637bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Decide whether to use the default or alternate baseline Q value. */ 647bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->segmentation_enabled) { 657bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Abs Value */ 667bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA) { 677bc9febe8749e98a3812a0dc4380ceae75c29450Johann QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id]; 687bc9febe8749e98a3812a0dc4380ceae75c29450Johann 697bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Delta Value */ 707bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 717bc9febe8749e98a3812a0dc4380ceae75c29450Johann QIndex = pc->base_qindex + 727bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id]; 731b362b15af34006e6a11974088a46d42b903418eJohann } 747bc9febe8749e98a3812a0dc4380ceae75c29450Johann 757bc9febe8749e98a3812a0dc4380ceae75c29450Johann QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) 767bc9febe8749e98a3812a0dc4380ceae75c29450Johann : 0; /* Clamp to valid range */ 777bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 787bc9febe8749e98a3812a0dc4380ceae75c29450Johann QIndex = pc->base_qindex; 797bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 807bc9febe8749e98a3812a0dc4380ceae75c29450Johann 817bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Set up the macroblock dequant constants */ 827bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dequant_y1_dc[0] = 1; 837bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dequant_y1[0] = pc->Y1dequant[QIndex][0]; 847bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dequant_y2[0] = pc->Y2dequant[QIndex][0]; 857bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dequant_uv[0] = pc->UVdequant[QIndex][0]; 867bc9febe8749e98a3812a0dc4380ceae75c29450Johann 877bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 1; i < 16; ++i) { 887bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dequant_y1_dc[i] = xd->dequant_y1[i] = pc->Y1dequant[QIndex][1]; 897bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dequant_y2[i] = pc->Y2dequant[QIndex][1]; 907bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dequant_uv[i] = pc->UVdequant[QIndex][1]; 917bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 921b362b15af34006e6a11974088a46d42b903418eJohann} 931b362b15af34006e6a11974088a46d42b903418eJohann 941b362b15af34006e6a11974088a46d42b903418eJohannstatic void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, 957bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int mb_idx) { 967bc9febe8749e98a3812a0dc4380ceae75c29450Johann MB_PREDICTION_MODE mode; 977bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 981b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 997bc9febe8749e98a3812a0dc4380ceae75c29450Johann int corruption_detected = 0; 1007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else 1017bc9febe8749e98a3812a0dc4380ceae75c29450Johann (void)mb_idx; 1021b362b15af34006e6a11974088a46d42b903418eJohann#endif 1031b362b15af34006e6a11974088a46d42b903418eJohann 1047bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->mode_info_context->mbmi.mb_skip_coeff) { 1057bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_reset_mb_tokens_context(xd); 1067bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (!vp8dx_bool_error(xd->current_bc)) { 1077bc9febe8749e98a3812a0dc4380ceae75c29450Johann int eobtotal; 1087bc9febe8749e98a3812a0dc4380ceae75c29450Johann eobtotal = vp8_decode_mb_tokens(pbi, xd); 1091b362b15af34006e6a11974088a46d42b903418eJohann 1107bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Special case: Force the loopfilter to skip when eobtotal is zero */ 1117bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_info_context->mbmi.mb_skip_coeff = (eobtotal == 0); 1127bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1131b362b15af34006e6a11974088a46d42b903418eJohann 1147bc9febe8749e98a3812a0dc4380ceae75c29450Johann mode = xd->mode_info_context->mbmi.mode; 1151b362b15af34006e6a11974088a46d42b903418eJohann 1167bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->segmentation_enabled) vp8_mb_init_dequantizer(pbi, xd); 1171b362b15af34006e6a11974088a46d42b903418eJohann 1181b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 1191b362b15af34006e6a11974088a46d42b903418eJohann 1207bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active) { 1217bc9febe8749e98a3812a0dc4380ceae75c29450Johann int throw_residual; 1227bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* When we have independent partitions we can apply residual even 1237bc9febe8749e98a3812a0dc4380ceae75c29450Johann * though other partitions within the frame are corrupt. 1247bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 1257bc9febe8749e98a3812a0dc4380ceae75c29450Johann throw_residual = 1267bc9febe8749e98a3812a0dc4380ceae75c29450Johann (!pbi->independent_partitions && pbi->frame_corrupt_residual); 1277bc9febe8749e98a3812a0dc4380ceae75c29450Johann throw_residual = (throw_residual || vp8dx_bool_error(xd->current_bc)); 1287bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1297bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((mb_idx >= pbi->mvs_corrupt_from_mb || throw_residual)) { 1307bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* MB with corrupt residuals or corrupt mode/motion vectors. 1317bc9febe8749e98a3812a0dc4380ceae75c29450Johann * Better to use the predictor as reconstruction. 1327bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 1337bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->frame_corrupt_residual = 1; 1347bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); 1357bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1367bc9febe8749e98a3812a0dc4380ceae75c29450Johann corruption_detected = 1; 1377bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1387bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* force idct to be skipped for B_PRED and use the 1397bc9febe8749e98a3812a0dc4380ceae75c29450Johann * prediction only for reconstruction 1407bc9febe8749e98a3812a0dc4380ceae75c29450Johann * */ 1417bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->eobs, 0, 25); 1421b362b15af34006e6a11974088a46d42b903418eJohann } 1437bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1441b362b15af34006e6a11974088a46d42b903418eJohann#endif 1451b362b15af34006e6a11974088a46d42b903418eJohann 1467bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* do prediction */ 1477bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) { 1487bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_build_intra_predictors_mbuv_s( 1497bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd, xd->recon_above[1], xd->recon_above[2], xd->recon_left[1], 1507bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[2], xd->recon_left_stride[1], xd->dst.u_buffer, 1517bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.v_buffer, xd->dst.uv_stride); 1527bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1537bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (mode != B_PRED) { 1547bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_build_intra_predictors_mby_s( 1557bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd, xd->recon_above[0], xd->recon_left[0], xd->recon_left_stride[0], 1567bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.y_buffer, xd->dst.y_stride); 1577bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 1587bc9febe8749e98a3812a0dc4380ceae75c29450Johann short *DQC = xd->dequant_y1; 1597bc9febe8749e98a3812a0dc4380ceae75c29450Johann int dst_stride = xd->dst.y_stride; 1607bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1617bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* clear out residual eob info */ 1627bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->mode_info_context->mbmi.mb_skip_coeff) memset(xd->eobs, 0, 25); 1637bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1647bc9febe8749e98a3812a0dc4380ceae75c29450Johann intra_prediction_down_copy(xd, xd->recon_above[0] + 16); 1657bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 16; ++i) { 1677bc9febe8749e98a3812a0dc4380ceae75c29450Johann BLOCKD *b = &xd->block[i]; 1687bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *dst = xd->dst.y_buffer + b->offset; 1697bc9febe8749e98a3812a0dc4380ceae75c29450Johann B_PREDICTION_MODE b_mode = xd->mode_info_context->bmi[i].as_mode; 1707bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *Above = dst - dst_stride; 1717bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *yleft = dst - 1; 1727bc9febe8749e98a3812a0dc4380ceae75c29450Johann int left_stride = dst_stride; 1737bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char top_left = Above[-1]; 1747bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1757bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_intra4x4_predict(Above, yleft, left_stride, b_mode, dst, dst_stride, 1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann top_left); 1777bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->eobs[i]) { 1797bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->eobs[i] > 1) { 1807bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_dequant_idct_add(b->qcoeff, DQC, dst, dst_stride); 1817bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_dc_only_idct_add(b->qcoeff[0] * DQC[0], dst, dst_stride, dst, 1837bc9febe8749e98a3812a0dc4380ceae75c29450Johann dst_stride); 1847bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 1857bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1861b362b15af34006e6a11974088a46d42b903418eJohann } 1877bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1881b362b15af34006e6a11974088a46d42b903418eJohann } 1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 1907bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_build_inter_predictors_mb(xd); 1917bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1921b362b15af34006e6a11974088a46d42b903418eJohann 1931b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 1947bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (corruption_detected) { 1957bc9febe8749e98a3812a0dc4380ceae75c29450Johann return; 1967bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 1971b362b15af34006e6a11974088a46d42b903418eJohann#endif 1981b362b15af34006e6a11974088a46d42b903418eJohann 1997bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!xd->mode_info_context->mbmi.mb_skip_coeff) { 2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* dequantization and idct */ 2017bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (mode != B_PRED) { 2027bc9febe8749e98a3812a0dc4380ceae75c29450Johann short *DQC = xd->dequant_y1; 2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2047bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (mode != SPLITMV) { 2057bc9febe8749e98a3812a0dc4380ceae75c29450Johann BLOCKD *b = &xd->block[24]; 2061b362b15af34006e6a11974088a46d42b903418eJohann 2077bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* do 2nd order transform on the dc block */ 2087bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->eobs[24] > 1) { 2097bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_dequantize_b(b, xd->dequant_y2); 2107bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2117bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_short_inv_walsh4x4(&b->dqcoeff[0], xd->qcoeff); 2127bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(b->qcoeff, 0, 16 * sizeof(b->qcoeff[0])); 2137bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 2147bc9febe8749e98a3812a0dc4380ceae75c29450Johann b->dqcoeff[0] = b->qcoeff[0] * xd->dequant_y2[0]; 2157bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_short_inv_walsh4x4_1(&b->dqcoeff[0], xd->qcoeff); 2167bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(b->qcoeff, 0, 2 * sizeof(b->qcoeff[0])); 2171b362b15af34006e6a11974088a46d42b903418eJohann } 2181b362b15af34006e6a11974088a46d42b903418eJohann 2197bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* override the dc dequant constant in order to preserve the 2207bc9febe8749e98a3812a0dc4380ceae75c29450Johann * dc components 2217bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 2227bc9febe8749e98a3812a0dc4380ceae75c29450Johann DQC = xd->dequant_y1_dc; 2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2247bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2257bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_dequant_idct_add_y_block(xd->qcoeff, DQC, xd->dst.y_buffer, 2267bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.y_stride, xd->eobs); 2271b362b15af34006e6a11974088a46d42b903418eJohann } 2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2297bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_dequant_idct_add_uv_block(xd->qcoeff + 16 * 16, xd->dequant_uv, 2307bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.u_buffer, xd->dst.v_buffer, 2317bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.uv_stride, xd->eobs + 16); 2327bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2331b362b15af34006e6a11974088a46d42b903418eJohann} 2341b362b15af34006e6a11974088a46d42b903418eJohann 2357bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int get_delta_q(vp8_reader *bc, int prev, int *q_update) { 2367bc9febe8749e98a3812a0dc4380ceae75c29450Johann int ret_val = 0; 2371b362b15af34006e6a11974088a46d42b903418eJohann 2387bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { 2397bc9febe8749e98a3812a0dc4380ceae75c29450Johann ret_val = vp8_read_literal(bc, 4); 2401b362b15af34006e6a11974088a46d42b903418eJohann 2417bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) ret_val = -ret_val; 2427bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2431b362b15af34006e6a11974088a46d42b903418eJohann 2447bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Trigger a quantizer update if the delta-q value has changed */ 2457bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (ret_val != prev) *q_update = 1; 2461b362b15af34006e6a11974088a46d42b903418eJohann 2477bc9febe8749e98a3812a0dc4380ceae75c29450Johann return ret_val; 2481b362b15af34006e6a11974088a46d42b903418eJohann} 2491b362b15af34006e6a11974088a46d42b903418eJohann 2501b362b15af34006e6a11974088a46d42b903418eJohann#ifdef PACKET_TESTING 2511b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 2521b362b15af34006e6a11974088a46d42b903418eJohannFILE *vpxlog = 0; 2531b362b15af34006e6a11974088a46d42b903418eJohann#endif 2541b362b15af34006e6a11974088a46d42b903418eJohann 2557bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void yv12_extend_frame_top_c(YV12_BUFFER_CONFIG *ybf) { 2567bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 2577bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *src_ptr1; 2587bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *dest_ptr1; 2597bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2607bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int Border; 2617bc9febe8749e98a3812a0dc4380ceae75c29450Johann int plane_stride; 2627bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2637bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 2647bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Y Plane */ 2657bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 2667bc9febe8749e98a3812a0dc4380ceae75c29450Johann Border = ybf->border; 2677bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_stride = ybf->y_stride; 2687bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = ybf->y_buffer - Border; 2697bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 = src_ptr1 - (Border * plane_stride); 2707bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2717bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < (int)Border; ++i) { 2727bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(dest_ptr1, src_ptr1, plane_stride); 2737bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 += plane_stride; 2747bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2751b362b15af34006e6a11974088a46d42b903418eJohann 2767bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 2777bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* U Plane */ 2787bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 2797bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_stride = ybf->uv_stride; 2807bc9febe8749e98a3812a0dc4380ceae75c29450Johann Border /= 2; 2817bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = ybf->u_buffer - Border; 2827bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 = src_ptr1 - (Border * plane_stride); 2837bc9febe8749e98a3812a0dc4380ceae75c29450Johann 2847bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < (int)(Border); ++i) { 2857bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(dest_ptr1, src_ptr1, plane_stride); 2867bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 += plane_stride; 2877bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2881b362b15af34006e6a11974088a46d42b903418eJohann 2897bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 2907bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* V Plane */ 2917bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 2921b362b15af34006e6a11974088a46d42b903418eJohann 2937bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = ybf->v_buffer - Border; 2947bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 = src_ptr1 - (Border * plane_stride); 2951b362b15af34006e6a11974088a46d42b903418eJohann 2967bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < (int)(Border); ++i) { 2977bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(dest_ptr1, src_ptr1, plane_stride); 2987bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 += plane_stride; 2997bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3001b362b15af34006e6a11974088a46d42b903418eJohann} 3011b362b15af34006e6a11974088a46d42b903418eJohann 3027bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void yv12_extend_frame_bottom_c(YV12_BUFFER_CONFIG *ybf) { 3037bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 3047bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *src_ptr1, *src_ptr2; 3057bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *dest_ptr2; 3067bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3077bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int Border; 3087bc9febe8749e98a3812a0dc4380ceae75c29450Johann int plane_stride; 3097bc9febe8749e98a3812a0dc4380ceae75c29450Johann int plane_height; 3107bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3117bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3127bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Y Plane */ 3137bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3147bc9febe8749e98a3812a0dc4380ceae75c29450Johann Border = ybf->border; 3157bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_stride = ybf->y_stride; 3167bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_height = ybf->y_height; 3177bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3187bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = ybf->y_buffer - Border; 3197bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 3207bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 = src_ptr2 + plane_stride; 3217bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3227bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < (int)Border; ++i) { 3237bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(dest_ptr2, src_ptr2, plane_stride); 3247bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 += plane_stride; 3257bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3261b362b15af34006e6a11974088a46d42b903418eJohann 3277bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3287bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* U Plane */ 3297bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3307bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_stride = ybf->uv_stride; 3317bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_height = ybf->uv_height; 3327bc9febe8749e98a3812a0dc4380ceae75c29450Johann Border /= 2; 3331b362b15af34006e6a11974088a46d42b903418eJohann 3347bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = ybf->u_buffer - Border; 3357bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 3367bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 = src_ptr2 + plane_stride; 3371b362b15af34006e6a11974088a46d42b903418eJohann 3387bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < (int)(Border); ++i) { 3397bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(dest_ptr2, src_ptr2, plane_stride); 3407bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 += plane_stride; 3417bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3421b362b15af34006e6a11974088a46d42b903418eJohann 3437bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3447bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* V Plane */ 3457bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3461b362b15af34006e6a11974088a46d42b903418eJohann 3477bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = ybf->v_buffer - Border; 3487bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 = src_ptr1 + (plane_height * plane_stride) - plane_stride; 3497bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 = src_ptr2 + plane_stride; 3501b362b15af34006e6a11974088a46d42b903418eJohann 3517bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < (int)(Border); ++i) { 3527bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(dest_ptr2, src_ptr2, plane_stride); 3537bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 += plane_stride; 3547bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3551b362b15af34006e6a11974088a46d42b903418eJohann} 3561b362b15af34006e6a11974088a46d42b903418eJohann 3571b362b15af34006e6a11974088a46d42b903418eJohannstatic void yv12_extend_frame_left_right_c(YV12_BUFFER_CONFIG *ybf, 3581b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *y_src, 3591b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *u_src, 3607bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *v_src) { 3617bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 3627bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *src_ptr1, *src_ptr2; 3637bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *dest_ptr1, *dest_ptr2; 3647bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3657bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int Border; 3667bc9febe8749e98a3812a0dc4380ceae75c29450Johann int plane_stride; 3677bc9febe8749e98a3812a0dc4380ceae75c29450Johann int plane_height; 3687bc9febe8749e98a3812a0dc4380ceae75c29450Johann int plane_width; 3697bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3707bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3717bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Y Plane */ 3727bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3737bc9febe8749e98a3812a0dc4380ceae75c29450Johann Border = ybf->border; 3747bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_stride = ybf->y_stride; 3757bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_height = 16; 3767bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_width = ybf->y_width; 3777bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3787bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* copy the left and right most columns out */ 3797bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = y_src; 3807bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 = src_ptr1 + plane_width - 1; 3817bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 = src_ptr1 - Border; 3827bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 = src_ptr2 + 1; 3837bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3847bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < plane_height; ++i) { 3857bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(dest_ptr1, src_ptr1[0], Border); 3867bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(dest_ptr2, src_ptr2[0], Border); 3877bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 += plane_stride; 3887bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 += plane_stride; 3897bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 += plane_stride; 3907bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 += plane_stride; 3917bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 3921b362b15af34006e6a11974088a46d42b903418eJohann 3937bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3947bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* U Plane */ 3957bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 3967bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_stride = ybf->uv_stride; 3977bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_height = 8; 3987bc9febe8749e98a3812a0dc4380ceae75c29450Johann plane_width = ybf->uv_width; 3997bc9febe8749e98a3812a0dc4380ceae75c29450Johann Border /= 2; 4007bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4017bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* copy the left and right most columns out */ 4027bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = u_src; 4037bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 = src_ptr1 + plane_width - 1; 4047bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 = src_ptr1 - Border; 4057bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 = src_ptr2 + 1; 4067bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4077bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < plane_height; ++i) { 4087bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(dest_ptr1, src_ptr1[0], Border); 4097bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(dest_ptr2, src_ptr2[0], Border); 4107bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 += plane_stride; 4117bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 += plane_stride; 4127bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 += plane_stride; 4137bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 += plane_stride; 4147bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 4151b362b15af34006e6a11974088a46d42b903418eJohann 4167bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 4177bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* V Plane */ 4187bc9febe8749e98a3812a0dc4380ceae75c29450Johann /***********/ 4197bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4207bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* copy the left and right most columns out */ 4217bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 = v_src; 4227bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 = src_ptr1 + plane_width - 1; 4237bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 = src_ptr1 - Border; 4247bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 = src_ptr2 + 1; 4257bc9febe8749e98a3812a0dc4380ceae75c29450Johann 4267bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < plane_height; ++i) { 4277bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(dest_ptr1, src_ptr1[0], Border); 4287bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(dest_ptr2, src_ptr2[0], Border); 4297bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr1 += plane_stride; 4307bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_ptr2 += plane_stride; 4317bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr1 += plane_stride; 4327bc9febe8749e98a3812a0dc4380ceae75c29450Johann dest_ptr2 += plane_stride; 4337bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 4341b362b15af34006e6a11974088a46d42b903418eJohann} 4351b362b15af34006e6a11974088a46d42b903418eJohann 4367bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void decode_mb_rows(VP8D_COMP *pbi) { 4377bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8_COMMON *const pc = &pbi->common; 4387bc9febe8749e98a3812a0dc4380ceae75c29450Johann MACROBLOCKD *const xd = &pbi->mb; 4391b362b15af34006e6a11974088a46d42b903418eJohann 4407bc9febe8749e98a3812a0dc4380ceae75c29450Johann MODE_INFO *lf_mic = xd->mode_info_context; 4411b362b15af34006e6a11974088a46d42b903418eJohann 4427bc9febe8749e98a3812a0dc4380ceae75c29450Johann int ibc = 0; 4437bc9febe8749e98a3812a0dc4380ceae75c29450Johann int num_part = 1 << pc->multi_token_partition; 4441b362b15af34006e6a11974088a46d42b903418eJohann 4457bc9febe8749e98a3812a0dc4380ceae75c29450Johann int recon_yoffset, recon_uvoffset; 4467bc9febe8749e98a3812a0dc4380ceae75c29450Johann int mb_row, mb_col; 4477bc9febe8749e98a3812a0dc4380ceae75c29450Johann int mb_idx = 0; 4481b362b15af34006e6a11974088a46d42b903418eJohann 4497bc9febe8749e98a3812a0dc4380ceae75c29450Johann YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 4501b362b15af34006e6a11974088a46d42b903418eJohann 4517bc9febe8749e98a3812a0dc4380ceae75c29450Johann int recon_y_stride = yv12_fb_new->y_stride; 4527bc9febe8749e98a3812a0dc4380ceae75c29450Johann int recon_uv_stride = yv12_fb_new->uv_stride; 4531b362b15af34006e6a11974088a46d42b903418eJohann 4547bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *ref_buffer[MAX_REF_FRAMES][3]; 4557bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *dst_buffer[3]; 4567bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *lf_dst[3]; 4577bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char *eb_dst[3]; 4587bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 4597bc9febe8749e98a3812a0dc4380ceae75c29450Johann int ref_fb_corrupted[MAX_REF_FRAMES]; 4601b362b15af34006e6a11974088a46d42b903418eJohann 4617bc9febe8749e98a3812a0dc4380ceae75c29450Johann ref_fb_corrupted[INTRA_FRAME] = 0; 4621b362b15af34006e6a11974088a46d42b903418eJohann 4637bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 1; i < MAX_REF_FRAMES; ++i) { 4647bc9febe8749e98a3812a0dc4380ceae75c29450Johann YV12_BUFFER_CONFIG *this_fb = pbi->dec_fb_ref[i]; 4651b362b15af34006e6a11974088a46d42b903418eJohann 4667bc9febe8749e98a3812a0dc4380ceae75c29450Johann ref_buffer[i][0] = this_fb->y_buffer; 4677bc9febe8749e98a3812a0dc4380ceae75c29450Johann ref_buffer[i][1] = this_fb->u_buffer; 4687bc9febe8749e98a3812a0dc4380ceae75c29450Johann ref_buffer[i][2] = this_fb->v_buffer; 4691b362b15af34006e6a11974088a46d42b903418eJohann 4707bc9febe8749e98a3812a0dc4380ceae75c29450Johann ref_fb_corrupted[i] = this_fb->corrupted; 4717bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 4721b362b15af34006e6a11974088a46d42b903418eJohann 4737bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Set up the buffer pointers */ 4747bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[0] = lf_dst[0] = dst_buffer[0] = yv12_fb_new->y_buffer; 4757bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[1] = lf_dst[1] = dst_buffer[1] = yv12_fb_new->u_buffer; 4767bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[2] = lf_dst[2] = dst_buffer[2] = yv12_fb_new->v_buffer; 4771b362b15af34006e6a11974088a46d42b903418eJohann 4787bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->up_available = 0; 4791b362b15af34006e6a11974088a46d42b903418eJohann 4807bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Initialize the loop filter for this frame. */ 4817bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->filter_level) vp8_loop_filter_frame_init(pc, xd, pc->filter_level); 4821b362b15af34006e6a11974088a46d42b903418eJohann 4837bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_setup_intra_recon_top_line(yv12_fb_new); 4841b362b15af34006e6a11974088a46d42b903418eJohann 4857bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Decode the individual macro block */ 4867bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (mb_row = 0; mb_row < pc->mb_rows; ++mb_row) { 4877bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (num_part > 1) { 4887bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->current_bc = &pbi->mbc[ibc]; 4897bc9febe8749e98a3812a0dc4380ceae75c29450Johann ibc++; 4901b362b15af34006e6a11974088a46d42b903418eJohann 4917bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (ibc == num_part) ibc = 0; 4927bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 4931b362b15af34006e6a11974088a46d42b903418eJohann 4947bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_yoffset = mb_row * recon_y_stride * 16; 4957bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_uvoffset = mb_row * recon_uv_stride * 8; 4961b362b15af34006e6a11974088a46d42b903418eJohann 4977bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* reset contexts */ 4987bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->above_context = pc->above_context; 4997bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)); 5001b362b15af34006e6a11974088a46d42b903418eJohann 5017bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->left_available = 0; 5021b362b15af34006e6a11974088a46d42b903418eJohann 5037bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mb_to_top_edge = -((mb_row * 16) << 3); 5047bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3; 5051b362b15af34006e6a11974088a46d42b903418eJohann 5067bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[0] = dst_buffer[0] + recon_yoffset; 5077bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[1] = dst_buffer[1] + recon_uvoffset; 5087bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[2] = dst_buffer[2] + recon_uvoffset; 5091b362b15af34006e6a11974088a46d42b903418eJohann 5107bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[0] = xd->recon_above[0] - 1; 5117bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[1] = xd->recon_above[1] - 1; 5127bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[2] = xd->recon_above[2] - 1; 5131b362b15af34006e6a11974088a46d42b903418eJohann 5147bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[0] -= xd->dst.y_stride; 5157bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[1] -= xd->dst.uv_stride; 5167bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[2] -= xd->dst.uv_stride; 5171b362b15af34006e6a11974088a46d42b903418eJohann 5187bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* TODO: move to outside row loop */ 5197bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left_stride[0] = xd->dst.y_stride; 5207bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left_stride[1] = xd->dst.uv_stride; 5211b362b15af34006e6a11974088a46d42b903418eJohann 5227bc9febe8749e98a3812a0dc4380ceae75c29450Johann setup_intra_recon_left(xd->recon_left[0], xd->recon_left[1], 5237bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[2], xd->dst.y_stride, 5247bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.uv_stride); 5251b362b15af34006e6a11974088a46d42b903418eJohann 5267bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (mb_col = 0; mb_col < pc->mb_cols; ++mb_col) { 5277bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Distance of Mb to the various image edges. 5287bc9febe8749e98a3812a0dc4380ceae75c29450Johann * These are specified to 8th pel as they are always compared to values 5297bc9febe8749e98a3812a0dc4380ceae75c29450Johann * that are in 1/8th pel units 5307bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 5317bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mb_to_left_edge = -((mb_col * 16) << 3); 5327bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3; 5331b362b15af34006e6a11974088a46d42b903418eJohann 5341b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 5357bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 5367bc9febe8749e98a3812a0dc4380ceae75c29450Johann int corrupt_residual = 5377bc9febe8749e98a3812a0dc4380ceae75c29450Johann (!pbi->independent_partitions && pbi->frame_corrupt_residual) || 5387bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8dx_bool_error(xd->current_bc); 5397bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && 5407bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME && 5417bc9febe8749e98a3812a0dc4380ceae75c29450Johann corrupt_residual) { 5427bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* We have an intra block with corrupt coefficients, better to 5437bc9febe8749e98a3812a0dc4380ceae75c29450Johann * conceal with an inter block. Interpolate MVs from neighboring 5447bc9febe8749e98a3812a0dc4380ceae75c29450Johann * MBs. 5457bc9febe8749e98a3812a0dc4380ceae75c29450Johann * 5467bc9febe8749e98a3812a0dc4380ceae75c29450Johann * Note that for the first mb with corrupt residual in a frame, 5477bc9febe8749e98a3812a0dc4380ceae75c29450Johann * we might not discover that before decoding the residual. That 5487bc9febe8749e98a3812a0dc4380ceae75c29450Johann * happens after this check, and therefore no inter concealment 5497bc9febe8749e98a3812a0dc4380ceae75c29450Johann * will be done. 5507bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 5517bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_interpolate_motion(xd, mb_row, mb_col, pc->mb_rows, pc->mb_cols); 5527bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 5537bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 5541b362b15af34006e6a11974088a46d42b903418eJohann#endif 5551b362b15af34006e6a11974088a46d42b903418eJohann 5567bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.y_buffer = dst_buffer[0] + recon_yoffset; 5577bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.u_buffer = dst_buffer[1] + recon_uvoffset; 5587bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.v_buffer = dst_buffer[2] + recon_uvoffset; 5591b362b15af34006e6a11974088a46d42b903418eJohann 5607bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->mode_info_context->mbmi.ref_frame >= LAST_FRAME) { 5617bc9febe8749e98a3812a0dc4380ceae75c29450Johann const MV_REFERENCE_FRAME ref = xd->mode_info_context->mbmi.ref_frame; 5627bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->pre.y_buffer = ref_buffer[ref][0] + recon_yoffset; 5637bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->pre.u_buffer = ref_buffer[ref][1] + recon_uvoffset; 5647bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->pre.v_buffer = ref_buffer[ref][2] + recon_uvoffset; 5657bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 5667bc9febe8749e98a3812a0dc4380ceae75c29450Johann // ref_frame is INTRA_FRAME, pre buffer should not be used. 5677bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->pre.y_buffer = 0; 5687bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->pre.u_buffer = 0; 5697bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->pre.v_buffer = 0; 5707bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 5711b362b15af34006e6a11974088a46d42b903418eJohann 5727bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* propagate errors from reference frames */ 5737bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted |= ref_fb_corrupted[xd->mode_info_context->mbmi.ref_frame]; 5741b362b15af34006e6a11974088a46d42b903418eJohann 5757bc9febe8749e98a3812a0dc4380ceae75c29450Johann decode_macroblock(pbi, xd, mb_idx); 5761b362b15af34006e6a11974088a46d42b903418eJohann 5777bc9febe8749e98a3812a0dc4380ceae75c29450Johann mb_idx++; 5787bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->left_available = 1; 5791b362b15af34006e6a11974088a46d42b903418eJohann 5807bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* check if the boolean decoder has suffered an error */ 5817bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted |= vp8dx_bool_error(xd->current_bc); 5821b362b15af34006e6a11974088a46d42b903418eJohann 5837bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[0] += 16; 5847bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[1] += 8; 5857bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_above[2] += 8; 5867bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[0] += 16; 5877bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[1] += 8; 5887bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->recon_left[2] += 8; 5891b362b15af34006e6a11974088a46d42b903418eJohann 5907bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_yoffset += 16; 5917bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_uvoffset += 8; 5921b362b15af34006e6a11974088a46d42b903418eJohann 5937bc9febe8749e98a3812a0dc4380ceae75c29450Johann ++xd->mode_info_context; /* next mb */ 5941b362b15af34006e6a11974088a46d42b903418eJohann 5957bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->above_context++; 5967bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 5977bc9febe8749e98a3812a0dc4380ceae75c29450Johann 5987bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* adjust to the next row of mbs */ 5997bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_extend_mb_row(yv12_fb_new, xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, 6007bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->dst.v_buffer + 8); 6017bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6027bc9febe8749e98a3812a0dc4380ceae75c29450Johann ++xd->mode_info_context; /* skip prediction column */ 6037bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->up_available = 1; 6047bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6057bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->filter_level) { 6067bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (mb_row > 0) { 6077bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->filter_type == NORMAL_LOOPFILTER) { 6087bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_loop_filter_row_normal(pc, lf_mic, mb_row - 1, recon_y_stride, 6097bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_uv_stride, lf_dst[0], lf_dst[1], 6107bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_dst[2]); 6117bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 6127bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_loop_filter_row_simple(pc, lf_mic, mb_row - 1, recon_y_stride, 6137bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_uv_stride, lf_dst[0], lf_dst[1], 6147bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_dst[2]); 6151b362b15af34006e6a11974088a46d42b903418eJohann } 6167bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (mb_row > 1) { 6177bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_extend_frame_left_right_c(yv12_fb_new, eb_dst[0], eb_dst[1], 6187bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[2]); 6197bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6207bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[0] += recon_y_stride * 16; 6217bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[1] += recon_uv_stride * 8; 6227bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[2] += recon_uv_stride * 8; 6231b362b15af34006e6a11974088a46d42b903418eJohann } 6241b362b15af34006e6a11974088a46d42b903418eJohann 6257bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_dst[0] += recon_y_stride * 16; 6267bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_dst[1] += recon_uv_stride * 8; 6277bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_dst[2] += recon_uv_stride * 8; 6287bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_mic += pc->mb_cols; 6297bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_mic++; /* Skip border mb */ 6307bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6317bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 6327bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (mb_row > 0) { 6337bc9febe8749e98a3812a0dc4380ceae75c29450Johann /**/ 6347bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_extend_frame_left_right_c(yv12_fb_new, eb_dst[0], eb_dst[1], 6351b362b15af34006e6a11974088a46d42b903418eJohann eb_dst[2]); 6367bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[0] += recon_y_stride * 16; 6377bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[1] += recon_uv_stride * 8; 6387bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[2] += recon_uv_stride * 8; 6397bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6407bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6417bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6427bc9febe8749e98a3812a0dc4380ceae75c29450Johann 6437bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->filter_level) { 6447bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->filter_type == NORMAL_LOOPFILTER) { 6457bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_loop_filter_row_normal(pc, lf_mic, mb_row - 1, recon_y_stride, 6467bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_uv_stride, lf_dst[0], lf_dst[1], 6477bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_dst[2]); 6487bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 6497bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_loop_filter_row_simple(pc, lf_mic, mb_row - 1, recon_y_stride, 6507bc9febe8749e98a3812a0dc4380ceae75c29450Johann recon_uv_stride, lf_dst[0], lf_dst[1], 6517bc9febe8749e98a3812a0dc4380ceae75c29450Johann lf_dst[2]); 6521b362b15af34006e6a11974088a46d42b903418eJohann } 6531b362b15af34006e6a11974088a46d42b903418eJohann 6547bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_extend_frame_left_right_c(yv12_fb_new, eb_dst[0], eb_dst[1], 6557bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[2]); 6567bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[0] += recon_y_stride * 16; 6577bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[1] += recon_uv_stride * 8; 6587bc9febe8749e98a3812a0dc4380ceae75c29450Johann eb_dst[2] += recon_uv_stride * 8; 6597bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6607bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_extend_frame_left_right_c(yv12_fb_new, eb_dst[0], eb_dst[1], eb_dst[2]); 6617bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_extend_frame_top_c(yv12_fb_new); 6627bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_extend_frame_bottom_c(yv12_fb_new); 6631b362b15af34006e6a11974088a46d42b903418eJohann} 6641b362b15af34006e6a11974088a46d42b903418eJohann 665ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic unsigned int read_partition_size(VP8D_COMP *pbi, 6667bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *cx_size) { 6677bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char temp[3]; 6687bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->decrypt_cb) { 6697bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->decrypt_cb(pbi->decrypt_state, cx_size, temp, 3); 6707bc9febe8749e98a3812a0dc4380ceae75c29450Johann cx_size = temp; 6717bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 6727bc9febe8749e98a3812a0dc4380ceae75c29450Johann return cx_size[0] + (cx_size[1] << 8) + (cx_size[2] << 16); 6731b362b15af34006e6a11974088a46d42b903418eJohann} 6741b362b15af34006e6a11974088a46d42b903418eJohann 6757bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic int read_is_valid(const unsigned char *start, size_t len, 6767bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *end) { 6777bc9febe8749e98a3812a0dc4380ceae75c29450Johann return (start + len > start && start + len <= end); 6781b362b15af34006e6a11974088a46d42b903418eJohann} 6791b362b15af34006e6a11974088a46d42b903418eJohann 6801b362b15af34006e6a11974088a46d42b903418eJohannstatic unsigned int read_available_partition_size( 6817bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8D_COMP *pbi, const unsigned char *token_part_sizes, 6827bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *fragment_start, 6837bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *first_fragment_end, const unsigned char *fragment_end, 6847bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i, int num_part) { 6857bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8_COMMON *pc = &pbi->common; 6867bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *partition_size_ptr = token_part_sizes + i * 3; 6877bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int partition_size = 0; 6887bc9febe8749e98a3812a0dc4380ceae75c29450Johann ptrdiff_t bytes_left = fragment_end - fragment_start; 6897bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Calculate the length of this partition. The last partition 6907bc9febe8749e98a3812a0dc4380ceae75c29450Johann * size is implicit. If the partition size can't be read, then 6917bc9febe8749e98a3812a0dc4380ceae75c29450Johann * either use the remaining data in the buffer (for EC mode) 6927bc9febe8749e98a3812a0dc4380ceae75c29450Johann * or throw an error. 6937bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 6947bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (i < num_part - 1) { 6957bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (read_is_valid(partition_size_ptr, 3, first_fragment_end)) { 6967bc9febe8749e98a3812a0dc4380ceae75c29450Johann partition_size = read_partition_size(pbi, partition_size_ptr); 6977bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else if (pbi->ec_active) { 6987bc9febe8749e98a3812a0dc4380ceae75c29450Johann partition_size = (unsigned int)bytes_left; 6997bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7007bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 7017bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Truncated partition size data"); 7021b362b15af34006e6a11974088a46d42b903418eJohann } 7037bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7047bc9febe8749e98a3812a0dc4380ceae75c29450Johann partition_size = (unsigned int)bytes_left; 7057bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7061b362b15af34006e6a11974088a46d42b903418eJohann 7077bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Validate the calculated partition length. If the buffer 7087bc9febe8749e98a3812a0dc4380ceae75c29450Johann * described by the partition can't be fully read, then restrict 7097bc9febe8749e98a3812a0dc4380ceae75c29450Johann * it to the portion that can be (for EC mode) or throw an error. 7107bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 7117bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!read_is_valid(fragment_start, partition_size, fragment_end)) { 7127bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active) { 7137bc9febe8749e98a3812a0dc4380ceae75c29450Johann partition_size = (unsigned int)bytes_left; 7147bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 7157bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 7167bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Truncated packet or corrupt partition " 7177bc9febe8749e98a3812a0dc4380ceae75c29450Johann "%d length", 7187bc9febe8749e98a3812a0dc4380ceae75c29450Johann i + 1); 7191b362b15af34006e6a11974088a46d42b903418eJohann } 7207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7217bc9febe8749e98a3812a0dc4380ceae75c29450Johann return partition_size; 7221b362b15af34006e6a11974088a46d42b903418eJohann} 7231b362b15af34006e6a11974088a46d42b903418eJohann 7241b362b15af34006e6a11974088a46d42b903418eJohannstatic void setup_token_decoder(VP8D_COMP *pbi, 7257bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *token_part_sizes) { 7267bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_reader *bool_decoder = &pbi->mbc[0]; 7277bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int partition_idx; 7287bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int fragment_idx; 7297bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int num_token_partitions; 7307bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *first_fragment_end = 7317bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.ptrs[0] + pbi->fragments.sizes[0]; 7327bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7337bc9febe8749e98a3812a0dc4380ceae75c29450Johann TOKEN_PARTITION multi_token_partition = 7347bc9febe8749e98a3812a0dc4380ceae75c29450Johann (TOKEN_PARTITION)vp8_read_literal(&pbi->mbc[8], 2); 7357bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!vp8dx_bool_error(&pbi->mbc[8])) { 7367bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->common.multi_token_partition = multi_token_partition; 7377bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7387bc9febe8749e98a3812a0dc4380ceae75c29450Johann num_token_partitions = 1 << pbi->common.multi_token_partition; 7397bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7407bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Check for partitions within the fragments and unpack the fragments 7417bc9febe8749e98a3812a0dc4380ceae75c29450Johann * so that each fragment pointer points to its corresponding partition. */ 7427bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (fragment_idx = 0; fragment_idx < pbi->fragments.count; ++fragment_idx) { 7437bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int fragment_size = pbi->fragments.sizes[fragment_idx]; 7447bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *fragment_end = 7457bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.ptrs[fragment_idx] + fragment_size; 7467bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Special case for handling the first partition since we have already 7477bc9febe8749e98a3812a0dc4380ceae75c29450Johann * read its size. */ 7487bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (fragment_idx == 0) { 7497bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Size of first partition + token partition sizes element */ 7507bc9febe8749e98a3812a0dc4380ceae75c29450Johann ptrdiff_t ext_first_part_size = token_part_sizes - 7517bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.ptrs[0] + 7527bc9febe8749e98a3812a0dc4380ceae75c29450Johann 3 * (num_token_partitions - 1); 7537bc9febe8749e98a3812a0dc4380ceae75c29450Johann fragment_size -= (unsigned int)ext_first_part_size; 7547bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (fragment_size > 0) { 7557bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.sizes[0] = (unsigned int)ext_first_part_size; 7567bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* The fragment contains an additional partition. Move to 7577bc9febe8749e98a3812a0dc4380ceae75c29450Johann * next. */ 7587bc9febe8749e98a3812a0dc4380ceae75c29450Johann fragment_idx++; 7597bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.ptrs[fragment_idx] = 7607bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.ptrs[0] + pbi->fragments.sizes[0]; 7617bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7621b362b15af34006e6a11974088a46d42b903418eJohann } 7637bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Split the chunk into partitions read from the bitstream */ 7647bc9febe8749e98a3812a0dc4380ceae75c29450Johann while (fragment_size > 0) { 7657bc9febe8749e98a3812a0dc4380ceae75c29450Johann ptrdiff_t partition_size = read_available_partition_size( 7667bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi, token_part_sizes, pbi->fragments.ptrs[fragment_idx], 7677bc9febe8749e98a3812a0dc4380ceae75c29450Johann first_fragment_end, fragment_end, fragment_idx - 1, 7687bc9febe8749e98a3812a0dc4380ceae75c29450Johann num_token_partitions); 7697bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.sizes[fragment_idx] = (unsigned int)partition_size; 7707bc9febe8749e98a3812a0dc4380ceae75c29450Johann fragment_size -= (unsigned int)partition_size; 7717bc9febe8749e98a3812a0dc4380ceae75c29450Johann assert(fragment_idx <= num_token_partitions); 7727bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (fragment_size > 0) { 7737bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* The fragment contains an additional partition. 7747bc9febe8749e98a3812a0dc4380ceae75c29450Johann * Move to next. */ 7757bc9febe8749e98a3812a0dc4380ceae75c29450Johann fragment_idx++; 7767bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.ptrs[fragment_idx] = 7777bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.ptrs[fragment_idx - 1] + partition_size; 7787bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7797bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7807bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7811b362b15af34006e6a11974088a46d42b903418eJohann 7827bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.count = num_token_partitions + 1; 7831b362b15af34006e6a11974088a46d42b903418eJohann 7847bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (partition_idx = 1; partition_idx < pbi->fragments.count; 7857bc9febe8749e98a3812a0dc4380ceae75c29450Johann ++partition_idx) { 7867bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8dx_start_decode(bool_decoder, pbi->fragments.ptrs[partition_idx], 7877bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->fragments.sizes[partition_idx], pbi->decrypt_cb, 7887bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->decrypt_state)) { 7897bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR, 7907bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Failed to allocate bool decoder %d", partition_idx); 7911b362b15af34006e6a11974088a46d42b903418eJohann } 7921b362b15af34006e6a11974088a46d42b903418eJohann 7937bc9febe8749e98a3812a0dc4380ceae75c29450Johann bool_decoder++; 7947bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 7957bc9febe8749e98a3812a0dc4380ceae75c29450Johann 7961b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD 79770cca742efa20617c70c3209aa614a70f282f90eMarco Nelissen /* Clamp number of decoder threads */ 79870cca742efa20617c70c3209aa614a70f282f90eMarco Nelissen if (pbi->decoding_thread_count > num_token_partitions - 1) { 79970cca742efa20617c70c3209aa614a70f282f90eMarco Nelissen pbi->decoding_thread_count = num_token_partitions - 1; 80070cca742efa20617c70c3209aa614a70f282f90eMarco Nelissen } 8017bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((int)pbi->decoding_thread_count > pbi->common.mb_rows - 1) { 8027bc9febe8749e98a3812a0dc4380ceae75c29450Johann assert(pbi->common.mb_rows > 0); 80370cca742efa20617c70c3209aa614a70f282f90eMarco Nelissen pbi->decoding_thread_count = pbi->common.mb_rows - 1; 80470cca742efa20617c70c3209aa614a70f282f90eMarco Nelissen } 8051b362b15af34006e6a11974088a46d42b903418eJohann#endif 8061b362b15af34006e6a11974088a46d42b903418eJohann} 8071b362b15af34006e6a11974088a46d42b903418eJohann 8087bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void init_frame(VP8D_COMP *pbi) { 8097bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8_COMMON *const pc = &pbi->common; 8107bc9febe8749e98a3812a0dc4380ceae75c29450Johann MACROBLOCKD *const xd = &pbi->mb; 8111b362b15af34006e6a11974088a46d42b903418eJohann 8127bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->frame_type == KEY_FRAME) { 8137bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Various keyframe initializations */ 8147bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(pc->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context)); 8151b362b15af34006e6a11974088a46d42b903418eJohann 8167bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_init_mbmode_probs(pc); 8171b362b15af34006e6a11974088a46d42b903418eJohann 8187bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_default_coef_probs(pc); 8191b362b15af34006e6a11974088a46d42b903418eJohann 8207bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* reset the segment feature data to 0 with delta coding (Default state). */ 8217bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data)); 8227bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mb_segement_abs_delta = SEGMENT_DELTADATA; 8231b362b15af34006e6a11974088a46d42b903418eJohann 8247bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* reset the mode ref deltasa for loop filter */ 8257bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->ref_lf_deltas, 0, sizeof(xd->ref_lf_deltas)); 8267bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->mode_lf_deltas, 0, sizeof(xd->mode_lf_deltas)); 8271b362b15af34006e6a11974088a46d42b903418eJohann 8287bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* All buffers are implicitly updated on key frames. */ 8297bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->refresh_golden_frame = 1; 8307bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->refresh_alt_ref_frame = 1; 8317bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->copy_buffer_to_gf = 0; 8327bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->copy_buffer_to_arf = 0; 8331b362b15af34006e6a11974088a46d42b903418eJohann 8347bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Note that Golden and Altref modes cannot be used on a key frame so 8357bc9febe8749e98a3812a0dc4380ceae75c29450Johann * ref_frame_sign_bias[] is undefined and meaningless 8367bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 8377bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->ref_frame_sign_bias[GOLDEN_FRAME] = 0; 8387bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->ref_frame_sign_bias[ALTREF_FRAME] = 0; 8397bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 8407bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* To enable choice of different interploation filters */ 8417bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pc->use_bilinear_mc_filter) { 8427bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict = vp8_sixtap_predict4x4; 8437bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict8x4 = vp8_sixtap_predict8x4; 8447bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict8x8 = vp8_sixtap_predict8x8; 8457bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict16x16 = vp8_sixtap_predict16x16; 8467bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 8477bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict = vp8_bilinear_predict4x4; 8487bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict8x4 = vp8_bilinear_predict8x4; 8497bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict8x8 = vp8_bilinear_predict8x8; 8507bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->subpixel_predict16x16 = vp8_bilinear_predict16x16; 8511b362b15af34006e6a11974088a46d42b903418eJohann } 8521b362b15af34006e6a11974088a46d42b903418eJohann 8537bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->decoded_key_frame && pbi->ec_enabled && !pbi->ec_active) { 8547bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->ec_active = 1; 8551b362b15af34006e6a11974088a46d42b903418eJohann } 8567bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 8571b362b15af34006e6a11974088a46d42b903418eJohann 8587bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->left_context = &pc->left_context; 8597bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_info_context = pc->mi; 8607bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->frame_type = pc->frame_type; 8617bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_info_context->mbmi.mode = DC_PRED; 8627bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_info_stride = pc->mode_info_stride; 8637bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted = 0; /* init without corruption */ 8641b362b15af34006e6a11974088a46d42b903418eJohann 8657bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->fullpixel_mask = 0xffffffff; 8667bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->full_pixel) xd->fullpixel_mask = 0xfffffff8; 8671b362b15af34006e6a11974088a46d42b903418eJohann} 8681b362b15af34006e6a11974088a46d42b903418eJohann 8697bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vp8_decode_frame(VP8D_COMP *pbi) { 8707bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_reader *const bc = &pbi->mbc[8]; 8717bc9febe8749e98a3812a0dc4380ceae75c29450Johann VP8_COMMON *const pc = &pbi->common; 8727bc9febe8749e98a3812a0dc4380ceae75c29450Johann MACROBLOCKD *const xd = &pbi->mb; 8737bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *data = pbi->fragments.ptrs[0]; 8747bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned int data_sz = pbi->fragments.sizes[0]; 8757bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *data_end = data + data_sz; 8767bc9febe8749e98a3812a0dc4380ceae75c29450Johann ptrdiff_t first_partition_length_in_bytes; 8777bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8787bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i, j, k, l; 8797bc9febe8749e98a3812a0dc4380ceae75c29450Johann const int *const mb_feature_data_bits = vp8_mb_feature_data_bits; 8807bc9febe8749e98a3812a0dc4380ceae75c29450Johann int corrupt_tokens = 0; 8817bc9febe8749e98a3812a0dc4380ceae75c29450Johann int prev_independent_partitions = pbi->independent_partitions; 8827bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8837bc9febe8749e98a3812a0dc4380ceae75c29450Johann YV12_BUFFER_CONFIG *yv12_fb_new = pbi->dec_fb_ref[INTRA_FRAME]; 8847bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8857bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* start with no corruption of current frame */ 8867bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted = 0; 8877bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_fb_new->corrupted = 0; 8887bc9febe8749e98a3812a0dc4380ceae75c29450Johann 8897bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (data_end - data < 3) { 8907bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pbi->ec_active) { 8917bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 8927bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Truncated packet"); 8937bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 8941b362b15af34006e6a11974088a46d42b903418eJohann 8957bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Declare the missing frame as an inter frame since it will 8967bc9febe8749e98a3812a0dc4380ceae75c29450Johann be handled as an inter frame when we have estimated its 8977bc9febe8749e98a3812a0dc4380ceae75c29450Johann motion vectors. */ 8987bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->frame_type = INTER_FRAME; 8997bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->version = 0; 9007bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->show_frame = 1; 9017bc9febe8749e98a3812a0dc4380ceae75c29450Johann first_partition_length_in_bytes = 0; 9027bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9037bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned char clear_buffer[10]; 9047bc9febe8749e98a3812a0dc4380ceae75c29450Johann const unsigned char *clear = data; 9057bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->decrypt_cb) { 9067bc9febe8749e98a3812a0dc4380ceae75c29450Johann int n = (int)VPXMIN(sizeof(clear_buffer), data_sz); 9077bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->decrypt_cb(pbi->decrypt_state, data, clear_buffer, n); 9087bc9febe8749e98a3812a0dc4380ceae75c29450Johann clear = clear_buffer; 9091b362b15af34006e6a11974088a46d42b903418eJohann } 910ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 9117bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->frame_type = (FRAME_TYPE)(clear[0] & 1); 9127bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->version = (clear[0] >> 1) & 7; 9137bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->show_frame = (clear[0] >> 4) & 1; 9147bc9febe8749e98a3812a0dc4380ceae75c29450Johann first_partition_length_in_bytes = 9157bc9febe8749e98a3812a0dc4380ceae75c29450Johann (clear[0] | (clear[1] << 8) | (clear[2] << 16)) >> 5; 9161b362b15af34006e6a11974088a46d42b903418eJohann 9177bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pbi->ec_active && (data + first_partition_length_in_bytes > data_end || 9187bc9febe8749e98a3812a0dc4380ceae75c29450Johann data + first_partition_length_in_bytes < data)) { 9197bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pc->error, VPX_CODEC_CORRUPT_FRAME, 9207bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Truncated packet or corrupt partition 0 length"); 9211b362b15af34006e6a11974088a46d42b903418eJohann } 9221b362b15af34006e6a11974088a46d42b903418eJohann 9237bc9febe8749e98a3812a0dc4380ceae75c29450Johann data += 3; 9247bc9febe8749e98a3812a0dc4380ceae75c29450Johann clear += 3; 9257bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9267bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_setup_version(pc); 9271b362b15af34006e6a11974088a46d42b903418eJohann 9281b362b15af34006e6a11974088a46d42b903418eJohann if (pc->frame_type == KEY_FRAME) { 9297bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* vet via sync code */ 9307bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* When error concealment is enabled we should only check the sync 9317bc9febe8749e98a3812a0dc4380ceae75c29450Johann * code if we have enough bits available 9327bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 9337bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pbi->ec_active || data + 3 < data_end) { 9347bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (clear[0] != 0x9d || clear[1] != 0x01 || clear[2] != 0x2a) { 9357bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pc->error, VPX_CODEC_UNSUP_BITSTREAM, 9367bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Invalid frame sync code"); 9377bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9387bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9397bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9407bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* If error concealment is enabled we should only parse the new size 9417bc9febe8749e98a3812a0dc4380ceae75c29450Johann * if we have enough data. Otherwise we will end up with the wrong 9427bc9febe8749e98a3812a0dc4380ceae75c29450Johann * size. 9437bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 9447bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pbi->ec_active || data + 6 < data_end) { 9457bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->Width = (clear[3] | (clear[4] << 8)) & 0x3fff; 9467bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->horiz_scale = clear[4] >> 6; 9477bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->Height = (clear[5] | (clear[6] << 8)) & 0x3fff; 9487bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->vert_scale = clear[6] >> 6; 9497bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9507bc9febe8749e98a3812a0dc4380ceae75c29450Johann data += 7; 9517bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9527bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(&xd->pre, yv12_fb_new, sizeof(YV12_BUFFER_CONFIG)); 9537bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(&xd->dst, yv12_fb_new, sizeof(YV12_BUFFER_CONFIG)); 9541b362b15af34006e6a11974088a46d42b903418eJohann } 9557bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9567bc9febe8749e98a3812a0dc4380ceae75c29450Johann if ((!pbi->decoded_key_frame && pc->frame_type != KEY_FRAME)) { 9577bc9febe8749e98a3812a0dc4380ceae75c29450Johann return -1; 9587bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9591b362b15af34006e6a11974088a46d42b903418eJohann 9607bc9febe8749e98a3812a0dc4380ceae75c29450Johann init_frame(pbi); 9617bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9627bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8dx_start_decode(bc, data, (unsigned int)(data_end - data), 9637bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->decrypt_cb, pbi->decrypt_state)) { 9647bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pc->error, VPX_CODEC_MEM_ERROR, 9657bc9febe8749e98a3812a0dc4380ceae75c29450Johann "Failed to allocate bool decoder 0"); 9667bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9677bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->frame_type == KEY_FRAME) { 9687bc9febe8749e98a3812a0dc4380ceae75c29450Johann (void)vp8_read_bit(bc); // colorspace 9697bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->clamp_type = (CLAMP_TYPE)vp8_read_bit(bc); 9707bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 9717bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9727bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Is segmentation enabled */ 9737bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->segmentation_enabled = (unsigned char)vp8_read_bit(bc); 9747bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9757bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->segmentation_enabled) { 9767bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Signal whether or not the segmentation map is being explicitly updated 9777bc9febe8749e98a3812a0dc4380ceae75c29450Johann * this frame. */ 9787bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->update_mb_segmentation_map = (unsigned char)vp8_read_bit(bc); 9797bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->update_mb_segmentation_data = (unsigned char)vp8_read_bit(bc); 9807bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9817bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->update_mb_segmentation_data) { 9827bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mb_segement_abs_delta = (unsigned char)vp8_read_bit(bc); 9831b362b15af34006e6a11974088a46d42b903418eJohann 9847bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->segment_feature_data, 0, sizeof(xd->segment_feature_data)); 9857bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9867bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* For each segmentation feature (Quant and loop filter level) */ 9877bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < MB_LVL_MAX; ++i) { 9887bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (j = 0; j < MAX_MB_SEGMENTS; ++j) { 9897bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Frame level data */ 9907bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { 9917bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->segment_feature_data[i][j] = 9927bc9febe8749e98a3812a0dc4380ceae75c29450Johann (signed char)vp8_read_literal(bc, mb_feature_data_bits[i]); 9937bc9febe8749e98a3812a0dc4380ceae75c29450Johann 9947bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { 9957bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->segment_feature_data[i][j] = -xd->segment_feature_data[i][j]; 9961b362b15af34006e6a11974088a46d42b903418eJohann } 9977bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 9987bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->segment_feature_data[i][j] = 0; 9997bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10001b362b15af34006e6a11974088a46d42b903418eJohann } 10017bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10021b362b15af34006e6a11974088a46d42b903418eJohann } 10031b362b15af34006e6a11974088a46d42b903418eJohann 10047bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->update_mb_segmentation_map) { 10057bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Which macro block level features are enabled */ 10067bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->mb_segment_tree_probs, 255, sizeof(xd->mb_segment_tree_probs)); 10071b362b15af34006e6a11974088a46d42b903418eJohann 10087bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Read the probs used to decode the segment id for each macro block. */ 10097bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < MB_FEATURE_TREE_PROBS; ++i) { 10107bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* If not explicitly set value is defaulted to 255 by memset above */ 10117bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { 10127bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mb_segment_tree_probs[i] = (vp8_prob)vp8_read_literal(bc, 8); 10131b362b15af34006e6a11974088a46d42b903418eJohann } 10147bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10151b362b15af34006e6a11974088a46d42b903418eJohann } 10167bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 10177bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* No segmentation updates on this frame */ 10187bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->update_mb_segmentation_map = 0; 10197bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->update_mb_segmentation_data = 0; 10207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10211b362b15af34006e6a11974088a46d42b903418eJohann 10227bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Read the loop filter level and type */ 10237bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->filter_type = (LOOPFILTERTYPE)vp8_read_bit(bc); 10247bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->filter_level = vp8_read_literal(bc, 6); 10257bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->sharpness_level = vp8_read_literal(bc, 3); 10267bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10277bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Read in loop filter deltas applied at the MB level based on mode or ref 10287bc9febe8749e98a3812a0dc4380ceae75c29450Johann * frame. */ 10297bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_ref_lf_delta_update = 0; 10307bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_ref_lf_delta_enabled = (unsigned char)vp8_read_bit(bc); 10317bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10327bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->mode_ref_lf_delta_enabled) { 10337bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Do the deltas need to be updated */ 10347bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_ref_lf_delta_update = (unsigned char)vp8_read_bit(bc); 10357bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10367bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (xd->mode_ref_lf_delta_update) { 10377bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Send update */ 10387bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < MAX_REF_LF_DELTAS; ++i) { 10397bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { 10407bc9febe8749e98a3812a0dc4380ceae75c29450Johann /*sign = vp8_read_bit( bc );*/ 10417bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->ref_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6); 10427bc9febe8749e98a3812a0dc4380ceae75c29450Johann 10437bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { /* Apply sign */ 10447bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->ref_lf_deltas[i] = xd->ref_lf_deltas[i] * -1; 10457bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10467bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10477bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10481b362b15af34006e6a11974088a46d42b903418eJohann 10497bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Send update */ 10507bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < MAX_MODE_LF_DELTAS; ++i) { 10517bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { 10527bc9febe8749e98a3812a0dc4380ceae75c29450Johann /*sign = vp8_read_bit( bc );*/ 10537bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_lf_deltas[i] = (signed char)vp8_read_literal(bc, 6); 10541b362b15af34006e6a11974088a46d42b903418eJohann 10557bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read_bit(bc)) { /* Apply sign */ 10567bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->mode_lf_deltas[i] = xd->mode_lf_deltas[i] * -1; 10577bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10587bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10597bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10607bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10617bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10621b362b15af34006e6a11974088a46d42b903418eJohann 10637bc9febe8749e98a3812a0dc4380ceae75c29450Johann setup_token_decoder(pbi, data + first_partition_length_in_bytes); 10641b362b15af34006e6a11974088a46d42b903418eJohann 10657bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->current_bc = &pbi->mbc[0]; 10661b362b15af34006e6a11974088a46d42b903418eJohann 10677bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Read the default quantizers. */ 10687bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 10697bc9febe8749e98a3812a0dc4380ceae75c29450Johann int Q, q_update; 10701b362b15af34006e6a11974088a46d42b903418eJohann 10717bc9febe8749e98a3812a0dc4380ceae75c29450Johann Q = vp8_read_literal(bc, 7); /* AC 1st order Q = default */ 10727bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->base_qindex = Q; 10737bc9febe8749e98a3812a0dc4380ceae75c29450Johann q_update = 0; 10747bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->y1dc_delta_q = get_delta_q(bc, pc->y1dc_delta_q, &q_update); 10757bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->y2dc_delta_q = get_delta_q(bc, pc->y2dc_delta_q, &q_update); 10767bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->y2ac_delta_q = get_delta_q(bc, pc->y2ac_delta_q, &q_update); 10777bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->uvdc_delta_q = get_delta_q(bc, pc->uvdc_delta_q, &q_update); 10787bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->uvac_delta_q = get_delta_q(bc, pc->uvac_delta_q, &q_update); 10791b362b15af34006e6a11974088a46d42b903418eJohann 10807bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (q_update) vp8cx_init_de_quantizer(pbi); 10811b362b15af34006e6a11974088a46d42b903418eJohann 10827bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* MB level dequantizer setup */ 10837bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_mb_init_dequantizer(pbi, &pbi->mb); 10847bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10851b362b15af34006e6a11974088a46d42b903418eJohann 10867bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Determine if the golden frame or ARF buffer should be updated and how. 10877bc9febe8749e98a3812a0dc4380ceae75c29450Johann * For all non key frames the GF and ARF refresh flags and sign bias 10887bc9febe8749e98a3812a0dc4380ceae75c29450Johann * flags must be set explicitly. 10897bc9febe8749e98a3812a0dc4380ceae75c29450Johann */ 10907bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->frame_type != KEY_FRAME) { 10917bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Should the GF or ARF be updated from the current frame */ 10927bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->refresh_golden_frame = vp8_read_bit(bc); 10937bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if CONFIG_ERROR_CONCEALMENT 10947bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Assume we shouldn't refresh golden if the bit is missing */ 10957bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted |= vp8dx_bool_error(bc); 10967bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && xd->corrupted) pc->refresh_golden_frame = 0; 10977bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif 10981b362b15af34006e6a11974088a46d42b903418eJohann 10997bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->refresh_alt_ref_frame = vp8_read_bit(bc); 11001b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 11017bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Assume we shouldn't refresh altref if the bit is missing */ 11027bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted |= vp8dx_bool_error(bc); 11037bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && xd->corrupted) pc->refresh_alt_ref_frame = 0; 11041b362b15af34006e6a11974088a46d42b903418eJohann#endif 11051b362b15af34006e6a11974088a46d42b903418eJohann 11067bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Buffer to buffer copy flags. */ 11077bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->copy_buffer_to_gf = 0; 11081b362b15af34006e6a11974088a46d42b903418eJohann 11097bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pc->refresh_golden_frame) { 11107bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->copy_buffer_to_gf = vp8_read_literal(bc, 2); 11117bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11121b362b15af34006e6a11974088a46d42b903418eJohann 11131b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 11147bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Assume we shouldn't copy to the golden if the bit is missing */ 11157bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted |= vp8dx_bool_error(bc); 11167bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && xd->corrupted) pc->copy_buffer_to_gf = 0; 11171b362b15af34006e6a11974088a46d42b903418eJohann#endif 11181b362b15af34006e6a11974088a46d42b903418eJohann 11197bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->copy_buffer_to_arf = 0; 11201b362b15af34006e6a11974088a46d42b903418eJohann 11217bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pc->refresh_alt_ref_frame) { 11227bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->copy_buffer_to_arf = vp8_read_literal(bc, 2); 11231b362b15af34006e6a11974088a46d42b903418eJohann } 11241b362b15af34006e6a11974088a46d42b903418eJohann 11251b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 11267bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Assume we shouldn't copy to the alt-ref if the bit is missing */ 11271b362b15af34006e6a11974088a46d42b903418eJohann xd->corrupted |= vp8dx_bool_error(bc); 11287bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && xd->corrupted) pc->copy_buffer_to_arf = 0; 11291b362b15af34006e6a11974088a46d42b903418eJohann#endif 11301b362b15af34006e6a11974088a46d42b903418eJohann 11317bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->ref_frame_sign_bias[GOLDEN_FRAME] = vp8_read_bit(bc); 11327bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->ref_frame_sign_bias[ALTREF_FRAME] = vp8_read_bit(bc); 11337bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11341b362b15af34006e6a11974088a46d42b903418eJohann 11357bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->refresh_entropy_probs = vp8_read_bit(bc); 11361b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 11377bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Assume we shouldn't refresh the probabilities if the bit is 11387bc9febe8749e98a3812a0dc4380ceae75c29450Johann * missing */ 11397bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted |= vp8dx_bool_error(bc); 11407bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && xd->corrupted) pc->refresh_entropy_probs = 0; 11411b362b15af34006e6a11974088a46d42b903418eJohann#endif 11427bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->refresh_entropy_probs == 0) { 11437bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(&pc->lfc, &pc->fc, sizeof(pc->fc)); 11447bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11451b362b15af34006e6a11974088a46d42b903418eJohann 11467bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->refresh_last_frame = pc->frame_type == KEY_FRAME || vp8_read_bit(bc); 11471b362b15af34006e6a11974088a46d42b903418eJohann 11487bc9febe8749e98a3812a0dc4380ceae75c29450Johann#if CONFIG_ERROR_CONCEALMENT 11497bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Assume we should refresh the last frame if the bit is missing */ 11507bc9febe8749e98a3812a0dc4380ceae75c29450Johann xd->corrupted |= vp8dx_bool_error(bc); 11517bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && xd->corrupted) pc->refresh_last_frame = 1; 11527bc9febe8749e98a3812a0dc4380ceae75c29450Johann#endif 11531b362b15af34006e6a11974088a46d42b903418eJohann 11547bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (0) { 11557bc9febe8749e98a3812a0dc4380ceae75c29450Johann FILE *z = fopen("decodestats.stt", "a"); 11567bc9febe8749e98a3812a0dc4380ceae75c29450Johann fprintf(z, "%6d F:%d,G:%d,A:%d,L:%d,Q:%d\n", pc->current_video_frame, 11577bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->frame_type, pc->refresh_golden_frame, pc->refresh_alt_ref_frame, 11587bc9febe8749e98a3812a0dc4380ceae75c29450Johann pc->refresh_last_frame, pc->base_qindex); 11597bc9febe8749e98a3812a0dc4380ceae75c29450Johann fclose(z); 11607bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11611b362b15af34006e6a11974088a46d42b903418eJohann 11627bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 11637bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->independent_partitions = 1; 11641b362b15af34006e6a11974088a46d42b903418eJohann 11657bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* read coef probability tree */ 11667bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < BLOCK_TYPES; ++i) { 11677bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (j = 0; j < COEF_BANDS; ++j) { 11687bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (k = 0; k < PREV_COEF_CONTEXTS; ++k) { 11697bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (l = 0; l < ENTROPY_NODES; ++l) { 11707bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_prob *const p = pc->fc.coef_probs[i][j][k] + l; 11711b362b15af34006e6a11974088a46d42b903418eJohann 11727bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (vp8_read(bc, vp8_coef_update_probs[i][j][k][l])) { 11737bc9febe8749e98a3812a0dc4380ceae75c29450Johann *p = (vp8_prob)vp8_read_literal(bc, 8); 11747bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11757bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (k > 0 && *p != pc->fc.coef_probs[i][j][k - 1][l]) { 11767bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->independent_partitions = 0; 11777bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11787bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11797bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11807bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11811b362b15af34006e6a11974088a46d42b903418eJohann } 11827bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11831b362b15af34006e6a11974088a46d42b903418eJohann 11847bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* clear out the coeff buffer */ 11857bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(xd->qcoeff, 0, sizeof(xd->qcoeff)); 11861b362b15af34006e6a11974088a46d42b903418eJohann 11877bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_decode_mode_mvs(pbi); 11881b362b15af34006e6a11974088a46d42b903418eJohann 11891b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT 11907bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->ec_active && 11917bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->mvs_corrupt_from_mb < (unsigned int)pc->mb_cols * pc->mb_rows) { 11927bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Motion vectors are missing in this frame. We will try to estimate 11937bc9febe8749e98a3812a0dc4380ceae75c29450Johann * them and then continue decoding the frame as usual */ 11947bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_estimate_missing_mvs(pbi); 11957bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 11961b362b15af34006e6a11974088a46d42b903418eJohann#endif 11971b362b15af34006e6a11974088a46d42b903418eJohann 11987bc9febe8749e98a3812a0dc4380ceae75c29450Johann memset(pc->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols); 11997bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->frame_corrupt_residual = 0; 12001b362b15af34006e6a11974088a46d42b903418eJohann 12011b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_MULTITHREAD 12027bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION) { 12037bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int thread; 12047bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8mt_decode_mb_rows(pbi, xd); 12057bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_yv12_extend_frame_borders(yv12_fb_new); 12067bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (thread = 0; thread < pbi->decoding_thread_count; ++thread) { 12077bc9febe8749e98a3812a0dc4380ceae75c29450Johann corrupt_tokens |= pbi->mb_row_di[thread].mbd.corrupted; 12081b362b15af34006e6a11974088a46d42b903418eJohann } 12097bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else 12101b362b15af34006e6a11974088a46d42b903418eJohann#endif 12117bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 12127bc9febe8749e98a3812a0dc4380ceae75c29450Johann decode_mb_rows(pbi); 12137bc9febe8749e98a3812a0dc4380ceae75c29450Johann corrupt_tokens |= xd->corrupted; 12147bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 12151b362b15af34006e6a11974088a46d42b903418eJohann 12167bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* Collect information about decoder corruption. */ 12177bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* 1. Check first boolean decoder for errors. */ 12187bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_fb_new->corrupted = vp8dx_bool_error(bc); 12197bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* 2. Check the macroblock information */ 12207bc9febe8749e98a3812a0dc4380ceae75c29450Johann yv12_fb_new->corrupted |= corrupt_tokens; 12217bc9febe8749e98a3812a0dc4380ceae75c29450Johann 12227bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (!pbi->decoded_key_frame) { 12237bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->frame_type == KEY_FRAME && !yv12_fb_new->corrupted) { 12247bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->decoded_key_frame = 1; 12257bc9febe8749e98a3812a0dc4380ceae75c29450Johann } else { 12267bc9febe8749e98a3812a0dc4380ceae75c29450Johann vpx_internal_error(&pbi->common.error, VPX_CODEC_CORRUPT_FRAME, 12277bc9febe8749e98a3812a0dc4380ceae75c29450Johann "A stream must start with a complete key frame"); 12281b362b15af34006e6a11974088a46d42b903418eJohann } 12297bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 12301b362b15af34006e6a11974088a46d42b903418eJohann 12317bc9febe8749e98a3812a0dc4380ceae75c29450Johann /* vpx_log("Decoder: Frame Decoded, Size Roughly:%d bytes 12327bc9febe8749e98a3812a0dc4380ceae75c29450Johann * \n",bc->pos+pbi->bc2.pos); */ 12331b362b15af34006e6a11974088a46d42b903418eJohann 12347bc9febe8749e98a3812a0dc4380ceae75c29450Johann if (pc->refresh_entropy_probs == 0) { 12357bc9febe8749e98a3812a0dc4380ceae75c29450Johann memcpy(&pc->fc, &pc->lfc, sizeof(pc->fc)); 12367bc9febe8749e98a3812a0dc4380ceae75c29450Johann pbi->independent_partitions = prev_independent_partitions; 12377bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 12381b362b15af34006e6a11974088a46d42b903418eJohann 12391b362b15af34006e6a11974088a46d42b903418eJohann#ifdef PACKET_TESTING 12407bc9febe8749e98a3812a0dc4380ceae75c29450Johann { 12417bc9febe8749e98a3812a0dc4380ceae75c29450Johann FILE *f = fopen("decompressor.VP8", "ab"); 12427bc9febe8749e98a3812a0dc4380ceae75c29450Johann unsigned int size = pbi->bc2.pos + pbi->bc.pos + 8; 12437bc9febe8749e98a3812a0dc4380ceae75c29450Johann fwrite((void *)&size, 4, 1, f); 12447bc9febe8749e98a3812a0dc4380ceae75c29450Johann fwrite((void *)pbi->Source, size, 1, f); 12457bc9febe8749e98a3812a0dc4380ceae75c29450Johann fclose(f); 12467bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 12471b362b15af34006e6a11974088a46d42b903418eJohann#endif 12481b362b15af34006e6a11974088a46d42b903418eJohann 12497bc9febe8749e98a3812a0dc4380ceae75c29450Johann return 0; 12501b362b15af34006e6a11974088a46d42b903418eJohann} 1251