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