b250b6ca3da0ef16be50f4786e43ba9da9cd6f54
4 copyright ?-2009 by the mpg123 project - free software under the terms of the LGPL 2.1
5 see COPYING and AUTHORS files in distribution or http://mpg123.org
6 initially written by Michael Hipp
8 All code is in the header to suggest/force inlining of these small often-used functions.
9 This indeed has some impact on performance.
12 #ifndef _MPG123_GETBITS_H_
13 #define _MPG123_GETBITS_H_
15 #include "mpg123lib_intern.h"
17 #define backbits(fr,nob) ((void)( \
18 fr->bitindex -= nob, \
19 fr->wordpointer += (fr->bitindex>>3), \
20 fr->bitindex &= 0x7 ))
22 #define getbitoffset(fr) ((-fr->bitindex)&0x7)
23 #define getbyte(fr) (*fr->wordpointer++)
25 /* There is something wrong with that macro... the function below works also for the layer1 test case. */
26 #define macro_getbits(fr, nob) ( \
27 fr->ultmp = fr->wordpointer[0],\
29 fr->ultmp |= fr->wordpointer[1], \
31 fr->ultmp |= fr->wordpointer[2], \
32 fr->ultmp <<= fr->bitindex, \
33 fr->ultmp &= 0xffffff, \
34 fr->bitindex += nob, \
35 fr->ultmp >>= (24-nob), \
36 fr->wordpointer += (fr->bitindex>>3), \
40 static unsigned int getbits(mpg123_handle
*fr
, int number_of_bits
)
45 fprintf(stderr
,"g%d",number_of_bits
);
47 /* Safety catch until we got the nasty code fully figured out. */
48 if( (long)(fr
->wordpointer
-fr
->bsbuf
)*8
49 + fr
->bitindex
+number_of_bits
> (long)fr
->framesize
*8 )
51 /* This is actually slow: if(!number_of_bits)
55 check_buffer_range(number_of_bits
+fr
->bitindex
);
59 rval
= fr
->wordpointer
[0];
61 rval
|= fr
->wordpointer
[1];
63 rval
|= fr
->wordpointer
[2];
65 rval
<<= fr
->bitindex
;
68 fr
->bitindex
+= number_of_bits
;
70 rval
>>= (24-number_of_bits
);
72 fr
->wordpointer
+= (fr
->bitindex
>>3);
77 fprintf(stderr
,":%lx\n",rval
);
84 #define skipbits(fr, nob) fr->ultmp = ( \
85 fr->ultmp = fr->wordpointer[0], fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[1], \
86 fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[2], fr->ultmp <<= fr->bitindex, \
87 fr->ultmp &= 0xffffff, fr->bitindex += nob, \
88 fr->ultmp >>= (24-nob), fr->wordpointer += (fr->bitindex>>3), \
91 #define getbits_fast(fr, nob) ( \
92 fr->ultmp = (unsigned char) (fr->wordpointer[0] << fr->bitindex), \
93 fr->ultmp |= ((unsigned long) fr->wordpointer[1]<<fr->bitindex)>>8, \
94 fr->ultmp <<= nob, fr->ultmp >>= 8, \
95 fr->bitindex += nob, fr->wordpointer += (fr->bitindex>>3), \
96 fr->bitindex &= 7, fr->ultmp )
98 #define get1bit(fr) ( \
99 fr->uctmp = *fr->wordpointer << fr->bitindex, fr->bitindex++, \
100 fr->wordpointer += (fr->bitindex>>3), fr->bitindex &= 7, fr->uctmp>>7 )