69 #if defined(_MSC_VER) && _MSC_VER < 1600
94 #define DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152
95 #define DRMP3_MAX_SAMPLES_PER_FRAME (DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2)
98 #define DRMP3_INLINE __forceinline
101 #define DRMP3_INLINE __inline__ __attribute__((always_inline))
118 float mdct_overlap[2][9*32], qmf_state[15*2*32];
120 unsigned char header[4], reserv_buf[511];
138 #ifndef DR_MP3_DEFAULT_CHANNELS
139 #define DR_MP3_DEFAULT_CHANNELS 2
141 #ifndef DR_MP3_DEFAULT_SAMPLE_RATE
142 #define DR_MP3_DEFAULT_SAMPLE_RATE 44100
154 #define DRMP3_SRC_CACHE_SIZE_IN_FRAMES 512
216 typedef size_t (*
drmp3_read_proc)(
void* pUserData,
void* pBufferOut,
size_t bytesToRead);
294 #ifndef DR_MP3_NO_STDIO
386 #ifndef DR_MP3_NO_STDIO
409 #ifdef DR_MP3_IMPLEMENTATION
415 #if defined(__TINYC__)
416 #define DR_MP3_NO_SIMD
419 #define DRMP3_OFFSET_PTR(p, offset) ((void*)((drmp3_uint8*)(p) + (offset)))
421 #define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE 2304
422 #ifndef DRMP3_MAX_FRAME_SYNC_MATCHES
423 #define DRMP3_MAX_FRAME_SYNC_MATCHES 10
426 #define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES DRMP3_MAX_FREE_FORMAT_FRAME_SIZE
428 #define DRMP3_MAX_BITRESERVOIR_BYTES 511
429 #define DRMP3_SHORT_BLOCK_TYPE 2
430 #define DRMP3_STOP_BLOCK_TYPE 3
431 #define DRMP3_MODE_MONO 3
432 #define DRMP3_MODE_JOINT_STEREO 1
433 #define DRMP3_HDR_SIZE 4
434 #define DRMP3_HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0)
435 #define DRMP3_HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60)
436 #define DRMP3_HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0)
437 #define DRMP3_HDR_IS_CRC(h) (!((h[1]) & 1))
438 #define DRMP3_HDR_TEST_PADDING(h) ((h[2]) & 0x2)
439 #define DRMP3_HDR_TEST_MPEG1(h) ((h[1]) & 0x8)
440 #define DRMP3_HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10)
441 #define DRMP3_HDR_TEST_I_STEREO(h) ((h[3]) & 0x10)
442 #define DRMP3_HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20)
443 #define DRMP3_HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3)
444 #define DRMP3_HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3)
445 #define DRMP3_HDR_GET_LAYER(h) (((h[1]) >> 1) & 3)
446 #define DRMP3_HDR_GET_BITRATE(h) ((h[2]) >> 4)
447 #define DRMP3_HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3)
448 #define DRMP3_HDR_GET_MY_SAMPLE_RATE(h) (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)
449 #define DRMP3_HDR_IS_FRAME_576(h) ((h[1] & 14) == 2)
450 #define DRMP3_HDR_IS_LAYER_1(h) ((h[1] & 6) == 6)
452 #define DRMP3_BITS_DEQUANTIZER_OUT -1
453 #define DRMP3_MAX_SCF (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210)
454 #define DRMP3_MAX_SCFI ((DRMP3_MAX_SCF + 3) & ~3)
456 #define DRMP3_MIN(a, b) ((a) > (b) ? (b) : (a))
457 #define DRMP3_MAX(a, b) ((a) < (b) ? (b) : (a))
459 #if !defined(DR_MP3_NO_SIMD)
461 #if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__))
463 #define DR_MP3_ONLY_SIMD
466 #if ((defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
467 #if defined(_MSC_VER)
470 #include <emmintrin.h>
471 #define DRMP3_HAVE_SSE 1
472 #define DRMP3_HAVE_SIMD 1
473 #define DRMP3_VSTORE _mm_storeu_ps
474 #define DRMP3_VLD _mm_loadu_ps
475 #define DRMP3_VSET _mm_set1_ps
476 #define DRMP3_VADD _mm_add_ps
477 #define DRMP3_VSUB _mm_sub_ps
478 #define DRMP3_VMUL _mm_mul_ps
479 #define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))
480 #define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))
481 #define DRMP3_VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s))
482 #define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))
483 typedef __m128 drmp3_f4;
484 #if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD)
485 #define drmp3_cpuid __cpuid
487 static __inline__ __attribute__((always_inline))
void drmp3_cpuid(
int CPUInfo[],
const int InfoType)
490 __asm__ __volatile__(
491 #
if defined(__x86_64__)
501 :
"=a" (CPUInfo[0]),
"=r" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
504 __asm__ __volatile__(
506 :
"=a" (CPUInfo[0]),
"=b" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
511 static int drmp3_have_simd()
513 #ifdef DR_MP3_ONLY_SIMD
516 static int g_have_simd;
519 static int g_counter;
520 if (g_counter++ > 100)
525 drmp3_cpuid(CPUInfo, 0);
528 drmp3_cpuid(CPUInfo, 1);
529 g_have_simd = (CPUInfo[3] & (1 << 26)) + 1;
530 return g_have_simd - 1;
534 return g_have_simd - 1;
537 #elif defined(__ARM_NEON) || defined(__aarch64__)
538 #include <arm_neon.h>
539 #define DRMP3_HAVE_SIMD 1
540 #define DRMP3_VSTORE vst1q_f32
541 #define DRMP3_VLD vld1q_f32
542 #define DRMP3_VSET vmovq_n_f32
543 #define DRMP3_VADD vaddq_f32
544 #define DRMP3_VSUB vsubq_f32
545 #define DRMP3_VMUL vmulq_f32
546 #define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y)
547 #define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y)
548 #define DRMP3_VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s))
549 #define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))
550 typedef float32x4_t drmp3_f4;
551 static int drmp3_have_simd()
556 #define DRMP3_HAVE_SIMD 0
557 #ifdef DR_MP3_ONLY_SIMD
558 #error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled
564 #define DRMP3_HAVE_SIMD 0
577 drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64];
578 } drmp3_L12_scale_info;
582 drmp3_uint8 tab_offset, code_tab_width, band_count;
583 } drmp3_L12_subband_alloc;
588 drmp3_uint16 part_23_length, big_values, scalefac_compress;
589 drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
590 drmp3_uint8 table_select[3], region_count[3], subblock_gain[3];
591 drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi;
597 drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES];
598 drmp3_L3_gr_info gr_info[4];
599 float grbuf[2][576], scf[40], syn[18 + 15][2*32];
603 static void drmp3_bs_init(drmp3_bs *bs,
const drmp3_uint8 *data,
int bytes)
610 static drmp3_uint32 drmp3_bs_get_bits(drmp3_bs *bs,
int n)
615 if ((bs->pos += n) > bs->limit)
617 next = *p++ & (255 >>
s);
618 while ((shl -= 8) > 0)
620 cache |= next << shl;
623 return cache | (next >> -shl);
628 return h[0] == 0xff &&
629 ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&
630 (DRMP3_HDR_GET_LAYER(h) != 0) &&
631 (DRMP3_HDR_GET_BITRATE(h) != 15) &&
632 (DRMP3_HDR_GET_SAMPLE_RATE(h) != 3);
637 return drmp3_hdr_valid(h2) &&
638 ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
639 ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
640 !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2));
643 static unsigned drmp3_hdr_bitrate_kbps(
const drmp3_uint8 *h)
646 { { 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 } },
647 { { 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 } },
649 return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(h)][DRMP3_HDR_GET_LAYER(h) - 1][DRMP3_HDR_GET_BITRATE(h)];
652 static unsigned drmp3_hdr_sample_rate_hz(
const drmp3_uint8 *h)
654 static const unsigned g_hz[3] = { 44100, 48000, 32000 };
655 return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(h)] >> (
int)!DRMP3_HDR_TEST_MPEG1(h) >> (
int)!DRMP3_HDR_TEST_NOT_MPEG25(h);
658 static unsigned drmp3_hdr_frame_samples(
const drmp3_uint8 *h)
660 return DRMP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (
int)DRMP3_HDR_IS_FRAME_576(h));
663 static int drmp3_hdr_frame_bytes(
const drmp3_uint8 *h,
int free_format_size)
665 int frame_bytes = drmp3_hdr_frame_samples(h)*drmp3_hdr_bitrate_kbps(h)*125/drmp3_hdr_sample_rate_hz(h);
666 if (DRMP3_HDR_IS_LAYER_1(h))
670 return frame_bytes ? frame_bytes : free_format_size;
675 return DRMP3_HDR_TEST_PADDING(h) ? (DRMP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
678 #ifndef DR_MP3_ONLY_MP3
679 static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(
const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci)
681 const drmp3_L12_subband_alloc *alloc;
682 int mode = DRMP3_HDR_GET_STEREO_MODE(hdr);
683 int nbands, stereo_bands = (
mode == DRMP3_MODE_MONO) ? 0 : (
mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
685 if (DRMP3_HDR_IS_LAYER_1(hdr))
687 static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };
690 }
else if (!DRMP3_HDR_TEST_MPEG1(hdr))
692 static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
693 alloc = g_alloc_L2M2;
697 static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
698 int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr);
699 unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (
int)(
mode != DRMP3_MODE_MONO);
705 alloc = g_alloc_L2M1;
709 static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
710 alloc = g_alloc_L2M1_lowrate;
711 nbands = sample_rate_idx == 2 ? 12 : 8;
712 }
else if (kbps >= 96 && sample_rate_idx != 1)
719 sci->stereo_bands = (
drmp3_uint8)DRMP3_MIN(stereo_bands, nbands);
724 static void drmp3_L12_read_scalefactors(drmp3_bs *bs,
drmp3_uint8 *pba,
drmp3_uint8 *scfcod,
int bands,
float *scf)
726 static const float g_deq_L12[18*3] = {
727 #define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
728 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)
731 for (
i = 0;
i < bands;
i++)
735 int mask = ba ? 4 + ((19 >> scfcod[
i]) & 3) : 0;
736 for (m = 4; m; m >>= 1)
740 int b = drmp3_bs_get_bits(bs, 6);
741 s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3);
748 static void drmp3_L12_read_scale_info(
const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci)
751 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
752 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
753 0,17,18, 3,19,4,5,16,
755 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
756 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
757 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
759 const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci);
761 int i, k = 0, ba_bits = 0;
762 const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab;
764 for (
i = 0;
i < sci->total_bands;
i++)
769 k += subband_alloc->band_count;
770 ba_bits = subband_alloc->code_tab_width;
771 ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
774 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
775 sci->bitalloc[2*
i] = ba;
776 if (i < sci->stereo_bands)
778 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
780 sci->bitalloc[2*
i + 1] = sci->stereo_bands ? ba : 0;
783 for (
i = 0;
i < 2*sci->total_bands;
i++)
785 sci->scfcod[
i] = (
drmp3_uint8)(sci->bitalloc[
i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6);
788 drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
790 for (
i = sci->stereo_bands; i < sci->total_bands;
i++)
792 sci->bitalloc[2*
i + 1] = 0;
796 static int drmp3_L12_dequantize_granule(
float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci,
int group_size)
798 int i,
j, k, choff = 576;
799 for (
j = 0;
j < 4;
j++)
801 float *dst = grbuf + group_size*
j;
802 for (
i = 0;
i < 2*sci->total_bands;
i++)
804 int ba = sci->bitalloc[
i];
809 int half = (1 << (ba - 1)) - 1;
810 for (k = 0; k < group_size; k++)
812 dst[k] = (float)((
int)drmp3_bs_get_bits(bs, ba) - half);
816 unsigned mod = (2 << (ba - 17)) + 1;
817 unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3));
818 for (k = 0; k < group_size; k++, code /= mod)
820 dst[k] = (float)((
int)(code % mod - mod/2));
831 static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci,
const float *scf,
float *dst)
834 memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*
sizeof(
float));
835 for (
i = 0;
i < sci->total_bands;
i++, dst += 18, scf += 6)
837 for (k = 0; k < 12; k++)
839 dst[k + 0] *= scf[0];
840 dst[k + 576] *= scf[3];
846 static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr,
const drmp3_uint8 *hdr)
849 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
850 { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
851 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
852 { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
853 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
854 { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
855 { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
856 { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
859 { 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 },
860 { 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 },
861 { 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 },
862 { 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 },
863 { 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 },
864 { 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 },
865 { 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 },
866 { 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 }
869 { 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 },
870 { 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 },
871 { 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 },
872 { 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 },
873 { 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 },
874 { 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 },
875 { 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 },
876 { 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 }
879 unsigned tables, scfsi = 0;
880 int main_data_begin, part_23_sum = 0;
881 int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
882 int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
884 if (DRMP3_HDR_TEST_MPEG1(hdr))
887 main_data_begin = drmp3_bs_get_bits(bs, 9);
888 scfsi = drmp3_bs_get_bits(bs, 7 + gr_count);
891 main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;
896 if (DRMP3_HDR_IS_MONO(hdr))
900 gr->part_23_length = (
drmp3_uint16)drmp3_bs_get_bits(bs, 12);
901 part_23_sum += gr->part_23_length;
902 gr->big_values = (
drmp3_uint16)drmp3_bs_get_bits(bs, 9);
903 if (gr->big_values > 288)
907 gr->global_gain = (
drmp3_uint8)drmp3_bs_get_bits(bs, 8);
908 gr->scalefac_compress = (
drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);
909 gr->sfbtab = g_scf_long[sr_idx];
912 if (drmp3_bs_get_bits(bs, 1))
914 gr->block_type = (
drmp3_uint8)drmp3_bs_get_bits(bs, 2);
919 gr->mixed_block_flag = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
920 gr->region_count[0] = 7;
921 gr->region_count[1] = 255;
922 if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE)
925 if (!gr->mixed_block_flag)
927 gr->region_count[0] = 8;
928 gr->sfbtab = g_scf_short[sr_idx];
930 gr->n_short_sfb = 39;
933 gr->sfbtab = g_scf_mixed[sr_idx];
934 gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;
935 gr->n_short_sfb = 30;
938 tables = drmp3_bs_get_bits(bs, 10);
940 gr->subblock_gain[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
941 gr->subblock_gain[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
942 gr->subblock_gain[2] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
946 gr->mixed_block_flag = 0;
947 tables = drmp3_bs_get_bits(bs, 15);
948 gr->region_count[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 4);
949 gr->region_count[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
950 gr->region_count[2] = 255;
953 gr->table_select[1] = (
drmp3_uint8)((tables >> 5) & 31);
954 gr->table_select[2] = (
drmp3_uint8)((tables) & 31);
955 gr->preflag = (
drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));
956 gr->scalefac_scale = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
957 gr->count1_table = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
963 if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
968 return main_data_begin;
974 for (
i = 0;
i < 4 && scf_count[
i];
i++, scfsi *= 2)
976 int cnt = scf_count[
i];
979 memcpy(scf, ist_pos, cnt);
982 int bits = scf_size[
i];
986 memset(ist_pos, 0, cnt);
989 int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
990 for (k = 0; k < cnt; k++)
992 int s = drmp3_bs_get_bits(bitbuf, bits);
1001 scf[0] = scf[1] = scf[2] = 0;
1004 static float drmp3_L3_ldexp_q2(
float y,
int exp_q2)
1006 static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
1010 e = DRMP3_MIN(30*4, exp_q2);
1011 y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
1012 }
while ((exp_q2 -= e) > 0);
1016 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)
1018 static const drmp3_uint8 g_scf_partitions[3][28] = {
1019 { 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 },
1020 { 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 },
1021 { 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 }
1023 const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
1025 int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
1028 if (DRMP3_HDR_TEST_MPEG1(hdr))
1030 static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
1031 int part = g_scfc_decode[gr->scalefac_compress];
1032 scf_size[1] = scf_size[0] = (
drmp3_uint8)(part >> 2);
1033 scf_size[3] = scf_size[2] = (
drmp3_uint8)(part & 3);
1036 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 };
1037 int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch;
1038 sfc = gr->scalefac_compress >> ist;
1039 for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
1041 for (modprod = 1,
i = 3;
i >= 0;
i--)
1044 modprod *= g_mod[k +
i];
1050 drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
1052 if (gr->n_short_sfb)
1054 int sh = 3 - scf_shift;
1055 for (
i = 0;
i < gr->n_short_sfb;
i += 3)
1057 iscf[gr->n_long_sfb +
i + 0] += gr->subblock_gain[0] << sh;
1058 iscf[gr->n_long_sfb +
i + 1] += gr->subblock_gain[1] << sh;
1059 iscf[gr->n_long_sfb +
i + 2] += gr->subblock_gain[2] << sh;
1061 }
else if (gr->preflag)
1063 static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
1064 for (
i = 0;
i < 10;
i++)
1066 iscf[11 +
i] += g_preamp[
i];
1070 gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);
1071 gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4), DRMP3_MAX_SCFI - gain_exp);
1072 for (
i = 0;
i < (
int)(gr->n_long_sfb + gr->n_short_sfb);
i++)
1074 scf[
i] = drmp3_L3_ldexp_q2(gain, iscf[
i] << scf_shift);
1078 static const float g_drmp3_pow43[129 + 16] = {
1079 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,
1080 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
1083 static float drmp3_L3_pow_43(
int x)
1086 int sign, mult = 256;
1090 return g_drmp3_pow43[16 +
x];
1100 frac = (float)((
x & 63) - sign) / ((
x & ~63) + sign);
1101 return g_drmp3_pow43[16 + ((
x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
1104 static void drmp3_L3_huffman(
float *dst, drmp3_bs *bs,
const drmp3_L3_gr_info *gr_info,
const float *scf,
int layer3gr_limit)
1106 static const drmp3_int16 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,
1107 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,
1108 -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,
1109 -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,
1110 -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,
1111 -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,
1112 -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,
1113 -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,
1114 -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,
1115 -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,
1116 -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,
1117 -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,
1118 -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,
1119 -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,
1120 -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,
1121 -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 };
1122 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};
1123 static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
1124 static const drmp3_int16 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 };
1125 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 };
1127 #define DRMP3_PEEK_BITS(n) (bs_cache >> (32 - n))
1128 #define DRMP3_FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); }
1129 #define DRMP3_CHECK_BITS while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
1130 #define DRMP3_BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
1133 int ireg = 0, big_val_cnt = gr_info->big_values;
1135 const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8;
1136 drmp3_uint32 bs_cache = (((bs_next_ptr[0]*256
u + bs_next_ptr[1])*256
u + bs_next_ptr[2])*256
u + bs_next_ptr[3]) << (bs->pos & 7);
1137 int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
1140 while (big_val_cnt > 0)
1142 int tab_num = gr_info->table_select[ireg];
1143 int sfb_cnt = gr_info->region_count[ireg++];
1144 const drmp3_int16 *codebook = tabs + tabindex[tab_num];
1145 int linbits = g_linbits[tab_num];
1149 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1154 int leaf = codebook[DRMP3_PEEK_BITS(
w)];
1157 DRMP3_FLUSH_BITS(
w);
1159 leaf = codebook[DRMP3_PEEK_BITS(
w) - (leaf >> 3)];
1161 DRMP3_FLUSH_BITS(leaf >> 8);
1163 for (
j = 0; j < 2; j++, dst++, leaf >>= 4)
1165 int lsb = leaf & 0x0F;
1166 if (lsb == 15 && linbits)
1168 lsb += DRMP3_PEEK_BITS(linbits);
1169 DRMP3_FLUSH_BITS(linbits);
1171 *dst = one*drmp3_L3_pow_43(lsb)*((
drmp3_int32)bs_cache < 0 ? -1: 1);
1174 *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
1176 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1179 }
while (--pairs_to_decode);
1180 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1183 for (np = 1 - big_val_cnt;; dst += 4)
1185 const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
1186 int leaf = codebook_count1[DRMP3_PEEK_BITS(4)];
1189 leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
1191 DRMP3_FLUSH_BITS(leaf & 7);
1192 if (DRMP3_BSPOS > layer3gr_limit)
1196 #define DRMP3_RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }
1197 #define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) }
1198 DRMP3_RELOAD_SCALEFACTOR;
1199 DRMP3_DEQ_COUNT1(0);
1200 DRMP3_DEQ_COUNT1(1);
1201 DRMP3_RELOAD_SCALEFACTOR;
1202 DRMP3_DEQ_COUNT1(2);
1203 DRMP3_DEQ_COUNT1(3);
1207 bs->pos = layer3gr_limit;
1210 static void drmp3_L3_midside_stereo(
float *left,
int n)
1213 float *
right = left + 576;
1215 if (drmp3_have_simd())
for (;
i < n - 3;
i += 4)
1217 drmp3_f4 vl = DRMP3_VLD(left +
i);
1218 drmp3_f4 vr = DRMP3_VLD(
right +
i);
1219 DRMP3_VSTORE(left +
i, DRMP3_VADD(vl, vr));
1220 DRMP3_VSTORE(
right +
i, DRMP3_VSUB(vl, vr));
1232 static void drmp3_L3_intensity_stereo_band(
float *left,
int n,
float kl,
float kr)
1235 for (
i = 0;
i < n;
i++)
1237 left[
i + 576] = left[
i]*kr;
1238 left[
i] = left[
i]*kl;
1242 static void drmp3_L3_stereo_top_band(
const float *
right,
const drmp3_uint8 *sfb,
int nbands,
int max_band[3])
1246 max_band[0] = max_band[1] = max_band[2] = -1;
1248 for (
i = 0;
i < nbands;
i++)
1250 for (k = 0; k < sfb[
i]; k += 2)
1254 max_band[
i % 3] =
i;
1264 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 };
1265 unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;
1267 for (
i = 0; sfb[
i];
i++)
1269 unsigned ipos = ist_pos[
i];
1270 if ((
int)
i > max_band[
i % 3] && ipos < max_pos)
1272 float kl, kr,
s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
1273 if (DRMP3_HDR_TEST_MPEG1(hdr))
1276 kr = g_pan[2*ipos + 1];
1280 kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
1287 drmp3_L3_intensity_stereo_band(left, sfb[
i], kl*
s, kr*
s);
1288 }
else if (DRMP3_HDR_TEST_MS_STEREO(hdr))
1290 drmp3_L3_midside_stereo(left, sfb[
i]);
1296 static void drmp3_L3_intensity_stereo(
float *left,
drmp3_uint8 *ist_pos,
const drmp3_L3_gr_info *gr,
const drmp3_uint8 *hdr)
1298 int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
1299 int i, max_blocks = gr->n_short_sfb ? 3 : 1;
1301 drmp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
1304 max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]);
1306 for (
i = 0;
i < max_blocks;
i++)
1308 int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;
1309 int itop = n_sfb - max_blocks +
i;
1310 int prev = itop - max_blocks;
1311 ist_pos[itop] = (
drmp3_uint8)(max_band[
i] >= prev ? default_pos : ist_pos[prev]);
1313 drmp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
1316 static void drmp3_L3_reorder(
float *grbuf,
float *scratch,
const drmp3_uint8 *sfb)
1319 float *src = grbuf, *dst = scratch;
1321 for (;0 != (len = *sfb); sfb += 3, src += 2*len)
1323 for (
i = 0;
i < len;
i++, src++)
1325 *dst++ = src[0*len];
1326 *dst++ = src[1*len];
1327 *dst++ = src[2*len];
1330 memcpy(grbuf, scratch, (dst - scratch)*
sizeof(
float));
1333 static void drmp3_L3_antialias(
float *grbuf,
int nbands)
1335 static const float g_aa[2][8] = {
1336 {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
1337 {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
1340 for (; nbands > 0; nbands--, grbuf += 18)
1344 if (drmp3_have_simd())
for (;
i < 8;
i += 4)
1346 drmp3_f4 vu = DRMP3_VLD(grbuf + 18 +
i);
1347 drmp3_f4 vd = DRMP3_VLD(grbuf + 14 -
i);
1348 drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] +
i);
1349 drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] +
i);
1350 vd = DRMP3_VREV(vd);
1351 DRMP3_VSTORE(grbuf + 18 +
i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1)));
1352 vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0));
1353 DRMP3_VSTORE(grbuf + 14 -
i, DRMP3_VREV(vd));
1356 #ifndef DR_MP3_ONLY_SIMD
1359 float u = grbuf[18 +
i];
1360 float d = grbuf[17 -
i];
1361 grbuf[18 +
i] =
u*g_aa[0][
i] - d*g_aa[1][
i];
1362 grbuf[17 -
i] =
u*g_aa[1][
i] + d*g_aa[0][
i];
1368 static void drmp3_L3_dct3_9(
float *
y)
1370 float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
1372 s0 =
y[0]; s2 =
y[2]; s4 =
y[4]; s6 =
y[6]; s8 =
y[8];
1375 t4 = (s4 + s2)*0.93969262f;
1376 t2 = (s8 + s2)*0.76604444f;
1377 s6 = (s4 - s8)*0.17364818f;
1386 s1 =
y[1]; s3 =
y[3]; s5 =
y[5]; s7 =
y[7];
1389 t0 = (s5 + s1)*0.98480775f;
1390 t4 = (s5 - s7)*0.34202014f;
1391 t2 = (s1 + s7)*0.64278761f;
1392 s1 = (s1 - s5 - s7)*0.86602540f;
1408 static void drmp3_L3_imdct36(
float *grbuf,
float *overlap,
const float *window,
int nbands)
1411 static const float g_twid9[18] = {
1412 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
1415 for (
j = 0;
j < nbands;
j++, grbuf += 18, overlap += 9)
1420 for (
i = 0;
i < 4;
i++)
1422 si[8 - 2*
i] = grbuf[4*
i + 1] - grbuf[4*
i + 2];
1423 co[1 + 2*
i] = grbuf[4*
i + 1] + grbuf[4*
i + 2];
1424 si[7 - 2*
i] = grbuf[4*
i + 4] - grbuf[4*
i + 3];
1425 co[2 + 2*
i] = -(grbuf[4*
i + 3] + grbuf[4*
i + 4]);
1427 drmp3_L3_dct3_9(co);
1428 drmp3_L3_dct3_9(si);
1438 if (drmp3_have_simd())
for (;
i < 8;
i += 4)
1440 drmp3_f4 vovl = DRMP3_VLD(overlap +
i);
1441 drmp3_f4 vc = DRMP3_VLD(co +
i);
1442 drmp3_f4 vs = DRMP3_VLD(si +
i);
1443 drmp3_f4 vr0 = DRMP3_VLD(g_twid9 +
i);
1444 drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 +
i);
1445 drmp3_f4 vw0 = DRMP3_VLD(window +
i);
1446 drmp3_f4 vw1 = DRMP3_VLD(window + 9 +
i);
1447 drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0));
1448 DRMP3_VSTORE(overlap +
i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1)));
1449 DRMP3_VSTORE(grbuf +
i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1)));
1450 vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0));
1451 DRMP3_VSTORE(grbuf + 14 -
i, DRMP3_VREV(vsum));
1456 float ovl = overlap[
i];
1457 float sum = co[
i]*g_twid9[9 +
i] + si[
i]*g_twid9[0 +
i];
1458 overlap[
i] = co[
i]*g_twid9[0 +
i] - si[
i]*g_twid9[9 +
i];
1459 grbuf[
i] = ovl*window[0 +
i] - sum*window[9 +
i];
1460 grbuf[17 -
i] = ovl*window[9 +
i] + sum*window[0 +
i];
1465 static void drmp3_L3_idct3(
float x0,
float x1,
float x2,
float *dst)
1467 float m1 = x1*0.86602540f;
1468 float a1 = x0 -
x2*0.5f;
1474 static void drmp3_L3_imdct12(
float *
x,
float *dst,
float *overlap)
1476 static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
1480 drmp3_L3_idct3(-
x[0],
x[6] +
x[3],
x[12] +
x[9], co);
1481 drmp3_L3_idct3(
x[15],
x[12] -
x[9],
x[6] -
x[3], si);
1484 for (
i = 0;
i < 3;
i++)
1486 float ovl = overlap[
i];
1487 float sum = co[
i]*g_twid3[3 +
i] + si[
i]*g_twid3[0 +
i];
1488 overlap[
i] = co[
i]*g_twid3[0 +
i] - si[
i]*g_twid3[3 +
i];
1489 dst[
i] = ovl*g_twid3[2 -
i] - sum*g_twid3[5 -
i];
1490 dst[5 -
i] = ovl*g_twid3[5 -
i] + sum*g_twid3[2 -
i];
1494 static void drmp3_L3_imdct_short(
float *grbuf,
float *overlap,
int nbands)
1496 for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
1499 memcpy(tmp, grbuf,
sizeof(tmp));
1500 memcpy(grbuf, overlap, 6*
sizeof(
float));
1501 drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
1502 drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
1503 drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
1507 static void drmp3_L3_change_sign(
float *grbuf)
1510 for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)
1511 for (
i = 1;
i < 18;
i += 2)
1512 grbuf[
i] = -grbuf[
i];
1515 static void drmp3_L3_imdct_gr(
float *grbuf,
float *overlap,
unsigned block_type,
unsigned n_long_bands)
1517 static const float g_mdct_window[2][18] = {
1518 { 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 },
1519 { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
1523 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
1524 grbuf += 18*n_long_bands;
1525 overlap += 9*n_long_bands;
1527 if (block_type == DRMP3_SHORT_BLOCK_TYPE)
1528 drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
1530 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands);
1533 static void drmp3_L3_save_reservoir(
drmp3dec *h, drmp3dec_scratch *
s)
1535 int pos = (
s->bs.pos + 7)/8
u;
1536 int remains =
s->bs.limit/8
u - pos;
1537 if (remains > DRMP3_MAX_BITRESERVOIR_BYTES)
1539 pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES;
1540 remains = DRMP3_MAX_BITRESERVOIR_BYTES;
1544 memmove(h->
reserv_buf,
s->maindata + pos, remains);
1549 static int drmp3_L3_restore_reservoir(
drmp3dec *h, drmp3_bs *bs, drmp3dec_scratch *
s,
int main_data_begin)
1551 int frame_bytes = (bs->limit - bs->pos)/8;
1552 int bytes_have = DRMP3_MIN(h->
reserv, main_data_begin);
1553 memcpy(
s->maindata, h->
reserv_buf + DRMP3_MAX(0, h->
reserv - main_data_begin), DRMP3_MIN(h->
reserv, main_data_begin));
1554 memcpy(
s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
1555 drmp3_bs_init(&
s->bs,
s->maindata, bytes_have + frame_bytes);
1556 return h->
reserv >= main_data_begin;
1559 static void drmp3_L3_decode(
drmp3dec *h, drmp3dec_scratch *
s, drmp3_L3_gr_info *gr_info,
int nch)
1563 for (ch = 0; ch < nch; ch++)
1565 int layer3gr_limit =
s->bs.pos + gr_info[ch].part_23_length;
1566 drmp3_L3_decode_scalefactors(h->
header,
s->ist_pos[ch], &
s->bs, gr_info + ch,
s->scf, ch);
1567 drmp3_L3_huffman(
s->grbuf[ch], &
s->bs, gr_info + ch,
s->scf, layer3gr_limit);
1570 if (DRMP3_HDR_TEST_I_STEREO(h->
header))
1572 drmp3_L3_intensity_stereo(
s->grbuf[0],
s->ist_pos[1], gr_info, h->
header);
1573 }
else if (DRMP3_HDR_IS_MS_STEREO(h->
header))
1575 drmp3_L3_midside_stereo(
s->grbuf[0], 576);
1578 for (ch = 0; ch < nch; ch++, gr_info++)
1581 int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (
int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(h->
header) == 2);
1583 if (gr_info->n_short_sfb)
1585 aa_bands = n_long_bands - 1;
1586 drmp3_L3_reorder(
s->grbuf[ch] + n_long_bands*18,
s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
1589 drmp3_L3_antialias(
s->grbuf[ch], aa_bands);
1590 drmp3_L3_imdct_gr(
s->grbuf[ch], h->
mdct_overlap[ch], gr_info->block_type, n_long_bands);
1591 drmp3_L3_change_sign(
s->grbuf[ch]);
1595 static void drmp3d_DCT_II(
float *grbuf,
int n)
1597 static const float g_sec[24] = {
1598 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
1602 if (drmp3_have_simd())
for (; k < n; k += 4)
1604 drmp3_f4
t[4][8], *
x;
1605 float *
y = grbuf + k;
1607 for (
x =
t[0],
i = 0;
i < 8;
i++,
x++)
1609 drmp3_f4 x0 = DRMP3_VLD(&
y[
i*18]);
1610 drmp3_f4 x1 = DRMP3_VLD(&
y[(15 -
i)*18]);
1611 drmp3_f4
x2 = DRMP3_VLD(&
y[(16 +
i)*18]);
1612 drmp3_f4 x3 = DRMP3_VLD(&
y[(31 -
i)*18]);
1613 drmp3_f4 t0 = DRMP3_VADD(x0, x3);
1614 drmp3_f4 t1 = DRMP3_VADD(x1,
x2);
1615 drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1,
x2), g_sec[3*
i + 0]);
1616 drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*
i + 1]);
1617 x[0] = DRMP3_VADD(t0, t1);
1618 x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*
i + 2]);
1619 x[16] = DRMP3_VADD(t3, t2);
1620 x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*
i + 2]);
1622 for (
x =
t[0],
i = 0;
i < 4;
i++,
x += 8)
1624 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;
1625 xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7);
1626 x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6);
1627 x6 = DRMP3_VSUB(
x2, x5);
x2 = DRMP3_VADD(
x2, x5);
1628 x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4);
1629 x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3);
1630 x3 = DRMP3_VSUB(x1,
x2); x1 = DRMP3_VADD(x1,
x2);
1631 x[0] = DRMP3_VADD(x0, x1);
1632 x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f);
1633 x5 = DRMP3_VADD(x5, x6);
1634 x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f);
1635 x7 = DRMP3_VADD(x7, xt);
1636 x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f);
1637 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
1638 x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f));
1639 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
1640 x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6);
1641 x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f);
1642 x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f);
1643 x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f);
1644 x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f);
1645 x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f);
1646 x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f);
1652 #define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
1654 #define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
1656 for (
i = 0;
i < 7;
i++,
y += 4*18)
1658 drmp3_f4
s = DRMP3_VADD(
t[3][
i],
t[3][
i + 1]);
1659 DRMP3_VSAVE2(0,
t[0][
i]);
1660 DRMP3_VSAVE2(1, DRMP3_VADD(
t[2][
i],
s));
1661 DRMP3_VSAVE2(2, DRMP3_VADD(
t[1][
i],
t[1][
i + 1]));
1662 DRMP3_VSAVE2(3, DRMP3_VADD(
t[2][1 +
i],
s));
1664 DRMP3_VSAVE2(0,
t[0][7]);
1665 DRMP3_VSAVE2(1, DRMP3_VADD(
t[2][7],
t[3][7]));
1666 DRMP3_VSAVE2(2,
t[1][7]);
1667 DRMP3_VSAVE2(3,
t[3][7]);
1670 #define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v)
1671 for (
i = 0;
i < 7;
i++,
y += 4*18)
1673 drmp3_f4
s = DRMP3_VADD(
t[3][
i],
t[3][
i + 1]);
1674 DRMP3_VSAVE4(0,
t[0][
i]);
1675 DRMP3_VSAVE4(1, DRMP3_VADD(
t[2][
i],
s));
1676 DRMP3_VSAVE4(2, DRMP3_VADD(
t[1][
i],
t[1][
i + 1]));
1677 DRMP3_VSAVE4(3, DRMP3_VADD(
t[2][1 +
i],
s));
1679 DRMP3_VSAVE4(0,
t[0][7]);
1680 DRMP3_VSAVE4(1, DRMP3_VADD(
t[2][7],
t[3][7]));
1681 DRMP3_VSAVE4(2,
t[1][7]);
1682 DRMP3_VSAVE4(3,
t[3][7]);
1686 #ifdef DR_MP3_ONLY_SIMD
1691 float t[4][8], *
x, *
y = grbuf + k;
1693 for (
x =
t[0],
i = 0;
i < 8;
i++,
x++)
1696 float x1 =
y[(15 -
i)*18];
1697 float x2 =
y[(16 +
i)*18];
1698 float x3 =
y[(31 -
i)*18];
1701 float t2 = (x1 -
x2)*g_sec[3*
i + 0];
1702 float t3 = (x0 - x3)*g_sec[3*
i + 1];
1704 x[8] = (t0 - t1)*g_sec[3*
i + 2];
1706 x[24] = (t3 - t2)*g_sec[3*
i + 2];
1708 for (
x =
t[0],
i = 0;
i < 4;
i++,
x += 8)
1710 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;
1711 xt = x0 - x7; x0 += x7;
1712 x7 = x1 - x6; x1 += x6;
1713 x6 =
x2 - x5;
x2 += x5;
1714 x5 = x3 - x4; x3 += x4;
1715 x4 = x0 - x3; x0 += x3;
1716 x3 = x1 -
x2; x1 +=
x2;
1718 x[4] = (x0 - x1)*0.70710677f;
1720 x6 = (x6 + x7)*0.70710677f;
1722 x3 = (x3 + x4)*0.70710677f;
1723 x5 -= x7*0.198912367f;
1724 x7 += x5*0.382683432f;
1725 x5 -= x7*0.198912367f;
1726 x0 = xt - x6; xt += x6;
1727 x[1] = (xt + x7)*0.50979561f;
1728 x[2] = (x4 + x3)*0.54119611f;
1729 x[3] = (x0 - x5)*0.60134488f;
1730 x[5] = (x0 + x5)*0.89997619f;
1731 x[6] = (x4 - x3)*1.30656302f;
1732 x[7] = (xt - x7)*2.56291556f;
1735 for (
i = 0;
i < 7;
i++,
y += 4*18)
1738 y[1*18] =
t[2][
i] +
t[3][
i] +
t[3][
i + 1];
1739 y[2*18] =
t[1][
i] +
t[1][
i + 1];
1740 y[3*18] =
t[2][
i + 1] +
t[3][
i] +
t[3][
i + 1];
1743 y[1*18] =
t[2][7] +
t[3][7];
1750 #ifndef DR_MP3_FLOAT_OUTPUT
1763 typedef float drmp3d_sample_t;
1765 static float drmp3d_scale_pcm(
float sample)
1767 return sample*(1.f/32768.f);
1771 static void drmp3d_synth_pair(drmp3d_sample_t *pcm,
int nch,
const float *
z)
1774 a = (
z[14*64] -
z[ 0]) * 29;
1775 a += (
z[ 1*64] +
z[13*64]) * 213;
1776 a += (
z[12*64] -
z[ 2*64]) * 459;
1777 a += (
z[ 3*64] +
z[11*64]) * 2037;
1778 a += (
z[10*64] -
z[ 4*64]) * 5153;
1779 a += (
z[ 5*64] +
z[ 9*64]) * 6574;
1780 a += (
z[ 8*64] -
z[ 6*64]) * 37489;
1781 a +=
z[ 7*64] * 75038;
1782 pcm[0] = drmp3d_scale_pcm(a);
1786 a +=
z[12*64] * 1567;
1787 a +=
z[10*64] * 9727;
1788 a +=
z[ 8*64] * 64019;
1789 a +=
z[ 6*64] * -9975;
1790 a +=
z[ 4*64] * -45;
1791 a +=
z[ 2*64] * 146;
1793 pcm[16*nch] = drmp3d_scale_pcm(a);
1796 static void drmp3d_synth(
float *xl, drmp3d_sample_t *dstl,
int nch,
float *lins)
1799 float *xr = xl + 576*(nch - 1);
1800 drmp3d_sample_t *dstr = dstl + (nch - 1);
1802 static const float g_win[] = {
1803 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
1804 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
1805 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
1806 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
1807 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
1808 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
1809 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
1810 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
1811 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
1812 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
1813 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
1814 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
1815 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
1816 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
1817 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
1819 float *zlin = lins + 15*64;
1820 const float *
w = g_win;
1822 zlin[4*15] = xl[18*16];
1823 zlin[4*15 + 1] = xr[18*16];
1824 zlin[4*15 + 2] = xl[0];
1825 zlin[4*15 + 3] = xr[0];
1827 zlin[4*31] = xl[1 + 18*16];
1828 zlin[4*31 + 1] = xr[1 + 18*16];
1829 zlin[4*31 + 2] = xl[1];
1830 zlin[4*31 + 3] = xr[1];
1832 drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
1833 drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
1834 drmp3d_synth_pair(dstl, nch, lins + 4*15);
1835 drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
1838 if (drmp3_have_simd())
for (
i = 14;
i >= 0;
i--)
1840 #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)]);
1841 #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)); }
1842 #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))); }
1843 #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))); }
1845 zlin[4*
i] = xl[18*(31 -
i)];
1846 zlin[4*
i + 1] = xr[18*(31 -
i)];
1847 zlin[4*
i + 2] = xl[1 + 18*(31 -
i)];
1848 zlin[4*
i + 3] = xr[1 + 18*(31 -
i)];
1849 zlin[4*
i + 64] = xl[1 + 18*(1 +
i)];
1850 zlin[4*
i + 64 + 1] = xr[1 + 18*(1 +
i)];
1851 zlin[4*
i - 64 + 2] = xl[18*(1 +
i)];
1852 zlin[4*
i - 64 + 3] = xr[18*(1 +
i)];
1854 DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7)
1857 #ifndef DR_MP3_FLOAT_OUTPUT
1859 static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
1860 static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
1861 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
1862 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
1863 dstr[(15 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 1);
1864 dstr[(17 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 5);
1865 dstl[(15 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 0);
1866 dstl[(17 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 4);
1867 dstr[(47 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 3);
1868 dstr[(49 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 7);
1869 dstl[(47 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 2);
1870 dstl[(49 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 6);
1872 int16x4_t pcma, pcmb;
1873 a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
1874 b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
1875 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
1876 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
1877 vst1_lane_s16(dstr + (15 -
i)*nch, pcma, 1);
1878 vst1_lane_s16(dstr + (17 +
i)*nch, pcmb, 1);
1879 vst1_lane_s16(dstl + (15 -
i)*nch, pcma, 0);
1880 vst1_lane_s16(dstl + (17 +
i)*nch, pcmb, 0);
1881 vst1_lane_s16(dstr + (47 -
i)*nch, pcma, 3);
1882 vst1_lane_s16(dstr + (49 +
i)*nch, pcmb, 3);
1883 vst1_lane_s16(dstl + (47 -
i)*nch, pcma, 2);
1884 vst1_lane_s16(dstl + (49 +
i)*nch, pcmb, 2);
1887 static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
1888 a = DRMP3_VMUL(a, g_scale);
1889 b = DRMP3_VMUL(b, g_scale);
1891 _mm_store_ss(dstr + (15 -
i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
1892 _mm_store_ss(dstr + (17 +
i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));
1893 _mm_store_ss(dstl + (15 -
i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));
1894 _mm_store_ss(dstl + (17 +
i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));
1895 _mm_store_ss(dstr + (47 -
i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));
1896 _mm_store_ss(dstr + (49 +
i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));
1897 _mm_store_ss(dstl + (47 -
i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
1898 _mm_store_ss(dstl + (49 +
i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));
1900 vst1q_lane_f32(dstr + (15 -
i)*nch, a, 1);
1901 vst1q_lane_f32(dstr + (17 +
i)*nch, b, 1);
1902 vst1q_lane_f32(dstl + (15 -
i)*nch, a, 0);
1903 vst1q_lane_f32(dstl + (17 +
i)*nch, b, 0);
1904 vst1q_lane_f32(dstr + (47 -
i)*nch, a, 3);
1905 vst1q_lane_f32(dstr + (49 +
i)*nch, b, 3);
1906 vst1q_lane_f32(dstl + (47 -
i)*nch, a, 2);
1907 vst1q_lane_f32(dstl + (49 +
i)*nch, b, 2);
1913 #ifdef DR_MP3_ONLY_SIMD
1916 for (
i = 14;
i >= 0;
i--)
1918 #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];
1919 #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; }
1920 #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; }
1921 #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; }
1924 zlin[4*
i] = xl[18*(31 -
i)];
1925 zlin[4*
i + 1] = xr[18*(31 -
i)];
1926 zlin[4*
i + 2] = xl[1 + 18*(31 -
i)];
1927 zlin[4*
i + 3] = xr[1 + 18*(31 -
i)];
1928 zlin[4*(
i + 16)] = xl[1 + 18*(1 +
i)];
1929 zlin[4*(
i + 16) + 1] = xr[1 + 18*(1 +
i)];
1930 zlin[4*(
i - 16) + 2] = xl[18*(1 +
i)];
1931 zlin[4*(
i - 16) + 3] = xr[18*(1 +
i)];
1933 DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7)
1935 dstr[(15 -
i)*nch] = drmp3d_scale_pcm(a[1]);
1936 dstr[(17 +
i)*nch] = drmp3d_scale_pcm(b[1]);
1937 dstl[(15 -
i)*nch] = drmp3d_scale_pcm(a[0]);
1938 dstl[(17 +
i)*nch] = drmp3d_scale_pcm(b[0]);
1939 dstr[(47 -
i)*nch] = drmp3d_scale_pcm(a[3]);
1940 dstr[(49 +
i)*nch] = drmp3d_scale_pcm(b[3]);
1941 dstl[(47 -
i)*nch] = drmp3d_scale_pcm(a[2]);
1942 dstl[(49 +
i)*nch] = drmp3d_scale_pcm(b[2]);
1947 static void drmp3d_synth_granule(
float *qmf_state,
float *grbuf,
int nbands,
int nch, drmp3d_sample_t *pcm,
float *lins)
1950 for (
i = 0;
i < nch;
i++)
1952 drmp3d_DCT_II(grbuf + 576*
i, nbands);
1955 memcpy(lins, qmf_state,
sizeof(
float)*15*64);
1957 for (
i = 0;
i < nbands;
i += 2)
1959 drmp3d_synth(grbuf +
i, pcm + 32*nch*
i, nch, lins +
i*64);
1961 #ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL
1964 for (
i = 0;
i < 15*64;
i += 2)
1966 qmf_state[
i] = lins[nbands*64 +
i];
1971 memcpy(qmf_state, lins + nbands*64,
sizeof(
float)*15*64);
1975 static int drmp3d_match_frame(
const drmp3_uint8 *hdr,
int mp3_bytes,
int frame_bytes)
1978 for (
i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++)
1980 i += drmp3_hdr_frame_bytes(hdr +
i, frame_bytes) + drmp3_hdr_padding(hdr +
i);
1981 if (
i + DRMP3_HDR_SIZE > mp3_bytes)
1983 if (!drmp3_hdr_compare(hdr, hdr +
i))
1989 static int drmp3d_find_frame(
const drmp3_uint8 *mp3,
int mp3_bytes,
int *free_format_bytes,
int *ptr_frame_bytes)
1992 for (
i = 0;
i < mp3_bytes - DRMP3_HDR_SIZE;
i++, mp3++)
1994 if (drmp3_hdr_valid(mp3))
1996 int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes);
1997 int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3);
1999 for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE &&
i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++)
2001 if (drmp3_hdr_compare(mp3, mp3 + k))
2003 int fb = k - drmp3_hdr_padding(mp3);
2004 int nextfb = fb + drmp3_hdr_padding(mp3 + k);
2005 if (
i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb))
2007 frame_and_padding = k;
2009 *free_format_bytes = fb;
2013 if ((frame_bytes &&
i + frame_and_padding <= mp3_bytes &&
2014 drmp3d_match_frame(mp3, mp3_bytes -
i, frame_bytes)) ||
2015 (!
i && frame_and_padding == mp3_bytes))
2017 *ptr_frame_bytes = frame_and_padding;
2020 *free_format_bytes = 0;
2023 *ptr_frame_bytes = 0;
2034 int i = 0, igr, frame_size = 0, success = 1;
2036 drmp3_bs bs_frame[1];
2037 drmp3dec_scratch scratch;
2039 if (mp3_bytes > 4 && dec->
header[0] == 0xff && drmp3_hdr_compare(dec->
header, mp3))
2041 frame_size = drmp3_hdr_frame_bytes(mp3, dec->
free_format_bytes) + drmp3_hdr_padding(mp3);
2042 if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size)))
2051 if (!frame_size ||
i + frame_size > mp3_bytes)
2059 memcpy(dec->
header, hdr, DRMP3_HDR_SIZE);
2061 info->
channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
2062 info->
hz = drmp3_hdr_sample_rate_hz(hdr);
2063 info->
layer = 4 - DRMP3_HDR_GET_LAYER(hdr);
2066 drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE);
2067 if (DRMP3_HDR_IS_CRC(hdr))
2069 drmp3_bs_get_bits(bs_frame, 16);
2072 if (info->
layer == 3)
2074 int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);
2075 if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
2080 success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
2081 if (success && pcm !=
NULL)
2083 for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm,
sizeof(drmp3d_sample_t)*576*info->
channels))
2085 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
2086 drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->
channels, info->
channels);
2087 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 18, info->
channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2090 drmp3_L3_save_reservoir(dec, &scratch);
2093 #ifdef DR_MP3_ONLY_MP3
2096 drmp3_L12_scale_info sci[1];
2099 return drmp3_hdr_frame_samples(hdr);
2102 drmp3_L12_read_scale_info(hdr, bs_frame, sci);
2104 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
2105 for (
i = 0, igr = 0; igr < 3; igr++)
2107 if (12 == (
i += drmp3_L12_dequantize_granule(scratch.grbuf[0] +
i, bs_frame, sci, info->
layer | 1)))
2110 drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
2111 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 12, info->
channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2112 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
2113 pcm = DRMP3_OFFSET_PTR(pcm,
sizeof(drmp3d_sample_t)*384*info->
channels);
2115 if (bs_frame->pos > bs_frame->limit)
2124 return success*drmp3_hdr_frame_samples(dec->
header);
2133 int aligned_count = num_samples & ~7;
2134 for(;
i < aligned_count;
i+=8)
2136 static const drmp3_f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f };
2137 drmp3_f4 a = DRMP3_VMUL(DRMP3_VLD(&in[
i ]), g_scale);
2138 drmp3_f4 b = DRMP3_VMUL(DRMP3_VLD(&in[
i+4]), g_scale);
2140 static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
2141 static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
2142 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
2143 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
2153 int16x4_t pcma, pcmb;
2154 a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
2155 b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
2156 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
2157 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
2158 vst1_lane_s16(out+
i , pcma, 0);
2159 vst1_lane_s16(out+
i+1, pcma, 1);
2160 vst1_lane_s16(out+
i+2, pcma, 2);
2161 vst1_lane_s16(out+
i+3, pcma, 3);
2162 vst1_lane_s16(out+
i+4, pcmb, 0);
2163 vst1_lane_s16(out+
i+5, pcmb, 1);
2164 vst1_lane_s16(out+
i+6, pcmb, 2);
2165 vst1_lane_s16(out+
i+7, pcmb, 3);
2169 for(;
i < num_samples;
i++)
2171 float sample = in[
i] * 32768.0f;
2174 else if (
sample <= -32767.5)
2194 #if defined(SIZE_MAX)
2195 #define DRMP3_SIZE_MAX SIZE_MAX
2197 #if defined(_WIN64) || defined(_LP64) || defined(__LP64__)
2198 #define DRMP3_SIZE_MAX ((drmp3_uint64)0xFFFFFFFFFFFFFFFF)
2200 #define DRMP3_SIZE_MAX 0xFFFFFFFF
2205 #ifndef DRMP3_SEEK_LEADING_MP3_FRAMES
2206 #define DRMP3_SEEK_LEADING_MP3_FRAMES 2
2211 #ifndef DRMP3_ASSERT
2213 #define DRMP3_ASSERT(expression) assert(expression)
2215 #ifndef DRMP3_COPY_MEMORY
2216 #define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
2218 #ifndef DRMP3_ZERO_MEMORY
2219 #define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
2221 #define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
2222 #ifndef DRMP3_MALLOC
2223 #define DRMP3_MALLOC(sz) malloc((sz))
2225 #ifndef DRMP3_REALLOC
2226 #define DRMP3_REALLOC(p, sz) realloc((p), (sz))
2229 #define DRMP3_FREE(p) free((p))
2232 #define drmp3_assert DRMP3_ASSERT
2233 #define drmp3_copy_memory DRMP3_COPY_MEMORY
2234 #define drmp3_zero_memory DRMP3_ZERO_MEMORY
2235 #define drmp3_zero_object DRMP3_ZERO_OBJECT
2236 #define drmp3_malloc DRMP3_MALLOC
2237 #define drmp3_realloc DRMP3_REALLOC
2239 #define drmp3_countof(x) (sizeof(x) / sizeof(x[0]))
2240 #define drmp3_max(x, y) (((x) > (y)) ? (x) : (y))
2241 #define drmp3_min(x, y) (((x) < (y)) ? (x) : (y))
2243 #define DRMP3_DATA_CHUNK_SIZE 16384
2245 static DRMP3_INLINE float drmp3_mix_f32(
float x,
float y,
float a)
2247 return x*(1-a) +
y*a;
2250 static void drmp3_blend_f32(
float* pOut,
float* pInA,
float* pInB,
float factor,
drmp3_uint32 channels)
2254 pOut[
i] = drmp3_mix_f32(pInA[
i], pInB[
i], factor);
2260 drmp3_assert(pSRC !=
NULL);
2261 drmp3_assert(pCache !=
NULL);
2263 pCache->
pSRC = pSRC;
2273 drmp3_assert(pCache !=
NULL);
2274 drmp3_assert(pCache->
pSRC !=
NULL);
2276 drmp3_assert(frameCount > 0);
2277 drmp3_assert(pFramesOut !=
NULL);
2281 while (frameCount > 0) {
2286 if (framesToReadFromMemory > framesRemainingInMemory) {
2287 framesToReadFromMemory = framesRemainingInMemory;
2293 totalFramesRead += framesToReadFromMemory;
2294 frameCount -= framesToReadFromMemory;
2295 if (frameCount == 0) {
2301 drmp3_assert(frameCount > 0);
2302 pFramesOut += framesToReadFromMemory *
channels;
2321 return totalFramesRead;
2334 drmp3_zero_object(pSRC);
2336 if (pConfig ==
NULL || onRead ==
NULL) {
2352 drmp3_src_cache_init(pSRC, &pSRC->
cache);
2363 if (sampleRateIn == 0) {
2378 if (sampleRateOut == 0) {
2390 if (pSRC ==
NULL || frameCount == 0 || pFramesOut ==
NULL) {
2412 return drmp3_src_read_frames_ex(pSRC, frameCount, pFramesOut,
DRMP3_FALSE);
2417 drmp3_assert(pSRC !=
NULL);
2418 drmp3_assert(frameCount > 0);
2419 drmp3_assert(pFramesOut !=
NULL);
2430 drmp3_assert(pSRC !=
NULL);
2431 drmp3_assert(frameCount > 0);
2432 drmp3_assert(pFramesOut !=
NULL);
2439 if (framesRead == 0) {
2446 if (framesRead == 0) {
2454 totalFramesRead = 0;
2455 while (frameCount > 0) {
2460 float* pPrevFrame = pSRC->
bin;
2463 drmp3_blend_f32((
float*)pFramesOut, pPrevFrame, pNextFrame, (
float)pSRC->
algo.
linear.alpha, pSRC->
config.
channels);
2471 for (
i = 0;
i < framesToReadFromClient; ++
i) {
2476 pPrevFrame[
j] = pNextFrame[
j];
2479 framesRead = drmp3_src_cache_read_frames(&pSRC->
cache, 1, pNextFrame);
2480 if (framesRead == 0) {
2500 totalFramesRead += 1;
2503 if (!pSRC->
algo.
linear.isNextFramesLoaded && (!flush || !pSRC->
algo.
linear.isPrevFramesLoaded)) {
2508 return totalFramesRead;
2512 static size_t drmp3__on_read(
drmp3* pMP3,
void* pBufferOut,
size_t bytesToRead)
2514 size_t bytesRead = pMP3->
onRead(pMP3->
pUserData, pBufferOut, bytesToRead);
2521 drmp3_assert(offset >= 0);
2538 if (offset <= 0x7FFFFFFF) {
2539 return drmp3__on_seek(pMP3, (
int)offset, origin);
2548 offset -= 0x7FFFFFFF;
2549 while (offset > 0) {
2550 if (offset <= 0x7FFFFFFF) {
2559 offset -= 0x7FFFFFFF;
2572 float* pFramesOutF = (
float*)pFramesOut;
2575 drmp3_assert(pMP3 !=
NULL);
2578 while (frameCount > 0) {
2581 drmp3d_sample_t* frames = (drmp3d_sample_t*)pMP3->
pcmFrames;
2582 #ifndef DR_MP3_FLOAT_OUTPUT
2598 pFramesOutF[0] =
sample * 0.5f;
2621 pFramesOutF[0] =
sample * 0.5f;
2632 totalFramesRead += 1;
2637 if (frameCount == 0) {
2647 if (drmp3_decode_next_frame(pMP3) == 0) {
2652 return totalFramesRead;
2658 drmp3_zero_object(&srcConfig);
2663 if (!drmp3_src_init(&srcConfig, drmp3_read_src, pMP3, &pMP3->
src)) {
2675 drmp3_assert(pMP3 !=
NULL);
2684 size_t leftoverDataSize;
2687 if (pMP3->
dataSize < DRMP3_DATA_CHUNK_SIZE) {
2695 if (pNewData ==
NULL) {
2699 pMP3->
pData = pNewData;
2703 if (bytesRead == 0) {
2731 if (pcmFramesRead > 0 || (info.
frame_bytes > 0 && discard)) {
2732 pcmFramesRead = drmp3_hdr_frame_samples(pMP3->
decoder.
header);
2746 drmp3_init_src(pMP3);
2761 if (pNewData ==
NULL) {
2765 pMP3->
pData = pNewData;
2770 if (bytesRead == 0) {
2779 return pcmFramesRead;
2784 drmp3_assert(pMP3 !=
NULL);
2793 drmp3_assert(pMP3 !=
NULL);
2795 pcmFrameCount = drmp3_decode_next_frame_ex(pMP3,
NULL);
2796 if (pcmFrameCount == 0) {
2805 return pcmFrameCount;
2813 drmp3_assert(pMP3 !=
NULL);
2814 drmp3_assert(onRead !=
NULL);
2820 if (pConfig !=
NULL) {
2823 drmp3_zero_object(&config);
2844 drmp3_init_src(pMP3);
2848 if (!drmp3_decode_next_frame(pMP3)) {
2858 if (pMP3 ==
NULL || onRead ==
NULL) {
2862 drmp3_zero_object(pMP3);
2863 return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pConfig);
2867 static size_t drmp3__on_read_memory(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
2870 size_t bytesRemaining;
2872 drmp3_assert(pMP3 !=
NULL);
2876 if (bytesToRead > bytesRemaining) {
2877 bytesToRead = bytesRemaining;
2880 if (bytesToRead > 0) {
2892 drmp3_assert(pMP3 !=
NULL);
2895 if (byteOffset > 0) {
2924 drmp3_zero_object(pMP3);
2926 if (pData ==
NULL || dataSize == 0) {
2934 return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pConfig);
2938 #ifndef DR_MP3_NO_STDIO
2941 static size_t drmp3__on_read_stdio(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
2943 return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);
2954 #if defined(_MSC_VER) && _MSC_VER >= 1400
2955 if (fopen_s(&pFile, filePath,
"rb") != 0) {
2959 pFile = fopen(filePath,
"rb");
2960 if (pFile ==
NULL) {
2965 return drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (
void*)pFile, pConfig);
2975 #ifndef DR_MP3_NO_STDIO
2976 if (pMP3->
onRead == drmp3__on_read_stdio) {
2992 if (pBufferOut ==
NULL) {
2994 while (framesToRead > 0) {
2997 if (framesToReadRightNow > framesToRead) {
2998 framesToReadRightNow = framesToRead;
3002 if (framesJustRead == 0) {
3006 framesToRead -= framesJustRead;
3007 totalFramesRead += framesJustRead;
3010 totalFramesRead = drmp3_src_read_frames_ex(&pMP3->
src, framesToRead, pBufferOut,
DRMP3_TRUE);
3014 return totalFramesRead;
3019 float tempF32[4096];
3029 drmp3_uint64 pcmFramesToReadThisIteration = (framesToRead - totalPCMFramesRead);
3030 if (pcmFramesToReadThisIteration > drmp3_countof(tempF32)/pMP3->
channels) {
3031 pcmFramesToReadThisIteration = drmp3_countof(tempF32)/pMP3->
channels;
3035 if (pcmFramesJustRead == 0) {
3040 pBufferOut += pcmFramesJustRead * pMP3->
channels;
3042 totalPCMFramesRead += pcmFramesJustRead;
3044 if (pcmFramesJustRead < pcmFramesToReadThisIteration) {
3049 return totalPCMFramesRead;
3052 void drmp3_reset(
drmp3* pMP3)
3054 drmp3_assert(pMP3 !=
NULL);
3075 drmp3_assert(pMP3 !=
NULL);
3088 float drmp3_get_cached_pcm_frame_count_from_src(
drmp3* pMP3)
3093 float drmp3_get_pcm_frames_remaining_in_mp3_frame(
drmp3* pMP3)
3097 return frameCountPreSRC * factor;
3125 while (frameOffset > maxFramesToReadAndDiscard) {
3126 float pcmFramesRemainingInCurrentMP3FrameF = drmp3_get_pcm_frames_remaining_in_mp3_frame(pMP3);
3128 if (frameOffset > pcmFramesRemainingInCurrentMP3Frame) {
3129 frameOffset -= pcmFramesRemainingInCurrentMP3Frame;
3138 if (pcmFrameCount == 0) {
3145 if (framesRead != frameOffset) {
3151 if (framesRead != frameOffset) {
3161 drmp3_assert(pMP3 !=
NULL);
3171 if (frameIndex < pMP3->currentPCMFrame) {
3173 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3179 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->
currentPCMFrame));
3186 drmp3_assert(pSeekPointIndex !=
NULL);
3188 *pSeekPointIndex = 0;
3190 if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) {
3195 for (iSeekPoint = 0; iSeekPoint < pMP3->
seekPointCount; ++iSeekPoint) {
3200 *pSeekPointIndex = iSeekPoint;
3213 drmp3_assert(pMP3 !=
NULL);
3218 if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) {
3219 seekPoint = pMP3->
pSeekPoints[priorSeekPointIndex];
3238 drmp3d_sample_t* pPCMFrames;
3243 pPCMFrames = (drmp3d_sample_t*)pMP3->
pcmFrames;
3247 pcmFramesReadPreSRC = drmp3_decode_next_frame_ex(pMP3, pPCMFrames,
DRMP3_TRUE);
3248 if (pcmFramesReadPreSRC == 0) {
3272 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames);
3281 if (frameIndex == 0) {
3282 return drmp3_seek_to_start_of_stream(pMP3);
3287 return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex);
3289 return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex);
3298 float totalPCMFrameCountFractionalPart;
3317 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3321 totalPCMFrameCount = 0;
3322 totalMP3FrameCount = 0;
3324 totalPCMFrameCountFractionalPart = 0;
3328 float pcmFramesInCurrentMP3FrameOutF;
3331 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3,
NULL,
DRMP3_FALSE);
3332 if (pcmFramesInCurrentMP3FrameIn == 0) {
3337 drmp3_assert(srcRatio > 0);
3339 pcmFramesInCurrentMP3FrameOutF = totalPCMFrameCountFractionalPart + (pcmFramesInCurrentMP3FrameIn / srcRatio);
3340 pcmFramesInCurrentMP3FrameOut = (
drmp3_uint32)pcmFramesInCurrentMP3FrameOutF;
3341 totalPCMFrameCountFractionalPart = pcmFramesInCurrentMP3FrameOutF - pcmFramesInCurrentMP3FrameOut;
3342 totalPCMFrameCount += pcmFramesInCurrentMP3FrameOut;
3343 totalMP3FrameCount += 1;
3347 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3355 if (pMP3FrameCount !=
NULL) {
3356 *pMP3FrameCount = totalMP3FrameCount;
3358 if (pPCMFrameCount !=
NULL) {
3359 *pPCMFrameCount = totalPCMFrameCount;
3372 return totalPCMFrameCount;
3382 return totalMP3FrameCount;
3385 void drmp3__accumulate_running_pcm_frame_count(
drmp3* pMP3,
drmp3_uint32 pcmFrameCountIn,
drmp3_uint64* pRunningPCMFrameCount,
float* pRunningPCMFrameCountFractionalPart)
3388 float pcmFrameCountOutF;
3392 drmp3_assert(srcRatio > 0);
3394 pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio);
3396 *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut;
3397 *pRunningPCMFrameCount += pcmFrameCountOut;
3404 } drmp3__seeking_mp3_frame_info;
3413 if (pMP3 ==
NULL || pSeekPointCount ==
NULL || pSeekPoints ==
NULL) {
3417 seekPointCount = *pSeekPointCount;
3418 if (seekPointCount == 0) {
3431 if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) {
3439 drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1];
3441 float runningPCMFrameCountFractionalPart = 0;
3446 if (seekPointCount > totalMP3FrameCount-1) {
3450 pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1);
3456 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3466 for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) {
3472 mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount;
3475 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3,
NULL,
DRMP3_FALSE);
3476 if (pcmFramesInCurrentMP3FrameIn == 0) {
3480 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
3487 nextTargetPCMFrame = 0;
3488 for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) {
3489 nextTargetPCMFrame += pcmFramesBetweenSeekPoints;
3492 if (nextTargetPCMFrame < runningPCMFrameCount) {
3494 pSeekPoints[iSeekPoint].
seekPosInBytes = mp3FrameInfo[0].bytePos;
3507 for (
i = 0;
i < drmp3_countof(mp3FrameInfo)-1; ++
i) {
3508 mp3FrameInfo[
i] = mp3FrameInfo[
i+1];
3513 mp3FrameInfo[drmp3_countof(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount;
3519 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3,
NULL,
DRMP3_TRUE);
3520 if (pcmFramesInCurrentMP3FrameIn == 0) {
3521 pSeekPoints[iSeekPoint].
seekPosInBytes = mp3FrameInfo[0].bytePos;
3528 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
3534 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3542 *pSeekPointCount = seekPointCount;
3552 if (seekPointCount == 0 || pSeekPoints ==
NULL) {
3570 float* pFrames =
NULL;
3573 drmp3_assert(pMP3 !=
NULL);
3578 if (framesJustRead == 0) {
3583 if (framesCapacity < totalFramesRead + framesJustRead) {
3587 framesCapacity *= 2;
3588 if (framesCapacity < totalFramesRead + framesJustRead) {
3589 framesCapacity = totalFramesRead + framesJustRead;
3592 newFramesBufferSize = framesCapacity*pMP3->
channels*
sizeof(float);
3593 if (newFramesBufferSize > DRMP3_SIZE_MAX) {
3597 pNewFrames = (
float*)drmp3_realloc(pFrames, (
size_t)newFramesBufferSize);
3598 if (pNewFrames ==
NULL) {
3603 pFrames = pNewFrames;
3606 drmp3_copy_memory(pFrames + totalFramesRead*pMP3->
channels, temp, (
size_t)(framesJustRead*pMP3->
channels*
sizeof(
float)));
3607 totalFramesRead += framesJustRead;
3610 if (framesJustRead != framesToReadRightNow) {
3615 if (pConfig !=
NULL) {
3622 if (pTotalFrameCount) {
3623 *pTotalFrameCount = totalFramesRead;
3636 drmp3_assert(pMP3 !=
NULL);
3641 if (framesJustRead == 0) {
3646 if (framesCapacity < totalFramesRead + framesJustRead) {
3650 framesCapacity *= 2;
3651 if (framesCapacity < totalFramesRead + framesJustRead) {
3652 framesCapacity = totalFramesRead + framesJustRead;
3656 if (newFramesBufferSize > DRMP3_SIZE_MAX) {
3660 pNewFrames = (
drmp3_int16*)drmp3_realloc(pFrames, (
size_t)newFramesBufferSize);
3661 if (pNewFrames ==
NULL) {
3666 pFrames = pNewFrames;
3670 totalFramesRead += framesJustRead;
3673 if (framesJustRead != framesToReadRightNow) {
3678 if (pConfig !=
NULL) {
3685 if (pTotalFrameCount) {
3686 *pTotalFrameCount = totalFramesRead;
3696 if (!
drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig)) {
3700 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
3706 if (!
drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig)) {
3710 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
3721 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
3731 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
3735 #ifndef DR_MP3_NO_STDIO
3743 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
3753 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);