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 193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef _BITSTREAM_D_H_ 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define _BITSTREAM_D_H_ 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h" /* video decoder function prototypes */ 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef __cplusplus 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern "C" 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif /* __cplusplus */ 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define PV_BS_INLINE /* support inline bitstream functions */ 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define PV_BitstreamFlushBits(A,B) {(A)->bitcnt += (B); (A)->incnt -= (B); (A)->curr_word <<= (B);} 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamFillBuffer(BitstreamDecVideo *stream); 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamFillCache(BitstreamDecVideo *stream); 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong void BitstreamReset(BitstreamDecVideo *stream, uint8 *buffer, int32 buffer_size); 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int BitstreamOpen(BitstreamDecVideo *stream, int layer); 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong void BitstreamClose(BitstreamDecVideo *stream); 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamShowBits32(BitstreamDecVideo *stream, int nbits, uint32 *code); 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 BitstreamReadBits32(BitstreamDecVideo *stream, int nbits); 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint BitstreamReadBits16(BitstreamDecVideo *stream, int nbits); 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint BitstreamRead1Bits(BitstreamDecVideo *stream); 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_BS_INLINE 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamShowBits16(BitstreamDecVideo *stream, int nbits, uint *code); 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamShow15Bits(BitstreamDecVideo *stream, uint *code); 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamShow13Bits(BitstreamDecVideo *stream, uint *code); 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint BitstreamReadBits16_INLINE(BitstreamDecVideo *stream, int nbits); 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint BitstreamRead1Bits_INLINE(BitstreamDecVideo *stream); 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong __inline PV_STATUS BitstreamShowBits16(BitstreamDecVideo *stream, int nbits, uint *code) 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status = PV_SUCCESS; 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (stream->incnt < nbits) 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* frame-based decoding */ 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamFillCache(stream); 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *code = stream->curr_word >> (32 - nbits); 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* =========================================================================*/ 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong __inline PV_STATUS BitstreamShow15Bits(BitstreamDecVideo *stream, uint *code) 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status = PV_SUCCESS; 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (stream->incnt < 15) 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* frame-based decoding */ 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamFillCache(stream); 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *code = stream->curr_word >> 17; 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong __inline PV_STATUS BitstreamShow13Bits(BitstreamDecVideo *stream, uint *code) 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS status = PV_SUCCESS; 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (stream->incnt < 13) 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* frame-based decoding */ 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong status = BitstreamFillCache(stream); 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *code = stream->curr_word >> 19; 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return status; 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong __inline uint BitstreamReadBits16_INLINE(BitstreamDecVideo *stream, int nbits) 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint code; 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (stream->incnt < nbits) 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* frame-based decoding */ 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamFillCache(stream); 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong code = stream->curr_word >> (32 - nbits); 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, nbits); 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return code; 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong __inline uint BitstreamRead1Bits_INLINE(BitstreamDecVideo *stream) 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint code; 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong if (stream->incnt < 1) 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* frame-based decoding */ 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong BitstreamFillCache(stream); 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong code = stream->curr_word >> 31; 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_BitstreamFlushBits(stream, 1); 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return code; 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS PV_BitstreamFlushBitsCheck(BitstreamDecVideo *stream, int nbits); 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 BitstreamReadBits32HC(BitstreamDecVideo *stream); 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamShowBits32HC(BitstreamDecVideo *stream, uint32 *code); 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamCheckEndBuffer(BitstreamDecVideo *stream); 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS PV_BitstreamShowBitsByteAlign(BitstreamDecVideo *stream, int nbits, uint32 *code); 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS PV_BitstreamShowBitsByteAlignNoForceStuffing(BitstreamDecVideo *stream, int nbits, uint32 *code); 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Bool validStuffing_h263(BitstreamDecVideo *stream); 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS quickSearchH263SliceHeader(BitstreamDecVideo *stream); 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS PV_BitstreamByteAlign(BitstreamDecVideo *stream); 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS BitstreamByteAlignNoForceStuffing(BitstreamDecVideo *stream); 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong Bool validStuffing(BitstreamDecVideo *stream); 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS movePointerTo(BitstreamDecVideo *stream, int32 pos); 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS PVSearchNextM4VFrame(BitstreamDecVideo *stream); 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS PVSearchNextH263Frame(BitstreamDecVideo *stream); 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS quickSearchVideoPacketHeader(BitstreamDecVideo *stream, int marker_length); 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* for error concealment & soft-decoding */ 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong void PVLocateM4VFrameBoundary(BitstreamDecVideo *stream); 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong void PVSearchH263FrameBoundary(BitstreamDecVideo *stream); 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS quickSearchMotionMarker(BitstreamDecVideo *stream); 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS quickSearchDCM(BitstreamDecVideo *stream); 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong PV_STATUS quickSearchGOBHeader(BitstreamDecVideo *stream); 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong void BitstreamShowBuffer(BitstreamDecVideo *stream, int32 startbit, int32 endbit, uint8 *bitBfr); 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* 10/8/98 New prototyps. */ 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 getPointer(BitstreamDecVideo *stream); 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef __cplusplus 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif /* __cplusplus */ 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif /* _BITSTREAM_D_H_ */ 175