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