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