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