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"
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h"
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h"
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "scaling.h"
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mbtype_mode.h"
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "idct.h"
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONDITIONAL_IS_CONSTANT
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : DecodeFrameDataPartMode()                                    */
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode a frame of MPEG4 bitstream in datapartitioning mode.  */
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                                                                          */
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*      04/25/2000 : Rewrite the data partitioning path completely  */
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                           according to the pseudo codes in MPEG-4        */
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                           standard.                                      */
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 09/18/2000 add fast VlcDecode+Dequant                    */
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             04/17/2001 cleanup                                       */
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeFrameDataPartMode(VideoDecData *video)
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nMBPerRow = video->nMBPerRow;
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int vopType = currVop->predictionType;
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum;
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nTotalMB = video->nTotalMB;
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int slice_counter;
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int resync_marker_length;
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* copy and pad to prev_Vop for INTER coding */
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    switch (vopType)
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case I_VOP :
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      oscl_memset(Mode, MODE_INTRA, sizeof(uint8)*nTotalMB);
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            resync_marker_length = 17;
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case P_VOP :
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_memset(video->motX, 0, sizeof(MOT)*4*nTotalMB);
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_memset(video->motY, 0, sizeof(MOT)*4*nTotalMB);
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      oscl_memset(Mode, MODE_INTER, sizeof(uint8)*nTotalMB);
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            resync_marker_length = 16 + currVop->fcodeForward;
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        default :
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mp4dec_log("DecodeFrameDataPartMode(): Vop type not supported.\n");
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /** Initialize sliceNo ***/
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mbnum = slice_counter = 0;
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  oscl_memset(video->sliceNo, 0, sizeof(uint8)*nTotalMB);
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* This section is equivalent to motion_shape_texture() */
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* in the MPEG-4 standard.            04/13/2000      */
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum = mbnum;
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow);   /*  This is needed if nbnum is read from the packet header */
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow;
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        switch (vopType)
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            case I_VOP :
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = DecodeDataPart_I_VideoPacket(video, slice_counter);
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            case P_VOP :
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = DecodeDataPart_P_VideoPacket(video, slice_counter);
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            default :
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mp4dec_log("DecodeFrameDataPartMode(): Vop type not supported.\n");
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while ((status = PV_ReadVideoPacketHeader(video, &mbnum)) == PV_FAIL)
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if ((status = quickSearchVideoPacketHeader(stream, resync_marker_length)) != PV_SUCCESS)
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                break;
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP)
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mbnum = nTotalMB;
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mbnum > video->mbnum + 1)
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ConcealPacket(video, video->mbnum, mbnum, slice_counter);
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        slice_counter++;
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (mbnum >= nTotalMB)
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (TRUE);
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : DecodeDataPart_I_VideoPacket()                               */
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/25/2000                                                   */
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode Data Partitioned Mode Video Packet in I-VOP           */
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_SUCCESS if successed, PV_FAIL if failed.                  */
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 09/18/2000 add fast VlcDecode+Dequant                    */
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             04/01/2001 fixed MB_stuffing, removed unnecessary code   */
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeDataPart_I_VideoPacket(VideoDecData *video, int slice_counter)
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *Mode = video->headerInfo.Mode;
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  nTotalMB = video->nTotalMB;
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  mbnum, mb_start, mb_end;
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 QP, *QPMB = video->QPMB;
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  MBtype, MCBPC, CBPY;
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nMBPerRow = video->nMBPerRow;
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Bool valid_stuffing;
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 startSecondPart, startFirstPart = getPointer(stream);
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* decode the first partition */
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    QP = video->currVop->quantizer;
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mb_start = mbnum = video->mbnum;
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->usePrevQP = 0;         /*  04/27/01 */
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits16(stream, 9, &code);
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (code == 1)
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 9);
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits16(stream, 9, &code);
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* decode COD, MCBPC, ACpred_flag, CPBY and DQUANT */
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MCBPC = PV_VlcDecMCBPC_com_intra(stream);
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!VLC_ERROR_DETECTED(MCBPC))
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            Mode[mbnum] = (uint8)(MBtype = MBtype_mode[MCBPC & 7]);
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->headerInfo.CBP[mbnum] = (uint8)((MCBPC >> 4) & 3);
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = GetMBheaderDataPart_DQUANT_DC(video, &QP);
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->usePrevQP = 1;        /* set it after the first coded MB      04/27/01 */
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Report the error to the application.   06/20/2000 */
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            VideoDecoderErrorDetected(video);
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->mbnum = mb_start;
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            movePointerTo(stream, startFirstPart);
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->sliceNo[mbnum] = (uint8) slice_counter;
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        QPMB[mbnum] = QP;
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum = ++mbnum;
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits16(stream, 9, &code);
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (code == 1)
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 9);
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamShowBits16(stream, 9, &code);
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* have we reached the end of the video packet or vop? */
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32(stream, DC_MARKER_LENGTH, &tmpvar);
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (tmpvar != DC_MARKER && video->mbnum < nTotalMB);
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == DC_MARKER)
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, DC_MARKER_LENGTH);
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = quickSearchDCM(stream);
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_SUCCESS)
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* only way you can end up being here is in the last packet,and there is stuffing at
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            the end of the first partition */
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, DC_MARKER_LENGTH);
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Report the error to the application.   06/20/2000 */
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            VideoDecoderErrorDetected(video);
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            movePointerTo(stream, startFirstPart);
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->mbnum = mb_start;
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* concealment will be taken care of in the upper layer */
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* decode the second partition */
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    startSecondPart = getPointer(stream);
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mb_end = video->mbnum;
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (mbnum = mb_start; mbnum < mb_end; mbnum++)
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MBtype = Mode[mbnum];
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* No skipped mode in I-packets  3/1/2001    */
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum = mbnum;
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow);   /*  This is needed if nbnum is read from the packet header */
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow;
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* there is always acdcpred in DataPart mode  04/10/01 */
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits(stream);
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CBPY = PV_VlcDecCBPY(stream, MBtype & INTRA_MASK); /* MODE_INTRA || MODE_INTRA_Q */
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBPY < 0)
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Report the error to the application.   06/20/2000 */
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            VideoDecoderErrorDetected(video);
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            movePointerTo(stream, startSecondPart); /*  */
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Conceal packet,  05/15/2000 */
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ConcealTexture_I(video, startFirstPart, mb_start, mb_end, slice_counter);
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->headerInfo.CBP[mbnum] |= (uint8)(CBPY << 2);
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->usePrevQP = 0;
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (mbnum = mb_start; mbnum < mb_end; mbnum++)
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum = mbnum;
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_row = PV_GET_ROW(mbnum , nMBPerRow);  /*  This is needed if nbnum is read from the packet header */
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow;
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* No skipped mode in I-packets  3/1/2001    */
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* decode the DCT coeficients for the MB */
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = GetMBData_DataPart(video);
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status != PV_SUCCESS)
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Report the error to the application.   06/20/2000 */
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            VideoDecoderErrorDetected(video);
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            movePointerTo(stream, startSecondPart); /*  */
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Conceal packet,  05/15/2000 */
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ConcealTexture_I(video, startFirstPart, mb_start, mb_end, slice_counter);
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return status;
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->usePrevQP = 1;           /*  04/27/01 should be set after decoding first MB */
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    valid_stuffing = validStuffing(stream);
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!valid_stuffing)
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        VideoDecoderErrorDetected(video);
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        movePointerTo(stream, startSecondPart);
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ConcealTexture_I(video, startFirstPart, mb_start, mb_end, slice_counter);
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : DecodeDataPart_P_VideoPacket()                               */
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/25/2000                                                   */
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode Data Partitioned Mode Video Packet in P-VOP           */
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_SUCCESS if successed, PV_FAIL if failed.                  */
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :   09/18/2000,  fast VlcDecode+Dequant                        */
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              04/13/2001,  fixed MB_stuffing, new ACDC pred structure,  */
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                              cleanup                                     */
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              08/07/2001,  remove MBzero                              */
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeDataPart_P_VideoPacket(VideoDecData *video, int slice_counter)
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *Mode = video->headerInfo.Mode;
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nTotalMB = video->nTotalMB;
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum, mb_start, mb_end;
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 QP, *QPMB = video->QPMB;
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int MBtype, CBPY;
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Bool valid_stuffing;
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int intra_MB;
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32  startFirstPart, startSecondPart;
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nMBPerRow = video->nMBPerRow;
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pbyte;
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* decode the first partition */
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    startFirstPart = getPointer(stream);
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mb_start = video->mbnum;
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->usePrevQP = 0;            /*  04/27/01 */
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits16(stream, 10, &code);
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (code == 1)
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 10);
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits16(stream, 10, &code);
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* decode COD, MCBPC, ACpred_flag, CPBY and DQUANT */
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* We have to discard stuffed MB header */
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = GetMBheaderDataPart_P(video);
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status != PV_SUCCESS)
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Report the error to the application.   06/20/2000 */
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            VideoDecoderErrorDetected(video);
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            movePointerTo(stream, startFirstPart);
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->mbnum = mb_start;
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* we must update slice_counter before motion vector decoding.   */
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->sliceNo[video->mbnum] = (uint8) slice_counter;
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (Mode[video->mbnum] & INTER_MASK) /* INTER || INTER_Q || INTER_4V */
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* decode the motion vector (if there are any) */
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_GetMBvectors(video, Mode[video->mbnum]);
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS)
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Report the error to the application.   06/20/2000 */
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                VideoDecoderErrorDetected(video);
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                movePointerTo(stream, startFirstPart);
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->mbnum = mb_start;
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum++;
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_row = PV_GET_ROW(video->mbnum, nMBPerRow);   /*  This is needed if mbnum is read from the packet header */
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_col = video->mbnum - video->mbnum_row * nMBPerRow;
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits16(stream, 10, &code);
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (code == 1)
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 10);
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamShowBits16(stream, 10, &code);
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* have we reached the end of the video packet or vop? */
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32(stream, MOTION_MARKER_COMB_LENGTH, &tmpvar);
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*      if (status != PV_SUCCESS && status != PV_END_OF_BUFFER) return status;  */
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (tmpvar != MOTION_MARKER_COMB && video->mbnum < nTotalMB);
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == MOTION_MARKER_COMB)
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, MOTION_MARKER_COMB_LENGTH);
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = quickSearchMotionMarker(stream);
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_SUCCESS)
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* only way you can end up being here is in the last packet,and there is stuffing at
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            the end of the first partition */
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, MOTION_MARKER_COMB_LENGTH);
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Report the error to the application.   06/20/2000 */
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            VideoDecoderErrorDetected(video);
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            movePointerTo(stream, startFirstPart);
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->mbnum = mb_start;
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* concealment will be taken care of in the upper layer  */
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* decode the second partition */
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    startSecondPart = getPointer(stream);
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    QP = video->currVop->quantizer;
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    mb_end = video->mbnum;
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (mbnum = mb_start; mbnum < mb_end; mbnum++)
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MBtype = Mode[mbnum];
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (MBtype == MODE_SKIPPED)
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            QPMB[mbnum] = QP; /*  03/01/01 */
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            continue;
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        intra_MB = (MBtype & INTRA_MASK); /* (MBtype == MODE_INTRA || MBtype == MODE_INTRA_Q) */
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum = mbnum;
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow);   /*  This is needed if nbnum is read from the packet header */
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow;
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* there is always acdcprediction in DataPart mode    04/10/01 */
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (intra_MB)
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->acPredFlag[mbnum] = (uint8) BitstreamRead1Bits_INLINE(stream);
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        CBPY = PV_VlcDecCBPY(stream, intra_MB);
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBPY < 0)
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Report the error to the application.   06/20/2000 */
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            VideoDecoderErrorDetected(video);
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Conceal second partition,  5/15/2000 */
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            movePointerTo(stream, startSecondPart);
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ConcealTexture_P(video, mb_start, mb_end, slice_counter);
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->headerInfo.CBP[mbnum] |= (uint8)(CBPY << 2);
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (intra_MB || MBtype == MODE_INTER_Q)                     /*  04/26/01 */
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = GetMBheaderDataPart_DQUANT_DC(video, &QP);
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS) return status;
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->usePrevQP = 1;        /*  04/27/01 */
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        QPMB[mbnum] = QP;
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->usePrevQP = 0;  /*  04/27/01 */
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (mbnum = mb_start; mbnum < mb_end; mbnum++)
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum = mbnum;
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_row = PV_GET_ROW(mbnum, nMBPerRow);  /*  This is needed if nbnum is read from the packet header */
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mbnum_col = mbnum - video->mbnum_row * nMBPerRow;
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (Mode[mbnum] != MODE_SKIPPED)
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* decode the DCT coeficients for the MB */
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = GetMBData_DataPart(video);
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS)
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Report the error to the application.   06/20/2000 */
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                VideoDecoderErrorDetected(video);
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Conceal second partition,  5/15/2000 */
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                movePointerTo(stream, startSecondPart);
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ConcealTexture_P(video, mb_start, mb_end, slice_counter);
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return status;
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->usePrevQP = 1;  /*  04/27/01 */
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {   // SKIPPED
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Motion compensation and put it to video->mblock->pred_block */
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            SkippedMBMotionComp(video);
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            //oscl_memset(video->predDCAC_row + video->mbnum_col, 0, sizeof(typeDCACStore)); /*  SKIPPED_ACDC */
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            //oscl_memset(video->predDCAC_col, 0, sizeof(typeDCACStore));
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  08/08/2005 */
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pbyte = (uint8*)(video->predDCAC_row + video->mbnum_col);
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ZERO_OUT_64BYTES(pbyte);
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            pbyte = (uint8*)(video->predDCAC_col);
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ZERO_OUT_64BYTES(pbyte);
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    valid_stuffing = validStuffing(stream);   /*  */
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!valid_stuffing)
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        VideoDecoderErrorDetected(video);
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        movePointerTo(stream, startSecondPart); /*  */
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        ConcealTexture_P(video, mb_start, mb_end, slice_counter);
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FAIL;
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : GetMBheaderDataPart_DQUANT_DC()                              */
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/26/2000                                                   */
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode DQUANT and DC in Data Partitioned Mode for both       */
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             I-VOP and P-VOP.                                             */
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_SUCCESS if successed, PV_FAIL if failed.                  */
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 02/13/2001 new ACDC prediction structure,        */
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                                       cleanup                            */
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBheaderDataPart_DQUANT_DC(VideoDecData *video, int16 *QP)
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int intra_dc_vlc_thr = video->currVop->intraDCVlcThr;
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *Mode = video->headerInfo.Mode;
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  MBtype = Mode[mbnum];
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  comp;
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Bool switched;
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint  DQUANT;
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 QP_tmp;
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    const static int  DQ_tab[4] = { -1, -2, 1, 2};
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (MBtype & Q_MASK)             /* INTRA_Q || INTER_Q */
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        DQUANT = BitstreamReadBits16(stream, 2);
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *QP += DQ_tab[DQUANT];
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (*QP < 1) *QP = 1;
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if (*QP > 31) *QP = 31;
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (MBtype & INTRA_MASK)  /* INTRA || INTRA_Q */ /* no switch, code DC separately */
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        QP_tmp = *QP;                      /* running QP  04/26/01*/
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        switched = 0;
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (intra_dc_vlc_thr)                 /*  04/27/01 */
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->usePrevQP)
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                QP_tmp = video->QPMB[mbnum-1];
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            switched = (intra_dc_vlc_thr == 7 || QP_tmp >= intra_dc_vlc_thr * 2 + 11);
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!switched)
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (comp = 0; comp < 6; comp++)
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_DecodePredictedIntraDC(comp, stream, (*DC + comp));   /*  03/01/01 */
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS) return PV_FAIL;
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (comp = 0; comp < 6; comp++)
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                (*DC)[comp] = 0;   /*  04/26/01 needed for switched case*/
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       04/25/2000 : Initial modification to the new PV Lib format.
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       04/17/2001 : new ACDC pred structure
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBheaderDataPart_P(VideoDecData *video)
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *Mode = video->headerInfo.Mode;
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint no_dct_flag;
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int comp;
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int MCBPC;
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    no_dct_flag = BitstreamRead1Bits_INLINE(stream);
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (no_dct_flag)
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* skipped macroblock */
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        Mode[mbnum] = MODE_SKIPPED;
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (comp = 0; comp < 6; comp++)
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            (*DC)[comp] = mid_gray;
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  ACDC REMOVE AC coefs are set in DecodeDataPart_P */
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* coded macroblock */
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MCBPC = PV_VlcDecMCBPC_com_inter(stream);
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (VLC_ERROR_DETECTED(MCBPC))
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        Mode[mbnum] = (uint8)MBtype_mode[MCBPC & 7];
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->headerInfo.CBP[mbnum] = (uint8)((MCBPC >> 4) & 3);
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       04/17/01  new ACDC pred structure, reorganized code, cleanup
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS GetMBData_DataPart(VideoDecData *video)
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int mbnum = video->mbnum;
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 *dataBlock;
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    MacroBlock *mblock = video->mblock;
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP = video->QPMB[mbnum];
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 offset;
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PIXEL *c_comp;
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width = video->width;
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int intra_dc_vlc_thr = video->currVop->intraDCVlcThr;
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint CBP = video->headerInfo.CBP[mbnum];
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 mode = video->headerInfo.Mode[mbnum];
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int x_pos = video->mbnum_col;
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    typeDCStore *DC = video->predDC + mbnum;
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  ncoeffs[6], *no_coeff = mblock->no_coeff;
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int  comp;
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Bool  switched;
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int QP_tmp = QP;
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int y_pos = video->mbnum_row;
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *pp_mod[6];
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int TotalMB = video->nTotalMB;
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int MB_in_width = video->nMBPerRow;
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*****
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *     Decoding of the 6 blocks (depending on transparent pattern)
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *****/
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->postFilterType != PV_NO_POST_PROC)
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /** post-processing ***/
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[0] = video->pstprcTypCur + (y_pos << 1) * (MB_in_width << 1) + (x_pos << 1);
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[1] = pp_mod[0] + 1;
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[2] = pp_mod[0] + (MB_in_width << 1);
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[3] = pp_mod[2] + 1;
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[4] = video->pstprcTypCur + (TotalMB << 2) + mbnum;
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pp_mod[5] = pp_mod[4] + TotalMB;
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  oscl_memset(mblock->block, 0, sizeof(typeMBStore));    Aug 9,2005 */
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (mode & INTRA_MASK) /* MODE_INTRA || mode == MODE_INTRA_Q */
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        switched = 0;
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (intra_dc_vlc_thr)
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->usePrevQP)
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                QP_tmp = video->QPMB[mbnum-1];   /* running QP  04/26/01 */
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            switched = (intra_dc_vlc_thr == 7 || QP_tmp >= intra_dc_vlc_thr * 2 + 11);
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mblock->DCScalarLum = cal_dc_scaler(QP, LUMINANCE_DC_TYPE);     /*   ACDC 03/01/01 */
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mblock->DCScalarChr = cal_dc_scaler(QP, CHROMINANCE_DC_TYPE);
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (comp = 0; comp < 6; comp++)
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dataBlock = mblock->block[comp];    /*, 10/20/2000 */
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            dataBlock[0] = (*DC)[comp];
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[comp] = VlcDequantH263IntraBlock(video, comp,
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            switched, mblock->bitmapcol[comp], &mblock->bitmaprow[comp]);
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[comp]))         /*  */
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (switched)
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    ncoeffs[comp] = 1;
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    oscl_memset((dataBlock + 1), 0, sizeof(int16)*63);
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            no_coeff[comp] = ncoeffs[comp];
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  modified to new semaphore for post-proc */
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            // Future work:: can be combined in the dequant function
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            // @todo Deblocking Semaphore for INTRA block
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[comp] = (uint8) PostProcSemaphore(dataBlock);
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MBlockIDCT(video);
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else /* MODE INTER*/
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        MBMotionComp(video, CBP);
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        offset = (int32)(y_pos << 4) * width + (x_pos << 4);
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        c_comp  = video->currVop->yChan + offset;
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (comp = 0; comp < 4; comp++)
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            (*DC)[comp] = mid_gray;
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (CBP & (1 << (5 - comp)))
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ncoeffs[comp] = VlcDequantH263InterBlock(video, comp,
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                mblock->bitmapcol[comp], &mblock->bitmaprow[comp]);
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (VLC_ERROR_DETECTED(ncoeffs[comp]))
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames 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],
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                          mblock->bitmapcol[comp], mblock->bitmaprow[comp]);
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                ncoeffs[comp] = 0;
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  @todo Deblocking Semaphore for INTRA block, for inter just test for ringing  */
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->postFilterType != PV_NO_POST_PROC)
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *pp_mod[comp] = (uint8)((ncoeffs[comp] > 3) ? 4 : 0);
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*DC)[4] = mid_gray;
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP & 2)
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[4] = VlcDequantH263InterBlock(video, 4,
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                  mblock->bitmapcol[4], &mblock->bitmaprow[4]);
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[4]))
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BlockIDCT(video->currVop->uChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 256, mblock->block[4], width >> 1, ncoeffs[4],
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                      mblock->bitmapcol[4], mblock->bitmaprow[4]);
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[4] = 0;
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->postFilterType != PV_NO_POST_PROC)
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *pp_mod[4] = (uint8)((ncoeffs[4] > 3) ? 4 : 0);
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (*DC)[5] = mid_gray;
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (CBP & 1)
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[5] = VlcDequantH263InterBlock(video, 5,
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                  mblock->bitmapcol[5], &mblock->bitmaprow[5]);
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (VLC_ERROR_DETECTED(ncoeffs[5]))
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BlockIDCT(video->currVop->vChan + (offset >> 2) + (x_pos << 2), mblock->pred_block + 264, mblock->block[5], width >> 1, ncoeffs[5],
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                      mblock->bitmapcol[5], mblock->bitmaprow[5]);
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ncoeffs[5] = 0;
7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->postFilterType != PV_NO_POST_PROC)
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *pp_mod[5] = (uint8)((ncoeffs[5] > 3) ? 4 : 0);
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Motion compensation and put it to video->mblock->pred_block */
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
795