123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #ifndef _BS_H_
- #define _BS_H_
- #include <stdio.h>
- #include <stdint.h>
- typedef struct bs_s
- {
- uint8_t *p_start; // 缓冲区首地址
- uint8_t *p; // 缓冲区当前的读写指针
- uint8_t *p_end; // 缓冲区尾地址
- uint8_t i_left; // p所指字节当前还有多少比特可读写
- uint8_t i_bits_encoded; // RD only
- } bs_t;
- //使用p_data指向的i_data个字节作为缓冲区初始化比特流s
- void bs_init( bs_t *s, void *p_data, int i_data)
- {
- s->p_start = (uint8_t*)p_data;
- s->p = (uint8_t*)p_data;
- s->p_end = s->p + i_data;
- s->i_left = 8;
- }
-
- //从比特流s中读出i_count个比特的值并返回
- static uint32_t bs_read( bs_t *s, int i_count)
- {
- static uint32_t i_mask[33] ={
- 0x00,
- 0x01, 0x03, 0x07, 0x0f,
- 0x1f, 0x3f, 0x7f, 0xff,
- 0x1ff, 0x3ff, 0x7ff, 0xfff,
- 0x1fff, 0x3fff, 0x7fff, 0xffff,
- 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff,
- 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
- 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff,
- 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff
- };
- int i_shr = 0;
- uint32_t u_shr = 0;
- uint32_t i_result = 0;
- while( i_count > 0 ){
- if( s->p >= s->p_end ){
- break;
- }
- if( ( i_shr = s->i_left - i_count ) >= 0 ){
- /* more in the buffer than requested */
- u_shr = i_shr;
- i_result |= ( *s->p >> u_shr )&i_mask[i_count];
- s->i_left -= i_count;
- if( s->i_left == 0 )
- {
- s->p++;
- s->i_left = 8;
- }
- return( i_result );
- }
- else
- {
- /* less in the buffer than requested */
- u_shr = -i_shr;
- i_result |= (*s->p&i_mask[s->i_left]) << u_shr;
- i_count -= s->i_left;
- s->p++;
- s->i_left = 8;
- }
- }
- return(i_result);
- }
- //从比特流s中读出1个比特并返回
- static uint32_t bs_read1( bs_t *s)
- {
- if( s->p < s->p_end )
- {
- uint32_t i_result;
- s->i_left--;
- i_result = ( *s->p >> s->i_left )&0x01;
- if( s->i_left == 0 )
- {
- s->p++;
- s->i_left = 8;
- }
- return i_result;
- }
- return 0;
- }
- static int bs_read_ue( bs_t *s)
- {
- uint8_t i = 0;
- while( bs_read1( s ) == 0 && s->p < s->p_end && i < 32 )
- {
- i++;
- }
- return( ( 1 << i) - 1 + bs_read(s,i));
- }
- #endif
|