bs.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #ifndef _BS_H_
  2. #define _BS_H_
  3. #include <stdio.h>
  4. #include <stdint.h>
  5. typedef struct bs_s
  6. {
  7. uint8_t *p_start; // 缓冲区首地址
  8. uint8_t *p; // 缓冲区当前的读写指针
  9. uint8_t *p_end; // 缓冲区尾地址
  10. uint8_t i_left; // p所指字节当前还有多少比特可读写
  11. uint8_t i_bits_encoded; // RD only
  12. } bs_t;
  13. //使用p_data指向的i_data个字节作为缓冲区初始化比特流s
  14. void bs_init( bs_t *s, void *p_data, int i_data)
  15. {
  16. s->p_start = (uint8_t*)p_data;
  17. s->p = (uint8_t*)p_data;
  18. s->p_end = s->p + i_data;
  19. s->i_left = 8;
  20. }
  21. //从比特流s中读出i_count个比特的值并返回
  22. static uint32_t bs_read( bs_t *s, int i_count)
  23. {
  24. static uint32_t i_mask[33] ={
  25. 0x00,
  26. 0x01, 0x03, 0x07, 0x0f,
  27. 0x1f, 0x3f, 0x7f, 0xff,
  28. 0x1ff, 0x3ff, 0x7ff, 0xfff,
  29. 0x1fff, 0x3fff, 0x7fff, 0xffff,
  30. 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff,
  31. 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff,
  32. 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff,
  33. 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff
  34. };
  35. int i_shr = 0;
  36. uint32_t u_shr = 0;
  37. uint32_t i_result = 0;
  38. while( i_count > 0 ){
  39. if( s->p >= s->p_end ){
  40. break;
  41. }
  42. if( ( i_shr = s->i_left - i_count ) >= 0 ){
  43. /* more in the buffer than requested */
  44. u_shr = i_shr;
  45. i_result |= ( *s->p >> u_shr )&i_mask[i_count];
  46. s->i_left -= i_count;
  47. if( s->i_left == 0 )
  48. {
  49. s->p++;
  50. s->i_left = 8;
  51. }
  52. return( i_result );
  53. }
  54. else
  55. {
  56. /* less in the buffer than requested */
  57. u_shr = -i_shr;
  58. i_result |= (*s->p&i_mask[s->i_left]) << u_shr;
  59. i_count -= s->i_left;
  60. s->p++;
  61. s->i_left = 8;
  62. }
  63. }
  64. return(i_result);
  65. }
  66. //从比特流s中读出1个比特并返回
  67. static uint32_t bs_read1( bs_t *s)
  68. {
  69. if( s->p < s->p_end )
  70. {
  71. uint32_t i_result;
  72. s->i_left--;
  73. i_result = ( *s->p >> s->i_left )&0x01;
  74. if( s->i_left == 0 )
  75. {
  76. s->p++;
  77. s->i_left = 8;
  78. }
  79. return i_result;
  80. }
  81. return 0;
  82. }
  83. static int bs_read_ue( bs_t *s)
  84. {
  85. uint8_t i = 0;
  86. while( bs_read1( s ) == 0 && s->p < s->p_end && i < 32 )
  87. {
  88. i++;
  89. }
  90. return( ( 1 << i) - 1 + bs_read(s,i));
  91. }
  92. #endif