13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------ 23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo 33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License"); 53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License. 63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at 73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * http://www.apache.org/licenses/LICENSE-2.0 93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software 113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS, 123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied. 143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions 153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License. 163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * ------------------------------------------------------------------- 173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */ 183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h" 193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h" 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h" 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin****** 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 04/13/2000 : initial modification to the new PV-Decoder 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Lib format. 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 04/16/2001 : Removed PV_END_OF_BUFFER case, error resilience 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/ 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_ReadVideoPacketHeader(VideoDecData *video, int *next_MB) 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status; 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Vol *currVol = video->vol[video->currLayer]; 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Vop *currVop = video->currVop; 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int fcode_forward; 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int resync_marker_length; 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nbits = video->nBitsForMBID; 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 tmpvar32; 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint tmpvar16; 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 quantizer; 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nTotalMB = video->nTotalMB; 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong fcode_forward = currVop->fcodeForward; 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong resync_marker_length = 17; 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (currVop->predictionType != I_VOP) resync_marker_length = 16 + fcode_forward; 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = PV_BitstreamShowBitsByteAlign(stream, resync_marker_length, &tmpvar32); 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if (status != PV_SUCCESS && status != PV_END_OF_BUFFER) return status; */ 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar32 == RESYNC_MARKER) 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// DecNextStartCode(stream); 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamByteAlign(stream); 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamReadBits32(stream, resync_marker_length); 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *next_MB = (int) BitstreamReadBits16(stream, nbits); 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// if (*next_MB <= video->mbnum) /* needs more investigation */ 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// *next_MB = video->mbnum+1; 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (*next_MB >= nTotalMB) /* fix 04/05/01 */ 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *next_MB = video->mbnum + 1; 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (*next_MB >= nTotalMB) /* this check is needed */ 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *next_MB = nTotalMB - 1; 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong quantizer = (int16) BitstreamReadBits16(stream, currVol->quantPrecision); 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (quantizer == 0) return PV_FAIL; /* 04/03/01 */ 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong currVop->quantizer = quantizer; 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* if we have HEC, read some redundant VOP header information */ 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* this part needs improvement 04/05/01 */ 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (BitstreamRead1Bits(stream)) 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int time_base = -1; 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* modulo_time_base (? bits) */ 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong do 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong time_base++; 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar16 = BitstreamRead1Bits(stream); 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (tmpvar16 == 1); 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* marker bit */ 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamRead1Bits(stream); 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* vop_time_increment (1-15 bits) */ 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamReadBits16(stream, currVol->nbitsTimeIncRes); 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* marker bit */ 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamRead1Bits(stream); 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* vop_prediction_type (2 bits) */ 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamReadBits16(stream, 2); 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* Added intra_dc_vlc_thr reading */ 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamReadBits16(stream, 3); 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* fcodes */ 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (currVop->predictionType != I_VOP) 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong fcode_forward = (int) BitstreamReadBits16(stream, 3); 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (currVop->predictionType == B_VOP) 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamReadBits16(stream, 3); 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamByteAlign(stream); /* */ 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamCheckEndBuffer(stream); /* return end_of_VOP 03/30/01 */ 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamShowBits32HC(stream, &tmpvar32); /* 07/07/01 */ 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* -16 = 0xFFFFFFF0*/ 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if ((tmpvar32 & 0xFFFFFFF0) == VISUAL_OBJECT_SEQUENCE_START_CODE) /* start code mask 00 00 01 */ 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* we don't have to check for legl stuffing here. 05/08/2000 */ 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_END_OF_VOP; 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin****** 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 3/10/00 : initial modification to the 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* new PV-Decoder Lib format. 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* 04/17/01 : remove PV_END_OF_BUFFER, error checking 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/ 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_GobHeader(VideoDecData *video) 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 tmpvar; 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Vop *currVop = video->currVop; 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int quantPrecision = 5; 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 quantizer; 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar); 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar != GOB_RESYNC_MARKER) 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamShowBitsByteAlign(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar); 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar != GOB_RESYNC_MARKER) 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamByteAlign(stream); /* if bytealigned GOBHEADER search is performed */ 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* then no more noforcestuffing */ 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* we've got a GOB header info here */ 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH + 5, &tmpvar); 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmpvar &= 0x1F; 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar == 0) 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_END_OF_VOP; 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar == 31) 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, GOB_RESYNC_MARKER_LENGTH + 5); 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamByteAlignNoForceStuffing(stream); 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_END_OF_VOP; 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, GOB_RESYNC_MARKER_LENGTH + 5); 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong currVop->gobNumber = (int) tmpvar; 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (currVop->gobNumber >= video->nGOBinVop) return PV_FAIL; 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong currVop->gobFrameID = (int) BitstreamReadBits16(stream, 2); 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong quantizer = (int16) BitstreamReadBits16(stream, quantPrecision); 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (quantizer == 0) return PV_FAIL; /* 04/03/01 */ 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong currVop->quantizer = quantizer; 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT 1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_H263SliceHeader(VideoDecData *video, int *next_MB) 1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status; 1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 tmpvar; 1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Vop *currVop = video->currVop; 1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamDecVideo *stream = video->bitstream; 2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int nTotalMB = video->nTotalMB; 2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int16 quantizer; 2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamShowBitsByteAlignNoForceStuffing(stream, 17, &tmpvar); 2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar == RESYNC_MARKER) 2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamByteAlignNoForceStuffing(stream); 2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, 17); 2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!BitstreamRead1Bits(stream)) 2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *next_MB = BitstreamReadBits16(stream, video->nBitsForMBID); 2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (*next_MB >= nTotalMB) /* fix 04/05/01 */ 2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *next_MB = video->mbnum + 1; 2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (*next_MB >= nTotalMB) /* this check is needed */ 2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *next_MB = nTotalMB - 1; 2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* we will not parse sebp2 for large pictures 3GPP */ 2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong quantizer = (int16) BitstreamReadBits16(stream, 5); 2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (quantizer == 0) return PV_FAIL; 2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong currVop->quantizer = quantizer; 2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (!BitstreamRead1Bits(stream)) 2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong currVop->gobFrameID = (int) BitstreamReadBits16(stream, 2); 2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamCheckEndBuffer(stream); /* return end_of_VOP 03/30/01 */ 2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (status != PV_SUCCESS) 2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamShowBitsByteAlign(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar); 2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (tmpvar == SHORT_VIDEO_START_MARKER) 2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* we don't have to check for legal stuffing here. 05/08/2000 */ 2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_END_OF_VOP; 2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong else 2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_FAIL; 2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return PV_SUCCESS; 2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 253