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