4 #define DR_MP3_NO_STDIO 27 #define DRMP3_MAX_SAMPLES_PER_FRAME (1152*2) 43 float mdct_overlap[2][9*32];
44 float qmf_state[15*2*32];
47 unsigned char header[4];
48 unsigned char reserv_buf[511];
70 #define DRMP3_SRC_CACHE_SIZE_IN_FRAMES 512 123 typedef size_t (*
drmp3_read_proc)(
void* pUserData,
void* pBufferOut,
size_t bytesToRead);
194 #ifndef DR_MP3_NO_STDIO 228 #ifndef DR_MP3_NO_STDIO 246 #ifdef DR_MP3_IMPLEMENTATION 252 #define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE 2304 253 #define DRMP3_MAX_FRAME_SYNC_MATCHES 10 255 #define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES DRMP3_MAX_FREE_FORMAT_FRAME_SIZE 257 #define DRMP3_MAX_BITRESERVOIR_BYTES 511 258 #define DRMP3_SHORT_BLOCK_TYPE 2 259 #define DRMP3_STOP_BLOCK_TYPE 3 260 #define DRMP3_MODE_MONO 3 261 #define DRMP3_MODE_JOINT_STEREO 1 262 #define DRMP3_HDR_SIZE 4 263 #define DRMP3_HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0) 264 #define DRMP3_HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60) 265 #define DRMP3_HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0) 266 #define DRMP3_HDR_IS_CRC(h) (!((h[1]) & 1)) 267 #define DRMP3_HDR_TEST_PADDING(h) ((h[2]) & 0x2) 268 #define DRMP3_HDR_TEST_MPEG1(h) ((h[1]) & 0x8) 269 #define DRMP3_HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10) 270 #define DRMP3_HDR_TEST_I_STEREO(h) ((h[3]) & 0x10) 271 #define DRMP3_HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20) 272 #define DRMP3_HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3) 273 #define DRMP3_HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3) 274 #define DRMP3_HDR_GET_LAYER(h) (((h[1]) >> 1) & 3) 275 #define DRMP3_HDR_GET_BITRATE(h) ((h[2]) >> 4) 276 #define DRMP3_HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3) 277 #define DRMP3_HDR_GET_MY_SAMPLE_RATE(h) (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3) 278 #define DRMP3_HDR_IS_FRAME_576(h) ((h[1] & 14) == 2) 279 #define DRMP3_HDR_IS_LAYER_1(h) ((h[1] & 6) == 6) 281 #define DRMP3_BITS_DEQUANTIZER_OUT -1 282 #define DRMP3_MAX_SCF (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210) 283 #define DRMP3_MAX_SCFI ((DRMP3_MAX_SCF + 3) & ~3) 285 #define DRMP3_MIN(a, b) ((a) > (b) ? (b) : (a)) 286 #define DRMP3_MAX(a, b) ((a) < (b) ? (b) : (a)) 288 #if !defined(DR_MP3_NO_SIMD) 290 #if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__)) 292 #define DR_MP3_ONLY_SIMD 295 #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__)) 296 #if defined(_MSC_VER) 299 #include <immintrin.h> 300 #define DRMP3_HAVE_SSE 1 301 #define DRMP3_HAVE_SIMD 1 302 #define DRMP3_VSTORE _mm_storeu_ps 303 #define DRMP3_VLD _mm_loadu_ps 304 #define DRMP3_VSET _mm_set1_ps 305 #define DRMP3_VADD _mm_add_ps 306 #define DRMP3_VSUB _mm_sub_ps 307 #define DRMP3_VMUL _mm_mul_ps 308 #define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y)) 309 #define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y)) 310 #define DRMP3_VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s)) 311 #define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3)) 312 typedef __m128 drmp3_f4;
313 #if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD) 314 #define drmp3_cpuid __cpuid 316 static INLINE __attribute__((always_inline))
void drmp3_cpuid(
int CPUInfo[],
const int InfoType)
330 :
"=a" (CPUInfo[0]),
"=r" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
335 :
"=a" (CPUInfo[0]),
"=b" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
340 static int drmp3_have_simd()
342 #ifdef DR_MP3_ONLY_SIMD 345 static int g_have_simd;
348 static int g_counter;
349 if (g_counter++ > 100)
353 return g_have_simd - 1;
354 drmp3_cpuid(CPUInfo, 0);
357 drmp3_cpuid(CPUInfo, 1);
358 g_have_simd = (CPUInfo[3] & (1 << 26)) + 1;
359 return g_have_simd - 1;
368 #elif defined(__ARM_NEON) || defined(__aarch64__) 369 #include <arm_neon.h> 370 #define DRMP3_HAVE_SIMD 1 371 #define DRMP3_VSTORE vst1q_f32 372 #define DRMP3_VLD vld1q_f32 373 #define DRMP3_VSET vmovq_n_f32 374 #define DRMP3_VADD vaddq_f32 375 #define DRMP3_VSUB vsubq_f32 376 #define DRMP3_VMUL vmulq_f32 377 #define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y) 378 #define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y) 379 #define DRMP3_VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s)) 380 #define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x))) 381 typedef float32x4_t drmp3_f4;
382 static int drmp3_have_simd()
387 #define DRMP3_HAVE_SIMD 0 388 #ifdef DR_MP3_ONLY_SIMD 389 #error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled 395 #define DRMP3_HAVE_SIMD 0 413 } drmp3_L12_scale_info;
420 } drmp3_L12_subband_alloc;
445 drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES];
446 drmp3_L3_gr_info gr_info[4];
450 float syn[18 + 15][2*32];
453 static void drmp3_bs_init(drmp3_bs *bs,
const drmp3_uint8 *
data,
int bytes)
465 if ((bs->pos +=
n) > bs->limit)
468 while ((shl -= 8) > 0)
470 cache |=
next << shl;
473 return cache | (
next >> -shl);
478 return h[0] == 0xff &&
479 ((
h[1] & 0xF0) == 0xf0 || (
h[1] & 0xFE) == 0xe2) &&
480 (DRMP3_HDR_GET_LAYER(
h) != 0) &&
481 (DRMP3_HDR_GET_BITRATE(
h) != 15) &&
482 (DRMP3_HDR_GET_SAMPLE_RATE(
h) != 3);
487 return drmp3_hdr_valid(h2) &&
488 ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
489 ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
490 !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2));
493 static unsigned drmp3_hdr_bitrate_kbps(
const drmp3_uint8 *
h)
496 { { 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 } },
497 { { 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 } },
499 return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(
h)][DRMP3_HDR_GET_LAYER(
h) - 1][DRMP3_HDR_GET_BITRATE(
h)];
502 static unsigned drmp3_hdr_sample_rate_hz(
const drmp3_uint8 *
h)
504 static const unsigned g_hz[3] = { 44100, 48000, 32000 };
505 return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(
h)] >> (int)!DRMP3_HDR_TEST_MPEG1(
h) >> (int)!DRMP3_HDR_TEST_NOT_MPEG25(
h);
508 static unsigned drmp3_hdr_frame_samples(
const drmp3_uint8 *
h)
510 return DRMP3_HDR_IS_LAYER_1(
h) ? 384 : (1152 >> (int)DRMP3_HDR_IS_FRAME_576(
h));
513 static int drmp3_hdr_frame_bytes(
const drmp3_uint8 *
h,
int free_format_size)
515 int frame_bytes = drmp3_hdr_frame_samples(
h)*drmp3_hdr_bitrate_kbps(
h)*125/drmp3_hdr_sample_rate_hz(
h);
516 if (DRMP3_HDR_IS_LAYER_1(
h))
520 return frame_bytes ? frame_bytes : free_format_size;
525 return DRMP3_HDR_TEST_PADDING(
h) ? (DRMP3_HDR_IS_LAYER_1(
h) ? 4 : 1) : 0;
528 #ifndef DR_MP3_ONLY_MP3 529 static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(
const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci)
531 const drmp3_L12_subband_alloc *alloc;
532 int mode = DRMP3_HDR_GET_STEREO_MODE(hdr);
533 int nbands, stereo_bands = (
mode == DRMP3_MODE_MONO) ? 0 : (
mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
535 if (DRMP3_HDR_IS_LAYER_1(hdr))
537 static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };
540 }
else if (!DRMP3_HDR_TEST_MPEG1(hdr))
542 static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
543 alloc = g_alloc_L2M2;
547 static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
548 int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr);
549 unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (int)(
mode != DRMP3_MODE_MONO);
555 alloc = g_alloc_L2M1;
559 static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
560 alloc = g_alloc_L2M1_lowrate;
561 nbands = sample_rate_idx == 2 ? 12 : 8;
562 }
else if (kbps >= 96 && sample_rate_idx != 1)
569 sci->stereo_bands = (
drmp3_uint8)DRMP3_MIN(stereo_bands, nbands);
574 static void drmp3_L12_read_scalefactors(drmp3_bs *bs,
drmp3_uint8 *pba,
drmp3_uint8 *scfcod,
int bands,
float *scf)
576 static const float g_deq_L12[18*3] = {
577 #define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x 578 DRMP3_DQ(3),DRMP3_DQ(7),DRMP3_DQ(15),DRMP3_DQ(31),DRMP3_DQ(63),DRMP3_DQ(127),DRMP3_DQ(255),DRMP3_DQ(511),DRMP3_DQ(1023),DRMP3_DQ(2047),DRMP3_DQ(4095),DRMP3_DQ(8191),DRMP3_DQ(16383),DRMP3_DQ(32767),DRMP3_DQ(65535),DRMP3_DQ(3),DRMP3_DQ(5),DRMP3_DQ(9)
581 for (i = 0; i < bands; i++)
585 int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
586 for (
m = 4;
m;
m >>= 1)
590 int b = drmp3_bs_get_bits(bs, 6);
591 s = g_deq_L12[ba*3 - 6 +
b % 3]*(1 << 21 >>
b/3);
598 static void drmp3_L12_read_scale_info(
const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci)
601 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
602 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
603 0,17,18, 3,19,4,5,16,
605 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
606 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
607 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
609 const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci);
611 int i, k = 0, ba_bits = 0;
612 const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab;
614 for (i = 0; i < sci->total_bands; i++)
619 k += subband_alloc->band_count;
620 ba_bits = subband_alloc->code_tab_width;
621 ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
624 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
625 sci->bitalloc[2*i] = ba;
626 if (i < sci->stereo_bands)
628 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
630 sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
633 for (i = 0; i < 2*sci->total_bands; i++)
635 sci->scfcod[i] = (
drmp3_uint8)(sci->bitalloc[i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6);
638 drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
640 for (i = sci->stereo_bands; i < sci->total_bands; i++)
642 sci->bitalloc[2*i + 1] = 0;
646 static int drmp3_L12_dequantize_granule(
float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci,
int group_size)
648 int i,
j, k, choff = 576;
649 for (
j = 0;
j < 4;
j++)
651 float *
dst = grbuf + group_size*
j;
652 for (i = 0; i < 2*sci->total_bands; i++)
654 int ba = sci->bitalloc[i];
659 int half = (1 << (ba - 1)) - 1;
660 for (k = 0; k < group_size; k++)
662 dst[k] = (float)((
int)drmp3_bs_get_bits(bs, ba) - half);
666 unsigned mod = (2 << (ba - 17)) + 1;
667 unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3));
668 for (k = 0; k < group_size; k++,
code /= mod)
670 dst[k] = (float)((
int)(
code % mod - mod/2));
681 static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci,
const float *scf,
float *
dst)
684 memcpy(
dst + 576 + sci->stereo_bands*18,
dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*
sizeof(
float));
685 for (i = 0; i < sci->total_bands; i++,
dst += 18, scf += 6)
687 for (k = 0; k < 12; k++)
689 dst[k + 0] *= scf[0];
690 dst[k + 576] *= scf[3];
696 static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr,
const drmp3_uint8 *hdr)
699 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
700 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
701 { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
702 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
703 { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
704 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
705 { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
706 { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
707 { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
710 { 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 },
711 { 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 },
712 { 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 },
713 { 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 },
714 { 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 },
715 { 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 },
716 { 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 },
717 { 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 },
718 { 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 }
721 { 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 },
722 { 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 },
723 { 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 },
724 { 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 },
725 { 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 },
726 { 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 },
727 { 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 },
728 { 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 },
729 { 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 }
732 unsigned tables, scfsi = 0;
733 int main_data_begin, part_23_sum = 0;
734 int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr);
735 int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
737 if (DRMP3_HDR_TEST_MPEG1(hdr))
740 main_data_begin = drmp3_bs_get_bits(bs, 9);
741 scfsi = drmp3_bs_get_bits(bs, 7 + gr_count);
744 main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;
749 if (DRMP3_HDR_IS_MONO(hdr))
753 gr->part_23_length = (
drmp3_uint16)drmp3_bs_get_bits(bs, 12);
754 part_23_sum += gr->part_23_length;
755 gr->big_values = (
drmp3_uint16)drmp3_bs_get_bits(bs, 9);
756 if (gr->big_values > 288)
760 gr->global_gain = (
drmp3_uint8)drmp3_bs_get_bits(bs, 8);
761 gr->scalefac_compress = (
drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);
762 gr->sfbtab = g_scf_long[sr_idx];
765 if (drmp3_bs_get_bits(bs, 1))
767 gr->block_type = (
drmp3_uint8)drmp3_bs_get_bits(bs, 2);
772 gr->mixed_block_flag = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
773 gr->region_count[0] = 7;
774 gr->region_count[1] = 255;
775 if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE)
778 if (!gr->mixed_block_flag)
780 gr->region_count[0] = 8;
781 gr->sfbtab = g_scf_short[sr_idx];
783 gr->n_short_sfb = 39;
786 gr->sfbtab = g_scf_mixed[sr_idx];
787 gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;
788 gr->n_short_sfb = 30;
791 tables = drmp3_bs_get_bits(bs, 10);
793 gr->subblock_gain[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
794 gr->subblock_gain[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
795 gr->subblock_gain[2] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
799 gr->mixed_block_flag = 0;
800 tables = drmp3_bs_get_bits(bs, 15);
801 gr->region_count[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 4);
802 gr->region_count[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
803 gr->region_count[2] = 255;
806 gr->table_select[1] = (
drmp3_uint8)((tables >> 5) & 31);
807 gr->table_select[2] = (
drmp3_uint8)((tables) & 31);
808 gr->preflag = (
drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));
809 gr->scalefac_scale = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
810 gr->count1_table = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
816 if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
821 return main_data_begin;
827 for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
829 int cnt = scf_count[i];
832 memcpy(scf, ist_pos, cnt);
835 int bits = scf_size[i];
842 int max_scf = (scfsi < 0) ? (1 <<
bits) - 1 : -1;
843 for (k = 0; k < cnt; k++)
845 int s = drmp3_bs_get_bits(bitbuf,
bits);
854 scf[0] = scf[1] = scf[2] = 0;
857 static float drmp3_L3_ldexp_q2(
float y,
int exp_q2)
859 static const float g_expfrac[4] = { 9.31322575e-10
f,7.83145814e-10
f,6.58544508e-10
f,5.53767716e-10
f };
863 e = DRMP3_MIN(30*4, exp_q2);
864 y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
865 }
while ((exp_q2 -= e) > 0);
869 static void drmp3_L3_decode_scalefactors(
const drmp3_uint8 *hdr,
drmp3_uint8 *ist_pos, drmp3_bs *bs,
const drmp3_L3_gr_info *gr,
float *scf,
int ch)
871 static const drmp3_uint8 g_scf_partitions[3][28] = {
872 { 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 },
873 { 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 },
874 { 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 }
876 const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
878 int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
881 if (DRMP3_HDR_TEST_MPEG1(hdr))
883 static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
884 int part = g_scfc_decode[gr->scalefac_compress];
885 scf_size[1] = scf_size[0] = (
drmp3_uint8)(part >> 2);
886 scf_size[3] = scf_size[2] = (
drmp3_uint8)(part & 3);
889 static const drmp3_uint8 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 };
890 int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch;
891 sfc = gr->scalefac_compress >> ist;
892 for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
894 for (modprod = 1, i = 3; i >= 0; i--)
896 scf_size[i] = (
drmp3_uint8)(sfc / modprod % g_mod[k + i]);
897 modprod *= g_mod[k + i];
903 drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
907 int sh = 3 - scf_shift;
908 for (i = 0; i < gr->n_short_sfb; i += 3)
910 iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh;
911 iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh;
912 iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh;
914 }
else if (gr->preflag)
916 static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
917 for (i = 0; i < 10; i++)
919 iscf[11 + i] += g_preamp[i];
923 gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);
924 gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4), DRMP3_MAX_SCFI - gain_exp);
925 for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)
927 scf[i] = drmp3_L3_ldexp_q2(gain, iscf[i] << scf_shift);
931 static float drmp3_L3_pow_43(
int x)
933 static const float g_pow43[129] = {
934 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
937 int sign, mult = 256;
951 frac = (float)((
x & 63) -
sign) / ((
x & ~63) +
sign);
952 return g_pow43[(
x +
sign) >> 6]*(1.
f + frac*((4.
f/3) + frac*(2.f/9)))*mult;
955 static void drmp3_L3_huffman(
float *
dst, drmp3_bs *bs,
const drmp3_L3_gr_info *gr_info,
const float *scf,
int layer3gr_limit)
957 static const float g_pow43_signed[32] = { 0,0,1,-1,2.519842f,-2.519842f,4.326749f,-4.326749f,6.349604f,-6.349604f,8.549880f,-8.549880f,10.902724f,-10.902724f,13.390518f,-13.390518f,16.000000f,-16.000000f,18.720754f,-18.720754f,21.544347f,-21.544347f,24.463781f,-24.463781f,27.473142f,-27.473142f,30.567351f,-30.567351f,33.741992f,-33.741992f,36.993181f,-36.993181f };
959 static const drmp3_int16 tab1[] = { 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 };
960 static const drmp3_int16 tab2[] = { -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 };
961 static const drmp3_int16 tab3[] = { -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 };
962 static const drmp3_int16 tab5[] = { -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 };
963 static const drmp3_int16 tab6[] = { -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 };
964 static const drmp3_int16 tab7[] = { -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 };
965 static const drmp3_int16 tab8[] = { -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 };
966 static const drmp3_int16 tab9[] = { -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 };
967 static const drmp3_int16 tab10[] = { -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 };
968 static const drmp3_int16 tab11[] = { -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 };
969 static const drmp3_int16 tab12[] = { -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 };
970 static const drmp3_int16 tab13[] = { -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 };
971 static const drmp3_int16 tab15[] = { -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 };
972 static const drmp3_int16 tab16[] = { -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 };
973 static const drmp3_int16 tab24[] = { -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 };
974 static const drmp3_uint8 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};
975 static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
976 static const drmp3_int16 *
const tabindex[2*16] = { tab0,tab1,tab2,tab3,tab0,tab5,tab6,tab7,tab8,tab9,tab10,tab11,tab12,tab13,tab0,tab15,tab16,tab16,tab16,tab16,tab16,tab16,tab16,tab16,tab24,tab24,tab24,tab24,tab24,tab24,tab24,tab24 };
977 static const drmp3_uint8 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 };
979 #define DRMP3_PEEK_BITS(n) (bs_cache >> (32 - n)) 980 #define DRMP3_FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); } 981 #define DRMP3_CHECK_BITS while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } 982 #define DRMP3_BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh) 985 int ireg = 0, big_val_cnt = gr_info->big_values;
987 const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8;
988 drmp3_uint32 bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7);
989 int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
992 while (big_val_cnt > 0)
994 int tab_num = gr_info->table_select[ireg];
995 int sfb_cnt = gr_info->region_count[ireg++];
996 const short *codebook = tabindex[tab_num];
997 int linbits = g_linbits[tab_num];
1001 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1006 int leaf = codebook[DRMP3_PEEK_BITS(
w)];
1009 DRMP3_FLUSH_BITS(
w);
1011 leaf = codebook[DRMP3_PEEK_BITS(
w) - (leaf >> 3)];
1013 DRMP3_FLUSH_BITS(leaf >> 8);
1017 int lsb = leaf & 0x0F;
1018 if (lsb == 15 && linbits)
1020 lsb += DRMP3_PEEK_BITS(linbits);
1021 DRMP3_FLUSH_BITS(linbits);
1023 *
dst = one*drmp3_L3_pow_43(lsb)*((
int32_t)bs_cache < 0 ? -1: 1);
1026 *
dst = g_pow43_signed[lsb*2 + (bs_cache >> 31)]*one;
1028 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1031 }
while (--pairs_to_decode);
1032 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1035 for (np = 1 - big_val_cnt;;
dst += 4)
1037 const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
1038 int leaf = codebook_count1[DRMP3_PEEK_BITS(4)];
1041 leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
1043 DRMP3_FLUSH_BITS(leaf & 7);
1044 if (DRMP3_BSPOS > layer3gr_limit)
1048 #define DRMP3_RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } 1049 #define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) } 1050 DRMP3_RELOAD_SCALEFACTOR;
1051 DRMP3_DEQ_COUNT1(0);
1052 DRMP3_DEQ_COUNT1(1);
1053 DRMP3_RELOAD_SCALEFACTOR;
1054 DRMP3_DEQ_COUNT1(2);
1055 DRMP3_DEQ_COUNT1(3);
1059 bs->pos = layer3gr_limit;
1062 static void drmp3_L3_midside_stereo(
float *
left,
int n)
1067 if (drmp3_have_simd())
for (; i <
n - 3; i += 4)
1069 drmp3_f4 vl = DRMP3_VLD(
left + i);
1070 drmp3_f4 vr = DRMP3_VLD(
right + i);
1071 DRMP3_VSTORE(
left + i, DRMP3_VADD(vl, vr));
1072 DRMP3_VSTORE(
right + i, DRMP3_VSUB(vl, vr));
1084 static void drmp3_L3_intensity_stereo_band(
float *
left,
int n,
float kl,
float kr)
1087 for (i = 0; i <
n; i++)
1094 static void drmp3_L3_stereo_top_band(
const float *
right,
const drmp3_uint8 *sfb,
int nbands,
int max_band[3])
1098 max_band[0] = max_band[1] = max_band[2] = -1;
1100 for (i = 0; i < nbands; i++)
1102 for (k = 0; k < sfb[i]; k += 2)
1106 max_band[i % 3] = i;
1116 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 };
1117 unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;
1119 for (i = 0; sfb[i]; i++)
1121 unsigned ipos = ist_pos[i];
1122 if ((
int)i > max_band[i % 3] && ipos < max_pos)
1124 float kl, kr,
s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
1125 if (DRMP3_HDR_TEST_MPEG1(hdr))
1128 kr = g_pan[2*ipos + 1];
1132 kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
1139 drmp3_L3_intensity_stereo_band(
left, sfb[i], kl*
s, kr*
s);
1140 }
else if (DRMP3_HDR_TEST_MS_STEREO(hdr))
1142 drmp3_L3_midside_stereo(
left, sfb[i]);
1150 int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
1151 int i, max_blocks = gr->n_short_sfb ? 3 : 1;
1153 drmp3_L3_stereo_top_band(
left + 576, gr->sfbtab, n_sfb, max_band);
1156 max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]);
1158 for (i = 0; i < max_blocks; i++)
1160 int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;
1161 int itop = n_sfb - max_blocks + i;
1162 int prev = itop - max_blocks;
1163 ist_pos[itop] = (
drmp3_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]);
1165 drmp3_L3_stereo_process(
left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress&1);
1168 static void drmp3_L3_reorder(
float *grbuf,
float *scratch,
const drmp3_uint8 *sfb)
1171 float *
src = grbuf, *
dst = scratch;
1173 for (;0 != (
len = *sfb); sfb += 3,
src += 2*
len)
1175 for (i = 0; i <
len; i++,
src++)
1182 memcpy(grbuf, scratch, (
dst - scratch)*
sizeof(
float));
1185 static void drmp3_L3_antialias(
float *grbuf,
int nbands)
1187 static const float g_aa[2][8] = {
1188 {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
1189 {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
1192 for (; nbands > 0; nbands--, grbuf += 18)
1196 if (drmp3_have_simd())
for (; i < 8; i += 4)
1198 drmp3_f4 vu = DRMP3_VLD(grbuf + 18 + i);
1199 drmp3_f4 vd = DRMP3_VLD(grbuf + 14 - i);
1200 drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] + i);
1201 drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] + i);
1202 vd = DRMP3_VREV(vd);
1203 DRMP3_VSTORE(grbuf + 18 + i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1)));
1204 vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0));
1205 DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vd));
1208 #ifndef DR_MP3_ONLY_SIMD 1211 float u = grbuf[18 + i];
1212 float d = grbuf[17 - i];
1213 grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];
1214 grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];
1220 static void drmp3_L3_dct3_9(
float *
y)
1222 float s0, s1, s2, s3, s4, s5, s6, s7,
s8, t0, t2, t4;
1224 s0 =
y[0]; s2 =
y[2]; s4 =
y[4]; s6 =
y[6];
s8 =
y[8];
1227 t4 = (s4 + s2)*0.93969262
f;
1228 t2 = (
s8 + s2)*0.76604444
f;
1229 s6 = (s4 -
s8)*0.17364818
f;
1238 s1 =
y[1]; s3 =
y[3]; s5 =
y[5]; s7 =
y[7];
1241 t0 = (s5 + s1)*0.98480775
f;
1242 t4 = (s5 - s7)*0.34202014
f;
1243 t2 = (s1 + s7)*0.64278761
f;
1244 s1 = (s1 - s5 - s7)*0.86602540
f;
1260 static void drmp3_L3_imdct36(
float *grbuf,
float *overlap,
const float *
window,
int nbands)
1263 static const float g_twid9[18] = {
1264 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
1267 for (
j = 0;
j < nbands;
j++, grbuf += 18, overlap += 9)
1272 for (i = 0; i < 4; i++)
1274 si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2];
1275 co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2];
1276 si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3];
1277 co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);
1279 drmp3_L3_dct3_9(co);
1280 drmp3_L3_dct3_9(si);
1290 if (drmp3_have_simd())
for (; i < 8; i += 4)
1292 drmp3_f4 vovl = DRMP3_VLD(overlap + i);
1293 drmp3_f4 vc = DRMP3_VLD(co + i);
1294 drmp3_f4 vs = DRMP3_VLD(si + i);
1295 drmp3_f4 vr0 = DRMP3_VLD(g_twid9 + i);
1296 drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 + i);
1297 drmp3_f4 vw0 = DRMP3_VLD(
window + i);
1298 drmp3_f4 vw1 = DRMP3_VLD(
window + 9 + i);
1299 drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0));
1300 DRMP3_VSTORE(overlap + i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1)));
1301 DRMP3_VSTORE(grbuf + i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1)));
1302 vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0));
1303 DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vsum));
1308 float ovl = overlap[i];
1309 float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];
1310 overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];
1317 static void drmp3_L3_idct3(
float x0,
float x1,
float x2,
float *
dst)
1319 float m1 = x1*0.86602540f;
1320 float a1 = x0 -
x2*0.5f;
1326 static void drmp3_L3_imdct12(
float *
x,
float *
dst,
float *overlap)
1328 static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
1332 drmp3_L3_idct3(-
x[0],
x[6] +
x[3],
x[12] +
x[9], co);
1333 drmp3_L3_idct3(
x[15],
x[12] -
x[9],
x[6] -
x[3], si);
1336 for (i = 0; i < 3; i++)
1338 float ovl = overlap[i];
1339 float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];
1340 overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];
1341 dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];
1342 dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];
1346 static void drmp3_L3_imdct_short(
float *grbuf,
float *overlap,
int nbands)
1348 for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
1351 memcpy(tmp, grbuf,
sizeof(tmp));
1352 memcpy(grbuf, overlap, 6*
sizeof(
float));
1353 drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
1354 drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
1355 drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
1359 static void drmp3_L3_change_sign(
float *grbuf)
1362 for (
b = 0, grbuf += 18;
b < 32;
b += 2, grbuf += 36)
1363 for (i = 1; i < 18; i += 2)
1364 grbuf[i] = -grbuf[i];
1367 static void drmp3_L3_imdct_gr(
float *grbuf,
float *overlap,
unsigned block_type,
unsigned n_long_bands)
1369 static const float g_mdct_window[2][18] = {
1370 { 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 },
1371 { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
1375 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
1376 grbuf += 18*n_long_bands;
1377 overlap += 9*n_long_bands;
1379 if (block_type == DRMP3_SHORT_BLOCK_TYPE)
1380 drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
1382 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands);
1385 static void drmp3_L3_save_reservoir(
drmp3dec *
h, drmp3dec_scratch *
s)
1387 int pos = (
s->bs.pos + 7)/8u;
1388 int remains =
s->bs.limit/8u - pos;
1389 if (remains > DRMP3_MAX_BITRESERVOIR_BYTES)
1391 pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES;
1392 remains = DRMP3_MAX_BITRESERVOIR_BYTES;
1396 memmove(
h->reserv_buf,
s->maindata + pos, remains);
1398 h->reserv = remains;
1401 static int drmp3_L3_restore_reservoir(
drmp3dec *
h, drmp3_bs *bs, drmp3dec_scratch *
s,
int main_data_begin)
1403 int frame_bytes = (bs->limit - bs->pos)/8;
1404 int bytes_have = DRMP3_MIN(
h->reserv, main_data_begin);
1405 memcpy(
s->maindata,
h->reserv_buf + DRMP3_MAX(0,
h->reserv - main_data_begin), DRMP3_MIN(
h->reserv, main_data_begin));
1406 memcpy(
s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
1407 drmp3_bs_init(&
s->bs,
s->maindata, bytes_have + frame_bytes);
1408 return h->reserv >= main_data_begin;
1411 static void drmp3_L3_decode(
drmp3dec *
h, drmp3dec_scratch *
s, drmp3_L3_gr_info *gr_info,
int nch)
1415 for (ch = 0; ch < nch; ch++)
1417 int layer3gr_limit =
s->bs.pos + gr_info[ch].part_23_length;
1418 drmp3_L3_decode_scalefactors(
h->header,
s->ist_pos[ch], &
s->bs, gr_info + ch,
s->scf, ch);
1419 drmp3_L3_huffman(
s->grbuf[ch], &
s->bs, gr_info + ch,
s->scf, layer3gr_limit);
1422 if (DRMP3_HDR_TEST_I_STEREO(
h->header))
1424 drmp3_L3_intensity_stereo(
s->grbuf[0],
s->ist_pos[1], gr_info,
h->header);
1425 }
else if (DRMP3_HDR_IS_MS_STEREO(
h->header))
1427 drmp3_L3_midside_stereo(
s->grbuf[0], 576);
1430 for (ch = 0; ch < nch; ch++, gr_info++)
1433 int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (
int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(
h->header) == 2);
1435 if (gr_info->n_short_sfb)
1437 aa_bands = n_long_bands - 1;
1438 drmp3_L3_reorder(
s->grbuf[ch] + n_long_bands*18,
s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
1441 drmp3_L3_antialias(
s->grbuf[ch], aa_bands);
1442 drmp3_L3_imdct_gr(
s->grbuf[ch],
h->mdct_overlap[ch], gr_info->block_type, n_long_bands);
1443 drmp3_L3_change_sign(
s->grbuf[ch]);
1447 static void drmp3d_DCT_II(
float *grbuf,
int n)
1449 static const float g_sec[24] = {
1450 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
1454 if (drmp3_have_simd())
for (; k <
n; k += 4)
1456 drmp3_f4
t[4][8], *
x;
1457 float *
y = grbuf + k;
1459 for (
x =
t[0], i = 0; i < 8; i++,
x++)
1461 drmp3_f4 x0 = DRMP3_VLD(&
y[i*18]);
1462 drmp3_f4 x1 = DRMP3_VLD(&
y[(15 - i)*18]);
1463 drmp3_f4
x2 = DRMP3_VLD(&
y[(16 + i)*18]);
1464 drmp3_f4 x3 = DRMP3_VLD(&
y[(31 - i)*18]);
1465 drmp3_f4 t0 = DRMP3_VADD(x0, x3);
1466 drmp3_f4 t1 = DRMP3_VADD(x1,
x2);
1467 drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1,
x2), g_sec[3*i + 0]);
1468 drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*i + 1]);
1469 x[0] = DRMP3_VADD(t0, t1);
1470 x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*i + 2]);
1471 x[16] = DRMP3_VADD(t3, t2);
1472 x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*i + 2]);
1474 for (
x =
t[0], i = 0; i < 4; i++,
x += 8)
1476 drmp3_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;
1477 xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7);
1478 x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6);
1479 x6 = DRMP3_VSUB(
x2, x5);
x2 = DRMP3_VADD(
x2, x5);
1480 x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4);
1481 x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3);
1482 x3 = DRMP3_VSUB(x1,
x2); x1 = DRMP3_VADD(x1,
x2);
1483 x[0] = DRMP3_VADD(x0, x1);
1484 x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677
f);
1485 x5 = DRMP3_VADD(x5, x6);
1486 x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677
f);
1487 x7 = DRMP3_VADD(x7, xt);
1488 x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677
f);
1489 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367
f));
1490 x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432
f));
1491 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367
f));
1492 x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6);
1493 x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561
f);
1494 x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611
f);
1495 x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488
f);
1496 x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619
f);
1497 x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302
f);
1498 x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556
f);
1504 #define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v) 1506 #define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v)) 1508 for (i = 0; i < 7; i++,
y += 4*18)
1510 drmp3_f4
s = DRMP3_VADD(
t[3][i],
t[3][i + 1]);
1511 DRMP3_VSAVE2(0,
t[0][i]);
1512 DRMP3_VSAVE2(1, DRMP3_VADD(
t[2][i],
s));
1513 DRMP3_VSAVE2(2, DRMP3_VADD(
t[1][i],
t[1][i + 1]));
1514 DRMP3_VSAVE2(3, DRMP3_VADD(
t[2][1 + i],
s));
1516 DRMP3_VSAVE2(0,
t[0][7]);
1517 DRMP3_VSAVE2(1, DRMP3_VADD(
t[2][7],
t[3][7]));
1518 DRMP3_VSAVE2(2,
t[1][7]);
1519 DRMP3_VSAVE2(3,
t[3][7]);
1522 #define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v) 1523 for (i = 0; i < 7; i++,
y += 4*18)
1525 drmp3_f4
s = DRMP3_VADD(
t[3][i],
t[3][i + 1]);
1526 DRMP3_VSAVE4(0,
t[0][i]);
1527 DRMP3_VSAVE4(1, DRMP3_VADD(
t[2][i],
s));
1528 DRMP3_VSAVE4(2, DRMP3_VADD(
t[1][i],
t[1][i + 1]));
1529 DRMP3_VSAVE4(3, DRMP3_VADD(
t[2][1 + i],
s));
1531 DRMP3_VSAVE4(0,
t[0][7]);
1532 DRMP3_VSAVE4(1, DRMP3_VADD(
t[2][7],
t[3][7]));
1533 DRMP3_VSAVE4(2,
t[1][7]);
1534 DRMP3_VSAVE4(3,
t[3][7]);
1538 #ifdef DR_MP3_ONLY_SIMD 1543 float t[4][8], *
x, *
y = grbuf + k;
1545 for (
x =
t[0], i = 0; i < 8; i++,
x++)
1548 float x1 =
y[(15 - i)*18];
1549 float x2 =
y[(16 + i)*18];
1550 float x3 =
y[(31 - i)*18];
1553 float t2 = (x1 -
x2)*g_sec[3*i + 0];
1554 float t3 = (x0 - x3)*g_sec[3*i + 1];
1556 x[8] = (t0 - t1)*g_sec[3*i + 2];
1558 x[24] = (t3 - t2)*g_sec[3*i + 2];
1560 for (
x =
t[0], i = 0; i < 4; i++,
x += 8)
1562 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;
1563 xt = x0 - x7; x0 += x7;
1564 x7 = x1 - x6; x1 += x6;
1565 x6 =
x2 - x5;
x2 += x5;
1566 x5 = x3 - x4; x3 += x4;
1567 x4 = x0 - x3; x0 += x3;
1568 x3 = x1 -
x2; x1 +=
x2;
1570 x[4] = (x0 - x1)*0.70710677
f;
1572 x6 = (x6 + x7)*0.70710677
f;
1574 x3 = (x3 + x4)*0.70710677
f;
1575 x5 -= x7*0.198912367f;
1576 x7 += x5*0.382683432f;
1577 x5 -= x7*0.198912367f;
1578 x0 = xt - x6; xt += x6;
1579 x[1] = (xt + x7)*0.50979561
f;
1580 x[2] = (x4 + x3)*0.54119611
f;
1581 x[3] = (x0 - x5)*0.60134488
f;
1582 x[5] = (x0 + x5)*0.89997619
f;
1583 x[6] = (x4 - x3)*1.30656302
f;
1584 x[7] = (xt - x7)*2.56291556
f;
1587 for (i = 0; i < 7; i++,
y += 4*18)
1590 y[1*18] =
t[2][i] +
t[3][i] +
t[3][i + 1];
1591 y[2*18] =
t[1][i] +
t[1][i + 1];
1592 y[3*18] =
t[2][i + 1] +
t[3][i] +
t[3][i + 1];
1595 y[1*18] =
t[2][7] +
t[3][7];
1602 static short drmp3d_scale_pcm(
float sample)
1605 if (
sample > 32767.0)
return (
short) 32767;
1606 if (
sample < -32768.0)
return (
short)-32768;
1609 if (
s > 32767)
return (
short) 32767;
1610 if (
s < -32768)
return (
short)-32768;
1614 static void drmp3d_synth_pair(
short *
pcm,
int nch,
const float *
z)
1617 a = (
z[14*64] -
z[ 0]) * 29;
1618 a += (
z[ 1*64] +
z[13*64]) * 213;
1619 a += (
z[12*64] -
z[ 2*64]) * 459;
1620 a += (
z[ 3*64] +
z[11*64]) * 2037;
1621 a += (
z[10*64] -
z[ 4*64]) * 5153;
1622 a += (
z[ 5*64] +
z[ 9*64]) * 6574;
1623 a += (
z[ 8*64] -
z[ 6*64]) * 37489;
1624 a +=
z[ 7*64] * 75038;
1625 pcm[0] = drmp3d_scale_pcm(
a);
1629 a +=
z[12*64] * 1567;
1630 a +=
z[10*64] * 9727;
1631 a +=
z[ 8*64] * 64019;
1632 a +=
z[ 6*64] * -9975;
1633 a +=
z[ 4*64] * -45;
1634 a +=
z[ 2*64] * 146;
1636 pcm[16*nch] = drmp3d_scale_pcm(
a);
1639 static void drmp3d_synth(
float *xl,
short *dstl,
int nch,
float *lins)
1642 float *xr = xl + 576*(nch - 1);
1643 short *dstr = dstl + (nch - 1);
1645 static const float g_win[] = {
1646 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
1647 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
1648 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
1649 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
1650 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
1651 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
1652 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
1653 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
1654 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
1655 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
1656 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
1657 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
1658 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
1659 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
1660 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
1662 float *zlin = lins + 15*64;
1663 const float *
w = g_win;
1665 zlin[4*15] = xl[18*16];
1666 zlin[4*15 + 1] = xr[18*16];
1667 zlin[4*15 + 2] = xl[0];
1668 zlin[4*15 + 3] = xr[0];
1670 zlin[4*31] = xl[1 + 18*16];
1671 zlin[4*31 + 1] = xr[1 + 18*16];
1672 zlin[4*31 + 2] = xl[1];
1673 zlin[4*31 + 3] = xr[1];
1675 drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
1676 drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
1677 drmp3d_synth_pair(dstl, nch, lins + 4*15);
1678 drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
1681 if (drmp3_have_simd())
for (i = 14; i >= 0; i--)
1683 #define DRMP3_VLOAD(k) drmp3_f4 w0 = DRMP3_VSET(*w++); drmp3_f4 w1 = DRMP3_VSET(*w++); drmp3_f4 vz = DRMP3_VLD(&zlin[4*i - 64*k]); drmp3_f4 vy = DRMP3_VLD(&zlin[4*i - 64*(15 - k)]); 1684 #define DRMP3_V0(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0)) ; a = DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1)); } 1685 #define DRMP3_V1(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1))); } 1686 #define DRMP3_V2(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vy, w1), DRMP3_VMUL(vz, w0))); } 1688 zlin[4*i] = xl[18*(31 - i)];
1689 zlin[4*i + 1] = xr[18*(31 - i)];
1690 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
1691 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
1692 zlin[4*i + 64] = xl[1 + 18*(1 + i)];
1693 zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];
1694 zlin[4*i - 64 + 2] = xl[18*(1 + i)];
1695 zlin[4*i - 64 + 3] = xr[18*(1 + i)];
1697 DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7)
1701 static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
1702 static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
1703 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(
a, g_max), g_min)),
1704 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(
b, g_max), g_min)));
1705 dstr[(15 - i)*nch] = (
short)_mm_extract_epi16(pcm8, 1);
1706 dstr[(17 + i)*nch] = (
short)_mm_extract_epi16(pcm8, 5);
1707 dstl[(15 - i)*nch] = (
short)_mm_extract_epi16(pcm8, 0);
1708 dstl[(17 + i)*nch] = (
short)_mm_extract_epi16(pcm8, 4);
1709 dstr[(47 - i)*nch] = (
short)_mm_extract_epi16(pcm8, 3);
1710 dstr[(49 + i)*nch] = (
short)_mm_extract_epi16(pcm8, 7);
1711 dstl[(47 - i)*nch] = (
short)_mm_extract_epi16(pcm8, 2);
1712 dstl[(49 + i)*nch] = (
short)_mm_extract_epi16(pcm8, 6);
1714 int16x4_t pcma, pcmb;
1715 a = DRMP3_VADD(
a, DRMP3_VSET(0.5
f));
1716 b = DRMP3_VADD(
b, DRMP3_VSET(0.5
f));
1717 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(
a), vreinterpretq_s32_u32(vcltq_f32(
a, DRMP3_VSET(0)))));
1718 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(
b), vreinterpretq_s32_u32(vcltq_f32(
b, DRMP3_VSET(0)))));
1719 vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);
1720 vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);
1721 vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);
1722 vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);
1723 vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);
1724 vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);
1725 vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);
1726 vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);
1731 #ifdef DR_MP3_ONLY_SIMD 1734 for (i = 14; i >= 0; i--)
1736 #define DRMP3_LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64]; 1737 #define DRMP3_S0(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } 1738 #define DRMP3_S1(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } 1739 #define DRMP3_S2(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } 1742 zlin[4*i] = xl[18*(31 - i)];
1743 zlin[4*i + 1] = xr[18*(31 - i)];
1744 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
1745 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
1746 zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
1747 zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
1748 zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
1749 zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
1751 DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7)
1753 dstr[(15 - i)*nch] = drmp3d_scale_pcm(
a[1]);
1754 dstr[(17 + i)*nch] = drmp3d_scale_pcm(
b[1]);
1755 dstl[(15 - i)*nch] = drmp3d_scale_pcm(
a[0]);
1756 dstl[(17 + i)*nch] = drmp3d_scale_pcm(
b[0]);
1757 dstr[(47 - i)*nch] = drmp3d_scale_pcm(
a[3]);
1758 dstr[(49 + i)*nch] = drmp3d_scale_pcm(
b[3]);
1759 dstl[(47 - i)*nch] = drmp3d_scale_pcm(
a[2]);
1760 dstl[(49 + i)*nch] = drmp3d_scale_pcm(
b[2]);
1765 static void drmp3d_synth_granule(
float *qmf_state,
float *grbuf,
int nbands,
int nch,
short *
pcm,
float *lins)
1768 for (i = 0; i < nch; i++)
1770 drmp3d_DCT_II(grbuf + 576*i, nbands);
1773 memcpy(lins, qmf_state,
sizeof(
float)*15*64);
1775 for (i = 0; i < nbands; i += 2)
1777 drmp3d_synth(grbuf + i,
pcm + 32*nch*i, nch, lins + i*64);
1779 #ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL 1782 for (i = 0; i < 15*64; i += 2)
1784 qmf_state[i] = lins[nbands*64 + i];
1789 memcpy(qmf_state, lins + nbands*64,
sizeof(
float)*15*64);
1793 static int drmp3d_match_frame(
const drmp3_uint8 *hdr,
int mp3_bytes,
int frame_bytes)
1796 for (i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++)
1798 i += drmp3_hdr_frame_bytes(hdr + i, frame_bytes) + drmp3_hdr_padding(hdr + i);
1799 if (i + DRMP3_HDR_SIZE > mp3_bytes)
1801 if (!drmp3_hdr_compare(hdr, hdr + i))
1807 static int drmp3d_find_frame(
const drmp3_uint8 *mp3,
int mp3_bytes,
int *free_format_bytes,
int *ptr_frame_bytes)
1810 for (i = 0; i < mp3_bytes - DRMP3_HDR_SIZE; i++, mp3++)
1812 if (drmp3_hdr_valid(mp3))
1814 int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes);
1815 int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3);
1817 for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++)
1819 if (drmp3_hdr_compare(mp3, mp3 + k))
1821 int fb = k - drmp3_hdr_padding(mp3);
1822 int nextfb = fb + drmp3_hdr_padding(mp3 + k);
1823 if (i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb))
1825 frame_and_padding = k;
1827 *free_format_bytes = fb;
1831 if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&
1832 drmp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||
1833 (!i && frame_and_padding == mp3_bytes))
1835 *ptr_frame_bytes = frame_and_padding;
1838 *free_format_bytes = 0;
1841 *ptr_frame_bytes = 0;
1854 drmp3_bs bs_frame[1];
1855 drmp3dec_scratch scratch;
1857 if (mp3_bytes > 4 && dec->
header[0] == 0xff && drmp3_hdr_compare(dec->
header, mp3))
1871 info->frame_bytes = i;
1879 info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
1880 info->hz = drmp3_hdr_sample_rate_hz(hdr);
1881 info->layer = 4 - DRMP3_HDR_GET_LAYER(hdr);
1882 info->bitrate_kbps = drmp3_hdr_bitrate_kbps(hdr);
1884 drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE,
frame_size - DRMP3_HDR_SIZE);
1885 if (DRMP3_HDR_IS_CRC(hdr))
1887 drmp3_bs_get_bits(bs_frame, 16);
1890 if (
info->layer == 3)
1892 int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);
1893 if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
1898 success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
1901 for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++,
pcm += 576*
info->channels)
1903 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
1904 drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*
info->channels,
info->channels);
1905 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 18,
info->channels,
pcm, scratch.syn[0]);
1908 drmp3_L3_save_reservoir(dec, &scratch);
1911 #ifdef DR_MP3_ONLY_MP3 1914 drmp3_L12_scale_info sci[1];
1915 drmp3_L12_read_scale_info(hdr, bs_frame, sci);
1917 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
1918 for (i = 0, igr = 0; igr < 3; igr++)
1920 if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci,
info->layer | 1)))
1923 drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
1924 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 12,
info->channels,
pcm, scratch.syn[0]);
1925 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
1928 if (bs_frame->pos > bs_frame->limit)
1949 #ifndef DR_MP3_DEFAULT_CHANNELS 1950 #define DR_MP3_DEFAULT_CHANNELS 2 1952 #ifndef DR_MP3_DEFAULT_SAMPLE_RATE 1953 #define DR_MP3_DEFAULT_SAMPLE_RATE 44100 1957 #ifndef DRMP3_ASSERT 1959 #define DRMP3_ASSERT(expression) assert(expression) 1961 #ifndef DRMP3_COPY_MEMORY 1962 #define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) 1964 #ifndef DRMP3_ZERO_MEMORY 1965 #define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) 1967 #define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p))) 1968 #ifndef DRMP3_MALLOC 1969 #define DRMP3_MALLOC(sz) malloc((sz)) 1971 #ifndef DRMP3_REALLOC 1972 #define DRMP3_REALLOC(p, sz) realloc((p), (sz)) 1975 #define DRMP3_FREE(p) free((p)) 1978 #define drmp3_assert DRMP3_ASSERT 1979 #define drmp3_copy_memory DRMP3_COPY_MEMORY 1980 #define drmp3_zero_memory DRMP3_ZERO_MEMORY 1981 #define drmp3_zero_object DRMP3_ZERO_OBJECT 1982 #define drmp3_malloc DRMP3_MALLOC 1983 #define drmp3_realloc DRMP3_REALLOC 1985 #define drmp3_countof(x) (sizeof(x) / sizeof(x[0])) 1986 #define drmp3_max(x, y) (((x) > (y)) ? (x) : (y)) 1987 #define drmp3_min(x, y) (((x) < (y)) ? (x) : (y)) 1989 #define DRMP3_DATA_CHUNK_SIZE 16384 1991 static INLINE float drmp3_mix_f32(
float x,
float y,
float a)
1993 return x*(1-
a) +
y*
a;
1996 static void drmp3_blend_f32(
float* pOut,
float* pInA,
float* pInB,
float factor,
drmp3_uint32 channels)
1999 for (i = 0; i < channels; ++i)
2000 pOut[i] = drmp3_mix_f32(pInA[i], pInB[i], factor);
2005 drmp3_assert(pSRC !=
NULL);
2006 drmp3_assert(pCache !=
NULL);
2008 pCache->
pSRC = pSRC;
2018 drmp3_assert(pCache !=
NULL);
2019 drmp3_assert(pCache->
pSRC !=
NULL);
2021 drmp3_assert(frameCount > 0);
2022 drmp3_assert(pFramesOut !=
NULL);
2026 while (frameCount > 0)
2032 if (framesToReadFromMemory > framesRemainingInMemory)
2033 framesToReadFromMemory = framesRemainingInMemory;
2038 totalFramesRead += framesToReadFromMemory;
2039 frameCount -= framesToReadFromMemory;
2040 if (frameCount == 0)
2045 drmp3_assert(frameCount > 0);
2046 pFramesOut += framesToReadFromMemory * channels;
2063 return totalFramesRead;
2073 drmp3_zero_object(pSRC);
2085 drmp3_src_cache_init(pSRC, &pSRC->
cache);
2094 if (sampleRateIn == 0)
2106 if (sampleRateOut == 0)
2116 if (pSRC ==
NULL || frameCount == 0 || pFramesOut ==
NULL)
return 0;
2135 return drmp3_src_read_frames_ex(pSRC, frameCount, pFramesOut,
DRMP3_FALSE);
2140 drmp3_assert(pSRC !=
NULL);
2141 drmp3_assert(frameCount > 0);
2142 drmp3_assert(pFramesOut !=
NULL);
2153 drmp3_assert(pSRC !=
NULL);
2154 drmp3_assert(frameCount > 0);
2155 drmp3_assert(pFramesOut !=
NULL);
2163 if (framesRead == 0)
2170 if (framesRead == 0)
2177 while (frameCount > 0)
2182 float* pPrevFrame = pSRC->
bin;
2193 for (i = 0; i < framesToReadFromClient; ++i)
2198 pPrevFrame[
j] = pNextFrame[
j];
2200 framesRead = drmp3_src_cache_read_frames(&pSRC->
cache, 1, pNextFrame);
2201 if (framesRead == 0)
2221 totalFramesRead += 1;
2224 if (!pSRC->
algo.
linear.isNextFramesLoaded && (!flush || !pSRC->
algo.
linear.isPrevFramesLoaded))
2228 return totalFramesRead;
2235 drmp3_assert(pMP3 !=
NULL);
2247 if (pMP3->
dataSize < DRMP3_DATA_CHUNK_SIZE)
2258 if (pNewData ==
NULL)
2261 pMP3->
pData = pNewData;
2281 if (samplesRead != 0)
2284 size_t leftoverDataSize = (pMP3->
dataSize - (size_t)
info.frame_bytes);
2285 for (i = 0; i < leftoverDataSize; ++i)
2307 if (pNewData ==
NULL)
2310 pMP3->
pData = pNewData;
2334 drmp3_assert(pMP3 !=
NULL);
2337 pFramesOutF = (
float*)pFramesOut;
2339 while (frameCount > 0)
2362 pFramesOutF[0] =
sample * 0.5f;
2373 totalFramesRead += 1;
2377 if (frameCount == 0)
2384 if (!drmp3_decode_next_frame(pMP3))
2388 return totalFramesRead;
2396 drmp3_assert(pMP3 !=
NULL);
2397 drmp3_assert(onRead !=
NULL);
2403 if (pConfig !=
NULL)
2406 drmp3_zero_object(&
config);
2410 pMP3->
channels = DR_MP3_DEFAULT_CHANNELS;
2418 pMP3->
sampleRate = DR_MP3_DEFAULT_SAMPLE_RATE;
2425 drmp3_zero_object(&srcConfig);
2430 if (!drmp3_src_init(&srcConfig, drmp3_read_src, pMP3, &pMP3->
src))
2434 if (!drmp3_decode_next_frame(pMP3))
2442 if (pMP3 ==
NULL || onRead ==
NULL)
2445 drmp3_zero_object(pMP3);
2446 return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pConfig);
2450 static size_t drmp3__on_read_memory(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
2452 size_t bytesRemaining;
2454 drmp3_assert(pMP3 !=
NULL);
2458 if (bytesToRead > bytesRemaining)
2459 bytesToRead = bytesRemaining;
2461 if (bytesToRead > 0)
2473 drmp3_assert(pMP3 !=
NULL);
2505 drmp3_zero_object(pMP3);
2514 return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pConfig);
2518 #ifndef DR_MP3_NO_STDIO 2521 static size_t drmp3__on_read_stdio(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
2523 return fread(pBufferOut, 1, bytesToRead, (
FILE*)pUserData);
2534 #if defined(_MSC_VER) && _MSC_VER >= 1400 2535 if (
fopen_s(&pFile, filePath,
"rb") != 0)
2538 pFile =
fopen(filePath,
"rb");
2543 return drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (
void*)pFile, pConfig);
2549 if (pMP3 ==
NULL)
return;
2551 #ifndef DR_MP3_NO_STDIO 2552 if (pMP3->
onRead == drmp3__on_read_stdio)
2564 if (pBufferOut ==
NULL)
2567 while (framesToRead > 0)
2571 if (framesToReadRightNow > framesToRead)
2572 framesToReadRightNow = framesToRead;
2574 framesJustRead =
drmp3_read_f32(pMP3, framesToReadRightNow, temp);
2575 if (framesJustRead == 0)
2578 framesToRead -= framesJustRead;
2579 totalFramesRead += framesJustRead;
2582 totalFramesRead = drmp3_src_read_frames_ex(&pMP3->
src, framesToRead, pBufferOut,
DRMP3_TRUE);
2585 return totalFramesRead;
2608 if (framesRead != frameIndex)
2620 float* pFrames =
NULL;
2624 drmp3_assert(pMP3 !=
NULL);
2630 if (framesJustRead == 0)
2634 if (framesCapacity < totalFramesRead + framesJustRead)
2639 framesCapacity *= 2;
2640 if (framesCapacity < totalFramesRead + framesJustRead)
2641 framesCapacity = totalFramesRead + framesJustRead;
2643 newFramesBufferSize = framesCapacity*pMP3->
channels*
sizeof(float);
2644 if (newFramesBufferSize >
SIZE_MAX)
2647 pNewFrames = (
float*)drmp3_realloc(pFrames, (
size_t)newFramesBufferSize);
2648 if (pNewFrames ==
NULL)
2654 pFrames = pNewFrames;
2657 drmp3_copy_memory(pFrames + totalFramesRead*pMP3->
channels, temp, (
size_t)(framesJustRead*pMP3->
channels*
sizeof(
float)));
2658 totalFramesRead += framesJustRead;
2661 if (framesJustRead != framesToReadRightNow)
2665 if (pConfig !=
NULL)
2673 if (pTotalFrameCount) *pTotalFrameCount = totalFramesRead;
2680 if (!
drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig))
2683 return drmp3__full_decode_and_close_f32(&mp3, pConfig, pTotalFrameCount);
2692 return drmp3__full_decode_and_close_f32(&mp3, pConfig, pTotalFrameCount);
2695 #ifndef DR_MP3_NO_STDIO 2699 if (!drmp3_init_file(&mp3, filePath, pConfig))
2702 return drmp3__full_decode_and_close_f32(&mp3, pConfig, pTotalFrameCount);
drmp3_uint32 framesConsumed
Definition: dr_mp3.h:155
drmp3_src src
Definition: dr_mp3.h:158
drmp3_bool32 drmp3_init_memory(drmp3 *pMP3, const void *pData, size_t dataSize, const drmp3_config *pConfig)
GLenum mode
Definition: glext.h:6857
#define INLINE
Definition: retro_inline.h:35
drmp3_uint64(* drmp3_src_read_proc)(drmp3_src *pSRC, drmp3_uint64 frameCount, void *pFramesOut, void *pUserData)
Definition: dr_mp3.h:62
drmp3_read_proc onRead
Definition: dr_mp3.h:150
static const size_t frame_size
Definition: switch_thread_audio.c:42
__asm__(".arm\n" ".align 4\n" ".globl co_switch_arm\n" ".globl _co_switch_arm\n" "co_switch_arm:\n" "_co_switch_arm:\n" " stmia r1!, {r4, r5, r6, r7, r8, r9, r10, r11, sp, lr}\n" " ldmia r0!, {r4, r5, r6, r7, r8, r9, r10, r11, sp, pc}\n")
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:8418
#define DRMP3_TRUE
Definition: dr_mp3.h:24
GLfixed GLfixed x2
Definition: glsym_gl.h:1051
Definition: libretro.h:2275
unsigned char header[4]
Definition: dr_mp3.h:47
int64_t drmp3_int64
Definition: dr_mp3.h:20
GLdouble GLdouble t
Definition: glext.h:6398
int reserv
Definition: dr_mp3.h:45
GLenum GLsizei len
Definition: glext.h:7389
int8_t s8
8bit signed integer
Definition: gctypes.h:22
Definition: tinyalsa.c:749
size_t currentReadPos
Definition: dr_mp3.h:167
GLint limit
Definition: glext.h:11233
#define SEEK_CUR
Definition: zconf.h:439
GLfloat f
Definition: glext.h:8207
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld [DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld endif[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp local skip1 beq endif SRC MASK if dst_r_bpp DST_R else add endif PF add sub src_basereg pixdeinterleave mask_basereg pixdeinterleave dst_r_basereg process_pixblock_head pixblock_size cache_preload_simple process_pixblock_tail pixinterleave dst_w_basereg irp beq endif process_pixblock_tail_head tst beq irp if pixblock_size chunk_size tst beq pixld_src SRC pixld MASK if DST_R else pixld DST_R endif if
Definition: pixman-arm-neon-asm.h:543
drmp3dec_frame_info frameInfo
Definition: dr_mp3.h:147
int8_t drmp3_int8
Definition: dr_mp3.h:14
int layer
Definition: dr_mp3.h:37
float * drmp3_open_and_decode_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void *pUserData, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount)
drmp3_uint64 drmp3_read_f32(drmp3 *pMP3, drmp3_uint64 framesToRead, float *pBufferOut)
#define next(ls)
Definition: llex.c:32
GLdouble s
Definition: glext.h:6390
const struct retro_game_info * info
Definition: libretro.h:2121
GLdouble GLdouble z
Definition: glext.h:6514
drmp3_uint32 frameChannels
Definition: dr_mp3.h:153
typedef void(__stdcall *PFN_DESTRUCTION_CALLBACK)(void *pData)
uint64_t drmp3_uint64
Definition: dr_mp3.h:21
drmp3_src_algorithm algorithm
Definition: dr_mp3.h:84
GLdouble GLdouble right
Definition: glext.h:11766
bool success(size_t len)
Definition: peglib.h:475
drmp3_bool32 atEnd
Definition: dr_mp3.h:162
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: glext.h:6303
drmp3_bool32(* drmp3_seek_proc)(void *pUserData, int offset, drmp3_seek_origin origin)
Definition: dr_mp3.h:136
GLboolean GLboolean GLboolean b
Definition: glext.h:6844
float pCachedFrames[2 *DRMP3_SRC_CACHE_SIZE_IN_FRAMES]
Definition: dr_mp3.h:74
int drmp3dec_decode_frame(drmp3dec *dec, const unsigned char *mp3, int mp3_bytes, short *pcm, drmp3dec_frame_info *info)
drmp3_uint32 cachedFrameCount
Definition: dr_mp3.h:75
void * pUserData
Definition: dr_mp3.h:152
drmp3_uint32 channels
Definition: dr_mp3.h:83
drmp3_uint32 sampleRateIn
Definition: dr_mp3.h:81
#define NULL
Pointer to 0.
Definition: gctypes.h:65
drmp3dec decoder
Definition: dr_mp3.h:146
drmp3_uint32 channels
Definition: dr_mp3.h:148
#define fclose
Definition: file_stream_transforms.h:53
drmp3_uint32 framesRemaining
Definition: dr_mp3.h:156
uint8_t drmp3_uint8
Definition: dr_mp3.h:15
drmp3_bool32 isNextFramesLoaded
Definition: dr_mp3.h:101
void * pUserData
Definition: dr_mp3.h:92
const drmp3_uint8 * pData
Definition: dr_mp3.h:165
#define SEEK_SET
Definition: zconf.h:438
int bitrate_kbps
Definition: dr_mp3.h:38
float bin[256]
Definition: dr_mp3.h:93
drmp3_uint32 outputChannels
Definition: dr_mp3.h:140
drmp3_bool32 isPrevFramesLoaded
Definition: dr_mp3.h:100
int frame_bytes
Definition: dr_mp3.h:34
#define DRMP3_FALSE
Definition: dr_mp3.h:25
int hz
Definition: dr_mp3.h:36
drmp3_bool32 drmp3_init(drmp3 *pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void *pUserData, const drmp3_config *pConfig)
signed short int16_t
Definition: stdint.h:122
drmp3_uint32 frameSampleRate
Definition: dr_mp3.h:154
uint32_t drmp3_uint32
Definition: dr_mp3.h:19
float alpha
Definition: dr_mp3.h:99
GLint GLint GLint GLint GLint GLint y
Definition: glext.h:6295
GLenum src
Definition: glext.h:6980
static struct frame frames[2]
Definition: ffmpeg_core.c:162
GLenum GLint GLuint mask
Definition: glext.h:6668
GLint GLint GLint GLint GLint x
Definition: glext.h:6295
Definition: deflate.c:120
drmp3_seek_proc onSeek
Definition: dr_mp3.h:151
Definition: inftrees.h:27
struct drmp3_src::@68::@69 linear
drmp3_src * pSRC
Definition: dr_mp3.h:73
未知的編譯器 設備已從連接口上移開 文件已存在。儲存到備份至緩衝區 連接來自: 公開地址 設定光碟機裡光碟 你已離開遊戲 這個核心模擬器不支援不同系統的網路連線對打 輸入連線遊戲服務器的密碼: s 已斷開連線 已離開連線遊戲模式 連線遊戲人數已滿 連線遊戲對方 s 已暫停 使用模擬器硬體渲染私人內容時可避免硬體在各frames時的狀態改變 調整選單顯示的相關設定。 以延遲和視訊撕裂為代價換取高性能,當且僅當能 n 達到全速模擬時使用。 自動偵測 容量 連接到連接口 對不起,錯誤發生:模擬器核心未請求內容,無法加入連線遊戲。 密碼 用戶名 帳戶列表終端 成就列表 添加遊戲內容 導入遊戲內容 詢問 塊幀 聲音驅動程式 啟用聲音 渦輪 盲區 聲音最大採樣間隔 動態聲音碼率控制間隔 聲音 SaveRAM自動儲存間隔 自動戴入重映射文件 返回 訊息 向下滾動 開始 切換選單 確認 退出 默認值 切換選單 啟用藍牙服務 緩沖目錄 相機驅動程式 執行金手指修改 金手指文件 另存金手指文件 描述 鎖定 非官方測試成就 未鎖定 設定 設定 退出時進行詢問 遊戲內容數據庫目錄 歷史記錄數量 快捷選單 下載目錄 核心計數器 核心訊息 分類 核心名稱 許可證 支持的擴展 系統名稱 戴入核心 核心 自動解壓下載的檔案 核心更新程序 指針目錄 自定義比率 選擇數據庫 選擇文件並探測核心< 默認 > 沒有找到文件夾。 Disk Cycle Tray Status 光碟索引 不關心 下載核心…… 啟用DPI覆蓋 驅動 載入前檢查韌體 BIOS是否存在 動態壁紙目錄 選單項懸停顏色 取消 顯示幀率 幀率限制 自動戴入遊戲內容特定的核心選項 遊戲選項文件 聲音 視訊故障排除 基本選單控制 戴入遊戲內容 什麼是「核心」? 歷史 圖像 訊息 所有用戶都能控制選單 左搖桿Y 右搖桿X 右搖桿Y Gun Trigger Gun Aux A Gun Aux C Gun Select Gun D pad Down Gun D pad Right 輸入軸閾值 綁定全部 綁定超時時間 顯示輸入描述標籤 設備類型 Turbo占空比 鍵盤控制器映射啟用 下十字鍵 左十字鍵 右十字鍵 開始鍵 Mouse Mouse Mouse Wheel Down Wheel Right 最大用戶數 金手指索引 金手指開關 下一張光碟 啟用熱鍵 快進切換 切換全營幕 切換遊戲焦距 切換選單 靜音開關 切換營幕鍵盤 切換暫停 重置遊戲 儲存狀態 下一個Shader 慢動作 存檔槽 音量 顯示覆層 輪詢類型行為 稍晚 優先前置觸摸 啟用綁定重映射 輸入 啟用觸摸 Turbo區間 內部存儲狀態 手柄驅動 簡體中文 荷蘭語 世界語 德語 日語 波蘭語 葡萄牙語 西班牙語 Arabic 核心目錄 核心日誌級別 使用核心戴入壓縮包 載入遊戲內容 允許使用位置 日誌 主選單 選單顏色主題 藍灰色 綠色 紅色 底部不透明度 選單驅動 選單文件瀏覽器 Horizontal Animation 選單壁紙 丟失 鼠標支持 音樂 環繞式導航 連線遊戲 連線遊戲延遲幀數 啟用連線遊戲 作為遊戲主機 服務器地址 啟用連線遊戲客戶端 服務器密碼 連線遊戲無狀態模式 啟用連線遊戲旁觀者 連線遊戲使用NAT穿透技術 網路命令端口 網路遊戲控制器 網路 無 沒有可顯示的成就。 沒有可用的核心。 沒有可用的核心選項。 沒有可用的歷史記錄。 沒有條目。 未發現網路。 沒有遊戲列表。 沒有找到設定。 關 連線更新器 營幕覆層 營幕通知 OSK覆層目錄 自動戴入最佳的覆層 覆層不透明度 覆層縮放比例 使用PAL60模式 當選單激活時暫停 性能計數器 遊戲列表目錄 觸控支援 現在 退出 RetroArch BBFC 分級 多人遊戲支持 描述 Edge雜誌發行 Edge雜誌評論 增強硬件 經銷商 MD5 起源 出版方 發售年份 系列 啟動遊戲內容 重啟 錄影輸出目錄 錄影設定 啟用錄影 使用輸出目錄 戴入重映射文件 儲存遊戲重映射文件 重啟 繼續 Retro鍵盤 RetroPad w Analog 啟用回溯 回溯 設定目錄 右側搖桿 啟用SAMBA文件共享服務 自動索引儲存狀態 自動儲存狀態 既時存檔縮圖 儲存核心覆寫 儲存新設定 存檔 掃瞄文件 營幕截圖目錄 搜索: 設定 Shader Shader效果 Simple Snow 顯示高級設定 關機 排序文件夾中的存檔 啟用SSH遠程終端服務 啟動遠程的RetroPad 狀態存儲槽 標準輸入流命令 暫停屏保程序 系統 BIOS目錄 支持 編譯日期 Cocoa 支持 CoreText 支持 顯示器度量DPI DirectSound 支持 動態鏈接庫支持 EGL 支持 FFmpeg 支持 STB TrueType 支持 前端名稱 Git版本 HLSL 支持 KMS EGL 支持 Libusb 支持 網路控制台支持 OpenAL 支持 OpenGL 支持 OpenVG 支持 覆層支持 已充滿電 放電中 PulseAudio 支持 BMP RetroRating 等級 RoarAudio 支持 RSound 支持 SDL2 支持 SDL1 支持 多線程支持 Video4Linux2 支持 Vulkan 支持 X11 支持 XVideo 支持 截取營幕 縮略圖 縮略圖更新程序 截屏 顯示時間日期 真 UI Companion Start On Boot 無法讀取壓縮的文件。 撤銷儲存狀態 更新程序 更新自動設定檔案 更新金手指 更新數據庫 更新 Lakka 更新Slang Shader效果文件 用戶界面 用戶 使用內建媒體播放器 允許旋轉 畫面比例選項 Crop 禁用桌面元素 視訊驅動 視訊濾鏡目錄 強制畫面比例 幀延時 視訊Gamma 啟用GPU截屏 強制GPU同步幀數 顯示器索引 刷新率 Set Display Reported Refresh Rate 窗口縮放量 視訊 Shader渲染遍數 戴入Shader預設 儲存核心預設 啟用硬件共享上下文 啟用軟件過濾器 視訊 降低閃爍 自定義畫面寬度 自定義畫面Y 垂直同步 窗口寬度 Wi Fi驅動 選單透明度因子 自定義 Monochrome Systematic Pixel Retrosystem 選單顏色主題 深色 鐵藍色 傳統紅 樸素 火山紅 選單縮放因子 顯示歷史頁 顯示圖像頁 顯示設定頁 Menu Layout 是 打開或關閉成就。更多內容請訪問 為測試目的而打開或關閉非官方成就和 或測試版特性。 修改驅動設定。 修改核心設定。 修改顯示覆蓋、鍵盤覆蓋和營幕通知的設定。 修改存檔設定。 修改用戶界面設定。 修改你的隱私設定。 修改遊戲列表設定。 下載且 或者掃瞄遊戲內容,並將其加入你的收藏中。 啟用或者禁止藍牙。 修改設定文件的默認設定。 CPU擁有的核心總數。 設定熱鍵選項。 調整遊戲控制器、鍵盤和鼠標的設定。 啟用或禁止向控制台打印日誌。 在局域網內搜索並連接聯網遊戲的主機。 下載並更新RetroArch的附加插件和組件。 管理操作系統層級的服務。 阻止系統激活營幕保護程序。 在幀與幀之間插入黑色的中間幀,通常用於消除在 n n 的鬼影。 設定當開啟「強制GPU同步」時CPU可以預先GPU多少幀。 選擇將要使用哪一個顯示器。 The refresh rate as reported by the display driver 掃瞄無線網路並且建立連接。 磁碟已加入 載入 shader 取消靜音。 自動設定文件儲存成功。 自動儲存狀態至 啟用通訊埠上的指令介面 無法推斷新的設定路徑,使用當前時間。 與已知的magic numbers比較 未設定設定目錄,無法儲存新的設定。 內容的CRC32s不同。無法使用不同的遊戲。 核心不支持儲存狀態。 無法找到磁碟 無法找到有效的數據軌 無法讀取內容文件 無法讀取視訊狀態 Custom timing given 解壓縮失敗。 無法找到任何有效的內容位置 已關閉 正在下載 錯誤 Libretro core 但程式未找到可載入內容 無法儲存 core options 檔案 無法儲存預置 shader 正在解壓 無法儲存設定到 無法讓觀眾加入 無法載入 shader 創建目錄失敗。 從客戶端獲取暱稱失敗 載入內容失敗 無法戴入 overlay 打開libretro核心失敗 無法接收連線端的資訊 無法接收主控端的暱稱 無法接收主控端 SRAM 資料 移除臨時文件失敗 即時存檔儲存失敗 發送暱稱尺寸失敗 發送暱稱至主控端失敗 聲音驅動啟動失敗,將在無聲音模式下繼續啟動。 建用錄製視訊失敗 還原載入即時存檔失敗 還原取消靜音失敗 未找到文件 找到磁碟標籤 找到最後一個狀態槽 幀 錯誤的磁碟索引 打開遊戲焦點 Libretro core is hardware rendered Must use post shaded recording as well 輸入金手指 目前檔案 接口 可移除的儲存空間 字節 兆字節 為libretro而設計的前端 戴入狀態從槽 一個或多個固件文件丟失 正在讀取歷史文件 內存 視訊格式看起來使用了不同的序列化版本。很有可能失敗。 停止視訊錄製。 沒有內容,啟動虛擬核心。 沒有戴入任何存檔。 覆蓋儲存成功。 RetroArch 接收完畢 錄製到 重新轉向 save file to Remap file 儲存成功 移除臨時內容文件 重啟錄製由於驅動器重新初始化。 Reverting savefile directory to 正在回溯。 初始化回放緩存失敗 回放功能關閉 到達回放緩存末端 儲存狀態至槽 成功儲存至 存檔中 已完成對文件夾的掃瞄 Several patches are explicitly defined
Definition: msg_hash_cht.h:2214
GLfloat GLfloat p
Definition: glext.h:9809
signed int int32_t
Definition: stdint.h:123
GLenum GLsizei dataSize
Definition: glext.h:12030
drmp3_src_config config
Definition: dr_mp3.h:90
void drmp3_uninit(drmp3 *pMP3)
#define SIZE_MAX
Definition: stdint.h:252
int channels
Definition: dr_mp3.h:35
size_t dataSize
Definition: dr_mp3.h:159
#define FILE
Definition: file_stream_transforms.h:35
f32 a1
Definition: gx_regdef.h:5095
int16_t drmp3_int16
Definition: dr_mp3.h:16
drmp3_uint32 cacheSizeInFrames
Definition: dr_mp3.h:85
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:11836
union drmp3_src::@68 algo
size_t dataCapacity
Definition: dr_mp3.h:160
#define DRMP3_SRC_CACHE_SIZE_IN_FRAMES
Definition: dr_mp3.h:70
drmp3_bool32 drmp3_seek_to_frame(drmp3 *pMP3, drmp3_uint64 frameIndex)
drmp3_src_read_proc onRead
Definition: dr_mp3.h:91
int32_t drmp3_int32
Definition: dr_mp3.h:18
GLint j
Definition: nx_glsym.h:307
void drmp3dec_init(drmp3dec *dec)
size_t(* drmp3_read_proc)(void *pUserData, void *pBufferOut, size_t bytesToRead)
Definition: dr_mp3.h:123
def sign()
Definition: build.py:201
int free_format_bytes
Definition: dr_mp3.h:46
signed __int64 int64_t
Definition: stdint.h:135
float * drmp3_open_and_decode_memory_f32(const void *pData, size_t dataSize, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount)
#define fread
Definition: file_stream_transforms.h:56
drmp3_uint8 drmp3_bool8
Definition: dr_mp3.h:22
GLenum GLenum dst
Definition: glext.h:6980
#define fopen
Definition: file_stream_transforms.h:52
#define __attribute__(Spec)
Definition: glslang_tab.cpp:647
drmp3_uint32 drmp3_bool32
Definition: dr_mp3.h:23
float qmf_state[15 *2 *32]
Definition: dr_mp3.h:44
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6742
drmp3_int16 frames[DRMP3_MAX_SAMPLES_PER_FRAME]
Definition: dr_mp3.h:157
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:8390
GLintptr offset
Definition: glext.h:6560
GLint left
Definition: glext.h:8393
#define DRMP3_MAX_SAMPLES_PER_FRAME
Definition: dr_mp3.h:27
drmp3_uint8 * pData
Definition: dr_mp3.h:161
drmp3_src_algorithm
Definition: dr_mp3.h:64
drmp3_uint32 outputSampleRate
Definition: dr_mp3.h:141
drmp3_seek_origin
Definition: dr_mp3.h:106
unsigned short uint16_t
Definition: stdint.h:125
void * memset(void *b, int c, size_t len)
Definition: string.c:7
unsigned __int64 uint64_t
Definition: stdint.h:136
GLdouble n
Definition: glext.h:8396
unsigned char uint8_t
Definition: stdint.h:124
unsigned int uint32_t
Definition: stdint.h:126
uint16_t drmp3_uint16
Definition: dr_mp3.h:17
int fopen_s(FILE **pFile, const char *filename, const char *mode)
Definition: StandAlone.cpp:1437
const GLfloat * m
Definition: glext.h:11755
drmp3_uint32 iNextFrame
Definition: dr_mp3.h:76
signed char int8_t
Definition: stdint.h:121
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6844
#define fseek
Definition: file_stream_transforms.h:55
drmp3_src_cache cache
Definition: dr_mp3.h:94
void * memcpy(void *dst, const void *src, size_t len)
Definition: string.c:26
drmp3_uint32 sampleRate
Definition: dr_mp3.h:149
drmp3_uint32 sampleRateOut
Definition: dr_mp3.h:82