| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 PacketVideo |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| * express or implied. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * ------------------------------------------------------------------- |
| */ |
| |
| #ifndef _BITSTREAM_D_H_ |
| #define _BITSTREAM_D_H_ |
| |
| #include "mp4dec_lib.h" /* video decoder function prototypes */ |
| |
| #ifdef __cplusplus |
| extern "C" |
| { |
| #endif /* __cplusplus */ |
| |
| #define PV_BS_INLINE /* support inline bitstream functions */ |
| |
| #define PV_BitstreamFlushBits(A,B) {(A)->bitcnt += (B); (A)->incnt -= (B); (A)->curr_word <<= (B);} |
| |
| PV_STATUS BitstreamFillBuffer(BitstreamDecVideo *stream); |
| PV_STATUS BitstreamFillCache(BitstreamDecVideo *stream); |
| void BitstreamReset(BitstreamDecVideo *stream, uint8 *buffer, int32 buffer_size); |
| int BitstreamOpen(BitstreamDecVideo *stream, int layer); |
| void BitstreamClose(BitstreamDecVideo *stream); |
| |
| PV_STATUS BitstreamShowBits32(BitstreamDecVideo *stream, int nbits, uint32 *code); |
| uint32 BitstreamReadBits32(BitstreamDecVideo *stream, int nbits); |
| |
| uint BitstreamReadBits16(BitstreamDecVideo *stream, int nbits); |
| uint BitstreamRead1Bits(BitstreamDecVideo *stream); |
| #ifndef PV_BS_INLINE |
| PV_STATUS BitstreamShowBits16(BitstreamDecVideo *stream, int nbits, uint *code); |
| PV_STATUS BitstreamShow15Bits(BitstreamDecVideo *stream, uint *code); |
| PV_STATUS BitstreamShow13Bits(BitstreamDecVideo *stream, uint *code); |
| uint BitstreamReadBits16_INLINE(BitstreamDecVideo *stream, int nbits); |
| uint BitstreamRead1Bits_INLINE(BitstreamDecVideo *stream); |
| #else |
| __inline PV_STATUS BitstreamShowBits16(BitstreamDecVideo *stream, int nbits, uint *code) |
| { |
| PV_STATUS status = PV_SUCCESS; |
| |
| |
| if (stream->incnt < nbits) |
| { |
| /* frame-based decoding */ |
| status = BitstreamFillCache(stream); |
| } |
| |
| *code = stream->curr_word >> (32 - nbits); |
| return status; |
| } |
| |
| |
| |
| /* =========================================================================*/ |
| __inline PV_STATUS BitstreamShow15Bits(BitstreamDecVideo *stream, uint *code) |
| { |
| PV_STATUS status = PV_SUCCESS; |
| |
| if (stream->incnt < 15) |
| { |
| /* frame-based decoding */ |
| status = BitstreamFillCache(stream); |
| } |
| *code = stream->curr_word >> 17; |
| return status; |
| } |
| |
| |
| __inline PV_STATUS BitstreamShow13Bits(BitstreamDecVideo *stream, uint *code) |
| { |
| PV_STATUS status = PV_SUCCESS; |
| |
| if (stream->incnt < 13) |
| { |
| /* frame-based decoding */ |
| status = BitstreamFillCache(stream); |
| } |
| *code = stream->curr_word >> 19; |
| return status; |
| } |
| __inline uint BitstreamReadBits16_INLINE(BitstreamDecVideo *stream, int nbits) |
| { |
| uint code; |
| |
| if (stream->incnt < nbits) |
| { |
| /* frame-based decoding */ |
| BitstreamFillCache(stream); |
| } |
| code = stream->curr_word >> (32 - nbits); |
| PV_BitstreamFlushBits(stream, nbits); |
| return code; |
| } |
| |
| |
| __inline uint BitstreamRead1Bits_INLINE(BitstreamDecVideo *stream) |
| { |
| uint code; |
| |
| if (stream->incnt < 1) |
| { |
| /* frame-based decoding */ |
| BitstreamFillCache(stream); |
| } |
| code = stream->curr_word >> 31; |
| PV_BitstreamFlushBits(stream, 1); |
| |
| return code; |
| } |
| |
| #endif |
| |
| |
| |
| |
| |
| |
| |
| PV_STATUS PV_BitstreamFlushBitsCheck(BitstreamDecVideo *stream, int nbits); |
| |
| uint32 BitstreamReadBits32HC(BitstreamDecVideo *stream); |
| PV_STATUS BitstreamShowBits32HC(BitstreamDecVideo *stream, uint32 *code); |
| |
| |
| |
| PV_STATUS BitstreamCheckEndBuffer(BitstreamDecVideo *stream); |
| |
| PV_STATUS PV_BitstreamShowBitsByteAlign(BitstreamDecVideo *stream, int nbits, uint32 *code); |
| #ifdef PV_ANNEX_IJKT_SUPPORT |
| PV_STATUS PV_BitstreamShowBitsByteAlignNoForceStuffing(BitstreamDecVideo *stream, int nbits, uint32 *code); |
| Bool validStuffing_h263(BitstreamDecVideo *stream); |
| PV_STATUS quickSearchH263SliceHeader(BitstreamDecVideo *stream); |
| #endif |
| PV_STATUS PV_BitstreamByteAlign(BitstreamDecVideo *stream); |
| PV_STATUS BitstreamByteAlignNoForceStuffing(BitstreamDecVideo *stream); |
| Bool validStuffing(BitstreamDecVideo *stream); |
| |
| PV_STATUS movePointerTo(BitstreamDecVideo *stream, int32 pos); |
| PV_STATUS PVSearchNextM4VFrame(BitstreamDecVideo *stream); |
| PV_STATUS PVSearchNextH263Frame(BitstreamDecVideo *stream); |
| PV_STATUS quickSearchVideoPacketHeader(BitstreamDecVideo *stream, int marker_length); |
| |
| |
| /* for error concealment & soft-decoding */ |
| void PVLocateM4VFrameBoundary(BitstreamDecVideo *stream); |
| void PVSearchH263FrameBoundary(BitstreamDecVideo *stream); |
| |
| PV_STATUS quickSearchMotionMarker(BitstreamDecVideo *stream); |
| PV_STATUS quickSearchDCM(BitstreamDecVideo *stream); |
| PV_STATUS quickSearchGOBHeader(BitstreamDecVideo *stream); |
| void BitstreamShowBuffer(BitstreamDecVideo *stream, int32 startbit, int32 endbit, uint8 *bitBfr); |
| |
| /* 10/8/98 New prototyps. */ |
| int32 getPointer(BitstreamDecVideo *stream); |
| |
| #ifdef __cplusplus |
| } |
| #endif /* __cplusplus */ |
| |
| #endif /* _BITSTREAM_D_H_ */ |