Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1905 | serge | 1 | /* |
2 | getbits |
||
3 | |||
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 |
||
7 | |||
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. |
||
10 | */ |
||
11 | |||
12 | #ifndef _MPG123_GETBITS_H_ |
||
13 | #define _MPG123_GETBITS_H_ |
||
14 | |||
15 | #include "mpg123lib_intern.h" |
||
16 | |||
17 | #define backbits(fr,nob) ((void)( \ |
||
18 | fr->bitindex -= nob, \ |
||
19 | fr->wordpointer += (fr->bitindex>>3), \ |
||
20 | fr->bitindex &= 0x7 )) |
||
21 | |||
22 | #define getbitoffset(fr) ((-fr->bitindex)&0x7) |
||
23 | #define getbyte(fr) (*fr->wordpointer++) |
||
24 | |||
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],\ |
||
28 | fr->ultmp <<= 8, \ |
||
29 | fr->ultmp |= fr->wordpointer[1], \ |
||
30 | fr->ultmp <<= 8, \ |
||
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), \ |
||
37 | fr->bitindex &= 7, \ |
||
38 | fr->ultmp) |
||
39 | |||
40 | static unsigned int getbits(mpg123_handle *fr, int number_of_bits) |
||
41 | { |
||
42 | unsigned long rval; |
||
43 | |||
44 | #ifdef DEBUG_GETBITS |
||
45 | fprintf(stderr,"g%d",number_of_bits); |
||
46 | #endif |
||
47 | |||
48 | /* This is actually slow: if(!number_of_bits) |
||
49 | return 0; */ |
||
50 | |||
51 | #if 0 |
||
52 | check_buffer_range(number_of_bits+fr->bitindex); |
||
53 | #endif |
||
54 | |||
55 | { |
||
56 | rval = fr->wordpointer[0]; |
||
57 | rval <<= 8; |
||
58 | rval |= fr->wordpointer[1]; |
||
59 | rval <<= 8; |
||
60 | rval |= fr->wordpointer[2]; |
||
61 | |||
62 | rval <<= fr->bitindex; |
||
63 | rval &= 0xffffff; |
||
64 | |||
65 | fr->bitindex += number_of_bits; |
||
66 | |||
67 | rval >>= (24-number_of_bits); |
||
68 | |||
69 | fr->wordpointer += (fr->bitindex>>3); |
||
70 | fr->bitindex &= 7; |
||
71 | } |
||
72 | |||
73 | #ifdef DEBUG_GETBITS |
||
74 | fprintf(stderr,":%lx\n",rval); |
||
75 | #endif |
||
76 | |||
77 | return rval; |
||
78 | } |
||
79 | |||
80 | |||
81 | #define skipbits(fr, nob) fr->ultmp = ( \ |
||
82 | fr->ultmp = fr->wordpointer[0], fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[1], \ |
||
83 | fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[2], fr->ultmp <<= fr->bitindex, \ |
||
84 | fr->ultmp &= 0xffffff, fr->bitindex += nob, \ |
||
85 | fr->ultmp >>= (24-nob), fr->wordpointer += (fr->bitindex>>3), \ |
||
86 | fr->bitindex &= 7 ) |
||
87 | |||
88 | #define getbits_fast(fr, nob) ( \ |
||
89 | fr->ultmp = (unsigned char) (fr->wordpointer[0] << fr->bitindex), \ |
||
90 | fr->ultmp |= ((unsigned long) fr->wordpointer[1]< |
||
91 | fr->ultmp <<= nob, fr->ultmp >>= 8, \ |
||
92 | fr->bitindex += nob, fr->wordpointer += (fr->bitindex>>3), \ |
||
93 | fr->bitindex &= 7, fr->ultmp ) |
||
94 | |||
95 | #define get1bit(fr) ( \ |
||
96 | fr->uctmp = *fr->wordpointer << fr->bitindex, fr->bitindex++, \ |
||
97 | fr->wordpointer += (fr->bitindex>>3), fr->bitindex &= 7, fr->uctmp>>7 ) |
||
98 | |||
99 | |||
100 | #endif><>=><=> |