--- bitstream.h 2002/06/14 13:25:07 1.7 +++ bitstream.h 2002/11/07 10:28:15 1.10.2.3 @@ -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 * @@ -80,6 +82,15 @@ //#define VIDOBJLAY_TYPE_SIMPLE_SCALABLE 2 #define VIDOBJLAY_TYPE_CORE 3 #define VIDOBJLAY_TYPE_MAIN 4 +//#define VIDOBJLAY_TYPE_NBIT 5 +//#define VIDOBJLAY_TYPE_ANIM_TEXT 6 +//#define VIDOBJLAY_TYPE_ANIM_MESH 7 +//#define VIDOBJLAY_TYPE_SIMPLE_FACE 8 +//#define VIDOBJLAY_TYPE_STILL_SCALABLE 9 +#define VIDOBJLAY_TYPE_ART_SIMPLE 10 +//#define VIDOBJLAY_TYPE_CORE_SCALABLE 11 +#define VIDOBJLAY_TYPE_ACE 12 +//#define VIDOBJLAY_TYPE_SIMPLE_FBA 13 //#define VIDOBJLAY_AR_SQUARE 1 @@ -95,6 +106,12 @@ #define VIDOBJLAY_SHAPE_BINARY_ONLY 2 #define VIDOBJLAY_SHAPE_GRAYSCALE 3 + +#define SPRITE_NONE 0 +#define SPRITE_STATIC 1 +#define SPRITE_GMC 2 + + #define VO_START_CODE 0x8 #define VOL_START_CODE 0x12 #define VOP_START_CODE 0x1b6 @@ -110,24 +127,44 @@ #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, + DECODER * dec, + const int addbits, + int * quant, + int * fcode_forward, + int * fcode_backward, + int * intra_dc_threshold); + // header stuff int BitstreamReadHeaders(Bitstream * bs, DECODER * dec, uint32_t * rounding, + uint32_t * reduced_resolution, uint32_t * quant, uint32_t * fcode_forward, uint32_t * fcode_backward, - uint32_t * intra_dc_threshold); + uint32_t * intra_dc_threshold, + VECTOR * gmc_mv); 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 +262,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 @@ -292,19 +359,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 +421,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_ */