Mercurial > mplayer.hg
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 |