/src/mpg123/src/libmpg123/getbits.h
Line | Count | Source (jump to first uncovered line) |
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 | | #include "../common/debug.h" |
17 | | |
18 | 65.0k | #define backbits(fr,nob) ((void)( \ |
19 | 65.0k | fr->bits_avail += nob, \ |
20 | 65.0k | fr->bitindex -= nob, \ |
21 | 65.0k | fr->wordpointer += (fr->bitindex>>3), \ |
22 | 65.0k | fr->bitindex &= 0x7 )) |
23 | | |
24 | 49.2k | #define getbitoffset(fr) ((-fr->bitindex)&0x7) |
25 | | /* Precomputing the bytes to be read is error-prone, and some over-read |
26 | | is even expected for Huffman. Just play safe and return zeros in case |
27 | | of overflow. This assumes you made bitindex zero already! */ |
28 | 4.32M | #define getbyte(fr) ( (fr)->bits_avail-=8, (fr)->bits_avail >= 0 \ |
29 | 4.32M | ? *((fr)->wordpointer++) \ |
30 | 4.32M | : 0 ) |
31 | | |
32 | | static unsigned int getbits(mpg123_handle *fr, int number_of_bits) |
33 | 38.6M | { |
34 | 38.6M | unsigned long rval; |
35 | | |
36 | | #ifdef DEBUG_GETBITS |
37 | | fprintf(stderr,"g%d",number_of_bits); |
38 | | #endif |
39 | 38.6M | fr->bits_avail -= number_of_bits; |
40 | | /* Safety catch until we got the nasty code fully figured out. */ |
41 | | /* No, that catch stays here, even if we think we got it figured out! */ |
42 | 38.6M | if(fr->bits_avail < 0) |
43 | 32.7M | { |
44 | 32.7M | if(NOQUIET) |
45 | 32.7M | error2( "Tried to read %i bits with %li available." |
46 | 32.7M | , number_of_bits, fr->bits_avail ); |
47 | 32.7M | return 0; |
48 | 32.7M | } |
49 | | /* This is actually slow: if(!number_of_bits) |
50 | | return 0; */ |
51 | | |
52 | | #if 0 |
53 | | check_buffer_range(number_of_bits+fr->bitindex); |
54 | | #endif |
55 | | |
56 | 5.90M | { |
57 | 5.90M | rval = fr->wordpointer[0]; |
58 | 5.90M | rval <<= 8; |
59 | 5.90M | rval |= fr->wordpointer[1]; |
60 | 5.90M | rval <<= 8; |
61 | 5.90M | rval |= fr->wordpointer[2]; |
62 | | |
63 | 5.90M | rval <<= fr->bitindex; |
64 | 5.90M | rval &= 0xffffff; |
65 | | |
66 | 5.90M | fr->bitindex += number_of_bits; |
67 | | |
68 | 5.90M | rval >>= (24-number_of_bits); |
69 | | |
70 | 5.90M | fr->wordpointer += (fr->bitindex>>3); |
71 | 5.90M | fr->bitindex &= 7; |
72 | 5.90M | } |
73 | | |
74 | | #ifdef DEBUG_GETBITS |
75 | | fprintf(stderr,":%lx\n",rval); |
76 | | #endif |
77 | | |
78 | 5.90M | return rval; |
79 | 38.6M | } Line | Count | Source | 33 | 148k | { | 34 | 148k | unsigned long rval; | 35 | | | 36 | | #ifdef DEBUG_GETBITS | 37 | | fprintf(stderr,"g%d",number_of_bits); | 38 | | #endif | 39 | 148k | fr->bits_avail -= number_of_bits; | 40 | | /* Safety catch until we got the nasty code fully figured out. */ | 41 | | /* No, that catch stays here, even if we think we got it figured out! */ | 42 | 148k | if(fr->bits_avail < 0) | 43 | 99.1k | { | 44 | 99.1k | if(NOQUIET) | 45 | 99.1k | error2( "Tried to read %i bits with %li available." | 46 | 99.1k | , number_of_bits, fr->bits_avail ); | 47 | 99.1k | return 0; | 48 | 99.1k | } | 49 | | /* This is actually slow: if(!number_of_bits) | 50 | | return 0; */ | 51 | | | 52 | | #if 0 | 53 | | check_buffer_range(number_of_bits+fr->bitindex); | 54 | | #endif | 55 | | | 56 | 49.3k | { | 57 | 49.3k | rval = fr->wordpointer[0]; | 58 | 49.3k | rval <<= 8; | 59 | 49.3k | rval |= fr->wordpointer[1]; | 60 | 49.3k | rval <<= 8; | 61 | 49.3k | rval |= fr->wordpointer[2]; | 62 | | | 63 | 49.3k | rval <<= fr->bitindex; | 64 | 49.3k | rval &= 0xffffff; | 65 | | | 66 | 49.3k | fr->bitindex += number_of_bits; | 67 | | | 68 | 49.3k | rval >>= (24-number_of_bits); | 69 | | | 70 | 49.3k | fr->wordpointer += (fr->bitindex>>3); | 71 | 49.3k | fr->bitindex &= 7; | 72 | 49.3k | } | 73 | | | 74 | | #ifdef DEBUG_GETBITS | 75 | | fprintf(stderr,":%lx\n",rval); | 76 | | #endif | 77 | | | 78 | 49.3k | return rval; | 79 | 148k | } |
Line | Count | Source | 33 | 733k | { | 34 | 733k | unsigned long rval; | 35 | | | 36 | | #ifdef DEBUG_GETBITS | 37 | | fprintf(stderr,"g%d",number_of_bits); | 38 | | #endif | 39 | 733k | fr->bits_avail -= number_of_bits; | 40 | | /* Safety catch until we got the nasty code fully figured out. */ | 41 | | /* No, that catch stays here, even if we think we got it figured out! */ | 42 | 733k | if(fr->bits_avail < 0) | 43 | 0 | { | 44 | 0 | if(NOQUIET) | 45 | 0 | error2( "Tried to read %i bits with %li available." | 46 | 0 | , number_of_bits, fr->bits_avail ); | 47 | 0 | return 0; | 48 | 0 | } | 49 | | /* This is actually slow: if(!number_of_bits) | 50 | | return 0; */ | 51 | | | 52 | | #if 0 | 53 | | check_buffer_range(number_of_bits+fr->bitindex); | 54 | | #endif | 55 | | | 56 | 733k | { | 57 | 733k | rval = fr->wordpointer[0]; | 58 | 733k | rval <<= 8; | 59 | 733k | rval |= fr->wordpointer[1]; | 60 | 733k | rval <<= 8; | 61 | 733k | rval |= fr->wordpointer[2]; | 62 | | | 63 | 733k | rval <<= fr->bitindex; | 64 | 733k | rval &= 0xffffff; | 65 | | | 66 | 733k | fr->bitindex += number_of_bits; | 67 | | | 68 | 733k | rval >>= (24-number_of_bits); | 69 | | | 70 | 733k | fr->wordpointer += (fr->bitindex>>3); | 71 | 733k | fr->bitindex &= 7; | 72 | 733k | } | 73 | | | 74 | | #ifdef DEBUG_GETBITS | 75 | | fprintf(stderr,":%lx\n",rval); | 76 | | #endif | 77 | | | 78 | 733k | return rval; | 79 | 733k | } |
Line | Count | Source | 33 | 36.8M | { | 34 | 36.8M | unsigned long rval; | 35 | | | 36 | | #ifdef DEBUG_GETBITS | 37 | | fprintf(stderr,"g%d",number_of_bits); | 38 | | #endif | 39 | 36.8M | fr->bits_avail -= number_of_bits; | 40 | | /* Safety catch until we got the nasty code fully figured out. */ | 41 | | /* No, that catch stays here, even if we think we got it figured out! */ | 42 | 36.8M | if(fr->bits_avail < 0) | 43 | 32.6M | { | 44 | 32.6M | if(NOQUIET) | 45 | 32.6M | error2( "Tried to read %i bits with %li available." | 46 | 32.6M | , number_of_bits, fr->bits_avail ); | 47 | 32.6M | return 0; | 48 | 32.6M | } | 49 | | /* This is actually slow: if(!number_of_bits) | 50 | | return 0; */ | 51 | | | 52 | | #if 0 | 53 | | check_buffer_range(number_of_bits+fr->bitindex); | 54 | | #endif | 55 | | | 56 | 4.27M | { | 57 | 4.27M | rval = fr->wordpointer[0]; | 58 | 4.27M | rval <<= 8; | 59 | 4.27M | rval |= fr->wordpointer[1]; | 60 | 4.27M | rval <<= 8; | 61 | 4.27M | rval |= fr->wordpointer[2]; | 62 | | | 63 | 4.27M | rval <<= fr->bitindex; | 64 | 4.27M | rval &= 0xffffff; | 65 | | | 66 | 4.27M | fr->bitindex += number_of_bits; | 67 | | | 68 | 4.27M | rval >>= (24-number_of_bits); | 69 | | | 70 | 4.27M | fr->wordpointer += (fr->bitindex>>3); | 71 | 4.27M | fr->bitindex &= 7; | 72 | 4.27M | } | 73 | | | 74 | | #ifdef DEBUG_GETBITS | 75 | | fprintf(stderr,":%lx\n",rval); | 76 | | #endif | 77 | | | 78 | 4.27M | return rval; | 79 | 36.8M | } |
Line | Count | Source | 33 | 853k | { | 34 | 853k | unsigned long rval; | 35 | | | 36 | | #ifdef DEBUG_GETBITS | 37 | | fprintf(stderr,"g%d",number_of_bits); | 38 | | #endif | 39 | 853k | fr->bits_avail -= number_of_bits; | 40 | | /* Safety catch until we got the nasty code fully figured out. */ | 41 | | /* No, that catch stays here, even if we think we got it figured out! */ | 42 | 853k | if(fr->bits_avail < 0) | 43 | 3.69k | { | 44 | 3.69k | if(NOQUIET) | 45 | 3.69k | error2( "Tried to read %i bits with %li available." | 46 | 3.69k | , number_of_bits, fr->bits_avail ); | 47 | 3.69k | return 0; | 48 | 3.69k | } | 49 | | /* This is actually slow: if(!number_of_bits) | 50 | | return 0; */ | 51 | | | 52 | | #if 0 | 53 | | check_buffer_range(number_of_bits+fr->bitindex); | 54 | | #endif | 55 | | | 56 | 849k | { | 57 | 849k | rval = fr->wordpointer[0]; | 58 | 849k | rval <<= 8; | 59 | 849k | rval |= fr->wordpointer[1]; | 60 | 849k | rval <<= 8; | 61 | 849k | rval |= fr->wordpointer[2]; | 62 | | | 63 | 849k | rval <<= fr->bitindex; | 64 | 849k | rval &= 0xffffff; | 65 | | | 66 | 849k | fr->bitindex += number_of_bits; | 67 | | | 68 | 849k | rval >>= (24-number_of_bits); | 69 | | | 70 | 849k | fr->wordpointer += (fr->bitindex>>3); | 71 | 849k | fr->bitindex &= 7; | 72 | 849k | } | 73 | | | 74 | | #ifdef DEBUG_GETBITS | 75 | | fprintf(stderr,":%lx\n",rval); | 76 | | #endif | 77 | | | 78 | 849k | return rval; | 79 | 853k | } |
|
80 | | |
81 | | |
82 | 723k | #define skipbits(fr, nob) fr->ultmp = ( \ |
83 | 723k | fr->ultmp = fr->wordpointer[0], fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[1], \ |
84 | 723k | fr->ultmp <<= 8, fr->ultmp |= fr->wordpointer[2], fr->ultmp <<= fr->bitindex, \ |
85 | 723k | fr->ultmp &= 0xffffff, fr->bitindex += nob, fr->bits_avail -= nob, \ |
86 | 723k | fr->ultmp >>= (24-nob), fr->wordpointer += (fr->bitindex>>3), \ |
87 | 723k | fr->bitindex &= 7 ) |
88 | | |
89 | 7.28M | #define getbits_fast(fr, nob) ( \ |
90 | 7.28M | fr->ultmp = (unsigned char) (fr->wordpointer[0] << fr->bitindex), \ |
91 | 7.28M | fr->ultmp |= ((unsigned long) fr->wordpointer[1]<<fr->bitindex)>>8, \ |
92 | 7.28M | fr->ultmp <<= nob, fr->ultmp >>= 8, \ |
93 | 7.28M | fr->bitindex += nob, fr->bits_avail -= nob, \ |
94 | 7.28M | fr->wordpointer += (fr->bitindex>>3), \ |
95 | 7.28M | fr->bitindex &= 7, fr->ultmp ) |
96 | | |
97 | 411k | #define get1bit(fr) ( \ |
98 | 411k | fr->uctmp = *fr->wordpointer << fr->bitindex, \ |
99 | 411k | ++fr->bitindex, --fr->bits_avail, \ |
100 | 411k | fr->wordpointer += (fr->bitindex>>3), fr->bitindex &= 7, fr->uctmp>>7 ) |
101 | | |
102 | | |
103 | | #endif |