Ardour  9.0-pre0-582-g084a23a80d
minimp3.h
Go to the documentation of this file.
1 #ifndef MINIMP3_H
2 #define MINIMP3_H
3 
4 /* clang-format off */
5 
6 /*
7  https://github.com/lieff/minimp3
8  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.
9  This software is distributed without any warranty.
10  See <http://creativecommons.org/publicdomain/zero/1.0/>.
11 */
12 
13 /* don't use global includes, since this file is included in "namespace ardour" */
14 //#include <stdint.h>
15 
16 #define MINIMP3_MAX_SAMPLES_PER_FRAME (1152*2)
17 
18 typedef struct
19 {
20  int frame_bytes, frame_offset, channels, hz, layer, bitrate_kbps;
22 
23 typedef struct
24 {
25  float mdct_overlap[2][9*32], qmf_state[15*2*32];
26  int reserv, free_format_bytes;
27  unsigned char header[4], reserv_buf[511];
28 } mp3dec_t;
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif /* __cplusplus */
33 
34 void mp3dec_init(mp3dec_t *dec);
35 #ifndef MINIMP3_FLOAT_OUTPUT
36 typedef int16_t mp3d_sample_t;
37 #else /* MINIMP3_FLOAT_OUTPUT */
38 typedef float mp3d_sample_t;
39 void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples);
40 #endif /* MINIMP3_FLOAT_OUTPUT */
41 int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info);
42 
43 #ifdef __cplusplus
44 }
45 #endif /* __cplusplus */
46 
47 #endif /* MINIMP3_H */
48 #if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_IMPLEMENTATION_GUARD)
49 #define _MINIMP3_IMPLEMENTATION_GUARD
50 
51 #include <stdlib.h>
52 #include <string.h>
53 
54 #define MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */
55 #ifndef MAX_FRAME_SYNC_MATCHES
56 #define MAX_FRAME_SYNC_MATCHES 10
57 #endif /* MAX_FRAME_SYNC_MATCHES */
58 
59 #define MAX_L3_FRAME_PAYLOAD_BYTES MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */
60 
61 #define MAX_BITRESERVOIR_BYTES 511
62 #define SHORT_BLOCK_TYPE 2
63 #define STOP_BLOCK_TYPE 3
64 #define MODE_MONO 3
65 #define MODE_JOINT_STEREO 1
66 #define HDR_SIZE 4
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)
84 
85 #define BITS_DEQUANTIZER_OUT -1
86 #define MAX_SCF (255 + BITS_DEQUANTIZER_OUT*4 - 210)
87 #define MAX_SCFI ((MAX_SCF + 3) & ~3)
88 
89 #define MINIMP3_MIN(a, b) ((a) > (b) ? (b) : (a))
90 #define MINIMP3_MAX(a, b) ((a) < (b) ? (b) : (a))
91 
92 #if !defined(MINIMP3_NO_SIMD)
93 
94 #if !defined(MINIMP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64))
95 /* x64 always have SSE2, arm64 always have neon, no need for generic code */
96 #define MINIMP3_ONLY_SIMD
97 #endif /* SIMD checks... */
98 
99 #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
100 #if defined(_MSC_VER)
101 #include <intrin.h>
102 #endif /* defined(_MSC_VER) */
103 #include <immintrin.h>
104 #define HAVE_SSE 1
105 #define HAVE_SIMD 1
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))
116 typedef __m128 f4;
117 #if defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD)
118 #define minimp3_cpuid __cpuid
119 #else /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */
120 static __inline__ __attribute__((always_inline)) void minimp3_cpuid(int CPUInfo[], const int InfoType)
121 {
122 #if defined(__PIC__)
123  __asm__ __volatile__(
124 #if defined(__x86_64__)
125  "push %%rbx\n"
126  "cpuid\n"
127  "xchgl %%ebx, %1\n"
128  "pop %%rbx\n"
129 #else /* defined(__x86_64__) */
130  "xchgl %%ebx, %1\n"
131  "cpuid\n"
132  "xchgl %%ebx, %1\n"
133 #endif /* defined(__x86_64__) */
134  : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
135  : "a" (InfoType));
136 #else /* defined(__PIC__) */
137  __asm__ __volatile__(
138  "cpuid"
139  : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
140  : "a" (InfoType));
141 #endif /* defined(__PIC__)*/
142 }
143 #endif /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */
144 static int have_simd(void)
145 {
146 #ifdef MINIMP3_ONLY_SIMD
147  return 1;
148 #else /* MINIMP3_ONLY_SIMD */
149  static int g_have_simd;
150  int CPUInfo[4];
151 #ifdef MINIMP3_TEST
152  static int g_counter;
153  if (g_counter++ > 100)
154  return 0;
155 #endif /* MINIMP3_TEST */
156  if (g_have_simd)
157  goto end;
158  minimp3_cpuid(CPUInfo, 0);
159  g_have_simd = 1;
160  if (CPUInfo[0] > 0)
161  {
162  minimp3_cpuid(CPUInfo, 1);
163  g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */
164  }
165 end:
166  return g_have_simd - 1;
167 #endif /* MINIMP3_ONLY_SIMD */
168 }
169 #elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)
170 #include <arm_neon.h>
171 #define HAVE_SSE 0
172 #define HAVE_SIMD 1
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()
185 { /* TODO: detect neon for !MINIMP3_ONLY_SIMD */
186  return 1;
187 }
188 #else /* SIMD checks... */
189 #define HAVE_SSE 0
190 #define HAVE_SIMD 0
191 #ifdef MINIMP3_ONLY_SIMD
192 #error MINIMP3_ONLY_SIMD used, but SSE/NEON not enabled
193 #endif /* MINIMP3_ONLY_SIMD */
194 #endif /* SIMD checks... */
195 #else /* !defined(MINIMP3_NO_SIMD) */
196 #define HAVE_SIMD 0
197 #endif /* !defined(MINIMP3_NO_SIMD) */
198 
199 #if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64)
200 #define HAVE_ARMV6 1
201 static __inline__ __attribute__((always_inline)) int32_t minimp3_clip_int16_arm(int32_t a)
202 {
203  int32_t x = 0;
204  __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a));
205  return x;
206 }
207 #else
208 #define HAVE_ARMV6 0
209 #endif
210 
211 typedef struct
212 {
213  const uint8_t *buf;
214  int pos, limit;
215 } bs_t;
216 
217 typedef struct
218 {
219  float scf[3*64];
220  uint8_t total_bands, stereo_bands, bitalloc[64], scfcod[64];
221 } L12_scale_info;
222 
223 typedef struct
224 {
225  uint8_t tab_offset, code_tab_width, band_count;
226 } L12_subband_alloc_t;
227 
228 typedef struct
229 {
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;
235 } L3_gr_info_t;
236 
237 typedef struct
238 {
239  bs_t bs;
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];
244 } mp3dec_scratch_t;
245 
246 static void bs_init(bs_t *bs, const uint8_t *data, int bytes)
247 {
248  bs->buf = data;
249  bs->pos = 0;
250  bs->limit = bytes*8;
251 }
252 
253 static uint32_t get_bits(bs_t *bs, int n)
254 {
255  uint32_t next, cache = 0, s = bs->pos & 7;
256  int shl = n + s;
257  const uint8_t *p = bs->buf + (bs->pos >> 3);
258  if ((bs->pos += n) > bs->limit)
259  return 0;
260  next = *p++ & (255 >> s);
261  while ((shl -= 8) > 0)
262  {
263  cache |= next << shl;
264  next = *p++;
265  }
266  return cache | (next >> -shl);
267 }
268 
269 static int hdr_valid(const uint8_t *h)
270 {
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);
276 }
277 
278 static int hdr_compare(const uint8_t *h1, const uint8_t *h2)
279 {
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));
284 }
285 
286 static unsigned hdr_bitrate_kbps(const uint8_t *h)
287 {
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 } },
291  };
292  return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)];
293 }
294 
295 static unsigned hdr_sample_rate_hz(const uint8_t *h)
296 {
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);
299 }
300 
301 static unsigned hdr_frame_samples(const uint8_t *h)
302 {
303  return HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)HDR_IS_FRAME_576(h));
304 }
305 
306 static int hdr_frame_bytes(const uint8_t *h, int free_format_size)
307 {
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))
310  {
311  frame_bytes &= ~3; /* slot align */
312  }
313  return frame_bytes ? frame_bytes : free_format_size;
314 }
315 
316 static int hdr_padding(const uint8_t *h)
317 {
318  return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
319 }
320 
321 #ifndef MINIMP3_ONLY_MP3
322 static const L12_subband_alloc_t *L12_subband_alloc_table(const uint8_t *hdr, L12_scale_info *sci)
323 {
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;
327 
328  if (HDR_IS_LAYER_1(hdr))
329  {
330  static const L12_subband_alloc_t g_alloc_L1[] = { { 76, 4, 32 } };
331  alloc = g_alloc_L1;
332  nbands = 32;
333  } else if (!HDR_TEST_MPEG1(hdr))
334  {
335  static const L12_subband_alloc_t g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
336  alloc = g_alloc_L2M2;
337  nbands = 30;
338  } else
339  {
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);
343  if (!kbps) /* free-format */
344  {
345  kbps = 192;
346  }
347 
348  alloc = g_alloc_L2M1;
349  nbands = 27;
350  if (kbps < 56)
351  {
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)
356  {
357  nbands = 30;
358  }
359  }
360 
361  sci->total_bands = (uint8_t)nbands;
362  sci->stereo_bands = (uint8_t)MINIMP3_MIN(stereo_bands, nbands);
363 
364  return alloc;
365 }
366 
367 static void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod, int bands, float *scf)
368 {
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)
372  };
373  int i, m;
374  for (i = 0; i < bands; i++)
375  {
376  float s = 0;
377  int ba = *pba++;
378  int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
379  for (m = 4; m; m >>= 1)
380  {
381  if (mask & m)
382  {
383  int b = get_bits(bs, 6);
384  s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3);
385  }
386  *scf++ = s;
387  }
388  }
389 }
390 
391 static void L12_read_scale_info(const uint8_t *hdr, bs_t *bs, L12_scale_info *sci)
392 {
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,
397  0,17,18,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
401  };
402  const L12_subband_alloc_t *subband_alloc = L12_subband_alloc_table(hdr, sci);
403 
404  int i, k = 0, ba_bits = 0;
405  const uint8_t *ba_code_tab = g_bitalloc_code_tab;
406 
407  for (i = 0; i < sci->total_bands; i++)
408  {
409  uint8_t ba;
410  if (i == k)
411  {
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;
415  subband_alloc++;
416  }
417  ba = ba_code_tab[get_bits(bs, ba_bits)];
418  sci->bitalloc[2*i] = ba;
419  if (i < sci->stereo_bands)
420  {
421  ba = ba_code_tab[get_bits(bs, ba_bits)];
422  }
423  sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
424  }
425 
426  for (i = 0; i < 2*sci->total_bands; i++)
427  {
428  sci->scfcod[i] = sci->bitalloc[i] ? HDR_IS_LAYER_1(hdr) ? 2 : get_bits(bs, 2) : 6;
429  }
430 
431  L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
432 
433  for (i = sci->stereo_bands; i < sci->total_bands; i++)
434  {
435  sci->bitalloc[2*i + 1] = 0;
436  }
437 }
438 
439 static int L12_dequantize_granule(float *grbuf, bs_t *bs, L12_scale_info *sci, int group_size)
440 {
441  int i, j, k, choff = 576;
442  for (j = 0; j < 4; j++)
443  {
444  float *dst = grbuf + group_size*j;
445  for (i = 0; i < 2*sci->total_bands; i++)
446  {
447  int ba = sci->bitalloc[i];
448  if (ba != 0)
449  {
450  if (ba < 17)
451  {
452  int half = (1 << (ba - 1)) - 1;
453  for (k = 0; k < group_size; k++)
454  {
455  dst[k] = (float)((int)get_bits(bs, ba) - half);
456  }
457  } else
458  {
459  unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */
460  unsigned code = get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */
461  for (k = 0; k < group_size; k++, code /= mod)
462  {
463  dst[k] = (float)((int)(code % mod - mod/2));
464  }
465  }
466  }
467  dst += choff;
468  choff = 18 - choff;
469  }
470  }
471  return group_size*4;
472 }
473 
474 static void L12_apply_scf_384(L12_scale_info *sci, const float *scf, float *dst)
475 {
476  int i, k;
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)
479  {
480  for (k = 0; k < 12; k++)
481  {
482  dst[k + 0] *= scf[0];
483  dst[k + 576] *= scf[3];
484  }
485  }
486 }
487 #endif /* MINIMP3_ONLY_MP3 */
488 
489 static int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr, const uint8_t *hdr)
490 {
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 }
500  };
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 }
510  };
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 }
520  };
521 
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;
526 
527  if (HDR_TEST_MPEG1(hdr))
528  {
529  gr_count *= 2;
530  main_data_begin = get_bits(bs, 9);
531  scfsi = get_bits(bs, 7 + gr_count);
532  } else
533  {
534  main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count;
535  }
536 
537  do
538  {
539  if (HDR_IS_MONO(hdr))
540  {
541  scfsi <<= 4;
542  }
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)
547  {
548  return -1;
549  }
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];
553  gr->n_long_sfb = 22;
554  gr->n_short_sfb = 0;
555  if (get_bits(bs, 1))
556  {
557  gr->block_type = (uint8_t)get_bits(bs, 2);
558  if (!gr->block_type)
559  {
560  return -1;
561  }
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)
566  {
567  scfsi &= 0x0F0F;
568  if (!gr->mixed_block_flag)
569  {
570  gr->region_count[0] = 8;
571  gr->sfbtab = g_scf_short[sr_idx];
572  gr->n_long_sfb = 0;
573  gr->n_short_sfb = 39;
574  } else
575  {
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;
579  }
580  }
581  tables = get_bits(bs, 10);
582  tables <<= 5;
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);
586  } else
587  {
588  gr->block_type = 0;
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;
594  }
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);
602  scfsi <<= 4;
603  gr++;
604  } while(--gr_count);
605 
606  if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
607  {
608  return -1;
609  }
610 
611  return main_data_begin;
612 }
613 
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)
615 {
616  int i, k;
617  for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
618  {
619  int cnt = scf_count[i];
620  if (scfsi & 8)
621  {
622  memcpy(scf, ist_pos, cnt);
623  } else
624  {
625  int bits = scf_size[i];
626  if (!bits)
627  {
628  memset(scf, 0, cnt);
629  memset(ist_pos, 0, cnt);
630  } else
631  {
632  int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
633  for (k = 0; k < cnt; k++)
634  {
635  int s = get_bits(bitbuf, bits);
636  ist_pos[k] = (s == max_scf ? -1 : s);
637  scf[k] = s;
638  }
639  }
640  }
641  ist_pos += cnt;
642  scf += cnt;
643  }
644  scf[0] = scf[1] = scf[2] = 0;
645 }
646 
647 static float L3_ldexp_q2(float y, int exp_q2)
648 {
649  static const float g_expfrac[4] = { 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 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)
660 {
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 }
665  };
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;
669  float gain;
670 
671  if (HDR_TEST_MPEG1(hdr))
672  {
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);
677  } else
678  {
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)
683  {
684  for (modprod = 1, i = 3; i >= 0; i--)
685  {
686  scf_size[i] = (uint8_t)(sfc / modprod % g_mod[k + i]);
687  modprod *= g_mod[k + i];
688  }
689  }
690  scf_partition += k;
691  scfsi = -16;
692  }
693  L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
694 
695  if (gr->n_short_sfb)
696  {
697  int sh = 3 - scf_shift;
698  for (i = 0; i < gr->n_short_sfb; i += 3)
699  {
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;
703  }
704  } else if (gr->preflag)
705  {
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++)
708  {
709  iscf[11 + i] += g_preamp[i];
710  }
711  }
712 
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++)
716  {
717  scf[i] = L3_ldexp_q2(gain, iscf[i] << scf_shift);
718  }
719 }
720 
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
724 };
725 
726 static float L3_pow_43(int x)
727 {
728  float frac;
729  int sign, mult = 256;
730 
731  if (x < 129)
732  {
733  return g_pow43[16 + x];
734  }
735 
736  if (x < 1024)
737  {
738  mult = 16;
739  x <<= 3;
740  }
741 
742  sign = 2*x & 64;
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;
745 }
746 
747 static void L3_huffman(float *dst, bs_t *bs, const L3_gr_info_t *gr_info, const float *scf, int layer3gr_limit)
748 {
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 };
769 
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)
774 
775  float one = 0.0f;
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;
781  bs_next_ptr += 4;
782 
783  while (big_val_cnt > 0)
784  {
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];
789  if (linbits)
790  {
791  do
792  {
793  np = *sfb++ / 2;
794  pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
795  one = *scf++;
796  do
797  {
798  int j, w = 5;
799  int leaf = codebook[PEEK_BITS(w)];
800  while (leaf < 0)
801  {
802  FLUSH_BITS(w);
803  w = leaf & 7;
804  leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
805  }
806  FLUSH_BITS(leaf >> 8);
807 
808  for (j = 0; j < 2; j++, dst++, leaf >>= 4)
809  {
810  int lsb = leaf & 0x0F;
811  if (lsb == 15)
812  {
813  lsb += PEEK_BITS(linbits);
814  FLUSH_BITS(linbits);
815  CHECK_BITS;
816  *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1);
817  } else
818  {
819  *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
820  }
821  FLUSH_BITS(lsb ? 1 : 0);
822  }
823  CHECK_BITS;
824  } while (--pairs_to_decode);
825  } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
826  } else
827  {
828  do
829  {
830  np = *sfb++ / 2;
831  pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
832  one = *scf++;
833  do
834  {
835  int j, w = 5;
836  int leaf = codebook[PEEK_BITS(w)];
837  while (leaf < 0)
838  {
839  FLUSH_BITS(w);
840  w = leaf & 7;
841  leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
842  }
843  FLUSH_BITS(leaf >> 8);
844 
845  for (j = 0; j < 2; j++, dst++, leaf >>= 4)
846  {
847  int lsb = leaf & 0x0F;
848  *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
849  FLUSH_BITS(lsb ? 1 : 0);
850  }
851  CHECK_BITS;
852  } while (--pairs_to_decode);
853  } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
854  }
855  }
856 
857  for (np = 1 - big_val_cnt;; dst += 4)
858  {
859  const uint8_t *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
860  int leaf = codebook_count1[PEEK_BITS(4)];
861  if (!(leaf & 8))
862  {
863  leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
864  }
865  FLUSH_BITS(leaf & 7);
866  if (BSPOS > 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  RELOAD_SCALEFACTOR;
873  DEQ_COUNT1(0);
874  DEQ_COUNT1(1);
875  RELOAD_SCALEFACTOR;
876  DEQ_COUNT1(2);
877  DEQ_COUNT1(3);
878  CHECK_BITS;
879  }
880 
881  bs->pos = layer3gr_limit;
882 }
883 
884 static void L3_midside_stereo(float *left, int n)
885 {
886  int i = 0;
887  float *right = left + 576;
888 #if HAVE_SIMD
889  if (have_simd())
890  {
891  for (; i < n - 3; i += 4)
892  {
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));
897  }
898 #ifdef __GNUC__
899  /* Workaround for spurious -Waggressive-loop-optimizations warning from gcc.
900  * For more info see: https://github.com/lieff/minimp3/issues/88
901  */
902  if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0)
903  return;
904 #endif
905  }
906 #endif /* HAVE_SIMD */
907  for (; i < n; i++)
908  {
909  float a = left[i];
910  float b = right[i];
911  left[i] = a + b;
912  right[i] = a - b;
913  }
914 }
915 
916 static void L3_intensity_stereo_band(float *left, int n, float kl, float kr)
917 {
918  int i;
919  for (i = 0; i < n; i++)
920  {
921  left[i + 576] = left[i]*kr;
922  left[i] = left[i]*kl;
923  }
924 }
925 
926 static void L3_stereo_top_band(const float *right, const uint8_t *sfb, int nbands, int max_band[3])
927 {
928  int i, k;
929 
930  max_band[0] = max_band[1] = max_band[2] = -1;
931 
932  for (i = 0; i < nbands; i++)
933  {
934  for (k = 0; k < sfb[i]; k += 2)
935  {
936  if (right[k] != 0 || right[k + 1] != 0)
937  {
938  max_band[i % 3] = i;
939  break;
940  }
941  }
942  right += sfb[i];
943  }
944 }
945 
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)
947 {
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;
950 
951  for (i = 0; sfb[i]; i++)
952  {
953  unsigned ipos = ist_pos[i];
954  if ((int)i > max_band[i % 3] && ipos < max_pos)
955  {
956  float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
957  if (HDR_TEST_MPEG1(hdr))
958  {
959  kl = g_pan[2*ipos];
960  kr = g_pan[2*ipos + 1];
961  } else
962  {
963  kl = 1;
964  kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
965  if (ipos & 1)
966  {
967  kl = kr;
968  kr = 1;
969  }
970  }
971  L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);
972  } else if (HDR_TEST_MS_STEREO(hdr))
973  {
974  L3_midside_stereo(left, sfb[i]);
975  }
976  left += sfb[i];
977  }
978 }
979 
980 static void L3_intensity_stereo(float *left, uint8_t *ist_pos, const L3_gr_info_t *gr, const uint8_t *hdr)
981 {
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;
984 
985  L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
986  if (gr->n_long_sfb)
987  {
988  max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]);
989  }
990  for (i = 0; i < max_blocks; i++)
991  {
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];
996  }
997  L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
998 }
999 
1000 static void L3_reorder(float *grbuf, float *scratch, const uint8_t *sfb)
1001 {
1002  int i, len;
1003  float *src = grbuf, *dst = scratch;
1004 
1005  for (;0 != (len = *sfb); sfb += 3, src += 2*len)
1006  {
1007  for (i = 0; i < len; i++, src++)
1008  {
1009  *dst++ = src[0*len];
1010  *dst++ = src[1*len];
1011  *dst++ = src[2*len];
1012  }
1013  }
1014  memcpy(grbuf, scratch, (dst - scratch)*sizeof(float));
1015 }
1016 
1017 static void L3_antialias(float *grbuf, int nbands)
1018 {
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}
1022  };
1023 
1024  for (; nbands > 0; nbands--, grbuf += 18)
1025  {
1026  int i = 0;
1027 #if HAVE_SIMD
1028  if (have_simd()) for (; i < 8; i += 4)
1029  {
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);
1034  vd = VREV(vd);
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));
1038  }
1039 #endif /* HAVE_SIMD */
1040 #ifndef MINIMP3_ONLY_SIMD
1041  for(; i < 8; i++)
1042  {
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];
1047  }
1048 #endif /* MINIMP3_ONLY_SIMD */
1049  }
1050 }
1051 
1052 static void L3_dct3_9(float *y)
1053 {
1054  float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
1055 
1056  s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];
1057  t0 = s0 + s6*0.5f;
1058  s0 -= s6;
1059  t4 = (s4 + s2)*0.93969262f;
1060  t2 = (s8 + s2)*0.76604444f;
1061  s6 = (s4 - s8)*0.17364818f;
1062  s4 += s8 - s2;
1063 
1064  s2 = s0 - s4*0.5f;
1065  y[4] = s4 + s0;
1066  s8 = t0 - t2 + s6;
1067  s0 = t0 - t4 + t2;
1068  s4 = t0 + t4 - s6;
1069 
1070  s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];
1071 
1072  s3 *= 0.86602540f;
1073  t0 = (s5 + s1)*0.98480775f;
1074  t4 = (s5 - s7)*0.34202014f;
1075  t2 = (s1 + s7)*0.64278761f;
1076  s1 = (s1 - s5 - s7)*0.86602540f;
1077 
1078  s5 = t0 - s3 - t2;
1079  s7 = t4 - s3 - t0;
1080  s3 = t4 + s3 - t2;
1081 
1082  y[0] = s4 - s7;
1083  y[1] = s2 + s1;
1084  y[2] = s0 - s3;
1085  y[3] = s8 + s5;
1086  y[5] = s8 - s5;
1087  y[6] = s0 + s3;
1088  y[7] = s2 - s1;
1089  y[8] = s4 + s7;
1090 }
1091 
1092 static void L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands)
1093 {
1094  int i, j;
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
1097  };
1098 
1099  for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)
1100  {
1101  float co[9], si[9];
1102  co[0] = -grbuf[0];
1103  si[0] = grbuf[17];
1104  for (i = 0; i < 4; i++)
1105  {
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]);
1110  }
1111  L3_dct3_9(co);
1112  L3_dct3_9(si);
1113 
1114  si[1] = -si[1];
1115  si[3] = -si[3];
1116  si[5] = -si[5];
1117  si[7] = -si[7];
1118 
1119  i = 0;
1120 
1121 #if HAVE_SIMD
1122  if (have_simd()) for (; i < 8; i += 4)
1123  {
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));
1136  }
1137 #endif /* HAVE_SIMD */
1138  for (; i < 9; i++)
1139  {
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];
1145  }
1146  }
1147 }
1148 
1149 static void L3_idct3(float x0, float x1, float x2, float *dst)
1150 {
1151  float m1 = x1*0.86602540f;
1152  float a1 = x0 - x2*0.5f;
1153  dst[1] = x0 + x2;
1154  dst[0] = a1 + m1;
1155  dst[2] = a1 - m1;
1156 }
1157 
1158 static void L3_imdct12(float *x, float *dst, float *overlap)
1159 {
1160  static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
1161  float co[3], si[3];
1162  int i;
1163 
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);
1166  si[1] = -si[1];
1167 
1168  for (i = 0; i < 3; i++)
1169  {
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];
1175  }
1176 }
1177 
1178 static void L3_imdct_short(float *grbuf, float *overlap, int nbands)
1179 {
1180  for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
1181  {
1182  float tmp[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);
1188  }
1189 }
1190 
1191 static void L3_change_sign(float *grbuf)
1192 {
1193  int b, i;
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];
1197 }
1198 
1199 static void L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands)
1200 {
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 }
1204  };
1205  if (n_long_bands)
1206  {
1207  L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
1208  grbuf += 18*n_long_bands;
1209  overlap += 9*n_long_bands;
1210  }
1211  if (block_type == SHORT_BLOCK_TYPE)
1212  L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
1213  else
1214  L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE], 32 - n_long_bands);
1215 }
1216 
1217 static void L3_save_reservoir(mp3dec_t *h, mp3dec_scratch_t *s)
1218 {
1219  int pos = (s->bs.pos + 7)/8u;
1220  int remains = s->bs.limit/8u - pos;
1221  if (remains > MAX_BITRESERVOIR_BYTES)
1222  {
1223  pos += remains - MAX_BITRESERVOIR_BYTES;
1224  remains = MAX_BITRESERVOIR_BYTES;
1225  }
1226  if (remains > 0)
1227  {
1228  memmove(h->reserv_buf, s->maindata + pos, remains);
1229  }
1230  h->reserv = remains;
1231 }
1232 
1233 static int L3_restore_reservoir(mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s, int main_data_begin)
1234 {
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;
1241 }
1242 
1243 static void L3_decode(mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info, int nch)
1244 {
1245  int ch;
1246 
1247  for (ch = 0; ch < nch; ch++)
1248  {
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);
1252  }
1253 
1254  if (HDR_TEST_I_STEREO(h->header))
1255  {
1256  L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header);
1257  } else if (HDR_IS_MS_STEREO(h->header))
1258  {
1259  L3_midside_stereo(s->grbuf[0], 576);
1260  }
1261 
1262  for (ch = 0; ch < nch; ch++, gr_info++)
1263  {
1264  int aa_bands = 31;
1265  int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(HDR_GET_MY_SAMPLE_RATE(h->header) == 2);
1266 
1267  if (gr_info->n_short_sfb)
1268  {
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);
1271  }
1272 
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]);
1276  }
1277 }
1278 
1279 static void mp3d_DCT_II(float *grbuf, int n)
1280 {
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
1283  };
1284  int i, k = 0;
1285 #if HAVE_SIMD
1286  if (have_simd()) for (; k < n; k += 4)
1287  {
1288  f4 t[4][8], *x;
1289  float *y = grbuf + k;
1290 
1291  for (x = t[0], i = 0; i < 8; i++, x++)
1292  {
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]);
1305  }
1306  for (x = t[0], i = 0; i < 4; i++, x += 8)
1307  {
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);
1317  x5 = VADD(x5, x6);
1318  x6 = VMUL_S(VADD(x6, x7), 0.70710677f);
1319  x7 = VADD(x7, xt);
1320  x3 = VMUL_S(VADD(x3, x4), 0.70710677f);
1321  x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */
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);
1331  }
1332 
1333  if (k > n - 3)
1334  {
1335 #if HAVE_SSE
1336 #define VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
1337 #else /* HAVE_SSE */
1338 #define VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
1339 #endif /* HAVE_SSE */
1340  for (i = 0; i < 7; i++, y += 4*18)
1341  {
1342  f4 s = VADD(t[3][i], t[3][i + 1]);
1343  VSAVE2(0, t[0][i]);
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));
1347  }
1348  VSAVE2(0, t[0][7]);
1349  VSAVE2(1, VADD(t[2][7], t[3][7]));
1350  VSAVE2(2, t[1][7]);
1351  VSAVE2(3, t[3][7]);
1352  } else
1353  {
1354 #define VSAVE4(i, v) VSTORE(&y[i*18], v)
1355  for (i = 0; i < 7; i++, y += 4*18)
1356  {
1357  f4 s = VADD(t[3][i], t[3][i + 1]);
1358  VSAVE4(0, t[0][i]);
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));
1362  }
1363  VSAVE4(0, t[0][7]);
1364  VSAVE4(1, VADD(t[2][7], t[3][7]));
1365  VSAVE4(2, t[1][7]);
1366  VSAVE4(3, t[3][7]);
1367  }
1368  } else
1369 #endif /* HAVE_SIMD */
1370 #ifdef MINIMP3_ONLY_SIMD
1371  {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */
1372 #else /* MINIMP3_ONLY_SIMD */
1373  for (; k < n; k++)
1374  {
1375  float t[4][8], *x, *y = grbuf + k;
1376 
1377  for (x = t[0], i = 0; i < 8; i++, x++)
1378  {
1379  float x0 = y[i*18];
1380  float x1 = y[(15 - i)*18];
1381  float x2 = y[(16 + i)*18];
1382  float x3 = y[(31 - i)*18];
1383  float t0 = x0 + x3;
1384  float t1 = x1 + x2;
1385  float t2 = (x1 - x2)*g_sec[3*i + 0];
1386  float t3 = (x0 - x3)*g_sec[3*i + 1];
1387  x[0] = t0 + t1;
1388  x[8] = (t0 - t1)*g_sec[3*i + 2];
1389  x[16] = t3 + t2;
1390  x[24] = (t3 - t2)*g_sec[3*i + 2];
1391  }
1392  for (x = t[0], i = 0; i < 4; i++, x += 8)
1393  {
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;
1401  x[0] = x0 + x1;
1402  x[4] = (x0 - x1)*0.70710677f;
1403  x5 = x5 + x6;
1404  x6 = (x6 + x7)*0.70710677f;
1405  x7 = x7 + xt;
1406  x3 = (x3 + x4)*0.70710677f;
1407  x5 -= x7*0.198912367f; /* rotate by PI/8 */
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;
1417 
1418  }
1419  for (i = 0; i < 7; i++, y += 4*18)
1420  {
1421  y[0*18] = t[0][i];
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];
1425  }
1426  y[0*18] = t[0][7];
1427  y[1*18] = t[2][7] + t[3][7];
1428  y[2*18] = t[1][7];
1429  y[3*18] = t[3][7];
1430  }
1431 #endif /* MINIMP3_ONLY_SIMD */
1432 }
1433 
1434 #ifndef MINIMP3_FLOAT_OUTPUT
1435 static int16_t mp3d_scale_pcm(float sample)
1436 {
1437 #if HAVE_ARMV6
1438  int32_t s32 = (int32_t)(sample + .5f);
1439  s32 -= (s32 < 0);
1440  int16_t s = (int16_t)minimp3_clip_int16_arm(s32);
1441 #else
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);
1445  s -= (s < 0); /* away from zero, to be compliant */
1446 #endif
1447  return s;
1448 }
1449 #else /* MINIMP3_FLOAT_OUTPUT */
1450 static float mp3d_scale_pcm(float sample)
1451 {
1452  return sample*(1.f/32768.f);
1453 }
1454 #endif /* MINIMP3_FLOAT_OUTPUT */
1455 
1456 static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const float *z)
1457 {
1458  float a;
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);
1468 
1469  z += 2;
1470  a = z[14*64] * 104;
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;
1477  a += z[ 0*64] * -5;
1478  pcm[16*nch] = mp3d_scale_pcm(a);
1479 }
1480 
1481 static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins)
1482 {
1483  int i;
1484  float *xr = xl + 576*(nch - 1);
1485  mp3d_sample_t *dstr = dstl + (nch - 1);
1486 
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
1503  };
1504  float *zlin = lins + 15*64;
1505  const float *w = g_win;
1506 
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];
1511 
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];
1516 
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);
1521 
1522 #if HAVE_SIMD
1523  if (have_simd()) for (i = 14; i >= 0; i--)
1524  {
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))); }
1529  f4 a, b;
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)];
1538 
1539  V0(0) V2(1) V1(2) V2(3) V1(4) V2(5) V1(6) V2(7)
1540 
1541  {
1542 #ifndef MINIMP3_FLOAT_OUTPUT
1543 #if HAVE_SSE
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);
1556 #else /* HAVE_SSE */
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);
1570 #endif /* HAVE_SSE */
1571 
1572 #else /* MINIMP3_FLOAT_OUTPUT */
1573 
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);
1577 #if HAVE_SSE
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)));
1586 #else /* HAVE_SSE */
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);
1595 #endif /* HAVE_SSE */
1596 #endif /* MINIMP3_FLOAT_OUTPUT */
1597  }
1598  } else
1599 #endif /* HAVE_SIMD */
1600 #ifdef MINIMP3_ONLY_SIMD
1601  {} /* for HAVE_SIMD=1, MINIMP3_ONLY_SIMD=1 case we do not need non-intrinsic "else" branch */
1602 #else /* MINIMP3_ONLY_SIMD */
1603  for (i = 14; i >= 0; i--)
1604  {
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; }
1609  float a[4], b[4];
1610 
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)];
1619 
1620  S0(0) S2(1) S1(2) S2(3) S1(4) S2(5) S1(6) S2(7)
1621 
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]);
1630  }
1631 #endif /* MINIMP3_ONLY_SIMD */
1632 }
1633 
1634 static void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, mp3d_sample_t *pcm, float *lins)
1635 {
1636  int i;
1637  for (i = 0; i < nch; i++)
1638  {
1639  mp3d_DCT_II(grbuf + 576*i, nbands);
1640  }
1641 
1642  memcpy(lins, qmf_state, sizeof(float)*15*64);
1643 
1644  for (i = 0; i < nbands; i += 2)
1645  {
1646  mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
1647  }
1648 #ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL
1649  if (nch == 1)
1650  {
1651  for (i = 0; i < 15*64; i += 2)
1652  {
1653  qmf_state[i] = lins[nbands*64 + i];
1654  }
1655  } else
1656 #endif /* MINIMP3_NONSTANDARD_BUT_LOGICAL */
1657  {
1658  memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64);
1659  }
1660 }
1661 
1662 static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes)
1663 {
1664  int i, nmatch;
1665  for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++)
1666  {
1667  i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i);
1668  if (i + HDR_SIZE > mp3_bytes)
1669  return nmatch > 0;
1670  if (!hdr_compare(hdr, hdr + i))
1671  return 0;
1672  }
1673  return 1;
1674 }
1675 
1676 static int mp3d_find_frame(const uint8_t *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes)
1677 {
1678  int i, k;
1679  for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++)
1680  {
1681  if (hdr_valid(mp3))
1682  {
1683  int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes);
1684  int frame_and_padding = frame_bytes + hdr_padding(mp3);
1685 
1686  for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++)
1687  {
1688  if (hdr_compare(mp3, mp3 + k))
1689  {
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))
1693  continue;
1694  frame_and_padding = k;
1695  frame_bytes = fb;
1696  *free_format_bytes = fb;
1697  }
1698  }
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))
1702  {
1703  *ptr_frame_bytes = frame_and_padding;
1704  return i;
1705  }
1706  *free_format_bytes = 0;
1707  }
1708  }
1709  *ptr_frame_bytes = 0;
1710  return mp3_bytes;
1711 }
1712 
1713 void mp3dec_init(mp3dec_t *dec)
1714 {
1715  dec->header[0] = 0;
1716 }
1717 
1718 int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info)
1719 {
1720  int i = 0, igr, frame_size = 0, success = 1;
1721  const uint8_t *hdr;
1722  bs_t bs_frame[1];
1723  mp3dec_scratch_t scratch;
1724 
1725  if (mp3_bytes > 4 && dec->header[0] == 0xff && hdr_compare(dec->header, mp3))
1726  {
1727  frame_size = hdr_frame_bytes(mp3, dec->free_format_bytes) + hdr_padding(mp3);
1728  if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size)))
1729  {
1730  frame_size = 0;
1731  }
1732  }
1733  if (!frame_size)
1734  {
1735  memset(dec, 0, sizeof(mp3dec_t));
1736  i = mp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);
1737  if (!frame_size || i + frame_size > mp3_bytes)
1738  {
1739  info->frame_bytes = i;
1740  return 0;
1741  }
1742  }
1743 
1744  hdr = mp3 + 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);
1752 
1753  if (!pcm)
1754  {
1755  return hdr_frame_samples(hdr);
1756  }
1757 
1758  bs_init(bs_frame, hdr + HDR_SIZE, frame_size - HDR_SIZE);
1759  if (HDR_IS_CRC(hdr))
1760  {
1761  get_bits(bs_frame, 16);
1762  }
1763 
1764  if (info->layer == 3)
1765  {
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)
1768  {
1769  mp3dec_init(dec);
1770  return 0;
1771  }
1772  success = L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
1773  if (success)
1774  {
1775  for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*info->channels)
1776  {
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]);
1780  }
1781  }
1782  L3_save_reservoir(dec, &scratch);
1783  } else
1784  {
1785 #ifdef MINIMP3_ONLY_MP3
1786  return 0;
1787 #else /* MINIMP3_ONLY_MP3 */
1788  L12_scale_info sci[1];
1789  L12_read_scale_info(hdr, bs_frame, sci);
1790 
1791  memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
1792  for (i = 0, igr = 0; igr < 3; igr++)
1793  {
1794  if (12 == (i += L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))
1795  {
1796  i = 0;
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;
1801  }
1802  if (bs_frame->pos > bs_frame->limit)
1803  {
1804  mp3dec_init(dec);
1805  return 0;
1806  }
1807  }
1808 #endif /* MINIMP3_ONLY_MP3 */
1809  }
1810  return success*hdr_frame_samples(dec->header);
1811 }
1812 
1813 #ifdef MINIMP3_FLOAT_OUTPUT
1814 void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples)
1815 {
1816  int i = 0;
1817 #if HAVE_SIMD
1818  int aligned_count = num_samples & ~7;
1819  for(; i < aligned_count; i += 8)
1820  {
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);
1824 #if HAVE_SSE
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);
1837 #else /* HAVE_SSE */
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);
1851 #endif /* HAVE_SSE */
1852  }
1853 #endif /* HAVE_SIMD */
1854  for(; i < num_samples; i++)
1855  {
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;
1861  else
1862  {
1863  int16_t s = (int16_t)(sample + .5f);
1864  s -= (s < 0); /* away from zero, to be compliant */
1865  out[i] = s;
1866  }
1867  }
1868 }
1869 #endif /* MINIMP3_FLOAT_OUTPUT */
1870 #endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_IMPLEMENTATION_GUARD */
int16_t mp3d_sample_t
Definition: minimp3.h:36
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
Transmitter info
minimum disk read bytes
int reserv
Definition: minimp3.h:26
float qmf_state[15 *2 *32]
Definition: minimp3.h:25
unsigned char reserv_buf[511]
Definition: minimp3.h:27
unsigned char header[4]
Definition: minimp3.h:27
float mdct_overlap[2][9 *32]
Definition: minimp3.h:25
int free_format_bytes
Definition: minimp3.h:26
const guchar * bits
Definition: xcursors.h:1