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