102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------ 202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo 302f5b5447de349216a40086ca6061efefb5a3025James Dong * 402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License. 602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at 702f5b5447de349216a40086ca6061efefb5a3025James Dong * 802f5b5447de349216a40086ca6061efefb5a3025James Dong * http://www.apache.org/licenses/LICENSE-2.0 902f5b5447de349216a40086ca6061efefb5a3025James Dong * 1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software 1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied. 1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions 1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License. 1602f5b5447de349216a40086ca6061efefb5a3025James Dong * ------------------------------------------------------------------- 1702f5b5447de349216a40086ca6061efefb5a3025James Dong */ 1802f5b5447de349216a40086ca6061efefb5a3025James Dong 1902f5b5447de349216a40086ca6061efefb5a3025James Dong#ifndef _BITSTREAM_D_H_ 2002f5b5447de349216a40086ca6061efefb5a3025James Dong#define _BITSTREAM_D_H_ 2102f5b5447de349216a40086ca6061efefb5a3025James Dong 2202f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h" /* video decoder function prototypes */ 2302f5b5447de349216a40086ca6061efefb5a3025James Dong 2402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef __cplusplus 2502f5b5447de349216a40086ca6061efefb5a3025James Dongextern "C" 2602f5b5447de349216a40086ca6061efefb5a3025James Dong{ 2702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif /* __cplusplus */ 2802f5b5447de349216a40086ca6061efefb5a3025James Dong 2902f5b5447de349216a40086ca6061efefb5a3025James Dong#define PV_BS_INLINE /* support inline bitstream functions */ 3002f5b5447de349216a40086ca6061efefb5a3025James Dong 3102f5b5447de349216a40086ca6061efefb5a3025James Dong#define PV_BitstreamFlushBits(A,B) {(A)->bitcnt += (B); (A)->incnt -= (B); (A)->curr_word <<= (B);} 3202f5b5447de349216a40086ca6061efefb5a3025James Dong 3302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamFillBuffer(BitstreamDecVideo *stream); 3402f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamFillCache(BitstreamDecVideo *stream); 3502f5b5447de349216a40086ca6061efefb5a3025James Dong void BitstreamReset(BitstreamDecVideo *stream, uint8 *buffer, int32 buffer_size); 3602f5b5447de349216a40086ca6061efefb5a3025James Dong int BitstreamOpen(BitstreamDecVideo *stream, int layer); 3702f5b5447de349216a40086ca6061efefb5a3025James Dong void BitstreamClose(BitstreamDecVideo *stream); 3802f5b5447de349216a40086ca6061efefb5a3025James Dong 3902f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamShowBits32(BitstreamDecVideo *stream, int nbits, uint32 *code); 4002f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 BitstreamReadBits32(BitstreamDecVideo *stream, int nbits); 4102f5b5447de349216a40086ca6061efefb5a3025James Dong 4202f5b5447de349216a40086ca6061efefb5a3025James Dong uint BitstreamReadBits16(BitstreamDecVideo *stream, int nbits); 4302f5b5447de349216a40086ca6061efefb5a3025James Dong uint BitstreamRead1Bits(BitstreamDecVideo *stream); 4402f5b5447de349216a40086ca6061efefb5a3025James Dong#ifndef PV_BS_INLINE 4502f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamShowBits16(BitstreamDecVideo *stream, int nbits, uint *code); 4602f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamShow15Bits(BitstreamDecVideo *stream, uint *code); 4702f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamShow13Bits(BitstreamDecVideo *stream, uint *code); 4802f5b5447de349216a40086ca6061efefb5a3025James Dong uint BitstreamReadBits16_INLINE(BitstreamDecVideo *stream, int nbits); 4902f5b5447de349216a40086ca6061efefb5a3025James Dong uint BitstreamRead1Bits_INLINE(BitstreamDecVideo *stream); 5002f5b5447de349216a40086ca6061efefb5a3025James Dong#else 5102f5b5447de349216a40086ca6061efefb5a3025James Dong __inline PV_STATUS BitstreamShowBits16(BitstreamDecVideo *stream, int nbits, uint *code) 5202f5b5447de349216a40086ca6061efefb5a3025James Dong { 5302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS status = PV_SUCCESS; 5402f5b5447de349216a40086ca6061efefb5a3025James Dong 5502f5b5447de349216a40086ca6061efefb5a3025James Dong 5602f5b5447de349216a40086ca6061efefb5a3025James Dong if (stream->incnt < nbits) 5702f5b5447de349216a40086ca6061efefb5a3025James Dong { 5802f5b5447de349216a40086ca6061efefb5a3025James Dong /* frame-based decoding */ 5902f5b5447de349216a40086ca6061efefb5a3025James Dong status = BitstreamFillCache(stream); 6002f5b5447de349216a40086ca6061efefb5a3025James Dong } 6102f5b5447de349216a40086ca6061efefb5a3025James Dong 6202f5b5447de349216a40086ca6061efefb5a3025James Dong *code = stream->curr_word >> (32 - nbits); 6302f5b5447de349216a40086ca6061efefb5a3025James Dong return status; 6402f5b5447de349216a40086ca6061efefb5a3025James Dong } 6502f5b5447de349216a40086ca6061efefb5a3025James Dong 6602f5b5447de349216a40086ca6061efefb5a3025James Dong 6702f5b5447de349216a40086ca6061efefb5a3025James Dong 6802f5b5447de349216a40086ca6061efefb5a3025James Dong /* =========================================================================*/ 6902f5b5447de349216a40086ca6061efefb5a3025James Dong __inline PV_STATUS BitstreamShow15Bits(BitstreamDecVideo *stream, uint *code) 7002f5b5447de349216a40086ca6061efefb5a3025James Dong { 7102f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS status = PV_SUCCESS; 7202f5b5447de349216a40086ca6061efefb5a3025James Dong 7302f5b5447de349216a40086ca6061efefb5a3025James Dong if (stream->incnt < 15) 7402f5b5447de349216a40086ca6061efefb5a3025James Dong { 7502f5b5447de349216a40086ca6061efefb5a3025James Dong /* frame-based decoding */ 7602f5b5447de349216a40086ca6061efefb5a3025James Dong status = BitstreamFillCache(stream); 7702f5b5447de349216a40086ca6061efefb5a3025James Dong } 7802f5b5447de349216a40086ca6061efefb5a3025James Dong *code = stream->curr_word >> 17; 7902f5b5447de349216a40086ca6061efefb5a3025James Dong return status; 8002f5b5447de349216a40086ca6061efefb5a3025James Dong } 8102f5b5447de349216a40086ca6061efefb5a3025James Dong 8202f5b5447de349216a40086ca6061efefb5a3025James Dong 8302f5b5447de349216a40086ca6061efefb5a3025James Dong __inline PV_STATUS BitstreamShow13Bits(BitstreamDecVideo *stream, uint *code) 8402f5b5447de349216a40086ca6061efefb5a3025James Dong { 8502f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS status = PV_SUCCESS; 8602f5b5447de349216a40086ca6061efefb5a3025James Dong 8702f5b5447de349216a40086ca6061efefb5a3025James Dong if (stream->incnt < 13) 8802f5b5447de349216a40086ca6061efefb5a3025James Dong { 8902f5b5447de349216a40086ca6061efefb5a3025James Dong /* frame-based decoding */ 9002f5b5447de349216a40086ca6061efefb5a3025James Dong status = BitstreamFillCache(stream); 9102f5b5447de349216a40086ca6061efefb5a3025James Dong } 9202f5b5447de349216a40086ca6061efefb5a3025James Dong *code = stream->curr_word >> 19; 9302f5b5447de349216a40086ca6061efefb5a3025James Dong return status; 9402f5b5447de349216a40086ca6061efefb5a3025James Dong } 9502f5b5447de349216a40086ca6061efefb5a3025James Dong __inline uint BitstreamReadBits16_INLINE(BitstreamDecVideo *stream, int nbits) 9602f5b5447de349216a40086ca6061efefb5a3025James Dong { 9702f5b5447de349216a40086ca6061efefb5a3025James Dong uint code; 9802f5b5447de349216a40086ca6061efefb5a3025James Dong 9902f5b5447de349216a40086ca6061efefb5a3025James Dong if (stream->incnt < nbits) 10002f5b5447de349216a40086ca6061efefb5a3025James Dong { 10102f5b5447de349216a40086ca6061efefb5a3025James Dong /* frame-based decoding */ 10202f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamFillCache(stream); 10302f5b5447de349216a40086ca6061efefb5a3025James Dong } 10402f5b5447de349216a40086ca6061efefb5a3025James Dong code = stream->curr_word >> (32 - nbits); 10502f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamFlushBits(stream, nbits); 10602f5b5447de349216a40086ca6061efefb5a3025James Dong return code; 10702f5b5447de349216a40086ca6061efefb5a3025James Dong } 10802f5b5447de349216a40086ca6061efefb5a3025James Dong 10902f5b5447de349216a40086ca6061efefb5a3025James Dong 11002f5b5447de349216a40086ca6061efefb5a3025James Dong __inline uint BitstreamRead1Bits_INLINE(BitstreamDecVideo *stream) 11102f5b5447de349216a40086ca6061efefb5a3025James Dong { 11202f5b5447de349216a40086ca6061efefb5a3025James Dong uint code; 11302f5b5447de349216a40086ca6061efefb5a3025James Dong 11402f5b5447de349216a40086ca6061efefb5a3025James Dong if (stream->incnt < 1) 11502f5b5447de349216a40086ca6061efefb5a3025James Dong { 11602f5b5447de349216a40086ca6061efefb5a3025James Dong /* frame-based decoding */ 11702f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamFillCache(stream); 11802f5b5447de349216a40086ca6061efefb5a3025James Dong } 11902f5b5447de349216a40086ca6061efefb5a3025James Dong code = stream->curr_word >> 31; 12002f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamFlushBits(stream, 1); 12102f5b5447de349216a40086ca6061efefb5a3025James Dong 12202f5b5447de349216a40086ca6061efefb5a3025James Dong return code; 12302f5b5447de349216a40086ca6061efefb5a3025James Dong } 12402f5b5447de349216a40086ca6061efefb5a3025James Dong 12502f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 12602f5b5447de349216a40086ca6061efefb5a3025James Dong 12702f5b5447de349216a40086ca6061efefb5a3025James Dong 12802f5b5447de349216a40086ca6061efefb5a3025James Dong 12902f5b5447de349216a40086ca6061efefb5a3025James Dong 13002f5b5447de349216a40086ca6061efefb5a3025James Dong 13102f5b5447de349216a40086ca6061efefb5a3025James Dong 13202f5b5447de349216a40086ca6061efefb5a3025James Dong 13302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS PV_BitstreamFlushBitsCheck(BitstreamDecVideo *stream, int nbits); 13402f5b5447de349216a40086ca6061efefb5a3025James Dong 13502f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 BitstreamReadBits32HC(BitstreamDecVideo *stream); 13602f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamShowBits32HC(BitstreamDecVideo *stream, uint32 *code); 13702f5b5447de349216a40086ca6061efefb5a3025James Dong 13802f5b5447de349216a40086ca6061efefb5a3025James Dong 13902f5b5447de349216a40086ca6061efefb5a3025James Dong 14002f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamCheckEndBuffer(BitstreamDecVideo *stream); 14102f5b5447de349216a40086ca6061efefb5a3025James Dong 14202f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS PV_BitstreamShowBitsByteAlign(BitstreamDecVideo *stream, int nbits, uint32 *code); 14302f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 14402f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS PV_BitstreamShowBitsByteAlignNoForceStuffing(BitstreamDecVideo *stream, int nbits, uint32 *code); 14502f5b5447de349216a40086ca6061efefb5a3025James Dong Bool validStuffing_h263(BitstreamDecVideo *stream); 14602f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS quickSearchH263SliceHeader(BitstreamDecVideo *stream); 14702f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 14802f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS PV_BitstreamByteAlign(BitstreamDecVideo *stream); 14902f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS BitstreamByteAlignNoForceStuffing(BitstreamDecVideo *stream); 15002f5b5447de349216a40086ca6061efefb5a3025James Dong Bool validStuffing(BitstreamDecVideo *stream); 15102f5b5447de349216a40086ca6061efefb5a3025James Dong 15202f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS movePointerTo(BitstreamDecVideo *stream, int32 pos); 15302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS PVSearchNextM4VFrame(BitstreamDecVideo *stream); 15402f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS PVSearchNextH263Frame(BitstreamDecVideo *stream); 15502f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS quickSearchVideoPacketHeader(BitstreamDecVideo *stream, int marker_length); 15602f5b5447de349216a40086ca6061efefb5a3025James Dong 15702f5b5447de349216a40086ca6061efefb5a3025James Dong 15802f5b5447de349216a40086ca6061efefb5a3025James Dong /* for error concealment & soft-decoding */ 15902f5b5447de349216a40086ca6061efefb5a3025James Dong void PVLocateM4VFrameBoundary(BitstreamDecVideo *stream); 16002f5b5447de349216a40086ca6061efefb5a3025James Dong void PVSearchH263FrameBoundary(BitstreamDecVideo *stream); 16102f5b5447de349216a40086ca6061efefb5a3025James Dong 16202f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS quickSearchMotionMarker(BitstreamDecVideo *stream); 16302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS quickSearchDCM(BitstreamDecVideo *stream); 16402f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS quickSearchGOBHeader(BitstreamDecVideo *stream); 16502f5b5447de349216a40086ca6061efefb5a3025James Dong void BitstreamShowBuffer(BitstreamDecVideo *stream, int32 startbit, int32 endbit, uint8 *bitBfr); 16602f5b5447de349216a40086ca6061efefb5a3025James Dong 16702f5b5447de349216a40086ca6061efefb5a3025James Dong /* 10/8/98 New prototyps. */ 16802f5b5447de349216a40086ca6061efefb5a3025James Dong int32 getPointer(BitstreamDecVideo *stream); 16902f5b5447de349216a40086ca6061efefb5a3025James Dong 17002f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef __cplusplus 17102f5b5447de349216a40086ca6061efefb5a3025James Dong} 17202f5b5447de349216a40086ca6061efefb5a3025James Dong#endif /* __cplusplus */ 17302f5b5447de349216a40086ca6061efefb5a3025James Dong 17402f5b5447de349216a40086ca6061efefb5a3025James Dong#endif /* _BITSTREAM_D_H_ */ 175