MP3 Player without external hardware MP3 Player without external hardware. A software based MP3 player based on a modified version of libmad. Mono output (at the moment) via AnalogOut. Files are read from an USB drive. This is a demo program, it plays only one file at the moment. Documentation is in "main.cpp" and "config.h"
layer3.cpp
00001 /* 00002 * libmad - MPEG audio decoder library 00003 * Copyright (C) 2000-2004 Underbit Technologies, Inc. 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License as published by 00007 * the Free Software Foundation; either version 2 of the License, or 00008 * (at your option) any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program; if not, write to the Free Software 00017 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 * 00019 * $Id: layer3.c,v 1.1 2010/11/23 20:12:57 andy Exp $ 00020 */ 00021 00022 # include "config.h" 00023 00024 # include "global.h" 00025 00026 # include <stdlib.h> 00027 # include <string.h> 00028 00029 # ifdef HAVE_LIMITS_H 00030 # include <limits.h> 00031 # else 00032 # define CHAR_BIT 8 00033 # endif 00034 00035 # include "fixed.h" 00036 # include "bit.h" 00037 # include "stream.h" 00038 # include "frame.h" 00039 # include "huffman.h" 00040 # include "layer3.h" 00041 00042 /* --- Layer III ----------------------------------------------------------- */ 00043 00044 enum { 00045 count1table_select = 0x01, 00046 scalefac_scale = 0x02, 00047 preflag = 0x04, 00048 mixed_block_flag = 0x08 00049 }; 00050 00051 enum { 00052 I_STEREO = 0x1, 00053 MS_STEREO = 0x2 00054 }; 00055 00056 00057 struct channel { 00058 /* from side info */ 00059 unsigned short part2_3_length; 00060 unsigned short big_values; 00061 unsigned short global_gain; 00062 unsigned short scalefac_compress; 00063 00064 unsigned char flags; 00065 unsigned char block_type; 00066 unsigned char table_select[3]; 00067 unsigned char subblock_gain[3]; 00068 unsigned char region0_count; 00069 unsigned char region1_count; 00070 00071 /* from main_data */ 00072 unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */ 00073 }; 00074 struct granule { 00075 struct channel ch[2]; 00076 }; 00077 00078 00079 struct sideinfo { 00080 unsigned int main_data_begin; 00081 unsigned int private_bits; 00082 00083 unsigned char scfsi[2]; 00084 00085 struct granule gr[2]; 00086 }; 00087 00088 /* 00089 * scalefactor bit lengths 00090 * derived from section 2.4.2.7 of ISO/IEC 11172-3 00091 */ 00092 static 00093 struct { 00094 unsigned char slen1; 00095 unsigned char slen2; 00096 } const sflen_table[16] = { 00097 { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, 00098 { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, 00099 { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 }, 00100 { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 } 00101 }; 00102 00103 /* 00104 * number of LSF scalefactor band values 00105 * derived from section 2.4.3.2 of ISO/IEC 13818-3 00106 */ 00107 static 00108 unsigned char const nsfb_table[6][3][4] = { 00109 { { 6, 5, 5, 5 }, 00110 { 9, 9, 9, 9 }, 00111 { 6, 9, 9, 9 } }, 00112 00113 { { 6, 5, 7, 3 }, 00114 { 9, 9, 12, 6 }, 00115 { 6, 9, 12, 6 } }, 00116 00117 { { 11, 10, 0, 0 }, 00118 { 18, 18, 0, 0 }, 00119 { 15, 18, 0, 0 } }, 00120 00121 { { 7, 7, 7, 0 }, 00122 { 12, 12, 12, 0 }, 00123 { 6, 15, 12, 0 } }, 00124 00125 { { 6, 6, 6, 3 }, 00126 { 12, 9, 9, 6 }, 00127 { 6, 12, 9, 6 } }, 00128 00129 { { 8, 8, 5, 0 }, 00130 { 15, 12, 9, 0 }, 00131 { 6, 18, 9, 0 } } 00132 }; 00133 00134 /* 00135 * MPEG-1 scalefactor band widths 00136 * derived from Table B.8 of ISO/IEC 11172-3 00137 */ 00138 static 00139 unsigned char const sfb_48000_long[] = { 00140 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 00141 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192 00142 }; 00143 00144 static 00145 unsigned char const sfb_44100_long[] = { 00146 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 00147 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158 00148 }; 00149 00150 static 00151 unsigned char const sfb_32000_long[] = { 00152 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 00153 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26 00154 }; 00155 00156 static 00157 unsigned char const sfb_48000_short[] = { 00158 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 00159 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14, 00160 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 00161 }; 00162 00163 static 00164 unsigned char const sfb_44100_short[] = { 00165 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 00166 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 00167 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 00168 }; 00169 00170 static 00171 unsigned char const sfb_32000_short[] = { 00172 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 00173 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20, 00174 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 00175 }; 00176 00177 static 00178 unsigned char const sfb_48000_mixed[] = { 00179 /* long */ 4, 4, 4, 4, 4, 4, 6, 6, 00180 /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10, 00181 10, 10, 12, 12, 12, 14, 14, 14, 16, 16, 00182 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 00183 }; 00184 00185 static 00186 unsigned char const sfb_44100_mixed[] = { 00187 /* long */ 4, 4, 4, 4, 4, 4, 6, 6, 00188 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, 00189 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, 00190 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 00191 }; 00192 00193 static 00194 unsigned char const sfb_32000_mixed[] = { 00195 /* long */ 4, 4, 4, 4, 4, 4, 6, 6, 00196 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12, 00197 12, 12, 16, 16, 16, 20, 20, 20, 26, 26, 00198 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 00199 }; 00200 00201 /* 00202 * MPEG-2 scalefactor band widths 00203 * derived from Table B.2 of ISO/IEC 13818-3 00204 */ 00205 static 00206 unsigned char const sfb_24000_long[] = { 00207 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 00208 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 00209 }; 00210 00211 static 00212 unsigned char const sfb_22050_long[] = { 00213 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 00214 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 00215 }; 00216 00217 # define sfb_16000_long sfb_22050_long 00218 00219 static 00220 unsigned char const sfb_24000_short[] = { 00221 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 00222 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, 00223 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 00224 }; 00225 00226 static 00227 unsigned char const sfb_22050_short[] = { 00228 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 00229 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18, 00230 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 00231 }; 00232 00233 static 00234 unsigned char const sfb_16000_short[] = { 00235 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 00236 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, 00237 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 00238 }; 00239 00240 static 00241 unsigned char const sfb_24000_mixed[] = { 00242 /* long */ 6, 6, 6, 6, 6, 6, 00243 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, 00244 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, 00245 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 00246 }; 00247 00248 static 00249 unsigned char const sfb_22050_mixed[] = { 00250 /* long */ 6, 6, 6, 6, 6, 6, 00251 /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10, 00252 10, 10, 14, 14, 14, 18, 18, 18, 26, 26, 00253 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 00254 }; 00255 00256 static 00257 unsigned char const sfb_16000_mixed[] = { 00258 /* long */ 6, 6, 6, 6, 6, 6, 00259 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, 00260 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, 00261 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 00262 }; 00263 00264 /* 00265 * MPEG 2.5 scalefactor band widths 00266 * derived from public sources 00267 */ 00268 # define sfb_12000_long sfb_16000_long 00269 # define sfb_11025_long sfb_12000_long 00270 00271 static 00272 unsigned char const sfb_8000_long[] = { 00273 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 00274 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 00275 }; 00276 00277 # define sfb_12000_short sfb_16000_short 00278 # define sfb_11025_short sfb_12000_short 00279 00280 static 00281 unsigned char const sfb_8000_short[] = { 00282 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, 00283 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 00284 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 00285 }; 00286 00287 # define sfb_12000_mixed sfb_16000_mixed 00288 # define sfb_11025_mixed sfb_12000_mixed 00289 00290 /* the 8000 Hz short block scalefactor bands do not break after 00291 the first 36 frequency lines, so this is probably wrong */ 00292 static 00293 unsigned char const sfb_8000_mixed[] = { 00294 /* long */ 12, 12, 12, 00295 /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, 00296 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36, 00297 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 00298 }; 00299 00300 static 00301 struct { 00302 unsigned char const *l; 00303 unsigned char const *s; 00304 unsigned char const *m; 00305 } const sfbwidth_table[9] = { 00306 { sfb_48000_long, sfb_48000_short, sfb_48000_mixed }, 00307 { sfb_44100_long, sfb_44100_short, sfb_44100_mixed }, 00308 { sfb_32000_long, sfb_32000_short, sfb_32000_mixed }, 00309 { sfb_24000_long, sfb_24000_short, sfb_24000_mixed }, 00310 { sfb_22050_long, sfb_22050_short, sfb_22050_mixed }, 00311 { sfb_16000_long, sfb_16000_short, sfb_16000_mixed }, 00312 { sfb_12000_long, sfb_12000_short, sfb_12000_mixed }, 00313 { sfb_11025_long, sfb_11025_short, sfb_11025_mixed }, 00314 { sfb_8000_long, sfb_8000_short, sfb_8000_mixed } 00315 }; 00316 00317 /* 00318 * scalefactor band preemphasis (used only when preflag is set) 00319 * derived from Table B.6 of ISO/IEC 11172-3 00320 */ 00321 static 00322 unsigned char const pretab[22] = { 00323 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 00324 }; 00325 00326 /* 00327 * table for requantization 00328 * 00329 * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3) 00330 */ 00331 static 00332 struct fixedfloat { 00333 unsigned long mantissa : 27; 00334 unsigned short exponent : 5; 00335 } const rq_table[8207] = { 00336 # include "rq_table.h" 00337 }; 00338 00339 /* 00340 * fractional powers of two 00341 * used for requantization and joint stereo decoding 00342 * 00343 * root_table[3 + x] = 2^(x/4) 00344 */ 00345 static 00346 mad_fixed_t const root_table[7] = { 00347 MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */, 00348 MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */, 00349 MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */, 00350 MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */, 00351 MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */, 00352 MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */, 00353 MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */ 00354 }; 00355 00356 /* 00357 * coefficients for aliasing reduction 00358 * derived from Table B.9 of ISO/IEC 11172-3 00359 * 00360 * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 } 00361 * cs[i] = 1 / sqrt(1 + c[i]^2) 00362 * ca[i] = c[i] / sqrt(1 + c[i]^2) 00363 */ 00364 static 00365 mad_fixed_t const cs[8] = { 00366 +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */, 00367 +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */, 00368 +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */, 00369 +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */ 00370 }; 00371 00372 static 00373 mad_fixed_t const ca[8] = { 00374 -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */, 00375 -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */, 00376 -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */, 00377 -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */ 00378 }; 00379 00380 /* 00381 * IMDCT coefficients for short blocks 00382 * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3 00383 * 00384 * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1)) 00385 * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1)) 00386 */ 00387 static 00388 mad_fixed_t const imdct_s[6][6] = { 00389 # include "imdct_s.h" 00390 }; 00391 00392 # if !defined(ASO_IMDCT) 00393 /* 00394 * windowing coefficients for long blocks 00395 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 00396 * 00397 * window_l[i] = sin((PI / 36) * (i + 1/2)) 00398 */ 00399 static 00400 mad_fixed_t const window_l[36] = { 00401 MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */, 00402 MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */, 00403 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */, 00404 MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, 00405 MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */, 00406 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */, 00407 00408 MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */, 00409 MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */, 00410 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */, 00411 MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */, 00412 MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */, 00413 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */, 00414 00415 MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */, 00416 MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */, 00417 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */, 00418 MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */, 00419 MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */, 00420 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */, 00421 }; 00422 # endif /* ASO_IMDCT */ 00423 00424 /* 00425 * windowing coefficients for short blocks 00426 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 00427 * 00428 * window_s[i] = sin((PI / 12) * (i + 1/2)) 00429 */ 00430 static 00431 mad_fixed_t const window_s[12] = { 00432 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */, 00433 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */, 00434 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */, 00435 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */, 00436 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, 00437 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */, 00438 }; 00439 00440 /* 00441 * coefficients for intensity stereo processing 00442 * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 00443 * 00444 * is_ratio[i] = tan(i * (PI / 12)) 00445 * is_table[i] = is_ratio[i] / (1 + is_ratio[i]) 00446 */ 00447 static 00448 mad_fixed_t const is_table[7] = { 00449 MAD_F(0x00000000) /* 0.000000000 */, 00450 MAD_F(0x0361962f) /* 0.211324865 */, 00451 MAD_F(0x05db3d74) /* 0.366025404 */, 00452 MAD_F(0x08000000) /* 0.500000000 */, 00453 MAD_F(0x0a24c28c) /* 0.633974596 */, 00454 MAD_F(0x0c9e69d1) /* 0.788675135 */, 00455 MAD_F(0x10000000) /* 1.000000000 */ 00456 }; 00457 00458 /* 00459 * coefficients for LSF intensity stereo processing 00460 * derived from section 2.4.3.2 of ISO/IEC 13818-3 00461 * 00462 * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) 00463 * is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1) 00464 */ 00465 static 00466 mad_fixed_t const is_lsf_table[2][15] = { 00467 { 00468 MAD_F(0x0d744fcd) /* 0.840896415 */, 00469 MAD_F(0x0b504f33) /* 0.707106781 */, 00470 MAD_F(0x09837f05) /* 0.594603558 */, 00471 MAD_F(0x08000000) /* 0.500000000 */, 00472 MAD_F(0x06ba27e6) /* 0.420448208 */, 00473 MAD_F(0x05a8279a) /* 0.353553391 */, 00474 MAD_F(0x04c1bf83) /* 0.297301779 */, 00475 MAD_F(0x04000000) /* 0.250000000 */, 00476 MAD_F(0x035d13f3) /* 0.210224104 */, 00477 MAD_F(0x02d413cd) /* 0.176776695 */, 00478 MAD_F(0x0260dfc1) /* 0.148650889 */, 00479 MAD_F(0x02000000) /* 0.125000000 */, 00480 MAD_F(0x01ae89fa) /* 0.105112052 */, 00481 MAD_F(0x016a09e6) /* 0.088388348 */, 00482 MAD_F(0x01306fe1) /* 0.074325445 */ 00483 }, { 00484 MAD_F(0x0b504f33) /* 0.707106781 */, 00485 MAD_F(0x08000000) /* 0.500000000 */, 00486 MAD_F(0x05a8279a) /* 0.353553391 */, 00487 MAD_F(0x04000000) /* 0.250000000 */, 00488 MAD_F(0x02d413cd) /* 0.176776695 */, 00489 MAD_F(0x02000000) /* 0.125000000 */, 00490 MAD_F(0x016a09e6) /* 0.088388348 */, 00491 MAD_F(0x01000000) /* 0.062500000 */, 00492 MAD_F(0x00b504f3) /* 0.044194174 */, 00493 MAD_F(0x00800000) /* 0.031250000 */, 00494 MAD_F(0x005a827a) /* 0.022097087 */, 00495 MAD_F(0x00400000) /* 0.015625000 */, 00496 MAD_F(0x002d413d) /* 0.011048543 */, 00497 MAD_F(0x00200000) /* 0.007812500 */, 00498 MAD_F(0x0016a09e) /* 0.005524272 */ 00499 } 00500 }; 00501 00502 /* 00503 * NAME: III_sideinfo() 00504 * DESCRIPTION: decode frame side information from a bitstream 00505 */ 00506 static 00507 enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch, 00508 int lsf, struct sideinfo *si, 00509 unsigned int *data_bitlen, 00510 unsigned int *priv_bitlen) 00511 { 00512 unsigned int ngr, gr, ch, i; 00513 enum mad_error result = MAD_ERROR_NONE; 00514 00515 *data_bitlen = 0; 00516 *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3); 00517 00518 si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9); 00519 si->private_bits = mad_bit_read(ptr, *priv_bitlen); 00520 00521 ngr = 1; 00522 if (!lsf) { 00523 ngr = 2; 00524 00525 for (ch = 0; ch < nch; ++ch) 00526 si->scfsi[ch] = mad_bit_read(ptr, 4); 00527 } 00528 00529 for (gr = 0; gr < ngr; ++gr) { 00530 struct granule *granule = &si->gr[gr]; 00531 00532 for (ch = 0; ch < nch; ++ch) { 00533 struct channel *channel = &granule->ch[ch]; 00534 00535 channel->part2_3_length = mad_bit_read(ptr, 12); 00536 channel->big_values = mad_bit_read(ptr, 9); 00537 channel->global_gain = mad_bit_read(ptr, 8); 00538 channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4); 00539 00540 *data_bitlen += channel->part2_3_length; 00541 00542 if (channel->big_values > 288 && result == 0) 00543 result = MAD_ERROR_BADBIGVALUES; 00544 00545 channel->flags = 0; 00546 00547 /* window_switching_flag */ 00548 if (mad_bit_read(ptr, 1)) { 00549 channel->block_type = mad_bit_read(ptr, 2); 00550 00551 if (channel->block_type == 0 && result == 0) 00552 result = MAD_ERROR_BADBLOCKTYPE; 00553 00554 if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0) 00555 result = MAD_ERROR_BADSCFSI; 00556 00557 channel->region0_count = 7; 00558 channel->region1_count = 36; 00559 00560 if (mad_bit_read(ptr, 1)) 00561 channel->flags |= mixed_block_flag; 00562 else if (channel->block_type == 2) 00563 channel->region0_count = 8; 00564 00565 for (i = 0; i < 2; ++i) 00566 channel->table_select[i] = mad_bit_read(ptr, 5); 00567 00568 # if defined(DEBUG) 00569 channel->table_select[2] = 4; /* not used */ 00570 # endif 00571 00572 for (i = 0; i < 3; ++i) 00573 channel->subblock_gain[i] = mad_bit_read(ptr, 3); 00574 } 00575 else { 00576 channel->block_type = 0; 00577 00578 for (i = 0; i < 3; ++i) 00579 channel->table_select[i] = mad_bit_read(ptr, 5); 00580 00581 channel->region0_count = mad_bit_read(ptr, 4); 00582 channel->region1_count = mad_bit_read(ptr, 3); 00583 } 00584 00585 /* [preflag,] scalefac_scale, count1table_select */ 00586 channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3); 00587 } 00588 } 00589 00590 return result; 00591 } 00592 00593 /* 00594 * NAME: III_scalefactors_lsf() 00595 * DESCRIPTION: decode channel scalefactors for LSF from a bitstream 00596 */ 00597 static 00598 unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr, 00599 struct channel *channel, 00600 struct channel *gr1ch, int mode_extension) 00601 { 00602 struct mad_bitptr start; 00603 unsigned int scalefac_compress, index, slen[4], part, n, i; 00604 unsigned char const *nsfb; 00605 00606 start = *ptr; 00607 00608 scalefac_compress = channel->scalefac_compress; 00609 index = (channel->block_type == 2) ? 00610 ((channel->flags & mixed_block_flag) ? 2 : 1) : 0; 00611 00612 if (!((mode_extension & I_STEREO) && gr1ch)) { 00613 if (scalefac_compress < 400) { 00614 slen[0] = (scalefac_compress >> 4) / 5; 00615 slen[1] = (scalefac_compress >> 4) % 5; 00616 slen[2] = (scalefac_compress % 16) >> 2; 00617 slen[3] = scalefac_compress % 4; 00618 00619 nsfb = nsfb_table[0][index]; 00620 } 00621 else if (scalefac_compress < 500) { 00622 scalefac_compress -= 400; 00623 00624 slen[0] = (scalefac_compress >> 2) / 5; 00625 slen[1] = (scalefac_compress >> 2) % 5; 00626 slen[2] = scalefac_compress % 4; 00627 slen[3] = 0; 00628 00629 nsfb = nsfb_table[1][index]; 00630 } 00631 else { 00632 scalefac_compress -= 500; 00633 00634 slen[0] = scalefac_compress / 3; 00635 slen[1] = scalefac_compress % 3; 00636 slen[2] = 0; 00637 slen[3] = 0; 00638 00639 channel->flags |= preflag; 00640 00641 nsfb = nsfb_table[2][index]; 00642 } 00643 00644 n = 0; 00645 for (part = 0; part < 4; ++part) { 00646 for (i = 0; i < nsfb[part]; ++i) 00647 channel->scalefac[n++] = mad_bit_read(ptr, slen[part]); 00648 } 00649 00650 while (n < 39) 00651 channel->scalefac[n++] = 0; 00652 } 00653 else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */ 00654 scalefac_compress >>= 1; 00655 00656 if (scalefac_compress < 180) { 00657 slen[0] = scalefac_compress / 36; 00658 slen[1] = (scalefac_compress % 36) / 6; 00659 slen[2] = (scalefac_compress % 36) % 6; 00660 slen[3] = 0; 00661 00662 nsfb = nsfb_table[3][index]; 00663 } 00664 else if (scalefac_compress < 244) { 00665 scalefac_compress -= 180; 00666 00667 slen[0] = (scalefac_compress % 64) >> 4; 00668 slen[1] = (scalefac_compress % 16) >> 2; 00669 slen[2] = scalefac_compress % 4; 00670 slen[3] = 0; 00671 00672 nsfb = nsfb_table[4][index]; 00673 } 00674 else { 00675 scalefac_compress -= 244; 00676 00677 slen[0] = scalefac_compress / 3; 00678 slen[1] = scalefac_compress % 3; 00679 slen[2] = 0; 00680 slen[3] = 0; 00681 00682 nsfb = nsfb_table[5][index]; 00683 } 00684 00685 n = 0; 00686 for (part = 0; part < 4; ++part) { 00687 unsigned int max, is_pos; 00688 00689 max = (1 << slen[part]) - 1; 00690 00691 for (i = 0; i < nsfb[part]; ++i) { 00692 is_pos = mad_bit_read(ptr, slen[part]); 00693 00694 channel->scalefac[n] = is_pos; 00695 gr1ch->scalefac[n++] = (is_pos == max); 00696 } 00697 } 00698 00699 while (n < 39) { 00700 channel->scalefac[n] = 0; 00701 gr1ch->scalefac[n++] = 0; /* apparently not illegal */ 00702 } 00703 } 00704 00705 return mad_bit_length(&start, ptr); 00706 } 00707 00708 /* 00709 * NAME: III_scalefactors() 00710 * DESCRIPTION: decode channel scalefactors of one granule from a bitstream 00711 */ 00712 static 00713 unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel, 00714 struct channel const *gr0ch, unsigned int scfsi) 00715 { 00716 struct mad_bitptr start; 00717 unsigned int slen1, slen2, sfbi; 00718 00719 start = *ptr; 00720 00721 slen1 = sflen_table[channel->scalefac_compress].slen1; 00722 slen2 = sflen_table[channel->scalefac_compress].slen2; 00723 00724 if (channel->block_type == 2) { 00725 unsigned int nsfb; 00726 00727 sfbi = 0; 00728 00729 nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3; 00730 while (nsfb--) 00731 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1); 00732 00733 nsfb = 6 * 3; 00734 while (nsfb--) 00735 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2); 00736 00737 nsfb = 1 * 3; 00738 while (nsfb--) 00739 channel->scalefac[sfbi++] = 0; 00740 } 00741 else { /* channel->block_type != 2 */ 00742 if (scfsi & 0x8) { 00743 for (sfbi = 0; sfbi < 6; ++sfbi) 00744 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; 00745 } 00746 else { 00747 for (sfbi = 0; sfbi < 6; ++sfbi) 00748 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); 00749 } 00750 00751 if (scfsi & 0x4) { 00752 for (sfbi = 6; sfbi < 11; ++sfbi) 00753 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; 00754 } 00755 else { 00756 for (sfbi = 6; sfbi < 11; ++sfbi) 00757 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1); 00758 } 00759 00760 if (scfsi & 0x2) { 00761 for (sfbi = 11; sfbi < 16; ++sfbi) 00762 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; 00763 } 00764 else { 00765 for (sfbi = 11; sfbi < 16; ++sfbi) 00766 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); 00767 } 00768 00769 if (scfsi & 0x1) { 00770 for (sfbi = 16; sfbi < 21; ++sfbi) 00771 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi]; 00772 } 00773 else { 00774 for (sfbi = 16; sfbi < 21; ++sfbi) 00775 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2); 00776 } 00777 00778 channel->scalefac[21] = 0; 00779 } 00780 00781 return mad_bit_length(&start, ptr); 00782 } 00783 00784 /* 00785 * The Layer III formula for requantization and scaling is defined by 00786 * section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows: 00787 * 00788 * long blocks: 00789 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) * 00790 * 2^((1/4) * (global_gain - 210)) * 00791 * 2^-(scalefac_multiplier * 00792 * (scalefac_l[sfb] + preflag * pretab[sfb])) 00793 * 00794 * short blocks: 00795 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) * 00796 * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) * 00797 * 2^-(scalefac_multiplier * scalefac_s[sfb][w]) 00798 * 00799 * where: 00800 * scalefac_multiplier = (scalefac_scale + 1) / 2 00801 * 00802 * The routines III_exponents() and III_requantize() facilitate this 00803 * calculation. 00804 */ 00805 00806 /* 00807 * NAME: III_exponents() 00808 * DESCRIPTION: calculate scalefactor exponents 00809 */ 00810 static 00811 void III_exponents(struct channel const *channel, 00812 unsigned char const *sfbwidth, signed int exponents[39]) 00813 { 00814 signed int gain; 00815 unsigned int scalefac_multiplier, sfbi; 00816 00817 gain = (signed int) channel->global_gain - 210; 00818 scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1; 00819 00820 if (channel->block_type == 2) { 00821 unsigned int l; 00822 signed int gain0, gain1, gain2; 00823 00824 sfbi = l = 0; 00825 00826 if (channel->flags & mixed_block_flag) { 00827 unsigned int premask; 00828 00829 premask = (channel->flags & preflag) ? ~0 : 0; 00830 00831 /* long block subbands 0-1 */ 00832 00833 while (l < 36) { 00834 exponents[sfbi] = gain - 00835 (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) << 00836 scalefac_multiplier); 00837 00838 l += sfbwidth[sfbi++]; 00839 } 00840 } 00841 00842 /* this is probably wrong for 8000 Hz short/mixed blocks */ 00843 00844 gain0 = gain - 8 * (signed int) channel->subblock_gain[0]; 00845 gain1 = gain - 8 * (signed int) channel->subblock_gain[1]; 00846 gain2 = gain - 8 * (signed int) channel->subblock_gain[2]; 00847 00848 while (l < 576) { 00849 exponents[sfbi + 0] = gain0 - 00850 (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier); 00851 exponents[sfbi + 1] = gain1 - 00852 (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier); 00853 exponents[sfbi + 2] = gain2 - 00854 (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier); 00855 00856 l += 3 * sfbwidth[sfbi]; 00857 sfbi += 3; 00858 } 00859 } 00860 else { /* channel->block_type != 2 */ 00861 if (channel->flags & preflag) { 00862 for (sfbi = 0; sfbi < 22; ++sfbi) { 00863 exponents[sfbi] = gain - 00864 (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) << 00865 scalefac_multiplier); 00866 } 00867 } 00868 else { 00869 for (sfbi = 0; sfbi < 22; ++sfbi) { 00870 exponents[sfbi] = gain - 00871 (signed int) (channel->scalefac[sfbi] << scalefac_multiplier); 00872 } 00873 } 00874 } 00875 } 00876 00877 /* 00878 * NAME: III_requantize() 00879 * DESCRIPTION: requantize one (positive) value 00880 */ 00881 static 00882 mad_fixed_t III_requantize(unsigned int value, signed int exp) 00883 { 00884 mad_fixed_t requantized; 00885 signed int frac; 00886 struct fixedfloat const *power; 00887 00888 frac = exp % 4; /* assumes sign(frac) == sign(exp) */ 00889 exp /= 4; 00890 00891 power = &rq_table[value]; 00892 requantized = power->mantissa; 00893 exp += power->exponent; 00894 00895 if (exp < 0) { 00896 if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) { 00897 /* underflow */ 00898 requantized = 0; 00899 } 00900 else { 00901 requantized += 1L << (-exp - 1); 00902 requantized >>= -exp; 00903 } 00904 } 00905 else { 00906 if (exp >= 5) { 00907 /* overflow */ 00908 # if defined(DEBUG) 00909 fprintf(stderr, "requantize overflow (%f * 2^%d)\n", 00910 mad_f_todouble(requantized), exp); 00911 # endif 00912 requantized = MAD_F_MAX; 00913 } 00914 else 00915 requantized <<= exp; 00916 } 00917 00918 return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized; 00919 } 00920 00921 /* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */ 00922 # define MASK(cache, sz, bits) \ 00923 (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1)) 00924 # define MASK1BIT(cache, sz) \ 00925 ((cache) & (1 << ((sz) - 1))) 00926 00927 /* 00928 * NAME: III_huffdecode() 00929 * DESCRIPTION: decode Huffman code words of one channel of one granule 00930 */ 00931 static 00932 enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576], 00933 struct channel *channel, 00934 unsigned char const *sfbwidth, 00935 unsigned int part2_length) 00936 { 00937 signed int exponents[39], exp; 00938 signed int const *expptr; 00939 struct mad_bitptr peek; 00940 signed int bits_left, cachesz; 00941 register mad_fixed_t *xrptr; 00942 mad_fixed_t const *sfbound; 00943 register unsigned long bitcache; 00944 00945 bits_left = (signed) channel->part2_3_length - (signed) part2_length; 00946 if (bits_left < 0) 00947 return MAD_ERROR_BADPART3LEN; 00948 00949 III_exponents(channel, sfbwidth, exponents); 00950 00951 peek = *ptr; 00952 mad_bit_skip(ptr, bits_left); 00953 00954 /* align bit reads to byte boundaries */ 00955 cachesz = mad_bit_bitsleft(&peek); 00956 cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7; 00957 00958 bitcache = mad_bit_read(&peek, cachesz); 00959 bits_left -= cachesz; 00960 00961 xrptr = &xr[0]; 00962 00963 /* big_values */ 00964 { 00965 unsigned int region, rcount; 00966 struct hufftable const *entry; 00967 union huffpair const *table; 00968 unsigned int linbits, startbits, big_values, reqhits; 00969 mad_fixed_t reqcache[16]; 00970 00971 sfbound = xrptr + *sfbwidth++; 00972 rcount = channel->region0_count + 1; 00973 00974 entry = &mad_huff_pair_table[channel->table_select[region = 0]]; 00975 table = entry->table; 00976 linbits = entry->linbits; 00977 startbits = entry->startbits; 00978 00979 if (table == 0) 00980 return MAD_ERROR_BADHUFFTABLE; 00981 00982 expptr = &exponents[0]; 00983 exp = *expptr++; 00984 reqhits = 0; 00985 00986 big_values = channel->big_values; 00987 00988 while (big_values-- && cachesz + bits_left > 0) { 00989 union huffpair const *pair; 00990 unsigned int clumpsz, value; 00991 register mad_fixed_t requantized; 00992 00993 if (xrptr == sfbound) { 00994 sfbound += *sfbwidth++; 00995 00996 /* change table if region boundary */ 00997 00998 if (--rcount == 0) { 00999 if (region == 0) 01000 rcount = channel->region1_count + 1; 01001 else 01002 rcount = 0; /* all remaining */ 01003 01004 entry = &mad_huff_pair_table[channel->table_select[++region]]; 01005 table = entry->table; 01006 linbits = entry->linbits; 01007 startbits = entry->startbits; 01008 01009 if (table == 0) 01010 return MAD_ERROR_BADHUFFTABLE; 01011 } 01012 01013 if (exp != *expptr) { 01014 exp = *expptr; 01015 reqhits = 0; 01016 } 01017 01018 ++expptr; 01019 } 01020 01021 if (cachesz < 21) { 01022 unsigned int bits; 01023 01024 bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7; 01025 bitcache = (bitcache << bits) | mad_bit_read(&peek, bits); 01026 cachesz += bits; 01027 bits_left -= bits; 01028 } 01029 01030 /* hcod (0..19) */ 01031 01032 clumpsz = startbits; 01033 pair = &table[MASK(bitcache, cachesz, clumpsz)]; 01034 01035 while (!pair->final) { 01036 cachesz -= clumpsz; 01037 01038 clumpsz = pair->ptr.bits; 01039 pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)]; 01040 } 01041 01042 cachesz -= pair->value.hlen; 01043 01044 if (linbits) { 01045 /* x (0..14) */ 01046 01047 value = pair->value.x; 01048 01049 switch (value) { 01050 case 0: 01051 xrptr[0] = 0; 01052 break; 01053 01054 case 15: 01055 if (cachesz < linbits + 2) { 01056 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); 01057 cachesz += 16; 01058 bits_left -= 16; 01059 } 01060 01061 value += MASK(bitcache, cachesz, linbits); 01062 cachesz -= linbits; 01063 01064 requantized = III_requantize(value, exp); 01065 goto x_final; 01066 01067 default: 01068 if (reqhits & (1 << value)) 01069 requantized = reqcache[value]; 01070 else { 01071 reqhits |= (1 << value); 01072 requantized = reqcache[value] = III_requantize(value, exp); 01073 } 01074 01075 x_final: 01076 xrptr[0] = MASK1BIT(bitcache, cachesz--) ? 01077 -requantized : requantized; 01078 } 01079 01080 /* y (0..14) */ 01081 01082 value = pair->value.y; 01083 01084 switch (value) { 01085 case 0: 01086 xrptr[1] = 0; 01087 break; 01088 01089 case 15: 01090 if (cachesz < linbits + 1) { 01091 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); 01092 cachesz += 16; 01093 bits_left -= 16; 01094 } 01095 01096 value += MASK(bitcache, cachesz, linbits); 01097 cachesz -= linbits; 01098 01099 requantized = III_requantize(value, exp); 01100 goto y_final; 01101 01102 default: 01103 if (reqhits & (1 << value)) 01104 requantized = reqcache[value]; 01105 else { 01106 reqhits |= (1 << value); 01107 requantized = reqcache[value] = III_requantize(value, exp); 01108 } 01109 01110 y_final: 01111 xrptr[1] = MASK1BIT(bitcache, cachesz--) ? 01112 -requantized : requantized; 01113 } 01114 } 01115 else { 01116 /* x (0..1) */ 01117 01118 value = pair->value.x; 01119 01120 if (value == 0) 01121 xrptr[0] = 0; 01122 else { 01123 if (reqhits & (1 << value)) 01124 requantized = reqcache[value]; 01125 else { 01126 reqhits |= (1 << value); 01127 requantized = reqcache[value] = III_requantize(value, exp); 01128 } 01129 01130 xrptr[0] = MASK1BIT(bitcache, cachesz--) ? 01131 -requantized : requantized; 01132 } 01133 01134 /* y (0..1) */ 01135 01136 value = pair->value.y; 01137 01138 if (value == 0) 01139 xrptr[1] = 0; 01140 else { 01141 if (reqhits & (1 << value)) 01142 requantized = reqcache[value]; 01143 else { 01144 reqhits |= (1 << value); 01145 requantized = reqcache[value] = III_requantize(value, exp); 01146 } 01147 01148 xrptr[1] = MASK1BIT(bitcache, cachesz--) ? 01149 -requantized : requantized; 01150 } 01151 } 01152 01153 xrptr += 2; 01154 } 01155 } 01156 01157 if (cachesz + bits_left < 0) 01158 return MAD_ERROR_BADHUFFDATA; /* big_values overrun */ 01159 01160 /* count1 */ 01161 { 01162 union huffquad const *table; 01163 register mad_fixed_t requantized; 01164 01165 table = mad_huff_quad_table[channel->flags & count1table_select]; 01166 01167 requantized = III_requantize(1, exp); 01168 01169 while (cachesz + bits_left > 0 && xrptr <= &xr[572]) { 01170 union huffquad const *quad; 01171 01172 /* hcod (1..6) */ 01173 01174 if (cachesz < 10) { 01175 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16); 01176 cachesz += 16; 01177 bits_left -= 16; 01178 } 01179 01180 quad = &table[MASK(bitcache, cachesz, 4)]; 01181 01182 /* quad tables guaranteed to have at most one extra lookup */ 01183 if (!quad->final) { 01184 cachesz -= 4; 01185 01186 quad = &table[quad->ptr.offset + 01187 MASK(bitcache, cachesz, quad->ptr.bits)]; 01188 } 01189 01190 cachesz -= quad->value.hlen; 01191 01192 if (xrptr == sfbound) { 01193 sfbound += *sfbwidth++; 01194 01195 if (exp != *expptr) { 01196 exp = *expptr; 01197 requantized = III_requantize(1, exp); 01198 } 01199 01200 ++expptr; 01201 } 01202 01203 /* v (0..1) */ 01204 01205 xrptr[0] = quad->value.v ? 01206 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; 01207 01208 /* w (0..1) */ 01209 01210 xrptr[1] = quad->value.w ? 01211 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; 01212 01213 xrptr += 2; 01214 01215 if (xrptr == sfbound) { 01216 sfbound += *sfbwidth++; 01217 01218 if (exp != *expptr) { 01219 exp = *expptr; 01220 requantized = III_requantize(1, exp); 01221 } 01222 01223 ++expptr; 01224 } 01225 01226 /* x (0..1) */ 01227 01228 xrptr[0] = quad->value.x ? 01229 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; 01230 01231 /* y (0..1) */ 01232 01233 xrptr[1] = quad->value.y ? 01234 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0; 01235 01236 xrptr += 2; 01237 } 01238 01239 if (cachesz + bits_left < 0) { 01240 # if 0 && defined(DEBUG) 01241 fprintf(stderr, "huffman count1 overrun (%d bits)\n", 01242 -(cachesz + bits_left)); 01243 # endif 01244 01245 /* technically the bitstream is misformatted, but apparently 01246 some encoders are just a bit sloppy with stuffing bits */ 01247 01248 xrptr -= 4; 01249 } 01250 } 01251 01252 /* assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT);*/ 01253 01254 # if 0 && defined(DEBUG) 01255 if (bits_left < 0) 01256 fprintf(stderr, "read %d bits too many\n", -bits_left); 01257 else if (cachesz + bits_left > 0) 01258 fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left); 01259 # endif 01260 01261 /* rzero */ 01262 while (xrptr < &xr[576]) { 01263 xrptr[0] = 0; 01264 xrptr[1] = 0; 01265 01266 xrptr += 2; 01267 } 01268 01269 return MAD_ERROR_NONE; 01270 } 01271 01272 # undef MASK 01273 # undef MASK1BIT 01274 01275 /* 01276 * NAME: III_reorder() 01277 * DESCRIPTION: reorder frequency lines of a short block into subband order 01278 */ 01279 static 01280 void III_reorder(mad_fixed_t xr[576], struct channel const *channel, 01281 unsigned char const sfbwidth[39]) 01282 { 01283 mad_fixed_t tmp[32][3][6]; 01284 unsigned int sb, l, f, w, sbw[3], sw[3]; 01285 01286 /* this is probably wrong for 8000 Hz mixed blocks */ 01287 01288 sb = 0; 01289 if (channel->flags & mixed_block_flag) { 01290 sb = 2; 01291 01292 l = 0; 01293 while (l < 36) 01294 l += *sfbwidth++; 01295 } 01296 01297 for (w = 0; w < 3; ++w) { 01298 sbw[w] = sb; 01299 sw[w] = 0; 01300 } 01301 01302 f = *sfbwidth++; 01303 w = 0; 01304 01305 for (l = 18 * sb; l < 576; ++l) { 01306 if (f-- == 0) { 01307 f = *sfbwidth++ - 1; 01308 w = (w + 1) % 3; 01309 } 01310 01311 tmp[sbw[w]][w][sw[w]++] = xr[l]; 01312 01313 if (sw[w] == 6) { 01314 sw[w] = 0; 01315 ++sbw[w]; 01316 } 01317 } 01318 01319 memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t)); 01320 } 01321 01322 /* 01323 * NAME: III_stereo() 01324 * DESCRIPTION: perform joint stereo processing on a granule 01325 */ 01326 static 01327 enum mad_error III_stereo(mad_fixed_t xr[2][576], 01328 struct granule const *granule, 01329 struct mad_header *header, 01330 unsigned char const *sfbwidth) 01331 { 01332 short modes[39]; 01333 unsigned int sfbi, l, n, i; 01334 01335 if (granule->ch[0].block_type != 01336 granule->ch[1].block_type || 01337 (granule->ch[0].flags & mixed_block_flag) != 01338 (granule->ch[1].flags & mixed_block_flag)) 01339 return MAD_ERROR_BADSTEREO; 01340 01341 for (i = 0; i < 39; ++i) 01342 modes[i] = header->mode_extension; 01343 01344 /* intensity stereo */ 01345 01346 if (header->mode_extension & I_STEREO) { 01347 struct channel const *right_ch = &granule->ch[1]; 01348 mad_fixed_t const *right_xr = xr[1]; 01349 unsigned int is_pos; 01350 01351 header->flags |= MAD_FLAG_I_STEREO; 01352 01353 /* first determine which scalefactor bands are to be processed */ 01354 01355 if (right_ch->block_type == 2) { 01356 unsigned int lower, start, max, bound[3], w; 01357 01358 lower = start = max = bound[0] = bound[1] = bound[2] = 0; 01359 01360 sfbi = l = 0; 01361 01362 if (right_ch->flags & mixed_block_flag) { 01363 while (l < 36) { 01364 n = sfbwidth[sfbi++]; 01365 01366 for (i = 0; i < n; ++i) { 01367 if (right_xr[i]) { 01368 lower = sfbi; 01369 break; 01370 } 01371 } 01372 01373 right_xr += n; 01374 l += n; 01375 } 01376 01377 start = sfbi; 01378 } 01379 01380 w = 0; 01381 while (l < 576) { 01382 n = sfbwidth[sfbi++]; 01383 01384 for (i = 0; i < n; ++i) { 01385 if (right_xr[i]) { 01386 max = bound[w] = sfbi; 01387 break; 01388 } 01389 } 01390 01391 right_xr += n; 01392 l += n; 01393 w = (w + 1) % 3; 01394 } 01395 01396 if (max) 01397 lower = start; 01398 01399 /* long blocks */ 01400 01401 for (i = 0; i < lower; ++i) 01402 modes[i] = header->mode_extension & ~I_STEREO; 01403 01404 /* short blocks */ 01405 01406 w = 0; 01407 for (i = start; i < max; ++i) { 01408 if (i < bound[w]) 01409 modes[i] = header->mode_extension & ~I_STEREO; 01410 01411 w = (w + 1) % 3; 01412 } 01413 } 01414 else { /* right_ch->block_type != 2 */ 01415 unsigned int bound; 01416 01417 bound = 0; 01418 for (sfbi = l = 0; l < 576; l += n) { 01419 n = sfbwidth[sfbi++]; 01420 01421 for (i = 0; i < n; ++i) { 01422 if (right_xr[i]) { 01423 bound = sfbi; 01424 break; 01425 } 01426 } 01427 01428 right_xr += n; 01429 } 01430 01431 for (i = 0; i < bound; ++i) 01432 modes[i] = header->mode_extension & ~I_STEREO; 01433 } 01434 01435 /* now do the actual processing */ 01436 01437 if (header->flags & MAD_FLAG_LSF_EXT) { 01438 unsigned char const *illegal_pos = granule[1].ch[1].scalefac; 01439 mad_fixed_t const *lsf_scale; 01440 01441 /* intensity_scale */ 01442 lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1]; 01443 01444 for (sfbi = l = 0; l < 576; ++sfbi, l += n) { 01445 n = sfbwidth[sfbi]; 01446 01447 if (!(modes[sfbi] & I_STEREO)) 01448 continue; 01449 01450 if (illegal_pos[sfbi]) { 01451 modes[sfbi] &= ~I_STEREO; 01452 continue; 01453 } 01454 01455 is_pos = right_ch->scalefac[sfbi]; 01456 01457 for (i = 0; i < n; ++i) { 01458 register mad_fixed_t left; 01459 01460 left = xr[0][l + i]; 01461 01462 if (is_pos == 0) 01463 xr[1][l + i] = left; 01464 else { 01465 register mad_fixed_t opposite; 01466 01467 opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]); 01468 01469 if (is_pos & 1) { 01470 xr[0][l + i] = opposite; 01471 xr[1][l + i] = left; 01472 } 01473 else 01474 xr[1][l + i] = opposite; 01475 } 01476 } 01477 } 01478 } 01479 else { /* !(header->flags & MAD_FLAG_LSF_EXT) */ 01480 for (sfbi = l = 0; l < 576; ++sfbi, l += n) { 01481 n = sfbwidth[sfbi]; 01482 01483 if (!(modes[sfbi] & I_STEREO)) 01484 continue; 01485 01486 is_pos = right_ch->scalefac[sfbi]; 01487 01488 if (is_pos >= 7) { /* illegal intensity position */ 01489 modes[sfbi] &= ~I_STEREO; 01490 continue; 01491 } 01492 01493 for (i = 0; i < n; ++i) { 01494 register mad_fixed_t left; 01495 01496 left = xr[0][l + i]; 01497 01498 xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]); 01499 xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]); 01500 } 01501 } 01502 } 01503 } 01504 01505 /* middle/side stereo */ 01506 01507 if (header->mode_extension & MS_STEREO) { 01508 register mad_fixed_t invsqrt2; 01509 01510 header->flags |= MAD_FLAG_MS_STEREO; 01511 01512 invsqrt2 = root_table[3 + -2]; 01513 01514 for (sfbi = l = 0; l < 576; ++sfbi, l += n) { 01515 n = sfbwidth[sfbi]; 01516 01517 if (modes[sfbi] != MS_STEREO) 01518 continue; 01519 01520 for (i = 0; i < n; ++i) { 01521 register mad_fixed_t m, s; 01522 01523 m = xr[0][l + i]; 01524 s = xr[1][l + i]; 01525 01526 xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */ 01527 xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */ 01528 } 01529 } 01530 } 01531 01532 return MAD_ERROR_NONE; 01533 } 01534 01535 /* 01536 * NAME: III_aliasreduce() 01537 * DESCRIPTION: perform frequency line alias reduction 01538 */ 01539 static 01540 void III_aliasreduce(mad_fixed_t xr[576], int lines) 01541 { 01542 mad_fixed_t const *bound; 01543 int i; 01544 01545 bound = &xr[lines]; 01546 for (xr += 18; xr < bound; xr += 18) { 01547 for (i = 0; i < 8; ++i) { 01548 register mad_fixed_t a, b; 01549 register mad_fixed64hi_t hi; 01550 register mad_fixed64lo_t lo; 01551 01552 a = xr[-1 - i]; 01553 b = xr[ i]; 01554 01555 # if defined(ASO_ZEROCHECK) 01556 if (a | b) { 01557 # endif 01558 MAD_F_ML0(hi, lo, a, cs[i]); 01559 MAD_F_MLA(hi, lo, -b, ca[i]); 01560 01561 xr[-1 - i] = MAD_F_MLZ(hi, lo); 01562 01563 MAD_F_ML0(hi, lo, b, cs[i]); 01564 MAD_F_MLA(hi, lo, a, ca[i]); 01565 01566 xr[ i] = MAD_F_MLZ(hi, lo); 01567 # if defined(ASO_ZEROCHECK) 01568 } 01569 # endif 01570 } 01571 } 01572 } 01573 01574 # if defined(ASO_IMDCT) 01575 void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int); 01576 # else 01577 # if 1 01578 static 01579 void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18]) 01580 { 01581 mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; 01582 mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25; 01583 mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7; 01584 01585 enum { 01586 c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */ 01587 c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */ 01588 c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */ 01589 c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */ 01590 c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */ 01591 c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */ 01592 c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */ 01593 }; 01594 01595 a0 = x[3] + x[5]; 01596 a1 = x[3] - x[5]; 01597 a2 = x[6] + x[2]; 01598 a3 = x[6] - x[2]; 01599 a4 = x[1] + x[7]; 01600 a5 = x[1] - x[7]; 01601 a6 = x[8] + x[0]; 01602 a7 = x[8] - x[0]; 01603 01604 a8 = a0 + a2; 01605 a9 = a0 - a2; 01606 a10 = a0 - a6; 01607 a11 = a2 - a6; 01608 a12 = a8 + a6; 01609 a13 = a1 - a3; 01610 a14 = a13 + a7; 01611 a15 = a3 + a7; 01612 a16 = a1 - a7; 01613 a17 = a1 + a3; 01614 01615 m0 = mad_f_mul(a17, -c3); 01616 m1 = mad_f_mul(a16, -c0); 01617 m2 = mad_f_mul(a15, -c4); 01618 m3 = mad_f_mul(a14, -c1); 01619 m4 = mad_f_mul(a5, -c1); 01620 m5 = mad_f_mul(a11, -c6); 01621 m6 = mad_f_mul(a10, -c5); 01622 m7 = mad_f_mul(a9, -c2); 01623 01624 a18 = x[4] + a4; 01625 a19 = 2 * x[4] - a4; 01626 a20 = a19 + m5; 01627 a21 = a19 - m5; 01628 a22 = a19 + m6; 01629 a23 = m4 + m2; 01630 a24 = m4 - m2; 01631 a25 = m4 + m1; 01632 01633 /* output to every other slot for convenience */ 01634 01635 y[ 0] = a18 + a12; 01636 y[ 2] = m0 - a25; 01637 y[ 4] = m7 - a20; 01638 y[ 6] = m3; 01639 y[ 8] = a21 - m6; 01640 y[10] = a24 - m1; 01641 y[12] = a12 - 2 * a18; 01642 y[14] = a23 + m0; 01643 y[16] = a22 + m7; 01644 } 01645 01646 static inline 01647 void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18]) 01648 { 01649 mad_fixed_t tmp[9]; 01650 int i; 01651 01652 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */ 01653 static mad_fixed_t const scale[9] = { 01654 MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930), 01655 MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8), 01656 MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7) 01657 }; 01658 01659 /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */ 01660 01661 /* even input butterfly */ 01662 01663 for (i = 0; i < 9; i += 3) { 01664 tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1]; 01665 tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1]; 01666 tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1]; 01667 } 01668 01669 fastsdct(tmp, &X[0]); 01670 01671 /* odd input butterfly and scaling */ 01672 01673 for (i = 0; i < 9; i += 3) { 01674 tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]); 01675 tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]); 01676 tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]); 01677 } 01678 01679 fastsdct(tmp, &X[1]); 01680 01681 /* output accumulation */ 01682 01683 for (i = 3; i < 18; i += 8) { 01684 X[i + 0] -= X[(i + 0) - 2]; 01685 X[i + 2] -= X[(i + 2) - 2]; 01686 X[i + 4] -= X[(i + 4) - 2]; 01687 X[i + 6] -= X[(i + 6) - 2]; 01688 } 01689 } 01690 01691 static inline 01692 void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18]) 01693 { 01694 mad_fixed_t tmp[18]; 01695 int i; 01696 01697 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */ 01698 static mad_fixed_t const scale[18] = { 01699 MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120), 01700 MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b), 01701 MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4), 01702 MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3), 01703 MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5), 01704 MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c) 01705 }; 01706 01707 /* scaling */ 01708 01709 for (i = 0; i < 18; i += 3) { 01710 tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]); 01711 tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]); 01712 tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]); 01713 } 01714 01715 /* SDCT-II */ 01716 01717 sdctII(tmp, X); 01718 01719 /* scale reduction and output accumulation */ 01720 01721 X[0] /= 2; 01722 for (i = 1; i < 17; i += 4) { 01723 X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1]; 01724 X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1]; 01725 X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1]; 01726 X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1]; 01727 } 01728 X[17] = X[17] / 2 - X[16]; 01729 } 01730 01731 /* 01732 * NAME: imdct36 01733 * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm 01734 */ 01735 static inline 01736 void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36]) 01737 { 01738 mad_fixed_t tmp[18]; 01739 int i; 01740 01741 /* DCT-IV */ 01742 01743 dctIV(x, tmp); 01744 01745 /* convert 18-point DCT-IV to 36-point IMDCT */ 01746 01747 for (i = 0; i < 9; i += 3) { 01748 y[i + 0] = tmp[9 + (i + 0)]; 01749 y[i + 1] = tmp[9 + (i + 1)]; 01750 y[i + 2] = tmp[9 + (i + 2)]; 01751 } 01752 for (i = 9; i < 27; i += 3) { 01753 y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1]; 01754 y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1]; 01755 y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1]; 01756 } 01757 for (i = 27; i < 36; i += 3) { 01758 y[i + 0] = -tmp[(i + 0) - 27]; 01759 y[i + 1] = -tmp[(i + 1) - 27]; 01760 y[i + 2] = -tmp[(i + 2) - 27]; 01761 } 01762 } 01763 # else 01764 /* 01765 * NAME: imdct36 01766 * DESCRIPTION: perform X[18]->x[36] IMDCT 01767 */ 01768 static inline 01769 void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) 01770 { 01771 mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; 01772 mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; 01773 register mad_fixed64hi_t hi; 01774 register mad_fixed64lo_t lo; 01775 01776 MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8)); 01777 MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa)); 01778 01779 t6 = MAD_F_MLZ(hi, lo); 01780 01781 MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa)); 01782 MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8)); 01783 01784 t0 = MAD_F_MLZ(hi, lo); 01785 01786 MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2)); 01787 MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0)); 01788 MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346)); 01789 MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549)); 01790 01791 x[7] = MAD_F_MLZ(hi, lo); 01792 x[10] = -x[7]; 01793 01794 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346)); 01795 MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549)); 01796 MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2)); 01797 MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0)); 01798 01799 x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0; 01800 01801 t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15]; 01802 t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17]; 01803 01804 MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8)); 01805 MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa)); 01806 01807 x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0; 01808 01809 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0)); 01810 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2)); 01811 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549)); 01812 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346)); 01813 01814 t1 = MAD_F_MLZ(hi, lo) + t6; 01815 01816 MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962)); 01817 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245)); 01818 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd)); 01819 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad)); 01820 MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2)); 01821 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779)); 01822 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807)); 01823 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5)); 01824 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352)); 01825 MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e)); 01826 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284)); 01827 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890)); 01828 01829 x[6] = MAD_F_MLZ(hi, lo) + t1; 01830 x[11] = -x[6]; 01831 01832 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5)); 01833 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e)); 01834 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779)); 01835 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890)); 01836 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad)); 01837 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284)); 01838 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245)); 01839 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352)); 01840 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962)); 01841 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807)); 01842 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd)); 01843 MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2)); 01844 01845 x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1; 01846 01847 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352)); 01848 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807)); 01849 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284)); 01850 MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2)); 01851 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890)); 01852 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd)); 01853 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e)); 01854 MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962)); 01855 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5)); 01856 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245)); 01857 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779)); 01858 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad)); 01859 01860 x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1; 01861 01862 MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa)); 01863 MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8)); 01864 01865 t7 = MAD_F_MLZ(hi, lo); 01866 01867 MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346)); 01868 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549)); 01869 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2)); 01870 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0)); 01871 01872 t2 = MAD_F_MLZ(hi, lo); 01873 01874 MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2)); 01875 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd)); 01876 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807)); 01877 MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962)); 01878 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352)); 01879 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245)); 01880 MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284)); 01881 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad)); 01882 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890)); 01883 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779)); 01884 MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e)); 01885 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5)); 01886 01887 x[5] = MAD_F_MLZ(hi, lo); 01888 x[12] = -x[5]; 01889 01890 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad)); 01891 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779)); 01892 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245)); 01893 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5)); 01894 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962)); 01895 MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e)); 01896 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd)); 01897 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890)); 01898 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2)); 01899 MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284)); 01900 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807)); 01901 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352)); 01902 01903 x[0] = MAD_F_MLZ(hi, lo) + t2; 01904 x[17] = -x[0]; 01905 01906 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890)); 01907 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284)); 01908 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e)); 01909 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352)); 01910 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5)); 01911 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807)); 01912 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779)); 01913 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2)); 01914 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad)); 01915 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd)); 01916 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245)); 01917 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962)); 01918 01919 x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2; 01920 01921 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2)); 01922 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0)); 01923 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346)); 01924 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549)); 01925 01926 t3 = MAD_F_MLZ(hi, lo) + t7; 01927 01928 MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e)); 01929 MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962)); 01930 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2)); 01931 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284)); 01932 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779)); 01933 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad)); 01934 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352)); 01935 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807)); 01936 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245)); 01937 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5)); 01938 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890)); 01939 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd)); 01940 01941 x[8] = MAD_F_MLZ(hi, lo) + t3; 01942 x[9] = -x[8]; 01943 01944 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245)); 01945 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352)); 01946 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890)); 01947 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779)); 01948 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd)); 01949 MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2)); 01950 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5)); 01951 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e)); 01952 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807)); 01953 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962)); 01954 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad)); 01955 MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284)); 01956 01957 x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3; 01958 01959 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807)); 01960 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5)); 01961 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad)); 01962 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd)); 01963 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284)); 01964 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890)); 01965 MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962)); 01966 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245)); 01967 MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e)); 01968 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352)); 01969 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2)); 01970 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779)); 01971 01972 x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3; 01973 01974 MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8)); 01975 MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa)); 01976 01977 t4 = MAD_F_MLZ(hi, lo) - t7; 01978 01979 MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa)); 01980 MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8)); 01981 01982 x[4] = MAD_F_MLZ(hi, lo) + t4; 01983 x[13] = -x[4]; 01984 01985 MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0)); 01986 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2)); 01987 MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549)); 01988 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346)); 01989 01990 x[1] = MAD_F_MLZ(hi, lo) + t4; 01991 x[16] = -x[1]; 01992 01993 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549)); 01994 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346)); 01995 MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0)); 01996 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2)); 01997 01998 x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4; 01999 02000 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549)); 02001 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346)); 02002 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0)); 02003 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2)); 02004 02005 t5 = MAD_F_MLZ(hi, lo) - t6; 02006 02007 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779)); 02008 MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2)); 02009 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352)); 02010 MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e)); 02011 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245)); 02012 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962)); 02013 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890)); 02014 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284)); 02015 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd)); 02016 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad)); 02017 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5)); 02018 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807)); 02019 02020 x[2] = MAD_F_MLZ(hi, lo) + t5; 02021 x[15] = -x[2]; 02022 02023 MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284)); 02024 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad)); 02025 MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962)); 02026 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807)); 02027 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e)); 02028 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5)); 02029 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2)); 02030 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd)); 02031 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779)); 02032 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890)); 02033 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352)); 02034 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245)); 02035 02036 x[3] = MAD_F_MLZ(hi, lo) + t5; 02037 x[14] = -x[3]; 02038 02039 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd)); 02040 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890)); 02041 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5)); 02042 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245)); 02043 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807)); 02044 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352)); 02045 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad)); 02046 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779)); 02047 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284)); 02048 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2)); 02049 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962)); 02050 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e)); 02051 02052 x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5; 02053 } 02054 # endif 02055 02056 /* 02057 * NAME: III_imdct_l() 02058 * DESCRIPTION: perform IMDCT and windowing for long blocks 02059 */ 02060 static 02061 void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], 02062 unsigned int block_type) 02063 { 02064 unsigned int i; 02065 02066 /* IMDCT */ 02067 02068 imdct36(X, z); 02069 02070 /* windowing */ 02071 02072 switch (block_type) { 02073 case 0: /* normal window */ 02074 # if defined(ASO_INTERLEAVE1) 02075 { 02076 register mad_fixed_t tmp1, tmp2; 02077 02078 tmp1 = window_l[0]; 02079 tmp2 = window_l[1]; 02080 02081 for (i = 0; i < 34; i += 2) { 02082 z[i + 0] = mad_f_mul(z[i + 0], tmp1); 02083 tmp1 = window_l[i + 2]; 02084 z[i + 1] = mad_f_mul(z[i + 1], tmp2); 02085 tmp2 = window_l[i + 3]; 02086 } 02087 02088 z[34] = mad_f_mul(z[34], tmp1); 02089 z[35] = mad_f_mul(z[35], tmp2); 02090 } 02091 # elif defined(ASO_INTERLEAVE2) 02092 { 02093 register mad_fixed_t tmp1, tmp2; 02094 02095 tmp1 = z[0]; 02096 tmp2 = window_l[0]; 02097 02098 for (i = 0; i < 35; ++i) { 02099 z[i] = mad_f_mul(tmp1, tmp2); 02100 tmp1 = z[i + 1]; 02101 tmp2 = window_l[i + 1]; 02102 } 02103 02104 z[35] = mad_f_mul(tmp1, tmp2); 02105 } 02106 # elif 1 02107 for (i = 0; i < 36; i += 4) { 02108 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); 02109 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); 02110 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); 02111 z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]); 02112 } 02113 # else 02114 for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); 02115 # endif 02116 break; 02117 02118 case 1: /* start block */ 02119 for (i = 0; i < 18; i += 3) { 02120 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); 02121 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); 02122 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); 02123 } 02124 /* (i = 18; i < 24; ++i) z[i] unchanged */ 02125 for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]); 02126 for (i = 30; i < 36; ++i) z[i] = 0; 02127 break; 02128 02129 case 3: /* stop block */ 02130 for (i = 0; i < 6; ++i) z[i] = 0; 02131 for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]); 02132 /* (i = 12; i < 18; ++i) z[i] unchanged */ 02133 for (i = 18; i < 36; i += 3) { 02134 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); 02135 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); 02136 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); 02137 } 02138 break; 02139 } 02140 } 02141 # endif /* ASO_IMDCT */ 02142 02143 /* 02144 * NAME: III_imdct_s() 02145 * DESCRIPTION: perform IMDCT and windowing for short blocks 02146 */ 02147 static 02148 void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36]) 02149 { 02150 mad_fixed_t y[36], *yptr; 02151 mad_fixed_t const *wptr; 02152 int w, i; 02153 register mad_fixed64hi_t hi; 02154 register mad_fixed64lo_t lo; 02155 02156 /* IMDCT */ 02157 02158 yptr = &y[0]; 02159 02160 for (w = 0; w < 3; ++w) { 02161 register mad_fixed_t const (*s)[6]; 02162 02163 s = imdct_s; 02164 02165 for (i = 0; i < 3; ++i) { 02166 MAD_F_ML0(hi, lo, X[0], (*s)[0]); 02167 MAD_F_MLA(hi, lo, X[1], (*s)[1]); 02168 MAD_F_MLA(hi, lo, X[2], (*s)[2]); 02169 MAD_F_MLA(hi, lo, X[3], (*s)[3]); 02170 MAD_F_MLA(hi, lo, X[4], (*s)[4]); 02171 MAD_F_MLA(hi, lo, X[5], (*s)[5]); 02172 02173 yptr[i + 0] = MAD_F_MLZ(hi, lo); 02174 yptr[5 - i] = -yptr[i + 0]; 02175 02176 ++s; 02177 02178 MAD_F_ML0(hi, lo, X[0], (*s)[0]); 02179 MAD_F_MLA(hi, lo, X[1], (*s)[1]); 02180 MAD_F_MLA(hi, lo, X[2], (*s)[2]); 02181 MAD_F_MLA(hi, lo, X[3], (*s)[3]); 02182 MAD_F_MLA(hi, lo, X[4], (*s)[4]); 02183 MAD_F_MLA(hi, lo, X[5], (*s)[5]); 02184 02185 yptr[ i + 6] = MAD_F_MLZ(hi, lo); 02186 yptr[11 - i] = yptr[i + 6]; 02187 02188 ++s; 02189 } 02190 02191 yptr += 12; 02192 X += 6; 02193 } 02194 02195 /* windowing, overlapping and concatenation */ 02196 02197 yptr = &y[0]; 02198 wptr = &window_s[0]; 02199 02200 for (i = 0; i < 6; ++i) { 02201 z[i + 0] = 0; 02202 z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]); 02203 02204 MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]); 02205 MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]); 02206 02207 z[i + 12] = MAD_F_MLZ(hi, lo); 02208 02209 MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]); 02210 MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]); 02211 02212 z[i + 18] = MAD_F_MLZ(hi, lo); 02213 02214 z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]); 02215 z[i + 30] = 0; 02216 02217 ++yptr; 02218 ++wptr; 02219 } 02220 } 02221 02222 /* 02223 * NAME: III_overlap() 02224 * DESCRIPTION: perform overlap-add of windowed IMDCT outputs 02225 */ 02226 static 02227 void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18], 02228 mad_fixed_t sample[18][32], unsigned int sb) 02229 { 02230 unsigned int i; 02231 02232 # if defined(ASO_INTERLEAVE2) 02233 { 02234 register mad_fixed_t tmp1, tmp2; 02235 02236 tmp1 = overlap[0]; 02237 tmp2 = overlap[1]; 02238 02239 for (i = 0; i < 16; i += 2) { 02240 sample[i + 0][sb] = output[i + 0 + 0] + tmp1; 02241 overlap[i + 0] = output[i + 0 + 18]; 02242 tmp1 = overlap[i + 2]; 02243 02244 sample[i + 1][sb] = output[i + 1 + 0] + tmp2; 02245 overlap[i + 1] = output[i + 1 + 18]; 02246 tmp2 = overlap[i + 3]; 02247 } 02248 02249 sample[16][sb] = output[16 + 0] + tmp1; 02250 overlap[16] = output[16 + 18]; 02251 sample[17][sb] = output[17 + 0] + tmp2; 02252 overlap[17] = output[17 + 18]; 02253 } 02254 # elif 0 02255 for (i = 0; i < 18; i += 2) { 02256 sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0]; 02257 overlap[i + 0] = output[i + 0 + 18]; 02258 02259 sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1]; 02260 overlap[i + 1] = output[i + 1 + 18]; 02261 } 02262 # else 02263 for (i = 0; i < 18; ++i) { 02264 sample[i][sb] = output[i + 0] + overlap[i]; 02265 overlap[i] = output[i + 18]; 02266 } 02267 # endif 02268 } 02269 02270 /* 02271 * NAME: III_overlap_z() 02272 * DESCRIPTION: perform "overlap-add" of zero IMDCT outputs 02273 */ 02274 static inline 02275 void III_overlap_z(mad_fixed_t overlap[18], 02276 mad_fixed_t sample[18][32], unsigned int sb) 02277 { 02278 unsigned int i; 02279 02280 # if defined(ASO_INTERLEAVE2) 02281 { 02282 register mad_fixed_t tmp1, tmp2; 02283 02284 tmp1 = overlap[0]; 02285 tmp2 = overlap[1]; 02286 02287 for (i = 0; i < 16; i += 2) { 02288 sample[i + 0][sb] = tmp1; 02289 overlap[i + 0] = 0; 02290 tmp1 = overlap[i + 2]; 02291 02292 sample[i + 1][sb] = tmp2; 02293 overlap[i + 1] = 0; 02294 tmp2 = overlap[i + 3]; 02295 } 02296 02297 sample[16][sb] = tmp1; 02298 overlap[16] = 0; 02299 sample[17][sb] = tmp2; 02300 overlap[17] = 0; 02301 } 02302 # else 02303 for (i = 0; i < 18; ++i) { 02304 sample[i][sb] = overlap[i]; 02305 overlap[i] = 0; 02306 } 02307 # endif 02308 } 02309 02310 /* 02311 * NAME: III_freqinver() 02312 * DESCRIPTION: perform subband frequency inversion for odd sample lines 02313 */ 02314 static 02315 void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb) 02316 { 02317 unsigned int i; 02318 02319 # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2) 02320 { 02321 register mad_fixed_t tmp1, tmp2; 02322 02323 tmp1 = sample[1][sb]; 02324 tmp2 = sample[3][sb]; 02325 02326 for (i = 1; i < 13; i += 4) { 02327 sample[i + 0][sb] = -tmp1; 02328 tmp1 = sample[i + 4][sb]; 02329 sample[i + 2][sb] = -tmp2; 02330 tmp2 = sample[i + 6][sb]; 02331 } 02332 02333 sample[13][sb] = -tmp1; 02334 tmp1 = sample[17][sb]; 02335 sample[15][sb] = -tmp2; 02336 sample[17][sb] = -tmp1; 02337 } 02338 # else 02339 for (i = 1; i < 18; i += 2) 02340 sample[i][sb] = -sample[i][sb]; 02341 # endif 02342 } 02343 02344 /* 02345 * NAME: III_decode() 02346 * DESCRIPTION: decode frame main_data 02347 */ 02348 static 02349 enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame, 02350 struct sideinfo *si, unsigned int nch) 02351 { 02352 struct mad_header *header = &frame->header; 02353 unsigned int sfreqi, ngr, gr; 02354 02355 { 02356 unsigned int sfreq; 02357 02358 sfreq = header->samplerate; 02359 if (header->flags & MAD_FLAG_MPEG_2_5_EXT) 02360 sfreq *= 2; 02361 02362 /* 48000 => 0, 44100 => 1, 32000 => 2, 02363 24000 => 3, 22050 => 4, 16000 => 5 */ 02364 sfreqi = ((sfreq >> 7) & 0x000f) + 02365 ((sfreq >> 15) & 0x0001) - 8; 02366 02367 if (header->flags & MAD_FLAG_MPEG_2_5_EXT) 02368 sfreqi += 3; 02369 } 02370 02371 /* scalefactors, Huffman decoding, requantization */ 02372 02373 ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2; 02374 02375 for (gr = 0; gr < ngr; ++gr) { 02376 struct granule *granule = &si->gr[gr]; 02377 unsigned char const *sfbwidth[2]; 02378 mad_fixed_t xr[2][576]; 02379 unsigned int ch; 02380 enum mad_error error; 02381 02382 for (ch = 0; ch < nch; ++ch) { 02383 struct channel *channel = &granule->ch[ch]; 02384 unsigned int part2_length; 02385 02386 sfbwidth[ch] = sfbwidth_table[sfreqi].l; 02387 if (channel->block_type == 2) { 02388 sfbwidth[ch] = (channel->flags & mixed_block_flag) ? 02389 sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s; 02390 } 02391 02392 if (header->flags & MAD_FLAG_LSF_EXT) { 02393 part2_length = III_scalefactors_lsf(ptr, channel, 02394 ch == 0 ? 0 : &si->gr[1].ch[1], 02395 header->mode_extension); 02396 } 02397 else { 02398 part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch], 02399 gr == 0 ? 0 : si->scfsi[ch]); 02400 } 02401 02402 error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length); 02403 if (error) 02404 return error; 02405 } 02406 02407 /* joint stereo processing */ 02408 02409 if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) { 02410 error = III_stereo(xr, granule, header, sfbwidth[0]); 02411 if (error) 02412 return error; 02413 } 02414 02415 /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */ 02416 02417 for (ch = 0; ch < nch; ++ch) { 02418 struct channel const *channel = &granule->ch[ch]; 02419 mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr]; 02420 unsigned int sb, l, i, sblimit; 02421 mad_fixed_t output[36]; 02422 02423 if (channel->block_type == 2) { 02424 III_reorder(xr[ch], channel, sfbwidth[ch]); 02425 02426 # if !defined(OPT_STRICT) 02427 /* 02428 * According to ISO/IEC 11172-3, "Alias reduction is not applied for 02429 * granules with block_type == 2 (short block)." However, other 02430 * sources suggest alias reduction should indeed be performed on the 02431 * lower two subbands of mixed blocks. Most other implementations do 02432 * this, so by default we will too. 02433 */ 02434 if (channel->flags & mixed_block_flag) 02435 III_aliasreduce(xr[ch], 36); 02436 # endif 02437 } 02438 else 02439 III_aliasreduce(xr[ch], 576); 02440 02441 l = 0; 02442 02443 /* subbands 0-1 */ 02444 02445 if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) { 02446 unsigned int block_type; 02447 02448 block_type = channel->block_type; 02449 if (channel->flags & mixed_block_flag) 02450 block_type = 0; 02451 02452 /* long blocks */ 02453 for (sb = 0; sb < 2; ++sb, l += 18) { 02454 III_imdct_l(&xr[ch][l], output, block_type); 02455 III_overlap(output, (frame->overlap)[ch][sb], sample, sb); 02456 } 02457 } 02458 else { 02459 /* short blocks */ 02460 for (sb = 0; sb < 2; ++sb, l += 18) { 02461 III_imdct_s(&xr[ch][l], output); 02462 III_overlap(output, (frame->overlap)[ch][sb], sample, sb); 02463 } 02464 } 02465 02466 III_freqinver(sample, 1); 02467 02468 /* (nonzero) subbands 2-31 */ 02469 02470 i = 576; 02471 while (i > 36 && xr[ch][i - 1] == 0) 02472 --i; 02473 02474 sblimit = 32 - (576 - i) / 18; 02475 02476 if (channel->block_type != 2) { 02477 /* long blocks */ 02478 for (sb = 2; sb < sblimit; ++sb, l += 18) { 02479 III_imdct_l(&xr[ch][l], output, channel->block_type); 02480 III_overlap(output, (frame->overlap)[ch][sb], sample, sb); 02481 02482 if (sb & 1) 02483 III_freqinver(sample, sb); 02484 } 02485 } 02486 else { 02487 /* short blocks */ 02488 for (sb = 2; sb < sblimit; ++sb, l += 18) { 02489 III_imdct_s(&xr[ch][l], output); 02490 III_overlap(output, (frame->overlap)[ch][sb], sample, sb); 02491 02492 if (sb & 1) 02493 III_freqinver(sample, sb); 02494 } 02495 } 02496 02497 /* remaining (zero) subbands */ 02498 02499 for (sb = sblimit; sb < 32; ++sb) { 02500 III_overlap_z((frame->overlap)[ch][sb], sample, sb); 02501 02502 if (sb & 1) 02503 III_freqinver(sample, sb); 02504 } 02505 } 02506 } 02507 02508 return MAD_ERROR_NONE; 02509 } 02510 02511 /* 02512 * NAME: layer->III() 02513 * DESCRIPTION: decode a single Layer III frame 02514 */ 02515 int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame) 02516 { 02517 struct mad_header *header = &frame->header; 02518 unsigned int nch, priv_bitlen, next_md_begin = 0; 02519 unsigned int si_len, data_bitlen, md_len; 02520 unsigned int frame_space, frame_used, frame_free; 02521 struct mad_bitptr ptr; 02522 struct sideinfo si; 02523 enum mad_error error; 02524 int result = 0; 02525 02526 /* allocate Layer III dynamic structures */ 02527 02528 if (stream->main_data == 0) { 02529 #if defined(TARGET_LPC1768) 02530 stream->main_data = (unsigned char (*)[MAD_BUFFER_MDLEN])mad_malloc(MAD_BUFFER_MDLEN); 02531 #else 02532 stream->main_data = (unsigned char (*)[MAD_BUFFER_MDLEN])malloc(MAD_BUFFER_MDLEN); 02533 #endif 02534 if (stream->main_data == 0) { 02535 stream->error = MAD_ERROR_NOMEM; 02536 return -1; 02537 } 02538 } 02539 02540 nch = MAD_NCHANNELS(header); 02541 si_len = (header->flags & MAD_FLAG_LSF_EXT) ? 02542 (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32); 02543 02544 /* check frame sanity */ 02545 02546 if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) < 02547 (signed int) si_len) { 02548 stream->error = MAD_ERROR_BADFRAMELEN; 02549 stream->md_len = 0; 02550 return -1; 02551 } 02552 02553 /* check CRC word */ 02554 02555 if (header->flags & MAD_FLAG_PROTECTION) { 02556 header->crc_check = 02557 mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check); 02558 02559 if (header->crc_check != header->crc_target && 02560 !(frame->options & MAD_OPTION_IGNORECRC)) { 02561 stream->error = MAD_ERROR_BADCRC; 02562 result = -1; 02563 } 02564 } 02565 02566 /* decode frame side information */ 02567 02568 error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT, 02569 &si, &data_bitlen, &priv_bitlen); 02570 if (error && result == 0) { 02571 stream->error = error; 02572 result = -1; 02573 } 02574 02575 header->flags |= priv_bitlen; 02576 header->private_bits |= si.private_bits; 02577 02578 /* find main_data of next frame */ 02579 02580 { 02581 struct mad_bitptr peek; 02582 unsigned long header; 02583 02584 mad_bit_init(&peek, stream->next_frame); 02585 02586 header = mad_bit_read(&peek, 32); 02587 if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) { 02588 if (!(header & 0x00010000L)) /* protection_bit */ 02589 mad_bit_skip(&peek, 16); /* crc_check */ 02590 02591 next_md_begin = 02592 mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8); 02593 } 02594 02595 mad_bit_finish(&peek); 02596 } 02597 02598 /* find main_data of this frame */ 02599 02600 frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr); 02601 02602 if (next_md_begin > si.main_data_begin + frame_space) 02603 next_md_begin = 0; 02604 02605 md_len = si.main_data_begin + frame_space - next_md_begin; 02606 02607 frame_used = 0; 02608 02609 if (si.main_data_begin == 0) { 02610 ptr = stream->ptr; 02611 stream->md_len = 0; 02612 02613 frame_used = md_len; 02614 } 02615 else { 02616 if (si.main_data_begin > stream->md_len) { 02617 if (result == 0) { 02618 stream->error = MAD_ERROR_BADDATAPTR; 02619 result = -1; 02620 } 02621 } 02622 else { 02623 mad_bit_init(&ptr, 02624 *stream->main_data + stream->md_len - si.main_data_begin); 02625 02626 if (md_len > si.main_data_begin) { 02627 /*assert(stream->md_len + md_len -si.main_data_begin <= MAD_BUFFER_MDLEN); */ 02628 02629 memcpy(*stream->main_data + stream->md_len, 02630 mad_bit_nextbyte(&stream->ptr), 02631 frame_used = md_len - si.main_data_begin); 02632 stream->md_len += frame_used; 02633 } 02634 } 02635 } 02636 02637 frame_free = frame_space - frame_used; 02638 02639 /* decode main_data */ 02640 02641 if (result == 0) { 02642 error = III_decode(&ptr, frame, &si, nch); 02643 if (error) { 02644 stream->error = error; 02645 result = -1; 02646 } 02647 02648 /* designate ancillary bits */ 02649 02650 stream->anc_ptr = ptr; 02651 stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen; 02652 } 02653 02654 # if 0 && defined(DEBUG) 02655 fprintf(stderr, 02656 "main_data_begin:%u, md_len:%u, frame_free:%u, " 02657 "data_bitlen:%u, anc_bitlen: %u\n", 02658 si.main_data_begin, md_len, frame_free, 02659 data_bitlen, stream->anc_bitlen); 02660 # endif 02661 02662 /* preload main_data buffer with up to 511 bytes for next frame(s) */ 02663 02664 if (frame_free >= next_md_begin) { 02665 memcpy(*stream->main_data, 02666 stream->next_frame - next_md_begin, next_md_begin); 02667 stream->md_len = next_md_begin; 02668 } 02669 else { 02670 if (md_len < si.main_data_begin) { 02671 unsigned int extra; 02672 02673 extra = si.main_data_begin - md_len; 02674 if (extra + frame_free > next_md_begin) 02675 extra = next_md_begin - frame_free; 02676 02677 if (extra < stream->md_len) { 02678 memmove(*stream->main_data, 02679 *stream->main_data + stream->md_len - extra, extra); 02680 stream->md_len = extra; 02681 } 02682 } 02683 else 02684 stream->md_len = 0; 02685 02686 memcpy(*stream->main_data + stream->md_len, 02687 stream->next_frame - frame_free, frame_free); 02688 stream->md_len += frame_free; 02689 } 02690 02691 return result; 02692 }
Generated on Tue Jul 12 2022 23:11:09 by 1.7.2