📄 bitstream.h
字号:
#ifndef BITSTREAM_H#define BITSTREAM_H#include <systems.h>// next bit in forward direction// next bit in reverse direction |// v v// | | | | | | | | | | | | | | | | | | | | | | | | | | |1|1|1|1|1|1| */// ^ ^// | bit_number = 1// bfr_size = 6typedef struct{ uint32_t bfr; /* bfr = buffer for bits */ int bit_number; /* position of pointer in bfr */ int bfr_size; /* number of bits in bfr. Should always be a multiple of 8 *//* If the input ptr is true, data is read from it instead of the demuxer. */ unsigned char *input_ptr; unsigned char *orig_ptr; long buflen;} mpeg3_bits_t;/* ======================================================================== *//* Entry Points *//* ======================================================================== */mpeg3_bits_t *mpeg3bits_new_stream(void);static __inline int mpeg3bits_error (mpeg3_bits_t *stream){ return 0;}static __inline int mpeg3bits_eof (mpeg3_bits_t *stream){ long diff = stream->input_ptr - stream->orig_ptr; return (diff >= stream->buflen);}/* Read bytes backward from the file until the reverse_bits is full. */static __inline void mpeg3bits_fill_reverse_bits(mpeg3_bits_t* stream, int bits){// Right justify while(stream->bit_number > 7) { stream->bfr >>= 8; stream->bfr_size -= 8; stream->bit_number -= 8; }// Insert bytes before bfr_size while(stream->bfr_size - stream->bit_number < bits) { stream->bfr |= (unsigned int)(*--stream->input_ptr) << stream->bfr_size; if (stream->input_ptr < stream->orig_ptr) { printf("fill reverse past begin\n"); } stream->bfr_size += 8; }}/* Read bytes forward from the file until the forward_bits is full. */static __inline void mpeg3bits_fill_bits(mpeg3_bits_t* stream, int bits){ while(stream->bit_number < bits) { stream->bfr <<= 8; stream->bfr |= *stream->input_ptr++; stream->bit_number += 8; stream->bfr_size += 8; if(stream->bfr_size > 32) stream->bfr_size = 32; }}/* Return 8 bits, advancing the file position. */static __inline unsigned int mpeg3bits_getbyte_noptr(mpeg3_bits_t* stream){ if(stream->bit_number < 8) { stream->bfr <<= 8; stream->bfr |= *stream->input_ptr++; stream->bfr_size += 8; if(stream->bfr_size > 32) stream->bfr_size = 32; return (stream->bfr >> stream->bit_number) & 0xff; } return (stream->bfr >> (stream->bit_number -= 8)) & 0xff;}static __inline unsigned int mpeg3bits_getbit_noptr(mpeg3_bits_t* stream){ if(!stream->bit_number) { stream->bfr <<= 8; stream->bfr |= *stream->input_ptr++; stream->bfr_size += 8; if(stream->bfr_size > 32) stream->bfr_size = 32; stream->bit_number = 7; return (stream->bfr >> 7) & 0x1; } return (stream->bfr >> (--stream->bit_number)) & (0x1);}/* Return n number of bits, advancing the file position. *//* Use in place of flushbits */static __inline unsigned int mpeg3bits_getbits(mpeg3_bits_t* stream, int bits){ if(bits <= 0) return 0; mpeg3bits_fill_bits(stream, bits); return (stream->bfr >> (stream->bit_number -= bits)) & (0xffffffff >> (32 - bits));}static __inline unsigned int mpeg3bits_showbits24_noptr(mpeg3_bits_t* stream){ while(stream->bit_number < 24) { stream->bfr <<= 8; stream->bfr |= *stream->input_ptr++; stream->bit_number += 8; stream->bfr_size += 8; if(stream->bfr_size > 32) stream->bfr_size = 32; } return (stream->bfr >> (stream->bit_number - 24)) & 0xffffff;}static __inline unsigned int mpeg3bits_showbits32_noptr(mpeg3_bits_t* stream){ while(stream->bit_number < 32) { stream->bfr <<= 8; stream->bfr |= *stream->input_ptr++; stream->bit_number += 8; stream->bfr_size += 8; if(stream->bfr_size > 32) stream->bfr_size = 32; } return stream->bfr;}static __inline unsigned int mpeg3bits_showbits(mpeg3_bits_t* stream, int bits){ mpeg3bits_fill_bits(stream, bits); return (stream->bfr >> (stream->bit_number - bits)) & (0xffffffff >> (32 - bits));}#if 0static __inline unsigned int mpeg3bits_getbits_reverse(mpeg3_bits_t* stream, int bits){ unsigned int result; mpeg3bits_fill_reverse_bits(stream, bits); result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits)); stream->bit_number += bits; return result;}static __inline unsigned int mpeg3bits_showbits_reverse(mpeg3_bits_t* stream, int bits){ unsigned int result; mpeg3bits_fill_reverse_bits(stream, bits); result = (stream->bfr >> stream->bit_number) & (0xffffffff >> (32 - bits)); return result;}#endif#ifdef __cplusplusextern "C" {#endifint mpeg3bits_use_ptr_len(mpeg3_bits_t *stream, unsigned char *buffer, long buflen);#ifdef __cplusplus}#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -