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