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 "bitstream.h"
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h"
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "zigzag.h"
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_MAIN_PROFILE
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* INTRA */
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongconst static int mpeg_iqmat_def[NCOEFF_BLOCK] =
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    8, 17, 18, 19, 21, 23, 25, 27,
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    17, 18, 19, 21, 23, 25, 27, 28,
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    20, 21, 22, 23, 24, 26, 28, 30,
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    21, 22, 23, 24, 26, 28, 30, 32,
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    22, 23, 24, 26, 28, 30, 32, 35,
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    23, 24, 26, 28, 30, 32, 35, 38,
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    25, 26, 28, 30, 32, 35, 38, 41,
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    27, 28, 30, 32, 35, 38, 41, 45
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* INTER */
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongconst static int mpeg_nqmat_def[64]  =
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    16, 17, 18, 19, 20, 21, 22, 23,
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    17, 18, 19, 20, 21, 22, 23, 24,
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    18, 19, 20, 21, 22, 23, 24, 25,
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    19, 20, 21, 22, 23, 24, 26, 27,
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    20, 21, 22, 23, 25, 26, 27, 28,
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    21, 22, 23, 24, 26, 27, 28, 30,
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    22, 23, 24, 26, 27, 28, 30, 31,
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    23, 24, 25, 27, 28, 30, 31, 33
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : CalcNumBits()                                                */
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Calculate the minimum number of bits required to             */
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              represent x.                                                */
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     : This is an equivalent implementation of                      */
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                      (long)ceil(log((double)x)/log(2.0))                 */
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint CalcNumBits(uint x)
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int i = 1;
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (x >>= 1) i++;
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return i;
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- DecodeVolHeader -- Decode the header of a VOL
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   04/10/2000 : initial modification to the new PV-Decoder Lib format.
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   10/12/2001 : reject non compliant bitstreams
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeVOLHeader(VideoDecData *video, int layer)
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol;
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream;
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar, vol_shape;
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 startCode;
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_MAIN_PROFILE
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int *qmat, i, j;
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int version_id = 1;
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_TOLERATE_VOL_ERRORS
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 profile = 0x01;
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  There's a "currLayer" variable inside videoDecData.          */
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*   However, we don't maintain it until we decode frame data.  04/05/2000 */
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVol = video->vol[layer];
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream  = currVol->bitstream;
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVol->moduloTimeBase = 0;
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Determine which start code for the decoder to begin with */
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = BitstreamShowBits32HC(stream, &startCode);
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (startCode == VISUAL_OBJECT_SEQUENCE_START_CODE)
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {   /*  Bitstream Exhchange Fix 9/99 */
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Bitstream Exchange requires we allow start with Video Object Sequence */
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* visual_object_sequence_start_code            */
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        (void) BitstreamReadBits32HC(stream);
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamReadBits16(stream,  8); /* profile */
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_TOLERATE_VOL_ERRORS
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (layer)                                                      /*    */
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* support SSPL0-2  */
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar != 0x10 && tmpvar != 0x11 && tmpvar != 0x12 &&
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar != 0xA1 && tmpvar != 0xA2  && tmpvar != 0xA3/* Core SP@L1-L3 */)
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* support SPL0-3 & SSPL0-2   */
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar != 0x01 && tmpvar != 0x02 && tmpvar != 0x03 && tmpvar != 0x08 &&
1211338e177ad49369e83ff724ee8428b0b833d48d1Ronghua Wu                    /* While not technically supported, try to decode SPL4&SPL5 files as well. */
122463c54e007279996943e27a78ed32f573236e042Ronghua Wu                    /* We'll fail later if the size is too large.  This is to allow playback of */
123463c54e007279996943e27a78ed32f573236e042Ronghua Wu                    /* some <=CIF files generated by other encoders. */
1241338e177ad49369e83ff724ee8428b0b833d48d1Ronghua Wu                    tmpvar != 0x04 && tmpvar != 0x05 &&
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar != 0x10 && tmpvar != 0x11 && tmpvar != 0x12 &&
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar != 0x21 && tmpvar != 0x22 &&  /* Core Profile Levels */
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar != 0xA1 && tmpvar != 0xA2 && tmpvar != 0xA3 &&
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar != 0xF0 && tmpvar != 0xF1 && /* Advanced Simple Profile Levels*/
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar != 0xF2 && tmpvar != 0xF3 &&
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar != 0xF4 && tmpvar != 0xF5)
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        profile = tmpvar;
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        // save the profile and level for the query
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->profile_level_id = (uint)tmpvar; //  6/10/04
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32HC(stream, &tmpvar);
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == USER_DATA_START_CODE)
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Something has to be done with user data  11/11/99 */
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = DecodeUserData(stream);
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS) return PV_FAIL;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* visual_object_start_code                     */
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32HC(stream, &tmpvar);
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar != VISUAL_OBJECT_START_CODE)
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            do
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Search for VOL_HEADER */
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, 8);
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (tmpvar != VOL_START_CODE);
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto decode_vol;
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamReadBits32HC(stream);
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*  is_visual_object_identifier            */
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream);
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar)
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* visual_object_verid                            */
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamReadBits16(stream, 4);
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* visual_object_priority                         */
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamReadBits16(stream, 3);
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* visual_object_type                                 */
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32(stream, 4, &tmpvar);
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == 1)
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        { /* video_signal_type */
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 4);
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamRead1Bits(stream);
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == 1)
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* video_format */
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = (uint32) BitstreamReadBits16(stream, 3);
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* video_range  */
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = (uint32) BitstreamRead1Bits(stream);
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* color_description */
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = (uint32) BitstreamRead1Bits(stream);
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar == 1)
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* color_primaries */
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* transfer_characteristics */
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* matrix_coefficients */
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            do
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Search for VOL_HEADER */
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, 8);
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (tmpvar != VOL_START_CODE);
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto decode_vol;
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* next_start_code() */
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_BitstreamByteAlign(stream);                            /*  10/12/01 */
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32HC(stream, &tmpvar);
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == USER_DATA_START_CODE)
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Something has to be done to deal with user data (parse it)  11/11/99 */
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = DecodeUserData(stream);
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status != PV_SUCCESS) return PV_FAIL;
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32(stream, 27, &tmpvar);   /*  10/12/01 */
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*      tmpvar = 0;   */                                             /*  10/12/01 */
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32(stream, 27, &tmpvar);     /* uncomment this line if you want
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                                     to start decoding with a
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                                                     video_object_start_code */
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == VO_START_CODE)
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*****
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *   Read the VOL header entries from the bitstream
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *****/
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* video_object_start_code                         */
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = BitstreamReadBits32(stream, 27);
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamReadBits16(stream, 5);
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* video_object_layer_start_code                   */
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar != VOL_START_CODE)
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = BitstreamCheckEndBuffer(stream);
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (status == PV_END_OF_VOP)
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->shortVideoHeader = TRUE;
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_SUCCESS;
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                do
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* Search for VOL_HEADER */
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    status = PVSearchNextM4VFrame(stream);/* search 0x00 0x00 0x01 */
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    PV_BitstreamFlushBits(stream, 8); /* advance the byte ptr */
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                while (tmpvar != VOL_START_CODE);
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(stream, 8);
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongdecode_vol:
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, VOL_START_CODE_LENGTH - 8);
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->shortVideoHeader = 0;
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* vol_id (4 bits) */
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->volID = (int) BitstreamReadBits16(stream, 4);
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* RandomAccessible flag */
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream);
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* object type */
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamReadBits16(stream, 8);                /*  */
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_TOLERATE_VOL_ERRORS
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == 0)
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (layer)                                                      /*    */
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* support SSPL0-2  */
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (profile != 0x10 && profile != 0x11 && profile != 0x12)
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = 0x02;
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* support SPL0-3 & SSPL0-2   */
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (profile != 0x01 && profile != 0x02 && profile != 0x03 && profile != 0x08 &&
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        profile != 0x10 && profile != 0x11 && profile != 0x12)
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = 0x01;
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            profile |= 0x0100;
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (layer)
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar != 0x02) return PV_FAIL;
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar != 0x01) return PV_FAIL;
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* version id specified? */
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream);
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == 1)
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* version ID */
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            version_id = (uint32) BitstreamReadBits16(stream, 4);
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* priority */
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamReadBits16(stream, 3);
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* aspect ratio info */
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamReadBits16(stream, 4);
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == 0) return PV_FAIL;
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == 0xf /* extended_par */)
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* width */
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamReadBits16(stream, 8);
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* height */
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamReadBits16(stream, 8);
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* control parameters present? */
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream);
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*  Get the parameters (skipped) */
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*  03/10/99 */
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar)
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* chroma_format                    */
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, 2);
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar != 1) return PV_FAIL;
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* low_delay  */
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamRead1Bits(stream);
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* vbv_parameters present? */
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamRead1Bits(stream);
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar)
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* first_half_bit_rate    */
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 15);
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* latter_half_bit_rate   */
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 15);
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* first_half_vbv_buffer_size   */
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 15);
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* latter_half_vbv_buffer_size   */
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream,  3);
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* first_half_vbv_occupancy     */
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 11);
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* latter_half_vbv_occupancy  */
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 15);
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* video_object_layer_shape (2 bits), only 00 (rect) is supported for now */
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        vol_shape = (uint32) BitstreamReadBits16(stream, 2);
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (vol_shape) return PV_FAIL;
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* marker bit,  03/10/99 */
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* vop_time_increment_resolution   */
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->timeIncrementResolution = BitstreamReadBits16(stream, 16);
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->timeIncrementResolution == 0) return PV_FAIL;
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* . since nbitsTimeIncRes will be used over and over again, */
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*    we should put it in Vol structure.  04/12/2000.          */
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->nbitsTimeIncRes = CalcNumBits((uint)currVol->timeIncrementResolution - 1);
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* fixed_vop_rate */
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->fixedVopRate = (int) BitstreamRead1Bits(stream);
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->fixedVopRate)
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* fixed_vop_time_increment */
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, currVol->nbitsTimeIncRes);
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* marker bit */
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* video_object_layer_width (13 bits) */
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->displayWidth = video->width = (int) BitstreamReadBits16(stream, 13);
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* round up to a multiple of MB_SIZE.   08/09/2000 */
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->width = (video->width + 15) & -16;
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      video->displayWidth += (video->displayWidth & 0x1);  /* displayed image should be even size */
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* marker bit */
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* video_object_layer_height (13 bits) */
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->displayHeight = video->height = (int) BitstreamReadBits16(stream, 13);
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* round up to a multiple of MB_SIZE.   08/09/2000 */
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->height = (video->height + 15) & -16;
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      video->displayHeight += (video->displayHeight & 0x1); /* displayed image should be even size */
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream)) return PV_FAIL;
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*  03/10/99 */
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* interlaced */
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream);
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar != 0)
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mp4dec_log("DecodeVOLHeader(): Interlaced video is not supported.\n");
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* obmc_disable */
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream);
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == 0) return PV_FAIL;
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (version_id == 1)
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  sprite_enable (1 bits) */
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamRead1Bits(stream);
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar)
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mp4dec_log("DecodeVOLHeader(): Sprite is not supported.\n");
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* For version 2, vol_sprite_usage has two bits. */
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* sprite_enable */
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (uint32) BitstreamReadBits16(stream, 2);
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar)
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                mp4dec_log("DecodeVOLHeader(): Sprite is not supported.\n");
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_FAIL;
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* not_8_bit */
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (BitstreamRead1Bits(stream))
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* quant_precision */
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->quantPrecision = BitstreamReadBits16(stream, 4);
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* bits_per_pixel  */
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->bitsPerPixel = BitstreamReadBits16(stream, 4);
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mp4dec_log("DecodeVOLHeader(): not an 8-bit stream.\n");    // For the time being we do not support != 8 bits
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->quantPrecision = 5;
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->bitsPerPixel = 8;
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* quant_type (1 bit) */
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->quantType = BitstreamRead1Bits(stream);
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->quantType)
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_MAIN_PROFILE
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* load quantization matrices.   5/22/2000 */
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* load_intra_quant_mat (1 bit) */
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            qmat = currVol->iqmat;
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->loadIntraQuantMat = BitstreamRead1Bits(stream);
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->loadIntraQuantMat)
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* intra_quant_mat (8*64 bits) */
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i = 0;
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                do
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    qmat[*(zigzag_inv+i)] = (int) BitstreamReadBits16(stream, 8);
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                while ((qmat[*(zigzag_inv+i)] != 0) && (++i < 64));
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                for (j = i; j < 64; j++)
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    qmat[*(zigzag_inv+j)] = qmat[*(zigzag_inv+i-1)];
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                oscl_memcpy(qmat, mpeg_iqmat_def, 64*sizeof(int));
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            qmat[0] = 0;             /* necessary for switched && MPEG quant  07/09/01 */
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* load_nonintra_quant_mat (1 bit) */
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            qmat = currVol->niqmat;
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->loadNonIntraQuantMat = BitstreamRead1Bits(stream);
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->loadNonIntraQuantMat)
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* nonintra_quant_mat (8*64 bits) */
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                i = 0;
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                do
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    qmat[*(zigzag_inv+i)] = (int) BitstreamReadBits16(stream, 8);
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                while ((qmat[*(zigzag_inv+i)] != 0) && (++i < 64));
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                for (j = i; j < 64; j++)
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    qmat[*(zigzag_inv+j)] = qmat[*(zigzag_inv+i-1)];
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                oscl_memcpy(qmat, mpeg_nqmat_def, 64*sizeof(int));
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FAIL;
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (version_id != 1)
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* quarter_sample enabled */
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamRead1Bits(stream);
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar) return PV_FAIL;
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* complexity_estimation_disable */
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->complexity_estDisable = BitstreamRead1Bits(stream);
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->complexity_estDisable == 0)
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->complexity_estMethod = BitstreamReadBits16(stream, 2);
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->complexity_estMethod < 2)
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* shape_complexity_estimation_disable */
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = BitstreamRead1Bits(stream);
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar == 0)
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    mp4dec_log("DecodeVOLHeader(): Shape Complexity estimation is not supported.\n");
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FAIL;
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* texture_complexity_estimation_set_1_disable */
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = BitstreamRead1Bits(stream);
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar == 0)
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    currVol->complexity.text_1 = BitstreamReadBits16(stream, 4);
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* marker bit */
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* texture_complexity_estimation_set_2_disable */
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = BitstreamRead1Bits(stream);
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar == 0)
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    currVol->complexity.text_2 = BitstreamReadBits16(stream, 4);
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* motion_compensation_complexity_disable */
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = BitstreamRead1Bits(stream);
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar == 0)
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    currVol->complexity.mc = BitstreamReadBits16(stream, 6);
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* marker bit */
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (!BitstreamRead1Bits(stream)) return PV_FAIL;
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (currVol->complexity_estMethod == 1)
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {   /* version2_complexity_estimation_disable */
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar = BitstreamRead1Bits(stream);
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (tmpvar == 0)
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        mp4dec_log("DecodeVOLHeader(): sadct, quarter pel not supported.\n");
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        return PV_FAIL;
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*  03/10/99 */
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* resync_marker_disable */
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->errorResDisable = (int) BitstreamRead1Bits(stream);
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* data_partititioned    */
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->dataPartitioning = (int) BitstreamRead1Bits(stream);
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vlcDecCoeffIntra = &VlcDecTCOEFIntra;
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vlcDecCoeffInter = &VlcDecTCOEFInter;
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->dataPartitioning)
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (layer) return PV_FAIL;                              /*  */
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* reversible_vlc */
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->useReverseVLC = (int)BitstreamRead1Bits(stream);
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->useReverseVLC)
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffIntra = &RvlcDecTCOEFIntra;
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vlcDecCoeffInter = &RvlcDecTCOEFInter;
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->errorResDisable = 0;
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->useReverseVLC = 0;
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (version_id != 1)
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* newpred_enable */
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamRead1Bits(stream);
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar) return PV_FAIL;
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* reduced_resolution_vop */
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamRead1Bits(stream);
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar) return PV_FAIL;
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Intra AC/DC prediction is always true */
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->intra_acdcPredDisable = 0;
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* scalability */
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->scalability = (int) BitstreamRead1Bits(stream);
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->scalability)
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (layer == 0)  return PV_FAIL;                     /*  */
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* hierarchy_type: 1 : temporal, 0 : spatial */
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  03/10/99 */
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->scalType = (int) BitstreamRead1Bits(stream);              /*  */
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!currVol->scalType) return PV_FAIL;
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* ref_layer_id (4 bits) */
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->refVolID = (int) BitstreamReadBits16(stream, 4);
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (layer)                                                      /*  */
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (currVol->refVolID != video->vol[0]->volID) return PV_FAIL;
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* ref_layer_sampling_direc (1 bits)              */
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*   1 : ref. layer has higher resolution         */
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*   0 : ref. layer has equal or lower resolution */
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->refSampDir = (int) BitstreamRead1Bits(stream);
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->refSampDir) return PV_FAIL;
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* hor_sampling_factor_n (5 bits) */
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->horSamp_n = (int) BitstreamReadBits16(stream, 5);
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* hor_sampling_factor_m (5 bits) */
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->horSamp_m = (int) BitstreamReadBits16(stream, 5);
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->horSamp_m == 0) return PV_FAIL;
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->horSamp_n != currVol->horSamp_m) return PV_FAIL;
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* ver_sampling_factor_n (5 bits) */
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->verSamp_n = (int) BitstreamReadBits16(stream, 5);
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* ver_sampling_factor_m (5 bits) */
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVol->verSamp_m = (int) BitstreamReadBits16(stream, 5);
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->verSamp_m == 0) return PV_FAIL;
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->verSamp_n != currVol->verSamp_m) return PV_FAIL;
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* enhancement_type: 1 : partial region, 0 : full region */
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* 04/10/2000: we only support full region enhancement layer. */
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamRead1Bits(stream)) return PV_FAIL;
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamByteAlign(stream);
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32HC(stream, &tmpvar);
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* if we hit the end of buffer, tmpvar == 0.   08/30/2000 */
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == USER_DATA_START_CODE)
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = DecodeUserData(stream);
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* you should not check for status here  03/19/2002 */
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_SUCCESS;
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Compute some convenience variables:   04/13/2000 */
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nMBPerRow = video->width / MB_SIZE;
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nMBPerCol = video->height / MB_SIZE;
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nTotalMB = video->nMBPerRow * video->nMBPerCol;
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nBitsForMBID = CalcNumBits((uint)video->nTotalMB - 1);
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->modified_quant = 0;
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->advanced_INTRA = 0;
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->deblocking = 0;
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->slice_structure = 0;
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* SHORT_HEADER */
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar);
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == SHORT_VIDEO_START_MARKER)
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->shortVideoHeader = TRUE;
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            do
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Search for VOL_HEADER */
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PVSearchNextM4VFrame(stream); /* search 0x00 0x00 0x01 */
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (status != PV_SUCCESS) return PV_FAIL; /* breaks the loop */
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamShowBits32(stream, VOL_START_CODE_LENGTH, &tmpvar);
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, 8);
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (tmpvar != VOL_START_CODE);
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto decode_vol;
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_TOLERATE_VOL_ERRORS
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (profile > 0xFF || profile == 0)
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_BAD_VOLHEADER;
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- DecodeGOV -- Decodes the Group of VOPs from bitstream
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   04/20/2000  initial modification to the new PV-Decoder Lib format.
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeGOVHeader(BitstreamDecVideo *stream, uint32 *time_base)
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar, time_s;
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int closed_gov, broken_link;
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* group_start_code (32 bits) */
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//   tmpvar = BitstreamReadBits32(stream, 32);
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* hours */
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamReadBits16(stream, 5);
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    time_s = tmpvar * 3600;
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* minutes */
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamReadBits16(stream, 6);
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    time_s += tmpvar * 60;
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* marker bit */
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamRead1Bits(stream);
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* seconds */
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamReadBits16(stream, 6);
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    time_s += tmpvar;
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* We have to check the timestamp here.  If the sync timestamp is */
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*    earlier than the previous timestamp or longer than 60 sec.  */
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*    after the previous timestamp, assume the GOV header is      */
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*    corrupted.                                 05/12/2000     */
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *time_base = time_s;   /*  02/27/2002 */
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  *time_base = *time_base/1000;
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  tmpvar = time_s - *time_base;
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  if (tmpvar <= 60) *time_base = time_s;
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  else return PV_FAIL;
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamRead1Bits(stream);
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    closed_gov = tmpvar;
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamRead1Bits(stream);
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    broken_link = tmpvar;
7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if ((closed_gov == 0) && (broken_link == 1))
7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;        /*  03/15/2002  you can also return PV_FAIL */
7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamByteAlign(stream);
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits32HC(stream, &tmpvar);
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (tmpvar == USER_DATA_START_CODE)       /*  03/15/2002 */
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        DecodeUserData(stream);
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32HC(stream, &tmpvar);
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
7963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
7993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
8003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- DecodeVopHeader -- Decodes the VOPheader information from the bitstream
8013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
8023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   04/12/2000  Initial port to the new PV decoder library format.
8033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   05/10/2000  Error resilient decoding of vop header.
8043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
8053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
8063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeVOPHeader(VideoDecData *video, Vop *currVop, Bool use_ext_timestamp)
8073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
8093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol = video->vol[video->currLayer];
8103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = currVol->bitstream;
8113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
8123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int time_base;
8133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*****
8153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *   Read the VOP header from the bitstream (No shortVideoHeader Mode here!)
8163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *****/
8173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits32HC(stream, &tmpvar);
8183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* check if we have a GOV header here.   08/30/2000 */
8203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == GROUP_START_CODE)
8213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = BitstreamReadBits32HC(stream);
8233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      rewindBitstream(stream, START_CODE_LENGTH); /* for backward compatibility */
8243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = DecodeGOVHeader(stream, &tmpvar);
8253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status != PV_SUCCESS)
8263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return status;
8283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//      use_ext_timestamp = TRUE;   /*  02/08/2002 */
8303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* We should have a VOP header following the GOV header.  03/15/2001 */
8313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32HC(stream, &tmpvar);
8323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
8343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->timeStamp = -1;
8353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
8363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar == VOP_START_CODE)
8373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = BitstreamReadBits32HC(stream);
8393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
8413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 8); // advance by a byte
8433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
8443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
8453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* vop_prediction_type (2 bits) */
8503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->predictionType = (int) BitstreamReadBits16(stream, 2);
8513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* modulo_time_base (? bits) */
8533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    time_base = -1;
8543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
8553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        time_base++;
8573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream);
8583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (tmpvar == 1);
8603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!use_ext_timestamp)
8643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol->moduloTimeBase += 1000 * time_base; /* milliseconds based MTB  11/12/01 */
8663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* marker_bit (1 bit) */
8693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!BitstreamRead1Bits(stream))
8703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
8723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
8733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* vop_time_increment (1-15 bits) in Nov_Compliant (1-16 bits) */
8763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*    we always assumes fixed vop rate here */
8773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->timeInc = BitstreamReadBits16(stream, currVol->nbitsTimeIncRes);
8783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* marker_bit (1 bit) */
8813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!BitstreamRead1Bits(stream))
8823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
8843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
8853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* vop_coded */
8883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->vopCoded = (int) BitstreamRead1Bits(stream);
8893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->vopCoded == 0)
8923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_SUCCESS;
8943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
8953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* read vop_rounding_type */
8993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->predictionType == P_VOP)
9003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->roundingType = (int) BitstreamRead1Bits(stream);
9023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
9043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->roundingType = 0;
9063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVol->complexity_estDisable == 0)
9093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->complexity_estMethod < 2)   /*   OCT 2002 */
9113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if ((currVol->complexity.text_1 >> 3) & 0x1)    /* intra        */
9133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 8);
9143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->complexity.text_1 & 0x1)           /* not_coded    */
9153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 8);
9163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if ((currVol->complexity.text_2 >> 3) & 0x1)    /* dct_coefs    */
9173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 8);
9183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if ((currVol->complexity.text_2 >> 2) & 0x1)    /* dct_lines    */
9193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 8);
9203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if ((currVol->complexity.text_2 >> 1) & 0x1)    /* vlc_symbols  */
9213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 8);
9223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVol->complexity.text_2 & 0x1)           /* vlc_bits     */
9233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                BitstreamReadBits16(stream, 4);
9243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVop->predictionType != I_VOP)
9263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((currVol->complexity.text_1 >> 2) & 0x1)    /* inter    */
9283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((currVol->complexity.text_1 >> 1) & 0x1)    /* inter_4v */
9303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((currVol->complexity.mc >> 5) & 0x1)        /* apm      */
9323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((currVol->complexity.mc >> 4) & 0x1)        /* npm      */
9343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* interpolate_mc_q */
9363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((currVol->complexity.mc >> 2) & 0x1)        /* forw_back_mc_q */
9373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((currVol->complexity.mc >> 1) & 0x1)        /* halfpel2 */
9393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (currVol->complexity.mc & 0x1)               /* halfpel4 */
9413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (currVop->predictionType == B_VOP)
9443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((currVol->complexity.mc >> 3) & 0x1)        /* interpolate_mc_q */
9463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReadBits16(stream, 8);
9473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* read intra_dc_vlc_thr */
9523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->intraDCVlcThr = (int) BitstreamReadBits16(stream, 3);
9533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* read vop_quant (currVol->quantPrecision bits) */
9553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->quantizer = (int16) BitstreamReadBits16(stream, currVol->quantPrecision);
9563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->quantizer == 0)
9573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->quantizer = video->prevVop->quantizer;
9593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
9603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
9613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* read vop_fcode_forward */
9653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->predictionType != I_VOP)
9663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamReadBits16(stream, 3);
9683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar < 1)
9693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVop->fcodeForward = 1;
9713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
9723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
9733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->fcodeForward = tmpvar;
9753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
9773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->fcodeForward = 0;
9793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* read vop_fcode_backward */
9823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->predictionType == B_VOP)
9833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamReadBits16(stream, 3);
9853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar < 1)
9863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVop->fcodeBackward = 1;
9883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
9893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
9903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->fcodeBackward = tmpvar;
9923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
9943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->fcodeBackward = 0;
9963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVol->scalability)
9993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->refSelectCode = (int) BitstreamReadBits16(stream, 2);
10013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongreturn_point:
10043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
10053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
10063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
10093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
10103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- VideoPlaneWithShortHeader -- Decodes the short_video_header information from the bitstream
10113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Modified :
10123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong             04/23/2001.  Remove the codes related to the
10133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 "first pass" decoding.  We use a different function
10143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                 to set up the decoder now.
10153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
10163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS DecodeShortHeader(VideoDecData *video, Vop *currVop)
10173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
10183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
10193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol = video->vol[0];
10203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream = currVol->bitstream;
10213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
10223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 size;
10233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int extended_PTYPE = FALSE;
10253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int UFEP = 0, custom_PFMT = 0, custom_PCF = 0;
10263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = BitstreamShowBits32(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar);
10283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (tmpvar !=  SHORT_VIDEO_START_MARKER)
10303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
10323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
10333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, SHORT_VIDEO_START_MARKER_LENGTH);
10373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Temporal reference. Using vop_time_increment_resolution = 30000 */
10393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamReadBits16(stream, 8);
10403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->temporalRef = (int) tmpvar;
10413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->timeInc = 0xff & (256 + currVop->temporalRef - video->prevVop->temporalRef);
10443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVol->moduloTimeBase += currVop->timeInc; /* mseconds   11/12/01 */
10453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Marker Bit */
10463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!BitstreamRead1Bits(stream))
10473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1048083644fee99d23491554484301943e6a7daf262bDirk Dougherty        mp4dec_log("DecodeShortHeader(): Marker bit wrong.\n");
10493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
10503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
10513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Zero Bit */
10543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (BitstreamRead1Bits(stream))
10553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mp4dec_log("DecodeShortHeader(): Zero bit wrong.\n");
10573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
10583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
10593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*split_screen_indicator*/
10623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (BitstreamRead1Bits(stream))
10633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mp4dec_log("DecodeShortHeader(): Split Screen not supported.\n");
10653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        VideoDecoderErrorDetected(video);
10663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*document_freeze_camera*/
10693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (BitstreamRead1Bits(stream))
10703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mp4dec_log("DecodeShortHeader(): Freeze Camera not supported.\n");
10723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        VideoDecoderErrorDetected(video);
10733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*freeze_picture_release*/
10763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (BitstreamRead1Bits(stream))
10773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        mp4dec_log("DecodeShortHeader(): Freeze Release not supported.\n");
10793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        VideoDecoderErrorDetected(video);
10803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* source format */
10823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    switch (BitstreamReadBits16(stream, 3))
10833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case 1:
10853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->size < 128*96)
10863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
10883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
10893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
10903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayWidth = video->width =  128;
10913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayHeight = video->height  = 96;
10923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
10933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case 2:
10953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->size < 176*144)
10963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
10973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
10983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
10993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayWidth = video->width  = 176;
11013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayHeight = video->height  = 144;
11023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
11033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case 3:
11053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->size < 352*288)
11063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
11083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
11093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayWidth = video->width = 352;
11113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayHeight = video->height = 288;
11123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
11133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case 4:
11153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->size < 704*576)
11163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
11183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
11193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayWidth = video->width = 704;
11213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayHeight = video->height = 576;
11223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
11233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case 5:
11253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->size < 1408*1152)
11263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
11283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
11293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayWidth = video->width = 1408;
11313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayHeight = video->height = 1152;
11323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
11333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case 7:
11353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            extended_PTYPE = TRUE;
11363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
11373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        default:
11393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Msg("H.263 source format not legal\n"); */
11403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
11413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
11423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
11433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->roundingType = 0;
11463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (extended_PTYPE == FALSE)
11483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
11493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->predictionType = (int) BitstreamRead1Bits(stream);
11503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* four_reserved_zero_bits */
11523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (BitstreamReadBits16(stream, 4))
11533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mp4dec_log("DecodeShortHeader(): Reserved bits wrong.\n");
11553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
11563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
11573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
11593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
11603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
11613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        UFEP = BitstreamReadBits16(stream, 3);
11623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (UFEP == 1)
11633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* source format */
11653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            switch (BitstreamReadBits16(stream, 3))
11663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 1:
11683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->size < 128*96)
11693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
11703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        status = PV_FAIL;
11713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        goto return_point;
11723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
11733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayWidth = video->width =  128;
11743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayHeight = video->height  = 96;
11753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
11763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 2:
11783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->size < 176*144)
11793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
11803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        status = PV_FAIL;
11813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        goto return_point;
11823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
11833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayWidth = video->width  = 176;
11843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayHeight = video->height  = 144;
11853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
11863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 3:
11883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->size < 352*288)
11893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
11903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        status = PV_FAIL;
11913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        goto return_point;
11923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
11933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayWidth = video->width = 352;
11943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayHeight = video->height = 288;
11953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
11963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 4:
11983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->size < 704*576)
11993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
12003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        status = PV_FAIL;
12013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        goto return_point;
12023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
12033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayWidth = video->width = 704;
12043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayHeight = video->height = 576;
12053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
12063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 5:
12083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->size < 1408*1152)
12093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
12103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        status = PV_FAIL;
12113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        goto return_point;
12123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
12133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayWidth = video->width = 1408;
12143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->displayHeight = video->height = 1152;
12153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
12163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 6:
12183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    custom_PFMT = TRUE;
12193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
12203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                default:
12223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* Msg("H.263 source format not legal\n"); */
12233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    status = PV_FAIL;
12243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    goto return_point;
12253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            custom_PCF = BitstreamRead1Bits(stream);
12283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* unrestricted MV */
12293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamRead1Bits(stream))
12303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* SAC */
12353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamRead1Bits(stream))
12363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* AP */
12423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamRead1Bits(stream))
12433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->advanced_INTRA = BitstreamRead1Bits(stream);
12493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->deblocking = BitstreamRead1Bits(stream);
12513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->slice_structure = BitstreamRead1Bits(stream);
12533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* RPS, ISD, AIV */
12553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamReadBits16(stream, 3))
12563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->modified_quant = BitstreamRead1Bits(stream);
12613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Marker Bit and reserved*/
12633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamReadBits16(stream, 4) != 8)
12643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
12693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_ANNEX_IJKT_SUPPORT
12703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->advanced_INTRA | video->deblocking | video->modified_quant | video->modified_quant)
12713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
12723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
12733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
12743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
12753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
12763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (UFEP == 0 || UFEP == 1)
12783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
12793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, 3);
12803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar > 1)
12813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVop->predictionType = tmpvar;
12863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* RPR */
12873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamRead1Bits(stream))
12883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* RRU */
12943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamRead1Bits(stream))
12953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
12973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
12983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVop->roundingType = (int) BitstreamRead1Bits(stream);
13003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (BitstreamReadBits16(stream, 3) != 1)
13013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
13033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
13043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
13073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
13093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
13103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* CPM */
13123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (BitstreamRead1Bits(stream))
13133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
13153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
13163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* CPFMT */
13183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (custom_PFMT == 1 && UFEP == 1)
13193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* aspect ratio */
13213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, 4);
13223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == 0)
13233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
13253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
13263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Extended PAR */
13283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == 0xF)
13293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Read par_width and par_height but do nothing */
13313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* par_width */
13323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = BitstreamReadBits16(stream, 8);
13333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* par_height */
13353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = BitstreamReadBits16(stream, 8);
13363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, 9);
13383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayWidth = (tmpvar + 1) << 2;
13403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->width = (video->displayWidth + 15) & -16;
13413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* marker bit */
13423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (!BitstreamRead1Bits(stream))
13433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
13453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
13463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, 9);
13483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == 0)
13493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
13513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
13523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->displayHeight = tmpvar << 2;
13543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->height = (video->displayHeight + 15) & -16;
13553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->height * video->width > video->size)
13573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
13593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
13603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->nTotalMB = video->width / MB_SIZE * video->height / MB_SIZE;
13633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->nTotalMB <= 48)
13653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->nBitsForMBID = 6;
13673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else if (video->nTotalMB <= 99)
13693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->nBitsForMBID = 7;
13713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else if (video->nTotalMB <= 396)
13733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->nBitsForMBID = 9;
13753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else if (video->nTotalMB <= 1584)
13773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->nBitsForMBID = 11;
13793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else if (video->nTotalMB <= 6336)
13813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->nBitsForMBID = 13 ;
13833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else if (video->nTotalMB <= 9216)
13853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->nBitsForMBID = 14 ;
13873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
13893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
13913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
13923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (UFEP == 1 && custom_PCF == 1)
13953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamRead1Bits(stream);
13973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, 7);
13993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == 0)
14003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
14013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
14023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
14033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
14043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (custom_PCF == 1)
14073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            currVop->ETR = BitstreamReadBits16(stream, 2);
14093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (UFEP == 1 && video->slice_structure == 1)
14123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* SSS */
14143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = BitstreamReadBits16(stream, 2);
14153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar != 0)
14163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
14173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                status = PV_FAIL;
14183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                goto return_point;
14193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
14203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Recalculate number of macroblocks per row & col since */
14243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  the frame size can change.           04/23/2001.   */
14253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->nMBinGOB = video->nMBPerRow = video->width / MB_SIZE;
14263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->nGOBinVop = video->nMBPerCol = video->height / MB_SIZE;
14273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->nTotalMB = video->nMBPerRow * video->nMBPerCol;
14283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (custom_PFMT == 0  || UFEP == 0)
14293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nBitsForMBID = CalcNumBits((uint)video->nTotalMB - 1); /* otherwise calculate above */
14313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    size = (int32)video->width * video->height;
1433a694dd0ce2caaf921f7bc894df87a5d52594b4ebRonghua Wu    if (currVop->predictionType == P_VOP && size > video->videoDecControls->size)
14343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
14363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
14373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->videoDecControls->size = size;
14393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->uChan = video->currVop->yChan + size;
14403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->vChan = video->currVop->uChan + (size >> 2);
14413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->uChan = video->prevVop->yChan + size;
14423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->vChan = video->prevVop->uChan + (size >> 2);
14433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->quantizer = (int16) BitstreamReadBits16(stream, 5);
14463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->quantizer == 0)                          /*  04/03/01 */
14483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->quantizer = video->prevVop->quantizer;
14503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FAIL;
14513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        goto return_point;
14523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Zero bit */
14563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (extended_PTYPE == FALSE)
14573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (BitstreamRead1Bits(stream))
14593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mp4dec_log("DecodeShortHeader(): Zero bit wrong.\n");
14613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
14623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
14633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* pei */
14663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    tmpvar = (uint32) BitstreamRead1Bits(stream);
14673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (tmpvar)
14693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamReadBits16(stream, 8); /* "PSPARE" */
14713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        tmpvar = (uint32) BitstreamRead1Bits(stream); /* "PEI" */
14723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->slice_structure)  /* ANNEX_K */
14753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream))  /* SEPB1 */
14773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
14793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
14803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        //  if (currVol->nBitsForMBID //
14833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (BitstreamReadBits16(stream, video->nBitsForMBID))
14843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;             /* no ASO, RS support for Annex K */
14863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
14873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!BitstreamRead1Bits(stream))  /*SEPB3 */
14903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FAIL;
14923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            goto return_point;
14933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Setting of other VOP-header parameters */
14973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->gobNumber = 0;
14983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->vopCoded = 1;
14993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->intraDCVlcThr = 0;
15013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVop->gobFrameID = 0; /* initial value,  05/22/00 */
15023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVol->errorResDisable = 0;
15033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*PutVopInterlaced(0,curr_vop); no implemented yet */
15043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->predictionType != I_VOP)
15053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->fcodeForward = 1;
15063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
15073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVop->fcodeForward = 0;
15083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongreturn_point:
15103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
15123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
15133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
15143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
15153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- PV_DecodeVop -- Decodes the VOP information from the bitstream
15163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
15173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   04/12/2000
15183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   Initial port to the new PV decoder library format.
15193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   This function is different from the one in MoMuSys MPEG-4
15203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   visual decoder.  We handle combined mode with or withput
15213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   error resilience and H.263 mode through the sam path now.
15223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
15233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   05/04/2000
15243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*                   Added temporal scalability to the decoder.
15253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
15263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
15273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_DecodeVop(VideoDecData *video)
15283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
15293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol = video->vol[video->currLayer];
15303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
15313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
15323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*****
15343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *   Do scalable or non-scalable decoding of the current VOP
15353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *****/
15363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!currVol->scalability)
15383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->dataPartitioning)
15403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Data partitioning mode comes here */
15423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = DecodeFrameDataPartMode(video);
15433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
15453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Combined mode with or without error resilience */
15473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*    and short video header comes here.          */
15483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = DecodeFrameCombinedMode(video);
15493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
15523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DO_NOT_FOLLOW_STANDARD
15543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* according to the standard, only combined mode is allowed */
15553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*    in the enhancement layer.          06/01/2000.        */
15563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVol->dataPartitioning)
15573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Data partitioning mode comes here */
15593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = DecodeFrameDataPartMode(video);
15603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
15623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Combined mode with or without error resilience */
15643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*    and short video header comes here.          */
15653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = DecodeFrameCombinedMode(video);
15663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
15683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = DecodeFrameCombinedMode(video);
15693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
15703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* This part is for consuming Visual_object_sequence_end_code and EOS Code */   /*  10/15/01 */
15733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!video->shortVideoHeader)
15743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* at this point bitstream is expected to be byte aligned */
15763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamByteAlignNoForceStuffing(currVol->bitstream);
15773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32HC(currVol->bitstream, &tmpvar);  /*  07/07/01 */
15793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == VISUAL_OBJECT_SEQUENCE_END_CODE)/* VOS_END_CODE */
15803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(currVol->bitstream, 16);
15823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(currVol->bitstream, 16);
15833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
15873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
15883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
15893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->deblocking)
15903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
15913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            H263_Deblock(video->currVop->yChan, video->width, video->height, video->QPMB, video->headerInfo.Mode, 0, 0);
15923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            H263_Deblock(video->currVop->uChan, video->width >> 1, video->height >> 1, video->QPMB, video->headerInfo.Mode, 1, video->modified_quant);
15933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            H263_Deblock(video->currVop->vChan, video->width >> 1, video->height >> 1, video->QPMB, video->headerInfo.Mode, 1, video->modified_quant);
15943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
15953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
15963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Read EOS code for shortheader bitstreams    */
15973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamShowBits32(currVol->bitstream, 22, &tmpvar);
15983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == SHORT_VIDEO_END_MARKER)
15993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
16003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            PV_BitstreamFlushBits(currVol->bitstream, 22);
16013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
16023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
16033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
16043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_BitstreamShowBitsByteAlign(currVol->bitstream, 22, &tmpvar);
16053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == SHORT_VIDEO_END_MARKER)
16063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
16073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamByteAlign(currVol->bitstream);
16083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(currVol->bitstream, 22);
16093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
16103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
16113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
16133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
16143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
16173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
16183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- CalcVopDisplayTime -- calculate absolute time when VOP is to be displayed
16193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
16203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*   04/12/2000 Initial port to the new PV decoder library format.
16213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
16223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
16233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint32 CalcVopDisplayTime(Vol *currVol, Vop *currVop, int shortVideoHeader)
16243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
16253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 display_time;
16263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*****
16293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *   Calculate the time when the VOP is to be displayed next
16303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *****/
16313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (!shortVideoHeader)
16333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
16343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        display_time = (uint32)(currVol->moduloTimeBase + (((int32)currVop->timeInc - (int32)currVol->timeInc_offset) * 1000) / ((int32)currVol->timeIncrementResolution));  /*  11/12/2001 */
16353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVop->timeStamp >= display_time)
16363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
16373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            display_time += 1000;  /* this case is valid if GOVHeader timestamp is ignored */
16383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
16393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
16413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
16423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        display_time = (uint32)(currVol->moduloTimeBase * 33 + (currVol->moduloTimeBase * 11) / 30); /*  11/12/2001 */
16433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return(display_time);
16463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
16473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1648