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