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