13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h" /* video decoder function prototypes */
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h"
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h"
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "scaling.h"
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mbtype_mode.h"
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONDITIONAL_IS_CONSTANT
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : DecodeFrameCombinedMode()                                    */
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode a frame of MPEG4 bitstream in combined mode.          */
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                                                                          */
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      03/30/2000 : Cleaned up and optimized the code.             */
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      03/31/2000 : Added proper handling of MB stuffing.          */
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      04/13/2000 : Rewrote this combined mode path completely     */
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                           so that it handles "Combined Mode With Error   */
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                           Resilience."  Now the code resembles the       */
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                           pseudo codes in MPEG-4 standard better.        */
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      10/13/2000 : Add fast VLC+dequant                           */
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      04/13/2001 : fix MB_stuffing                               */
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      08/07/2001 : remove MBzero                                  */
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeFrameCombinedMode(VideoDecData *video)
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum;
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int shortVideoHeader = video->shortVideoHeader;
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 QP, *QPMB = video->QPMB;
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *Mode = video->headerInfo.Mode;
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nTotalMB = video->nTotalMB;
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nMBPerRow = video->nMBPerRow;
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int slice_counter;
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar, long_zero_bits;
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int valid_stuffing;
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int resync_marker_length;
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int stuffing_length;
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* add this for error resilient, 05/18/2000 */
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 startPacket;
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mb_start;
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* copy and pad to prev_Vop for INTER coding */
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    switch (currVop->predictionType)
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case I_VOP :
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      oscl_memset(Mode, MODE_INTRA, sizeof(uint8)*nTotalMB);
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            resync_marker_length = 17;
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stuffing_length = 9;
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case P_VOP :
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_memset(video->motX, 0, sizeof(MOT)*4*nTotalMB);
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_memset(video->motY, 0, sizeof(MOT)*4*nTotalMB);
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      oscl_memset(Mode, MODE_INTER, sizeof(uint8)*nTotalMB);
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            resync_marker_length = 16 + currVop->fcodeForward;
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stuffing_length = 10;
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        default :
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mp4dec_log("DecodeFrameCombinedMode(): Vop type not supported.\n");
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->shortVideoHeader)
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->advanced_INTRA)
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->modified_quant)
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader_AnnexIT;
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffInter = &VlcDecTCOEFShortHeader_AnnexT;
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader_AnnexI;
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffInter = &VlcDecTCOEFShortHeader;
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->modified_quant)
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffInter = video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader_AnnexT;
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffInter = video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader;
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /** Initialize sliceNo ***/
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mbnum = slice_counter = 0;
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  oscl_memset(video->sliceNo, 0, sizeof(uint8)*nTotalMB);
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    QP = video->currVop->quantizer;
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* This section is equivalent to motion_shape_texture() */
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*    in the MPEG-4 standard.     04/13/2000          */
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mb_start = mbnum;
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->usePrevQP = 0;             /*  04/27/01 */
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        startPacket = getPointer(stream);
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->modified_quant)
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->QP_CHR = MQ_chroma_QP_table[QP];
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->QP_CHR = QP;     /* ANNEX_T */
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* remove any stuffing bits */
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits16(stream, stuffing_length, &code);
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (code == 1)
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, stuffing_length);
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamShowBits16(stream, stuffing_length, &code);
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        do
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* we need video->mbnum in lower level functions */
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->mbnum = mbnum;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow);
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow;
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* assign slice number for each macroblocks */
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->sliceNo[mbnum] = (uint8) slice_counter;
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* decode COD, MCBPC, ACpred_flag, CPBY and DQUANT */
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* We have to discard stuffed MB header */
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = GetMBheader(video, &QP);
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS)
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                VideoDecoderErrorDetected(video);
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->mbnum = mb_start;
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                movePointerTo(stream, (startPacket & -8));
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Store the QP value for later use in AC prediction */
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            QPMB[mbnum] = QP;
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (Mode[mbnum] != MODE_SKIPPED)
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* decode the DCT coeficients for the MB */
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = GetMBData(video);
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS)
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    VideoDecoderErrorDetected(video);
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->mbnum = mb_start;
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    movePointerTo(stream, (startPacket & -8));
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else /* MODE_SKIPPED */
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                SkippedMBMotionComp(video); /*  08/04/05 */
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            // Motion compensation and put video->mblock->pred_block
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mbnum++;
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* remove any stuffing bits */
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamShowBits16(stream, stuffing_length, &code);
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (code == 1)
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, stuffing_length);
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamShowBits16(stream, stuffing_length, &code);
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* have we reached the end of the video packet or vop? */
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (shortVideoHeader)
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!video->slice_structure)
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (mbnum >= (int)(video->mbnum_row + 1)*video->nMBinGOB)   /*  10/11/01 */
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (mbnum >= nTotalMB) return PV_SUCCESS;
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        status = BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar);
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (tmpvar == GOB_RESYNC_MARKER)
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            break;
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        else
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            status = PV_BitstreamShowBitsByteAlign(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar);
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            if (tmpvar == GOB_RESYNC_MARKER) break;
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (mbnum >= nTotalMB)  /* in case no valid stuffing  06/23/01 */
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        valid_stuffing = validStuffing_h263(stream);
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (valid_stuffing == 0)
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            VideoDecoderErrorDetected(video);
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            ConcealPacket(video, mb_start, nTotalMB, slice_counter);
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        return PV_SUCCESS;
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* ANNEX_K */
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    PV_BitstreamShowBitsByteAlignNoForceStuffing(stream, 17, &tmpvar);
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (tmpvar == RESYNC_MARKER)
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        valid_stuffing = validStuffing_h263(stream);
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (valid_stuffing)
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            break; /*  06/21/01 */
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (mbnum >= nTotalMB)  /* in case no valid stuffing  06/23/01 */
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /*  11/01/2002 if we are at the end of the frame and there is some garbage data
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    at the end of the frame (i.e. no next startcode) break if the stuffing is valid */
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    valid_stuffing = validStuffing(stream);
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (valid_stuffing == 0)
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* end 11/01/2002 */
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        VideoDecoderErrorDetected(video);
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        ConcealPacket(video, mb_start, nTotalMB, slice_counter);
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    PV_BitstreamByteAlign(stream);
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_SUCCESS;
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_BitstreamShowBitsByteAlign(stream, 23, &tmpvar); /* this call is valid for f_code < 8 */
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                long_zero_bits = !tmpvar;
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((tmpvar >> (23 - resync_marker_length)) == RESYNC_MARKER || long_zero_bits)
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    valid_stuffing = validStuffing(stream);
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (valid_stuffing)
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        break; /*  06/21/01 */
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (TRUE);
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (shortVideoHeader)
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        { /* We need to check newgob to refresh quantizer */
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!video->slice_structure)
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                while ((status = PV_GobHeader(video)) == PV_FAIL)
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if ((status = quickSearchGOBHeader(stream)) != PV_SUCCESS)
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        break;
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mbnum = currVop->gobNumber * video->nMBinGOB;
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                while ((status = PV_H263SliceHeader(video, &mbnum)) == PV_FAIL)
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if ((status = quickSearchH263SliceHeader(stream)) != PV_SUCCESS)
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        break;
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while ((status = PV_ReadVideoPacketHeader(video, &mbnum)) == PV_FAIL)
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((status = quickSearchVideoPacketHeader(stream, resync_marker_length)) != PV_SUCCESS)
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP)
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mbnum = nTotalMB;
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mbnum > video->mbnum + 1)
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ConcealPacket(video, video->mbnum, mbnum, slice_counter);
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        QP = video->currVop->quantizer;
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        slice_counter++;
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mbnum >= nTotalMB) break;
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (TRUE);
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ============================================================================ */
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : GetMBHeader()                                                    */
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode MB header, not_coded, mcbpc, ac_pred_flag, cbpy, dquant.  */
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                                  */
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                                  */
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                                  */
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                                                                              */
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      3/29/00 : Changed the returned value and optimized the code.    */
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      4/01/01 : new ACDC prediction structure                         */
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ============================================================================ */
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBheader(VideoDecData *video, int16 *QP)
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *Mode = video->headerInfo.Mode;
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_row = video->predDCAC_row + x_pos;
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCACStore *DCAC_col = video->predDCAC_col;
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const static int16  DQ_tab[4] = { -1, -2, 1, 2};
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int CBPY, CBPC;
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int MBtype, VopType;
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int MCBPC;
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint DQUANT;
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int comp;
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Bool mb_coded;
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VopType = video->currVop->predictionType;
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mb_coded = ((VopType == I_VOP) ? TRUE : !BitstreamRead1Bits_INLINE(stream));
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!mb_coded)
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* skipped macroblock */
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        Mode[mbnum] = MODE_SKIPPED;
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //oscl_memset(DCAC_row, 0, sizeof(typeDCACStore));   /*  SKIPPED_ACDC */
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //oscl_memset(DCAC_col, 0, sizeof(typeDCACStore));
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ZERO_OUT_64BYTES(DCAC_row);
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ZERO_OUT_64BYTES(DCAC_col); /*  08/12/05 */
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (comp = 0; comp < 6; comp++)
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            (*DC)[comp] = mid_gray;
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* coded macroblock */
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (VopType == I_VOP)
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            MCBPC = PV_VlcDecMCBPC_com_intra(stream);
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!video->deblocking)
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                MCBPC = PV_VlcDecMCBPC_com_inter(stream);
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                MCBPC = PV_VlcDecMCBPC_com_inter_H263(stream);
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            MCBPC = PV_VlcDecMCBPC_com_inter(stream);
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (VLC_ERROR_DETECTED(MCBPC))
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        Mode[mbnum] = (uint8)(MBtype = MBtype_mode[MCBPC & 7]);
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CBPC = (MCBPC >> 4) & 3;
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (MBtype & INTRA_MASK)
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!video->shortVideoHeader)
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits(stream);
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->advanced_INTRA)
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (!BitstreamRead1Bits(stream))
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->acPredFlag[mbnum] = 0;
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->acPredFlag[mbnum] = 1;
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (BitstreamRead1Bits(stream))
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            video->mblock->direction = 0;
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        else
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            video->mblock->direction = 1;
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->acPredFlag[mbnum] = 0;
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((MBtype & INTRA_MASK) && !video->shortVideoHeader)
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits_INLINE(stream);
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->acPredFlag[mbnum] = 0;
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CBPY = PV_VlcDecCBPY(stream, MBtype & INTRA_MASK); /* INTRA || INTRA_Q */
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBPY < 0)
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        // GW 04/23/99
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->headerInfo.CBP[mbnum] = (uint8)(CBPY << 2 | (CBPC & 3));
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (MBtype & Q_MASK)
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!video->modified_quant)
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                DQUANT = BitstreamReadBits16(stream, 2);
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *QP += DQ_tab[DQUANT];
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (*QP < 1) *QP = 1;
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else if (*QP > 31) *QP = 31;
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->QP_CHR = *QP;  /* ANNEX_T */
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (BitstreamRead1Bits(stream))
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (BitstreamRead1Bits(stream))
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        *QP += DQ_tab_Annex_T_11[*QP];
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        *QP += DQ_tab_Annex_T_10[*QP];
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (*QP < 1) *QP = 1;
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else if (*QP > 31) *QP = 31;
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *QP = (int16)BitstreamReadBits16(stream, 5);
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->QP_CHR =  MQ_chroma_QP_table[*QP];
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (MBtype & Q_MASK)
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            DQUANT = BitstreamReadBits16(stream, 2);
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *QP += DQ_tab[DQUANT];
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (*QP < 1) *QP = 1;
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else if (*QP > 31) *QP = 31;
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/10/00  : initial modification to the
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                new PV-Decoder Lib format.
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       4/2/2000 : Cleanup and error-handling modification.  This
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   function has been divided into several sub-functions for
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   better coding style and maintainance reason.  I also
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   greatly shrunk the code size here.
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       9/18/2000 : VlcDecode+Dequant optimization *
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       4/01/2001 : new ACDC prediction structure
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/29/2002 : removed GetIntraMB and GetInterMB
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBData(VideoDecData *video)
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MacroBlock *mblock = video->mblock;
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *dataBlock;
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *c_comp;
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint mode = video->headerInfo.Mode[mbnum];
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint CBP = video->headerInfo.CBP[mbnum];
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int intra_dc_vlc_thr = video->currVop->intraDCVlcThr;
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 QP = video->QPMB[mbnum];
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 QP_tmp = QP;
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width = video->width;
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  comp;
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  switched;
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int ncoeffs[6] = {0, 0, 0, 0, 0, 0};
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int *no_coeff = mblock->no_coeff;
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 DC_coeff;
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* post-processing */
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pp_mod[6];
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int TotalMB = video->nTotalMB;
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int MB_in_width = video->nMBPerRow;
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int y_pos = video->mbnum_row;
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 offset = (int32)(y_pos << 4) * width + (x_pos << 4);
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Decode each 8-by-8 blocks. comp 0 ~ 3 are luminance blocks, 4 ~ 5 */
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  are chrominance blocks.   04/03/2000.                          */
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->postFilterType != PV_NO_POST_PROC)
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /** post-processing ***/
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[0] = video->pstprcTypCur + (y_pos << 1) * (MB_in_width << 1) + (x_pos << 1);
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[1] = pp_mod[0] + 1;
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[2] = pp_mod[0] + (MB_in_width << 1);
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[3] = pp_mod[2] + 1;
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[4] = video->pstprcTypCur + (TotalMB << 2) + mbnum;
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[5] = pp_mod[4] + TotalMB;
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  oscl_memset(mblock->block, 0, sizeof(typeMBStore));    Aug 9,2005 */
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (mode & INTRA_MASK) /* MODE_INTRA || MODE_INTRA_Q */
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        switched = 0;
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (intra_dc_vlc_thr)
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->usePrevQP)
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                QP_tmp = video->QPMB[mbnum-1];   /* running QP  04/26/01 */
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            switched = (intra_dc_vlc_thr == 7 || QP_tmp >= intra_dc_vlc_thr * 2 + 11);
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mblock->DCScalarLum = cal_dc_scaler(QP, LUMINANCE_DC_TYPE);   /*  3/01/01 */
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mblock->DCScalarChr = cal_dc_scaler(QP, CHROMINANCE_DC_TYPE);
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (comp = 0; comp < 6; comp++)
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dataBlock = mblock->block[comp];    /* 10/20/2000 */
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->shortVideoHeader)
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!video->advanced_INTRA)
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    DC_coeff = (int16) BitstreamReadBits16_INLINE(stream, 8);
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if ((DC_coeff & 0x7f) == 0) /* 128 & 0  */
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* currently we will only signal FAIL for 128. We will ignore the 0 case  */
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (DC_coeff == 128)
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            return PV_FAIL;
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        else
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            VideoDecoderErrorDetected(video);
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (DC_coeff == 255)
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        DC_coeff = 128;
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    dataBlock[0] = (int16) DC_coeff;
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ncoeffs[comp] = VlcDequantH263IntraBlock_SH(video, comp, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]);
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (switched == 0)
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    status = PV_DecodePredictedIntraDC(comp, stream, &DC_coeff);
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (status != PV_SUCCESS) return PV_FAIL;
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    dataBlock[0] = (int16) DC_coeff;
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ncoeffs[comp] = VlcDequantH263IntraBlock(video, comp,
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                switched, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]);
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[comp]))
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (switched)
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    ncoeffs[comp] = 1;
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    oscl_memset((dataBlock + 1), 0, sizeof(int16)*63);
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            no_coeff[comp] = ncoeffs[comp];
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[comp] = (uint8) PostProcSemaphore(dataBlock);
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MBlockIDCT(video);
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else      /* INTER modes */
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /*  moved it here Aug 15, 2005 */
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* decode the motion vector (if there are any) */
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_GetMBvectors(video, mode);
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status != PV_SUCCESS)
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return status;
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MBMotionComp(video, CBP);
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        c_comp  = video->currVop->yChan + offset;
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (comp = 0; comp < 4; comp++)
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            (*DC)[comp] = mid_gray;
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (CBP & (1 << (5 - comp)))
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ncoeffs[comp] = VlcDequantH263InterBlock(video, comp, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]);
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (VLC_ERROR_DETECTED(ncoeffs[comp])) return PV_FAIL;
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames 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],
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                          mblock->bitmapcol[comp], mblock->bitmaprow[comp]);
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* for inter just test for ringing */
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->postFilterType != PV_NO_POST_PROC)
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *pp_mod[comp] = (uint8)((ncoeffs[comp] > 3) ? 4 : 0);
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* no IDCT for all zeros blocks  03/28/2002 */
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /*              BlockIDCT();                */
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->postFilterType != PV_NO_POST_PROC)
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *pp_mod[comp] = 0;
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->QPMB[mbnum] = video->QP_CHR;     /* ANNEX_T */
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*DC)[4] = mid_gray;
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP & 2)
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[4] = VlcDequantH263InterBlock(video, 4, mblock->bitmapcol[4], &mblock->bitmaprow[4]);
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[4])) return PV_FAIL;
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BlockIDCT(video->currVop->uChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 256, mblock->block[4], width >> 1, ncoeffs[4],
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                      mblock->bitmapcol[4], mblock->bitmaprow[4]);
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* for inter just test for ringing */
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[4] = (uint8)((ncoeffs[4] > 3) ? 4 : 0);
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* no IDCT for all zeros blocks  03/28/2002 */
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*              BlockIDCT();                */
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[4] = 0;
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*DC)[5] = mid_gray;
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP & 1)
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[5] = VlcDequantH263InterBlock(video, 5, mblock->bitmapcol[5], &mblock->bitmaprow[5]);
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[5])) return PV_FAIL;
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BlockIDCT(video->currVop->vChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 264, mblock->block[5], width >> 1, ncoeffs[5],
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                      mblock->bitmapcol[5], mblock->bitmaprow[5]);
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* for inter just test for ringing */
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[5] = (uint8)((ncoeffs[5] > 3) ? 4 : 0);
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* no IDCT for all zeros blocks  03/28/2002 */
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*              BlockIDCT();                */
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[5] = 0;
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->QPMB[mbnum] = QP;  /* restore the QP values  ANNEX_T*/
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (comp = 0; comp < 4; comp++)
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            (*DC)[comp] = mid_gray;
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (CBP & (1 << (5 - comp)))
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ncoeffs[comp] = VlcDequantH263InterBlock(video, comp, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]);
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (VLC_ERROR_DETECTED(ncoeffs[comp])) return PV_FAIL;
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames 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],
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                          mblock->bitmapcol[comp], mblock->bitmaprow[comp]);
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* for inter just test for ringing */
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->postFilterType != PV_NO_POST_PROC)
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *pp_mod[comp] = (uint8)((ncoeffs[comp] > 3) ? 4 : 0);
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* no IDCT for all zeros blocks  03/28/2002 */
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /*              BlockIDCT();                */
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->postFilterType != PV_NO_POST_PROC)
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    *pp_mod[comp] = 0;
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*DC)[4] = mid_gray;
7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP & 2)
7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[4] = VlcDequantH263InterBlock(video, 4, mblock->bitmapcol[4], &mblock->bitmaprow[4]);
7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[4])) return PV_FAIL;
7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BlockIDCT(video->currVop->uChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 256, mblock->block[4], width >> 1, ncoeffs[4],
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                      mblock->bitmapcol[4], mblock->bitmaprow[4]);
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* for inter just test for ringing */
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[4] = (uint8)((ncoeffs[4] > 3) ? 4 : 0);
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
7953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* no IDCT for all zeros blocks  03/28/2002 */
7973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*              BlockIDCT();                */
7983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
8003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[4] = 0;
8013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*DC)[5] = mid_gray;
8043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP & 1)
8053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[5] = VlcDequantH263InterBlock(video, 5, mblock->bitmapcol[5], &mblock->bitmaprow[5]);
8073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[5])) return PV_FAIL;
8083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BlockIDCT(video->currVop->vChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 264, mblock->block[5], width >> 1, ncoeffs[5],
8103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                      mblock->bitmapcol[5], mblock->bitmaprow[5]);
8113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
8133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* for inter just test for ringing */
8143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
8153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[5] = (uint8)((ncoeffs[5] > 3) ? 4 : 0);
8163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
8193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* no IDCT for all zeros blocks  03/28/2002 */
8213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*              BlockIDCT();                */
8223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
8233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
8243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[5] = 0;
8253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif  // PV_ANNEX_IJKT_SUPPORT
8273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->usePrevQP = 1;          /* should be set after decoding the first Coded  04/27/01 */
8363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
8373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
841