1 /* 2 https://github.com/lieff/minimp3 3 To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. 4 This software is distributed without any warranty. 5 See <http://creativecommons.org/publicdomain/zero/1.0/>. 6 */ 7 /** 8 Translated to D by Guillaume Piolat. 9 Stripped down a bit for the needs of audio-formats. 10 */ 11 module audioformats.minimp3; 12 13 import core.stdc.stdlib; 14 import core.stdc..string; 15 16 nothrow: 17 @nogc: 18 19 alias uint8_t = ubyte; 20 alias uint16_t = ushort; 21 alias uint32_t = uint; 22 alias uint64_t = ulong; 23 alias int16_t = short; 24 alias int32_t = int; 25 26 enum MINIMP3_MAX_SAMPLES_PER_FRAME = (1152*2); 27 28 struct mp3dec_frame_info_t 29 { 30 int frame_bytes; 31 int frame_offset; 32 int channels; 33 int hz; 34 int layer; 35 int bitrate_kbps; 36 } 37 38 struct mp3dec_t 39 { 40 float[9*32][2] mdct_overlap; 41 float[15*2*32] qmf_state; 42 int reserv; 43 int free_format_bytes; 44 ubyte[4] header; 45 ubyte[511] reserv_buf; 46 } 47 48 version = MINIMP3_FLOAT_OUTPUT; 49 50 51 alias mp3d_sample_t = float; 52 53 enum MAX_FREE_FORMAT_FRAME_SIZE = 2304; /* more than ISO spec's */ 54 enum MAX_FRAME_SYNC_MATCHES = 10; 55 56 enum MAX_L3_FRAME_PAYLOAD_BYTES = MAX_FREE_FORMAT_FRAME_SIZE; /* MUST be >= 320000/8/32000*1152 = 1440 */ 57 58 enum MAX_BITRESERVOIR_BYTES = 511; 59 enum SHORT_BLOCK_TYPE = 2; 60 enum STOP_BLOCK_TYPE = 3; 61 enum MODE_MONO = 3; 62 enum MODE_JOINT_STEREO = 1; 63 enum HDR_SIZE = 4; 64 65 bool HDR_IS_MONO(const(ubyte)* h) 66 { 67 return (((h[3]) & 0xC0) == 0xC0); 68 } 69 70 bool HDR_IS_MS_STEREO(const(ubyte)* h) 71 { 72 return (((h[3]) & 0xE0) == 0x60); 73 } 74 75 bool HDR_IS_FREE_FORMAT(const(ubyte)* h) 76 { 77 return (((h[2]) & 0xF0) == 0); 78 } 79 80 bool HDR_IS_CRC(const(ubyte)* h) 81 { 82 return (!((h[1]) & 1)); 83 } 84 85 int HDR_TEST_PADDING(const(ubyte)* h) 86 { 87 return ((h[2]) & 0x2); 88 } 89 90 int HDR_TEST_MPEG1(const(ubyte)* h) 91 { 92 return ((h[1]) & 0x8); 93 } 94 95 int HDR_TEST_NOT_MPEG25(const(ubyte)* h) 96 { 97 return ((h[1]) & 0x10); 98 } 99 100 int HDR_TEST_I_STEREO(const(ubyte)* h) 101 { 102 return ((h[3]) & 0x10); 103 } 104 105 int HDR_TEST_MS_STEREO(const(ubyte)* h) 106 { 107 return ((h[3]) & 0x20); 108 } 109 110 int HDR_GET_STEREO_MODE(const(ubyte)* h) 111 { 112 return (((h[3]) >> 6) & 3); 113 } 114 115 int HDR_GET_STEREO_MODE_EXT(const(ubyte)* h) 116 { 117 return (((h[3]) >> 4) & 3); 118 } 119 120 int HDR_GET_LAYER(const(ubyte)* h) 121 { 122 return (((h[1]) >> 1) & 3); 123 } 124 125 int HDR_GET_BITRATE(const(ubyte)* h) 126 { 127 return ((h[2]) >> 4); 128 } 129 130 int HDR_GET_SAMPLE_RATE(const(ubyte)* h) 131 { 132 return (((h[2]) >> 2) & 3); 133 } 134 135 int HDR_GET_MY_SAMPLE_RATE(const(ubyte)* h) 136 { 137 return (HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3); 138 } 139 140 bool HDR_IS_FRAME_576(const(ubyte)* h) 141 { 142 return ((h[1] & 14) == 2); 143 } 144 145 bool HDR_IS_LAYER_1(const(ubyte)* h) 146 { 147 return ((h[1] & 6) == 6); 148 } 149 150 enum BITS_DEQUANTIZER_OUT = -1; 151 enum MAX_SCF = 255 + BITS_DEQUANTIZER_OUT*4 - 210; 152 enum MAX_SCFI = (MAX_SCF + 3) & ~3; 153 154 int MINIMP3_MIN(int a, int b) 155 { 156 return (a > b) ? b : a; 157 } 158 159 ulong MINIMP3_MIN(ulong a, ulong b) 160 { 161 return (a > b) ? b : a; 162 } 163 164 int MINIMP3_MAX(int a, int b) 165 { 166 return (a < b) ? b : a; 167 } 168 169 struct bs_t 170 { 171 const(uint8_t)* buf; 172 int pos, limit; 173 } 174 175 struct L12_scale_info 176 { 177 float[3*64] scf; 178 uint8_t total_bands; 179 uint8_t stereo_bands; 180 ubyte[64] bitalloc; 181 ubyte[64] scfcod; 182 } 183 184 struct L12_subband_alloc_t 185 { 186 uint8_t tab_offset, code_tab_width, band_count; 187 } 188 189 struct L3_gr_info_t 190 { 191 const(uint8_t)* sfbtab; 192 uint16_t part_23_length, big_values, scalefac_compress; 193 uint8_t global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; 194 uint8_t[3] table_select, region_count, subblock_gain; 195 uint8_t preflag, scalefac_scale, count1_table, scfsi; 196 } 197 198 struct mp3dec_scratch_t 199 { 200 bs_t bs; 201 uint8_t[MAX_BITRESERVOIR_BYTES + MAX_L3_FRAME_PAYLOAD_BYTES] maindata; 202 L3_gr_info_t[4] gr_info; 203 float[576][2] grbuf; 204 float[40] scf; 205 float[2*32][18 + 15] syn; 206 uint8_t[39][2] ist_pos; 207 } 208 209 void bs_init(bs_t *bs, const(uint8_t)*data, int bytes) 210 { 211 bs.buf = data; 212 bs.pos = 0; 213 bs.limit = bytes*8; 214 } 215 216 uint32_t get_bits(bs_t *bs, int n) 217 { 218 uint32_t next, cache = 0, s = bs.pos & 7; 219 int shl = n + s; 220 const(uint8_t)*p = bs.buf + (bs.pos >> 3); 221 if ((bs.pos += n) > bs.limit) 222 return 0; 223 next = *p++ & (255 >> s); 224 while ((shl -= 8) > 0) 225 { 226 cache |= next << shl; 227 next = *p++; 228 } 229 return cache | (next >> -shl); 230 } 231 232 int hdr_valid(const uint8_t *h) 233 { 234 return h[0] == 0xff && 235 ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) && 236 (HDR_GET_LAYER(h) != 0) && 237 (HDR_GET_BITRATE(h) != 15) && 238 (HDR_GET_SAMPLE_RATE(h) != 3); 239 } 240 241 int hdr_compare(const uint8_t *h1, const uint8_t *h2) 242 { 243 return hdr_valid(h2) && 244 ((h1[1] ^ h2[1]) & 0xFE) == 0 && 245 ((h1[2] ^ h2[2]) & 0x0C) == 0 && 246 !(HDR_IS_FREE_FORMAT(h1) ^ HDR_IS_FREE_FORMAT(h2)); 247 } 248 249 uint hdr_bitrate_kbps(const uint8_t *h) 250 { 251 static immutable uint8_t[15][3][2] halfrate = 252 [ 253 [ [ 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 ], [ 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 ], [ 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 ] ], 254 [ [ 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 ], [ 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 ], [ 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 ] ], 255 ]; 256 return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)]; 257 } 258 259 uint hdr_sample_rate_hz(const uint8_t *h) 260 { 261 static immutable uint[3] g_hz = [ 44100, 48000, 32000 ]; 262 return g_hz[HDR_GET_SAMPLE_RATE(h)] >> cast(int)!HDR_TEST_MPEG1(h) >> cast(int)!HDR_TEST_NOT_MPEG25(h); 263 } 264 265 uint hdr_frame_samples(const uint8_t *h) 266 { 267 return HDR_IS_LAYER_1(h) ? 384 : (1152 >> cast(int)HDR_IS_FRAME_576(h)); 268 } 269 270 int hdr_frame_bytes(const uint8_t *h, int free_format_size) 271 { 272 int frame_bytes = hdr_frame_samples(h)*hdr_bitrate_kbps(h)*125/hdr_sample_rate_hz(h); 273 if (HDR_IS_LAYER_1(h)) 274 { 275 frame_bytes &= ~3; /* slot align */ 276 } 277 return frame_bytes ? frame_bytes : free_format_size; 278 } 279 280 static int hdr_padding(const uint8_t *h) 281 { 282 return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0; 283 } 284 285 286 const(L12_subband_alloc_t)* L12_subband_alloc_table(const uint8_t *hdr, L12_scale_info *sci) 287 { 288 const(L12_subband_alloc_t) *alloc; 289 int mode = HDR_GET_STEREO_MODE(hdr); 290 int nbands, stereo_bands = (mode == MODE_MONO) ? 0 : (mode == MODE_JOINT_STEREO) ? (HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32; 291 292 if (HDR_IS_LAYER_1(hdr)) 293 { 294 static immutable L12_subband_alloc_t[] g_alloc_L1 = 295 [ 296 L12_subband_alloc_t(76, 4, 32) 297 ]; 298 alloc = g_alloc_L1.ptr; 299 nbands = 32; 300 } 301 else if (!HDR_TEST_MPEG1(hdr)) 302 { 303 static immutable L12_subband_alloc_t[] g_alloc_L2M2 = 304 [ 305 L12_subband_alloc_t(60, 4, 4), 306 L12_subband_alloc_t(44, 3, 7 ), 307 L12_subband_alloc_t(44, 2, 19), 308 ]; 309 alloc = g_alloc_L2M2.ptr; 310 nbands = 30; 311 } 312 else 313 { 314 static immutable L12_subband_alloc_t[] g_alloc_L2M1 = 315 [ 316 L12_subband_alloc_t(0, 4, 3), 317 L12_subband_alloc_t(16, 4, 8), 318 L12_subband_alloc_t(32, 3, 12), 319 L12_subband_alloc_t(40, 2, 7) 320 ]; 321 322 int sample_rate_idx = HDR_GET_SAMPLE_RATE(hdr); 323 uint kbps = hdr_bitrate_kbps(hdr) >> cast(int)(mode != MODE_MONO); 324 if (!kbps) /* free-format */ 325 { 326 kbps = 192; 327 } 328 329 alloc = g_alloc_L2M1.ptr; 330 nbands = 27; 331 if (kbps < 56) 332 { 333 static immutable L12_subband_alloc_t[] g_alloc_L2M1_lowrate = 334 [ 335 336 L12_subband_alloc_t(44, 4, 2), 337 L12_subband_alloc_t(44, 3, 10) 338 ]; 339 alloc = g_alloc_L2M1_lowrate.ptr; 340 nbands = sample_rate_idx == 2 ? 12 : 8; 341 } 342 else if (kbps >= 96 && sample_rate_idx != 1) 343 { 344 nbands = 30; 345 } 346 } 347 348 sci.total_bands = cast(uint8_t)nbands; 349 sci.stereo_bands = cast(uint8_t)MINIMP3_MIN(stereo_bands, nbands); 350 351 return alloc; 352 } 353 354 void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod, int bands, float *scf) 355 { 356 static immutable float[18*3] g_deq_L12 = 357 [ 358 3.17891e-07, 2.52311e-07, 2.00259e-07, 1.36239e-07, 1.08133e-07, 8.58253e-08, 359 6.35783e-08, 5.04621e-08, 4.00518e-08, 3.07637e-08, 2.44172e-08, 1.93799e-08, 360 1.51377e-08, 1.20148e-08, 9.53615e-09, 7.50925e-09, 5.96009e-09, 4.73053e-09, 361 3.7399e-09, 2.96836e-09, 2.35599e-09, 1.86629e-09, 1.48128e-09, 1.17569e-09, 362 9.32233e-10, 7.39914e-10, 5.8727e-10, 4.65889e-10, 3.69776e-10, 2.93492e-10, 363 2.32888e-10, 1.84843e-10, 1.4671e-10, 1.1643e-10, 9.24102e-11, 7.3346e-11, 364 5.82112e-11, 4.62023e-11, 3.66708e-11, 2.91047e-11, 2.31004e-11, 1.83348e-11, 365 1.45521e-11, 1.155e-11, 9.16727e-12, 3.17891e-07, 2.52311e-07, 2.00259e-07, 366 1.90735e-07, 1.51386e-07, 1.20155e-07, 1.05964e-07, 8.41035e-08, 6.6753e-08 367 ]; 368 369 int i, m; 370 for (i = 0; i < bands; i++) 371 { 372 float s = 0; 373 int ba = *pba++; 374 int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0; 375 for (m = 4; m; m >>= 1) 376 { 377 if (mask & m) 378 { 379 int b = get_bits(bs, 6); 380 s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3); 381 } 382 *scf++ = s; 383 } 384 } 385 } 386 387 void L12_read_scale_info(const uint8_t *hdr, bs_t *bs, L12_scale_info *sci) 388 { 389 static immutable uint8_t[] g_bitalloc_code_tab = 390 [ 391 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16, 392 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16, 393 0,17,18, 3,19,4,5,16, 394 0,17,18,16, 395 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15, 396 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14, 397 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16 398 ]; 399 const(L12_subband_alloc_t)* subband_alloc = L12_subband_alloc_table(hdr, sci); 400 401 int i, k = 0, ba_bits = 0; 402 const(uint8_t)*ba_code_tab = g_bitalloc_code_tab.ptr; 403 404 for (i = 0; i < sci.total_bands; i++) 405 { 406 uint8_t ba; 407 if (i == k) 408 { 409 k += subband_alloc.band_count; 410 ba_bits = subband_alloc.code_tab_width; 411 ba_code_tab = g_bitalloc_code_tab.ptr + subband_alloc.tab_offset; 412 subband_alloc++; 413 } 414 ba = ba_code_tab[get_bits(bs, ba_bits)]; 415 sci.bitalloc[2*i] = ba; 416 if (i < sci.stereo_bands) 417 { 418 ba = ba_code_tab[get_bits(bs, ba_bits)]; 419 } 420 sci.bitalloc[2*i + 1] = sci.stereo_bands ? ba : 0; 421 } 422 423 for (i = 0; i < 2*sci.total_bands; i++) 424 { 425 ubyte temp = ( HDR_IS_LAYER_1(hdr) ? 2 : cast(ubyte) get_bits(bs, 2) ); 426 sci.scfcod[i] = sci.bitalloc[i] ? temp : 6; 427 } 428 429 L12_read_scalefactors(bs, sci.bitalloc.ptr, sci.scfcod.ptr, sci.total_bands*2, sci.scf.ptr); 430 431 for (i = sci.stereo_bands; i < sci.total_bands; i++) 432 { 433 sci.bitalloc[2*i + 1] = 0; 434 } 435 } 436 437 int L12_dequantize_granule(float *grbuf, bs_t *bs, L12_scale_info *sci, int group_size) 438 { 439 int i, j, k, choff = 576; 440 for (j = 0; j < 4; j++) 441 { 442 float *dst = grbuf + group_size*j; 443 for (i = 0; i < 2*sci.total_bands; i++) 444 { 445 int ba = sci.bitalloc[i]; 446 if (ba != 0) 447 { 448 if (ba < 17) 449 { 450 int half = (1 << (ba - 1)) - 1; 451 for (k = 0; k < group_size; k++) 452 { 453 dst[k] = cast(float)(cast(int)get_bits(bs, ba) - half); 454 } 455 } else 456 { 457 uint mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */ 458 uint code = get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */ 459 for (k = 0; k < group_size; k++, code /= mod) 460 { 461 dst[k] = cast(float)(cast(int)(code % mod - mod/2)); 462 } 463 } 464 } 465 dst += choff; 466 choff = 18 - choff; 467 } 468 } 469 return group_size*4; 470 } 471 472 void L12_apply_scf_384(L12_scale_info *sci, const(float)*scf, float *dst) 473 { 474 int i, k; 475 memcpy(dst + 576 + sci.stereo_bands*18, dst + sci.stereo_bands*18, (sci.total_bands - sci.stereo_bands)*18*float.sizeof); 476 for (i = 0; i < sci.total_bands; i++, dst += 18, scf += 6) 477 { 478 for (k = 0; k < 12; k++) 479 { 480 dst[k + 0] *= scf[0]; 481 dst[k + 576] *= scf[3]; 482 } 483 } 484 } 485 486 487 int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr, const uint8_t *hdr) 488 { 489 static immutable uint8_t[23][8] g_scf_long = 490 [ 491 [ 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 ], 492 [ 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 ], 493 [ 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 ], 494 [ 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 ], 495 [ 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 ], 496 [ 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 ], 497 [ 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 ], 498 [ 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 ] 499 ]; 500 static immutable uint8_t[40][8] g_scf_short = [ 501 [ 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 ], 502 [ 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 ], 503 [ 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 ], 504 [ 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 ], 505 [ 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 ], 506 [ 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 ], 507 [ 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 ], 508 [ 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 ] 509 ]; 510 static immutable uint8_t[40][8] g_scf_mixed = [ 511 [ 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 ], 512 [ 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 ], 513 [ 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 ], 514 [ 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 ], 515 [ 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 ], 516 [ 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 ], 517 [ 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 ], 518 [ 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 ] 519 ]; 520 521 uint tables, scfsi = 0; 522 int main_data_begin, part_23_sum = 0; 523 int sr_idx = HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0); 524 int gr_count = HDR_IS_MONO(hdr) ? 1 : 2; 525 526 if (HDR_TEST_MPEG1(hdr)) 527 { 528 gr_count *= 2; 529 main_data_begin = get_bits(bs, 9); 530 scfsi = get_bits(bs, 7 + gr_count); 531 } else 532 { 533 main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count; 534 } 535 536 do 537 { 538 if (HDR_IS_MONO(hdr)) 539 { 540 scfsi <<= 4; 541 } 542 gr.part_23_length = cast(uint16_t)get_bits(bs, 12); 543 part_23_sum += gr.part_23_length; 544 gr.big_values = cast(uint16_t)get_bits(bs, 9); 545 if (gr.big_values > 288) 546 { 547 return -1; 548 } 549 gr.global_gain = cast(uint8_t)get_bits(bs, 8); 550 gr.scalefac_compress = cast(uint16_t)get_bits(bs, HDR_TEST_MPEG1(hdr) ? 4 : 9); 551 gr.sfbtab = g_scf_long[sr_idx].ptr; 552 gr.n_long_sfb = 22; 553 gr.n_short_sfb = 0; 554 if (get_bits(bs, 1)) 555 { 556 gr.block_type = cast(uint8_t)get_bits(bs, 2); 557 if (!gr.block_type) 558 { 559 return -1; 560 } 561 gr.mixed_block_flag = cast(uint8_t)get_bits(bs, 1); 562 gr.region_count[0] = 7; 563 gr.region_count[1] = 255; 564 if (gr.block_type == SHORT_BLOCK_TYPE) 565 { 566 scfsi &= 0x0F0F; 567 if (!gr.mixed_block_flag) 568 { 569 gr.region_count[0] = 8; 570 gr.sfbtab = g_scf_short[sr_idx].ptr; 571 gr.n_long_sfb = 0; 572 gr.n_short_sfb = 39; 573 } else 574 { 575 gr.sfbtab = g_scf_mixed[sr_idx].ptr; 576 gr.n_long_sfb = HDR_TEST_MPEG1(hdr) ? 8 : 6; 577 gr.n_short_sfb = 30; 578 } 579 } 580 tables = get_bits(bs, 10); 581 tables <<= 5; 582 gr.subblock_gain[0] = cast(uint8_t)get_bits(bs, 3); 583 gr.subblock_gain[1] = cast(uint8_t)get_bits(bs, 3); 584 gr.subblock_gain[2] = cast(uint8_t)get_bits(bs, 3); 585 } else 586 { 587 gr.block_type = 0; 588 gr.mixed_block_flag = 0; 589 tables = get_bits(bs, 15); 590 gr.region_count[0] = cast(uint8_t)get_bits(bs, 4); 591 gr.region_count[1] = cast(uint8_t)get_bits(bs, 3); 592 gr.region_count[2] = 255; 593 } 594 gr.table_select[0] = cast(uint8_t)(tables >> 10); 595 gr.table_select[1] = cast(uint8_t)((tables >> 5) & 31); 596 gr.table_select[2] = cast(uint8_t)((tables) & 31); 597 gr.preflag = HDR_TEST_MPEG1(hdr) ? (cast(ubyte) get_bits(bs, 1)) : (gr.scalefac_compress >= 500); 598 gr.scalefac_scale = cast(uint8_t)get_bits(bs, 1); 599 gr.count1_table = cast(uint8_t)get_bits(bs, 1); 600 gr.scfsi = cast(uint8_t)((scfsi >> 12) & 15); 601 scfsi <<= 4; 602 gr++; 603 } while(--gr_count); 604 605 if (part_23_sum + bs.pos > bs.limit + main_data_begin*8) 606 { 607 return -1; 608 } 609 610 return main_data_begin; 611 } 612 613 void L3_read_scalefactors(uint8_t *scf, uint8_t *ist_pos, const uint8_t *scf_size, const uint8_t *scf_count, bs_t *bitbuf, int scfsi) 614 { 615 int i, k; 616 for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2) 617 { 618 int cnt = scf_count[i]; 619 if (scfsi & 8) 620 { 621 memcpy(scf, ist_pos, cnt); 622 } else 623 { 624 int bits = scf_size[i]; 625 if (!bits) 626 { 627 memset(scf, 0, cnt); 628 memset(ist_pos, 0, cnt); 629 } else 630 { 631 int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; 632 for (k = 0; k < cnt; k++) 633 { 634 int s = get_bits(bitbuf, bits); 635 ist_pos[k] = cast(ubyte)(s == max_scf ? -1 : s); 636 scf[k] = cast(ubyte)s; 637 } 638 } 639 } 640 ist_pos += cnt; 641 scf += cnt; 642 } 643 scf[0] = scf[1] = scf[2] = 0; 644 } 645 646 float L3_ldexp_q2(float y, int exp_q2) 647 { 648 static immutable float[4] g_expfrac = 649 [ 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f ]; 650 int e; 651 do 652 { 653 e = MINIMP3_MIN(30*4, exp_q2); 654 y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2)); 655 } while ((exp_q2 -= e) > 0); 656 return y; 657 } 658 659 void L3_decode_scalefactors(const uint8_t *hdr, uint8_t *ist_pos, bs_t *bs, const L3_gr_info_t *gr, float *scf, int ch) 660 { 661 static immutable uint8_t[28][3] g_scf_partitions = [ 662 [ 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 ], 663 [ 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 ], 664 [ 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 ] 665 ]; 666 const(uint8_t)* scf_partition = g_scf_partitions[!!gr.n_short_sfb + !gr.n_long_sfb].ptr; 667 uint8_t[4] scf_size; 668 uint8_t[40] iscf; 669 int i, scf_shift = gr.scalefac_scale + 1, gain_exp, scfsi = gr.scfsi; 670 float gain; 671 672 if (HDR_TEST_MPEG1(hdr)) 673 { 674 static immutable uint8_t[16] g_scfc_decode = [ 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 ]; 675 int part = g_scfc_decode[gr.scalefac_compress]; 676 scf_size[1] = scf_size[0] = cast(uint8_t)(part >> 2); 677 scf_size[3] = scf_size[2] = cast(uint8_t)(part & 3); 678 } else 679 { 680 static immutable uint8_t[6*4] g_mod = [ 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 ]; 681 int k, modprod, sfc, ist = HDR_TEST_I_STEREO(hdr) && ch; 682 sfc = gr.scalefac_compress >> ist; 683 for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4) 684 { 685 for (modprod = 1, i = 3; i >= 0; i--) 686 { 687 scf_size[i] = cast(uint8_t)(sfc / modprod % g_mod[k + i]); 688 modprod *= g_mod[k + i]; 689 } 690 } 691 scf_partition += k; 692 scfsi = -16; 693 } 694 L3_read_scalefactors(iscf.ptr, ist_pos, scf_size.ptr, scf_partition, bs, scfsi); 695 696 if (gr.n_short_sfb) 697 { 698 int sh = 3 - scf_shift; 699 for (i = 0; i < gr.n_short_sfb; i += 3) 700 { 701 iscf[gr.n_long_sfb + i + 0] += gr.subblock_gain[0] << sh; 702 iscf[gr.n_long_sfb + i + 1] += gr.subblock_gain[1] << sh; 703 iscf[gr.n_long_sfb + i + 2] += gr.subblock_gain[2] << sh; 704 } 705 } else if (gr.preflag) 706 { 707 static immutable uint8_t[10] g_preamp = [ 1,1,1,1,2,2,3,3,3,2 ]; 708 for (i = 0; i < 10; i++) 709 { 710 iscf[11 + i] += g_preamp[i]; 711 } 712 } 713 714 gain_exp = gr.global_gain + BITS_DEQUANTIZER_OUT*4 - 210 - (HDR_IS_MS_STEREO(hdr) ? 2 : 0); 715 gain = L3_ldexp_q2(1 << (MAX_SCFI/4), MAX_SCFI - gain_exp); 716 for (i = 0; i < cast(int)(gr.n_long_sfb + gr.n_short_sfb); i++) 717 { 718 scf[i] = L3_ldexp_q2(gain, iscf[i] << scf_shift); 719 } 720 } 721 722 static immutable float[129 + 16] g_pow43 = [ 723 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, 724 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f 725 ]; 726 727 float L3_pow_43(int x) 728 { 729 float frac; 730 int sign, mult = 256; 731 732 if (x < 129) 733 { 734 return g_pow43[16 + x]; 735 } 736 737 if (x < 1024) 738 { 739 mult = 16; 740 x <<= 3; 741 } 742 743 sign = 2*x & 64; 744 frac = cast(float)((x & 63) - sign) / ((x & ~63) + sign); 745 return g_pow43[16 + ((x + sign) >> 6)]*(1.0f + frac*((4.0f/3) + frac*(2.0f/9)))*mult; 746 } 747 748 void L3_huffman(float *dst, bs_t *bs, const L3_gr_info_t *gr_info, const(float)*scf, int layer3gr_limit) 749 { 750 static immutable int16_t[] tabs = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 751 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 752 -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288, 753 -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288, 754 -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258, 755 -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259, 756 -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258, 757 -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258, 758 -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259, 759 -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258, 760 -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290, 761 -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259, 762 -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258, 763 -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259, 764 -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258, 765 -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 ]; 766 static immutable uint8_t[] tab32 = [ 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205 ]; 767 static immutable uint8_t[] tab33 = [ 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 ]; 768 static immutable int16_t[2*16] tabindex = [ 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 ]; 769 static immutable uint8_t[] g_linbits = [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 ]; 770 771 772 float one = 0.0f; 773 int ireg = 0, big_val_cnt = gr_info.big_values; 774 const(uint8_t)* sfb = gr_info.sfbtab; 775 const(uint8_t)* bs_next_ptr = bs.buf + bs.pos/8; 776 uint32_t bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs.pos & 7); 777 int pairs_to_decode, np, bs_sh = (bs.pos & 7) - 8; 778 bs_next_ptr += 4; 779 780 while (big_val_cnt > 0) 781 { 782 int tab_num = gr_info.table_select[ireg]; 783 int sfb_cnt = gr_info.region_count[ireg++]; 784 const int16_t *codebook = tabs.ptr + tabindex[tab_num]; 785 int linbits = g_linbits[tab_num]; 786 if (linbits) 787 { 788 do 789 { 790 np = *sfb++ / 2; 791 pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); 792 one = *scf++; 793 do 794 { 795 int j, w = 5; 796 int leaf = codebook[(bs_cache >> (32 - w))]; 797 while (leaf < 0) 798 { 799 { bs_cache <<= (w); bs_sh += (w); } 800 w = leaf & 7; 801 leaf = codebook[(bs_cache >> (32 - w)) - (leaf >> 3)]; 802 } 803 { bs_cache <<= (leaf >> 8); bs_sh += (leaf >> 8); } 804 805 for (j = 0; j < 2; j++, dst++, leaf >>= 4) 806 { 807 int lsb = leaf & 0x0F; 808 if (lsb == 15) 809 { 810 lsb += (bs_cache >> (32 - linbits)); 811 { bs_cache <<= (linbits); bs_sh += (linbits); } 812 while (bs_sh >= 0) { bs_cache |= cast(uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } 813 *dst = one*L3_pow_43(lsb)*(cast(int32_t)bs_cache < 0 ? -1: 1); 814 } else 815 { 816 *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; 817 } 818 819 { bs_cache <<= (lsb ? 1 : 0); bs_sh += (lsb ? 1 : 0); } 820 } 821 while (bs_sh >= 0) { bs_cache |= cast(uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } 822 } while (--pairs_to_decode); 823 } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); 824 } else 825 { 826 do 827 { 828 np = *sfb++ / 2; 829 pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); 830 one = *scf++; 831 do 832 { 833 int j, w = 5; 834 int leaf = codebook[(bs_cache >> (32 - w))]; 835 while (leaf < 0) 836 { 837 { bs_cache <<= (w); bs_sh += (w); } 838 w = leaf & 7; 839 leaf = codebook[(bs_cache >> (32 - w)) - (leaf >> 3)]; 840 } 841 { bs_cache <<= (leaf >> 8); bs_sh += (leaf >> 8); } 842 843 for (j = 0; j < 2; j++, dst++, leaf >>= 4) 844 { 845 int lsb = leaf & 0x0F; 846 *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; 847 { bs_cache <<= (lsb ? 1 : 0); bs_sh += (lsb ? 1 : 0); } 848 } 849 while (bs_sh >= 0) { bs_cache |= cast(uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } 850 } while (--pairs_to_decode); 851 } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); 852 } 853 } 854 855 for (np = 1 - big_val_cnt;; dst += 4) 856 { 857 const uint8_t *codebook_count1 = (gr_info.count1_table) ? tab33.ptr : tab32.ptr; 858 int leaf = codebook_count1[(bs_cache >> (32 - 4))]; 859 if (!(leaf & 8)) 860 { 861 leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))]; 862 } 863 864 { bs_cache <<= (leaf & 7); bs_sh += (leaf & 7); } 865 866 if (((bs_next_ptr - bs.buf)*8 - 24 + bs_sh) > layer3gr_limit) 867 { 868 break; 869 } 870 //#define RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } 871 //#define DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((int32_t)bs_cache < 0) ? -one : one; FLUSH_BITS(1) } 872 873 if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } 874 /*DEQ_COUNT1(0);*/ if (leaf & (128 >> 0)) { dst[0] = (cast(int32_t)bs_cache < 0) ? -one : one; { bs_cache <<= (1); bs_sh += (1); } } 875 /*DEQ_COUNT1(1);*/ if (leaf & (128 >> 1)) { dst[1] = (cast(int32_t)bs_cache < 0) ? -one : one; { bs_cache <<= (1); bs_sh += (1); } } 876 if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } 877 /* DEQ_COUNT1(2); */ if (leaf & (128 >> 2)) { dst[2] = (cast(int32_t)bs_cache < 0) ? -one : one; { bs_cache <<= (1); bs_sh += (1); } } 878 /* DEQ_COUNT1(3); */ if (leaf & (128 >> 3)) { dst[3] = (cast(int32_t)bs_cache < 0) ? -one : one; { bs_cache <<= (1); bs_sh += (1); } } 879 while (bs_sh >= 0) { bs_cache |= cast(uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } 880 } 881 882 bs.pos = layer3gr_limit; 883 } 884 885 void L3_midside_stereo(float *left, int n) 886 { 887 int i = 0; 888 float *right = left + 576; 889 for (; i < n; i++) 890 { 891 float a = left[i]; 892 float b = right[i]; 893 left[i] = a + b; 894 right[i] = a - b; 895 } 896 } 897 898 void L3_intensity_stereo_band(float *left, int n, float kl, float kr) 899 { 900 int i; 901 for (i = 0; i < n; i++) 902 { 903 left[i + 576] = left[i]*kr; 904 left[i] = left[i]*kl; 905 } 906 } 907 908 void L3_stereo_top_band(const(float)*right, const uint8_t *sfb, int nbands, int* max_band) 909 { 910 int i, k; 911 912 max_band[0] = max_band[1] = max_band[2] = -1; 913 914 for (i = 0; i < nbands; i++) 915 { 916 for (k = 0; k < sfb[i]; k += 2) 917 { 918 if (right[k] != 0 || right[k + 1] != 0) 919 { 920 max_band[i % 3] = i; 921 break; 922 } 923 } 924 right += sfb[i]; 925 } 926 } 927 928 void L3_stereo_process(float *left, const uint8_t *ist_pos, const uint8_t *sfb, const uint8_t *hdr, int* max_band, int mpeg2_sh) 929 { 930 static immutable float[7*2] g_pan = [ 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 ]; 931 uint i; 932 uint max_pos = HDR_TEST_MPEG1(hdr) ? 7 : 64; 933 934 for (i = 0; sfb[i]; i++) 935 { 936 uint ipos = ist_pos[i]; 937 if (cast(int)i > max_band[i % 3] && ipos < max_pos) 938 { 939 float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1; 940 if (HDR_TEST_MPEG1(hdr)) 941 { 942 kl = g_pan[2*ipos]; 943 kr = g_pan[2*ipos + 1]; 944 } else 945 { 946 kl = 1; 947 kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh); 948 if (ipos & 1) 949 { 950 kl = kr; 951 kr = 1; 952 } 953 } 954 L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s); 955 } else if (HDR_TEST_MS_STEREO(hdr)) 956 { 957 L3_midside_stereo(left, sfb[i]); 958 } 959 left += sfb[i]; 960 } 961 } 962 963 void L3_intensity_stereo(float *left, uint8_t *ist_pos, const L3_gr_info_t *gr, const uint8_t *hdr) 964 { 965 int[3] max_band; 966 int n_sfb = gr.n_long_sfb + gr.n_short_sfb; 967 int i, max_blocks = gr.n_short_sfb ? 3 : 1; 968 969 L3_stereo_top_band(left + 576, gr.sfbtab, n_sfb, max_band.ptr); 970 if (gr.n_long_sfb) 971 { 972 max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]); 973 } 974 for (i = 0; i < max_blocks; i++) 975 { 976 int default_pos = HDR_TEST_MPEG1(hdr) ? 3 : 0; 977 int itop = n_sfb - max_blocks + i; 978 int prev = itop - max_blocks; 979 ist_pos[itop] = cast(ubyte)( max_band[i] >= prev ? default_pos : ist_pos[prev] ); 980 } 981 L3_stereo_process(left, ist_pos, gr.sfbtab, hdr, max_band.ptr, gr[1].scalefac_compress & 1); 982 } 983 984 void L3_reorder(float *grbuf, float *scratch, const(uint8_t) *sfb) 985 { 986 int i, len; 987 float *src = grbuf; 988 float *dst = scratch; 989 990 for (;0 != (len = *sfb); sfb += 3, src += 2*len) 991 { 992 for (i = 0; i < len; i++, src++) 993 { 994 *dst++ = src[0*len]; 995 *dst++ = src[1*len]; 996 *dst++ = src[2*len]; 997 } 998 } 999 memcpy(grbuf, scratch, (dst - scratch)*float.sizeof); 1000 } 1001 1002 void L3_antialias(float *grbuf, int nbands) 1003 { 1004 static immutable float[8][2] g_aa = [ 1005 [0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f], 1006 [0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f] 1007 ]; 1008 1009 for (; nbands > 0; nbands--, grbuf += 18) 1010 { 1011 int i = 0; 1012 for(; i < 8; i++) 1013 { 1014 float u = grbuf[18 + i]; 1015 float d = grbuf[17 - i]; 1016 grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i]; 1017 grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i]; 1018 } 1019 } 1020 } 1021 1022 void L3_dct3_9(float *y) 1023 { 1024 float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4; 1025 1026 s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8]; 1027 t0 = s0 + s6*0.5f; 1028 s0 -= s6; 1029 t4 = (s4 + s2)*0.93969262f; 1030 t2 = (s8 + s2)*0.76604444f; 1031 s6 = (s4 - s8)*0.17364818f; 1032 s4 += s8 - s2; 1033 1034 s2 = s0 - s4*0.5f; 1035 y[4] = s4 + s0; 1036 s8 = t0 - t2 + s6; 1037 s0 = t0 - t4 + t2; 1038 s4 = t0 + t4 - s6; 1039 1040 s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7]; 1041 1042 s3 *= 0.86602540f; 1043 t0 = (s5 + s1)*0.98480775f; 1044 t4 = (s5 - s7)*0.34202014f; 1045 t2 = (s1 + s7)*0.64278761f; 1046 s1 = (s1 - s5 - s7)*0.86602540f; 1047 1048 s5 = t0 - s3 - t2; 1049 s7 = t4 - s3 - t0; 1050 s3 = t4 + s3 - t2; 1051 1052 y[0] = s4 - s7; 1053 y[1] = s2 + s1; 1054 y[2] = s0 - s3; 1055 y[3] = s8 + s5; 1056 y[5] = s8 - s5; 1057 y[6] = s0 + s3; 1058 y[7] = s2 - s1; 1059 y[8] = s4 + s7; 1060 } 1061 1062 void L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands) 1063 { 1064 int i, j; 1065 static immutable float[18] g_twid9 = [ 1066 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f 1067 ]; 1068 1069 for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9) 1070 { 1071 float[9] co, si; 1072 co[0] = -grbuf[0]; 1073 si[0] = grbuf[17]; 1074 for (i = 0; i < 4; i++) 1075 { 1076 si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2]; 1077 co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2]; 1078 si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3]; 1079 co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]); 1080 } 1081 L3_dct3_9(co.ptr); 1082 L3_dct3_9(si.ptr); 1083 1084 si[1] = -si[1]; 1085 si[3] = -si[3]; 1086 si[5] = -si[5]; 1087 si[7] = -si[7]; 1088 1089 i = 0; 1090 1091 for (; i < 9; i++) 1092 { 1093 float ovl = overlap[i]; 1094 float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i]; 1095 overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i]; 1096 grbuf[i] = ovl*window[0 + i] - sum*window[9 + i]; 1097 grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i]; 1098 } 1099 } 1100 } 1101 1102 void L3_idct3(float x0, float x1, float x2, float *dst) 1103 { 1104 float m1 = x1*0.86602540f; 1105 float a1 = x0 - x2*0.5f; 1106 dst[1] = x0 + x2; 1107 dst[0] = a1 + m1; 1108 dst[2] = a1 - m1; 1109 } 1110 1111 void L3_imdct12(float *x, float *dst, float *overlap) 1112 { 1113 static immutable float[6] g_twid3 = [ 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f ]; 1114 float[3] co, si; 1115 int i; 1116 1117 L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co.ptr); 1118 L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si.ptr); 1119 si[1] = -si[1]; 1120 1121 for (i = 0; i < 3; i++) 1122 { 1123 float ovl = overlap[i]; 1124 float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i]; 1125 overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i]; 1126 dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i]; 1127 dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i]; 1128 } 1129 } 1130 1131 void L3_imdct_short(float *grbuf, float *overlap, int nbands) 1132 { 1133 for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) 1134 { 1135 float[18] tmp; 1136 memcpy(tmp.ptr, grbuf, tmp.sizeof); 1137 memcpy(grbuf, overlap, 6*float.sizeof); 1138 L3_imdct12(tmp.ptr, grbuf + 6, overlap + 6); 1139 L3_imdct12(tmp.ptr + 1, grbuf + 12, overlap + 6); 1140 L3_imdct12(tmp.ptr + 2, overlap, overlap + 6); 1141 } 1142 } 1143 1144 void L3_change_sign(float *grbuf) 1145 { 1146 int b, i; 1147 for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36) 1148 for (i = 1; i < 18; i += 2) 1149 grbuf[i] = -grbuf[i]; 1150 } 1151 1152 void L3_imdct_gr(float *grbuf, float *overlap, uint block_type, uint n_long_bands) 1153 { 1154 static immutable float[18][2] g_mdct_window = [ 1155 [ 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f ], 1156 [ 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f ] 1157 ]; 1158 if (n_long_bands) 1159 { 1160 L3_imdct36(grbuf, overlap, g_mdct_window[0].ptr, n_long_bands); 1161 grbuf += 18*n_long_bands; 1162 overlap += 9*n_long_bands; 1163 } 1164 if (block_type == SHORT_BLOCK_TYPE) 1165 L3_imdct_short(grbuf, overlap, 32 - n_long_bands); 1166 else 1167 L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE].ptr, 32 - n_long_bands); 1168 } 1169 1170 void L3_save_reservoir(mp3dec_t *h, mp3dec_scratch_t *s) 1171 { 1172 int pos = (s.bs.pos + 7)/8u; 1173 int remains = s.bs.limit/8u - pos; 1174 if (remains > MAX_BITRESERVOIR_BYTES) 1175 { 1176 pos += remains - MAX_BITRESERVOIR_BYTES; 1177 remains = MAX_BITRESERVOIR_BYTES; 1178 } 1179 if (remains > 0) 1180 { 1181 memmove(h.reserv_buf.ptr, s.maindata.ptr + pos, remains); 1182 } 1183 h.reserv = remains; 1184 } 1185 1186 static int L3_restore_reservoir(mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s, int main_data_begin) 1187 { 1188 int frame_bytes = (bs.limit - bs.pos)/8; 1189 int bytes_have = MINIMP3_MIN(h.reserv, main_data_begin); 1190 memcpy(s.maindata.ptr, h.reserv_buf.ptr + MINIMP3_MAX(0, h.reserv - main_data_begin), MINIMP3_MIN(h.reserv, main_data_begin)); 1191 memcpy(s.maindata.ptr + bytes_have, bs.buf + bs.pos/8, frame_bytes); 1192 bs_init(&s.bs, s.maindata.ptr, bytes_have + frame_bytes); 1193 return h.reserv >= main_data_begin; 1194 } 1195 1196 void L3_decode(mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info, int nch) 1197 { 1198 int ch; 1199 1200 for (ch = 0; ch < nch; ch++) 1201 { 1202 int layer3gr_limit = s.bs.pos + gr_info[ch].part_23_length; 1203 L3_decode_scalefactors(h.header.ptr, s.ist_pos[ch].ptr, &s.bs, gr_info + ch, s.scf.ptr, ch); 1204 L3_huffman(s.grbuf[ch].ptr, &s.bs, gr_info + ch, s.scf.ptr, layer3gr_limit); 1205 } 1206 1207 if (HDR_TEST_I_STEREO(h.header.ptr)) 1208 { 1209 L3_intensity_stereo(s.grbuf[0].ptr, s.ist_pos[1].ptr, gr_info, h.header.ptr); 1210 } else if (HDR_IS_MS_STEREO(h.header.ptr)) 1211 { 1212 L3_midside_stereo(s.grbuf[0].ptr, 576); 1213 } 1214 1215 for (ch = 0; ch < nch; ch++, gr_info++) 1216 { 1217 int aa_bands = 31; 1218 int n_long_bands = (gr_info.mixed_block_flag ? 2 : 0) << cast(int)(HDR_GET_MY_SAMPLE_RATE(h.header.ptr) == 2); 1219 1220 if (gr_info.n_short_sfb) 1221 { 1222 aa_bands = n_long_bands - 1; 1223 L3_reorder(s.grbuf[ch].ptr + n_long_bands*18, s.syn[0].ptr, gr_info.sfbtab + gr_info.n_long_sfb); 1224 } 1225 1226 L3_antialias(s.grbuf[ch].ptr, aa_bands); 1227 L3_imdct_gr(s.grbuf[ch].ptr, h.mdct_overlap[ch].ptr, gr_info.block_type, n_long_bands); 1228 L3_change_sign(s.grbuf[ch].ptr); 1229 } 1230 } 1231 1232 void mp3d_DCT_II(float *grbuf, int n) 1233 { 1234 static immutable float[24] g_sec = [ 1235 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f 1236 ]; 1237 int i, k = 0; 1238 1239 for (; k < n; k++) 1240 { 1241 float[8][4] t; 1242 float* x, y = grbuf + k; 1243 1244 for (x = t[0].ptr, i = 0; i < 8; i++, x++) 1245 { 1246 float x0 = y[i*18]; 1247 float x1 = y[(15 - i)*18]; 1248 float x2 = y[(16 + i)*18]; 1249 float x3 = y[(31 - i)*18]; 1250 float t0 = x0 + x3; 1251 float t1 = x1 + x2; 1252 float t2 = (x1 - x2)*g_sec[3*i + 0]; 1253 float t3 = (x0 - x3)*g_sec[3*i + 1]; 1254 x[0] = t0 + t1; 1255 x[8] = (t0 - t1)*g_sec[3*i + 2]; 1256 x[16] = t3 + t2; 1257 x[24] = (t3 - t2)*g_sec[3*i + 2]; 1258 } 1259 for (x = t[0].ptr, i = 0; i < 4; i++, x += 8) 1260 { 1261 float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; 1262 xt = x0 - x7; x0 += x7; 1263 x7 = x1 - x6; x1 += x6; 1264 x6 = x2 - x5; x2 += x5; 1265 x5 = x3 - x4; x3 += x4; 1266 x4 = x0 - x3; x0 += x3; 1267 x3 = x1 - x2; x1 += x2; 1268 x[0] = x0 + x1; 1269 x[4] = (x0 - x1)*0.70710677f; 1270 x5 = x5 + x6; 1271 x6 = (x6 + x7)*0.70710677f; 1272 x7 = x7 + xt; 1273 x3 = (x3 + x4)*0.70710677f; 1274 x5 -= x7*0.198912367f; /* rotate by PI/8 */ 1275 x7 += x5*0.382683432f; 1276 x5 -= x7*0.198912367f; 1277 x0 = xt - x6; xt += x6; 1278 x[1] = (xt + x7)*0.50979561f; 1279 x[2] = (x4 + x3)*0.54119611f; 1280 x[3] = (x0 - x5)*0.60134488f; 1281 x[5] = (x0 + x5)*0.89997619f; 1282 x[6] = (x4 - x3)*1.30656302f; 1283 x[7] = (xt - x7)*2.56291556f; 1284 1285 } 1286 for (i = 0; i < 7; i++, y += 4*18) 1287 { 1288 y[0*18] = t[0][i]; 1289 y[1*18] = t[2][i] + t[3][i] + t[3][i + 1]; 1290 y[2*18] = t[1][i] + t[1][i + 1]; 1291 y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1]; 1292 } 1293 y[0*18] = t[0][7]; 1294 y[1*18] = t[2][7] + t[3][7]; 1295 y[2*18] = t[1][7]; 1296 y[3*18] = t[3][7]; 1297 } 1298 } 1299 1300 float mp3d_scale_pcm(float sample) 1301 { 1302 return sample*(1.0f/32768.0f); 1303 } 1304 1305 void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const(float)*z) 1306 { 1307 float a; 1308 a = (z[14*64] - z[ 0]) * 29; 1309 a += (z[ 1*64] + z[13*64]) * 213; 1310 a += (z[12*64] - z[ 2*64]) * 459; 1311 a += (z[ 3*64] + z[11*64]) * 2037; 1312 a += (z[10*64] - z[ 4*64]) * 5153; 1313 a += (z[ 5*64] + z[ 9*64]) * 6574; 1314 a += (z[ 8*64] - z[ 6*64]) * 37489; 1315 a += z[ 7*64] * 75038; 1316 pcm[0] = mp3d_scale_pcm(a); 1317 1318 z += 2; 1319 a = z[14*64] * 104; 1320 a += z[12*64] * 1567; 1321 a += z[10*64] * 9727; 1322 a += z[ 8*64] * 64019; 1323 a += z[ 6*64] * -9975; 1324 a += z[ 4*64] * -45; 1325 a += z[ 2*64] * 146; 1326 a += z[ 0*64] * -5; 1327 pcm[16*nch] = mp3d_scale_pcm(a); 1328 } 1329 1330 void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins) 1331 { 1332 int i; 1333 float *xr = xl + 576*(nch - 1); 1334 mp3d_sample_t *dstr = dstl + (nch - 1); 1335 1336 static immutable float[] g_win = [ 1337 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992, 1338 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856, 1339 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630, 1340 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313, 1341 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908, 1342 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415, 1343 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835, 1344 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169, 1345 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420, 1346 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590, 1347 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679, 1348 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692, 1349 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629, 1350 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494, 1351 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290 1352 ]; 1353 float *zlin = lins + 15*64; 1354 const(float) *w = g_win.ptr; 1355 1356 zlin[4*15] = xl[18*16]; 1357 zlin[4*15 + 1] = xr[18*16]; 1358 zlin[4*15 + 2] = xl[0]; 1359 zlin[4*15 + 3] = xr[0]; 1360 1361 zlin[4*31] = xl[1 + 18*16]; 1362 zlin[4*31 + 1] = xr[1 + 18*16]; 1363 zlin[4*31 + 2] = xl[1]; 1364 zlin[4*31 + 3] = xr[1]; 1365 1366 mp3d_synth_pair(dstr, nch, lins + 4*15 + 1); 1367 mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1); 1368 mp3d_synth_pair(dstl, nch, lins + 4*15); 1369 mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64); 1370 1371 for (i = 14; i >= 0; i--) 1372 { 1373 //#define LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64]; 1374 //#define S0(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } 1375 //#define S1(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } 1376 //#define S2(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } 1377 float[4] a, b; 1378 1379 zlin[4*i] = xl[18*(31 - i)]; 1380 zlin[4*i + 1] = xr[18*(31 - i)]; 1381 zlin[4*i + 2] = xl[1 + 18*(31 - i)]; 1382 zlin[4*i + 3] = xr[1 + 18*(31 - i)]; 1383 zlin[4*(i + 16)] = xl[1 + 18*(1 + i)]; 1384 zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)]; 1385 zlin[4*(i - 16) + 2] = xl[18*(1 + i)]; 1386 zlin[4*(i - 16) + 3] = xr[18*(1 + i)]; 1387 1388 /* S0(0) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 0*64]; float *vy = &zlin[4*i - (15 - 0)*64]; /* LOAD(0); */ for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } 1389 /* S2(1) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 1*64]; float *vy = &zlin[4*i - (15 - 1)*64]; /* LOAD(1); */ for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } 1390 /* S1(2) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 2*64]; float *vy = &zlin[4*i - (15 - 2)*64]; /* LOAD(2); */ for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } 1391 /* S2(3) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 3*64]; float *vy = &zlin[4*i - (15 - 3)*64]; /* LOAD(3); */ for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } 1392 /* S1(4) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 4*64]; float *vy = &zlin[4*i - (15 - 4)*64]; /* LOAD(4); */ for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } 1393 /* S2(5) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 5*64]; float *vy = &zlin[4*i - (15 - 5)*64]; /* LOAD(5); */ for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } 1394 /* S1(6) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 6*64]; float *vy = &zlin[4*i - (15 - 6)*64]; /* LOAD(6); */ for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } 1395 /* S2(7) */ { int j; float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - 7*64]; float *vy = &zlin[4*i - (15 - 7)*64]; /* LOAD(7); */ for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } 1396 1397 dstr[(15 - i)*nch] = mp3d_scale_pcm(a[1]); 1398 dstr[(17 + i)*nch] = mp3d_scale_pcm(b[1]); 1399 dstl[(15 - i)*nch] = mp3d_scale_pcm(a[0]); 1400 dstl[(17 + i)*nch] = mp3d_scale_pcm(b[0]); 1401 dstr[(47 - i)*nch] = mp3d_scale_pcm(a[3]); 1402 dstr[(49 + i)*nch] = mp3d_scale_pcm(b[3]); 1403 dstl[(47 - i)*nch] = mp3d_scale_pcm(a[2]); 1404 dstl[(49 + i)*nch] = mp3d_scale_pcm(b[2]); 1405 } 1406 } 1407 1408 void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, mp3d_sample_t *pcm, float *lins) 1409 { 1410 int i; 1411 for (i = 0; i < nch; i++) 1412 { 1413 mp3d_DCT_II(grbuf + 576*i, nbands); 1414 } 1415 1416 memcpy(lins, qmf_state, float.sizeof*15*64); 1417 1418 for (i = 0; i < nbands; i += 2) 1419 { 1420 mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); 1421 } 1422 1423 if (nch == 1) 1424 { 1425 for (i = 0; i < 15*64; i += 2) 1426 { 1427 qmf_state[i] = lins[nbands*64 + i]; 1428 } 1429 } else 1430 1431 { 1432 memcpy(qmf_state, lins + nbands*64, float.sizeof*15*64); 1433 } 1434 } 1435 1436 static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes) 1437 { 1438 int i, nmatch; 1439 for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++) 1440 { 1441 i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i); 1442 if (i + HDR_SIZE > mp3_bytes) 1443 return nmatch > 0; 1444 if (!hdr_compare(hdr, hdr + i)) 1445 return 0; 1446 } 1447 return 1; 1448 } 1449 1450 static int mp3d_find_frame(const(uint8_t) *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes) 1451 { 1452 int i, k; 1453 for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++) 1454 { 1455 if (hdr_valid(mp3)) 1456 { 1457 int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes); 1458 int frame_and_padding = frame_bytes + hdr_padding(mp3); 1459 1460 for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++) 1461 { 1462 if (hdr_compare(mp3, mp3 + k)) 1463 { 1464 int fb = k - hdr_padding(mp3); 1465 int nextfb = fb + hdr_padding(mp3 + k); 1466 if (i + k + nextfb + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + k + nextfb)) 1467 continue; 1468 frame_and_padding = k; 1469 frame_bytes = fb; 1470 *free_format_bytes = fb; 1471 } 1472 } 1473 if ((frame_bytes && i + frame_and_padding <= mp3_bytes && 1474 mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) || 1475 (!i && frame_and_padding == mp3_bytes)) 1476 { 1477 *ptr_frame_bytes = frame_and_padding; 1478 return i; 1479 } 1480 *free_format_bytes = 0; 1481 } 1482 } 1483 *ptr_frame_bytes = 0; 1484 return mp3_bytes; 1485 } 1486 1487 void mp3dec_init(mp3dec_t *dec) 1488 { 1489 dec.header[0] = 0; 1490 } 1491 1492 int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info) 1493 { 1494 int i = 0, igr, frame_size = 0, success = 1; 1495 const(uint8_t) *hdr; 1496 bs_t[1] bs_frame; 1497 mp3dec_scratch_t scratch; 1498 1499 if (mp3_bytes > 4 && dec.header[0] == 0xff && hdr_compare(dec.header.ptr, mp3)) 1500 { 1501 frame_size = hdr_frame_bytes(mp3, dec.free_format_bytes) + hdr_padding(mp3); 1502 if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size))) 1503 { 1504 frame_size = 0; 1505 } 1506 } 1507 if (!frame_size) 1508 { 1509 memset(dec, 0, mp3dec_t.sizeof); 1510 i = mp3d_find_frame(mp3, mp3_bytes, &dec.free_format_bytes, &frame_size); 1511 if (!frame_size || i + frame_size > mp3_bytes) 1512 { 1513 info.frame_bytes = i; 1514 return 0; 1515 } 1516 } 1517 1518 hdr = mp3 + i; 1519 memcpy(dec.header.ptr, hdr, HDR_SIZE); 1520 info.frame_bytes = i + frame_size; 1521 info.frame_offset = i; 1522 info.channels = HDR_IS_MONO(hdr) ? 1 : 2; 1523 info.hz = hdr_sample_rate_hz(hdr); 1524 info.layer = 4 - HDR_GET_LAYER(hdr); 1525 info.bitrate_kbps = hdr_bitrate_kbps(hdr); 1526 1527 if (!pcm) 1528 { 1529 return hdr_frame_samples(hdr); 1530 } 1531 1532 bs_init(bs_frame.ptr, hdr + HDR_SIZE, frame_size - HDR_SIZE); 1533 if (HDR_IS_CRC(hdr)) 1534 { 1535 get_bits(bs_frame.ptr, 16); 1536 } 1537 1538 if (info.layer == 3) 1539 { 1540 int main_data_begin = L3_read_side_info(bs_frame.ptr, scratch.gr_info.ptr, hdr); 1541 if (main_data_begin < 0 || bs_frame[0].pos > bs_frame[0].limit) 1542 { 1543 mp3dec_init(dec); 1544 return 0; 1545 } 1546 success = L3_restore_reservoir(dec, bs_frame.ptr, &scratch, main_data_begin); 1547 if (success) 1548 { 1549 for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*info.channels) 1550 { 1551 memset(scratch.grbuf[0].ptr, 0, 576*2*float.sizeof); 1552 L3_decode(dec, &scratch, scratch.gr_info.ptr + igr*info.channels, info.channels); 1553 mp3d_synth_granule(dec.qmf_state.ptr, scratch.grbuf[0].ptr, 18, info.channels, pcm, scratch.syn[0].ptr); 1554 } 1555 } 1556 L3_save_reservoir(dec, &scratch); 1557 } else 1558 { 1559 L12_scale_info[1] sci; 1560 L12_read_scale_info(hdr, bs_frame.ptr, sci.ptr); 1561 1562 memset(scratch.grbuf[0].ptr, 0, 576*2*float.sizeof); 1563 for (i = 0, igr = 0; igr < 3; igr++) 1564 { 1565 if (12 == (i += L12_dequantize_granule(scratch.grbuf[0].ptr + i, bs_frame.ptr, sci.ptr, info.layer | 1))) 1566 { 1567 i = 0; 1568 L12_apply_scf_384(sci.ptr, sci[0].scf.ptr + igr, scratch.grbuf[0].ptr); 1569 mp3d_synth_granule(dec.qmf_state.ptr, scratch.grbuf[0].ptr, 12, info.channels, pcm, scratch.syn[0].ptr); 1570 memset(scratch.grbuf[0].ptr, 0, 576*2*float.sizeof); 1571 pcm += 384*info.channels; 1572 } 1573 if (bs_frame[0].pos > bs_frame[0].limit) 1574 { 1575 mp3dec_init(dec); 1576 return 0; 1577 } 1578 } 1579 } 1580 return success*hdr_frame_samples(dec.header.ptr); 1581 }