16 #define MINIMP3_MAX_SAMPLES_PER_FRAME (1152*2)
25 float mdct_overlap[2][9*32], qmf_state[15*2*32];
27 unsigned char header[4], reserv_buf[511];
35 #ifndef MINIMP3_FLOAT_OUTPUT
39 void mp3dec_f32_to_s16(
const float *in, int16_t *out,
int num_samples);
48 #if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_IMPLEMENTATION_GUARD)
49 #define _MINIMP3_IMPLEMENTATION_GUARD
54 #define MAX_FREE_FORMAT_FRAME_SIZE 2304
55 #ifndef MAX_FRAME_SYNC_MATCHES
56 #define MAX_FRAME_SYNC_MATCHES 10
59 #define MAX_L3_FRAME_PAYLOAD_BYTES MAX_FREE_FORMAT_FRAME_SIZE
61 #define MAX_BITRESERVOIR_BYTES 511
62 #define SHORT_BLOCK_TYPE 2
63 #define STOP_BLOCK_TYPE 3
65 #define MODE_JOINT_STEREO 1
67 #define HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0)
68 #define HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60)
69 #define HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0)
70 #define HDR_IS_CRC(h) (!((h[1]) & 1))
71 #define HDR_TEST_PADDING(h) ((h[2]) & 0x2)
72 #define HDR_TEST_MPEG1(h) ((h[1]) & 0x8)
73 #define HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10)
74 #define HDR_TEST_I_STEREO(h) ((h[3]) & 0x10)
75 #define HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20)
76 #define HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3)
77 #define HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3)
78 #define HDR_GET_LAYER(h) (((h[1]) >> 1) & 3)
79 #define HDR_GET_BITRATE(h) ((h[2]) >> 4)
80 #define HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3)
81 #define HDR_GET_MY_SAMPLE_RATE(h) (HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)
82 #define HDR_IS_FRAME_576(h) ((h[1] & 14) == 2)
83 #define HDR_IS_LAYER_1(h) ((h[1] & 6) == 6)
85 #define BITS_DEQUANTIZER_OUT -1
86 #define MAX_SCF (255 + BITS_DEQUANTIZER_OUT*4 - 210)
87 #define MAX_SCFI ((MAX_SCF + 3) & ~3)
89 #define MINIMP3_MIN(a, b) ((a) > (b) ? (b) : (a))
90 #define MINIMP3_MAX(a, b) ((a) < (b) ? (b) : (a))
92 #if !defined(MINIMP3_NO_SIMD)
94 #if !defined(MINIMP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64))
96 #define MINIMP3_ONLY_SIMD
99 #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
100 #if defined(_MSC_VER)
103 #include <immintrin.h>
106 #define VSTORE _mm_storeu_ps
107 #define VLD _mm_loadu_ps
108 #define VSET _mm_set1_ps
109 #define VADD _mm_add_ps
110 #define VSUB _mm_sub_ps
111 #define VMUL _mm_mul_ps
112 #define VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))
113 #define VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))
114 #define VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s))
115 #define VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))
117 #if defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD)
118 #define minimp3_cpuid __cpuid
120 static __inline__ __attribute__((always_inline))
void minimp3_cpuid(
int CPUInfo[],
const int InfoType)
123 __asm__ __volatile__(
124 #
if defined(__x86_64__)
134 :
"=a" (CPUInfo[0]),
"=r" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
137 __asm__ __volatile__(
139 :
"=a" (CPUInfo[0]),
"=b" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
144 static int have_simd(
void)
146 #ifdef MINIMP3_ONLY_SIMD
149 static int g_have_simd;
152 static int g_counter;
153 if (g_counter++ > 100)
158 minimp3_cpuid(CPUInfo, 0);
162 minimp3_cpuid(CPUInfo, 1);
163 g_have_simd = (CPUInfo[3] & (1 << 26)) + 1;
166 return g_have_simd - 1;
169 #elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)
170 #include <arm_neon.h>
173 #define VSTORE vst1q_f32
174 #define VLD vld1q_f32
175 #define VSET vmovq_n_f32
176 #define VADD vaddq_f32
177 #define VSUB vsubq_f32
178 #define VMUL vmulq_f32
179 #define VMAC(a, x, y) vmlaq_f32(a, x, y)
180 #define VMSB(a, x, y) vmlsq_f32(a, x, y)
181 #define VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s))
182 #define VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))
183 typedef float32x4_t f4;
184 static int have_simd()
191 #ifdef MINIMP3_ONLY_SIMD
192 #error MINIMP3_ONLY_SIMD used, but SSE/NEON not enabled
199 #if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64)
201 static __inline__ __attribute__((always_inline)) int32_t minimp3_clip_int16_arm(int32_t a)
204 __asm__ (
"ssat %0, #16, %1" :
"=r"(x) :
"r"(a));
220 uint8_t total_bands, stereo_bands, bitalloc[64], scfcod[64];
225 uint8_t tab_offset, code_tab_width, band_count;
226 } L12_subband_alloc_t;
230 const uint8_t *sfbtab;
231 uint16_t part_23_length, big_values, scalefac_compress;
232 uint8_t global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
233 uint8_t table_select[3], region_count[3], subblock_gain[3];
234 uint8_t preflag, scalefac_scale, count1_table, scfsi;
240 uint8_t maindata[MAX_BITRESERVOIR_BYTES + MAX_L3_FRAME_PAYLOAD_BYTES];
241 L3_gr_info_t gr_info[4];
242 float grbuf[2][576], scf[40], syn[18 + 15][2*32];
243 uint8_t ist_pos[2][39];
246 static void bs_init(bs_t *bs,
const uint8_t *data,
int bytes)
253 static uint32_t get_bits(bs_t *bs,
int n)
255 uint32_t next, cache = 0, s = bs->pos & 7;
257 const uint8_t *p = bs->buf + (bs->pos >> 3);
258 if ((bs->pos += n) > bs->limit)
260 next = *p++ & (255 >> s);
261 while ((shl -= 8) > 0)
263 cache |= next << shl;
266 return cache | (next >> -shl);
269 static int hdr_valid(
const uint8_t *h)
271 return h[0] == 0xff &&
272 ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&
273 (HDR_GET_LAYER(h) != 0) &&
274 (HDR_GET_BITRATE(h) != 15) &&
275 (HDR_GET_SAMPLE_RATE(h) != 3);
278 static int hdr_compare(
const uint8_t *h1,
const uint8_t *h2)
280 return hdr_valid(h2) &&
281 ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
282 ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
283 !(HDR_IS_FREE_FORMAT(h1) ^ HDR_IS_FREE_FORMAT(h2));
286 static unsigned hdr_bitrate_kbps(
const uint8_t *h)
288 static const uint8_t halfrate[2][3][15] = {
289 { { 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 } },
290 { { 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 } },
292 return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)];
295 static unsigned hdr_sample_rate_hz(
const uint8_t *h)
297 static const unsigned g_hz[3] = { 44100, 48000, 32000 };
298 return g_hz[HDR_GET_SAMPLE_RATE(h)] >> (int)!HDR_TEST_MPEG1(h) >> (int)!HDR_TEST_NOT_MPEG25(h);
301 static unsigned hdr_frame_samples(
const uint8_t *h)
303 return HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)HDR_IS_FRAME_576(h));
306 static int hdr_frame_bytes(
const uint8_t *h,
int free_format_size)
308 int frame_bytes = hdr_frame_samples(h)*hdr_bitrate_kbps(h)*125/hdr_sample_rate_hz(h);
309 if (HDR_IS_LAYER_1(h))
313 return frame_bytes ? frame_bytes : free_format_size;
316 static int hdr_padding(
const uint8_t *h)
318 return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
321 #ifndef MINIMP3_ONLY_MP3
322 static const L12_subband_alloc_t *L12_subband_alloc_table(
const uint8_t *hdr, L12_scale_info *sci)
324 const L12_subband_alloc_t *alloc;
325 int mode = HDR_GET_STEREO_MODE(hdr);
326 int nbands, stereo_bands = (mode == MODE_MONO) ? 0 : (mode == MODE_JOINT_STEREO) ? (HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
328 if (HDR_IS_LAYER_1(hdr))
330 static const L12_subband_alloc_t g_alloc_L1[] = { { 76, 4, 32 } };
333 }
else if (!HDR_TEST_MPEG1(hdr))
335 static const L12_subband_alloc_t g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
336 alloc = g_alloc_L2M2;
340 static const L12_subband_alloc_t g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
341 int sample_rate_idx = HDR_GET_SAMPLE_RATE(hdr);
342 unsigned kbps = hdr_bitrate_kbps(hdr) >> (int)(mode != MODE_MONO);
348 alloc = g_alloc_L2M1;
352 static const L12_subband_alloc_t g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
353 alloc = g_alloc_L2M1_lowrate;
354 nbands = sample_rate_idx == 2 ? 12 : 8;
355 }
else if (kbps >= 96 && sample_rate_idx != 1)
361 sci->total_bands = (uint8_t)nbands;
362 sci->stereo_bands = (uint8_t)MINIMP3_MIN(stereo_bands, nbands);
367 static void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod,
int bands,
float *scf)
369 static const float g_deq_L12[18*3] = {
370 #define DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
371 DQ(3),DQ(7),DQ(15),DQ(31),DQ(63),DQ(127),DQ(255),DQ(511),DQ(1023),DQ(2047),DQ(4095),DQ(8191),DQ(16383),DQ(32767),DQ(65535),DQ(3),DQ(5),DQ(9)
374 for (i = 0; i < bands; i++)
378 int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
379 for (m = 4; m; m >>= 1)
383 int b = get_bits(bs, 6);
384 s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3);
391 static void L12_read_scale_info(
const uint8_t *hdr, bs_t *bs, L12_scale_info *sci)
393 static const uint8_t g_bitalloc_code_tab[] = {
394 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
395 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
396 0,17,18, 3,19,4,5,16,
398 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
399 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
400 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
402 const L12_subband_alloc_t *subband_alloc = L12_subband_alloc_table(hdr, sci);
404 int i, k = 0, ba_bits = 0;
405 const uint8_t *ba_code_tab = g_bitalloc_code_tab;
407 for (i = 0; i < sci->total_bands; i++)
412 k += subband_alloc->band_count;
413 ba_bits = subband_alloc->code_tab_width;
414 ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
417 ba = ba_code_tab[get_bits(bs, ba_bits)];
418 sci->bitalloc[2*i] = ba;
419 if (i < sci->stereo_bands)
421 ba = ba_code_tab[get_bits(bs, ba_bits)];
423 sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
426 for (i = 0; i < 2*sci->total_bands; i++)
428 sci->scfcod[i] = sci->bitalloc[i] ? HDR_IS_LAYER_1(hdr) ? 2 : get_bits(bs, 2) : 6;
431 L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
433 for (i = sci->stereo_bands; i < sci->total_bands; i++)
435 sci->bitalloc[2*i + 1] = 0;
439 static int L12_dequantize_granule(
float *grbuf, bs_t *bs, L12_scale_info *sci,
int group_size)
441 int i, j, k, choff = 576;
442 for (j = 0; j < 4; j++)
444 float *dst = grbuf + group_size*j;
445 for (i = 0; i < 2*sci->total_bands; i++)
447 int ba = sci->bitalloc[i];
452 int half = (1 << (ba - 1)) - 1;
453 for (k = 0; k < group_size; k++)
455 dst[k] = (float)((
int)get_bits(bs, ba) - half);
459 unsigned mod = (2 << (ba - 17)) + 1;
460 unsigned code = get_bits(bs, mod + 2 - (mod >> 3));
461 for (k = 0; k < group_size; k++, code /= mod)
463 dst[k] = (float)((
int)(code % mod - mod/2));
474 static void L12_apply_scf_384(L12_scale_info *sci,
const float *scf,
float *dst)
477 memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*
sizeof(
float));
478 for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
480 for (k = 0; k < 12; k++)
482 dst[k + 0] *= scf[0];
483 dst[k + 576] *= scf[3];
489 static int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr,
const uint8_t *hdr)
491 static const uint8_t g_scf_long[8][23] = {
492 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
493 { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
494 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
495 { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
496 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
497 { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
498 { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
499 { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
501 static const uint8_t g_scf_short[8][40] = {
502 { 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 },
503 { 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 },
504 { 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 },
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,32,32,32,44,44,44,12,12,12,0 },
506 { 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 },
507 { 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 },
508 { 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 },
509 { 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 }
511 static const uint8_t g_scf_mixed[8][40] = {
512 { 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 },
513 { 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 },
514 { 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 },
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,32,32,32,44,44,44,12,12,12,0 },
516 { 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 },
517 { 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 },
518 { 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 },
519 { 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 }
522 unsigned tables, scfsi = 0;
523 int main_data_begin, part_23_sum = 0;
524 int sr_idx = HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
525 int gr_count = HDR_IS_MONO(hdr) ? 1 : 2;
527 if (HDR_TEST_MPEG1(hdr))
530 main_data_begin = get_bits(bs, 9);
531 scfsi = get_bits(bs, 7 + gr_count);
534 main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count;
539 if (HDR_IS_MONO(hdr))
543 gr->part_23_length = (uint16_t)get_bits(bs, 12);
544 part_23_sum += gr->part_23_length;
545 gr->big_values = (uint16_t)get_bits(bs, 9);
546 if (gr->big_values > 288)
550 gr->global_gain = (uint8_t)get_bits(bs, 8);
551 gr->scalefac_compress = (uint16_t)get_bits(bs, HDR_TEST_MPEG1(hdr) ? 4 : 9);
552 gr->sfbtab = g_scf_long[sr_idx];
557 gr->block_type = (uint8_t)get_bits(bs, 2);
562 gr->mixed_block_flag = (uint8_t)get_bits(bs, 1);
563 gr->region_count[0] = 7;
564 gr->region_count[1] = 255;
565 if (gr->block_type == SHORT_BLOCK_TYPE)
568 if (!gr->mixed_block_flag)
570 gr->region_count[0] = 8;
571 gr->sfbtab = g_scf_short[sr_idx];
573 gr->n_short_sfb = 39;
576 gr->sfbtab = g_scf_mixed[sr_idx];
577 gr->n_long_sfb = HDR_TEST_MPEG1(hdr) ? 8 : 6;
578 gr->n_short_sfb = 30;
581 tables = get_bits(bs, 10);
583 gr->subblock_gain[0] = (uint8_t)get_bits(bs, 3);
584 gr->subblock_gain[1] = (uint8_t)get_bits(bs, 3);
585 gr->subblock_gain[2] = (uint8_t)get_bits(bs, 3);
589 gr->mixed_block_flag = 0;
590 tables = get_bits(bs, 15);
591 gr->region_count[0] = (uint8_t)get_bits(bs, 4);
592 gr->region_count[1] = (uint8_t)get_bits(bs, 3);
593 gr->region_count[2] = 255;
595 gr->table_select[0] = (uint8_t)(tables >> 10);
596 gr->table_select[1] = (uint8_t)((tables >> 5) & 31);
597 gr->table_select[2] = (uint8_t)((tables) & 31);
598 gr->preflag = HDR_TEST_MPEG1(hdr) ? get_bits(bs, 1) : (gr->scalefac_compress >= 500);
599 gr->scalefac_scale = (uint8_t)get_bits(bs, 1);
600 gr->count1_table = (uint8_t)get_bits(bs, 1);
601 gr->scfsi = (uint8_t)((scfsi >> 12) & 15);
606 if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
611 return main_data_begin;
614 static 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)
617 for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
619 int cnt = scf_count[i];
622 memcpy(scf, ist_pos, cnt);
625 int bits = scf_size[i];
632 int max_scf = (scfsi < 0) ? (1 <<
bits) - 1 : -1;
633 for (k = 0; k < cnt; k++)
635 int s = get_bits(bitbuf,
bits);
636 ist_pos[k] = (s == max_scf ? -1 : s);
644 scf[0] = scf[1] = scf[2] = 0;
647 static float L3_ldexp_q2(
float y,
int exp_q2)
649 static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
653 e = MINIMP3_MIN(30*4, exp_q2);
654 y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
655 }
while ((exp_q2 -= e) > 0);
659 static 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)
661 static const uint8_t g_scf_partitions[3][28] = {
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 }
666 const uint8_t *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
667 uint8_t scf_size[4], iscf[40];
668 int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
671 if (HDR_TEST_MPEG1(hdr))
673 static const uint8_t g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
674 int part = g_scfc_decode[gr->scalefac_compress];
675 scf_size[1] = scf_size[0] = (uint8_t)(part >> 2);
676 scf_size[3] = scf_size[2] = (uint8_t)(part & 3);
679 static const uint8_t g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 };
680 int k, modprod, sfc, ist = HDR_TEST_I_STEREO(hdr) && ch;
681 sfc = gr->scalefac_compress >> ist;
682 for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
684 for (modprod = 1, i = 3; i >= 0; i--)
686 scf_size[i] = (uint8_t)(sfc / modprod % g_mod[k + i]);
687 modprod *= g_mod[k + i];
693 L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
697 int sh = 3 - scf_shift;
698 for (i = 0; i < gr->n_short_sfb; i += 3)
700 iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh;
701 iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh;
702 iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh;
704 }
else if (gr->preflag)
706 static const uint8_t g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
707 for (i = 0; i < 10; i++)
709 iscf[11 + i] += g_preamp[i];
713 gain_exp = gr->global_gain + BITS_DEQUANTIZER_OUT*4 - 210 - (HDR_IS_MS_STEREO(hdr) ? 2 : 0);
714 gain = L3_ldexp_q2(1 << (MAX_SCFI/4), MAX_SCFI - gain_exp);
715 for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)
717 scf[i] = L3_ldexp_q2(
gain, iscf[i] << scf_shift);
721 static const float g_pow43[129 + 16] = {
722 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,
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,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
726 static float L3_pow_43(
int x)
729 int sign, mult = 256;
733 return g_pow43[16 + x];
743 frac = (float)((x & 63) - sign) / ((x & ~63) + sign);
744 return g_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
747 static void L3_huffman(
float *dst, bs_t *bs,
const L3_gr_info_t *gr_info,
const float *scf,
int layer3gr_limit)
749 static const 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,
750 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,
751 -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,
752 -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,
753 -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,
754 -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,
755 -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,
756 -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,
757 -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,
758 -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,
759 -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,
760 -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,
761 -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,
762 -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,
763 -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,
764 -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 };
765 static const 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 };
766 static const uint8_t tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
767 static const int16_t tabindex[2*16] = { 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 };
768 static const 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 #define PEEK_BITS(n) (bs_cache >> (32 - n))
771 #define FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); }
772 #define CHECK_BITS while (bs_sh >= 0) { bs_cache |= (uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
773 #define BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
776 int ireg = 0, big_val_cnt = gr_info->big_values;
777 const uint8_t *sfb = gr_info->sfbtab;
778 const uint8_t *bs_next_ptr = bs->buf + bs->pos/8;
779 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);
780 int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
783 while (big_val_cnt > 0)
785 int tab_num = gr_info->table_select[ireg];
786 int sfb_cnt = gr_info->region_count[ireg++];
787 const int16_t *codebook = tabs + tabindex[tab_num];
788 int linbits = g_linbits[tab_num];
794 pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
799 int leaf = codebook[PEEK_BITS(w)];
804 leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
806 FLUSH_BITS(leaf >> 8);
808 for (j = 0; j < 2; j++, dst++, leaf >>= 4)
810 int lsb = leaf & 0x0F;
813 lsb += PEEK_BITS(linbits);
816 *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1);
819 *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
821 FLUSH_BITS(lsb ? 1 : 0);
824 }
while (--pairs_to_decode);
825 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
831 pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
836 int leaf = codebook[PEEK_BITS(w)];
841 leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
843 FLUSH_BITS(leaf >> 8);
845 for (j = 0; j < 2; j++, dst++, leaf >>= 4)
847 int lsb = leaf & 0x0F;
848 *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
849 FLUSH_BITS(lsb ? 1 : 0);
852 }
while (--pairs_to_decode);
853 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
857 for (np = 1 - big_val_cnt;; dst += 4)
859 const uint8_t *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
860 int leaf = codebook_count1[PEEK_BITS(4)];
863 leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
865 FLUSH_BITS(leaf & 7);
866 if (BSPOS > layer3gr_limit)
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) }
881 bs->pos = layer3gr_limit;
884 static void L3_midside_stereo(
float *left,
int n)
887 float *right = left + 576;
891 for (; i < n - 3; i += 4)
893 f4 vl = VLD(left + i);
894 f4 vr = VLD(right + i);
895 VSTORE(left + i, VADD(vl, vr));
896 VSTORE(right + i, VSUB(vl, vr));
902 if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0)
916 static void L3_intensity_stereo_band(
float *left,
int n,
float kl,
float kr)
919 for (i = 0; i < n; i++)
921 left[i + 576] = left[i]*kr;
922 left[i] = left[i]*kl;
926 static void L3_stereo_top_band(
const float *right,
const uint8_t *sfb,
int nbands,
int max_band[3])
930 max_band[0] = max_band[1] = max_band[2] = -1;
932 for (i = 0; i < nbands; i++)
934 for (k = 0; k < sfb[i]; k += 2)
936 if (right[k] != 0 || right[k + 1] != 0)
946 static void L3_stereo_process(
float *left,
const uint8_t *ist_pos,
const uint8_t *sfb,
const uint8_t *hdr,
int max_band[3],
int mpeg2_sh)
948 static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 };
949 unsigned i, max_pos = HDR_TEST_MPEG1(hdr) ? 7 : 64;
951 for (i = 0; sfb[i]; i++)
953 unsigned ipos = ist_pos[i];
954 if ((
int)i > max_band[i % 3] && ipos < max_pos)
956 float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
957 if (HDR_TEST_MPEG1(hdr))
960 kr = g_pan[2*ipos + 1];
964 kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
971 L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);
972 }
else if (HDR_TEST_MS_STEREO(hdr))
974 L3_midside_stereo(left, sfb[i]);
980 static void L3_intensity_stereo(
float *left, uint8_t *ist_pos,
const L3_gr_info_t *gr,
const uint8_t *hdr)
982 int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
983 int i, max_blocks = gr->n_short_sfb ? 3 : 1;
985 L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
988 max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]);
990 for (i = 0; i < max_blocks; i++)
992 int default_pos = HDR_TEST_MPEG1(hdr) ? 3 : 0;
993 int itop = n_sfb - max_blocks + i;
994 int prev = itop - max_blocks;
995 ist_pos[itop] = max_band[i] >= prev ? default_pos : ist_pos[prev];
997 L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
1000 static void L3_reorder(
float *grbuf,
float *scratch,
const uint8_t *sfb)
1003 float *src = grbuf, *dst = scratch;
1005 for (;0 != (len = *sfb); sfb += 3, src += 2*len)
1007 for (i = 0; i < len; i++, src++)
1009 *dst++ = src[0*len];
1010 *dst++ = src[1*len];
1011 *dst++ = src[2*len];
1014 memcpy(grbuf, scratch, (dst - scratch)*
sizeof(
float));
1017 static void L3_antialias(
float *grbuf,
int nbands)
1019 static const float g_aa[2][8] = {
1020 {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
1021 {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
1024 for (; nbands > 0; nbands--, grbuf += 18)
1028 if (have_simd())
for (; i < 8; i += 4)
1030 f4 vu = VLD(grbuf + 18 + i);
1031 f4 vd = VLD(grbuf + 14 - i);
1032 f4 vc0 = VLD(g_aa[0] + i);
1033 f4 vc1 = VLD(g_aa[1] + i);
1035 VSTORE(grbuf + 18 + i, VSUB(VMUL(vu, vc0), VMUL(vd, vc1)));
1036 vd = VADD(VMUL(vu, vc1), VMUL(vd, vc0));
1037 VSTORE(grbuf + 14 - i, VREV(vd));
1040 #ifndef MINIMP3_ONLY_SIMD
1043 float u = grbuf[18 + i];
1044 float d = grbuf[17 - i];
1045 grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];
1046 grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];
1052 static void L3_dct3_9(
float *y)
1054 float s0,
s1,
s2,
s3,
s4,
s5,
s6,
s7,
s8, t0, t2, t4;
1056 s0 = y[0];
s2 = y[2];
s4 = y[4];
s6 = y[6];
s8 = y[8];
1059 t4 = (
s4 +
s2)*0.93969262f;
1060 t2 = (
s8 +
s2)*0.76604444f;
1061 s6 = (
s4 -
s8)*0.17364818f;
1070 s1 = y[1];
s3 = y[3];
s5 = y[5];
s7 = y[7];
1073 t0 = (
s5 +
s1)*0.98480775f;
1074 t4 = (
s5 -
s7)*0.34202014f;
1075 t2 = (
s1 +
s7)*0.64278761f;
1092 static void L3_imdct36(
float *grbuf,
float *overlap,
const float *window,
int nbands)
1095 static const float g_twid9[18] = {
1096 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
1099 for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)
1104 for (i = 0; i < 4; i++)
1106 si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2];
1107 co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2];
1108 si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3];
1109 co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);
1122 if (have_simd())
for (; i < 8; i += 4)
1124 f4 vovl = VLD(overlap + i);
1125 f4 vc = VLD(co + i);
1126 f4 vs = VLD(si + i);
1127 f4 vr0 = VLD(g_twid9 + i);
1128 f4 vr1 = VLD(g_twid9 + 9 + i);
1129 f4 vw0 = VLD(window + i);
1130 f4 vw1 = VLD(window + 9 + i);
1131 f4 vsum = VADD(VMUL(vc, vr1), VMUL(vs, vr0));
1132 VSTORE(overlap + i, VSUB(VMUL(vc, vr0), VMUL(vs, vr1)));
1133 VSTORE(grbuf + i, VSUB(VMUL(vovl, vw0), VMUL(vsum, vw1)));
1134 vsum = VADD(VMUL(vovl, vw1), VMUL(vsum, vw0));
1135 VSTORE(grbuf + 14 - i, VREV(vsum));
1140 float ovl = overlap[i];
1141 float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];
1142 overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];
1143 grbuf[i] = ovl*window[0 + i] - sum*window[9 + i];
1144 grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];
1149 static void L3_idct3(
float x0,
float x1,
float x2,
float *dst)
1151 float m1 = x1*0.86602540f;
1152 float a1 = x0 - x2*0.5f;
1158 static void L3_imdct12(
float *x,
float *dst,
float *overlap)
1160 static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
1164 L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);
1165 L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);
1168 for (i = 0; i < 3; i++)
1170 float ovl = overlap[i];
1171 float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];
1172 overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];
1173 dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];
1174 dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];
1178 static void L3_imdct_short(
float *grbuf,
float *overlap,
int nbands)
1180 for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
1183 memcpy(tmp, grbuf,
sizeof(tmp));
1184 memcpy(grbuf, overlap, 6*
sizeof(
float));
1185 L3_imdct12(tmp, grbuf + 6, overlap + 6);
1186 L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
1187 L3_imdct12(tmp + 2, overlap, overlap + 6);
1191 static void L3_change_sign(
float *grbuf)
1194 for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)
1195 for (i = 1; i < 18; i += 2)
1196 grbuf[i] = -grbuf[i];
1199 static void L3_imdct_gr(
float *grbuf,
float *overlap,
unsigned block_type,
unsigned n_long_bands)
1201 static const float g_mdct_window[2][18] = {
1202 { 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 },
1203 { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
1207 L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
1208 grbuf += 18*n_long_bands;
1209 overlap += 9*n_long_bands;
1211 if (block_type == SHORT_BLOCK_TYPE)
1212 L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
1214 L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE], 32 - n_long_bands);
1217 static void L3_save_reservoir(
mp3dec_t *h, mp3dec_scratch_t *s)
1219 int pos = (s->bs.pos + 7)/8u;
1220 int remains = s->bs.limit/8u - pos;
1221 if (remains > MAX_BITRESERVOIR_BYTES)
1223 pos += remains - MAX_BITRESERVOIR_BYTES;
1224 remains = MAX_BITRESERVOIR_BYTES;
1228 memmove(h->
reserv_buf, s->maindata + pos, remains);
1233 static int L3_restore_reservoir(
mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s,
int main_data_begin)
1235 int frame_bytes = (bs->limit - bs->pos)/8;
1236 int bytes_have = MINIMP3_MIN(h->
reserv, main_data_begin);
1237 memcpy(s->maindata, h->
reserv_buf + MINIMP3_MAX(0, h->
reserv - main_data_begin), MINIMP3_MIN(h->
reserv, main_data_begin));
1238 memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
1239 bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
1240 return h->
reserv >= main_data_begin;
1243 static void L3_decode(
mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info,
int nch)
1247 for (ch = 0; ch < nch; ch++)
1249 int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;
1250 L3_decode_scalefactors(h->
header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);
1251 L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);
1254 if (HDR_TEST_I_STEREO(h->
header))
1256 L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->
header);
1257 }
else if (HDR_IS_MS_STEREO(h->
header))
1259 L3_midside_stereo(s->grbuf[0], 576);
1262 for (ch = 0; ch < nch; ch++, gr_info++)
1265 int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (
int)(HDR_GET_MY_SAMPLE_RATE(h->
header) == 2);
1267 if (gr_info->n_short_sfb)
1269 aa_bands = n_long_bands - 1;
1270 L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
1273 L3_antialias(s->grbuf[ch], aa_bands);
1274 L3_imdct_gr(s->grbuf[ch], h->
mdct_overlap[ch], gr_info->block_type, n_long_bands);
1275 L3_change_sign(s->grbuf[ch]);
1279 static void mp3d_DCT_II(
float *grbuf,
int n)
1281 static const float g_sec[24] = {
1282 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
1286 if (have_simd())
for (; k < n; k += 4)
1289 float *y = grbuf + k;
1291 for (x = t[0], i = 0; i < 8; i++, x++)
1293 f4 x0 = VLD(&y[i*18]);
1294 f4 x1 = VLD(&y[(15 - i)*18]);
1295 f4 x2 = VLD(&y[(16 + i)*18]);
1296 f4 x3 = VLD(&y[(31 - i)*18]);
1297 f4 t0 = VADD(x0, x3);
1298 f4 t1 = VADD(x1, x2);
1299 f4 t2 = VMUL_S(VSUB(x1, x2), g_sec[3*i + 0]);
1300 f4 t3 = VMUL_S(VSUB(x0, x3), g_sec[3*i + 1]);
1301 x[0] = VADD(t0, t1);
1302 x[8] = VMUL_S(VSUB(t0, t1), g_sec[3*i + 2]);
1303 x[16] = VADD(t3, t2);
1304 x[24] = VMUL_S(VSUB(t3, t2), g_sec[3*i + 2]);
1306 for (x = t[0], i = 0; i < 4; i++, x += 8)
1308 f4 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;
1309 xt = VSUB(x0, x7); x0 = VADD(x0, x7);
1310 x7 = VSUB(x1, x6); x1 = VADD(x1, x6);
1311 x6 = VSUB(x2, x5); x2 = VADD(x2, x5);
1312 x5 = VSUB(x3, x4); x3 = VADD(x3, x4);
1313 x4 = VSUB(x0, x3); x0 = VADD(x0, x3);
1314 x3 = VSUB(x1, x2); x1 = VADD(x1, x2);
1315 x[0] = VADD(x0, x1);
1316 x[4] = VMUL_S(VSUB(x0, x1), 0.70710677f);
1318 x6 = VMUL_S(VADD(x6, x7), 0.70710677f);
1320 x3 = VMUL_S(VADD(x3, x4), 0.70710677f);
1321 x5 = VSUB(x5, VMUL_S(x7, 0.198912367f));
1322 x7 = VADD(x7, VMUL_S(x5, 0.382683432f));
1323 x5 = VSUB(x5, VMUL_S(x7, 0.198912367f));
1324 x0 = VSUB(xt, x6); xt = VADD(xt, x6);
1325 x[1] = VMUL_S(VADD(xt, x7), 0.50979561f);
1326 x[2] = VMUL_S(VADD(x4, x3), 0.54119611f);
1327 x[3] = VMUL_S(VSUB(x0, x5), 0.60134488f);
1328 x[5] = VMUL_S(VADD(x0, x5), 0.89997619f);
1329 x[6] = VMUL_S(VSUB(x4, x3), 1.30656302f);
1330 x[7] = VMUL_S(VSUB(xt, x7), 2.56291556f);
1336 #define VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
1338 #define VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
1340 for (i = 0; i < 7; i++, y += 4*18)
1342 f4 s = VADD(t[3][i], t[3][i + 1]);
1344 VSAVE2(1, VADD(t[2][i], s));
1345 VSAVE2(2, VADD(t[1][i], t[1][i + 1]));
1346 VSAVE2(3, VADD(t[2][1 + i], s));
1349 VSAVE2(1, VADD(t[2][7], t[3][7]));
1354 #define VSAVE4(i, v) VSTORE(&y[i*18], v)
1355 for (i = 0; i < 7; i++, y += 4*18)
1357 f4 s = VADD(t[3][i], t[3][i + 1]);
1359 VSAVE4(1, VADD(t[2][i], s));
1360 VSAVE4(2, VADD(t[1][i], t[1][i + 1]));
1361 VSAVE4(3, VADD(t[2][1 + i], s));
1364 VSAVE4(1, VADD(t[2][7], t[3][7]));
1370 #ifdef MINIMP3_ONLY_SIMD
1375 float t[4][8], *x, *y = grbuf + k;
1377 for (x = t[0], i = 0; i < 8; i++, x++)
1380 float x1 = y[(15 - i)*18];
1381 float x2 = y[(16 + i)*18];
1382 float x3 = y[(31 - i)*18];
1385 float t2 = (x1 - x2)*g_sec[3*i + 0];
1386 float t3 = (x0 - x3)*g_sec[3*i + 1];
1388 x[8] = (t0 - t1)*g_sec[3*i + 2];
1390 x[24] = (t3 - t2)*g_sec[3*i + 2];
1392 for (x = t[0], i = 0; i < 4; i++, x += 8)
1394 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;
1395 xt = x0 - x7; x0 += x7;
1396 x7 = x1 - x6; x1 += x6;
1397 x6 = x2 - x5; x2 += x5;
1398 x5 = x3 - x4; x3 += x4;
1399 x4 = x0 - x3; x0 += x3;
1400 x3 = x1 - x2; x1 += x2;
1402 x[4] = (x0 - x1)*0.70710677f;
1404 x6 = (x6 + x7)*0.70710677f;
1406 x3 = (x3 + x4)*0.70710677f;
1407 x5 -= x7*0.198912367f;
1408 x7 += x5*0.382683432f;
1409 x5 -= x7*0.198912367f;
1410 x0 = xt - x6; xt += x6;
1411 x[1] = (xt + x7)*0.50979561f;
1412 x[2] = (x4 + x3)*0.54119611f;
1413 x[3] = (x0 - x5)*0.60134488f;
1414 x[5] = (x0 + x5)*0.89997619f;
1415 x[6] = (x4 - x3)*1.30656302f;
1416 x[7] = (xt - x7)*2.56291556f;
1419 for (i = 0; i < 7; i++, y += 4*18)
1422 y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];
1423 y[2*18] = t[1][i] + t[1][i + 1];
1424 y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];
1427 y[1*18] = t[2][7] + t[3][7];
1434 #ifndef MINIMP3_FLOAT_OUTPUT
1435 static int16_t mp3d_scale_pcm(
float sample)
1438 int32_t s32 = (int32_t)(sample + .5f);
1440 int16_t s = (int16_t)minimp3_clip_int16_arm(s32);
1442 if (sample >= 32766.5)
return (int16_t) 32767;
1443 if (sample <= -32767.5)
return (int16_t)-32768;
1444 int16_t s = (int16_t)(sample + .5f);
1450 static float mp3d_scale_pcm(
float sample)
1452 return sample*(1.f/32768.f);
1456 static void mp3d_synth_pair(
mp3d_sample_t *pcm,
int nch,
const float *z)
1459 a = (z[14*64] - z[ 0]) * 29;
1460 a += (z[ 1*64] + z[13*64]) * 213;
1461 a += (z[12*64] - z[ 2*64]) * 459;
1462 a += (z[ 3*64] + z[11*64]) * 2037;
1463 a += (z[10*64] - z[ 4*64]) * 5153;
1464 a += (z[ 5*64] + z[ 9*64]) * 6574;
1465 a += (z[ 8*64] - z[ 6*64]) * 37489;
1466 a += z[ 7*64] * 75038;
1467 pcm[0] = mp3d_scale_pcm(a);
1471 a += z[12*64] * 1567;
1472 a += z[10*64] * 9727;
1473 a += z[ 8*64] * 64019;
1474 a += z[ 6*64] * -9975;
1475 a += z[ 4*64] * -45;
1476 a += z[ 2*64] * 146;
1478 pcm[16*nch] = mp3d_scale_pcm(a);
1481 static void mp3d_synth(
float *xl,
mp3d_sample_t *dstl,
int nch,
float *lins)
1484 float *xr = xl + 576*(nch - 1);
1487 static const float g_win[] = {
1488 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
1489 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
1490 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
1491 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
1492 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
1493 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
1494 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
1495 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
1496 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
1497 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
1498 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
1499 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
1500 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
1501 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
1502 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
1504 float *zlin = lins + 15*64;
1505 const float *w = g_win;
1507 zlin[4*15] = xl[18*16];
1508 zlin[4*15 + 1] = xr[18*16];
1509 zlin[4*15 + 2] = xl[0];
1510 zlin[4*15 + 3] = xr[0];
1512 zlin[4*31] = xl[1 + 18*16];
1513 zlin[4*31 + 1] = xr[1 + 18*16];
1514 zlin[4*31 + 2] = xl[1];
1515 zlin[4*31 + 3] = xr[1];
1517 mp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
1518 mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
1519 mp3d_synth_pair(dstl, nch, lins + 4*15);
1520 mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
1523 if (have_simd())
for (i = 14; i >= 0; i--)
1525 #define VLOAD(k) f4 w0 = VSET(*w++); f4 w1 = VSET(*w++); f4 vz = VLD(&zlin[4*i - 64*k]); f4 vy = VLD(&zlin[4*i - 64*(15 - k)]);
1526 #define V0(k) { VLOAD(k) b = VADD(VMUL(vz, w1), VMUL(vy, w0)) ; a = VSUB(VMUL(vz, w0), VMUL(vy, w1)); }
1527 #define V1(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vz, w0), VMUL(vy, w1))); }
1528 #define V2(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vy, w1), VMUL(vz, w0))); }
1530 zlin[4*i] = xl[18*(31 - i)];
1531 zlin[4*i + 1] = xr[18*(31 - i)];
1532 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
1533 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
1534 zlin[4*i + 64] = xl[1 + 18*(1 + i)];
1535 zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];
1536 zlin[4*i - 64 + 2] = xl[18*(1 + i)];
1537 zlin[4*i - 64 + 3] = xr[18*(1 + i)];
1539 V0(0) V2(1) V1(2) V2(3) V1(4) V2(5) V1(6) V2(7)
1542 #ifndef MINIMP3_FLOAT_OUTPUT
1544 static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
1545 static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
1546 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
1547 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
1548 dstr[(15 - i)*nch] = _mm_extract_epi16(pcm8, 1);
1549 dstr[(17 + i)*nch] = _mm_extract_epi16(pcm8, 5);
1550 dstl[(15 - i)*nch] = _mm_extract_epi16(pcm8, 0);
1551 dstl[(17 + i)*nch] = _mm_extract_epi16(pcm8, 4);
1552 dstr[(47 - i)*nch] = _mm_extract_epi16(pcm8, 3);
1553 dstr[(49 + i)*nch] = _mm_extract_epi16(pcm8, 7);
1554 dstl[(47 - i)*nch] = _mm_extract_epi16(pcm8, 2);
1555 dstl[(49 + i)*nch] = _mm_extract_epi16(pcm8, 6);
1557 int16x4_t pcma, pcmb;
1558 a = VADD(a, VSET(0.5f));
1559 b = VADD(b, VSET(0.5f));
1560 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0)))));
1561 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0)))));
1562 vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);
1563 vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);
1564 vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);
1565 vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);
1566 vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);
1567 vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);
1568 vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);
1569 vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);
1574 static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
1575 a = VMUL(a, g_scale);
1576 b = VMUL(b, g_scale);
1578 _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
1579 _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));
1580 _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));
1581 _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));
1582 _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));
1583 _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));
1584 _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
1585 _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));
1587 vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);
1588 vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);
1589 vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);
1590 vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);
1591 vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);
1592 vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);
1593 vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);
1594 vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);
1600 #ifdef MINIMP3_ONLY_SIMD
1603 for (i = 14; i >= 0; i--)
1605 #define LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64];
1606 #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; }
1607 #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; }
1608 #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; }
1611 zlin[4*i] = xl[18*(31 - i)];
1612 zlin[4*i + 1] = xr[18*(31 - i)];
1613 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
1614 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
1615 zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
1616 zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
1617 zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
1618 zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
1620 S0(0) S2(1) S1(2) S2(3) S1(4) S2(5) S1(6) S2(7)
1622 dstr[(15 - i)*nch] = mp3d_scale_pcm(a[1]);
1623 dstr[(17 + i)*nch] = mp3d_scale_pcm(b[1]);
1624 dstl[(15 - i)*nch] = mp3d_scale_pcm(a[0]);
1625 dstl[(17 + i)*nch] = mp3d_scale_pcm(b[0]);
1626 dstr[(47 - i)*nch] = mp3d_scale_pcm(a[3]);
1627 dstr[(49 + i)*nch] = mp3d_scale_pcm(b[3]);
1628 dstl[(47 - i)*nch] = mp3d_scale_pcm(a[2]);
1629 dstl[(49 + i)*nch] = mp3d_scale_pcm(b[2]);
1634 static void mp3d_synth_granule(
float *qmf_state,
float *grbuf,
int nbands,
int nch,
mp3d_sample_t *pcm,
float *lins)
1637 for (i = 0; i < nch; i++)
1639 mp3d_DCT_II(grbuf + 576*i, nbands);
1642 memcpy(lins, qmf_state,
sizeof(
float)*15*64);
1644 for (i = 0; i < nbands; i += 2)
1646 mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
1648 #ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL
1651 for (i = 0; i < 15*64; i += 2)
1653 qmf_state[i] = lins[nbands*64 + i];
1658 memcpy(qmf_state, lins + nbands*64,
sizeof(
float)*15*64);
1662 static int mp3d_match_frame(
const uint8_t *hdr,
int mp3_bytes,
int frame_bytes)
1665 for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++)
1667 i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i);
1668 if (i + HDR_SIZE > mp3_bytes)
1670 if (!hdr_compare(hdr, hdr + i))
1676 static int mp3d_find_frame(
const uint8_t *mp3,
int mp3_bytes,
int *free_format_bytes,
int *ptr_frame_bytes)
1679 for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++)
1683 int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes);
1684 int frame_and_padding = frame_bytes + hdr_padding(mp3);
1686 for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++)
1688 if (hdr_compare(mp3, mp3 + k))
1690 int fb = k - hdr_padding(mp3);
1691 int nextfb = fb + hdr_padding(mp3 + k);
1692 if (i + k + nextfb + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + k + nextfb))
1694 frame_and_padding = k;
1696 *free_format_bytes = fb;
1699 if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&
1700 mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||
1701 (!i && frame_and_padding == mp3_bytes))
1703 *ptr_frame_bytes = frame_and_padding;
1706 *free_format_bytes = 0;
1709 *ptr_frame_bytes = 0;
1720 int i = 0, igr, frame_size = 0, success = 1;
1723 mp3dec_scratch_t scratch;
1725 if (mp3_bytes > 4 && dec->
header[0] == 0xff && hdr_compare(dec->
header, mp3))
1728 if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size)))
1737 if (!frame_size || i + frame_size > mp3_bytes)
1739 info->frame_bytes = i;
1745 memcpy(dec->
header, hdr, HDR_SIZE);
1746 info->frame_bytes = i + frame_size;
1747 info->frame_offset = i;
1748 info->channels = HDR_IS_MONO(hdr) ? 1 : 2;
1749 info->hz = hdr_sample_rate_hz(hdr);
1750 info->layer = 4 - HDR_GET_LAYER(hdr);
1751 info->bitrate_kbps = hdr_bitrate_kbps(hdr);
1755 return hdr_frame_samples(hdr);
1758 bs_init(bs_frame, hdr + HDR_SIZE, frame_size - HDR_SIZE);
1759 if (HDR_IS_CRC(hdr))
1761 get_bits(bs_frame, 16);
1764 if (
info->layer == 3)
1766 int main_data_begin = L3_read_side_info(bs_frame, scratch.gr_info, hdr);
1767 if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
1772 success = L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
1775 for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*
info->channels)
1777 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
1778 L3_decode(dec, &scratch, scratch.gr_info + igr*
info->channels,
info->channels);
1779 mp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 18,
info->channels, pcm, scratch.syn[0]);
1782 L3_save_reservoir(dec, &scratch);
1785 #ifdef MINIMP3_ONLY_MP3
1788 L12_scale_info sci[1];
1789 L12_read_scale_info(hdr, bs_frame, sci);
1791 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
1792 for (i = 0, igr = 0; igr < 3; igr++)
1794 if (12 == (i += L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci,
info->layer | 1)))
1797 L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
1798 mp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 12,
info->channels, pcm, scratch.syn[0]);
1799 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
1800 pcm += 384*
info->channels;
1802 if (bs_frame->pos > bs_frame->limit)
1810 return success*hdr_frame_samples(dec->
header);
1813 #ifdef MINIMP3_FLOAT_OUTPUT
1814 void mp3dec_f32_to_s16(
const float *in, int16_t *out,
int num_samples)
1818 int aligned_count = num_samples & ~7;
1819 for(; i < aligned_count; i += 8)
1821 static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f };
1822 f4 a = VMUL(VLD(&in[i ]), g_scale);
1823 f4 b = VMUL(VLD(&in[i+4]), g_scale);
1825 static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
1826 static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
1827 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
1828 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
1829 out[i ] = _mm_extract_epi16(pcm8, 0);
1830 out[i+1] = _mm_extract_epi16(pcm8, 1);
1831 out[i+2] = _mm_extract_epi16(pcm8, 2);
1832 out[i+3] = _mm_extract_epi16(pcm8, 3);
1833 out[i+4] = _mm_extract_epi16(pcm8, 4);
1834 out[i+5] = _mm_extract_epi16(pcm8, 5);
1835 out[i+6] = _mm_extract_epi16(pcm8, 6);
1836 out[i+7] = _mm_extract_epi16(pcm8, 7);
1838 int16x4_t pcma, pcmb;
1839 a = VADD(a, VSET(0.5f));
1840 b = VADD(b, VSET(0.5f));
1841 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0)))));
1842 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0)))));
1843 vst1_lane_s16(out+i , pcma, 0);
1844 vst1_lane_s16(out+i+1, pcma, 1);
1845 vst1_lane_s16(out+i+2, pcma, 2);
1846 vst1_lane_s16(out+i+3, pcma, 3);
1847 vst1_lane_s16(out+i+4, pcmb, 0);
1848 vst1_lane_s16(out+i+5, pcmb, 1);
1849 vst1_lane_s16(out+i+6, pcmb, 2);
1850 vst1_lane_s16(out+i+7, pcmb, 3);
1854 for(; i < num_samples; i++)
1856 float sample = in[i] * 32768.0f;
1857 if (sample >= 32766.5)
1858 out[i] = (int16_t) 32767;
1859 else if (sample <= -32767.5)
1860 out[i] = (int16_t)-32768;
1863 int16_t s = (int16_t)(sample + .5f);
void mp3dec_init(mp3dec_t *dec)
int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info)
void memset(float *data, const float val, const uint32_t n_samples)
static const MIDISequence s6[]
static const MIDISequence s3[]
static const MIDISequence s2[]
static const MIDISequence s5[]
static const MIDISequence s0[]
static const MIDISequence s7[]
static const MIDISequence s4[]
static const MIDISequence s1[]
static const MIDISequence s8[]
PBD::PropertyDescriptor< gain_t > gain
PBD::PropertyDescriptor< layer_t > layer
float qmf_state[15 *2 *32]
unsigned char reserv_buf[511]
float mdct_overlap[2][9 *32]