8eff00ed694abbd5207ed34a986eec98d426534c
[reactos.git] / reactos / 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
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]<<fr->bitindex)>>8, \
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