102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------
202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo
302f5b5447de349216a40086ca6061efefb5a3025James Dong *
402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License");
502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License.
602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at
702f5b5447de349216a40086ca6061efefb5a3025James Dong *
802f5b5447de349216a40086ca6061efefb5a3025James Dong *      http://www.apache.org/licenses/LICENSE-2.0
902f5b5447de349216a40086ca6061efefb5a3025James Dong *
1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software
1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied.
1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions
1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License.
1602f5b5447de349216a40086ca6061efefb5a3025James Dong * -------------------------------------------------------------------
1702f5b5447de349216a40086ca6061efefb5a3025James Dong */
1802f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h"
1902f5b5447de349216a40086ca6061efefb5a3025James Dong#include "vlc_decode.h"
2002f5b5447de349216a40086ca6061efefb5a3025James Dong#include "zigzag.h"
2102f5b5447de349216a40086ca6061efefb5a3025James Dong
2202f5b5447de349216a40086ca6061efefb5a3025James Dong
2302f5b5447de349216a40086ca6061efefb5a3025James Dongtypedef PV_STATUS(*VlcDecFuncP)(BitstreamDecVideo *stream, Tcoef *pTcoef);
2402f5b5447de349216a40086ca6061efefb5a3025James Dongstatic const uint8 AC_rowcol[64] = {    0, 0, 0, 0, 0, 0, 0, 0,
2502f5b5447de349216a40086ca6061efefb5a3025James Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
2602f5b5447de349216a40086ca6061efefb5a3025James Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
2702f5b5447de349216a40086ca6061efefb5a3025James Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
2802f5b5447de349216a40086ca6061efefb5a3025James Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
2902f5b5447de349216a40086ca6061efefb5a3025James Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
3002f5b5447de349216a40086ca6061efefb5a3025James Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
3102f5b5447de349216a40086ca6061efefb5a3025James Dong                                        0, 1, 1, 1, 1, 1, 1, 1,
3202f5b5447de349216a40086ca6061efefb5a3025James Dong                                   };
3302f5b5447de349216a40086ca6061efefb5a3025James Dongstatic const uint8 mask[8] = /*  for fast bitmap */
3402f5b5447de349216a40086ca6061efefb5a3025James Dong    {128, 64, 32, 16, 8, 4, 2, 1};
3502f5b5447de349216a40086ca6061efefb5a3025James Dong
3602f5b5447de349216a40086ca6061efefb5a3025James Dong
3702f5b5447de349216a40086ca6061efefb5a3025James Dong
3802f5b5447de349216a40086ca6061efefb5a3025James Dong/***********************************************************CommentBegin******
3902f5b5447de349216a40086ca6061efefb5a3025James Dong*
4002f5b5447de349216a40086ca6061efefb5a3025James Dong* -- VlcDequantMpegBlock -- Decodes the DCT coefficients of one 8x8 block and perform
4102f5b5447de349216a40086ca6061efefb5a3025James Dong            dequantization using Mpeg mode.
4202f5b5447de349216a40086ca6061efefb5a3025James Dong    Date:       08/08/2000
4302f5b5447de349216a40086ca6061efefb5a3025James Dong
4402f5b5447de349216a40086ca6061efefb5a3025James Dong    Modified:      3/21/01
4502f5b5447de349216a40086ca6061efefb5a3025James Dong                Added pre IDCT clipping, new ACDC prediction structure, ACDC prediction clipping,
4602f5b5447de349216a40086ca6061efefb5a3025James Dong                16-bit int case, removed multiple zigzaging
4702f5b5447de349216a40086ca6061efefb5a3025James Dong******************************************************************************/
4802f5b5447de349216a40086ca6061efefb5a3025James Dong
4902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_SUPPORT_MAIN_PROFILE
5002f5b5447de349216a40086ca6061efefb5a3025James Dongint VlcDequantMpegIntraBlock(void *vid, int comp, int switched,
5102f5b5447de349216a40086ca6061efefb5a3025James Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
5202f5b5447de349216a40086ca6061efefb5a3025James Dong{
5302f5b5447de349216a40086ca6061efefb5a3025James Dong    VideoDecData *video = (VideoDecData*) vid;
5402f5b5447de349216a40086ca6061efefb5a3025James Dong    Vol *currVol = video->vol[video->currLayer];
5502f5b5447de349216a40086ca6061efefb5a3025James Dong    BitstreamDecVideo *stream = video->bitstream;
5602f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
5702f5b5447de349216a40086ca6061efefb5a3025James Dong    int mbnum = video->mbnum;
5802f5b5447de349216a40086ca6061efefb5a3025James Dong    uint CBP = video->headerInfo.CBP[mbnum];
5902f5b5447de349216a40086ca6061efefb5a3025James Dong    int QP = video->QPMB[mbnum];
6002f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCStore *DC = video->predDC + mbnum;
6102f5b5447de349216a40086ca6061efefb5a3025James Dong    int x_pos = video->mbnum_col;
6202f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCACStore *DCAC_row = video->predDCAC_row + x_pos;
6302f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCACStore *DCAC_col = video->predDCAC_col;
6402f5b5447de349216a40086ca6061efefb5a3025James Dong    uint ACpred_flag = (uint) video->acPredFlag[mbnum];
6502f5b5447de349216a40086ca6061efefb5a3025James Dong
6602f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** VLC *****/
6702f5b5447de349216a40086ca6061efefb5a3025James Dong    int i, j, k;
6802f5b5447de349216a40086ca6061efefb5a3025James Dong    Tcoef run_level;
6902f5b5447de349216a40086ca6061efefb5a3025James Dong    int last, return_status;
7002f5b5447de349216a40086ca6061efefb5a3025James Dong    VlcDecFuncP vlcDecCoeff;
7102f5b5447de349216a40086ca6061efefb5a3025James Dong    int direction;
7202f5b5447de349216a40086ca6061efefb5a3025James Dong    const int *inv_zigzag;
7302f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** Quantizer ****/
7402f5b5447de349216a40086ca6061efefb5a3025James Dong    int dc_scaler;
7502f5b5447de349216a40086ca6061efefb5a3025James Dong    int sum;
7602f5b5447de349216a40086ca6061efefb5a3025James Dong    int *qmat;
7702f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 temp;
7802f5b5447de349216a40086ca6061efefb5a3025James Dong
7902f5b5447de349216a40086ca6061efefb5a3025James Dong    const int B_Xtab[6] = {0, 1, 0, 1, 2, 3};
8002f5b5447de349216a40086ca6061efefb5a3025James Dong    const int B_Ytab[6] = {0, 0, 1, 1, 2, 3};
8102f5b5447de349216a40086ca6061efefb5a3025James Dong
8202f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *dcac_row, *dcac_col;
8302f5b5447de349216a40086ca6061efefb5a3025James Dong
8402f5b5447de349216a40086ca6061efefb5a3025James Dong    dcac_row = (*DCAC_row)[B_Xtab[comp]];
8502f5b5447de349216a40086ca6061efefb5a3025James Dong    dcac_col = (*DCAC_col)[B_Ytab[comp]];
8602f5b5447de349216a40086ca6061efefb5a3025James Dong
8702f5b5447de349216a40086ca6061efefb5a3025James Dong
8802f5b5447de349216a40086ca6061efefb5a3025James Dong    i = 1 - switched;
8902f5b5447de349216a40086ca6061efefb5a3025James Dong
9002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
9102f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
9202f5b5447de349216a40086ca6061efefb5a3025James Dong    *bitmaprow = 0;
9302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
9402f5b5447de349216a40086ca6061efefb5a3025James Dong
9502f5b5447de349216a40086ca6061efefb5a3025James Dong
9602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* select which Huffman table to be used */
9702f5b5447de349216a40086ca6061efefb5a3025James Dong    vlcDecCoeff = video->vlcDecCoeffIntra;
9802f5b5447de349216a40086ca6061efefb5a3025James Dong
9902f5b5447de349216a40086ca6061efefb5a3025James Dong    dc_scaler = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr;
10002f5b5447de349216a40086ca6061efefb5a3025James Dong
10102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* enter the zero run decoding loop */
10202f5b5447de349216a40086ca6061efefb5a3025James Dong    sum = 0;
10302f5b5447de349216a40086ca6061efefb5a3025James Dong    qmat = currVol->iqmat;
10402f5b5447de349216a40086ca6061efefb5a3025James Dong
10502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* perform only VLC decoding */
10602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* We cannot do DCACrecon before VLC decoding.  10/17/2000 */
10702f5b5447de349216a40086ca6061efefb5a3025James Dong    doDCACPrediction(video, comp, datablock, &direction);
10802f5b5447de349216a40086ca6061efefb5a3025James Dong    if (!ACpred_flag) direction = 0;
10902f5b5447de349216a40086ca6061efefb5a3025James Dong    inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6);
11002f5b5447de349216a40086ca6061efefb5a3025James Dong    if (CBP & (1 << (5 - comp)))
11102f5b5447de349216a40086ca6061efefb5a3025James Dong    {
11202f5b5447de349216a40086ca6061efefb5a3025James Dong        do
11302f5b5447de349216a40086ca6061efefb5a3025James Dong        {
11402f5b5447de349216a40086ca6061efefb5a3025James Dong            return_status = (*vlcDecCoeff)(stream, &run_level);
11502f5b5447de349216a40086ca6061efefb5a3025James Dong            if (return_status != PV_SUCCESS)
11602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
11702f5b5447de349216a40086ca6061efefb5a3025James Dong                last = 1;/*  11/1/2000 let it slips undetected, just like
11802f5b5447de349216a40086ca6061efefb5a3025James Dong                         in original version */
11902f5b5447de349216a40086ca6061efefb5a3025James Dong                i = VLC_ERROR;
12002f5b5447de349216a40086ca6061efefb5a3025James Dong                ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
12102f5b5447de349216a40086ca6061efefb5a3025James Dong                break;
12202f5b5447de349216a40086ca6061efefb5a3025James Dong            }
12302f5b5447de349216a40086ca6061efefb5a3025James Dong
12402f5b5447de349216a40086ca6061efefb5a3025James Dong            i += run_level.run;
12502f5b5447de349216a40086ca6061efefb5a3025James Dong            last = run_level.last;
12602f5b5447de349216a40086ca6061efefb5a3025James Dong            if (i >= 64)
12702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
12802f5b5447de349216a40086ca6061efefb5a3025James Dong                /*  i = NCOEFF_BLOCK; */    /*  11/1/00 */
12902f5b5447de349216a40086ca6061efefb5a3025James Dong                ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
13002f5b5447de349216a40086ca6061efefb5a3025James Dong                i = VLC_NO_LAST_BIT;
13102f5b5447de349216a40086ca6061efefb5a3025James Dong                last = 1;
13202f5b5447de349216a40086ca6061efefb5a3025James Dong                break;
13302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
13402f5b5447de349216a40086ca6061efefb5a3025James Dong
13502f5b5447de349216a40086ca6061efefb5a3025James Dong            k = inv_zigzag[i];
13602f5b5447de349216a40086ca6061efefb5a3025James Dong
13702f5b5447de349216a40086ca6061efefb5a3025James Dong            if (run_level.sign == 1)
13802f5b5447de349216a40086ca6061efefb5a3025James Dong            {
13902f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] -= run_level.level;
14002f5b5447de349216a40086ca6061efefb5a3025James Dong            }
14102f5b5447de349216a40086ca6061efefb5a3025James Dong            else
14202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
14302f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] += run_level.level;
14402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
14502f5b5447de349216a40086ca6061efefb5a3025James Dong
14602f5b5447de349216a40086ca6061efefb5a3025James Dong            if (AC_rowcol[k])
14702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
14802f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (int32)datablock[k] * qmat[k] * QP;
14902f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (temp + (0x7 & (temp >> 31))) >> 3;
15002f5b5447de349216a40086ca6061efefb5a3025James Dong                if (temp > 2047) temp = 2047;
15102f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (temp < -2048) temp = -2048;
15202f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] = (int) temp;
15302f5b5447de349216a40086ca6061efefb5a3025James Dong
15402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
15502f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[k&0x7] |= mask[k>>3];
15602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
15702f5b5447de349216a40086ca6061efefb5a3025James Dong                sum ^= temp;
15802f5b5447de349216a40086ca6061efefb5a3025James Dong            }
15902f5b5447de349216a40086ca6061efefb5a3025James Dong
16002f5b5447de349216a40086ca6061efefb5a3025James Dong            i++;
16102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
16202f5b5447de349216a40086ca6061efefb5a3025James Dong        while (!last);
16302f5b5447de349216a40086ca6061efefb5a3025James Dong
16402f5b5447de349216a40086ca6061efefb5a3025James Dong    }
16502f5b5447de349216a40086ca6061efefb5a3025James Dong    else
16602f5b5447de349216a40086ca6061efefb5a3025James Dong    {
16702f5b5447de349216a40086ca6061efefb5a3025James Dong        i = 1;       /*  04/26/01  needed for switched case */
16802f5b5447de349216a40086ca6061efefb5a3025James Dong    }
16902f5b5447de349216a40086ca6061efefb5a3025James Dong    ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF
17002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* dequantize the rest of AC predicted coeff that haven't been dequant */
17102f5b5447de349216a40086ca6061efefb5a3025James Dong    if (ACpred_flag)
17202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
17302f5b5447de349216a40086ca6061efefb5a3025James Dong
17402f5b5447de349216a40086ca6061efefb5a3025James Dong        i = NCOEFF_BLOCK; /* otherwise, FAST IDCT won't work correctly,  10/18/2000 */
17502f5b5447de349216a40086ca6061efefb5a3025James Dong
17602f5b5447de349216a40086ca6061efefb5a3025James Dong        if (!direction) /* check vertical */
17702f5b5447de349216a40086ca6061efefb5a3025James Dong        {
17802f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[0]  = datablock[1];
17902f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[1]  = datablock[2];
18002f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[2]  = datablock[3];
18102f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[3]  = datablock[4];
18202f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[4]  = datablock[5];
18302f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[5]  = datablock[6];
18402f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[6]  = datablock[7];
18502f5b5447de349216a40086ca6061efefb5a3025James Dong
18602f5b5447de349216a40086ca6061efefb5a3025James Dong            for (j = 0, k = 8; k < 64; k += 8, j++)
18702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
18802f5b5447de349216a40086ca6061efefb5a3025James Dong                if (dcac_col[j] = datablock[k])
18902f5b5447de349216a40086ca6061efefb5a3025James Dong                {     /* ACDC clipping  03/26/01 */
19002f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (datablock[k] > 2047) dcac_col[j] = 2047;
19102f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (datablock[k] < -2048) dcac_col[j] = -2048;
19202f5b5447de349216a40086ca6061efefb5a3025James Dong
19302f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)dcac_col[j] * qmat[k] * QP;
19402f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01*/
19502f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;
19602f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048) temp = -2048;
19702f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int)temp;
19802f5b5447de349216a40086ca6061efefb5a3025James Dong                    sum ^= temp; /*  7/5/01 */
19902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
20002f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[0] |= mask[k>>3];
20102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
20202f5b5447de349216a40086ca6061efefb5a3025James Dong
20302f5b5447de349216a40086ca6061efefb5a3025James Dong                }
20402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
20502f5b5447de349216a40086ca6061efefb5a3025James Dong            for (k = 1; k < 8; k++)
20602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
20702f5b5447de349216a40086ca6061efefb5a3025James Dong                if (datablock[k])
20802f5b5447de349216a40086ca6061efefb5a3025James Dong                {
20902f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)datablock[k] * qmat[k] * QP;
21002f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01*/
21102f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;
21202f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048) temp = -2048;
21302f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int)temp;
21402f5b5447de349216a40086ca6061efefb5a3025James Dong                    sum ^= temp; /*  7/5/01 */
21502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
21602f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[k] |= 128;
21702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
21802f5b5447de349216a40086ca6061efefb5a3025James Dong
21902f5b5447de349216a40086ca6061efefb5a3025James Dong                }
22002f5b5447de349216a40086ca6061efefb5a3025James Dong            }
22102f5b5447de349216a40086ca6061efefb5a3025James Dong
22202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
22302f5b5447de349216a40086ca6061efefb5a3025James Dong        else
22402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
22502f5b5447de349216a40086ca6061efefb5a3025James Dong
22602f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[0]  = datablock[8];
22702f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[1]  = datablock[16];
22802f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[2]  = datablock[24];
22902f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[3]  = datablock[32];
23002f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[4]  = datablock[40];
23102f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[5]  = datablock[48];
23202f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[6]  = datablock[56];
23302f5b5447de349216a40086ca6061efefb5a3025James Dong
23402f5b5447de349216a40086ca6061efefb5a3025James Dong
23502f5b5447de349216a40086ca6061efefb5a3025James Dong            for (j = 0, k = 1; k < 8; k++, j++)
23602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
23702f5b5447de349216a40086ca6061efefb5a3025James Dong                if (dcac_row[j] = datablock[k])
23802f5b5447de349216a40086ca6061efefb5a3025James Dong                {     /* ACDC clipping  03/26/01 */
23902f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (datablock[k] > 2047) dcac_row[j] = 2047;
24002f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (datablock[k] < -2048) dcac_row[j] = -2048;
24102f5b5447de349216a40086ca6061efefb5a3025James Dong
24202f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)dcac_row[j] * qmat[k] * QP;
24302f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01 */
24402f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;
24502f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048) temp = -2048;
24602f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int)temp;
24702f5b5447de349216a40086ca6061efefb5a3025James Dong                    sum ^= temp;
24802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
24902f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[k] |= 128;
25002f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
25102f5b5447de349216a40086ca6061efefb5a3025James Dong
25202f5b5447de349216a40086ca6061efefb5a3025James Dong                }
25302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
25402f5b5447de349216a40086ca6061efefb5a3025James Dong
25502f5b5447de349216a40086ca6061efefb5a3025James Dong            for (k = 8; k < 64; k += 8)
25602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
25702f5b5447de349216a40086ca6061efefb5a3025James Dong                if (datablock[k])
25802f5b5447de349216a40086ca6061efefb5a3025James Dong                {
25902f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)datablock[k] * qmat[k] * QP;
26002f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01 */
26102f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;
26202f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048) temp = -2048;
26302f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int)temp;
26402f5b5447de349216a40086ca6061efefb5a3025James Dong                    sum ^= temp;
26502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
26602f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[0] |= mask[k>>3];
26702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
26802f5b5447de349216a40086ca6061efefb5a3025James Dong                }
26902f5b5447de349216a40086ca6061efefb5a3025James Dong            }
27002f5b5447de349216a40086ca6061efefb5a3025James Dong
27102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
27202f5b5447de349216a40086ca6061efefb5a3025James Dong    }
27302f5b5447de349216a40086ca6061efefb5a3025James Dong    else
27402f5b5447de349216a40086ca6061efefb5a3025James Dong    {
27502f5b5447de349216a40086ca6061efefb5a3025James Dong
27602f5b5447de349216a40086ca6061efefb5a3025James Dong        /* Store the qcoeff-values needed later for prediction */
27702f5b5447de349216a40086ca6061efefb5a3025James Dong
27802f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[0] = datablock[1];                /*  ACDC, no need for clipping */
27902f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[1] = datablock[2];
28002f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[2] = datablock[3];
28102f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[3] = datablock[4];
28202f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[4] = datablock[5];
28302f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[5] = datablock[6];
28402f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[6] = datablock[7];
28502f5b5447de349216a40086ca6061efefb5a3025James Dong
28602f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[0] = datablock[8];
28702f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[1] = datablock[16];
28802f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[2] = datablock[24];
28902f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[3] = datablock[32];
29002f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[4] = datablock[40];
29102f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[5] = datablock[48];
29202f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[6] = datablock[56];
29302f5b5447de349216a40086ca6061efefb5a3025James Dong
29402f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 1; k < 8; k++)
29502f5b5447de349216a40086ca6061efefb5a3025James Dong        {
29602f5b5447de349216a40086ca6061efefb5a3025James Dong            if (datablock[k])
29702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
29802f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (int32)datablock[k] * qmat[k] * QP;
29902f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01*/
30002f5b5447de349216a40086ca6061efefb5a3025James Dong                if (temp > 2047) temp = 2047;
30102f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (temp < -2048) temp = -2048;
30202f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] = (int)temp;
30302f5b5447de349216a40086ca6061efefb5a3025James Dong                sum ^= temp; /*  7/5/01 */
30402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
30502f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[k] |= 128;
30602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
30702f5b5447de349216a40086ca6061efefb5a3025James Dong
30802f5b5447de349216a40086ca6061efefb5a3025James Dong            }
30902f5b5447de349216a40086ca6061efefb5a3025James Dong        }
31002f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 8; k < 64; k += 8)
31102f5b5447de349216a40086ca6061efefb5a3025James Dong        {
31202f5b5447de349216a40086ca6061efefb5a3025James Dong            if (datablock[k])
31302f5b5447de349216a40086ca6061efefb5a3025James Dong            {
31402f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (int32)datablock[k] * qmat[k] * QP;
31502f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (temp + (0x7 & (temp >> 31))) >> 3;  /*  03/26/01 */
31602f5b5447de349216a40086ca6061efefb5a3025James Dong                if (temp > 2047) temp = 2047;
31702f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (temp < -2048) temp = -2048;
31802f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] = (int)temp;
31902f5b5447de349216a40086ca6061efefb5a3025James Dong                sum ^= temp;
32002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
32102f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[0] |= mask[k>>3];
32202f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
32302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
32402f5b5447de349216a40086ca6061efefb5a3025James Dong        }
32502f5b5447de349216a40086ca6061efefb5a3025James Dong
32602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
32702f5b5447de349216a40086ca6061efefb5a3025James Dong
32802f5b5447de349216a40086ca6061efefb5a3025James Dong
32902f5b5447de349216a40086ca6061efefb5a3025James Dong
33002f5b5447de349216a40086ca6061efefb5a3025James Dong    if (datablock[0])
33102f5b5447de349216a40086ca6061efefb5a3025James Dong    {
33202f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = (int32)datablock[0] * dc_scaler;
33302f5b5447de349216a40086ca6061efefb5a3025James Dong        if (temp > 2047) temp = 2047;            /*  03/14/01 */
33402f5b5447de349216a40086ca6061efefb5a3025James Dong        else if (temp < -2048)  temp = -2048;
33502f5b5447de349216a40086ca6061efefb5a3025James Dong        datablock[0] = (int)temp;
33602f5b5447de349216a40086ca6061efefb5a3025James Dong        sum ^= temp;
33702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
33802f5b5447de349216a40086ca6061efefb5a3025James Dong        bitmapcol[0] |= 128;
33902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
34002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
34102f5b5447de349216a40086ca6061efefb5a3025James Dong
34202f5b5447de349216a40086ca6061efefb5a3025James Dong    if ((sum & 1) == 0)
34302f5b5447de349216a40086ca6061efefb5a3025James Dong    {
34402f5b5447de349216a40086ca6061efefb5a3025James Dong        datablock[63] = datablock[63] ^ 0x1;
34502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT   /*  7/5/01, need to update bitmap */
34602f5b5447de349216a40086ca6061efefb5a3025James Dong        if (datablock[63])
34702f5b5447de349216a40086ca6061efefb5a3025James Dong            bitmapcol[7] |= 1;
34802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
34902f5b5447de349216a40086ca6061efefb5a3025James Dong        i = (-64 & i) | NCOEFF_BLOCK;   /*  if i > -1 then i is set to NCOEFF_BLOCK */
35002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
35102f5b5447de349216a40086ca6061efefb5a3025James Dong
35202f5b5447de349216a40086ca6061efefb5a3025James Dong
35302f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
35402f5b5447de349216a40086ca6061efefb5a3025James Dong    if (i > 10)
35502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
35602f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 1; k < 4; k++)
35702f5b5447de349216a40086ca6061efefb5a3025James Dong        {
35802f5b5447de349216a40086ca6061efefb5a3025James Dong            if (bitmapcol[k] != 0)
35902f5b5447de349216a40086ca6061efefb5a3025James Dong            {
36002f5b5447de349216a40086ca6061efefb5a3025James Dong                (*bitmaprow) |= mask[k];
36102f5b5447de349216a40086ca6061efefb5a3025James Dong            }
36202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
36302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
36402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
36502f5b5447de349216a40086ca6061efefb5a3025James Dong
36602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Store the qcoeff-values needed later for prediction */
36702f5b5447de349216a40086ca6061efefb5a3025James Dong    (*DC)[comp] = datablock[0];
36802f5b5447de349216a40086ca6061efefb5a3025James Dong    return i;
36902f5b5447de349216a40086ca6061efefb5a3025James Dong
37002f5b5447de349216a40086ca6061efefb5a3025James Dong}
37102f5b5447de349216a40086ca6061efefb5a3025James Dong
37202f5b5447de349216a40086ca6061efefb5a3025James Dong
37302f5b5447de349216a40086ca6061efefb5a3025James Dong/***********************************************************CommentBegin******
37402f5b5447de349216a40086ca6061efefb5a3025James Dong*
37502f5b5447de349216a40086ca6061efefb5a3025James Dong* -- VlcDequantMpegInterBlock -- Decodes the DCT coefficients of one 8x8 block and perform
37602f5b5447de349216a40086ca6061efefb5a3025James Dong            dequantization using Mpeg mode for INTER block.
37702f5b5447de349216a40086ca6061efefb5a3025James Dong    Date:       08/08/2000
37802f5b5447de349216a40086ca6061efefb5a3025James Dong    Modified:              3/21/01
37902f5b5447de349216a40086ca6061efefb5a3025James Dong                clean up, added clipping, 16-bit int case, new ACDC prediction
38002f5b5447de349216a40086ca6061efefb5a3025James Dong******************************************************************************/
38102f5b5447de349216a40086ca6061efefb5a3025James Dong
38202f5b5447de349216a40086ca6061efefb5a3025James Dong
38302f5b5447de349216a40086ca6061efefb5a3025James Dongint VlcDequantMpegInterBlock(void *vid, int comp,
38402f5b5447de349216a40086ca6061efefb5a3025James Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
38502f5b5447de349216a40086ca6061efefb5a3025James Dong{
38602f5b5447de349216a40086ca6061efefb5a3025James Dong    VideoDecData *video = (VideoDecData*) vid;
38702f5b5447de349216a40086ca6061efefb5a3025James Dong    BitstreamDecVideo *stream = video->bitstream;
38802f5b5447de349216a40086ca6061efefb5a3025James Dong    Vol *currVol = video->vol[video->currLayer];
38902f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
39002f5b5447de349216a40086ca6061efefb5a3025James Dong    int mbnum = video->mbnum;
39102f5b5447de349216a40086ca6061efefb5a3025James Dong    int QP = video->QPMB[mbnum];
39202f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** VLC *****/
39302f5b5447de349216a40086ca6061efefb5a3025James Dong    int i, k;
39402f5b5447de349216a40086ca6061efefb5a3025James Dong    Tcoef run_level;
39502f5b5447de349216a40086ca6061efefb5a3025James Dong    int last, return_status;
39602f5b5447de349216a40086ca6061efefb5a3025James Dong    VlcDecFuncP vlcDecCoeff;
39702f5b5447de349216a40086ca6061efefb5a3025James Dong
39802f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** Quantizer ****/
39902f5b5447de349216a40086ca6061efefb5a3025James Dong    int sum;
40002f5b5447de349216a40086ca6061efefb5a3025James Dong    int *qmat;
40102f5b5447de349216a40086ca6061efefb5a3025James Dong
40202f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 temp;
40302f5b5447de349216a40086ca6061efefb5a3025James Dong
40402f5b5447de349216a40086ca6061efefb5a3025James Dong    i = 0 ;
40502f5b5447de349216a40086ca6061efefb5a3025James Dong
40602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
40702f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
40802f5b5447de349216a40086ca6061efefb5a3025James Dong    *bitmaprow = 0;
40902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
41002f5b5447de349216a40086ca6061efefb5a3025James Dong
41102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* select which Huffman table to be used */
41202f5b5447de349216a40086ca6061efefb5a3025James Dong    vlcDecCoeff = video->vlcDecCoeffInter;
41302f5b5447de349216a40086ca6061efefb5a3025James Dong
41402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* enter the zero run decoding loop */
41502f5b5447de349216a40086ca6061efefb5a3025James Dong    sum = 0;
41602f5b5447de349216a40086ca6061efefb5a3025James Dong    qmat = currVol->niqmat;
41702f5b5447de349216a40086ca6061efefb5a3025James Dong    do
41802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
41902f5b5447de349216a40086ca6061efefb5a3025James Dong        return_status = (*vlcDecCoeff)(stream, &run_level);
42002f5b5447de349216a40086ca6061efefb5a3025James Dong        if (return_status != PV_SUCCESS)
42102f5b5447de349216a40086ca6061efefb5a3025James Dong        {
42202f5b5447de349216a40086ca6061efefb5a3025James Dong            last = 1;/*  11/1/2000 let it slips undetected, just like
42302f5b5447de349216a40086ca6061efefb5a3025James Dong                     in original version */
42402f5b5447de349216a40086ca6061efefb5a3025James Dong            i = VLC_ERROR;
42502f5b5447de349216a40086ca6061efefb5a3025James Dong            sum = 1;    /* no of coefficients should not get reset   03/07/2002 */
42602f5b5447de349216a40086ca6061efefb5a3025James Dong            break;
42702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
42802f5b5447de349216a40086ca6061efefb5a3025James Dong
42902f5b5447de349216a40086ca6061efefb5a3025James Dong        i += run_level.run;
43002f5b5447de349216a40086ca6061efefb5a3025James Dong        last = run_level.last;
43102f5b5447de349216a40086ca6061efefb5a3025James Dong        if (i >= 64)
43202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
43302f5b5447de349216a40086ca6061efefb5a3025James Dong            /*  i = NCOEFF_BLOCK; */    /*  11/1/00 */
43402f5b5447de349216a40086ca6061efefb5a3025James Dong            //return VLC_NO_LAST_BIT;
43502f5b5447de349216a40086ca6061efefb5a3025James Dong            i = VLC_NO_LAST_BIT;
43602f5b5447de349216a40086ca6061efefb5a3025James Dong            last = 1;
43702f5b5447de349216a40086ca6061efefb5a3025James Dong            sum = 1;    /* no of coefficients should not get reset   03/07/2002 */
43802f5b5447de349216a40086ca6061efefb5a3025James Dong            break;
43902f5b5447de349216a40086ca6061efefb5a3025James Dong        }
44002f5b5447de349216a40086ca6061efefb5a3025James Dong
44102f5b5447de349216a40086ca6061efefb5a3025James Dong        k = zigzag_inv[i];
44202f5b5447de349216a40086ca6061efefb5a3025James Dong
44302f5b5447de349216a40086ca6061efefb5a3025James Dong        if (run_level.sign == 1)
44402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
44502f5b5447de349216a40086ca6061efefb5a3025James Dong            temp = (-(int32)(2 * run_level.level + 1) * qmat[k] * QP + 15) >> 4; /*  03/23/01 */
44602f5b5447de349216a40086ca6061efefb5a3025James Dong            if (temp < -2048) temp = - 2048;
44702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
44802f5b5447de349216a40086ca6061efefb5a3025James Dong        else
44902f5b5447de349216a40086ca6061efefb5a3025James Dong        {
45002f5b5447de349216a40086ca6061efefb5a3025James Dong            temp = ((int32)(2 * run_level.level + 1) * qmat[k] * QP) >> 4; /*  03/23/01 */
45102f5b5447de349216a40086ca6061efefb5a3025James Dong            if (temp > 2047) temp = 2047;
45202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
45302f5b5447de349216a40086ca6061efefb5a3025James Dong
45402f5b5447de349216a40086ca6061efefb5a3025James Dong        datablock[k] = (int)temp;
45502f5b5447de349216a40086ca6061efefb5a3025James Dong
45602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
45702f5b5447de349216a40086ca6061efefb5a3025James Dong        bitmapcol[k&0x7] |= mask[k>>3];
45802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
45902f5b5447de349216a40086ca6061efefb5a3025James Dong        sum ^= temp;
46002f5b5447de349216a40086ca6061efefb5a3025James Dong
46102f5b5447de349216a40086ca6061efefb5a3025James Dong        i++;
46202f5b5447de349216a40086ca6061efefb5a3025James Dong    }
46302f5b5447de349216a40086ca6061efefb5a3025James Dong    while (!last);
46402f5b5447de349216a40086ca6061efefb5a3025James Dong
46502f5b5447de349216a40086ca6061efefb5a3025James Dong    if ((sum & 1) == 0)
46602f5b5447de349216a40086ca6061efefb5a3025James Dong    {
46702f5b5447de349216a40086ca6061efefb5a3025James Dong        datablock[63] = datablock[63] ^ 0x1;
46802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT   /*  7/5/01, need to update bitmap */
46902f5b5447de349216a40086ca6061efefb5a3025James Dong        if (datablock[63])
47002f5b5447de349216a40086ca6061efefb5a3025James Dong            bitmapcol[7] |= 1;
47102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
47202f5b5447de349216a40086ca6061efefb5a3025James Dong        i = NCOEFF_BLOCK;
47302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
47402f5b5447de349216a40086ca6061efefb5a3025James Dong
47502f5b5447de349216a40086ca6061efefb5a3025James Dong
47602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
47702f5b5447de349216a40086ca6061efefb5a3025James Dong    if (i > 10)
47802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
47902f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 1; k < 4; k++)               /*  07/19/01 */
48002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
48102f5b5447de349216a40086ca6061efefb5a3025James Dong            if (bitmapcol[k] != 0)
48202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
48302f5b5447de349216a40086ca6061efefb5a3025James Dong                (*bitmaprow) |= mask[k];
48402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
48502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
48602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
48702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
48802f5b5447de349216a40086ca6061efefb5a3025James Dong
48902f5b5447de349216a40086ca6061efefb5a3025James Dong    return i;
49002f5b5447de349216a40086ca6061efefb5a3025James Dong}
49102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
49202f5b5447de349216a40086ca6061efefb5a3025James Dong/***********************************************************CommentBegin******
49302f5b5447de349216a40086ca6061efefb5a3025James Dong*
49402f5b5447de349216a40086ca6061efefb5a3025James Dong* -- VlcDequantIntraH263Block -- Decodes the DCT coefficients of one 8x8 block and perform
49502f5b5447de349216a40086ca6061efefb5a3025James Dong            dequantization in H.263 mode for INTRA block.
49602f5b5447de349216a40086ca6061efefb5a3025James Dong    Date:       08/08/2000
49702f5b5447de349216a40086ca6061efefb5a3025James Dong    Modified:               3/21/01
49802f5b5447de349216a40086ca6061efefb5a3025James Dong                clean up, added clipping, 16-bit int case, removed multiple zigzaging
49902f5b5447de349216a40086ca6061efefb5a3025James Dong******************************************************************************/
50002f5b5447de349216a40086ca6061efefb5a3025James Dong
50102f5b5447de349216a40086ca6061efefb5a3025James Dong
50202f5b5447de349216a40086ca6061efefb5a3025James Dongint VlcDequantH263IntraBlock(VideoDecData *video, int comp, int switched,
50302f5b5447de349216a40086ca6061efefb5a3025James Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
50402f5b5447de349216a40086ca6061efefb5a3025James Dong{
50502f5b5447de349216a40086ca6061efefb5a3025James Dong    BitstreamDecVideo *stream = video->bitstream;
50602f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
50702f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 temp;
50802f5b5447de349216a40086ca6061efefb5a3025James Dong    int mbnum = video->mbnum;
50902f5b5447de349216a40086ca6061efefb5a3025James Dong    uint CBP = video->headerInfo.CBP[mbnum];
51002f5b5447de349216a40086ca6061efefb5a3025James Dong    int QP = video->QPMB[mbnum];
51102f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCStore *DC = video->predDC + mbnum;
51202f5b5447de349216a40086ca6061efefb5a3025James Dong    int x_pos = video->mbnum_col;
51302f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCACStore *DCAC_row = video->predDCAC_row + x_pos;
51402f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCACStore *DCAC_col = video->predDCAC_col;
51502f5b5447de349216a40086ca6061efefb5a3025James Dong    uint ACpred_flag = (uint) video->acPredFlag[mbnum];
51602f5b5447de349216a40086ca6061efefb5a3025James Dong
51702f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** VLC *****/
51802f5b5447de349216a40086ca6061efefb5a3025James Dong    int i, j, k;
51902f5b5447de349216a40086ca6061efefb5a3025James Dong    Tcoef run_level;
52002f5b5447de349216a40086ca6061efefb5a3025James Dong    int last, return_status;
52102f5b5447de349216a40086ca6061efefb5a3025James Dong    VlcDecFuncP vlcDecCoeff;
52202f5b5447de349216a40086ca6061efefb5a3025James Dong    int direction;
52302f5b5447de349216a40086ca6061efefb5a3025James Dong    const int *inv_zigzag;
52402f5b5447de349216a40086ca6061efefb5a3025James Dong
52502f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** Quantizer ****/
52602f5b5447de349216a40086ca6061efefb5a3025James Dong    int dc_scaler;
52702f5b5447de349216a40086ca6061efefb5a3025James Dong    int sgn_coeff;
52802f5b5447de349216a40086ca6061efefb5a3025James Dong
52902f5b5447de349216a40086ca6061efefb5a3025James Dong
53002f5b5447de349216a40086ca6061efefb5a3025James Dong
53102f5b5447de349216a40086ca6061efefb5a3025James Dong    const int B_Xtab[6] = {0, 1, 0, 1, 2, 3};
53202f5b5447de349216a40086ca6061efefb5a3025James Dong    const int B_Ytab[6] = {0, 0, 1, 1, 2, 3};
53302f5b5447de349216a40086ca6061efefb5a3025James Dong
53402f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *dcac_row, *dcac_col;
53502f5b5447de349216a40086ca6061efefb5a3025James Dong
53602f5b5447de349216a40086ca6061efefb5a3025James Dong    dcac_row = (*DCAC_row)[B_Xtab[comp]];
53702f5b5447de349216a40086ca6061efefb5a3025James Dong    dcac_col = (*DCAC_col)[B_Ytab[comp]];
53802f5b5447de349216a40086ca6061efefb5a3025James Dong
53902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
54002f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
54102f5b5447de349216a40086ca6061efefb5a3025James Dong    *bitmaprow = 0;
54202f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
54302f5b5447de349216a40086ca6061efefb5a3025James Dong    /* select which Huffman table to be used */
54402f5b5447de349216a40086ca6061efefb5a3025James Dong    vlcDecCoeff = video->vlcDecCoeffIntra;
54502f5b5447de349216a40086ca6061efefb5a3025James Dong
54602f5b5447de349216a40086ca6061efefb5a3025James Dong    dc_scaler = (comp < 4) ? video->mblock->DCScalarLum : video->mblock->DCScalarChr;
54702f5b5447de349216a40086ca6061efefb5a3025James Dong
54802f5b5447de349216a40086ca6061efefb5a3025James Dong    /* perform only VLC decoding */
54902f5b5447de349216a40086ca6061efefb5a3025James Dong    doDCACPrediction(video, comp, datablock, &direction);
55002f5b5447de349216a40086ca6061efefb5a3025James Dong    if (!ACpred_flag) direction = 0;
55102f5b5447de349216a40086ca6061efefb5a3025James Dong
55202f5b5447de349216a40086ca6061efefb5a3025James Dong    inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6);  /*  04/17/01 */
55302f5b5447de349216a40086ca6061efefb5a3025James Dong
55402f5b5447de349216a40086ca6061efefb5a3025James Dong    i = 1;
55502f5b5447de349216a40086ca6061efefb5a3025James Dong    if (CBP & (1 << (5 - comp)))
55602f5b5447de349216a40086ca6061efefb5a3025James Dong    {
55702f5b5447de349216a40086ca6061efefb5a3025James Dong        i = 1 - switched;
55802f5b5447de349216a40086ca6061efefb5a3025James Dong        do
55902f5b5447de349216a40086ca6061efefb5a3025James Dong        {
56002f5b5447de349216a40086ca6061efefb5a3025James Dong            return_status = (*vlcDecCoeff)(stream, &run_level);
56102f5b5447de349216a40086ca6061efefb5a3025James Dong            if (return_status != PV_SUCCESS)
56202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
56302f5b5447de349216a40086ca6061efefb5a3025James Dong                last = 1;/* 11/1/2000 let it slips undetected, just like
56402f5b5447de349216a40086ca6061efefb5a3025James Dong                         in original version */
56502f5b5447de349216a40086ca6061efefb5a3025James Dong                i = VLC_ERROR;
56602f5b5447de349216a40086ca6061efefb5a3025James Dong                ACpred_flag = 0;   /* no of coefficients should not get reset   03/07/2002 */
56702f5b5447de349216a40086ca6061efefb5a3025James Dong                break;
56802f5b5447de349216a40086ca6061efefb5a3025James Dong            }
56902f5b5447de349216a40086ca6061efefb5a3025James Dong
57002f5b5447de349216a40086ca6061efefb5a3025James Dong            i += run_level.run;
57102f5b5447de349216a40086ca6061efefb5a3025James Dong            last = run_level.last;
57202f5b5447de349216a40086ca6061efefb5a3025James Dong            if (i >= 64)
57302f5b5447de349216a40086ca6061efefb5a3025James Dong            {
57402f5b5447de349216a40086ca6061efefb5a3025James Dong                ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
57502f5b5447de349216a40086ca6061efefb5a3025James Dong                i = VLC_NO_LAST_BIT;
57602f5b5447de349216a40086ca6061efefb5a3025James Dong                last = 1;
57702f5b5447de349216a40086ca6061efefb5a3025James Dong                break;
57802f5b5447de349216a40086ca6061efefb5a3025James Dong            }
57902f5b5447de349216a40086ca6061efefb5a3025James Dong
58002f5b5447de349216a40086ca6061efefb5a3025James Dong            k = inv_zigzag[i];
58102f5b5447de349216a40086ca6061efefb5a3025James Dong
58202f5b5447de349216a40086ca6061efefb5a3025James Dong            if (run_level.sign == 1)
58302f5b5447de349216a40086ca6061efefb5a3025James Dong            {
58402f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] -= run_level.level;
58502f5b5447de349216a40086ca6061efefb5a3025James Dong                sgn_coeff = -1;
58602f5b5447de349216a40086ca6061efefb5a3025James Dong            }
58702f5b5447de349216a40086ca6061efefb5a3025James Dong            else
58802f5b5447de349216a40086ca6061efefb5a3025James Dong            {
58902f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] += run_level.level;
59002f5b5447de349216a40086ca6061efefb5a3025James Dong                sgn_coeff = 1;
59102f5b5447de349216a40086ca6061efefb5a3025James Dong            }
59202f5b5447de349216a40086ca6061efefb5a3025James Dong
59302f5b5447de349216a40086ca6061efefb5a3025James Dong
59402f5b5447de349216a40086ca6061efefb5a3025James Dong            if (AC_rowcol[k])   /*  10/25/2000 */
59502f5b5447de349216a40086ca6061efefb5a3025James Dong            {
59602f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
59702f5b5447de349216a40086ca6061efefb5a3025James Dong                if (temp > 2047) temp = 2047;            /*  03/14/01 */
59802f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (temp < -2048)  temp = -2048;
59902f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] = (int16) temp;
60002f5b5447de349216a40086ca6061efefb5a3025James Dong
60102f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
60202f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[k&0x7] |= mask[k>>3];
60302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
60402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
60502f5b5447de349216a40086ca6061efefb5a3025James Dong
60602f5b5447de349216a40086ca6061efefb5a3025James Dong            i++;
60702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
60802f5b5447de349216a40086ca6061efefb5a3025James Dong        while (!last);
60902f5b5447de349216a40086ca6061efefb5a3025James Dong
61002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
61102f5b5447de349216a40086ca6061efefb5a3025James Dong
61202f5b5447de349216a40086ca6061efefb5a3025James Dong    ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF
61302f5b5447de349216a40086ca6061efefb5a3025James Dong    /* dequantize the rest of AC predicted coeff that haven't been dequant */
61402f5b5447de349216a40086ca6061efefb5a3025James Dong    if (ACpred_flag)
61502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
61602f5b5447de349216a40086ca6061efefb5a3025James Dong
61702f5b5447de349216a40086ca6061efefb5a3025James Dong        i = NCOEFF_BLOCK; /* otherwise, FAST IDCT won't work correctly,  10/18/2000 */
61802f5b5447de349216a40086ca6061efefb5a3025James Dong
61902f5b5447de349216a40086ca6061efefb5a3025James Dong        if (!direction) /* check vertical */
62002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
62102f5b5447de349216a40086ca6061efefb5a3025James Dong
62202f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[0]  = datablock[1];
62302f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[1]  = datablock[2];
62402f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[2]  = datablock[3];
62502f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[3]  = datablock[4];
62602f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[4]  = datablock[5];
62702f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[5]  = datablock[6];
62802f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_row[6]  = datablock[7];
62902f5b5447de349216a40086ca6061efefb5a3025James Dong
63002f5b5447de349216a40086ca6061efefb5a3025James Dong            for (j = 0, k = 8; k < 64; k += 8, j++)
63102f5b5447de349216a40086ca6061efefb5a3025James Dong            {
63202f5b5447de349216a40086ca6061efefb5a3025James Dong                dcac_col[j] = datablock[k];
63302f5b5447de349216a40086ca6061efefb5a3025James Dong                if (dcac_col[j])
63402f5b5447de349216a40086ca6061efefb5a3025James Dong                {
63502f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (datablock[k] > 0)
63602f5b5447de349216a40086ca6061efefb5a3025James Dong                    {
63702f5b5447de349216a40086ca6061efefb5a3025James Dong                        if (datablock[k] > 2047) dcac_col[j] = 2047;
63802f5b5447de349216a40086ca6061efefb5a3025James Dong                        sgn_coeff = 1;
63902f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
64002f5b5447de349216a40086ca6061efefb5a3025James Dong                    else
64102f5b5447de349216a40086ca6061efefb5a3025James Dong                    {
64202f5b5447de349216a40086ca6061efefb5a3025James Dong                        if (datablock[k] < -2048) dcac_col[j] = -2048;
64302f5b5447de349216a40086ca6061efefb5a3025James Dong                        sgn_coeff = -1;
64402f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
64502f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
64602f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
64702f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048)  temp = -2048;
64802f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int16) temp;
64902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
65002f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[0] |= mask[k>>3];
65102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
65202f5b5447de349216a40086ca6061efefb5a3025James Dong
65302f5b5447de349216a40086ca6061efefb5a3025James Dong                }
65402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
65502f5b5447de349216a40086ca6061efefb5a3025James Dong
65602f5b5447de349216a40086ca6061efefb5a3025James Dong            for (k = 1; k < 8; k++)
65702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
65802f5b5447de349216a40086ca6061efefb5a3025James Dong                if (datablock[k])
65902f5b5447de349216a40086ca6061efefb5a3025James Dong                {
66002f5b5447de349216a40086ca6061efefb5a3025James Dong                    sgn_coeff = (datablock[k] > 0) ? 1 : -1;
66102f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
66202f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
66302f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048)  temp = -2048;
66402f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int16) temp;
66502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
66602f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[k] |= 128;
66702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
66802f5b5447de349216a40086ca6061efefb5a3025James Dong
66902f5b5447de349216a40086ca6061efefb5a3025James Dong                }
67002f5b5447de349216a40086ca6061efefb5a3025James Dong            }
67102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
67202f5b5447de349216a40086ca6061efefb5a3025James Dong        else
67302f5b5447de349216a40086ca6061efefb5a3025James Dong        {
67402f5b5447de349216a40086ca6061efefb5a3025James Dong
67502f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[0]  = datablock[8];
67602f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[1]  = datablock[16];
67702f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[2]  = datablock[24];
67802f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[3]  = datablock[32];
67902f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[4]  = datablock[40];
68002f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[5]  = datablock[48];
68102f5b5447de349216a40086ca6061efefb5a3025James Dong            dcac_col[6]  = datablock[56];
68202f5b5447de349216a40086ca6061efefb5a3025James Dong
68302f5b5447de349216a40086ca6061efefb5a3025James Dong
68402f5b5447de349216a40086ca6061efefb5a3025James Dong            for (j = 0, k = 1; k < 8; k++, j++)
68502f5b5447de349216a40086ca6061efefb5a3025James Dong            {
68602f5b5447de349216a40086ca6061efefb5a3025James Dong                dcac_row[j] = datablock[k];
68702f5b5447de349216a40086ca6061efefb5a3025James Dong                if (dcac_row[j])
68802f5b5447de349216a40086ca6061efefb5a3025James Dong                {
68902f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (datablock[k] > 0)
69002f5b5447de349216a40086ca6061efefb5a3025James Dong                    {
69102f5b5447de349216a40086ca6061efefb5a3025James Dong                        if (datablock[k] > 2047) dcac_row[j] = 2047;
69202f5b5447de349216a40086ca6061efefb5a3025James Dong                        sgn_coeff = 1;
69302f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
69402f5b5447de349216a40086ca6061efefb5a3025James Dong                    else
69502f5b5447de349216a40086ca6061efefb5a3025James Dong                    {
69602f5b5447de349216a40086ca6061efefb5a3025James Dong                        if (datablock[k] < -2048) dcac_row[j] = -2048;
69702f5b5447de349216a40086ca6061efefb5a3025James Dong                        sgn_coeff = -1;
69802f5b5447de349216a40086ca6061efefb5a3025James Dong                    }
69902f5b5447de349216a40086ca6061efefb5a3025James Dong
70002f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
70102f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
70202f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048)  temp = -2048;
70302f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int) temp;
70402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
70502f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[k] |= 128;
70602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
70702f5b5447de349216a40086ca6061efefb5a3025James Dong
70802f5b5447de349216a40086ca6061efefb5a3025James Dong                }
70902f5b5447de349216a40086ca6061efefb5a3025James Dong            }
71002f5b5447de349216a40086ca6061efefb5a3025James Dong            for (k = 8; k < 64; k += 8)
71102f5b5447de349216a40086ca6061efefb5a3025James Dong            {
71202f5b5447de349216a40086ca6061efefb5a3025James Dong                if (datablock[k])
71302f5b5447de349216a40086ca6061efefb5a3025James Dong                {
71402f5b5447de349216a40086ca6061efefb5a3025James Dong                    sgn_coeff = (datablock[k] > 0) ? 1 : -1;
71502f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
71602f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;            /*  03/14/01 */
71702f5b5447de349216a40086ca6061efefb5a3025James Dong                    else if (temp < -2048)  temp = -2048;
71802f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] = (int16) temp;
71902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
72002f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[0] |= mask[k>>3];
72102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
72202f5b5447de349216a40086ca6061efefb5a3025James Dong                }
72302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
72402f5b5447de349216a40086ca6061efefb5a3025James Dong
72502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
72602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
72702f5b5447de349216a40086ca6061efefb5a3025James Dong    else
72802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
72902f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[0]  = datablock[1];
73002f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[1]  = datablock[2];
73102f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[2]  = datablock[3];
73202f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[3]  = datablock[4];
73302f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[4]  = datablock[5];
73402f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[5]  = datablock[6];
73502f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[6]  = datablock[7];
73602f5b5447de349216a40086ca6061efefb5a3025James Dong
73702f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[0]  = datablock[8];
73802f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[1]  = datablock[16];
73902f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[2]  = datablock[24];
74002f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[3]  = datablock[32];
74102f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[4]  = datablock[40];
74202f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[5]  = datablock[48];
74302f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[6]  = datablock[56];
74402f5b5447de349216a40086ca6061efefb5a3025James Dong
74502f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 1; k < 8; k++)
74602f5b5447de349216a40086ca6061efefb5a3025James Dong        {
74702f5b5447de349216a40086ca6061efefb5a3025James Dong            if (datablock[k])
74802f5b5447de349216a40086ca6061efefb5a3025James Dong            {
74902f5b5447de349216a40086ca6061efefb5a3025James Dong                sgn_coeff = (datablock[k] > 0) ? 1 : -1;
75002f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
75102f5b5447de349216a40086ca6061efefb5a3025James Dong                if (temp > 2047) temp = 2047;            /*  03/14/01 */
75202f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (temp < -2048)  temp = -2048;
75302f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] = (int16) temp;
75402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
75502f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[k] |= 128;
75602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
75702f5b5447de349216a40086ca6061efefb5a3025James Dong            }
75802f5b5447de349216a40086ca6061efefb5a3025James Dong        }
75902f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 8; k < 64; k += 8)
76002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
76102f5b5447de349216a40086ca6061efefb5a3025James Dong            if (datablock[k])
76202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
76302f5b5447de349216a40086ca6061efefb5a3025James Dong                sgn_coeff = (datablock[k] > 0) ? 1 : -1;
76402f5b5447de349216a40086ca6061efefb5a3025James Dong                temp = (int32)QP * (2 * datablock[k] + sgn_coeff) - sgn_coeff + (QP & 1) * sgn_coeff;
76502f5b5447de349216a40086ca6061efefb5a3025James Dong                if (temp > 2047) temp = 2047;            /*  03/14/01 */
76602f5b5447de349216a40086ca6061efefb5a3025James Dong                else if (temp < -2048)  temp = -2048;
76702f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] = (int16) temp;
76802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
76902f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[0] |= mask[k>>3];
77002f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
77102f5b5447de349216a40086ca6061efefb5a3025James Dong            }
77202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
77302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
77402f5b5447de349216a40086ca6061efefb5a3025James Dong    if (datablock[0])
77502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
77602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
77702f5b5447de349216a40086ca6061efefb5a3025James Dong        bitmapcol[0] |= 128;
77802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
77902f5b5447de349216a40086ca6061efefb5a3025James Dong
78002f5b5447de349216a40086ca6061efefb5a3025James Dong        temp = (int32)datablock[0] * dc_scaler;
78102f5b5447de349216a40086ca6061efefb5a3025James Dong        if (temp > 2047) temp = 2047;            /*  03/14/01 */
78202f5b5447de349216a40086ca6061efefb5a3025James Dong        else if (temp < -2048)  temp = -2048;
78302f5b5447de349216a40086ca6061efefb5a3025James Dong        datablock[0] = (int16)temp;
78402f5b5447de349216a40086ca6061efefb5a3025James Dong    }
78502f5b5447de349216a40086ca6061efefb5a3025James Dong
78602f5b5447de349216a40086ca6061efefb5a3025James Dong
78702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
78802f5b5447de349216a40086ca6061efefb5a3025James Dong    if (i > 10)
78902f5b5447de349216a40086ca6061efefb5a3025James Dong    {
79002f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 1; k < 4; k++)  /* if i > 10 then k = 0 does not matter  */
79102f5b5447de349216a40086ca6061efefb5a3025James Dong        {
79202f5b5447de349216a40086ca6061efefb5a3025James Dong            if (bitmapcol[k] != 0)
79302f5b5447de349216a40086ca6061efefb5a3025James Dong            {
79402f5b5447de349216a40086ca6061efefb5a3025James Dong                (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */
79502f5b5447de349216a40086ca6061efefb5a3025James Dong            }
79602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
79702f5b5447de349216a40086ca6061efefb5a3025James Dong    }
79802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
79902f5b5447de349216a40086ca6061efefb5a3025James Dong
80002f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Store the qcoeff-values needed later for prediction */
80102f5b5447de349216a40086ca6061efefb5a3025James Dong    (*DC)[comp] = datablock[0];
80202f5b5447de349216a40086ca6061efefb5a3025James Dong    return i;
80302f5b5447de349216a40086ca6061efefb5a3025James Dong}
80402f5b5447de349216a40086ca6061efefb5a3025James Dong
80502f5b5447de349216a40086ca6061efefb5a3025James Dongint VlcDequantH263IntraBlock_SH(VideoDecData *video, int comp, uint8 *bitmapcol, uint8 *bitmaprow)
80602f5b5447de349216a40086ca6061efefb5a3025James Dong{
80702f5b5447de349216a40086ca6061efefb5a3025James Dong    BitstreamDecVideo *stream = video->bitstream;
80802f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *datablock = video->mblock->block[comp]; /*, 10/20/2000, assume it has been reset of all-zero !!!*/
80902f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 temp;
81002f5b5447de349216a40086ca6061efefb5a3025James Dong    int mbnum = video->mbnum;
81102f5b5447de349216a40086ca6061efefb5a3025James Dong    uint CBP = video->headerInfo.CBP[mbnum];
81202f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 QP = video->QPMB[mbnum];
81302f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCStore *DC = video->predDC + mbnum;
81402f5b5447de349216a40086ca6061efefb5a3025James Dong    int x_pos = video->mbnum_col;
81502f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCACStore *DCAC_row = video->predDCAC_row + x_pos;
81602f5b5447de349216a40086ca6061efefb5a3025James Dong    typeDCACStore *DCAC_col = video->predDCAC_col;
81702f5b5447de349216a40086ca6061efefb5a3025James Dong    uint ACpred_flag = (uint) video->acPredFlag[mbnum];
81802f5b5447de349216a40086ca6061efefb5a3025James Dong
81902f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** VLC *****/
82002f5b5447de349216a40086ca6061efefb5a3025James Dong    int i, k;
82102f5b5447de349216a40086ca6061efefb5a3025James Dong    Tcoef run_level;
82202f5b5447de349216a40086ca6061efefb5a3025James Dong    int last, return_status;
82302f5b5447de349216a40086ca6061efefb5a3025James Dong    VlcDecFuncP vlcDecCoeff;
82402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT
82502f5b5447de349216a40086ca6061efefb5a3025James Dong    int direction;
82602f5b5447de349216a40086ca6061efefb5a3025James Dong    const int *inv_zigzag;
82702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
82802f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** Quantizer ****/
82902f5b5447de349216a40086ca6061efefb5a3025James Dong
83002f5b5447de349216a40086ca6061efefb5a3025James Dong
83102f5b5447de349216a40086ca6061efefb5a3025James Dong
83202f5b5447de349216a40086ca6061efefb5a3025James Dong    const int B_Xtab[6] = {0, 1, 0, 1, 2, 3};
83302f5b5447de349216a40086ca6061efefb5a3025James Dong    const int B_Ytab[6] = {0, 0, 1, 1, 2, 3};
83402f5b5447de349216a40086ca6061efefb5a3025James Dong
83502f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *dcac_row, *dcac_col;
83602f5b5447de349216a40086ca6061efefb5a3025James Dong
83702f5b5447de349216a40086ca6061efefb5a3025James Dong    dcac_row = (*DCAC_row)[B_Xtab[comp]];
83802f5b5447de349216a40086ca6061efefb5a3025James Dong    dcac_col = (*DCAC_col)[B_Ytab[comp]];
83902f5b5447de349216a40086ca6061efefb5a3025James Dong    i = 1;
84002f5b5447de349216a40086ca6061efefb5a3025James Dong
84102f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
84202f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
84302f5b5447de349216a40086ca6061efefb5a3025James Dong    *bitmaprow = 0;
84402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
84502f5b5447de349216a40086ca6061efefb5a3025James Dong
84602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* select which Huffman table to be used */
84702f5b5447de349216a40086ca6061efefb5a3025James Dong    vlcDecCoeff = video->vlcDecCoeffIntra;
84802f5b5447de349216a40086ca6061efefb5a3025James Dong
84902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT
85002f5b5447de349216a40086ca6061efefb5a3025James Dong    if (comp > 3)        /* ANNEX_T */
85102f5b5447de349216a40086ca6061efefb5a3025James Dong    {
85202f5b5447de349216a40086ca6061efefb5a3025James Dong        QP = video->QP_CHR;
85302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
85402f5b5447de349216a40086ca6061efefb5a3025James Dong    if (!video->advanced_INTRA)
85502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
85602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
85702f5b5447de349216a40086ca6061efefb5a3025James Dong
85802f5b5447de349216a40086ca6061efefb5a3025James Dong        if ((CBP & (1 << (5 - comp))) == 0)
85902f5b5447de349216a40086ca6061efefb5a3025James Dong        {
86002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
86102f5b5447de349216a40086ca6061efefb5a3025James Dong            bitmapcol[0] = 128;
86202f5b5447de349216a40086ca6061efefb5a3025James Dong            bitmapcol[1] = bitmapcol[2] = bitmapcol[3] = bitmapcol[4] = bitmapcol[5] = bitmapcol[6] = bitmapcol[7] = 0;
86302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
86402f5b5447de349216a40086ca6061efefb5a3025James Dong            datablock[0] <<= 3;  /* no need to clip */
86502f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;//ncoeffs;
86602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
86702f5b5447de349216a40086ca6061efefb5a3025James Dong        else
86802f5b5447de349216a40086ca6061efefb5a3025James Dong        {
86902f5b5447de349216a40086ca6061efefb5a3025James Dong            /* enter the zero run decoding loop */
87002f5b5447de349216a40086ca6061efefb5a3025James Dong            do
87102f5b5447de349216a40086ca6061efefb5a3025James Dong            {
87202f5b5447de349216a40086ca6061efefb5a3025James Dong                return_status = (*vlcDecCoeff)(stream, &run_level);
87302f5b5447de349216a40086ca6061efefb5a3025James Dong                if (return_status != PV_SUCCESS)
87402f5b5447de349216a40086ca6061efefb5a3025James Dong                {
87502f5b5447de349216a40086ca6061efefb5a3025James Dong                    last = 1;/*  11/1/2000 let it slips undetected, just like
87602f5b5447de349216a40086ca6061efefb5a3025James Dong                             in original version */
87702f5b5447de349216a40086ca6061efefb5a3025James Dong                    i = VLC_ERROR;
87802f5b5447de349216a40086ca6061efefb5a3025James Dong                    break;
87902f5b5447de349216a40086ca6061efefb5a3025James Dong                }
88002f5b5447de349216a40086ca6061efefb5a3025James Dong
88102f5b5447de349216a40086ca6061efefb5a3025James Dong                i += run_level.run;
88202f5b5447de349216a40086ca6061efefb5a3025James Dong                last = run_level.last;
88302f5b5447de349216a40086ca6061efefb5a3025James Dong                if (i >= 64)
88402f5b5447de349216a40086ca6061efefb5a3025James Dong                {
88502f5b5447de349216a40086ca6061efefb5a3025James Dong                    /*  i = NCOEFF_BLOCK; */    /*  11/1/00 */
88602f5b5447de349216a40086ca6061efefb5a3025James Dong                    i = VLC_NO_LAST_BIT;
88702f5b5447de349216a40086ca6061efefb5a3025James Dong                    last = 1;
88802f5b5447de349216a40086ca6061efefb5a3025James Dong                    break;
88902f5b5447de349216a40086ca6061efefb5a3025James Dong                }
89002f5b5447de349216a40086ca6061efefb5a3025James Dong                k = zigzag_inv[i];
89102f5b5447de349216a40086ca6061efefb5a3025James Dong
89202f5b5447de349216a40086ca6061efefb5a3025James Dong                if (run_level.sign == 0)
89302f5b5447de349216a40086ca6061efefb5a3025James Dong                {
89402f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = (int32)QP * (2 * run_level.level + 1) - 1 + (QP & 1);
89502f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp > 2047) temp = 2047;
89602f5b5447de349216a40086ca6061efefb5a3025James Dong                }
89702f5b5447de349216a40086ca6061efefb5a3025James Dong                else
89802f5b5447de349216a40086ca6061efefb5a3025James Dong                {
89902f5b5447de349216a40086ca6061efefb5a3025James Dong                    temp = -(int32)QP * (2 * run_level.level + 1) + 1 - (QP & 1);
90002f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (temp < -2048) temp = -2048;
90102f5b5447de349216a40086ca6061efefb5a3025James Dong                }
90202f5b5447de349216a40086ca6061efefb5a3025James Dong
90302f5b5447de349216a40086ca6061efefb5a3025James Dong
90402f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[k] = (int16) temp;
90502f5b5447de349216a40086ca6061efefb5a3025James Dong
90602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
90702f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[k&0x7] |= mask[k>>3];
90802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
90902f5b5447de349216a40086ca6061efefb5a3025James Dong                i++;
91002f5b5447de349216a40086ca6061efefb5a3025James Dong            }
91102f5b5447de349216a40086ca6061efefb5a3025James Dong            while (!last);
91202f5b5447de349216a40086ca6061efefb5a3025James Dong
91302f5b5447de349216a40086ca6061efefb5a3025James Dong        }
91402f5b5447de349216a40086ca6061efefb5a3025James Dong        /* no ACDC prediction when ACDC disable  */
91502f5b5447de349216a40086ca6061efefb5a3025James Dong        if (datablock[0])
91602f5b5447de349216a40086ca6061efefb5a3025James Dong        {
91702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
91802f5b5447de349216a40086ca6061efefb5a3025James Dong            bitmapcol[0] |= 128;
91902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
92002f5b5447de349216a40086ca6061efefb5a3025James Dong            datablock[0] <<= 3;        /* no need to clip  09/18/2001 */
92102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
92202f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT
92302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
92402f5b5447de349216a40086ca6061efefb5a3025James Dong    else  /* advanced_INTRA mode */
92502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
92602f5b5447de349216a40086ca6061efefb5a3025James Dong        i = 1;
92702f5b5447de349216a40086ca6061efefb5a3025James Dong        doDCACPrediction_I(video, comp, datablock);
92802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* perform only VLC decoding */
92902f5b5447de349216a40086ca6061efefb5a3025James Dong        if (!ACpred_flag)
93002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
93102f5b5447de349216a40086ca6061efefb5a3025James Dong            direction = 0;
93202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
93302f5b5447de349216a40086ca6061efefb5a3025James Dong        else
93402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
93502f5b5447de349216a40086ca6061efefb5a3025James Dong            direction = video->mblock->direction;
93602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
93702f5b5447de349216a40086ca6061efefb5a3025James Dong
93802f5b5447de349216a40086ca6061efefb5a3025James Dong        inv_zigzag = zigzag_inv + (ACpred_flag << 6) + (direction << 6);  /*  04/17/01 */
93902f5b5447de349216a40086ca6061efefb5a3025James Dong
94002f5b5447de349216a40086ca6061efefb5a3025James Dong        if (CBP & (1 << (5 - comp)))
94102f5b5447de349216a40086ca6061efefb5a3025James Dong        {
94202f5b5447de349216a40086ca6061efefb5a3025James Dong            i = 0;
94302f5b5447de349216a40086ca6061efefb5a3025James Dong            do
94402f5b5447de349216a40086ca6061efefb5a3025James Dong            {
94502f5b5447de349216a40086ca6061efefb5a3025James Dong                return_status = (*vlcDecCoeff)(stream, &run_level);
94602f5b5447de349216a40086ca6061efefb5a3025James Dong                if (return_status != PV_SUCCESS)
94702f5b5447de349216a40086ca6061efefb5a3025James Dong                {
94802f5b5447de349216a40086ca6061efefb5a3025James Dong                    last = 1;/*  11/1/2000 let it slips undetected, just like
94902f5b5447de349216a40086ca6061efefb5a3025James Dong                                 in original version */
95002f5b5447de349216a40086ca6061efefb5a3025James Dong                    i = VLC_ERROR;
95102f5b5447de349216a40086ca6061efefb5a3025James Dong                    ACpred_flag = 0;   /* no of coefficients should not get reset   03/07/2002 */
95202f5b5447de349216a40086ca6061efefb5a3025James Dong                    break;
95302f5b5447de349216a40086ca6061efefb5a3025James Dong                }
95402f5b5447de349216a40086ca6061efefb5a3025James Dong
95502f5b5447de349216a40086ca6061efefb5a3025James Dong                i += run_level.run;
95602f5b5447de349216a40086ca6061efefb5a3025James Dong                last = run_level.last;
95702f5b5447de349216a40086ca6061efefb5a3025James Dong                if (i >= 64)
95802f5b5447de349216a40086ca6061efefb5a3025James Dong                {
95902f5b5447de349216a40086ca6061efefb5a3025James Dong                    /*                  i = NCOEFF_BLOCK; */    /*  11/1/00 */
96002f5b5447de349216a40086ca6061efefb5a3025James Dong                    ACpred_flag = 0;    /* no of coefficients should not get reset   03/07/2002 */
96102f5b5447de349216a40086ca6061efefb5a3025James Dong                    i = VLC_NO_LAST_BIT;
96202f5b5447de349216a40086ca6061efefb5a3025James Dong                    last = 1;
96302f5b5447de349216a40086ca6061efefb5a3025James Dong                    break;
96402f5b5447de349216a40086ca6061efefb5a3025James Dong                }
96502f5b5447de349216a40086ca6061efefb5a3025James Dong
96602f5b5447de349216a40086ca6061efefb5a3025James Dong                k = inv_zigzag[i];
96702f5b5447de349216a40086ca6061efefb5a3025James Dong
96802f5b5447de349216a40086ca6061efefb5a3025James Dong                if (run_level.sign == 0)
96902f5b5447de349216a40086ca6061efefb5a3025James Dong                {
97002f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] += (int16)QP * 2 * run_level.level;
97102f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (datablock[k] > 2047) datablock[k] = 2047;
97202f5b5447de349216a40086ca6061efefb5a3025James Dong                }
97302f5b5447de349216a40086ca6061efefb5a3025James Dong                else
97402f5b5447de349216a40086ca6061efefb5a3025James Dong                {
97502f5b5447de349216a40086ca6061efefb5a3025James Dong                    datablock[k] -= (int16)QP * 2 * run_level.level;
97602f5b5447de349216a40086ca6061efefb5a3025James Dong                    if (datablock[k] < -2048) datablock[k] = -2048;
97702f5b5447de349216a40086ca6061efefb5a3025James Dong                }
97802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
97902f5b5447de349216a40086ca6061efefb5a3025James Dong                bitmapcol[k&0x7] |= mask[k>>3];
98002f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
98102f5b5447de349216a40086ca6061efefb5a3025James Dong
98202f5b5447de349216a40086ca6061efefb5a3025James Dong                i++;
98302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
98402f5b5447de349216a40086ca6061efefb5a3025James Dong            while (!last);
98502f5b5447de349216a40086ca6061efefb5a3025James Dong
98602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
98702f5b5447de349216a40086ca6061efefb5a3025James Dong        ///// NEED TO DEQUANT THOSE PREDICTED AC COEFF
98802f5b5447de349216a40086ca6061efefb5a3025James Dong        /* dequantize the rest of AC predicted coeff that haven't been dequant */
98902f5b5447de349216a40086ca6061efefb5a3025James Dong
99002f5b5447de349216a40086ca6061efefb5a3025James Dong        if (ACpred_flag)
99102f5b5447de349216a40086ca6061efefb5a3025James Dong        {
99202f5b5447de349216a40086ca6061efefb5a3025James Dong            i = NCOEFF_BLOCK;
99302f5b5447de349216a40086ca6061efefb5a3025James Dong            for (k = 1; k < 8; k++)
99402f5b5447de349216a40086ca6061efefb5a3025James Dong            {
99502f5b5447de349216a40086ca6061efefb5a3025James Dong                if (datablock[k])
99602f5b5447de349216a40086ca6061efefb5a3025James Dong                {
99702f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[k] |= 128;
99802f5b5447de349216a40086ca6061efefb5a3025James Dong                }
99902f5b5447de349216a40086ca6061efefb5a3025James Dong
100002f5b5447de349216a40086ca6061efefb5a3025James Dong                if (datablock[k<<3])
100102f5b5447de349216a40086ca6061efefb5a3025James Dong                {
100202f5b5447de349216a40086ca6061efefb5a3025James Dong                    bitmapcol[0] |= mask[k];
100302f5b5447de349216a40086ca6061efefb5a3025James Dong                }
100402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
100502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
100602f5b5447de349216a40086ca6061efefb5a3025James Dong
100702f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[0]  = datablock[1];
100802f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[1]  = datablock[2];
100902f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[2]  = datablock[3];
101002f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[3]  = datablock[4];
101102f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[4]  = datablock[5];
101202f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[5]  = datablock[6];
101302f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_row[6]  = datablock[7];
101402f5b5447de349216a40086ca6061efefb5a3025James Dong
101502f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[0]  = datablock[8];
101602f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[1]  = datablock[16];
101702f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[2]  = datablock[24];
101802f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[3]  = datablock[32];
101902f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[4]  = datablock[40];
102002f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[5]  = datablock[48];
102102f5b5447de349216a40086ca6061efefb5a3025James Dong        dcac_col[6]  = datablock[56];
102202f5b5447de349216a40086ca6061efefb5a3025James Dong
102302f5b5447de349216a40086ca6061efefb5a3025James Dong        if (datablock[0])
102402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
102502f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
102602f5b5447de349216a40086ca6061efefb5a3025James Dong            bitmapcol[0] |= 128;
102702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
102802f5b5447de349216a40086ca6061efefb5a3025James Dong
102902f5b5447de349216a40086ca6061efefb5a3025James Dong            datablock[0] |= 1;
103002f5b5447de349216a40086ca6061efefb5a3025James Dong            if (datablock[0] < 0)
103102f5b5447de349216a40086ca6061efefb5a3025James Dong            {
103202f5b5447de349216a40086ca6061efefb5a3025James Dong                datablock[0] = 0;
103302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
103402f5b5447de349216a40086ca6061efefb5a3025James Dong        }
103502f5b5447de349216a40086ca6061efefb5a3025James Dong    }
103602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
103702f5b5447de349216a40086ca6061efefb5a3025James Dong
103802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
103902f5b5447de349216a40086ca6061efefb5a3025James Dong    if (i > 10)
104002f5b5447de349216a40086ca6061efefb5a3025James Dong    {
104102f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 1; k < 4; k++)  /* if i > 10 then k = 0 does not matter  */
104202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
104302f5b5447de349216a40086ca6061efefb5a3025James Dong            if (bitmapcol[k] != 0)
104402f5b5447de349216a40086ca6061efefb5a3025James Dong            {
104502f5b5447de349216a40086ca6061efefb5a3025James Dong                (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */
104602f5b5447de349216a40086ca6061efefb5a3025James Dong            }
104702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
104802f5b5447de349216a40086ca6061efefb5a3025James Dong    }
104902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
105002f5b5447de349216a40086ca6061efefb5a3025James Dong
105102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Store the qcoeff-values needed later for prediction */
105202f5b5447de349216a40086ca6061efefb5a3025James Dong    (*DC)[comp] = datablock[0];
105302f5b5447de349216a40086ca6061efefb5a3025James Dong    return i;
105402f5b5447de349216a40086ca6061efefb5a3025James Dong}
105502f5b5447de349216a40086ca6061efefb5a3025James Dong
105602f5b5447de349216a40086ca6061efefb5a3025James Dong/***********************************************************CommentBegin******
105702f5b5447de349216a40086ca6061efefb5a3025James Dong*
105802f5b5447de349216a40086ca6061efefb5a3025James Dong* -- VlcDequantInterH263Block -- Decodes the DCT coefficients of one 8x8 block and perform
105902f5b5447de349216a40086ca6061efefb5a3025James Dong            dequantization in H.263 mode for INTER block.
106002f5b5447de349216a40086ca6061efefb5a3025James Dong    Date:       08/08/2000
106102f5b5447de349216a40086ca6061efefb5a3025James Dong    Modified:             3/21/01
106202f5b5447de349216a40086ca6061efefb5a3025James Dong                clean up, added clipping, 16-bit int case
106302f5b5447de349216a40086ca6061efefb5a3025James Dong******************************************************************************/
106402f5b5447de349216a40086ca6061efefb5a3025James Dong
106502f5b5447de349216a40086ca6061efefb5a3025James Dong
106602f5b5447de349216a40086ca6061efefb5a3025James Dongint VlcDequantH263InterBlock(VideoDecData *video, int comp,
106702f5b5447de349216a40086ca6061efefb5a3025James Dong                             uint8 *bitmapcol, uint8 *bitmaprow)
106802f5b5447de349216a40086ca6061efefb5a3025James Dong{
106902f5b5447de349216a40086ca6061efefb5a3025James Dong    BitstreamDecVideo *stream = video->bitstream;
107002f5b5447de349216a40086ca6061efefb5a3025James Dong    int16 *datablock = video->mblock->block[comp]; /* 10/20/2000, assume it has been reset of all-zero !!!*/
107102f5b5447de349216a40086ca6061efefb5a3025James Dong    int32 temp;
107202f5b5447de349216a40086ca6061efefb5a3025James Dong    int mbnum = video->mbnum;
107302f5b5447de349216a40086ca6061efefb5a3025James Dong    int QP = video->QPMB[mbnum];
107402f5b5447de349216a40086ca6061efefb5a3025James Dong
107502f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** VLC *****/
107602f5b5447de349216a40086ca6061efefb5a3025James Dong    int i, k;
107702f5b5447de349216a40086ca6061efefb5a3025James Dong    Tcoef run_level;
107802f5b5447de349216a40086ca6061efefb5a3025James Dong    int last, return_status;
107902f5b5447de349216a40086ca6061efefb5a3025James Dong    VlcDecFuncP vlcDecCoeff;
108002f5b5447de349216a40086ca6061efefb5a3025James Dong
108102f5b5447de349216a40086ca6061efefb5a3025James Dong    /*** Quantizer ****/
108202f5b5447de349216a40086ca6061efefb5a3025James Dong
108302f5b5447de349216a40086ca6061efefb5a3025James Dong
108402f5b5447de349216a40086ca6061efefb5a3025James Dong    i = 0;
108502f5b5447de349216a40086ca6061efefb5a3025James Dong
108602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
108702f5b5447de349216a40086ca6061efefb5a3025James Dong    *((uint32*)bitmapcol) = *((uint32*)(bitmapcol + 4)) = 0;
108802f5b5447de349216a40086ca6061efefb5a3025James Dong    *bitmaprow = 0;
108902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
109002f5b5447de349216a40086ca6061efefb5a3025James Dong
109102f5b5447de349216a40086ca6061efefb5a3025James Dong    /* select which Huffman table to be used */
109202f5b5447de349216a40086ca6061efefb5a3025James Dong    vlcDecCoeff = video->vlcDecCoeffInter;
109302f5b5447de349216a40086ca6061efefb5a3025James Dong
109402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* enter the zero run decoding loop */
109502f5b5447de349216a40086ca6061efefb5a3025James Dong    do
109602f5b5447de349216a40086ca6061efefb5a3025James Dong    {
109702f5b5447de349216a40086ca6061efefb5a3025James Dong        return_status = (*vlcDecCoeff)(stream, &run_level);
109802f5b5447de349216a40086ca6061efefb5a3025James Dong        if (return_status != PV_SUCCESS)
109902f5b5447de349216a40086ca6061efefb5a3025James Dong        {
110002f5b5447de349216a40086ca6061efefb5a3025James Dong
110102f5b5447de349216a40086ca6061efefb5a3025James Dong
110202f5b5447de349216a40086ca6061efefb5a3025James Dong            last = 1;/*  11/1/2000 let it slips undetected, just like
110302f5b5447de349216a40086ca6061efefb5a3025James Dong                     in original version */
110402f5b5447de349216a40086ca6061efefb5a3025James Dong            i = -1;
110502f5b5447de349216a40086ca6061efefb5a3025James Dong            break;
110602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
110702f5b5447de349216a40086ca6061efefb5a3025James Dong
110802f5b5447de349216a40086ca6061efefb5a3025James Dong        i += run_level.run;
110902f5b5447de349216a40086ca6061efefb5a3025James Dong        last = run_level.last;
111002f5b5447de349216a40086ca6061efefb5a3025James Dong        if (i >= 64)
111102f5b5447de349216a40086ca6061efefb5a3025James Dong        {
111202f5b5447de349216a40086ca6061efefb5a3025James Dong            i = -1;
111302f5b5447de349216a40086ca6061efefb5a3025James Dong            last = 1;
111402f5b5447de349216a40086ca6061efefb5a3025James Dong            break;
111502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
111602f5b5447de349216a40086ca6061efefb5a3025James Dong
111702f5b5447de349216a40086ca6061efefb5a3025James Dong        if (run_level.sign == 0)
111802f5b5447de349216a40086ca6061efefb5a3025James Dong        {
111902f5b5447de349216a40086ca6061efefb5a3025James Dong            temp = (int32)QP * (2 * run_level.level + 1) - 1 + (QP & 1);
112002f5b5447de349216a40086ca6061efefb5a3025James Dong            if (temp > 2047) temp = 2047;
112102f5b5447de349216a40086ca6061efefb5a3025James Dong
112202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
112302f5b5447de349216a40086ca6061efefb5a3025James Dong        else
112402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
112502f5b5447de349216a40086ca6061efefb5a3025James Dong            temp = -(int32)QP * (2 * run_level.level + 1) + 1 - (QP & 1);
112602f5b5447de349216a40086ca6061efefb5a3025James Dong            if (temp < -2048) temp = -2048;
112702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
112802f5b5447de349216a40086ca6061efefb5a3025James Dong
112902f5b5447de349216a40086ca6061efefb5a3025James Dong        k = zigzag_inv[i];
113002f5b5447de349216a40086ca6061efefb5a3025James Dong        datablock[k] = (int16)temp;
113102f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
113202f5b5447de349216a40086ca6061efefb5a3025James Dong        bitmapcol[k&0x7] |= mask[k>>3];
113302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
113402f5b5447de349216a40086ca6061efefb5a3025James Dong        i++;
113502f5b5447de349216a40086ca6061efefb5a3025James Dong    }
113602f5b5447de349216a40086ca6061efefb5a3025James Dong    while (!last);
113702f5b5447de349216a40086ca6061efefb5a3025James Dong
113802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef FAST_IDCT
113902f5b5447de349216a40086ca6061efefb5a3025James Dong    if (i > 10)         /*  07/19/01 */
114002f5b5447de349216a40086ca6061efefb5a3025James Dong    {
114102f5b5447de349216a40086ca6061efefb5a3025James Dong        for (k = 1; k < 4; k++)       /*  if (i > 10 ) k = 0 does not matter */
114202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
114302f5b5447de349216a40086ca6061efefb5a3025James Dong            if (bitmapcol[k] != 0)
114402f5b5447de349216a40086ca6061efefb5a3025James Dong            {
114502f5b5447de349216a40086ca6061efefb5a3025James Dong                (*bitmaprow) |= mask[k]; /* (1<<(7-i)); */
114602f5b5447de349216a40086ca6061efefb5a3025James Dong            }
114702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
114802f5b5447de349216a40086ca6061efefb5a3025James Dong    }
114902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif
115002f5b5447de349216a40086ca6061efefb5a3025James Dong    return i;
115102f5b5447de349216a40086ca6061efefb5a3025James Dong}
115202f5b5447de349216a40086ca6061efefb5a3025James Dong
1153