b250b6ca3da0ef16be50f4786e43ba9da9cd6f54
[reactos.git] / sdk / include / reactos / libs / libmpg123 / getbits.h
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 /* 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 )
50 return 0;
51 /* This is actually slow: if(!number_of_bits)
52 return 0; */
53
54 #if 0
55 check_buffer_range(number_of_bits+fr->bitindex);
56 #endif
57
58 {
59 rval = fr->wordpointer[0];
60 rval <<= 8;
61 rval |= fr->wordpointer[1];
62 rval <<= 8;
63 rval |= fr->wordpointer[2];
64
65 rval <<= fr->bitindex;
66 rval &= 0xffffff;
67
68 fr->bitindex += number_of_bits;
69
70 rval >>= (24-number_of_bits);
71
72 fr->wordpointer += (fr->bitindex>>3);
73 fr->bitindex &= 7;
74 }
75
76 #ifdef DEBUG_GETBITS
77 fprintf(stderr,":%lx\n",rval);
78 #endif
79
80 return rval;
81 }
82
83
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), \
89 fr->bitindex &= 7 )
90
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 )
97
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 )
101
102
103 #endif