getbits.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "mpg123.h"
  2. #include "common.h"
  3. #if 0
  4. static void check_buffer_range(int size)
  5. {
  6. int pos = (bsi->wordpointer-bsbuf) + (size>>3);
  7. if( pos >= fsizeold) {
  8. fprintf(stderr,"Pointer out of range (%d,%d)!\n",pos,fsizeold);
  9. }
  10. }
  11. #endif
  12. void backbits(struct bitstream_info *bsi,int number_of_bits)
  13. {
  14. bsi->bitindex -= number_of_bits;
  15. bsi->wordpointer += (bsi->bitindex>>3);
  16. bsi->bitindex &= 0x7;
  17. }
  18. int getbitoffset(struct bitstream_info *bsi)
  19. {
  20. return (-bsi->bitindex)&0x7;
  21. }
  22. int getbyte(struct bitstream_info *bsi)
  23. {
  24. #ifdef DEBUG_GETBITS
  25. if(bsi->bitindex)
  26. fprintf(stderr,"getbyte called unsynched!\n");
  27. #endif
  28. return *bsi->wordpointer++;
  29. }
  30. unsigned int getbits(struct bitstream_info *bsi,int number_of_bits)
  31. {
  32. unsigned long rval;
  33. #ifdef DEBUG_GETBITS
  34. fprintf(stderr,"g%d",number_of_bits);
  35. #endif
  36. if(!number_of_bits)
  37. return 0;
  38. #if 0
  39. check_buffer_range(number_of_bits+bsi->bitindex);
  40. #endif
  41. {
  42. rval = bsi->wordpointer[0];
  43. rval <<= 8;
  44. rval |= bsi->wordpointer[1];
  45. rval <<= 8;
  46. rval |= bsi->wordpointer[2];
  47. rval <<= bsi->bitindex;
  48. rval &= 0xffffff;
  49. bsi->bitindex += number_of_bits;
  50. rval >>= (24-number_of_bits);
  51. bsi->wordpointer += (bsi->bitindex>>3);
  52. bsi->bitindex &= 7;
  53. }
  54. #ifdef DEBUG_GETBITS
  55. fprintf(stderr,":%x ",rval);
  56. #endif
  57. return rval;
  58. }
  59. unsigned int getbits_fast(struct bitstream_info *bsi,int number_of_bits)
  60. {
  61. unsigned int rval;
  62. #ifdef DEBUG_GETBITS
  63. fprintf(stderr,"g%d",number_of_bits);
  64. #endif
  65. #if 0
  66. check_buffer_range(number_of_bits+bsi->bitindex);
  67. #endif
  68. rval = (unsigned char) (bsi->wordpointer[0] << bsi->bitindex);
  69. rval |= ((unsigned int) bsi->wordpointer[1]<<bsi->bitindex)>>8;
  70. rval <<= number_of_bits;
  71. rval >>= 8;
  72. bsi->bitindex += number_of_bits;
  73. bsi->wordpointer += (bsi->bitindex>>3);
  74. bsi->bitindex &= 7;
  75. #ifdef DEBUG_GETBITS
  76. fprintf(stderr,":%x ",rval);
  77. #endif
  78. return rval;
  79. }
  80. unsigned int get1bit(struct bitstream_info *bsi)
  81. {
  82. unsigned char rval;
  83. #ifdef DEBUG_GETBITS
  84. fprintf(stderr,"g%d",1);
  85. #endif
  86. #if 0
  87. check_buffer_range(1+bsi->bitindex);
  88. #endif
  89. rval = *(bsi->wordpointer) << bsi->bitindex;
  90. bsi->bitindex++;
  91. bsi->wordpointer += (bsi->bitindex>>3);
  92. bsi->bitindex &= 7;
  93. #ifdef DEBUG_GETBITS
  94. fprintf(stderr,":%d ",rval>>7);
  95. #endif
  96. return rval>>7;
  97. }