--- bitstream.h 2002/06/12 20:38:40 1.6 +++ bitstream.h 2002/11/02 15:52:30 1.10.2.2 @@ -41,7 +41,9 @@ * * * Revision history: * * * - * 26.03.2002 interlacing support - modified putvol/vopheaders paramters + * 28.06.2002 addded BitstreamNumBitsToByteAlign() * + * BitstreamShowBitsFromByteAlign() * + * 26.03.2002 interlacing support - modified putvol/vopheaders paramters * * 04.03.2002 putbits speedup (Isibaar) * * 03.03.2002 merged BITREADER and BITWRITER (Isibaar) * * 16.12.2001 inital version * @@ -110,6 +112,14 @@ #define S_VOP 3 #define N_VOP 4 +// resync-specific +#define NUMBITS_VP_RESYNC_MARKER 17 +#define RESYNC_MARKER 1 + + +int +read_video_packet_header(Bitstream *bs, const int addbits, int * quant); + // header stuff int BitstreamReadHeaders(Bitstream * bs, @@ -123,11 +133,16 @@ void BitstreamWriteVolHeader(Bitstream * const bs, const MBParam * pParam, - const FRAMEINFO * frame); + const FRAMEINFO * const frame); void BitstreamWriteVopHeader(Bitstream * const bs, const MBParam * pParam, - const FRAMEINFO * frame); + const FRAMEINFO * const frame, + int vop_coded); + +void BitstreamWriteUserData(Bitstream * const bs, + uint8_t * data, + const int length); /* initialise bitstream structure */ @@ -225,6 +240,36 @@ } +// number of bits to next byte alignment +static __inline uint32_t +BitstreamNumBitsToByteAlign(Bitstream *bs) +{ + uint32_t n = (32 - bs->pos) % 8; + return n == 0 ? 8 : n; +} + + +// show nbits from next byte alignment +static __inline uint32_t +BitstreamShowBitsFromByteAlign(Bitstream *bs, int bits) +{ + int bspos = bs->pos + BitstreamNumBitsToByteAlign(bs); + int nbit = (bits + bspos) - 32; + + if (bspos >= 32) { + return bs->bufb >> (32 - nbit); + } else if (nbit > 0) { + return ((bs->bufa & (0xffffffff >> bspos)) << nbit) | (bs-> + bufb >> (32 - + nbit)); + } else { + return (bs->bufa & (0xffffffff >> bspos)) >> (32 - bspos - bits); + } + +} + + + /* move forward to the next byte boundary */ static __inline void @@ -243,7 +288,7 @@ static uint32_t __inline BitstreamPos(const Bitstream * const bs) { - return 8 * ((uint32_t) bs->tail - (uint32_t) bs->start) + bs->pos; + return 8 * ((ptr_t)bs->tail - (ptr_t)bs->start) + bs->pos; } @@ -254,7 +299,7 @@ static uint32_t __inline BitstreamLength(Bitstream * const bs) { - uint32_t len = (uint32_t) bs->tail - (uint32_t) bs->start; + uint32_t len = (ptr_t) bs->tail - (ptr_t) bs->start; if (bs->pos) { uint32_t b = bs->buf; @@ -292,19 +337,6 @@ } -/* pad bitstream to the next byte boundary */ - -static void __inline -BitstreamPad(Bitstream * const bs) -{ - uint32_t remainder = bs->pos % 8; - - if (remainder) { - BitstreamForward(bs, 8 - remainder); - } -} - - /* read n bits from bitstream */ static uint32_t __inline @@ -367,4 +399,42 @@ } } + +static const int stuffing_codes[8] = +{ + /* nbits stuffing code */ + 0, /* 1 0 */ + 1, /* 2 01 */ + 3, /* 3 011 */ + 7, /* 4 0111 */ + 0xf, /* 5 01111 */ + 0x1f, /* 6 011111 */ + 0x3f, /* 7 0111111 */ + 0x7f, /* 8 01111111 */ +}; + +/* pad bitstream to the next byte boundary */ + +static void __inline +BitstreamPad(Bitstream * const bs) +{ + int bits = 8 - (bs->pos % 8); + if (bits < 8) + { + BitstreamPutBits(bs, stuffing_codes[bits - 1], bits); + } +} + + +/* pad bitstream to the next byte boundary + alway pad: even if currently at the byte boundary */ + +static void __inline +BitstreamPadAlways(Bitstream * const bs) +{ + int bits = 8 - (bs->pos % 8); + BitstreamPutBits(bs, stuffing_codes[bits - 1], bits); +} + + #endif /* _BITSTREAM_H_ */