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
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       04/13/2000 : initial modification to the new PV-Decoder
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                            Lib format.
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       04/16/2001 : Removed PV_END_OF_BUFFER case, error resilience
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_ReadVideoPacketHeader(VideoDecData *video, int *next_MB)
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol = video->vol[video->currLayer];
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int fcode_forward;
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int resync_marker_length;
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nbits = video->nBitsForMBID;
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar32;
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint tmpvar16;
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 quantizer;
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nTotalMB = video->nTotalMB;
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    fcode_forward = currVop->fcodeForward;
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    resync_marker_length = 17;
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->predictionType != I_VOP) resync_marker_length = 16 + fcode_forward;
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = PV_BitstreamShowBitsByteAlign(stream, resync_marker_length, &tmpvar32);
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  if (status != PV_SUCCESS && status != PV_END_OF_BUFFER) return status; */
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar32 == RESYNC_MARKER)
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      DecNextStartCode(stream);
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamByteAlign(stream);
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamReadBits32(stream, resync_marker_length);
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *next_MB = (int) BitstreamReadBits16(stream, nbits);
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      if (*next_MB <= video->mbnum)   /*  needs more investigation */
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//          *next_MB = video->mbnum+1;
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (*next_MB >= nTotalMB)  /* fix  04/05/01 */
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *next_MB = video->mbnum + 1;
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (*next_MB >= nTotalMB)    /* this check is needed  */
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *next_MB = nTotalMB - 1;
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        quantizer = (int16) BitstreamReadBits16(stream, currVol->quantPrecision);
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (quantizer == 0) return PV_FAIL;        /*  04/03/01 */
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->quantizer = quantizer;
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* if we have HEC, read some redundant VOP header information */
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* this part needs improvement  04/05/01 */
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (BitstreamRead1Bits(stream))
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            int time_base = -1;
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* modulo_time_base (? bits) */
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            do
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                time_base++;
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar16 = BitstreamRead1Bits(stream);
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (tmpvar16 == 1);
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* marker bit */
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamRead1Bits(stream);
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* vop_time_increment (1-15 bits) */
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamReadBits16(stream, currVol->nbitsTimeIncRes);
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* marker bit */
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamRead1Bits(stream);
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* vop_prediction_type (2 bits) */
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamReadBits16(stream, 2);
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Added intra_dc_vlc_thr reading  */
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamReadBits16(stream, 3);
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* fcodes */
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVop->predictionType != I_VOP)
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                fcode_forward = (int) BitstreamReadBits16(stream, 3);
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (currVop->predictionType == B_VOP)
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 3);
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamByteAlign(stream);  /*  */
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);   /* return end_of_VOP  03/30/01 */
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status != PV_SUCCESS)
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return status;
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32HC(stream, &tmpvar32);   /*  07/07/01 */
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* -16 = 0xFFFFFFF0*/
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((tmpvar32 & 0xFFFFFFF0) == VISUAL_OBJECT_SEQUENCE_START_CODE) /* start code mask 00 00 01 */
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* we don't have to check for legl stuffing here.   05/08/2000 */
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_END_OF_VOP;
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       3/10/00  : initial modification to the
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                new PV-Decoder Lib format.
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*       04/17/01 : remove PV_END_OF_BUFFER, error checking
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_GobHeader(VideoDecData *video)
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int quantPrecision = 5;
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 quantizer;
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar);
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar != GOB_RESYNC_MARKER)
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamShowBitsByteAlign(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar);
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar != GOB_RESYNC_MARKER)
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamByteAlign(stream);  /* if bytealigned GOBHEADER search is performed */
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* then no more noforcestuffing  */
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* we've got a GOB header info here */
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH + 5, &tmpvar);
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar &= 0x1F;
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == 0)
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_END_OF_VOP;
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == 31)
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, GOB_RESYNC_MARKER_LENGTH + 5);
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamByteAlignNoForceStuffing(stream);
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_END_OF_VOP;
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, GOB_RESYNC_MARKER_LENGTH + 5);
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->gobNumber = (int) tmpvar;
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->gobNumber >= video->nGOBinVop) return PV_FAIL;
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->gobFrameID = (int) BitstreamReadBits16(stream, 2);
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    quantizer = (int16) BitstreamReadBits16(stream, quantPrecision);
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (quantizer == 0)   return PV_FAIL;         /*  04/03/01 */
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->quantizer = quantizer;
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_H263SliceHeader(VideoDecData *video, int *next_MB)
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = video->bitstream;
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nTotalMB = video->nTotalMB;
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int16 quantizer;
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamShowBitsByteAlignNoForceStuffing(stream, 17, &tmpvar);
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == RESYNC_MARKER)
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamByteAlignNoForceStuffing(stream);
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 17);
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream))
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *next_MB = BitstreamReadBits16(stream, video->nBitsForMBID);
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (*next_MB >= nTotalMB)  /* fix  04/05/01 */
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            *next_MB = video->mbnum + 1;
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (*next_MB >= nTotalMB)    /* this check is needed  */
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                *next_MB = nTotalMB - 1;
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* we will not parse sebp2 for large pictures 3GPP */
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        quantizer = (int16) BitstreamReadBits16(stream, 5);
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (quantizer == 0) return PV_FAIL;
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->quantizer = quantizer;
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream))
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->gobFrameID = (int) BitstreamReadBits16(stream, 2);
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);   /* return end_of_VOP  03/30/01 */
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status != PV_SUCCESS)
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return status;
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamShowBitsByteAlign(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar);
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == SHORT_VIDEO_START_MARKER)
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* we don't have to check for legal stuffing here.   05/08/2000 */
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_END_OF_VOP;
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
253