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