comparison libfaad2/bits.h @ 12527:4a370c80fe5c

update to the 2.0 release of faad, patch by adland
author diego
date Wed, 02 Jun 2004 22:59:04 +0000
parents 3185f64f6350
children d81145997036
comparison
equal deleted inserted replaced
12526:e183ad37d24c 12527:4a370c80fe5c
1 /* 1 /*
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding 2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
4 ** 4 **
5 ** This program is free software; you can redistribute it and/or modify 5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by 6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or 7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version. 8 ** (at your option) any later version.
54 uint32_t *start; 54 uint32_t *start;
55 void *buffer; 55 void *buffer;
56 } bitfile; 56 } bitfile;
57 57
58 58
59 #if defined (_WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) 59 #if defined (_WIN32) && !defined(_WIN32_WCE) && !defined(__MINGW32__)
60 #define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax 60 #define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax
61 #elif defined(ARCH_X86) && (defined(DJGPP) || defined(__GNUC__)) 61 #elif defined(LINUX) || defined(DJGPP)
62 #define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) ) 62 #define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) )
63 #else 63 #else
64 #define BSWAP(a) \ 64 #define BSWAP(a) \
65 ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff)) 65 ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff))
66 #endif 66 #endif
69 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 69 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF,
70 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 70 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF,
71 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 71 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF,
72 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 72 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF,
73 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF 73 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF
74 /* added bitmask 32, correct?!?!?! */
75 , 0xFFFFFFFF
74 }; 76 };
75 77
76 void faad_initbits(bitfile *ld, void *buffer, uint32_t buffer_size); 78 void faad_initbits(bitfile *ld, const void *buffer, const uint32_t buffer_size);
77 void faad_endbits(bitfile *ld); 79 void faad_endbits(bitfile *ld);
78 void faad_initbits_rev(bitfile *ld, void *buffer, 80 void faad_initbits_rev(bitfile *ld, void *buffer,
79 uint32_t bits_in_buffer); 81 uint32_t bits_in_buffer);
80 uint8_t faad_byte_align(bitfile *ld); 82 uint8_t faad_byte_align(bitfile *ld);
81 uint32_t faad_get_processed_bits(bitfile *ld); 83 uint32_t faad_get_processed_bits(bitfile *ld);
82 void faad_flushbits_ex(bitfile *ld, uint32_t bits); 84 void faad_flushbits_ex(bitfile *ld, uint32_t bits);
83 void faad_rewindbits(bitfile *ld); 85 void faad_rewindbits(bitfile *ld);
84 uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits 86 uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
85 DEBUGDEC); 87 DEBUGDEC);
88 #ifdef DRM
89 void *faad_origbitbuffer(bitfile *ld);
90 uint32_t faad_origbitbuffer_size(bitfile *ld);
91 #endif
86 92
87 /* circumvent memory alignment errors on ARM */ 93 /* circumvent memory alignment errors on ARM */
88 static INLINE uint32_t getdword(void *mem) 94 static INLINE uint32_t getdword(void *mem)
89 { 95 {
90 #ifdef ARM 96 #ifdef ARM
91 uint32_t tmp; 97 uint32_t tmp;
98 #ifndef ARCH_IS_BIG_ENDIAN
99 ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[3];
100 ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2];
101 ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1];
102 ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0];
103 #else
92 ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0]; 104 ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0];
93 ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1]; 105 ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1];
94 ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2]; 106 ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2];
95 ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3]; 107 ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3];
108 #endif
96 109
97 return tmp; 110 return tmp;
98 #else 111 #else
99 return *(uint32_t*)mem; 112 uint32_t tmp;
113 tmp = *(uint32_t*)mem;
114 #ifndef ARCH_IS_BIG_ENDIAN
115 BSWAP(tmp);
116 #endif
117 return tmp;
100 #endif 118 #endif
101 } 119 }
102 120
103 static INLINE uint32_t faad_showbits(bitfile *ld, uint32_t bits) 121 static INLINE uint32_t faad_showbits(bitfile *ld, uint32_t bits)
104 { 122 {
105 if (bits <= ld->bits_left) 123 if (bits <= ld->bits_left)
106 { 124 {
107 return (ld->bufa >> (ld->bits_left - bits)) & bitmask[bits]; 125 return (ld->bufa >> (ld->bits_left - bits)) & bitmask[bits];
108 } 126 }
109 127
110 bits -= ld->bits_left; 128 bits -= ld->bits_left;
111 return ((ld->bufa & bitmask[ld->bits_left]) << bits) | (ld->bufb >> (32 - bits)); 129 return ((ld->bufa & bitmask[ld->bits_left]) << bits) | (ld->bufb >> (32 - bits));
112 } 130 }
113 131
114 static INLINE void faad_flushbits(bitfile *ld, uint32_t bits) 132 static INLINE void faad_flushbits(bitfile *ld, uint32_t bits)
115 { 133 {
116 /* do nothing if error */ 134 /* do nothing if error */
146 164
147 static INLINE uint8_t faad_get1bit(bitfile *ld DEBUGDEC) 165 static INLINE uint8_t faad_get1bit(bitfile *ld DEBUGDEC)
148 { 166 {
149 uint8_t r; 167 uint8_t r;
150 168
151 if (ld->bits_left == 0) 169 if (ld->bits_left > 0)
152 return (uint8_t)faad_getbits(ld, 1 DEBUGVAR(print,var,dbg)); 170 {
153 171 ld->bits_left--;
154 ld->bits_left--; 172 r = (uint8_t)((ld->bufa >> ld->bits_left) & 1);
155 r = (uint8_t)((ld->bufa >> ld->bits_left) & 1); 173 return r;
156 174 }
175
176 /* bits_left == 0 */
177 #if 0
178 r = (uint8_t)(ld->bufb >> 31);
179 faad_flushbits_ex(ld, 1);
180 #else
181 r = (uint8_t)faad_getbits(ld, 1);
182 #endif
157 return r; 183 return r;
158 } 184 }
159 185
160 /* reversed bitreading routines */ 186 /* reversed bitreading routines */
161 static INLINE uint32_t faad_showbits_rev(bitfile *ld, uint32_t bits) 187 static INLINE uint32_t faad_showbits_rev(bitfile *ld, uint32_t bits)
198 } else { 224 } else {
199 uint32_t tmp; 225 uint32_t tmp;
200 226
201 ld->bufa = ld->bufb; 227 ld->bufa = ld->bufb;
202 tmp = getdword(ld->start); 228 tmp = getdword(ld->start);
203 #ifndef ARCH_IS_BIG_ENDIAN
204 BSWAP(tmp);
205 #endif
206 ld->bufb = tmp; 229 ld->bufb = tmp;
207 ld->start--; 230 ld->start--;
208 ld->bits_left += (32 - bits); 231 ld->bits_left += (32 - bits);
209 232
210 ld->bytes_used += 4; 233 ld->bytes_used += 4;
246 /* CRC polynome used x^8 + x^4 + x^3 + x^2 +1 */ 269 /* CRC polynome used x^8 + x^4 + x^3 + x^2 +1 */
247 #define GPOLY 0435 270 #define GPOLY 0435
248 271
249 faad_rewindbits(ld); 272 faad_rewindbits(ld);
250 273
251 CRC = ~faad_getbits(ld, 8 274 CRC = (uint8_t) ~faad_getbits(ld, 8
252 DEBUGVAR(1,999,"faad_check_CRC(): CRC")); /* CRC is stored inverted */ 275 DEBUGVAR(1,999,"faad_check_CRC(): CRC")); /* CRC is stored inverted */
253 276
254 for (; len>0; len--) 277 for (; len>0; len--)
255 { 278 {
256 r = ( (r << 1) ^ (( ( faad_get1bit(ld 279 r = ( (r << 1) ^ (( ( faad_get1bit(ld