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" /* video decoder function prototypes */ 1902f5b5447de349216a40086ca6061efefb5a3025James Dong#include "vlc_decode.h" 2002f5b5447de349216a40086ca6061efefb5a3025James Dong#include "bitstream.h" 2102f5b5447de349216a40086ca6061efefb5a3025James Dong#include "scaling.h" 2202f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mbtype_mode.h" 2302f5b5447de349216a40086ca6061efefb5a3025James Dong 2402f5b5447de349216a40086ca6061efefb5a3025James Dong#define OSCL_DISABLE_WARNING_CONDITIONAL_IS_CONSTANT 2502f5b5447de349216a40086ca6061efefb5a3025James Dong/* ======================================================================== */ 2602f5b5447de349216a40086ca6061efefb5a3025James Dong/* Function : DecodeFrameCombinedMode() */ 2702f5b5447de349216a40086ca6061efefb5a3025James Dong/* Purpose : Decode a frame of MPEG4 bitstream in combined mode. */ 2802f5b5447de349216a40086ca6061efefb5a3025James Dong/* In/out : */ 2902f5b5447de349216a40086ca6061efefb5a3025James Dong/* Return : */ 3002f5b5447de349216a40086ca6061efefb5a3025James Dong/* Modified : */ 3102f5b5447de349216a40086ca6061efefb5a3025James Dong/* */ 3202f5b5447de349216a40086ca6061efefb5a3025James Dong/* 03/30/2000 : Cleaned up and optimized the code. */ 3302f5b5447de349216a40086ca6061efefb5a3025James Dong/* 03/31/2000 : Added proper handling of MB stuffing. */ 3402f5b5447de349216a40086ca6061efefb5a3025James Dong/* 04/13/2000 : Rewrote this combined mode path completely */ 3502f5b5447de349216a40086ca6061efefb5a3025James Dong/* so that it handles "Combined Mode With Error */ 3602f5b5447de349216a40086ca6061efefb5a3025James Dong/* Resilience." Now the code resembles the */ 3702f5b5447de349216a40086ca6061efefb5a3025James Dong/* pseudo codes in MPEG-4 standard better. */ 3802f5b5447de349216a40086ca6061efefb5a3025James Dong/* 10/13/2000 : Add fast VLC+dequant */ 3902f5b5447de349216a40086ca6061efefb5a3025James Dong/* 04/13/2001 : fix MB_stuffing */ 4002f5b5447de349216a40086ca6061efefb5a3025James Dong/* 08/07/2001 : remove MBzero */ 4102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ======================================================================== */ 4202f5b5447de349216a40086ca6061efefb5a3025James DongPV_STATUS DecodeFrameCombinedMode(VideoDecData *video) 4302f5b5447de349216a40086ca6061efefb5a3025James Dong{ 4402f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS status; 4502f5b5447de349216a40086ca6061efefb5a3025James Dong int mbnum; 4602f5b5447de349216a40086ca6061efefb5a3025James Dong Vop *currVop = video->currVop; 4702f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamDecVideo *stream = video->bitstream; 4802f5b5447de349216a40086ca6061efefb5a3025James Dong int shortVideoHeader = video->shortVideoHeader; 4902f5b5447de349216a40086ca6061efefb5a3025James Dong int16 QP, *QPMB = video->QPMB; 5002f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *Mode = video->headerInfo.Mode; 5102f5b5447de349216a40086ca6061efefb5a3025James Dong int nTotalMB = video->nTotalMB; 5202f5b5447de349216a40086ca6061efefb5a3025James Dong int nMBPerRow = video->nMBPerRow; 5302f5b5447de349216a40086ca6061efefb5a3025James Dong int slice_counter; 5402f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 tmpvar, long_zero_bits; 5502f5b5447de349216a40086ca6061efefb5a3025James Dong uint code; 5602f5b5447de349216a40086ca6061efefb5a3025James Dong int valid_stuffing; 5702f5b5447de349216a40086ca6061efefb5a3025James Dong int resync_marker_length; 5802f5b5447de349216a40086ca6061efefb5a3025James Dong int stuffing_length; 5902f5b5447de349216a40086ca6061efefb5a3025James Dong 6002f5b5447de349216a40086ca6061efefb5a3025James Dong /* add this for error resilient, 05/18/2000 */ 6102f5b5447de349216a40086ca6061efefb5a3025James Dong int32 startPacket; 6202f5b5447de349216a40086ca6061efefb5a3025James Dong int mb_start; 6302f5b5447de349216a40086ca6061efefb5a3025James Dong /* copy and pad to prev_Vop for INTER coding */ 6402f5b5447de349216a40086ca6061efefb5a3025James Dong switch (currVop->predictionType) 6502f5b5447de349216a40086ca6061efefb5a3025James Dong { 6602f5b5447de349216a40086ca6061efefb5a3025James Dong case I_VOP : 6702f5b5447de349216a40086ca6061efefb5a3025James Dong// oscl_memset(Mode, MODE_INTRA, sizeof(uint8)*nTotalMB); 6802f5b5447de349216a40086ca6061efefb5a3025James Dong resync_marker_length = 17; 6902f5b5447de349216a40086ca6061efefb5a3025James Dong stuffing_length = 9; 7002f5b5447de349216a40086ca6061efefb5a3025James Dong break; 7102f5b5447de349216a40086ca6061efefb5a3025James Dong case P_VOP : 7202f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memset(video->motX, 0, sizeof(MOT)*4*nTotalMB); 7302f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memset(video->motY, 0, sizeof(MOT)*4*nTotalMB); 7402f5b5447de349216a40086ca6061efefb5a3025James Dong// oscl_memset(Mode, MODE_INTER, sizeof(uint8)*nTotalMB); 7502f5b5447de349216a40086ca6061efefb5a3025James Dong resync_marker_length = 16 + currVop->fcodeForward; 7602f5b5447de349216a40086ca6061efefb5a3025James Dong stuffing_length = 10; 7702f5b5447de349216a40086ca6061efefb5a3025James Dong break; 7802f5b5447de349216a40086ca6061efefb5a3025James Dong default : 7902f5b5447de349216a40086ca6061efefb5a3025James Dong mp4dec_log("DecodeFrameCombinedMode(): Vop type not supported.\n"); 8002f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 8102f5b5447de349216a40086ca6061efefb5a3025James Dong } 8202f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 8302f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->shortVideoHeader) 8402f5b5447de349216a40086ca6061efefb5a3025James Dong { 8502f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->advanced_INTRA) 8602f5b5447de349216a40086ca6061efefb5a3025James Dong { 8702f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->modified_quant) 8802f5b5447de349216a40086ca6061efefb5a3025James Dong { 8902f5b5447de349216a40086ca6061efefb5a3025James Dong video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader_AnnexIT; 9002f5b5447de349216a40086ca6061efefb5a3025James Dong video->vlcDecCoeffInter = &VlcDecTCOEFShortHeader_AnnexT; 9102f5b5447de349216a40086ca6061efefb5a3025James Dong } 9202f5b5447de349216a40086ca6061efefb5a3025James Dong else 9302f5b5447de349216a40086ca6061efefb5a3025James Dong { 9402f5b5447de349216a40086ca6061efefb5a3025James Dong video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader_AnnexI; 9502f5b5447de349216a40086ca6061efefb5a3025James Dong video->vlcDecCoeffInter = &VlcDecTCOEFShortHeader; 9602f5b5447de349216a40086ca6061efefb5a3025James Dong } 9702f5b5447de349216a40086ca6061efefb5a3025James Dong } 9802f5b5447de349216a40086ca6061efefb5a3025James Dong else 9902f5b5447de349216a40086ca6061efefb5a3025James Dong { 10002f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->modified_quant) 10102f5b5447de349216a40086ca6061efefb5a3025James Dong { 10202f5b5447de349216a40086ca6061efefb5a3025James Dong video->vlcDecCoeffInter = video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader_AnnexT; 10302f5b5447de349216a40086ca6061efefb5a3025James Dong } 10402f5b5447de349216a40086ca6061efefb5a3025James Dong else 10502f5b5447de349216a40086ca6061efefb5a3025James Dong { 10602f5b5447de349216a40086ca6061efefb5a3025James Dong video->vlcDecCoeffInter = video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader; 10702f5b5447de349216a40086ca6061efefb5a3025James Dong } 10802f5b5447de349216a40086ca6061efefb5a3025James Dong } 10902f5b5447de349216a40086ca6061efefb5a3025James Dong } 11002f5b5447de349216a40086ca6061efefb5a3025James Dong 11102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 11202f5b5447de349216a40086ca6061efefb5a3025James Dong 11302f5b5447de349216a40086ca6061efefb5a3025James Dong /** Initialize sliceNo ***/ 11402f5b5447de349216a40086ca6061efefb5a3025James Dong mbnum = slice_counter = 0; 11502f5b5447de349216a40086ca6061efefb5a3025James Dong// oscl_memset(video->sliceNo, 0, sizeof(uint8)*nTotalMB); 11602f5b5447de349216a40086ca6061efefb5a3025James Dong QP = video->currVop->quantizer; 11702f5b5447de349216a40086ca6061efefb5a3025James Dong 11802f5b5447de349216a40086ca6061efefb5a3025James Dong do 11902f5b5447de349216a40086ca6061efefb5a3025James Dong { 12002f5b5447de349216a40086ca6061efefb5a3025James Dong /* This section is equivalent to motion_shape_texture() */ 12102f5b5447de349216a40086ca6061efefb5a3025James Dong /* in the MPEG-4 standard. 04/13/2000 */ 12202f5b5447de349216a40086ca6061efefb5a3025James Dong mb_start = mbnum; 12302f5b5447de349216a40086ca6061efefb5a3025James Dong video->usePrevQP = 0; /* 04/27/01 */ 12402f5b5447de349216a40086ca6061efefb5a3025James Dong startPacket = getPointer(stream); 12502f5b5447de349216a40086ca6061efefb5a3025James Dong 12602f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 12702f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->modified_quant) 12802f5b5447de349216a40086ca6061efefb5a3025James Dong { 12902f5b5447de349216a40086ca6061efefb5a3025James Dong video->QP_CHR = MQ_chroma_QP_table[QP]; 13002f5b5447de349216a40086ca6061efefb5a3025James Dong } 13102f5b5447de349216a40086ca6061efefb5a3025James Dong else 13202f5b5447de349216a40086ca6061efefb5a3025James Dong { 13302f5b5447de349216a40086ca6061efefb5a3025James Dong video->QP_CHR = QP; /* ANNEX_T */ 13402f5b5447de349216a40086ca6061efefb5a3025James Dong } 13502f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 13602f5b5447de349216a40086ca6061efefb5a3025James Dong /* remove any stuffing bits */ 13702f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamShowBits16(stream, stuffing_length, &code); 13802f5b5447de349216a40086ca6061efefb5a3025James Dong while (code == 1) 13902f5b5447de349216a40086ca6061efefb5a3025James Dong { 14002f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamFlushBits(stream, stuffing_length); 14102f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamShowBits16(stream, stuffing_length, &code); 14202f5b5447de349216a40086ca6061efefb5a3025James Dong } 14302f5b5447de349216a40086ca6061efefb5a3025James Dong 14402f5b5447de349216a40086ca6061efefb5a3025James Dong do 14502f5b5447de349216a40086ca6061efefb5a3025James Dong { 14602f5b5447de349216a40086ca6061efefb5a3025James Dong /* we need video->mbnum in lower level functions */ 14702f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum = mbnum; 14802f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow); 14902f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow; 15002f5b5447de349216a40086ca6061efefb5a3025James Dong /* assign slice number for each macroblocks */ 15102f5b5447de349216a40086ca6061efefb5a3025James Dong video->sliceNo[mbnum] = (uint8) slice_counter; 15202f5b5447de349216a40086ca6061efefb5a3025James Dong 15302f5b5447de349216a40086ca6061efefb5a3025James Dong /* decode COD, MCBPC, ACpred_flag, CPBY and DQUANT */ 15402f5b5447de349216a40086ca6061efefb5a3025James Dong /* We have to discard stuffed MB header */ 15502f5b5447de349216a40086ca6061efefb5a3025James Dong status = GetMBheader(video, &QP); 15602f5b5447de349216a40086ca6061efefb5a3025James Dong 15702f5b5447de349216a40086ca6061efefb5a3025James Dong if (status != PV_SUCCESS) 15802f5b5447de349216a40086ca6061efefb5a3025James Dong { 15902f5b5447de349216a40086ca6061efefb5a3025James Dong VideoDecoderErrorDetected(video); 16002f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum = mb_start; 16102f5b5447de349216a40086ca6061efefb5a3025James Dong movePointerTo(stream, (startPacket & -8)); 16202f5b5447de349216a40086ca6061efefb5a3025James Dong break; 16302f5b5447de349216a40086ca6061efefb5a3025James Dong } 16402f5b5447de349216a40086ca6061efefb5a3025James Dong 16502f5b5447de349216a40086ca6061efefb5a3025James Dong /* Store the QP value for later use in AC prediction */ 16602f5b5447de349216a40086ca6061efefb5a3025James Dong QPMB[mbnum] = QP; 16702f5b5447de349216a40086ca6061efefb5a3025James Dong 16802f5b5447de349216a40086ca6061efefb5a3025James Dong if (Mode[mbnum] != MODE_SKIPPED) 16902f5b5447de349216a40086ca6061efefb5a3025James Dong { 17002f5b5447de349216a40086ca6061efefb5a3025James Dong /* decode the DCT coeficients for the MB */ 17102f5b5447de349216a40086ca6061efefb5a3025James Dong status = GetMBData(video); 17202f5b5447de349216a40086ca6061efefb5a3025James Dong if (status != PV_SUCCESS) 17302f5b5447de349216a40086ca6061efefb5a3025James Dong { 17402f5b5447de349216a40086ca6061efefb5a3025James Dong VideoDecoderErrorDetected(video); 17502f5b5447de349216a40086ca6061efefb5a3025James Dong video->mbnum = mb_start; 17602f5b5447de349216a40086ca6061efefb5a3025James Dong movePointerTo(stream, (startPacket & -8)); 17702f5b5447de349216a40086ca6061efefb5a3025James Dong break; 17802f5b5447de349216a40086ca6061efefb5a3025James Dong } 17902f5b5447de349216a40086ca6061efefb5a3025James Dong } 18002f5b5447de349216a40086ca6061efefb5a3025James Dong else /* MODE_SKIPPED */ 18102f5b5447de349216a40086ca6061efefb5a3025James Dong { 18202f5b5447de349216a40086ca6061efefb5a3025James Dong SkippedMBMotionComp(video); /* 08/04/05 */ 18302f5b5447de349216a40086ca6061efefb5a3025James Dong } 18402f5b5447de349216a40086ca6061efefb5a3025James Dong // Motion compensation and put video->mblock->pred_block 18502f5b5447de349216a40086ca6061efefb5a3025James Dong mbnum++; 18602f5b5447de349216a40086ca6061efefb5a3025James Dong 18702f5b5447de349216a40086ca6061efefb5a3025James Dong /* remove any stuffing bits */ 18802f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamShowBits16(stream, stuffing_length, &code); 18902f5b5447de349216a40086ca6061efefb5a3025James Dong while (code == 1) 19002f5b5447de349216a40086ca6061efefb5a3025James Dong { 19102f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamFlushBits(stream, stuffing_length); 19202f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamShowBits16(stream, stuffing_length, &code); 19302f5b5447de349216a40086ca6061efefb5a3025James Dong } 19402f5b5447de349216a40086ca6061efefb5a3025James Dong 19502f5b5447de349216a40086ca6061efefb5a3025James Dong /* have we reached the end of the video packet or vop? */ 19602f5b5447de349216a40086ca6061efefb5a3025James Dong if (shortVideoHeader) 19702f5b5447de349216a40086ca6061efefb5a3025James Dong { 19802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 19902f5b5447de349216a40086ca6061efefb5a3025James Dong if (!video->slice_structure) 20002f5b5447de349216a40086ca6061efefb5a3025James Dong { 20102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 20202f5b5447de349216a40086ca6061efefb5a3025James Dong if (mbnum >= (int)(video->mbnum_row + 1)*video->nMBinGOB) /* 10/11/01 */ 20302f5b5447de349216a40086ca6061efefb5a3025James Dong { 20402f5b5447de349216a40086ca6061efefb5a3025James Dong if (mbnum >= nTotalMB) return PV_SUCCESS; 20502f5b5447de349216a40086ca6061efefb5a3025James Dong status = BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar); 20602f5b5447de349216a40086ca6061efefb5a3025James Dong 20702f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar == GOB_RESYNC_MARKER) 20802f5b5447de349216a40086ca6061efefb5a3025James Dong { 20902f5b5447de349216a40086ca6061efefb5a3025James Dong break; 21002f5b5447de349216a40086ca6061efefb5a3025James Dong } 21102f5b5447de349216a40086ca6061efefb5a3025James Dong else 21202f5b5447de349216a40086ca6061efefb5a3025James Dong { 21302f5b5447de349216a40086ca6061efefb5a3025James Dong status = PV_BitstreamShowBitsByteAlign(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar); 21402f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar == GOB_RESYNC_MARKER) break; 21502f5b5447de349216a40086ca6061efefb5a3025James Dong } 21602f5b5447de349216a40086ca6061efefb5a3025James Dong } 21702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 21802f5b5447de349216a40086ca6061efefb5a3025James Dong } 21902f5b5447de349216a40086ca6061efefb5a3025James Dong else 22002f5b5447de349216a40086ca6061efefb5a3025James Dong { 22102f5b5447de349216a40086ca6061efefb5a3025James Dong 22202f5b5447de349216a40086ca6061efefb5a3025James Dong if (mbnum >= nTotalMB) /* in case no valid stuffing 06/23/01 */ 22302f5b5447de349216a40086ca6061efefb5a3025James Dong { 22402f5b5447de349216a40086ca6061efefb5a3025James Dong valid_stuffing = validStuffing_h263(stream); 22502f5b5447de349216a40086ca6061efefb5a3025James Dong if (valid_stuffing == 0) 22602f5b5447de349216a40086ca6061efefb5a3025James Dong { 22702f5b5447de349216a40086ca6061efefb5a3025James Dong VideoDecoderErrorDetected(video); 22802f5b5447de349216a40086ca6061efefb5a3025James Dong ConcealPacket(video, mb_start, nTotalMB, slice_counter); 22902f5b5447de349216a40086ca6061efefb5a3025James Dong } 23002f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 23102f5b5447de349216a40086ca6061efefb5a3025James Dong } 23202f5b5447de349216a40086ca6061efefb5a3025James Dong /* ANNEX_K */ 23302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamShowBitsByteAlignNoForceStuffing(stream, 17, &tmpvar); 23402f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar == RESYNC_MARKER) 23502f5b5447de349216a40086ca6061efefb5a3025James Dong { 23602f5b5447de349216a40086ca6061efefb5a3025James Dong valid_stuffing = validStuffing_h263(stream); 23702f5b5447de349216a40086ca6061efefb5a3025James Dong if (valid_stuffing) 23802f5b5447de349216a40086ca6061efefb5a3025James Dong break; /* 06/21/01 */ 23902f5b5447de349216a40086ca6061efefb5a3025James Dong } 24002f5b5447de349216a40086ca6061efefb5a3025James Dong 24102f5b5447de349216a40086ca6061efefb5a3025James Dong } 24202f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 24302f5b5447de349216a40086ca6061efefb5a3025James Dong } 24402f5b5447de349216a40086ca6061efefb5a3025James Dong else 24502f5b5447de349216a40086ca6061efefb5a3025James Dong { 24602f5b5447de349216a40086ca6061efefb5a3025James Dong if (mbnum >= nTotalMB) /* in case no valid stuffing 06/23/01 */ 24702f5b5447de349216a40086ca6061efefb5a3025James Dong { 24802f5b5447de349216a40086ca6061efefb5a3025James Dong /* 11/01/2002 if we are at the end of the frame and there is some garbage data 24902f5b5447de349216a40086ca6061efefb5a3025James Dong at the end of the frame (i.e. no next startcode) break if the stuffing is valid */ 25002f5b5447de349216a40086ca6061efefb5a3025James Dong valid_stuffing = validStuffing(stream); 25102f5b5447de349216a40086ca6061efefb5a3025James Dong if (valid_stuffing == 0) 25202f5b5447de349216a40086ca6061efefb5a3025James Dong { 25302f5b5447de349216a40086ca6061efefb5a3025James Dong /* end 11/01/2002 */ 25402f5b5447de349216a40086ca6061efefb5a3025James Dong VideoDecoderErrorDetected(video); 25502f5b5447de349216a40086ca6061efefb5a3025James Dong ConcealPacket(video, mb_start, nTotalMB, slice_counter); 25602f5b5447de349216a40086ca6061efefb5a3025James Dong } 25702f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamByteAlign(stream); 25802f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 25902f5b5447de349216a40086ca6061efefb5a3025James Dong } 26002f5b5447de349216a40086ca6061efefb5a3025James Dong 26102f5b5447de349216a40086ca6061efefb5a3025James Dong status = PV_BitstreamShowBitsByteAlign(stream, 23, &tmpvar); /* this call is valid for f_code < 8 */ 26202f5b5447de349216a40086ca6061efefb5a3025James Dong long_zero_bits = !tmpvar; 26302f5b5447de349216a40086ca6061efefb5a3025James Dong 26402f5b5447de349216a40086ca6061efefb5a3025James Dong if ((tmpvar >> (23 - resync_marker_length)) == RESYNC_MARKER || long_zero_bits) 26502f5b5447de349216a40086ca6061efefb5a3025James Dong { 26602f5b5447de349216a40086ca6061efefb5a3025James Dong valid_stuffing = validStuffing(stream); 26702f5b5447de349216a40086ca6061efefb5a3025James Dong if (valid_stuffing) 26802f5b5447de349216a40086ca6061efefb5a3025James Dong break; /* 06/21/01 */ 26902f5b5447de349216a40086ca6061efefb5a3025James Dong } 27002f5b5447de349216a40086ca6061efefb5a3025James Dong 27102f5b5447de349216a40086ca6061efefb5a3025James Dong } 27202f5b5447de349216a40086ca6061efefb5a3025James Dong } 27302f5b5447de349216a40086ca6061efefb5a3025James Dong while (TRUE); 27402f5b5447de349216a40086ca6061efefb5a3025James Dong 27502f5b5447de349216a40086ca6061efefb5a3025James Dong if (shortVideoHeader) 27602f5b5447de349216a40086ca6061efefb5a3025James Dong { /* We need to check newgob to refresh quantizer */ 27702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 27802f5b5447de349216a40086ca6061efefb5a3025James Dong if (!video->slice_structure) 27902f5b5447de349216a40086ca6061efefb5a3025James Dong { 28002f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 28102f5b5447de349216a40086ca6061efefb5a3025James Dong while ((status = PV_GobHeader(video)) == PV_FAIL) 28202f5b5447de349216a40086ca6061efefb5a3025James Dong { 28302f5b5447de349216a40086ca6061efefb5a3025James Dong if ((status = quickSearchGOBHeader(stream)) != PV_SUCCESS) 28402f5b5447de349216a40086ca6061efefb5a3025James Dong { 28502f5b5447de349216a40086ca6061efefb5a3025James Dong break; 28602f5b5447de349216a40086ca6061efefb5a3025James Dong } 28702f5b5447de349216a40086ca6061efefb5a3025James Dong } 28802f5b5447de349216a40086ca6061efefb5a3025James Dong 28902f5b5447de349216a40086ca6061efefb5a3025James Dong mbnum = currVop->gobNumber * video->nMBinGOB; 29002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 29102f5b5447de349216a40086ca6061efefb5a3025James Dong } 29202f5b5447de349216a40086ca6061efefb5a3025James Dong else 29302f5b5447de349216a40086ca6061efefb5a3025James Dong { 29402f5b5447de349216a40086ca6061efefb5a3025James Dong while ((status = PV_H263SliceHeader(video, &mbnum)) == PV_FAIL) 29502f5b5447de349216a40086ca6061efefb5a3025James Dong { 29602f5b5447de349216a40086ca6061efefb5a3025James Dong if ((status = quickSearchH263SliceHeader(stream)) != PV_SUCCESS) 29702f5b5447de349216a40086ca6061efefb5a3025James Dong { 29802f5b5447de349216a40086ca6061efefb5a3025James Dong break; 29902f5b5447de349216a40086ca6061efefb5a3025James Dong } 30002f5b5447de349216a40086ca6061efefb5a3025James Dong } 30102f5b5447de349216a40086ca6061efefb5a3025James Dong } 30202f5b5447de349216a40086ca6061efefb5a3025James Dong 30302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 30402f5b5447de349216a40086ca6061efefb5a3025James Dong } 30502f5b5447de349216a40086ca6061efefb5a3025James Dong else 30602f5b5447de349216a40086ca6061efefb5a3025James Dong { 30702f5b5447de349216a40086ca6061efefb5a3025James Dong while ((status = PV_ReadVideoPacketHeader(video, &mbnum)) == PV_FAIL) 30802f5b5447de349216a40086ca6061efefb5a3025James Dong { 30902f5b5447de349216a40086ca6061efefb5a3025James Dong if ((status = quickSearchVideoPacketHeader(stream, resync_marker_length)) != PV_SUCCESS) 31002f5b5447de349216a40086ca6061efefb5a3025James Dong { 31102f5b5447de349216a40086ca6061efefb5a3025James Dong break; 31202f5b5447de349216a40086ca6061efefb5a3025James Dong } 31302f5b5447de349216a40086ca6061efefb5a3025James Dong } 31402f5b5447de349216a40086ca6061efefb5a3025James Dong } 31502f5b5447de349216a40086ca6061efefb5a3025James Dong 31602f5b5447de349216a40086ca6061efefb5a3025James Dong if (status == PV_END_OF_VOP) 31702f5b5447de349216a40086ca6061efefb5a3025James Dong { 31802f5b5447de349216a40086ca6061efefb5a3025James Dong mbnum = nTotalMB; 31902f5b5447de349216a40086ca6061efefb5a3025James Dong } 32002f5b5447de349216a40086ca6061efefb5a3025James Dong 32102f5b5447de349216a40086ca6061efefb5a3025James Dong if (mbnum > video->mbnum + 1) 32202f5b5447de349216a40086ca6061efefb5a3025James Dong { 32302f5b5447de349216a40086ca6061efefb5a3025James Dong ConcealPacket(video, video->mbnum, mbnum, slice_counter); 32402f5b5447de349216a40086ca6061efefb5a3025James Dong } 32502f5b5447de349216a40086ca6061efefb5a3025James Dong QP = video->currVop->quantizer; 32602f5b5447de349216a40086ca6061efefb5a3025James Dong slice_counter++; 32702f5b5447de349216a40086ca6061efefb5a3025James Dong if (mbnum >= nTotalMB) break; 32802f5b5447de349216a40086ca6061efefb5a3025James Dong 32902f5b5447de349216a40086ca6061efefb5a3025James Dong } 33002f5b5447de349216a40086ca6061efefb5a3025James Dong while (TRUE); 33102f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 33202f5b5447de349216a40086ca6061efefb5a3025James Dong} 33302f5b5447de349216a40086ca6061efefb5a3025James Dong 33402f5b5447de349216a40086ca6061efefb5a3025James Dong 33502f5b5447de349216a40086ca6061efefb5a3025James Dong/* ============================================================================ */ 33602f5b5447de349216a40086ca6061efefb5a3025James Dong/* Function : GetMBHeader() */ 33702f5b5447de349216a40086ca6061efefb5a3025James Dong/* Purpose : Decode MB header, not_coded, mcbpc, ac_pred_flag, cbpy, dquant. */ 33802f5b5447de349216a40086ca6061efefb5a3025James Dong/* In/out : */ 33902f5b5447de349216a40086ca6061efefb5a3025James Dong/* Return : */ 34002f5b5447de349216a40086ca6061efefb5a3025James Dong/* Modified : */ 34102f5b5447de349216a40086ca6061efefb5a3025James Dong/* */ 34202f5b5447de349216a40086ca6061efefb5a3025James Dong/* 3/29/00 : Changed the returned value and optimized the code. */ 34302f5b5447de349216a40086ca6061efefb5a3025James Dong/* 4/01/01 : new ACDC prediction structure */ 34402f5b5447de349216a40086ca6061efefb5a3025James Dong/* ============================================================================ */ 34502f5b5447de349216a40086ca6061efefb5a3025James DongPV_STATUS GetMBheader(VideoDecData *video, int16 *QP) 34602f5b5447de349216a40086ca6061efefb5a3025James Dong{ 34702f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamDecVideo *stream = video->bitstream; 34802f5b5447de349216a40086ca6061efefb5a3025James Dong int mbnum = video->mbnum; 34902f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *Mode = video->headerInfo.Mode; 35002f5b5447de349216a40086ca6061efefb5a3025James Dong int x_pos = video->mbnum_col; 35102f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCStore *DC = video->predDC + mbnum; 35202f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCACStore *DCAC_row = video->predDCAC_row + x_pos; 35302f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCACStore *DCAC_col = video->predDCAC_col; 35402f5b5447de349216a40086ca6061efefb5a3025James Dong const static int16 DQ_tab[4] = { -1, -2, 1, 2}; 35502f5b5447de349216a40086ca6061efefb5a3025James Dong 35602f5b5447de349216a40086ca6061efefb5a3025James Dong int CBPY, CBPC; 35702f5b5447de349216a40086ca6061efefb5a3025James Dong int MBtype, VopType; 35802f5b5447de349216a40086ca6061efefb5a3025James Dong int MCBPC; 35902f5b5447de349216a40086ca6061efefb5a3025James Dong uint DQUANT; 36002f5b5447de349216a40086ca6061efefb5a3025James Dong int comp; 36102f5b5447de349216a40086ca6061efefb5a3025James Dong Bool mb_coded; 36202f5b5447de349216a40086ca6061efefb5a3025James Dong 36302f5b5447de349216a40086ca6061efefb5a3025James Dong VopType = video->currVop->predictionType; 36402f5b5447de349216a40086ca6061efefb5a3025James Dong mb_coded = ((VopType == I_VOP) ? TRUE : !BitstreamRead1Bits_INLINE(stream)); 36502f5b5447de349216a40086ca6061efefb5a3025James Dong 36602f5b5447de349216a40086ca6061efefb5a3025James Dong if (!mb_coded) 36702f5b5447de349216a40086ca6061efefb5a3025James Dong { 36802f5b5447de349216a40086ca6061efefb5a3025James Dong /* skipped macroblock */ 36902f5b5447de349216a40086ca6061efefb5a3025James Dong Mode[mbnum] = MODE_SKIPPED; 37002f5b5447de349216a40086ca6061efefb5a3025James Dong //oscl_memset(DCAC_row, 0, sizeof(typeDCACStore)); /* SKIPPED_ACDC */ 37102f5b5447de349216a40086ca6061efefb5a3025James Dong //oscl_memset(DCAC_col, 0, sizeof(typeDCACStore)); 37202f5b5447de349216a40086ca6061efefb5a3025James Dong ZERO_OUT_64BYTES(DCAC_row); 37302f5b5447de349216a40086ca6061efefb5a3025James Dong ZERO_OUT_64BYTES(DCAC_col); /* 08/12/05 */ 37402f5b5447de349216a40086ca6061efefb5a3025James Dong 37502f5b5447de349216a40086ca6061efefb5a3025James Dong for (comp = 0; comp < 6; comp++) 37602f5b5447de349216a40086ca6061efefb5a3025James Dong { 37702f5b5447de349216a40086ca6061efefb5a3025James Dong (*DC)[comp] = mid_gray; 37802f5b5447de349216a40086ca6061efefb5a3025James Dong } 37902f5b5447de349216a40086ca6061efefb5a3025James Dong } 38002f5b5447de349216a40086ca6061efefb5a3025James Dong else 38102f5b5447de349216a40086ca6061efefb5a3025James Dong { 38202f5b5447de349216a40086ca6061efefb5a3025James Dong /* coded macroblock */ 38302f5b5447de349216a40086ca6061efefb5a3025James Dong if (VopType == I_VOP) 38402f5b5447de349216a40086ca6061efefb5a3025James Dong { 38502f5b5447de349216a40086ca6061efefb5a3025James Dong MCBPC = PV_VlcDecMCBPC_com_intra(stream); 38602f5b5447de349216a40086ca6061efefb5a3025James Dong } 38702f5b5447de349216a40086ca6061efefb5a3025James Dong else 38802f5b5447de349216a40086ca6061efefb5a3025James Dong { 38902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 39002f5b5447de349216a40086ca6061efefb5a3025James Dong if (!video->deblocking) 39102f5b5447de349216a40086ca6061efefb5a3025James Dong { 39202f5b5447de349216a40086ca6061efefb5a3025James Dong MCBPC = PV_VlcDecMCBPC_com_inter(stream); 39302f5b5447de349216a40086ca6061efefb5a3025James Dong } 39402f5b5447de349216a40086ca6061efefb5a3025James Dong else 39502f5b5447de349216a40086ca6061efefb5a3025James Dong { 39602f5b5447de349216a40086ca6061efefb5a3025James Dong MCBPC = PV_VlcDecMCBPC_com_inter_H263(stream); 39702f5b5447de349216a40086ca6061efefb5a3025James Dong } 39802f5b5447de349216a40086ca6061efefb5a3025James Dong#else 39902f5b5447de349216a40086ca6061efefb5a3025James Dong MCBPC = PV_VlcDecMCBPC_com_inter(stream); 40002f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 40102f5b5447de349216a40086ca6061efefb5a3025James Dong } 40202f5b5447de349216a40086ca6061efefb5a3025James Dong 40302f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(MCBPC)) 40402f5b5447de349216a40086ca6061efefb5a3025James Dong { 40502f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 40602f5b5447de349216a40086ca6061efefb5a3025James Dong } 40702f5b5447de349216a40086ca6061efefb5a3025James Dong 40802f5b5447de349216a40086ca6061efefb5a3025James Dong Mode[mbnum] = (uint8)(MBtype = MBtype_mode[MCBPC & 7]); 40902f5b5447de349216a40086ca6061efefb5a3025James Dong CBPC = (MCBPC >> 4) & 3; 41002f5b5447de349216a40086ca6061efefb5a3025James Dong 41102f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 41202f5b5447de349216a40086ca6061efefb5a3025James Dong if (MBtype & INTRA_MASK) 41302f5b5447de349216a40086ca6061efefb5a3025James Dong { 41402f5b5447de349216a40086ca6061efefb5a3025James Dong if (!video->shortVideoHeader) 41502f5b5447de349216a40086ca6061efefb5a3025James Dong { 41602f5b5447de349216a40086ca6061efefb5a3025James Dong video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits(stream); 41702f5b5447de349216a40086ca6061efefb5a3025James Dong } 41802f5b5447de349216a40086ca6061efefb5a3025James Dong else 41902f5b5447de349216a40086ca6061efefb5a3025James Dong { 42002f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->advanced_INTRA) 42102f5b5447de349216a40086ca6061efefb5a3025James Dong { 42202f5b5447de349216a40086ca6061efefb5a3025James Dong if (!BitstreamRead1Bits(stream)) 42302f5b5447de349216a40086ca6061efefb5a3025James Dong { 42402f5b5447de349216a40086ca6061efefb5a3025James Dong video->acPredFlag[mbnum] = 0; 42502f5b5447de349216a40086ca6061efefb5a3025James Dong } 42602f5b5447de349216a40086ca6061efefb5a3025James Dong else 42702f5b5447de349216a40086ca6061efefb5a3025James Dong { 42802f5b5447de349216a40086ca6061efefb5a3025James Dong video->acPredFlag[mbnum] = 1; 42902f5b5447de349216a40086ca6061efefb5a3025James Dong if (BitstreamRead1Bits(stream)) 43002f5b5447de349216a40086ca6061efefb5a3025James Dong { 43102f5b5447de349216a40086ca6061efefb5a3025James Dong video->mblock->direction = 0; 43202f5b5447de349216a40086ca6061efefb5a3025James Dong } 43302f5b5447de349216a40086ca6061efefb5a3025James Dong else 43402f5b5447de349216a40086ca6061efefb5a3025James Dong { 43502f5b5447de349216a40086ca6061efefb5a3025James Dong video->mblock->direction = 1; 43602f5b5447de349216a40086ca6061efefb5a3025James Dong } 43702f5b5447de349216a40086ca6061efefb5a3025James Dong } 43802f5b5447de349216a40086ca6061efefb5a3025James Dong } 43902f5b5447de349216a40086ca6061efefb5a3025James Dong else 44002f5b5447de349216a40086ca6061efefb5a3025James Dong { 44102f5b5447de349216a40086ca6061efefb5a3025James Dong video->acPredFlag[mbnum] = 0; 44202f5b5447de349216a40086ca6061efefb5a3025James Dong } 44302f5b5447de349216a40086ca6061efefb5a3025James Dong } 44402f5b5447de349216a40086ca6061efefb5a3025James Dong } 44502f5b5447de349216a40086ca6061efefb5a3025James Dong#else 44602f5b5447de349216a40086ca6061efefb5a3025James Dong if ((MBtype & INTRA_MASK) && !video->shortVideoHeader) 44702f5b5447de349216a40086ca6061efefb5a3025James Dong { 44802f5b5447de349216a40086ca6061efefb5a3025James Dong video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits_INLINE(stream); 44902f5b5447de349216a40086ca6061efefb5a3025James Dong } 45002f5b5447de349216a40086ca6061efefb5a3025James Dong else 45102f5b5447de349216a40086ca6061efefb5a3025James Dong { 45202f5b5447de349216a40086ca6061efefb5a3025James Dong video->acPredFlag[mbnum] = 0; 45302f5b5447de349216a40086ca6061efefb5a3025James Dong } 45402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 45502f5b5447de349216a40086ca6061efefb5a3025James Dong CBPY = PV_VlcDecCBPY(stream, MBtype & INTRA_MASK); /* INTRA || INTRA_Q */ 45602f5b5447de349216a40086ca6061efefb5a3025James Dong if (CBPY < 0) 45702f5b5447de349216a40086ca6061efefb5a3025James Dong { 45802f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 45902f5b5447de349216a40086ca6061efefb5a3025James Dong } 46002f5b5447de349216a40086ca6061efefb5a3025James Dong 46102f5b5447de349216a40086ca6061efefb5a3025James Dong // GW 04/23/99 46202f5b5447de349216a40086ca6061efefb5a3025James Dong video->headerInfo.CBP[mbnum] = (uint8)(CBPY << 2 | (CBPC & 3)); 46302f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 46402f5b5447de349216a40086ca6061efefb5a3025James Dong if (MBtype & Q_MASK) 46502f5b5447de349216a40086ca6061efefb5a3025James Dong { 46602f5b5447de349216a40086ca6061efefb5a3025James Dong if (!video->modified_quant) 46702f5b5447de349216a40086ca6061efefb5a3025James Dong { 46802f5b5447de349216a40086ca6061efefb5a3025James Dong DQUANT = BitstreamReadBits16(stream, 2); 46902f5b5447de349216a40086ca6061efefb5a3025James Dong *QP += DQ_tab[DQUANT]; 47002f5b5447de349216a40086ca6061efefb5a3025James Dong 47102f5b5447de349216a40086ca6061efefb5a3025James Dong if (*QP < 1) *QP = 1; 47202f5b5447de349216a40086ca6061efefb5a3025James Dong else if (*QP > 31) *QP = 31; 47302f5b5447de349216a40086ca6061efefb5a3025James Dong video->QP_CHR = *QP; /* ANNEX_T */ 47402f5b5447de349216a40086ca6061efefb5a3025James Dong } 47502f5b5447de349216a40086ca6061efefb5a3025James Dong else 47602f5b5447de349216a40086ca6061efefb5a3025James Dong { 47702f5b5447de349216a40086ca6061efefb5a3025James Dong if (BitstreamRead1Bits(stream)) 47802f5b5447de349216a40086ca6061efefb5a3025James Dong { 47902f5b5447de349216a40086ca6061efefb5a3025James Dong if (BitstreamRead1Bits(stream)) 48002f5b5447de349216a40086ca6061efefb5a3025James Dong { 48102f5b5447de349216a40086ca6061efefb5a3025James Dong *QP += DQ_tab_Annex_T_11[*QP]; 48202f5b5447de349216a40086ca6061efefb5a3025James Dong } 48302f5b5447de349216a40086ca6061efefb5a3025James Dong else 48402f5b5447de349216a40086ca6061efefb5a3025James Dong { 48502f5b5447de349216a40086ca6061efefb5a3025James Dong *QP += DQ_tab_Annex_T_10[*QP]; 48602f5b5447de349216a40086ca6061efefb5a3025James Dong } 48702f5b5447de349216a40086ca6061efefb5a3025James Dong if (*QP < 1) *QP = 1; 48802f5b5447de349216a40086ca6061efefb5a3025James Dong else if (*QP > 31) *QP = 31; 48902f5b5447de349216a40086ca6061efefb5a3025James Dong } 49002f5b5447de349216a40086ca6061efefb5a3025James Dong else 49102f5b5447de349216a40086ca6061efefb5a3025James Dong { 49202f5b5447de349216a40086ca6061efefb5a3025James Dong *QP = (int16)BitstreamReadBits16(stream, 5); 49302f5b5447de349216a40086ca6061efefb5a3025James Dong } 49402f5b5447de349216a40086ca6061efefb5a3025James Dong video->QP_CHR = MQ_chroma_QP_table[*QP]; 49502f5b5447de349216a40086ca6061efefb5a3025James Dong } 49602f5b5447de349216a40086ca6061efefb5a3025James Dong } 49702f5b5447de349216a40086ca6061efefb5a3025James Dong#else 49802f5b5447de349216a40086ca6061efefb5a3025James Dong if (MBtype & Q_MASK) 49902f5b5447de349216a40086ca6061efefb5a3025James Dong { 50002f5b5447de349216a40086ca6061efefb5a3025James Dong DQUANT = BitstreamReadBits16(stream, 2); 50102f5b5447de349216a40086ca6061efefb5a3025James Dong *QP += DQ_tab[DQUANT]; 50202f5b5447de349216a40086ca6061efefb5a3025James Dong 50302f5b5447de349216a40086ca6061efefb5a3025James Dong if (*QP < 1) *QP = 1; 50402f5b5447de349216a40086ca6061efefb5a3025James Dong else if (*QP > 31) *QP = 31; 50502f5b5447de349216a40086ca6061efefb5a3025James Dong } 50602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 50702f5b5447de349216a40086ca6061efefb5a3025James Dong } 50802f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 50902f5b5447de349216a40086ca6061efefb5a3025James Dong} 51002f5b5447de349216a40086ca6061efefb5a3025James Dong 51102f5b5447de349216a40086ca6061efefb5a3025James Dong 51202f5b5447de349216a40086ca6061efefb5a3025James Dong 51302f5b5447de349216a40086ca6061efefb5a3025James Dong 51402f5b5447de349216a40086ca6061efefb5a3025James Dong 51502f5b5447de349216a40086ca6061efefb5a3025James Dong/***********************************************************CommentBegin****** 51602f5b5447de349216a40086ca6061efefb5a3025James Dong* 3/10/00 : initial modification to the 51702f5b5447de349216a40086ca6061efefb5a3025James Dong* new PV-Decoder Lib format. 51802f5b5447de349216a40086ca6061efefb5a3025James Dong* 4/2/2000 : Cleanup and error-handling modification. This 51902f5b5447de349216a40086ca6061efefb5a3025James Dong* function has been divided into several sub-functions for 52002f5b5447de349216a40086ca6061efefb5a3025James Dong* better coding style and maintainance reason. I also 52102f5b5447de349216a40086ca6061efefb5a3025James Dong* greatly shrunk the code size here. 52202f5b5447de349216a40086ca6061efefb5a3025James Dong* 9/18/2000 : VlcDecode+Dequant optimization * 52302f5b5447de349216a40086ca6061efefb5a3025James Dong* 4/01/2001 : new ACDC prediction structure 52402f5b5447de349216a40086ca6061efefb5a3025James Dong* 3/29/2002 : removed GetIntraMB and GetInterMB 52502f5b5447de349216a40086ca6061efefb5a3025James Dong***********************************************************CommentEnd********/ 52602f5b5447de349216a40086ca6061efefb5a3025James DongPV_STATUS GetMBData(VideoDecData *video) 52702f5b5447de349216a40086ca6061efefb5a3025James Dong{ 52802f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamDecVideo *stream = video->bitstream; 52902f5b5447de349216a40086ca6061efefb5a3025James Dong int mbnum = video->mbnum; 53002f5b5447de349216a40086ca6061efefb5a3025James Dong MacroBlock *mblock = video->mblock; 53102f5b5447de349216a40086ca6061efefb5a3025James Dong int16 *dataBlock; 53202f5b5447de349216a40086ca6061efefb5a3025James Dong PIXEL *c_comp; 53302f5b5447de349216a40086ca6061efefb5a3025James Dong uint mode = video->headerInfo.Mode[mbnum]; 53402f5b5447de349216a40086ca6061efefb5a3025James Dong uint CBP = video->headerInfo.CBP[mbnum]; 53502f5b5447de349216a40086ca6061efefb5a3025James Dong typeDCStore *DC = video->predDC + mbnum; 53602f5b5447de349216a40086ca6061efefb5a3025James Dong int intra_dc_vlc_thr = video->currVop->intraDCVlcThr; 53702f5b5447de349216a40086ca6061efefb5a3025James Dong int16 QP = video->QPMB[mbnum]; 53802f5b5447de349216a40086ca6061efefb5a3025James Dong int16 QP_tmp = QP; 53902f5b5447de349216a40086ca6061efefb5a3025James Dong int width = video->width; 54002f5b5447de349216a40086ca6061efefb5a3025James Dong int comp; 54102f5b5447de349216a40086ca6061efefb5a3025James Dong int switched; 54202f5b5447de349216a40086ca6061efefb5a3025James Dong int ncoeffs[6] = {0, 0, 0, 0, 0, 0}; 54302f5b5447de349216a40086ca6061efefb5a3025James Dong int *no_coeff = mblock->no_coeff; 54402f5b5447de349216a40086ca6061efefb5a3025James Dong int16 DC_coeff; 54502f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS status; 54602f5b5447de349216a40086ca6061efefb5a3025James Dong 54702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 54802f5b5447de349216a40086ca6061efefb5a3025James Dong /* post-processing */ 54902f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pp_mod[6]; 55002f5b5447de349216a40086ca6061efefb5a3025James Dong int TotalMB = video->nTotalMB; 55102f5b5447de349216a40086ca6061efefb5a3025James Dong int MB_in_width = video->nMBPerRow; 55202f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 55302f5b5447de349216a40086ca6061efefb5a3025James Dong int y_pos = video->mbnum_row; 55402f5b5447de349216a40086ca6061efefb5a3025James Dong int x_pos = video->mbnum_col; 55502f5b5447de349216a40086ca6061efefb5a3025James Dong int32 offset = (int32)(y_pos << 4) * width + (x_pos << 4); 55602f5b5447de349216a40086ca6061efefb5a3025James Dong 55702f5b5447de349216a40086ca6061efefb5a3025James Dong /* Decode each 8-by-8 blocks. comp 0 ~ 3 are luminance blocks, 4 ~ 5 */ 55802f5b5447de349216a40086ca6061efefb5a3025James Dong /* are chrominance blocks. 04/03/2000. */ 55902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 56002f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 56102f5b5447de349216a40086ca6061efefb5a3025James Dong { 56202f5b5447de349216a40086ca6061efefb5a3025James Dong /** post-processing ***/ 56302f5b5447de349216a40086ca6061efefb5a3025James Dong pp_mod[0] = video->pstprcTypCur + (y_pos << 1) * (MB_in_width << 1) + (x_pos << 1); 56402f5b5447de349216a40086ca6061efefb5a3025James Dong pp_mod[1] = pp_mod[0] + 1; 56502f5b5447de349216a40086ca6061efefb5a3025James Dong pp_mod[2] = pp_mod[0] + (MB_in_width << 1); 56602f5b5447de349216a40086ca6061efefb5a3025James Dong pp_mod[3] = pp_mod[2] + 1; 56702f5b5447de349216a40086ca6061efefb5a3025James Dong pp_mod[4] = video->pstprcTypCur + (TotalMB << 2) + mbnum; 56802f5b5447de349216a40086ca6061efefb5a3025James Dong pp_mod[5] = pp_mod[4] + TotalMB; 56902f5b5447de349216a40086ca6061efefb5a3025James Dong } 57002f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 57102f5b5447de349216a40086ca6061efefb5a3025James Dong 57202f5b5447de349216a40086ca6061efefb5a3025James Dong /* oscl_memset(mblock->block, 0, sizeof(typeMBStore)); Aug 9,2005 */ 57302f5b5447de349216a40086ca6061efefb5a3025James Dong 57402f5b5447de349216a40086ca6061efefb5a3025James Dong if (mode & INTRA_MASK) /* MODE_INTRA || MODE_INTRA_Q */ 57502f5b5447de349216a40086ca6061efefb5a3025James Dong { 57602f5b5447de349216a40086ca6061efefb5a3025James Dong switched = 0; 57702f5b5447de349216a40086ca6061efefb5a3025James Dong if (intra_dc_vlc_thr) 57802f5b5447de349216a40086ca6061efefb5a3025James Dong { 57902f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->usePrevQP) 58002f5b5447de349216a40086ca6061efefb5a3025James Dong QP_tmp = video->QPMB[mbnum-1]; /* running QP 04/26/01 */ 58102f5b5447de349216a40086ca6061efefb5a3025James Dong 58202f5b5447de349216a40086ca6061efefb5a3025James Dong switched = (intra_dc_vlc_thr == 7 || QP_tmp >= intra_dc_vlc_thr * 2 + 11); 58302f5b5447de349216a40086ca6061efefb5a3025James Dong } 58402f5b5447de349216a40086ca6061efefb5a3025James Dong 58502f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->DCScalarLum = cal_dc_scaler(QP, LUMINANCE_DC_TYPE); /* 3/01/01 */ 58602f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->DCScalarChr = cal_dc_scaler(QP, CHROMINANCE_DC_TYPE); 58702f5b5447de349216a40086ca6061efefb5a3025James Dong 58802f5b5447de349216a40086ca6061efefb5a3025James Dong for (comp = 0; comp < 6; comp++) 58902f5b5447de349216a40086ca6061efefb5a3025James Dong { 59002f5b5447de349216a40086ca6061efefb5a3025James Dong dataBlock = mblock->block[comp]; /* 10/20/2000 */ 59102f5b5447de349216a40086ca6061efefb5a3025James Dong 59202f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->shortVideoHeader) 59302f5b5447de349216a40086ca6061efefb5a3025James Dong { 59402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 59502f5b5447de349216a40086ca6061efefb5a3025James Dong if (!video->advanced_INTRA) 59602f5b5447de349216a40086ca6061efefb5a3025James Dong { 59702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 59802f5b5447de349216a40086ca6061efefb5a3025James Dong DC_coeff = (int16) BitstreamReadBits16_INLINE(stream, 8); 59902f5b5447de349216a40086ca6061efefb5a3025James Dong 60002f5b5447de349216a40086ca6061efefb5a3025James Dong if ((DC_coeff & 0x7f) == 0) /* 128 & 0 */ 60102f5b5447de349216a40086ca6061efefb5a3025James Dong { 60202f5b5447de349216a40086ca6061efefb5a3025James Dong /* currently we will only signal FAIL for 128. We will ignore the 0 case */ 60302f5b5447de349216a40086ca6061efefb5a3025James Dong if (DC_coeff == 128) 60402f5b5447de349216a40086ca6061efefb5a3025James Dong { 60502f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 60602f5b5447de349216a40086ca6061efefb5a3025James Dong } 60702f5b5447de349216a40086ca6061efefb5a3025James Dong else 60802f5b5447de349216a40086ca6061efefb5a3025James Dong { 60902f5b5447de349216a40086ca6061efefb5a3025James Dong VideoDecoderErrorDetected(video); 61002f5b5447de349216a40086ca6061efefb5a3025James Dong } 61102f5b5447de349216a40086ca6061efefb5a3025James Dong } 61202f5b5447de349216a40086ca6061efefb5a3025James Dong if (DC_coeff == 255) 61302f5b5447de349216a40086ca6061efefb5a3025James Dong { 61402f5b5447de349216a40086ca6061efefb5a3025James Dong DC_coeff = 128; 61502f5b5447de349216a40086ca6061efefb5a3025James Dong } 61602f5b5447de349216a40086ca6061efefb5a3025James Dong dataBlock[0] = (int16) DC_coeff; 61702f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 61802f5b5447de349216a40086ca6061efefb5a3025James Dong } 61902f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 62002f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[comp] = VlcDequantH263IntraBlock_SH(video, comp, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]); 62102f5b5447de349216a40086ca6061efefb5a3025James Dong 62202f5b5447de349216a40086ca6061efefb5a3025James Dong } 62302f5b5447de349216a40086ca6061efefb5a3025James Dong else 62402f5b5447de349216a40086ca6061efefb5a3025James Dong { 62502f5b5447de349216a40086ca6061efefb5a3025James Dong if (switched == 0) 62602f5b5447de349216a40086ca6061efefb5a3025James Dong { 62702f5b5447de349216a40086ca6061efefb5a3025James Dong status = PV_DecodePredictedIntraDC(comp, stream, &DC_coeff); 62802f5b5447de349216a40086ca6061efefb5a3025James Dong if (status != PV_SUCCESS) return PV_FAIL; 62902f5b5447de349216a40086ca6061efefb5a3025James Dong 63002f5b5447de349216a40086ca6061efefb5a3025James Dong dataBlock[0] = (int16) DC_coeff; 63102f5b5447de349216a40086ca6061efefb5a3025James Dong } 63202f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[comp] = VlcDequantH263IntraBlock(video, comp, 63302f5b5447de349216a40086ca6061efefb5a3025James Dong switched, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]); 63402f5b5447de349216a40086ca6061efefb5a3025James Dong } 63502f5b5447de349216a40086ca6061efefb5a3025James Dong 63602f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(ncoeffs[comp])) 63702f5b5447de349216a40086ca6061efefb5a3025James Dong { 63802f5b5447de349216a40086ca6061efefb5a3025James Dong if (switched) 63902f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 64002f5b5447de349216a40086ca6061efefb5a3025James Dong else 64102f5b5447de349216a40086ca6061efefb5a3025James Dong { 64202f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[comp] = 1; 64302f5b5447de349216a40086ca6061efefb5a3025James Dong oscl_memset((dataBlock + 1), 0, sizeof(int16)*63); 64402f5b5447de349216a40086ca6061efefb5a3025James Dong } 64502f5b5447de349216a40086ca6061efefb5a3025James Dong } 64602f5b5447de349216a40086ca6061efefb5a3025James Dong no_coeff[comp] = ncoeffs[comp]; 64702f5b5447de349216a40086ca6061efefb5a3025James Dong 64802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 64902f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 65002f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[comp] = (uint8) PostProcSemaphore(dataBlock); 65102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 65202f5b5447de349216a40086ca6061efefb5a3025James Dong } 65302f5b5447de349216a40086ca6061efefb5a3025James Dong MBlockIDCT(video); 65402f5b5447de349216a40086ca6061efefb5a3025James Dong } 65502f5b5447de349216a40086ca6061efefb5a3025James Dong else /* INTER modes */ 65602f5b5447de349216a40086ca6061efefb5a3025James Dong { /* moved it here Aug 15, 2005 */ 65702f5b5447de349216a40086ca6061efefb5a3025James Dong /* decode the motion vector (if there are any) */ 65802f5b5447de349216a40086ca6061efefb5a3025James Dong status = PV_GetMBvectors(video, mode); 65902f5b5447de349216a40086ca6061efefb5a3025James Dong if (status != PV_SUCCESS) 66002f5b5447de349216a40086ca6061efefb5a3025James Dong { 66102f5b5447de349216a40086ca6061efefb5a3025James Dong return status; 66202f5b5447de349216a40086ca6061efefb5a3025James Dong } 66302f5b5447de349216a40086ca6061efefb5a3025James Dong 66402f5b5447de349216a40086ca6061efefb5a3025James Dong 66502f5b5447de349216a40086ca6061efefb5a3025James Dong MBMotionComp(video, CBP); 66602f5b5447de349216a40086ca6061efefb5a3025James Dong c_comp = video->currVop->yChan + offset; 66702f5b5447de349216a40086ca6061efefb5a3025James Dong 66802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 66902f5b5447de349216a40086ca6061efefb5a3025James Dong for (comp = 0; comp < 4; comp++) 67002f5b5447de349216a40086ca6061efefb5a3025James Dong { 67102f5b5447de349216a40086ca6061efefb5a3025James Dong (*DC)[comp] = mid_gray; 67202f5b5447de349216a40086ca6061efefb5a3025James Dong if (CBP & (1 << (5 - comp))) 67302f5b5447de349216a40086ca6061efefb5a3025James Dong { 67402f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[comp] = VlcDequantH263InterBlock(video, comp, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]); 67502f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(ncoeffs[comp])) return PV_FAIL; 67602f5b5447de349216a40086ca6061efefb5a3025James Dong 67702f5b5447de349216a40086ca6061efefb5a3025James Dong BlockIDCT(c_comp + (comp&2)*(width << 2) + 8*(comp&1), mblock->pred_block + (comp&2)*64 + 8*(comp&1), mblock->block[comp], width, ncoeffs[comp], 67802f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->bitmapcol[comp], mblock->bitmaprow[comp]); 67902f5b5447de349216a40086ca6061efefb5a3025James Dong 68002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 68102f5b5447de349216a40086ca6061efefb5a3025James Dong /* for inter just test for ringing */ 68202f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 68302f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[comp] = (uint8)((ncoeffs[comp] > 3) ? 4 : 0); 68402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 68502f5b5447de349216a40086ca6061efefb5a3025James Dong } 68602f5b5447de349216a40086ca6061efefb5a3025James Dong else 68702f5b5447de349216a40086ca6061efefb5a3025James Dong { 68802f5b5447de349216a40086ca6061efefb5a3025James Dong /* no IDCT for all zeros blocks 03/28/2002 */ 68902f5b5447de349216a40086ca6061efefb5a3025James Dong /* BlockIDCT(); */ 69002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 69102f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 69202f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[comp] = 0; 69302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 69402f5b5447de349216a40086ca6061efefb5a3025James Dong } 69502f5b5447de349216a40086ca6061efefb5a3025James Dong } 69602f5b5447de349216a40086ca6061efefb5a3025James Dong 69702f5b5447de349216a40086ca6061efefb5a3025James Dong video->QPMB[mbnum] = video->QP_CHR; /* ANNEX_T */ 69802f5b5447de349216a40086ca6061efefb5a3025James Dong 69902f5b5447de349216a40086ca6061efefb5a3025James Dong 70002f5b5447de349216a40086ca6061efefb5a3025James Dong 70102f5b5447de349216a40086ca6061efefb5a3025James Dong (*DC)[4] = mid_gray; 70202f5b5447de349216a40086ca6061efefb5a3025James Dong if (CBP & 2) 70302f5b5447de349216a40086ca6061efefb5a3025James Dong { 70402f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[4] = VlcDequantH263InterBlock(video, 4, mblock->bitmapcol[4], &mblock->bitmaprow[4]); 70502f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(ncoeffs[4])) return PV_FAIL; 70602f5b5447de349216a40086ca6061efefb5a3025James Dong 70702f5b5447de349216a40086ca6061efefb5a3025James Dong BlockIDCT(video->currVop->uChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 256, mblock->block[4], width >> 1, ncoeffs[4], 70802f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->bitmapcol[4], mblock->bitmaprow[4]); 70902f5b5447de349216a40086ca6061efefb5a3025James Dong 71002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 71102f5b5447de349216a40086ca6061efefb5a3025James Dong /* for inter just test for ringing */ 71202f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 71302f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[4] = (uint8)((ncoeffs[4] > 3) ? 4 : 0); 71402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 71502f5b5447de349216a40086ca6061efefb5a3025James Dong } 71602f5b5447de349216a40086ca6061efefb5a3025James Dong else 71702f5b5447de349216a40086ca6061efefb5a3025James Dong { 71802f5b5447de349216a40086ca6061efefb5a3025James Dong /* no IDCT for all zeros blocks 03/28/2002 */ 71902f5b5447de349216a40086ca6061efefb5a3025James Dong /* BlockIDCT(); */ 72002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 72102f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 72202f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[4] = 0; 72302f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 72402f5b5447de349216a40086ca6061efefb5a3025James Dong } 72502f5b5447de349216a40086ca6061efefb5a3025James Dong (*DC)[5] = mid_gray; 72602f5b5447de349216a40086ca6061efefb5a3025James Dong if (CBP & 1) 72702f5b5447de349216a40086ca6061efefb5a3025James Dong { 72802f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[5] = VlcDequantH263InterBlock(video, 5, mblock->bitmapcol[5], &mblock->bitmaprow[5]); 72902f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(ncoeffs[5])) return PV_FAIL; 73002f5b5447de349216a40086ca6061efefb5a3025James Dong 73102f5b5447de349216a40086ca6061efefb5a3025James Dong BlockIDCT(video->currVop->vChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 264, mblock->block[5], width >> 1, ncoeffs[5], 73202f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->bitmapcol[5], mblock->bitmaprow[5]); 73302f5b5447de349216a40086ca6061efefb5a3025James Dong 73402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 73502f5b5447de349216a40086ca6061efefb5a3025James Dong /* for inter just test for ringing */ 73602f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 73702f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[5] = (uint8)((ncoeffs[5] > 3) ? 4 : 0); 73802f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 73902f5b5447de349216a40086ca6061efefb5a3025James Dong } 74002f5b5447de349216a40086ca6061efefb5a3025James Dong else 74102f5b5447de349216a40086ca6061efefb5a3025James Dong { 74202f5b5447de349216a40086ca6061efefb5a3025James Dong /* no IDCT for all zeros blocks 03/28/2002 */ 74302f5b5447de349216a40086ca6061efefb5a3025James Dong /* BlockIDCT(); */ 74402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 74502f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 74602f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[5] = 0; 74702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 74802f5b5447de349216a40086ca6061efefb5a3025James Dong } 74902f5b5447de349216a40086ca6061efefb5a3025James Dong video->QPMB[mbnum] = QP; /* restore the QP values ANNEX_T*/ 75002f5b5447de349216a40086ca6061efefb5a3025James Dong#else 75102f5b5447de349216a40086ca6061efefb5a3025James Dong for (comp = 0; comp < 4; comp++) 75202f5b5447de349216a40086ca6061efefb5a3025James Dong { 75302f5b5447de349216a40086ca6061efefb5a3025James Dong (*DC)[comp] = mid_gray; 75402f5b5447de349216a40086ca6061efefb5a3025James Dong if (CBP & (1 << (5 - comp))) 75502f5b5447de349216a40086ca6061efefb5a3025James Dong { 75602f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[comp] = VlcDequantH263InterBlock(video, comp, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]); 75702f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(ncoeffs[comp])) return PV_FAIL; 75802f5b5447de349216a40086ca6061efefb5a3025James Dong 75902f5b5447de349216a40086ca6061efefb5a3025James Dong BlockIDCT(c_comp + (comp&2)*(width << 2) + 8*(comp&1), mblock->pred_block + (comp&2)*64 + 8*(comp&1), mblock->block[comp], width, ncoeffs[comp], 76002f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->bitmapcol[comp], mblock->bitmaprow[comp]); 76102f5b5447de349216a40086ca6061efefb5a3025James Dong 76202f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 76302f5b5447de349216a40086ca6061efefb5a3025James Dong /* for inter just test for ringing */ 76402f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 76502f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[comp] = (uint8)((ncoeffs[comp] > 3) ? 4 : 0); 76602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 76702f5b5447de349216a40086ca6061efefb5a3025James Dong } 76802f5b5447de349216a40086ca6061efefb5a3025James Dong else 76902f5b5447de349216a40086ca6061efefb5a3025James Dong { 77002f5b5447de349216a40086ca6061efefb5a3025James Dong /* no IDCT for all zeros blocks 03/28/2002 */ 77102f5b5447de349216a40086ca6061efefb5a3025James Dong /* BlockIDCT(); */ 77202f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 77302f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 77402f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[comp] = 0; 77502f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 77602f5b5447de349216a40086ca6061efefb5a3025James Dong } 77702f5b5447de349216a40086ca6061efefb5a3025James Dong } 77802f5b5447de349216a40086ca6061efefb5a3025James Dong 77902f5b5447de349216a40086ca6061efefb5a3025James Dong (*DC)[4] = mid_gray; 78002f5b5447de349216a40086ca6061efefb5a3025James Dong if (CBP & 2) 78102f5b5447de349216a40086ca6061efefb5a3025James Dong { 78202f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[4] = VlcDequantH263InterBlock(video, 4, mblock->bitmapcol[4], &mblock->bitmaprow[4]); 78302f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(ncoeffs[4])) return PV_FAIL; 78402f5b5447de349216a40086ca6061efefb5a3025James Dong 78502f5b5447de349216a40086ca6061efefb5a3025James Dong BlockIDCT(video->currVop->uChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 256, mblock->block[4], width >> 1, ncoeffs[4], 78602f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->bitmapcol[4], mblock->bitmaprow[4]); 78702f5b5447de349216a40086ca6061efefb5a3025James Dong 78802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 78902f5b5447de349216a40086ca6061efefb5a3025James Dong /* for inter just test for ringing */ 79002f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 79102f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[4] = (uint8)((ncoeffs[4] > 3) ? 4 : 0); 79202f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 79302f5b5447de349216a40086ca6061efefb5a3025James Dong } 79402f5b5447de349216a40086ca6061efefb5a3025James Dong else 79502f5b5447de349216a40086ca6061efefb5a3025James Dong { 79602f5b5447de349216a40086ca6061efefb5a3025James Dong /* no IDCT for all zeros blocks 03/28/2002 */ 79702f5b5447de349216a40086ca6061efefb5a3025James Dong /* BlockIDCT(); */ 79802f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 79902f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 80002f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[4] = 0; 80102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 80202f5b5447de349216a40086ca6061efefb5a3025James Dong } 80302f5b5447de349216a40086ca6061efefb5a3025James Dong (*DC)[5] = mid_gray; 80402f5b5447de349216a40086ca6061efefb5a3025James Dong if (CBP & 1) 80502f5b5447de349216a40086ca6061efefb5a3025James Dong { 80602f5b5447de349216a40086ca6061efefb5a3025James Dong ncoeffs[5] = VlcDequantH263InterBlock(video, 5, mblock->bitmapcol[5], &mblock->bitmaprow[5]); 80702f5b5447de349216a40086ca6061efefb5a3025James Dong if (VLC_ERROR_DETECTED(ncoeffs[5])) return PV_FAIL; 80802f5b5447de349216a40086ca6061efefb5a3025James Dong 80902f5b5447de349216a40086ca6061efefb5a3025James Dong BlockIDCT(video->currVop->vChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 264, mblock->block[5], width >> 1, ncoeffs[5], 81002f5b5447de349216a40086ca6061efefb5a3025James Dong mblock->bitmapcol[5], mblock->bitmaprow[5]); 81102f5b5447de349216a40086ca6061efefb5a3025James Dong 81202f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 81302f5b5447de349216a40086ca6061efefb5a3025James Dong /* for inter just test for ringing */ 81402f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 81502f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[5] = (uint8)((ncoeffs[5] > 3) ? 4 : 0); 81602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 81702f5b5447de349216a40086ca6061efefb5a3025James Dong } 81802f5b5447de349216a40086ca6061efefb5a3025James Dong else 81902f5b5447de349216a40086ca6061efefb5a3025James Dong { 82002f5b5447de349216a40086ca6061efefb5a3025James Dong /* no IDCT for all zeros blocks 03/28/2002 */ 82102f5b5447de349216a40086ca6061efefb5a3025James Dong /* BlockIDCT(); */ 82202f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_POSTPROC_ON 82302f5b5447de349216a40086ca6061efefb5a3025James Dong if (video->postFilterType != PV_NO_POST_PROC) 82402f5b5447de349216a40086ca6061efefb5a3025James Dong *pp_mod[5] = 0; 82502f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 82602f5b5447de349216a40086ca6061efefb5a3025James Dong#endif // PV_ANNEX_IJKT_SUPPORT 82702f5b5447de349216a40086ca6061efefb5a3025James Dong 82802f5b5447de349216a40086ca6061efefb5a3025James Dong 82902f5b5447de349216a40086ca6061efefb5a3025James Dong 83002f5b5447de349216a40086ca6061efefb5a3025James Dong 83102f5b5447de349216a40086ca6061efefb5a3025James Dong 83202f5b5447de349216a40086ca6061efefb5a3025James Dong 83302f5b5447de349216a40086ca6061efefb5a3025James Dong } 83402f5b5447de349216a40086ca6061efefb5a3025James Dong 83502f5b5447de349216a40086ca6061efefb5a3025James Dong video->usePrevQP = 1; /* should be set after decoding the first Coded 04/27/01 */ 83602f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 83702f5b5447de349216a40086ca6061efefb5a3025James Dong} 83802f5b5447de349216a40086ca6061efefb5a3025James Dong 83902f5b5447de349216a40086ca6061efefb5a3025James Dong 84002f5b5447de349216a40086ca6061efefb5a3025James Dong 841