13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h"
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "zigzag.h"
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongtypedef PV_STATUS(*VlcDecFuncP)(BitstreamDecVideo *stream, Tcoef *pTcoef);
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic const uint8 AC_rowcol[64] = {    0, 0, 0, 0, 0, 0, 0, 0,
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                   };
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic const uint8 mask[8] = /*  for fast bitmap */
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {128, 64, 32, 16, 8, 4, 2, 1};
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- VlcDequantMpegBlock -- Decodes the DCT coefficients of one 8x8 block and perform
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dequantization using Mpeg mode.
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Date:       08/08/2000
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Modified:      3/21/01
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                Added pre IDCT clipping, new ACDC prediction structure, ACDC prediction clipping,
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                16-bit int case, removed multiple zigzaging
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong******************************************************************************/
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_MAIN_PROFILE
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint VlcDequantMpegIntraBlock(void *vid, int comp, int switched,
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData*) vid;
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol = video->vol[video->currLayer];
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint CBP = video->headerInfo.CBP[mbnum];
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP = video->QPMB[mbnum];
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_row = video->predDCAC_row + x_pos;
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_col = video->predDCAC_col;
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint ACpred_flag = (uint) video->acPredFlag[mbnum];
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** VLC *****/
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i, j, k;
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Tcoef run_level;
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int last, return_status;
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VlcDecFuncP vlcDecCoeff;
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int direction;
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int *inv_zigzag;
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** Quantizer ****/
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int dc_scaler;
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int sum;
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int *qmat;
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 temp;
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int B_Xtab[6] = {0, 1, 0, 1, 2, 3};
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int B_Ytab[6] = {0, 0, 1, 1, 2, 3};
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *dcac_row, *dcac_col;
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dcac_row = (*DCAC_row)[B_Xtab[comp]];
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dcac_col = (*DCAC_col)[B_Ytab[comp]];
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    i = 1 - switched;
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *bitmaprow = 0;
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* select which Huffman table to be used */
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vlcDecCoeff = video->vlcDecCoeffIntra;
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dc_scaler = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr;
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* enter the zero run decoding loop */
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    sum = 0;
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    qmat = currVol->iqmat;
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* perform only VLC decoding */
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* We cannot do DCACrecon before VLC decoding.  10/17/2000 */
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    doDCACPrediction(video, comp, datablock, &direction);
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!ACpred_flag) direction = 0;
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6);
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (CBP & (1 << (5 - comp)))
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        do
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return_status = (*vlcDecCoeff)(stream, &run_level);
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (return_status != PV_SUCCESS)
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                last = 1;/*  11/1/2000 let it slips undetected, just like
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                         in original version */
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i = VLC_ERROR;
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i += run_level.run;
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            last = run_level.last;
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (i >= 64)
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /*  i = NCOEFF_BLOCK; */    /*  11/1/00 */
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i = VLC_NO_LAST_BIT;
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                last = 1;
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            k = inv_zigzag[i];
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (run_level.sign == 1)
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] -= run_level.level;
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] += run_level.level;
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (AC_rowcol[k])
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (int32)datablock[k] * qmat[k] * QP;
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (temp + (0x7 & (temp >> 31))) >> 3;
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (temp > 2047) temp = 2047;
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (temp < -2048) temp = -2048;
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] = (int) temp;
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[k&0x7] |= mask[k>>3];
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                sum ^= temp;
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i++;
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (!last);
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = 1;       /*  04/26/01  needed for switched case */
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* dequantize the rest of AC predicted coeff that haven't been dequant */
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (ACpred_flag)
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = NCOEFF_BLOCK; /* otherwise, FAST IDCT won't work correctly,  10/18/2000 */
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!direction) /* check vertical */
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[0]  = datablock[1];
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[1]  = datablock[2];
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[2]  = datablock[3];
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[3]  = datablock[4];
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[4]  = datablock[5];
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[5]  = datablock[6];
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[6]  = datablock[7];
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (j = 0, k = 8; k < 64; k += 8, j++)
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (dcac_col[j] = datablock[k])
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {     /* ACDC clipping  03/26/01 */
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (datablock[k] > 2047) dcac_col[j] = 2047;
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (datablock[k] < -2048) dcac_col[j] = -2048;
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)dcac_col[j] * qmat[k] * QP;
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01*/
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048) temp = -2048;
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int)temp;
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    sum ^= temp; /*  7/5/01 */
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[0] |= mask[k>>3];
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (k = 1; k < 8; k++)
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (datablock[k])
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)datablock[k] * qmat[k] * QP;
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01*/
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048) temp = -2048;
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int)temp;
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    sum ^= temp; /*  7/5/01 */
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[k] |= 128;
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[0]  = datablock[8];
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[1]  = datablock[16];
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[2]  = datablock[24];
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[3]  = datablock[32];
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[4]  = datablock[40];
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[5]  = datablock[48];
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[6]  = datablock[56];
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (j = 0, k = 1; k < 8; k++, j++)
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (dcac_row[j] = datablock[k])
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {     /* ACDC clipping  03/26/01 */
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (datablock[k] > 2047) dcac_row[j] = 2047;
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (datablock[k] < -2048) dcac_row[j] = -2048;
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)dcac_row[j] * qmat[k] * QP;
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01 */
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048) temp = -2048;
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int)temp;
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    sum ^= temp;
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[k] |= 128;
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (k = 8; k < 64; k += 8)
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (datablock[k])
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)datablock[k] * qmat[k] * QP;
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01 */
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048) temp = -2048;
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int)temp;
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    sum ^= temp;
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[0] |= mask[k>>3];
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Store the qcoeff-values needed later for prediction */
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[0] = datablock[1];                /*  ACDC, no need for clipping */
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[1] = datablock[2];
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[2] = datablock[3];
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[3] = datablock[4];
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[4] = datablock[5];
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[5] = datablock[6];
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[6] = datablock[7];
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[0] = datablock[8];
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[1] = datablock[16];
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[2] = datablock[24];
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[3] = datablock[32];
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[4] = datablock[40];
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[5] = datablock[48];
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[6] = datablock[56];
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 1; k < 8; k++)
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (datablock[k])
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (int32)datablock[k] * qmat[k] * QP;
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01*/
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (temp > 2047) temp = 2047;
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (temp < -2048) temp = -2048;
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] = (int)temp;
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                sum ^= temp; /*  7/5/01 */
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[k] |= 128;
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 8; k < 64; k += 8)
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (datablock[k])
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (int32)datablock[k] * qmat[k] * QP;
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01 */
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (temp > 2047) temp = 2047;
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (temp < -2048) temp = -2048;
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] = (int)temp;
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                sum ^= temp;
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[0] |= mask[k>>3];
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (datablock[0])
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = (int32)datablock[0] * dc_scaler;
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (temp > 2047) temp = 2047;            /*  03/14/01 */
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if (temp < -2048)  temp = -2048;
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        datablock[0] = (int)temp;
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        sum ^= temp;
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bitmapcol[0] |= 128;
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if ((sum & 1) == 0)
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        datablock[63] = datablock[63] ^ 0x1;
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT   /*  7/5/01, need to update bitmap */
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (datablock[63])
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bitmapcol[7] |= 1;
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = (-64 & i) | NCOEFF_BLOCK;   /*  if i > -1 then i is set to NCOEFF_BLOCK */
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (i > 10)
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 1; k < 4; k++)
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (bitmapcol[k] != 0)
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                (*bitmaprow) |= mask[k];
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Store the qcoeff-values needed later for prediction */
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    (*DC)[comp] = datablock[0];
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return i;
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- VlcDequantMpegInterBlock -- Decodes the DCT coefficients of one 8x8 block and perform
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dequantization using Mpeg mode for INTER block.
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Date:       08/08/2000
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Modified:              3/21/01
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                clean up, added clipping, 16-bit int case, new ACDC prediction
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong******************************************************************************/
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint VlcDequantMpegInterBlock(void *vid, int comp,
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData*) vid;
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol = video->vol[video->currLayer];
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP = video->QPMB[mbnum];
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** VLC *****/
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i, k;
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Tcoef run_level;
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int last, return_status;
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VlcDecFuncP vlcDecCoeff;
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** Quantizer ****/
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int sum;
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int *qmat;
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 temp;
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    i = 0 ;
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *bitmaprow = 0;
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* select which Huffman table to be used */
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vlcDecCoeff = video->vlcDecCoeffInter;
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* enter the zero run decoding loop */
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    sum = 0;
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    qmat = currVol->niqmat;
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return_status = (*vlcDecCoeff)(stream, &run_level);
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (return_status != PV_SUCCESS)
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            last = 1;/*  11/1/2000 let it slips undetected, just like
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                     in original version */
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i = VLC_ERROR;
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            sum = 1;    /* no of coefficients should not get reset   03/07/2002 */
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i += run_level.run;
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        last = run_level.last;
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (i >= 64)
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  i = NCOEFF_BLOCK; */    /*  11/1/00 */
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            //return VLC_NO_LAST_BIT;
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i = VLC_NO_LAST_BIT;
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            last = 1;
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            sum = 1;    /* no of coefficients should not get reset   03/07/2002 */
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        k = zigzag_inv[i];
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (run_level.sign == 1)
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = (-(int32)(2 * run_level.level + 1) * qmat[k] * QP + 15) >> 4; /*  03/23/01 */
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (temp < -2048) temp = - 2048;
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = ((int32)(2 * run_level.level + 1) * qmat[k] * QP) >> 4; /*  03/23/01 */
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (temp > 2047) temp = 2047;
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        datablock[k] = (int)temp;
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bitmapcol[k&0x7] |= mask[k>>3];
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        sum ^= temp;
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i++;
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (!last);
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if ((sum & 1) == 0)
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        datablock[63] = datablock[63] ^ 0x1;
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT   /*  7/5/01, need to update bitmap */
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (datablock[63])
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bitmapcol[7] |= 1;
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = NCOEFF_BLOCK;
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (i > 10)
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 1; k < 4; k++)               /*  07/19/01 */
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (bitmapcol[k] != 0)
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                (*bitmaprow) |= mask[k];
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return i;
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- VlcDequantIntraH263Block -- Decodes the DCT coefficients of one 8x8 block and perform
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dequantization in H.263 mode for INTRA block.
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Date:       08/08/2000
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Modified:               3/21/01
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                clean up, added clipping, 16-bit int case, removed multiple zigzaging
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong******************************************************************************/
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint VlcDequantH263IntraBlock(VideoDecData *video, int comp, int switched,
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 temp;
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint CBP = video->headerInfo.CBP[mbnum];
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP = video->QPMB[mbnum];
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_row = video->predDCAC_row + x_pos;
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_col = video->predDCAC_col;
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint ACpred_flag = (uint) video->acPredFlag[mbnum];
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** VLC *****/
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i, j, k;
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Tcoef run_level;
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int last, return_status;
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VlcDecFuncP vlcDecCoeff;
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int direction;
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int *inv_zigzag;
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** Quantizer ****/
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int dc_scaler;
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int sgn_coeff;
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int B_Xtab[6] = {0, 1, 0, 1, 2, 3};
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int B_Ytab[6] = {0, 0, 1, 1, 2, 3};
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *dcac_row, *dcac_col;
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dcac_row = (*DCAC_row)[B_Xtab[comp]];
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dcac_col = (*DCAC_col)[B_Ytab[comp]];
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *bitmaprow = 0;
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* select which Huffman table to be used */
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vlcDecCoeff = video->vlcDecCoeffIntra;
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dc_scaler = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr;
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* perform only VLC decoding */
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    doDCACPrediction(video, comp, datablock, &direction);
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!ACpred_flag) direction = 0;
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6);  /*  04/17/01 */
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    i = 1;
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (CBP & (1 << (5 - comp)))
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = 1 - switched;
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        do
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return_status = (*vlcDecCoeff)(stream, &run_level);
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (return_status != PV_SUCCESS)
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                last = 1;/* 11/1/2000 let it slips undetected, just like
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                         in original version */
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i = VLC_ERROR;
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ACpred_flag = 0;   /* no of coefficients should not get reset   03/07/2002 */
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i += run_level.run;
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            last = run_level.last;
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (i >= 64)
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i = VLC_NO_LAST_BIT;
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                last = 1;
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            k = inv_zigzag[i];
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (run_level.sign == 1)
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] -= run_level.level;
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                sgn_coeff = -1;
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] += run_level.level;
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                sgn_coeff = 1;
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (AC_rowcol[k])   /*  10/25/2000 */
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (temp > 2047) temp = 2047;            /*  03/14/01 */
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (temp < -2048)  temp = -2048;
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] = (int16) temp;
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[k&0x7] |= mask[k>>3];
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i++;
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (!last);
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* dequantize the rest of AC predicted coeff that haven't been dequant */
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (ACpred_flag)
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = NCOEFF_BLOCK; /* otherwise, FAST IDCT won't work correctly,  10/18/2000 */
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!direction) /* check vertical */
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[0]  = datablock[1];
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[1]  = datablock[2];
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[2]  = datablock[3];
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[3]  = datablock[4];
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[4]  = datablock[5];
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[5]  = datablock[6];
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_row[6]  = datablock[7];
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (j = 0, k = 8; k < 64; k += 8, j++)
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                dcac_col[j] = datablock[k];
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (dcac_col[j])
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (datablock[k] > 0)
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (datablock[k] > 2047) dcac_col[j] = 2047;
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        sgn_coeff = 1;
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (datablock[k] < -2048) dcac_col[j] = -2048;
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        sgn_coeff = -1;
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048)  temp = -2048;
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int16) temp;
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[0] |= mask[k>>3];
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (k = 1; k < 8; k++)
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (datablock[k])
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    sgn_coeff = (datablock[k] > 0) ? 1 : -1;
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048)  temp = -2048;
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int16) temp;
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[k] |= 128;
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[0]  = datablock[8];
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[1]  = datablock[16];
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[2]  = datablock[24];
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[3]  = datablock[32];
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[4]  = datablock[40];
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[5]  = datablock[48];
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dcac_col[6]  = datablock[56];
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (j = 0, k = 1; k < 8; k++, j++)
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                dcac_row[j] = datablock[k];
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (dcac_row[j])
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (datablock[k] > 0)
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (datablock[k] > 2047) dcac_row[j] = 2047;
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        sgn_coeff = 1;
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (datablock[k] < -2048) dcac_row[j] = -2048;
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        sgn_coeff = -1;
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048)  temp = -2048;
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int) temp;
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[k] |= 128;
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (k = 8; k < 64; k += 8)
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (datablock[k])
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    sgn_coeff = (datablock[k] > 0) ? 1 : -1;
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (temp < -2048)  temp = -2048;
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] = (int16) temp;
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[0] |= mask[k>>3];
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[0]  = datablock[1];
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[1]  = datablock[2];
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[2]  = datablock[3];
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[3]  = datablock[4];
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[4]  = datablock[5];
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[5]  = datablock[6];
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[6]  = datablock[7];
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[0]  = datablock[8];
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[1]  = datablock[16];
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[2]  = datablock[24];
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[3]  = datablock[32];
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[4]  = datablock[40];
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[5]  = datablock[48];
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[6]  = datablock[56];
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 1; k < 8; k++)
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (datablock[k])
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                sgn_coeff = (datablock[k] > 0) ? 1 : -1;
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (temp > 2047) temp = 2047;            /*  03/14/01 */
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (temp < -2048)  temp = -2048;
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] = (int16) temp;
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[k] |= 128;
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 8; k < 64; k += 8)
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (datablock[k])
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                sgn_coeff = (datablock[k] > 0) ? 1 : -1;
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (temp > 2047) temp = 2047;            /*  03/14/01 */
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (temp < -2048)  temp = -2048;
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] = (int16) temp;
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[0] |= mask[k>>3];
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (datablock[0])
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bitmapcol[0] |= 128;
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        temp = (int32)datablock[0] * dc_scaler;
7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (temp > 2047) temp = 2047;            /*  03/14/01 */
7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if (temp < -2048)  temp = -2048;
7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        datablock[0] = (int16)temp;
7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (i > 10)
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 1; k < 4; k++)  /* if i > 10 then k = 0 does not matter  */
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (bitmapcol[k] != 0)
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */
7953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Store the qcoeff-values needed later for prediction */
8013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    (*DC)[comp] = datablock[0];
8023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return i;
8033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint VlcDequantH263IntraBlock_SH(VideoDecData *video, int comp, uint8 *bitmapcol, uint8 *bitmaprow)
8063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
8083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *datablock = video->mblock->block[comp]; /*, 10/20/2000, assume it has been reset of all-zero !!!*/
8093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 temp;
8103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
8113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint CBP = video->headerInfo.CBP[mbnum];
8123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 QP = video->QPMB[mbnum];
8133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
8143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
8153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_row = video->predDCAC_row + x_pos;
8163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_col = video->predDCAC_col;
8173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint ACpred_flag = (uint) video->acPredFlag[mbnum];
8183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** VLC *****/
8203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i, k;
8213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Tcoef run_level;
8223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int last, return_status;
8233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VlcDecFuncP vlcDecCoeff;
8243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
8253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int direction;
8263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int *inv_zigzag;
8273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** Quantizer ****/
8293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int B_Xtab[6] = {0, 1, 0, 1, 2, 3};
8333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const int B_Ytab[6] = {0, 0, 1, 1, 2, 3};
8343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *dcac_row, *dcac_col;
8363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dcac_row = (*DCAC_row)[B_Xtab[comp]];
8383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dcac_col = (*DCAC_col)[B_Ytab[comp]];
8393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    i = 1;
8403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
8423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
8433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *bitmaprow = 0;
8443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* select which Huffman table to be used */
8473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vlcDecCoeff = video->vlcDecCoeffIntra;
8483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
8503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (comp > 3)        /* ANNEX_T */
8513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        QP = video->QP_CHR;
8533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!video->advanced_INTRA)
8553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((CBP & (1 << (5 - comp))) == 0)
8593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
8613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bitmapcol[0] = 128;
8623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bitmapcol[1] = bitmapcol[2] = bitmapcol[3] = bitmapcol[4] = bitmapcol[5] = bitmapcol[6] = bitmapcol[7] = 0;
8633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            datablock[0] <<= 3;  /* no need to clip */
8653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return 1;//ncoeffs;
8663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
8683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* enter the zero run decoding loop */
8703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            do
8713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return_status = (*vlcDecCoeff)(stream, &run_level);
8733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (return_status != PV_SUCCESS)
8743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
8753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    last = 1;/*  11/1/2000 let it slips undetected, just like
8763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                             in original version */
8773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    i = VLC_ERROR;
8783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
8793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
8803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i += run_level.run;
8823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                last = run_level.last;
8833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (i >= 64)
8843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
8853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /*  i = NCOEFF_BLOCK; */    /*  11/1/00 */
8863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    i = VLC_NO_LAST_BIT;
8873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    last = 1;
8883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
8893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
8903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                k = zigzag_inv[i];
8913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (run_level.sign == 0)
8933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
8943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = (int32)QP * (2 * run_level.level + 1) - 1 + (QP & 1);
8953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp > 2047) temp = 2047;
8963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
8973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
8983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
8993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    temp = -(int32)QP * (2 * run_level.level + 1) + 1 - (QP & 1);
9003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (temp < -2048) temp = -2048;
9013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[k] = (int16) temp;
9053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
9073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[k&0x7] |= mask[k>>3];
9083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
9093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i++;
9103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (!last);
9123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* no ACDC prediction when ACDC disable  */
9153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (datablock[0])
9163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
9183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bitmapcol[0] |= 128;
9193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
9203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            datablock[0] <<= 3;        /* no need to clip  09/18/2001 */
9213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
9233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else  /* advanced_INTRA mode */
9253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i = 1;
9273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        doDCACPrediction_I(video, comp, datablock);
9283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* perform only VLC decoding */
9293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!ACpred_flag)
9303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            direction = 0;
9323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
9343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            direction = video->mblock->direction;
9363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6);  /*  04/17/01 */
9393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP & (1 << (5 - comp)))
9413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i = 0;
9433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            do
9443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return_status = (*vlcDecCoeff)(stream, &run_level);
9463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (return_status != PV_SUCCESS)
9473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    last = 1;/*  11/1/2000 let it slips undetected, just like
9493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                 in original version */
9503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    i = VLC_ERROR;
9513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    ACpred_flag = 0;   /* no of coefficients should not get reset   03/07/2002 */
9523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
9533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i += run_level.run;
9563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                last = run_level.last;
9573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (i >= 64)
9583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /*                  i = NCOEFF_BLOCK; */    /*  11/1/00 */
9603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
9613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    i = VLC_NO_LAST_BIT;
9623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    last = 1;
9633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
9643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                k = inv_zigzag[i];
9673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (run_level.sign == 0)
9693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] += (int16)QP * 2 * run_level.level;
9713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (datablock[k] > 2047) datablock[k] = 2047;
9723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
9743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    datablock[k] -= (int16)QP * 2 * run_level.level;
9763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (datablock[k] < -2048) datablock[k] = -2048;
9773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
9793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                bitmapcol[k&0x7] |= mask[k>>3];
9803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
9813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i++;
9833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (!last);
9853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF
9883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* dequantize the rest of AC predicted coeff that haven't been dequant */
9893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (ACpred_flag)
9913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i = NCOEFF_BLOCK;
9933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (k = 1; k < 8; k++)
9943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (datablock[k])
9963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[k] |= 128;
9983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (datablock[k<<3])
10013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
10023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    bitmapcol[0] |= mask[k];
10033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
10043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[0]  = datablock[1];
10083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[1]  = datablock[2];
10093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[2]  = datablock[3];
10103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[3]  = datablock[4];
10113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[4]  = datablock[5];
10123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[5]  = datablock[6];
10133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_row[6]  = datablock[7];
10143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[0]  = datablock[8];
10163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[1]  = datablock[16];
10173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[2]  = datablock[24];
10183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[3]  = datablock[32];
10193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[4]  = datablock[40];
10203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[5]  = datablock[48];
10213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        dcac_col[6]  = datablock[56];
10223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (datablock[0])
10243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
10263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bitmapcol[0] |= 128;
10273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
10283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            datablock[0] |= 1;
10303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (datablock[0] < 0)
10313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                datablock[0] = 0;
10333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
10373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
10393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (i > 10)
10403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 1; k < 4; k++)  /* if i > 10 then k = 0 does not matter  */
10423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (bitmapcol[k] != 0)
10443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */
10463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
10503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Store the qcoeff-values needed later for prediction */
10523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    (*DC)[comp] = datablock[0];
10533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return i;
10543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
10553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
10573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
10583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- VlcDequantInterH263Block -- Decodes the DCT coefficients of one 8x8 block and perform
10593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dequantization in H.263 mode for INTER block.
10603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Date:       08/08/2000
10613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Modified:             3/21/01
10623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                clean up, added clipping, 16-bit int case
10633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong******************************************************************************/
10643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint VlcDequantH263InterBlock(VideoDecData *video, int comp,
10673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
10683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
10693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
10703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
10713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 temp;
10723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
10733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP = video->QPMB[mbnum];
10743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** VLC *****/
10763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i, k;
10773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Tcoef run_level;
10783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int last, return_status;
10793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VlcDecFuncP vlcDecCoeff;
10803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*** Quantizer ****/
10823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    i = 0;
10853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
10873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
10883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *bitmaprow = 0;
10893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
10903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* select which Huffman table to be used */
10923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vlcDecCoeff = video->vlcDecCoeffInter;
10933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* enter the zero run decoding loop */
10953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
10963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return_status = (*vlcDecCoeff)(stream, &run_level);
10983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (return_status != PV_SUCCESS)
10993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            last = 1;/*  11/1/2000 let it slips undetected, just like
11033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                     in original version */
11043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i = -1;
11053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
11063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i += run_level.run;
11093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        last = run_level.last;
11103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (i >= 64)
11113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i = -1;
11133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            last = 1;
11143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
11153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (run_level.sign == 0)
11183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = (int32)QP * (2 * run_level.level + 1) - 1 + (QP & 1);
11203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (temp > 2047) temp = 2047;
11213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
11243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            temp = -(int32)QP * (2 * run_level.level + 1) + 1 - (QP & 1);
11263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (temp < -2048) temp = -2048;
11273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        k = zigzag_inv[i];
11303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        datablock[k] = (int16)temp;
11313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
11323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bitmapcol[k&0x7] |= mask[k>>3];
11333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
11343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        i++;
11353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
11363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (!last);
11373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT
11393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (i > 10)         /*  07/19/01 */
11403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
11413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (k = 1; k < 4; k++)       /*  if (i > 10 ) k = 0 does not matter */
11423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (bitmapcol[k] != 0)
11443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */
11463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
11493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
11503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return i;
11513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
11523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1153