93#define DRMP3_STRINGIFY(x) #x
94#define DRMP3_XSTRINGIFY(x) DRMP3_STRINGIFY(x)
96#define DRMP3_VERSION_MAJOR 0
97#define DRMP3_VERSION_MINOR 6
98#define DRMP3_VERSION_REVISION 26
99#define DRMP3_VERSION_STRING DRMP3_XSTRINGIFY(DRMP3_VERSION_MAJOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_MINOR) "." DRMP3_XSTRINGIFY(DRMP3_VERSION_REVISION)
114 #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
115 #pragma GCC diagnostic push
116 #pragma GCC diagnostic ignored "-Wlong-long"
117 #if defined(__clang__)
118 #pragma GCC diagnostic ignored "-Wc++11-long-long"
123 #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
124 #pragma GCC diagnostic pop
127#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
137#if !defined(DRMP3_API)
138 #if defined(DRMP3_DLL)
140 #define DRMP3_DLL_IMPORT __declspec(dllimport)
141 #define DRMP3_DLL_EXPORT __declspec(dllexport)
142 #define DRMP3_DLL_PRIVATE static
144 #if defined(__GNUC__) && __GNUC__ >= 4
145 #define DRMP3_DLL_IMPORT __attribute__((visibility("default")))
146 #define DRMP3_DLL_EXPORT __attribute__((visibility("default")))
147 #define DRMP3_DLL_PRIVATE __attribute__((visibility("hidden")))
149 #define DRMP3_DLL_IMPORT
150 #define DRMP3_DLL_EXPORT
151 #define DRMP3_DLL_PRIVATE static
155 #if defined(DR_MP3_IMPLEMENTATION) || defined(DRMP3_IMPLEMENTATION)
156 #define DRMP3_API DRMP3_DLL_EXPORT
158 #define DRMP3_API DRMP3_DLL_IMPORT
160 #define DRMP3_PRIVATE DRMP3_DLL_PRIVATE
162 #define DRMP3_API extern
163 #define DRMP3_PRIVATE static
168#define DRMP3_SUCCESS 0
169#define DRMP3_ERROR -1
170#define DRMP3_INVALID_ARGS -2
171#define DRMP3_INVALID_OPERATION -3
172#define DRMP3_OUT_OF_MEMORY -4
173#define DRMP3_OUT_OF_RANGE -5
174#define DRMP3_ACCESS_DENIED -6
175#define DRMP3_DOES_NOT_EXIST -7
176#define DRMP3_ALREADY_EXISTS -8
177#define DRMP3_TOO_MANY_OPEN_FILES -9
178#define DRMP3_INVALID_FILE -10
179#define DRMP3_TOO_BIG -11
180#define DRMP3_PATH_TOO_LONG -12
181#define DRMP3_NAME_TOO_LONG -13
182#define DRMP3_NOT_DIRECTORY -14
183#define DRMP3_IS_DIRECTORY -15
184#define DRMP3_DIRECTORY_NOT_EMPTY -16
185#define DRMP3_END_OF_FILE -17
186#define DRMP3_NO_SPACE -18
187#define DRMP3_BUSY -19
188#define DRMP3_IO_ERROR -20
189#define DRMP3_INTERRUPT -21
190#define DRMP3_UNAVAILABLE -22
191#define DRMP3_ALREADY_IN_USE -23
192#define DRMP3_BAD_ADDRESS -24
193#define DRMP3_BAD_SEEK -25
194#define DRMP3_BAD_PIPE -26
195#define DRMP3_DEADLOCK -27
196#define DRMP3_TOO_MANY_LINKS -28
197#define DRMP3_NOT_IMPLEMENTED -29
198#define DRMP3_NO_MESSAGE -30
199#define DRMP3_BAD_MESSAGE -31
200#define DRMP3_NO_DATA_AVAILABLE -32
201#define DRMP3_INVALID_DATA -33
202#define DRMP3_TIMEOUT -34
203#define DRMP3_NO_NETWORK -35
204#define DRMP3_NOT_UNIQUE -36
205#define DRMP3_NOT_SOCKET -37
206#define DRMP3_NO_ADDRESS -38
207#define DRMP3_BAD_PROTOCOL -39
208#define DRMP3_PROTOCOL_UNAVAILABLE -40
209#define DRMP3_PROTOCOL_NOT_SUPPORTED -41
210#define DRMP3_PROTOCOL_FAMILY_NOT_SUPPORTED -42
211#define DRMP3_ADDRESS_FAMILY_NOT_SUPPORTED -43
212#define DRMP3_SOCKET_NOT_SUPPORTED -44
213#define DRMP3_CONNECTION_RESET -45
214#define DRMP3_ALREADY_CONNECTED -46
215#define DRMP3_NOT_CONNECTED -47
216#define DRMP3_CONNECTION_REFUSED -48
217#define DRMP3_NO_HOST -49
218#define DRMP3_IN_PROGRESS -50
219#define DRMP3_CANCELLED -51
220#define DRMP3_MEMORY_ALREADY_MAPPED -52
221#define DRMP3_AT_END -53
224#define DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152
225#define DRMP3_MAX_SAMPLES_PER_FRAME (DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2)
228 #define DRMP3_INLINE __forceinline
229#elif defined(__GNUC__)
237 #if defined(__STRICT_ANSI__)
238 #define DRMP3_INLINE __inline__ __attribute__((always_inline))
240 #define DRMP3_INLINE inline __attribute__((always_inline))
242#elif defined(__WATCOMC__)
243 #define DRMP3_INLINE __inline
310typedef size_t (*
drmp3_read_proc)(
void* pUserData,
void* pBufferOut,
size_t bytesToRead);
397#ifndef DR_MP3_NO_STDIO
490#ifndef DR_MP3_NO_STDIO
518#if defined(DR_MP3_IMPLEMENTATION) || defined(DRMP3_IMPLEMENTATION)
547#if defined(__TINYC__)
548#define DR_MP3_NO_SIMD
551#define DRMP3_OFFSET_PTR(p, offset) ((void*)((drmp3_uint8*)(p) + (offset)))
553#define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE 2304
554#ifndef DRMP3_MAX_FRAME_SYNC_MATCHES
555#define DRMP3_MAX_FRAME_SYNC_MATCHES 10
558#define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES DRMP3_MAX_FREE_FORMAT_FRAME_SIZE
560#define DRMP3_MAX_BITRESERVOIR_BYTES 511
561#define DRMP3_SHORT_BLOCK_TYPE 2
562#define DRMP3_STOP_BLOCK_TYPE 3
563#define DRMP3_MODE_MONO 3
564#define DRMP3_MODE_JOINT_STEREO 1
565#define DRMP3_HDR_SIZE 4
566#define DRMP3_HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0)
567#define DRMP3_HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60)
568#define DRMP3_HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0)
569#define DRMP3_HDR_IS_CRC(h) (!((h[1]) & 1))
570#define DRMP3_HDR_TEST_PADDING(h) ((h[2]) & 0x2)
571#define DRMP3_HDR_TEST_MPEG1(h) ((h[1]) & 0x8)
572#define DRMP3_HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10)
573#define DRMP3_HDR_TEST_I_STEREO(h) ((h[3]) & 0x10)
574#define DRMP3_HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20)
575#define DRMP3_HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3)
576#define DRMP3_HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3)
577#define DRMP3_HDR_GET_LAYER(h) (((h[1]) >> 1) & 3)
578#define DRMP3_HDR_GET_BITRATE(h) ((h[2]) >> 4)
579#define DRMP3_HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3)
580#define DRMP3_HDR_GET_MY_SAMPLE_RATE(h) (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)
581#define DRMP3_HDR_IS_FRAME_576(h) ((h[1] & 14) == 2)
582#define DRMP3_HDR_IS_LAYER_1(h) ((h[1] & 6) == 6)
584#define DRMP3_BITS_DEQUANTIZER_OUT -1
585#define DRMP3_MAX_SCF (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210)
586#define DRMP3_MAX_SCFI ((DRMP3_MAX_SCF + 3) & ~3)
588#define DRMP3_MIN(a, b) ((a) > (b) ? (b) : (a))
589#define DRMP3_MAX(a, b) ((a) < (b) ? (b) : (a))
591#if !defined(DR_MP3_NO_SIMD)
593#if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64))
595#define DR_MP3_ONLY_SIMD
598#if ((defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
602#include <emmintrin.h>
603#define DRMP3_HAVE_SSE 1
604#define DRMP3_HAVE_SIMD 1
605#define DRMP3_VSTORE _mm_storeu_ps
606#define DRMP3_VLD _mm_loadu_ps
607#define DRMP3_VSET _mm_set1_ps
608#define DRMP3_VADD _mm_add_ps
609#define DRMP3_VSUB _mm_sub_ps
610#define DRMP3_VMUL _mm_mul_ps
611#define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))
612#define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))
613#define DRMP3_VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s))
614#define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))
615typedef __m128 drmp3_f4;
616#if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD)
617#define drmp3_cpuid __cpuid
619static __inline__
__attribute__((always_inline))
void drmp3_cpuid(
int CPUInfo[],
const int InfoType)
622 __asm__ __volatile__(
623#
if defined(__x86_64__)
633 :
"=a" (CPUInfo[0]),
"=r" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
636 __asm__ __volatile__(
638 :
"=a" (CPUInfo[0]),
"=b" (CPUInfo[1]),
"=c" (CPUInfo[2]),
"=d" (CPUInfo[3])
643static int drmp3_have_simd(
void)
645#ifdef DR_MP3_ONLY_SIMD
648 static int g_have_simd;
651 static int g_counter;
652 if (g_counter++ > 100)
657 drmp3_cpuid(CPUInfo, 0);
660 drmp3_cpuid(CPUInfo, 1);
661 g_have_simd = (CPUInfo[3] & (1 << 26)) + 1;
662 return g_have_simd - 1;
666 return g_have_simd - 1;
669#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)
671#define DRMP3_HAVE_SSE 0
672#define DRMP3_HAVE_SIMD 1
673#define DRMP3_VSTORE vst1q_f32
674#define DRMP3_VLD vld1q_f32
675#define DRMP3_VSET vmovq_n_f32
676#define DRMP3_VADD vaddq_f32
677#define DRMP3_VSUB vsubq_f32
678#define DRMP3_VMUL vmulq_f32
679#define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y)
680#define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y)
681#define DRMP3_VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s))
682#define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))
683typedef float32x4_t drmp3_f4;
684static int drmp3_have_simd(
void)
689#define DRMP3_HAVE_SSE 0
690#define DRMP3_HAVE_SIMD 0
691#ifdef DR_MP3_ONLY_SIMD
692#error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled
698#define DRMP3_HAVE_SIMD 0
702#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64)
703#define DRMP3_HAVE_ARMV6 1
707 __asm__ (
"ssat %0, #16, %1" :
"=r"(
x) :
"r"(
a));
711#define DRMP3_HAVE_ARMV6 0
724 drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64];
725} drmp3_L12_scale_info;
729 drmp3_uint8 tab_offset, code_tab_width, band_count;
730} drmp3_L12_subband_alloc;
735 drmp3_uint16 part_23_length, big_values, scalefac_compress;
736 drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
737 drmp3_uint8 table_select[3], region_count[3], subblock_gain[3];
738 drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi;
744 drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES];
745 drmp3_L3_gr_info gr_info[4];
746 float grbuf[2][576], scf[40], syn[18 + 15][2*32];
750static void drmp3_bs_init(drmp3_bs *bs,
const drmp3_uint8 *
data,
int bytes)
762 if ((bs->pos +=
n) > bs->limit)
764 next = *
p++ & (255 >>
s);
765 while ((shl -= 8) > 0)
767 cache |= next << shl;
770 return cache | (next >> -shl);
775 return h[0] == 0xff &&
776 ((
h[1] & 0xF0) == 0xf0 || (
h[1] & 0xFE) == 0xe2) &&
777 (DRMP3_HDR_GET_LAYER(
h) != 0) &&
778 (DRMP3_HDR_GET_BITRATE(
h) != 15) &&
779 (DRMP3_HDR_GET_SAMPLE_RATE(
h) != 3);
784 return drmp3_hdr_valid(h2) &&
785 ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
786 ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
787 !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2));
790static unsigned drmp3_hdr_bitrate_kbps(
const drmp3_uint8 *
h)
793 { { 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 } },
794 { { 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 } },
796 return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(
h)][DRMP3_HDR_GET_LAYER(
h) - 1][DRMP3_HDR_GET_BITRATE(
h)];
799static unsigned drmp3_hdr_sample_rate_hz(
const drmp3_uint8 *
h)
801 static const unsigned g_hz[3] = { 44100, 48000, 32000 };
802 return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(
h)] >> (
int)!DRMP3_HDR_TEST_MPEG1(
h) >> (
int)!DRMP3_HDR_TEST_NOT_MPEG25(
h);
805static unsigned drmp3_hdr_frame_samples(
const drmp3_uint8 *
h)
807 return DRMP3_HDR_IS_LAYER_1(
h) ? 384 : (1152 >> (
int)DRMP3_HDR_IS_FRAME_576(
h));
810static int drmp3_hdr_frame_bytes(
const drmp3_uint8 *
h,
int free_format_size)
812 int frame_bytes = drmp3_hdr_frame_samples(
h)*drmp3_hdr_bitrate_kbps(
h)*125/drmp3_hdr_sample_rate_hz(
h);
813 if (DRMP3_HDR_IS_LAYER_1(
h))
817 return frame_bytes ? frame_bytes : free_format_size;
822 return DRMP3_HDR_TEST_PADDING(
h) ? (DRMP3_HDR_IS_LAYER_1(
h) ? 4 : 1) : 0;
825#ifndef DR_MP3_ONLY_MP3
826static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(
const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci)
828 const drmp3_L12_subband_alloc *alloc;
829 int mode = DRMP3_HDR_GET_STEREO_MODE(hdr);
830 int nbands, stereo_bands = (
mode == DRMP3_MODE_MONO) ? 0 : (
mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
832 if (DRMP3_HDR_IS_LAYER_1(hdr))
834 static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };
837 }
else if (!DRMP3_HDR_TEST_MPEG1(hdr))
839 static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
840 alloc = g_alloc_L2M2;
844 static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
845 int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr);
846 unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (
int)(
mode != DRMP3_MODE_MONO);
852 alloc = g_alloc_L2M1;
856 static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
857 alloc = g_alloc_L2M1_lowrate;
858 nbands = sample_rate_idx == 2 ? 12 : 8;
859 }
else if (kbps >= 96 && sample_rate_idx != 1)
866 sci->stereo_bands = (
drmp3_uint8)DRMP3_MIN(stereo_bands, nbands);
871static void drmp3_L12_read_scalefactors(drmp3_bs *bs,
drmp3_uint8 *pba,
drmp3_uint8 *scfcod,
int bands,
float *scf)
873 static const float g_deq_L12[18*3] = {
874#define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
875 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)
878 for (
i = 0;
i < bands;
i++)
882 int mask = ba ? 4 + ((19 >> scfcod[
i]) & 3) : 0;
883 for (
m = 4;
m;
m >>= 1)
887 int b = drmp3_bs_get_bits(bs, 6);
888 s = g_deq_L12[ba*3 - 6 +
b % 3]*(
int)(1 << 21 >>
b/3);
895static void drmp3_L12_read_scale_info(
const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci)
898 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
899 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
900 0,17,18, 3,19,4,5,16,
902 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
903 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
904 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
906 const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci);
908 int i,
k = 0, ba_bits = 0;
909 const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab;
911 for (
i = 0;
i < sci->total_bands;
i++)
916 k += subband_alloc->band_count;
917 ba_bits = subband_alloc->code_tab_width;
918 ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
921 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
922 sci->bitalloc[2*
i] = ba;
925 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
927 sci->bitalloc[2*
i + 1] = sci->stereo_bands ? ba : 0;
930 for (
i = 0;
i < 2*sci->total_bands;
i++)
932 sci->scfcod[
i] = (
drmp3_uint8)(sci->bitalloc[
i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6);
935 drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
937 for (
i = sci->stereo_bands;
i < sci->total_bands;
i++)
939 sci->bitalloc[2*
i + 1] = 0;
943static int drmp3_L12_dequantize_granule(
float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci,
int group_size)
945 int i,
j,
k, choff = 576;
946 for (
j = 0;
j < 4;
j++)
948 float *dst = grbuf + group_size*
j;
949 for (
i = 0;
i < 2*sci->total_bands;
i++)
951 int ba = sci->bitalloc[
i];
956 int half = (1 << (ba - 1)) - 1;
957 for (
k = 0;
k < group_size;
k++)
959 dst[
k] = (float)((
int)drmp3_bs_get_bits(bs, ba) - half);
963 unsigned mod = (2 << (ba - 17)) + 1;
964 unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3));
965 for (
k = 0;
k < group_size;
k++,
code /= mod)
967 dst[
k] = (float)((
int)(
code % mod - mod/2));
978static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci,
const float *scf,
float *dst)
981 memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*
sizeof(
float));
982 for (
i = 0;
i < sci->total_bands;
i++, dst += 18, scf += 6)
984 for (
k = 0;
k < 12;
k++)
986 dst[
k + 0] *= scf[0];
987 dst[
k + 576] *= scf[3];
993static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr,
const drmp3_uint8 *hdr)
996 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
997 { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
998 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
999 { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
1000 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
1001 { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
1002 { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
1003 { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
1006 { 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 },
1007 { 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 },
1008 { 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 },
1009 { 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 },
1010 { 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 },
1011 { 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 },
1012 { 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 },
1013 { 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 }
1016 { 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 },
1017 { 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 },
1018 { 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 },
1019 { 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 },
1020 { 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 },
1021 { 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 },
1022 { 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 },
1023 { 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 }
1026 unsigned tables, scfsi = 0;
1027 int main_data_begin, part_23_sum = 0;
1028 int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
1029 int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
1031 if (DRMP3_HDR_TEST_MPEG1(hdr))
1034 main_data_begin = drmp3_bs_get_bits(bs, 9);
1035 scfsi = drmp3_bs_get_bits(bs, 7 + gr_count);
1038 main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;
1043 if (DRMP3_HDR_IS_MONO(hdr))
1047 gr->part_23_length = (
drmp3_uint16)drmp3_bs_get_bits(bs, 12);
1048 part_23_sum += gr->part_23_length;
1049 gr->big_values = (
drmp3_uint16)drmp3_bs_get_bits(bs, 9);
1050 if (gr->big_values > 288)
1054 gr->global_gain = (
drmp3_uint8)drmp3_bs_get_bits(bs, 8);
1055 gr->scalefac_compress = (
drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);
1056 gr->sfbtab = g_scf_long[sr_idx];
1057 gr->n_long_sfb = 22;
1058 gr->n_short_sfb = 0;
1059 if (drmp3_bs_get_bits(bs, 1))
1061 gr->block_type = (
drmp3_uint8)drmp3_bs_get_bits(bs, 2);
1062 if (!gr->block_type)
1066 gr->mixed_block_flag = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
1067 gr->region_count[0] = 7;
1068 gr->region_count[1] = 255;
1069 if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE)
1072 if (!gr->mixed_block_flag)
1074 gr->region_count[0] = 8;
1075 gr->sfbtab = g_scf_short[sr_idx];
1077 gr->n_short_sfb = 39;
1080 gr->sfbtab = g_scf_mixed[sr_idx];
1081 gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;
1082 gr->n_short_sfb = 30;
1085 tables = drmp3_bs_get_bits(bs, 10);
1087 gr->subblock_gain[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1088 gr->subblock_gain[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1089 gr->subblock_gain[2] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1093 gr->mixed_block_flag = 0;
1094 tables = drmp3_bs_get_bits(bs, 15);
1095 gr->region_count[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 4);
1096 gr->region_count[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1097 gr->region_count[2] = 255;
1099 gr->table_select[0] = (
drmp3_uint8)(tables >> 10);
1100 gr->table_select[1] = (
drmp3_uint8)((tables >> 5) & 31);
1101 gr->table_select[2] = (
drmp3_uint8)((tables) & 31);
1102 gr->preflag = (
drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));
1103 gr->scalefac_scale = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
1104 gr->count1_table = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
1108 }
while(--gr_count);
1110 if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
1115 return main_data_begin;
1121 for (
i = 0;
i < 4 && scf_count[
i];
i++, scfsi *= 2)
1123 int cnt = scf_count[
i];
1126 memcpy(scf, ist_pos, cnt);
1129 int bits = scf_size[
i];
1132 memset(scf, 0, cnt);
1133 memset(ist_pos, 0, cnt);
1136 int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
1137 for (
k = 0;
k < cnt;
k++)
1139 int s = drmp3_bs_get_bits(bitbuf, bits);
1148 scf[0] = scf[1] = scf[2] = 0;
1151static float drmp3_L3_ldexp_q2(
float y,
int exp_q2)
1153 static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
1157 e = DRMP3_MIN(30*4, exp_q2);
1158 y *= g_expfrac[
e & 3]*(1 << 30 >> (
e >> 2));
1159 }
while ((exp_q2 -=
e) > 0);
1163static 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)
1165 static const drmp3_uint8 g_scf_partitions[3][28] = {
1166 { 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 },
1167 { 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 },
1168 { 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 }
1170 const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
1172 int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
1175 if (DRMP3_HDR_TEST_MPEG1(hdr))
1177 static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
1178 int part = g_scfc_decode[gr->scalefac_compress];
1179 scf_size[1] = scf_size[0] = (
drmp3_uint8)(part >> 2);
1180 scf_size[3] = scf_size[2] = (
drmp3_uint8)(part & 3);
1183 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 };
1184 int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch;
1185 sfc = gr->scalefac_compress >> ist;
1186 for (
k = ist*3*4; sfc >= 0; sfc -= modprod,
k += 4)
1188 for (modprod = 1,
i = 3;
i >= 0;
i--)
1191 modprod *= g_mod[
k +
i];
1197 drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
1199 if (gr->n_short_sfb)
1201 int sh = 3 - scf_shift;
1202 for (
i = 0;
i < gr->n_short_sfb;
i += 3)
1204 iscf[gr->n_long_sfb +
i + 0] = (
drmp3_uint8)(iscf[gr->n_long_sfb +
i + 0] + (gr->subblock_gain[0] << sh));
1205 iscf[gr->n_long_sfb +
i + 1] = (
drmp3_uint8)(iscf[gr->n_long_sfb +
i + 1] + (gr->subblock_gain[1] << sh));
1206 iscf[gr->n_long_sfb +
i + 2] = (
drmp3_uint8)(iscf[gr->n_long_sfb +
i + 2] + (gr->subblock_gain[2] << sh));
1208 }
else if (gr->preflag)
1210 static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
1211 for (
i = 0;
i < 10;
i++)
1217 gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);
1218 gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4), DRMP3_MAX_SCFI - gain_exp);
1219 for (
i = 0;
i < (
int)(gr->n_long_sfb + gr->n_short_sfb);
i++)
1221 scf[
i] = drmp3_L3_ldexp_q2(gain, iscf[
i] << scf_shift);
1225static const float g_drmp3_pow43[129 + 16] = {
1226 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,
1227 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
1230static float drmp3_L3_pow_43(
int x)
1233 int sign, mult = 256;
1237 return g_drmp3_pow43[16 +
x];
1247 frac = (float)((
x & 63) - sign) / ((
x & ~63) +
sign);
1248 return g_drmp3_pow43[16 + ((
x +
sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
1251static void drmp3_L3_huffman(
float *dst, drmp3_bs *bs,
const drmp3_L3_gr_info *gr_info,
const float *scf,
int layer3gr_limit)
1253 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,
1254 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,
1255 -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,
1256 -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,
1257 -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,
1258 -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,
1259 -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,
1260 -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,
1261 -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,
1262 -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,
1263 -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,
1264 -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,
1265 -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,
1266 -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,
1267 -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,
1268 -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 };
1269 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};
1270 static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
1271 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 };
1272 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 };
1274#define DRMP3_PEEK_BITS(n) (bs_cache >> (32 - n))
1275#define DRMP3_FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); }
1276#define DRMP3_CHECK_BITS while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
1277#define DRMP3_BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
1280 int ireg = 0, big_val_cnt = gr_info->big_values;
1282 const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8;
1283 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);
1284 int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
1287 while (big_val_cnt > 0)
1289 int tab_num = gr_info->table_select[ireg];
1290 int sfb_cnt = gr_info->region_count[ireg++];
1292 int linbits = g_linbits[tab_num];
1298 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1303 int leaf =
codebook[DRMP3_PEEK_BITS(
w)];
1306 DRMP3_FLUSH_BITS(
w);
1308 leaf =
codebook[DRMP3_PEEK_BITS(
w) - (leaf >> 3)];
1310 DRMP3_FLUSH_BITS(leaf >> 8);
1314 int lsb = leaf & 0x0F;
1317 lsb += DRMP3_PEEK_BITS(linbits);
1318 DRMP3_FLUSH_BITS(linbits);
1320 *dst = one*drmp3_L3_pow_43(lsb)*((
drmp3_int32)bs_cache < 0 ? -1: 1);
1323 *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
1325 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1328 }
while (--pairs_to_decode);
1329 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1335 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1340 int leaf =
codebook[DRMP3_PEEK_BITS(
w)];
1343 DRMP3_FLUSH_BITS(
w);
1345 leaf =
codebook[DRMP3_PEEK_BITS(
w) - (leaf >> 3)];
1347 DRMP3_FLUSH_BITS(leaf >> 8);
1351 int lsb = leaf & 0x0F;
1352 *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
1353 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1356 }
while (--pairs_to_decode);
1357 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1361 for (np = 1 - big_val_cnt;; dst += 4)
1363 const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
1364 int leaf = codebook_count1[DRMP3_PEEK_BITS(4)];
1367 leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
1369 DRMP3_FLUSH_BITS(leaf & 7);
1370 if (DRMP3_BSPOS > layer3gr_limit)
1374#define DRMP3_RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }
1375#define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) }
1376 DRMP3_RELOAD_SCALEFACTOR;
1377 DRMP3_DEQ_COUNT1(0);
1378 DRMP3_DEQ_COUNT1(1);
1379 DRMP3_RELOAD_SCALEFACTOR;
1380 DRMP3_DEQ_COUNT1(2);
1381 DRMP3_DEQ_COUNT1(3);
1385 bs->pos = layer3gr_limit;
1388static void drmp3_L3_midside_stereo(
float *
left,
int n)
1393 if (drmp3_have_simd())
for (;
i <
n - 3;
i += 4)
1395 drmp3_f4 vl = DRMP3_VLD(
left +
i);
1396 drmp3_f4 vr = DRMP3_VLD(
right +
i);
1397 DRMP3_VSTORE(
left +
i, DRMP3_VADD(vl, vr));
1398 DRMP3_VSTORE(
right +
i, DRMP3_VSUB(vl, vr));
1410static void drmp3_L3_intensity_stereo_band(
float *
left,
int n,
float kl,
float kr)
1413 for (
i = 0;
i <
n;
i++)
1420static void drmp3_L3_stereo_top_band(
const float *
right,
const drmp3_uint8 *sfb,
int nbands,
int max_band[3])
1424 max_band[0] = max_band[1] = max_band[2] = -1;
1426 for (
i = 0;
i < nbands;
i++)
1428 for (
k = 0;
k < sfb[
i];
k += 2)
1432 max_band[
i % 3] =
i;
1442 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 };
1443 unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;
1445 for (
i = 0; sfb[
i];
i++)
1447 unsigned ipos = ist_pos[
i];
1448 if ((
int)
i > max_band[
i % 3] && ipos < max_pos)
1450 float kl, kr,
s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
1451 if (DRMP3_HDR_TEST_MPEG1(hdr))
1454 kr = g_pan[2*ipos + 1];
1458 kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
1465 drmp3_L3_intensity_stereo_band(
left, sfb[
i], kl*
s, kr*
s);
1466 }
else if (DRMP3_HDR_TEST_MS_STEREO(hdr))
1468 drmp3_L3_midside_stereo(
left, sfb[
i]);
1476 int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
1477 int i, max_blocks = gr->n_short_sfb ? 3 : 1;
1479 drmp3_L3_stereo_top_band(
left + 576, gr->sfbtab, n_sfb, max_band);
1482 max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]);
1484 for (
i = 0;
i < max_blocks;
i++)
1486 int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;
1487 int itop = n_sfb - max_blocks +
i;
1488 int prev = itop - max_blocks;
1489 ist_pos[itop] = (
drmp3_uint8)(max_band[
i] >= prev ? default_pos : ist_pos[prev]);
1491 drmp3_L3_stereo_process(
left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
1494static void drmp3_L3_reorder(
float *grbuf,
float *scratch,
const drmp3_uint8 *sfb)
1497 float *src = grbuf, *dst = scratch;
1499 for (;0 != (len = *sfb); sfb += 3, src += 2*len)
1501 for (
i = 0;
i < len;
i++, src++)
1503 *dst++ = src[0*len];
1504 *dst++ = src[1*len];
1505 *dst++ = src[2*len];
1508 memcpy(grbuf, scratch, (dst - scratch)*
sizeof(
float));
1511static void drmp3_L3_antialias(
float *grbuf,
int nbands)
1513 static const float g_aa[2][8] = {
1514 {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
1515 {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
1518 for (; nbands > 0; nbands--, grbuf += 18)
1522 if (drmp3_have_simd())
for (;
i < 8;
i += 4)
1524 drmp3_f4 vu = DRMP3_VLD(grbuf + 18 +
i);
1525 drmp3_f4 vd = DRMP3_VLD(grbuf + 14 -
i);
1526 drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] +
i);
1527 drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] +
i);
1528 vd = DRMP3_VREV(vd);
1529 DRMP3_VSTORE(grbuf + 18 +
i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1)));
1530 vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0));
1531 DRMP3_VSTORE(grbuf + 14 -
i, DRMP3_VREV(vd));
1534#ifndef DR_MP3_ONLY_SIMD
1537 float u = grbuf[18 +
i];
1538 float d = grbuf[17 -
i];
1539 grbuf[18 +
i] =
u*g_aa[0][
i] -
d*g_aa[1][
i];
1540 grbuf[17 -
i] =
u*g_aa[1][
i] +
d*g_aa[0][
i];
1546static void drmp3_L3_dct3_9(
float *
y)
1548 float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
1550 s0 =
y[0]; s2 =
y[2]; s4 =
y[4]; s6 =
y[6]; s8 =
y[8];
1553 t4 = (s4 + s2)*0.93969262f;
1554 t2 = (s8 + s2)*0.76604444f;
1555 s6 = (s4 - s8)*0.17364818f;
1564 s1 =
y[1]; s3 =
y[3]; s5 =
y[5]; s7 =
y[7];
1567 t0 = (s5 + s1)*0.98480775f;
1568 t4 = (s5 - s7)*0.34202014f;
1569 t2 = (s1 + s7)*0.64278761f;
1570 s1 = (s1 - s5 - s7)*0.86602540f;
1586static void drmp3_L3_imdct36(
float *grbuf,
float *overlap,
const float *window,
int nbands)
1589 static const float g_twid9[18] = {
1590 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
1593 for (
j = 0;
j < nbands;
j++, grbuf += 18, overlap += 9)
1598 for (
i = 0;
i < 4;
i++)
1600 si[8 - 2*
i] = grbuf[4*
i + 1] - grbuf[4*
i + 2];
1601 co[1 + 2*
i] = grbuf[4*
i + 1] + grbuf[4*
i + 2];
1602 si[7 - 2*
i] = grbuf[4*
i + 4] - grbuf[4*
i + 3];
1603 co[2 + 2*
i] = -(grbuf[4*
i + 3] + grbuf[4*
i + 4]);
1605 drmp3_L3_dct3_9(co);
1606 drmp3_L3_dct3_9(si);
1616 if (drmp3_have_simd())
for (;
i < 8;
i += 4)
1618 drmp3_f4 vovl = DRMP3_VLD(overlap +
i);
1619 drmp3_f4 vc = DRMP3_VLD(co +
i);
1620 drmp3_f4 vs = DRMP3_VLD(si +
i);
1621 drmp3_f4 vr0 = DRMP3_VLD(g_twid9 +
i);
1622 drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 +
i);
1623 drmp3_f4 vw0 = DRMP3_VLD(window +
i);
1624 drmp3_f4 vw1 = DRMP3_VLD(window + 9 +
i);
1625 drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0));
1626 DRMP3_VSTORE(overlap +
i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1)));
1627 DRMP3_VSTORE(grbuf +
i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1)));
1628 vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0));
1629 DRMP3_VSTORE(grbuf + 14 -
i, DRMP3_VREV(vsum));
1634 float ovl = overlap[
i];
1635 float sum = co[
i]*g_twid9[9 +
i] + si[
i]*g_twid9[0 +
i];
1636 overlap[
i] = co[
i]*g_twid9[0 +
i] - si[
i]*g_twid9[9 +
i];
1643static void drmp3_L3_idct3(
float x0,
float x1,
float x2,
float *dst)
1645 float m1 = x1*0.86602540f;
1646 float a1 = x0 - x2*0.5f;
1652static void drmp3_L3_imdct12(
float *
x,
float *dst,
float *overlap)
1654 static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
1658 drmp3_L3_idct3(-
x[0],
x[6] +
x[3],
x[12] +
x[9], co);
1659 drmp3_L3_idct3(
x[15],
x[12] -
x[9],
x[6] -
x[3], si);
1662 for (
i = 0;
i < 3;
i++)
1664 float ovl = overlap[
i];
1665 float sum = co[
i]*g_twid3[3 +
i] + si[
i]*g_twid3[0 +
i];
1666 overlap[
i] = co[
i]*g_twid3[0 +
i] - si[
i]*g_twid3[3 +
i];
1667 dst[
i] = ovl*g_twid3[2 -
i] - sum*g_twid3[5 -
i];
1668 dst[5 -
i] = ovl*g_twid3[5 -
i] + sum*g_twid3[2 -
i];
1672static void drmp3_L3_imdct_short(
float *grbuf,
float *overlap,
int nbands)
1674 for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
1677 memcpy(tmp, grbuf,
sizeof(tmp));
1678 memcpy(grbuf, overlap, 6*
sizeof(
float));
1679 drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
1680 drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
1681 drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
1685static void drmp3_L3_change_sign(
float *grbuf)
1688 for (
b = 0, grbuf += 18;
b < 32;
b += 2, grbuf += 36)
1689 for (
i = 1;
i < 18;
i += 2)
1690 grbuf[
i] = -grbuf[
i];
1693static void drmp3_L3_imdct_gr(
float *grbuf,
float *overlap,
unsigned block_type,
unsigned n_long_bands)
1695 static const float g_mdct_window[2][18] = {
1696 { 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 },
1697 { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
1701 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
1702 grbuf += 18*n_long_bands;
1703 overlap += 9*n_long_bands;
1705 if (block_type == DRMP3_SHORT_BLOCK_TYPE)
1706 drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
1708 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands);
1711static void drmp3_L3_save_reservoir(
drmp3dec *
h, drmp3dec_scratch *
s)
1713 int pos = (
s->bs.pos + 7)/8u;
1714 int remains =
s->bs.limit/8u - pos;
1715 if (remains > DRMP3_MAX_BITRESERVOIR_BYTES)
1717 pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES;
1718 remains = DRMP3_MAX_BITRESERVOIR_BYTES;
1722 memmove(
h->reserv_buf,
s->maindata + pos, remains);
1724 h->reserv = remains;
1727static int drmp3_L3_restore_reservoir(
drmp3dec *
h, drmp3_bs *bs, drmp3dec_scratch *
s,
int main_data_begin)
1729 int frame_bytes = (bs->limit - bs->pos)/8;
1730 int bytes_have = DRMP3_MIN(
h->reserv, main_data_begin);
1731 memcpy(
s->maindata,
h->reserv_buf + DRMP3_MAX(0,
h->reserv - main_data_begin), DRMP3_MIN(
h->reserv, main_data_begin));
1732 memcpy(
s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
1733 drmp3_bs_init(&
s->bs,
s->maindata, bytes_have + frame_bytes);
1734 return h->reserv >= main_data_begin;
1737static void drmp3_L3_decode(
drmp3dec *
h, drmp3dec_scratch *
s, drmp3_L3_gr_info *gr_info,
int nch)
1741 for (ch = 0; ch < nch; ch++)
1743 int layer3gr_limit =
s->bs.pos + gr_info[ch].part_23_length;
1744 drmp3_L3_decode_scalefactors(
h->header,
s->ist_pos[ch], &
s->bs, gr_info + ch,
s->scf, ch);
1745 drmp3_L3_huffman(
s->grbuf[ch], &
s->bs, gr_info + ch,
s->scf, layer3gr_limit);
1748 if (DRMP3_HDR_TEST_I_STEREO(
h->header))
1750 drmp3_L3_intensity_stereo(
s->grbuf[0],
s->ist_pos[1], gr_info,
h->header);
1751 }
else if (DRMP3_HDR_IS_MS_STEREO(
h->header))
1753 drmp3_L3_midside_stereo(
s->grbuf[0], 576);
1756 for (ch = 0; ch < nch; ch++, gr_info++)
1759 int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (
int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(
h->header) == 2);
1761 if (gr_info->n_short_sfb)
1763 aa_bands = n_long_bands - 1;
1764 drmp3_L3_reorder(
s->grbuf[ch] + n_long_bands*18,
s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
1767 drmp3_L3_antialias(
s->grbuf[ch], aa_bands);
1768 drmp3_L3_imdct_gr(
s->grbuf[ch],
h->mdct_overlap[ch], gr_info->block_type, n_long_bands);
1769 drmp3_L3_change_sign(
s->grbuf[ch]);
1773static void drmp3d_DCT_II(
float *grbuf,
int n)
1775 static const float g_sec[24] = {
1776 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
1780 if (drmp3_have_simd())
for (;
k <
n;
k += 4)
1782 drmp3_f4
t[4][8], *
x;
1783 float *
y = grbuf +
k;
1785 for (
x =
t[0],
i = 0;
i < 8;
i++,
x++)
1787 drmp3_f4 x0 = DRMP3_VLD(&
y[
i*18]);
1788 drmp3_f4 x1 = DRMP3_VLD(&
y[(15 -
i)*18]);
1789 drmp3_f4 x2 = DRMP3_VLD(&
y[(16 +
i)*18]);
1790 drmp3_f4 x3 = DRMP3_VLD(&
y[(31 -
i)*18]);
1791 drmp3_f4 t0 = DRMP3_VADD(x0, x3);
1792 drmp3_f4 t1 = DRMP3_VADD(x1, x2);
1793 drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1, x2), g_sec[3*
i + 0]);
1794 drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*
i + 1]);
1795 x[0] = DRMP3_VADD(t0, t1);
1796 x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*
i + 2]);
1797 x[16] = DRMP3_VADD(t3, t2);
1798 x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*
i + 2]);
1800 for (
x =
t[0],
i = 0;
i < 4;
i++,
x += 8)
1802 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;
1803 xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7);
1804 x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6);
1805 x6 = DRMP3_VSUB(x2, x5); x2 = DRMP3_VADD(x2, x5);
1806 x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4);
1807 x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3);
1808 x3 = DRMP3_VSUB(x1, x2); x1 = DRMP3_VADD(x1, x2);
1809 x[0] = DRMP3_VADD(x0, x1);
1810 x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f);
1811 x5 = DRMP3_VADD(x5, x6);
1812 x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f);
1813 x7 = DRMP3_VADD(x7, xt);
1814 x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f);
1815 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
1816 x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f));
1817 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
1818 x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6);
1819 x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f);
1820 x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f);
1821 x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f);
1822 x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f);
1823 x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f);
1824 x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f);
1830#define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
1832#define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
1834 for (
i = 0;
i < 7;
i++,
y += 4*18)
1836 drmp3_f4
s = DRMP3_VADD(
t[3][
i],
t[3][
i + 1]);
1837 DRMP3_VSAVE2(0,
t[0][
i]);
1838 DRMP3_VSAVE2(1, DRMP3_VADD(
t[2][
i],
s));
1839 DRMP3_VSAVE2(2, DRMP3_VADD(
t[1][
i],
t[1][
i + 1]));
1840 DRMP3_VSAVE2(3, DRMP3_VADD(
t[2][1 +
i],
s));
1842 DRMP3_VSAVE2(0,
t[0][7]);
1843 DRMP3_VSAVE2(1, DRMP3_VADD(
t[2][7],
t[3][7]));
1844 DRMP3_VSAVE2(2,
t[1][7]);
1845 DRMP3_VSAVE2(3,
t[3][7]);
1848#define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v)
1849 for (
i = 0;
i < 7;
i++,
y += 4*18)
1851 drmp3_f4
s = DRMP3_VADD(
t[3][
i],
t[3][
i + 1]);
1852 DRMP3_VSAVE4(0,
t[0][
i]);
1853 DRMP3_VSAVE4(1, DRMP3_VADD(
t[2][
i],
s));
1854 DRMP3_VSAVE4(2, DRMP3_VADD(
t[1][
i],
t[1][
i + 1]));
1855 DRMP3_VSAVE4(3, DRMP3_VADD(
t[2][1 +
i],
s));
1857 DRMP3_VSAVE4(0,
t[0][7]);
1858 DRMP3_VSAVE4(1, DRMP3_VADD(
t[2][7],
t[3][7]));
1859 DRMP3_VSAVE4(2,
t[1][7]);
1860 DRMP3_VSAVE4(3,
t[3][7]);
1864#ifdef DR_MP3_ONLY_SIMD
1869 float t[4][8], *
x, *
y = grbuf +
k;
1871 for (
x =
t[0],
i = 0;
i < 8;
i++,
x++)
1874 float x1 =
y[(15 -
i)*18];
1875 float x2 =
y[(16 +
i)*18];
1876 float x3 =
y[(31 -
i)*18];
1879 float t2 = (x1 - x2)*g_sec[3*
i + 0];
1880 float t3 = (x0 - x3)*g_sec[3*
i + 1];
1882 x[8] = (t0 - t1)*g_sec[3*
i + 2];
1884 x[24] = (t3 - t2)*g_sec[3*
i + 2];
1886 for (
x =
t[0],
i = 0;
i < 4;
i++,
x += 8)
1888 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;
1889 xt = x0 - x7; x0 += x7;
1890 x7 = x1 - x6; x1 += x6;
1891 x6 = x2 - x5; x2 += x5;
1892 x5 = x3 - x4; x3 += x4;
1893 x4 = x0 - x3; x0 += x3;
1894 x3 = x1 - x2; x1 += x2;
1896 x[4] = (x0 - x1)*0.70710677f;
1898 x6 = (x6 + x7)*0.70710677f;
1900 x3 = (x3 + x4)*0.70710677f;
1901 x5 -= x7*0.198912367f;
1902 x7 += x5*0.382683432f;
1903 x5 -= x7*0.198912367f;
1904 x0 = xt - x6; xt += x6;
1905 x[1] = (xt + x7)*0.50979561f;
1906 x[2] = (x4 + x3)*0.54119611f;
1907 x[3] = (x0 - x5)*0.60134488f;
1908 x[5] = (x0 + x5)*0.89997619f;
1909 x[6] = (x4 - x3)*1.30656302f;
1910 x[7] = (xt - x7)*2.56291556f;
1913 for (
i = 0;
i < 7;
i++,
y += 4*18)
1916 y[1*18] =
t[2][
i] +
t[3][
i] +
t[3][
i + 1];
1917 y[2*18] =
t[1][
i] +
t[1][
i + 1];
1918 y[3*18] =
t[2][
i + 1] +
t[3][
i] +
t[3][
i + 1];
1921 y[1*18] =
t[2][7] +
t[3][7];
1928#ifndef DR_MP3_FLOAT_OUTPUT
1947typedef float drmp3d_sample_t;
1949static float drmp3d_scale_pcm(
float sample)
1951 return sample*(1.f/32768.f);
1955static void drmp3d_synth_pair(drmp3d_sample_t *pcm,
int nch,
const float *
z)
1958 a = (
z[14*64] -
z[ 0]) * 29;
1959 a += (
z[ 1*64] +
z[13*64]) * 213;
1960 a += (
z[12*64] -
z[ 2*64]) * 459;
1961 a += (
z[ 3*64] +
z[11*64]) * 2037;
1962 a += (
z[10*64] -
z[ 4*64]) * 5153;
1963 a += (
z[ 5*64] +
z[ 9*64]) * 6574;
1964 a += (
z[ 8*64] -
z[ 6*64]) * 37489;
1965 a +=
z[ 7*64] * 75038;
1966 pcm[0] = drmp3d_scale_pcm(
a);
1970 a +=
z[12*64] * 1567;
1971 a +=
z[10*64] * 9727;
1972 a +=
z[ 8*64] * 64019;
1973 a +=
z[ 6*64] * -9975;
1974 a +=
z[ 4*64] * -45;
1975 a +=
z[ 2*64] * 146;
1977 pcm[16*nch] = drmp3d_scale_pcm(
a);
1980static void drmp3d_synth(
float *xl, drmp3d_sample_t *dstl,
int nch,
float *lins)
1983 float *xr = xl + 576*(nch - 1);
1984 drmp3d_sample_t *dstr = dstl + (nch - 1);
1986 static const float g_win[] = {
1987 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
1988 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
1989 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
1990 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
1991 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
1992 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
1993 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
1994 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
1995 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
1996 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
1997 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
1998 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
1999 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
2000 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
2001 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
2003 float *zlin = lins + 15*64;
2004 const float *
w = g_win;
2006 zlin[4*15] = xl[18*16];
2007 zlin[4*15 + 1] = xr[18*16];
2008 zlin[4*15 + 2] = xl[0];
2009 zlin[4*15 + 3] = xr[0];
2011 zlin[4*31] = xl[1 + 18*16];
2012 zlin[4*31 + 1] = xr[1 + 18*16];
2013 zlin[4*31 + 2] = xl[1];
2014 zlin[4*31 + 3] = xr[1];
2016 drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
2017 drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
2018 drmp3d_synth_pair(dstl, nch, lins + 4*15);
2019 drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
2022 if (drmp3_have_simd())
for (
i = 14;
i >= 0;
i--)
2024#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)]);
2025#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)); }
2026#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))); }
2027#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))); }
2029 zlin[4*
i] = xl[18*(31 -
i)];
2030 zlin[4*
i + 1] = xr[18*(31 -
i)];
2031 zlin[4*
i + 2] = xl[1 + 18*(31 -
i)];
2032 zlin[4*
i + 3] = xr[1 + 18*(31 -
i)];
2033 zlin[4*
i + 64] = xl[1 + 18*(1 +
i)];
2034 zlin[4*
i + 64 + 1] = xr[1 + 18*(1 +
i)];
2035 zlin[4*
i - 64 + 2] = xl[18*(1 +
i)];
2036 zlin[4*
i - 64 + 3] = xr[18*(1 +
i)];
2038 DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7)
2041#ifndef DR_MP3_FLOAT_OUTPUT
2043 static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
2044 static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
2045 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(
a, g_max), g_min)),
2046 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(
b, g_max), g_min)));
2047 dstr[(15 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 1);
2048 dstr[(17 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 5);
2049 dstl[(15 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 0);
2050 dstl[(17 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 4);
2051 dstr[(47 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 3);
2052 dstr[(49 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 7);
2053 dstl[(47 -
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 2);
2054 dstl[(49 +
i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 6);
2056 int16x4_t pcma, pcmb;
2057 a = DRMP3_VADD(
a, DRMP3_VSET(0.5f));
2058 b = DRMP3_VADD(
b, DRMP3_VSET(0.5f));
2059 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(
a), vreinterpretq_s32_u32(vcltq_f32(
a, DRMP3_VSET(0)))));
2060 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(
b), vreinterpretq_s32_u32(vcltq_f32(
b, DRMP3_VSET(0)))));
2061 vst1_lane_s16(dstr + (15 -
i)*nch, pcma, 1);
2062 vst1_lane_s16(dstr + (17 +
i)*nch, pcmb, 1);
2063 vst1_lane_s16(dstl + (15 -
i)*nch, pcma, 0);
2064 vst1_lane_s16(dstl + (17 +
i)*nch, pcmb, 0);
2065 vst1_lane_s16(dstr + (47 -
i)*nch, pcma, 3);
2066 vst1_lane_s16(dstr + (49 +
i)*nch, pcmb, 3);
2067 vst1_lane_s16(dstl + (47 -
i)*nch, pcma, 2);
2068 vst1_lane_s16(dstl + (49 +
i)*nch, pcmb, 2);
2071 static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
2072 a = DRMP3_VMUL(
a, g_scale);
2073 b = DRMP3_VMUL(
b, g_scale);
2075 _mm_store_ss(dstr + (15 -
i)*nch, _mm_shuffle_ps(
a,
a, _MM_SHUFFLE(1, 1, 1, 1)));
2076 _mm_store_ss(dstr + (17 +
i)*nch, _mm_shuffle_ps(
b,
b, _MM_SHUFFLE(1, 1, 1, 1)));
2077 _mm_store_ss(dstl + (15 -
i)*nch, _mm_shuffle_ps(
a,
a, _MM_SHUFFLE(0, 0, 0, 0)));
2078 _mm_store_ss(dstl + (17 +
i)*nch, _mm_shuffle_ps(
b,
b, _MM_SHUFFLE(0, 0, 0, 0)));
2079 _mm_store_ss(dstr + (47 -
i)*nch, _mm_shuffle_ps(
a,
a, _MM_SHUFFLE(3, 3, 3, 3)));
2080 _mm_store_ss(dstr + (49 +
i)*nch, _mm_shuffle_ps(
b,
b, _MM_SHUFFLE(3, 3, 3, 3)));
2081 _mm_store_ss(dstl + (47 -
i)*nch, _mm_shuffle_ps(
a,
a, _MM_SHUFFLE(2, 2, 2, 2)));
2082 _mm_store_ss(dstl + (49 +
i)*nch, _mm_shuffle_ps(
b,
b, _MM_SHUFFLE(2, 2, 2, 2)));
2084 vst1q_lane_f32(dstr + (15 -
i)*nch,
a, 1);
2085 vst1q_lane_f32(dstr + (17 +
i)*nch,
b, 1);
2086 vst1q_lane_f32(dstl + (15 -
i)*nch,
a, 0);
2087 vst1q_lane_f32(dstl + (17 +
i)*nch,
b, 0);
2088 vst1q_lane_f32(dstr + (47 -
i)*nch,
a, 3);
2089 vst1q_lane_f32(dstr + (49 +
i)*nch,
b, 3);
2090 vst1q_lane_f32(dstl + (47 -
i)*nch,
a, 2);
2091 vst1q_lane_f32(dstl + (49 +
i)*nch,
b, 2);
2097#ifdef DR_MP3_ONLY_SIMD
2100 for (
i = 14;
i >= 0;
i--)
2102#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];
2103#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; }
2104#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; }
2105#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; }
2108 zlin[4*
i] = xl[18*(31 -
i)];
2109 zlin[4*
i + 1] = xr[18*(31 -
i)];
2110 zlin[4*
i + 2] = xl[1 + 18*(31 -
i)];
2111 zlin[4*
i + 3] = xr[1 + 18*(31 -
i)];
2112 zlin[4*(
i + 16)] = xl[1 + 18*(1 +
i)];
2113 zlin[4*(
i + 16) + 1] = xr[1 + 18*(1 +
i)];
2114 zlin[4*(
i - 16) + 2] = xl[18*(1 +
i)];
2115 zlin[4*(
i - 16) + 3] = xr[18*(1 +
i)];
2117 DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7)
2119 dstr[(15 -
i)*nch] = drmp3d_scale_pcm(
a[1]);
2120 dstr[(17 +
i)*nch] = drmp3d_scale_pcm(
b[1]);
2121 dstl[(15 -
i)*nch] = drmp3d_scale_pcm(
a[0]);
2122 dstl[(17 +
i)*nch] = drmp3d_scale_pcm(
b[0]);
2123 dstr[(47 -
i)*nch] = drmp3d_scale_pcm(
a[3]);
2124 dstr[(49 +
i)*nch] = drmp3d_scale_pcm(
b[3]);
2125 dstl[(47 -
i)*nch] = drmp3d_scale_pcm(
a[2]);
2126 dstl[(49 +
i)*nch] = drmp3d_scale_pcm(
b[2]);
2131static void drmp3d_synth_granule(
float *qmf_state,
float *grbuf,
int nbands,
int nch, drmp3d_sample_t *pcm,
float *lins)
2134 for (
i = 0;
i < nch;
i++)
2136 drmp3d_DCT_II(grbuf + 576*
i, nbands);
2139 memcpy(lins, qmf_state,
sizeof(
float)*15*64);
2141 for (
i = 0;
i < nbands;
i += 2)
2143 drmp3d_synth(grbuf +
i, pcm + 32*nch*
i, nch, lins +
i*64);
2145#ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL
2148 for (
i = 0;
i < 15*64;
i += 2)
2150 qmf_state[
i] = lins[nbands*64 +
i];
2155 memcpy(qmf_state, lins + nbands*64,
sizeof(
float)*15*64);
2159static int drmp3d_match_frame(
const drmp3_uint8 *hdr,
int mp3_bytes,
int frame_bytes)
2162 for (
i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++)
2164 i += drmp3_hdr_frame_bytes(hdr +
i, frame_bytes) + drmp3_hdr_padding(hdr +
i);
2165 if (
i + DRMP3_HDR_SIZE > mp3_bytes)
2167 if (!drmp3_hdr_compare(hdr, hdr +
i))
2173static int drmp3d_find_frame(
const drmp3_uint8 *mp3,
int mp3_bytes,
int *free_format_bytes,
int *ptr_frame_bytes)
2176 for (
i = 0;
i < mp3_bytes - DRMP3_HDR_SIZE;
i++, mp3++)
2178 if (drmp3_hdr_valid(mp3))
2180 int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes);
2181 int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3);
2183 for (
k = DRMP3_HDR_SIZE; !frame_bytes &&
k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE &&
i + 2*
k < mp3_bytes - DRMP3_HDR_SIZE;
k++)
2185 if (drmp3_hdr_compare(mp3, mp3 +
k))
2187 int fb =
k - drmp3_hdr_padding(mp3);
2188 int nextfb = fb + drmp3_hdr_padding(mp3 +
k);
2189 if (
i +
k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 +
k + nextfb))
2191 frame_and_padding =
k;
2193 *free_format_bytes = fb;
2197 if ((frame_bytes &&
i + frame_and_padding <= mp3_bytes &&
2198 drmp3d_match_frame(mp3, mp3_bytes -
i, frame_bytes)) ||
2199 (!
i && frame_and_padding == mp3_bytes))
2201 *ptr_frame_bytes = frame_and_padding;
2204 *free_format_bytes = 0;
2207 *ptr_frame_bytes = 0;
2218 int i = 0, igr, frame_size = 0, success = 1;
2220 drmp3_bs bs_frame[1];
2221 drmp3dec_scratch scratch;
2223 if (mp3_bytes > 4 && dec->
header[0] == 0xff && drmp3_hdr_compare(dec->
header, mp3))
2225 frame_size = drmp3_hdr_frame_bytes(mp3, dec->
free_format_bytes) + drmp3_hdr_padding(mp3);
2226 if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size)))
2235 if (!frame_size ||
i + frame_size > mp3_bytes)
2237 info->frame_bytes =
i;
2244 info->frame_bytes =
i + frame_size;
2245 info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
2246 info->hz = drmp3_hdr_sample_rate_hz(hdr);
2247 info->layer = 4 - DRMP3_HDR_GET_LAYER(hdr);
2248 info->bitrate_kbps = drmp3_hdr_bitrate_kbps(hdr);
2250 drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE);
2251 if (DRMP3_HDR_IS_CRC(hdr))
2253 drmp3_bs_get_bits(bs_frame, 16);
2256 if (
info->layer == 3)
2258 int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);
2259 if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
2264 success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
2265 if (success && pcm !=
NULL)
2267 for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm,
sizeof(drmp3d_sample_t)*576*
info->channels))
2269 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
2270 drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*
info->channels,
info->channels);
2271 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 18,
info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2274 drmp3_L3_save_reservoir(dec, &scratch);
2277#ifdef DR_MP3_ONLY_MP3
2280 drmp3_L12_scale_info sci[1];
2283 return drmp3_hdr_frame_samples(hdr);
2286 drmp3_L12_read_scale_info(hdr, bs_frame, sci);
2288 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
2289 for (
i = 0, igr = 0; igr < 3; igr++)
2291 if (12 == (
i += drmp3_L12_dequantize_granule(scratch.grbuf[0] +
i, bs_frame, sci,
info->layer | 1)))
2294 drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
2295 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 12,
info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2296 memset(scratch.grbuf[0], 0, 576*2*
sizeof(
float));
2297 pcm = DRMP3_OFFSET_PTR(pcm,
sizeof(drmp3d_sample_t)*384*
info->channels);
2299 if (bs_frame->pos > bs_frame->limit)
2308 return success*drmp3_hdr_frame_samples(dec->
header);
2315 size_t aligned_count = num_samples & ~7;
2316 for(;
i < aligned_count;
i+=8)
2318 drmp3_f4 scale = DRMP3_VSET(32768.0f);
2319 drmp3_f4
a = DRMP3_VMUL(DRMP3_VLD(&
in[
i ]), scale);
2320 drmp3_f4
b = DRMP3_VMUL(DRMP3_VLD(&
in[
i+4]), scale);
2322 drmp3_f4 s16max = DRMP3_VSET( 32767.0f);
2323 drmp3_f4 s16min = DRMP3_VSET(-32768.0f);
2324 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(
a, s16max), s16min)),
2325 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(
b, s16max), s16min)));
2335 int16x4_t pcma, pcmb;
2336 a = DRMP3_VADD(
a, DRMP3_VSET(0.5f));
2337 b = DRMP3_VADD(
b, DRMP3_VSET(0.5f));
2338 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(
a), vreinterpretq_s32_u32(vcltq_f32(
a, DRMP3_VSET(0)))));
2339 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(
b), vreinterpretq_s32_u32(vcltq_f32(
b, DRMP3_VSET(0)))));
2340 vst1_lane_s16(
out+
i , pcma, 0);
2341 vst1_lane_s16(
out+
i+1, pcma, 1);
2342 vst1_lane_s16(
out+
i+2, pcma, 2);
2343 vst1_lane_s16(
out+
i+3, pcma, 3);
2344 vst1_lane_s16(
out+
i+4, pcmb, 0);
2345 vst1_lane_s16(
out+
i+5, pcmb, 1);
2346 vst1_lane_s16(
out+
i+6, pcmb, 2);
2347 vst1_lane_s16(
out+
i+7, pcmb, 3);
2351 for(;
i < num_samples;
i++)
2356 else if (
sample <= -32767.5)
2376#if defined(SIZE_MAX)
2377 #define DRMP3_SIZE_MAX SIZE_MAX
2379 #if defined(_WIN64) || defined(_LP64) || defined(__LP64__)
2380 #define DRMP3_SIZE_MAX ((drmp3_uint64)0xFFFFFFFFFFFFFFFF)
2382 #define DRMP3_SIZE_MAX 0xFFFFFFFF
2387#ifndef DRMP3_SEEK_LEADING_MP3_FRAMES
2388#define DRMP3_SEEK_LEADING_MP3_FRAMES 2
2391#define DRMP3_MIN_DATA_CHUNK_SIZE 16384
2394#ifndef DRMP3_DATA_CHUNK_SIZE
2395#define DRMP3_DATA_CHUNK_SIZE DRMP3_MIN_DATA_CHUNK_SIZE*4
2402#define DRMP3_ASSERT(expression) assert(expression)
2404#ifndef DRMP3_COPY_MEMORY
2405#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
2407#ifndef DRMP3_ZERO_MEMORY
2408#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
2410#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
2412#define DRMP3_MALLOC(sz) malloc((sz))
2414#ifndef DRMP3_REALLOC
2415#define DRMP3_REALLOC(p, sz) realloc((p), (sz))
2418#define DRMP3_FREE(p) free((p))
2421#define DRMP3_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
2422#define DRMP3_CLAMP(x, lo, hi) (DRMP3_MAX(lo, DRMP3_MIN(x, hi)))
2425#define DRMP3_PI_D 3.14159265358979323846264
2428#define DRMP3_DEFAULT_RESAMPLER_LPF_ORDER 2
2432 return x*(1-
a) +
y*
a;
2434static DRMP3_INLINE float drmp3_mix_f32_fast(
float x,
float y,
float a)
2476 return drmp3_sin((DRMP3_PI_D*0.5) -
x);
2480static void* drmp3__malloc_default(
size_t sz,
void* pUserData)
2483 return DRMP3_MALLOC(sz);
2486static void* drmp3__realloc_default(
void*
p,
size_t sz,
void* pUserData)
2489 return DRMP3_REALLOC(
p, sz);
2492static void drmp3__free_default(
void*
p,
void* pUserData)
2501 if (pAllocationCallbacks ==
NULL) {
2517static void* drmp3__realloc_from_callbacks(
void*
p,
size_t szNew,
size_t szOld,
const drmp3_allocation_callbacks* pAllocationCallbacks)
2519 if (pAllocationCallbacks ==
NULL) {
2537 DRMP3_COPY_MEMORY(p2,
p, szOld);
2549 if (
p ==
NULL || pAllocationCallbacks ==
NULL) {
2561 if (pAllocationCallbacks !=
NULL) {
2563 return *pAllocationCallbacks;
2568 allocationCallbacks.
onMalloc = drmp3__malloc_default;
2569 allocationCallbacks.
onRealloc = drmp3__realloc_default;
2570 allocationCallbacks.
onFree = drmp3__free_default;
2571 return allocationCallbacks;
2577static size_t drmp3__on_read(
drmp3* pMP3,
void* pBufferOut,
size_t bytesToRead)
2579 size_t bytesRead = pMP3->
onRead(pMP3->
pUserData, pBufferOut, bytesToRead);
2586 DRMP3_ASSERT(offset >= 0);
2603 if (offset <= 0x7FFFFFFF) {
2604 return drmp3__on_seek(pMP3, (
int)offset, origin);
2613 offset -= 0x7FFFFFFF;
2614 while (offset > 0) {
2615 if (offset <= 0x7FFFFFFF) {
2624 offset -= 0x7FFFFFFF;
2632static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(
drmp3* pMP3, drmp3d_sample_t* pPCMFrames)
2636 DRMP3_ASSERT(pMP3 !=
NULL);
2649 if (pMP3->
dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) {
2666 if (pNewData ==
NULL) {
2670 pMP3->
pData = pNewData;
2675 if (bytesRead == 0) {
2696 if (
info.frame_bytes > 0) {
2702 if (pcmFramesRead > 0) {
2703 pcmFramesRead = drmp3_hdr_frame_samples(pMP3->
decoder.
header);
2709 }
else if (
info.frame_bytes == 0) {
2725 if (pNewData ==
NULL) {
2729 pMP3->
pData = pNewData;
2735 if (bytesRead == 0) {
2745 return pcmFramesRead;
2748static drmp3_uint32 drmp3_decode_next_frame_ex__memory(
drmp3* pMP3, drmp3d_sample_t* pPCMFrames)
2753 DRMP3_ASSERT(pMP3 !=
NULL);
2761 if (pcmFramesRead > 0) {
2771 return pcmFramesRead;
2774static drmp3_uint32 drmp3_decode_next_frame_ex(
drmp3* pMP3, drmp3d_sample_t* pPCMFrames)
2777 return drmp3_decode_next_frame_ex__memory(pMP3, pPCMFrames);
2779 return drmp3_decode_next_frame_ex__callbacks(pMP3, pPCMFrames);
2785 DRMP3_ASSERT(pMP3 !=
NULL);
2786 return drmp3_decode_next_frame_ex(pMP3, (drmp3d_sample_t*)pMP3->
pcmFrames);
2794 DRMP3_ASSERT(pMP3 !=
NULL);
2796 pcmFrameCount = drmp3_decode_next_frame_ex(pMP3,
NULL);
2797 if (pcmFrameCount == 0) {
2806 return pcmFrameCount;
2812 DRMP3_ASSERT(pMP3 !=
NULL);
2813 DRMP3_ASSERT(onRead !=
NULL);
2821 pMP3->
allocationCallbacks = drmp3_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);
2828 if (!drmp3_decode_next_frame(pMP3)) {
2841 if (pMP3 ==
NULL || onRead ==
NULL) {
2845 DRMP3_ZERO_OBJECT(pMP3);
2846 return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pAllocationCallbacks);
2850static size_t drmp3__on_read_memory(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
2853 size_t bytesRemaining;
2855 DRMP3_ASSERT(pMP3 !=
NULL);
2859 if (bytesToRead > bytesRemaining) {
2860 bytesToRead = bytesRemaining;
2863 if (bytesToRead > 0) {
2875 DRMP3_ASSERT(pMP3 !=
NULL);
2878 if (byteOffset > 0) {
2891 if ((
drmp3_uint32)byteOffset <= pMP3->memory.dataSize) {
2907 DRMP3_ZERO_OBJECT(pMP3);
2909 if (pData ==
NULL || dataSize == 0) {
2917 return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pAllocationCallbacks);
2921#ifndef DR_MP3_NO_STDIO
3202 #ifdef EPROTONOSUPPORT
3205 #ifdef ESOCKTNOSUPPORT
3220 #ifdef EADDRNOTAVAIL
3316 #ifdef ENOTRECOVERABLE
3329static drmp3_result drmp3_fopen(FILE** ppFile,
const char* pFilePath,
const char* pOpenMode)
3331#if _MSC_VER && _MSC_VER >= 1400
3335 if (ppFile !=
NULL) {
3339 if (pFilePath ==
NULL || pOpenMode ==
NULL || ppFile ==
NULL) {
3343#if _MSC_VER && _MSC_VER >= 1400
3344 err = fopen_s(ppFile, pFilePath, pOpenMode);
3346 return drmp3_result_from_errno(err);
3349#if defined(_WIN32) || defined(__APPLE__)
3350 *ppFile = fopen(pFilePath, pOpenMode);
3352 #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE)
3353 *ppFile = fopen64(pFilePath, pOpenMode);
3355 *ppFile = fopen(pFilePath, pOpenMode);
3358 if (*ppFile ==
NULL) {
3384 #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS))
3385 #define DRMP3_HAS_WFOPEN
3391 if (ppFile !=
NULL) {
3395 if (pFilePath ==
NULL || pOpenMode ==
NULL || ppFile ==
NULL) {
3399#if defined(DRMP3_HAS_WFOPEN)
3402 #if defined(_MSC_VER) && _MSC_VER >= 1400
3403 errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode);
3405 return drmp3_result_from_errno(err);
3408 *ppFile = _wfopen(pFilePath, pOpenMode);
3409 if (*ppFile ==
NULL) {
3410 return drmp3_result_from_errno(errno);
3413 (
void)pAllocationCallbacks;
3424 const wchar_t* pFilePathTemp = pFilePath;
3425 char* pFilePathMB =
NULL;
3426 char pOpenModeMB[32] = {0};
3429 DRMP3_ZERO_OBJECT(&mbs);
3430 lenMB = wcsrtombs(
NULL, &pFilePathTemp, 0, &mbs);
3431 if (lenMB == (
size_t)-1) {
3432 return drmp3_result_from_errno(errno);
3435 pFilePathMB = (
char*)drmp3__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks);
3436 if (pFilePathMB ==
NULL) {
3440 pFilePathTemp = pFilePath;
3441 DRMP3_ZERO_OBJECT(&mbs);
3442 wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs);
3448 if (pOpenMode[
i] == 0) {
3449 pOpenModeMB[
i] =
'\0';
3453 pOpenModeMB[
i] = (char)pOpenMode[
i];
3458 *ppFile = fopen(pFilePathMB, pOpenModeMB);
3460 drmp3__free_from_callbacks(pFilePathMB, pAllocationCallbacks);
3463 if (*ppFile ==
NULL) {
3473static size_t drmp3__on_read_stdio(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
3475 return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);
3488 if (drmp3_fopen(&pFile, pFilePath,
"rb") !=
DRMP3_SUCCESS) {
3492 result =
drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (
void*)pFile, pAllocationCallbacks);
3506 if (drmp3_wfopen(&pFile, pFilePath, L
"rb", pAllocationCallbacks) !=
DRMP3_SUCCESS) {
3510 result =
drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (
void*)pFile, pAllocationCallbacks);
3526#ifndef DR_MP3_NO_STDIO
3527 if (pMP3->
onRead == drmp3__on_read_stdio) {
3529 if (pFile !=
NULL) {
3539#if defined(DR_MP3_FLOAT_OUTPUT)
3548 sampleCount4 = sampleCount >> 2;
3549 for (i4 = 0; i4 < sampleCount4; i4 += 1) {
3550 float x0 = src[
i+0];
3551 float x1 = src[
i+1];
3552 float x2 = src[
i+2];
3553 float x3 = src[
i+3];
3555 x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0));
3556 x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1));
3557 x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2));
3558 x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3));
3574 for (;
i < sampleCount;
i += 1) {
3576 x = ((
x < -1) ? -1 : ((
x > 1) ? 1 :
x));
3584#if !defined(DR_MP3_FLOAT_OUTPUT)
3588 for (
i = 0;
i < sampleCount;
i += 1) {
3589 float x = (float)src[
i];
3590 x =
x * 0.000030517578125f;
3601 DRMP3_ASSERT(pMP3 !=
NULL);
3604 while (framesToRead > 0) {
3606 if (pBufferOut !=
NULL) {
3607 #if defined(DR_MP3_FLOAT_OUTPUT)
3609 float* pFramesOutF32 = (
float*)DRMP3_OFFSET_PTR(pBufferOut,
sizeof(
float) * totalFramesRead * pMP3->
channels);
3611 DRMP3_COPY_MEMORY(pFramesOutF32, pFramesInF32,
sizeof(
float) * framesToConsume * pMP3->
channels);
3616 DRMP3_COPY_MEMORY(pFramesOutS16, pFramesInS16,
sizeof(
drmp3_int16) * framesToConsume * pMP3->
channels);
3623 totalFramesRead += framesToConsume;
3624 framesToRead -= framesToConsume;
3626 if (framesToRead == 0) {
3636 if (drmp3_decode_next_frame(pMP3) == 0) {
3641 return totalFramesRead;
3651#if defined(DR_MP3_FLOAT_OUTPUT)
3653 return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);
3660 while (totalPCMFramesRead < framesToRead) {
3662 drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead;
3664 if (framesToReadNow > framesRemaining) {
3665 framesToReadNow = framesRemaining;
3668 framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempS16);
3669 if (framesJustRead == 0) {
3673 drmp3_s16_to_f32((
float*)DRMP3_OFFSET_PTR(pBufferOut,
sizeof(
float) * totalPCMFramesRead * pMP3->
channels), pTempS16, framesJustRead * pMP3->
channels);
3674 totalPCMFramesRead += framesJustRead;
3677 return totalPCMFramesRead;
3688#if !defined(DR_MP3_FLOAT_OUTPUT)
3690 return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);
3694 float pTempF32[4096];
3697 while (totalPCMFramesRead < framesToRead) {
3699 drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead;
3701 if (framesToReadNow > framesRemaining) {
3702 framesToReadNow = framesRemaining;
3705 framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempF32);
3706 if (framesJustRead == 0) {
3711 totalPCMFramesRead += framesJustRead;
3714 return totalPCMFramesRead;
3719static void drmp3_reset(
drmp3* pMP3)
3721 DRMP3_ASSERT(pMP3 !=
NULL);
3733 DRMP3_ASSERT(pMP3 !=
NULL);
3756#if defined(DR_MP3_FLOAT_OUTPUT)
3761 if (framesRead != frameOffset) {
3770 DRMP3_ASSERT(pMP3 !=
NULL);
3780 if (frameIndex < pMP3->currentPCMFrame) {
3782 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3788 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->
currentPCMFrame));
3795 DRMP3_ASSERT(pSeekPointIndex !=
NULL);
3797 *pSeekPointIndex = 0;
3799 if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) {
3804 for (iSeekPoint = 0; iSeekPoint < pMP3->
seekPointCount; ++iSeekPoint) {
3809 *pSeekPointIndex = iSeekPoint;
3822 DRMP3_ASSERT(pMP3 !=
NULL);
3827 if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) {
3828 seekPoint = pMP3->
pSeekPoints[priorSeekPointIndex];
3847 drmp3d_sample_t* pPCMFrames;
3852 pPCMFrames = (drmp3d_sample_t*)pMP3->
pcmFrames;
3856 pcmFramesRead = drmp3_decode_next_frame_ex(pMP3, pPCMFrames);
3857 if (pcmFramesRead == 0) {
3870 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames);
3879 if (frameIndex == 0) {
3880 return drmp3_seek_to_start_of_stream(pMP3);
3885 return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex);
3887 return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex);
3914 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3918 totalPCMFrameCount = 0;
3919 totalMP3FrameCount = 0;
3924 pcmFramesInCurrentMP3Frame = drmp3_decode_next_frame_ex(pMP3,
NULL);
3925 if (pcmFramesInCurrentMP3Frame == 0) {
3929 totalPCMFrameCount += pcmFramesInCurrentMP3Frame;
3930 totalMP3FrameCount += 1;
3934 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3942 if (pMP3FrameCount !=
NULL) {
3943 *pMP3FrameCount = totalMP3FrameCount;
3945 if (pPCMFrameCount !=
NULL) {
3946 *pPCMFrameCount = totalPCMFrameCount;
3959 return totalPCMFrameCount;
3969 return totalMP3FrameCount;
3972static void drmp3__accumulate_running_pcm_frame_count(
drmp3* pMP3,
drmp3_uint32 pcmFrameCountIn,
drmp3_uint64* pRunningPCMFrameCount,
float* pRunningPCMFrameCountFractionalPart)
3975 float pcmFrameCountOutF;
3979 DRMP3_ASSERT(srcRatio > 0);
3981 pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio);
3983 *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut;
3984 *pRunningPCMFrameCount += pcmFrameCountOut;
3991} drmp3__seeking_mp3_frame_info;
4000 if (pMP3 ==
NULL || pSeekPointCount ==
NULL || pSeekPoints ==
NULL) {
4004 seekPointCount = *pSeekPointCount;
4005 if (seekPointCount == 0) {
4018 if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) {
4026 drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1];
4028 float runningPCMFrameCountFractionalPart = 0;
4033 if (seekPointCount > totalMP3FrameCount-1) {
4037 pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1);
4043 if (!drmp3_seek_to_start_of_stream(pMP3)) {
4053 for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) {
4059 mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount;
4062 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3,
NULL);
4063 if (pcmFramesInCurrentMP3FrameIn == 0) {
4067 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
4074 nextTargetPCMFrame = 0;
4075 for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) {
4076 nextTargetPCMFrame += pcmFramesBetweenSeekPoints;
4079 if (nextTargetPCMFrame < runningPCMFrameCount) {
4081 pSeekPoints[iSeekPoint].
seekPosInBytes = mp3FrameInfo[0].bytePos;
4094 for (
i = 0;
i < DRMP3_COUNTOF(mp3FrameInfo)-1; ++
i) {
4095 mp3FrameInfo[
i] = mp3FrameInfo[
i+1];
4100 mp3FrameInfo[DRMP3_COUNTOF(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount;
4106 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3,
NULL);
4107 if (pcmFramesInCurrentMP3FrameIn == 0) {
4108 pSeekPoints[iSeekPoint].
seekPosInBytes = mp3FrameInfo[0].bytePos;
4115 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
4121 if (!drmp3_seek_to_start_of_stream(pMP3)) {
4129 *pSeekPointCount = seekPointCount;
4139 if (seekPointCount == 0 || pSeekPoints ==
NULL) {
4157 float* pFrames =
NULL;
4160 DRMP3_ASSERT(pMP3 !=
NULL);
4165 if (framesJustRead == 0) {
4170 if (framesCapacity < totalFramesRead + framesJustRead) {
4176 newFramesCap = framesCapacity * 2;
4177 if (newFramesCap < totalFramesRead + framesJustRead) {
4178 newFramesCap = totalFramesRead + framesJustRead;
4181 oldFramesBufferSize = framesCapacity * pMP3->
channels *
sizeof(float);
4182 newFramesBufferSize = newFramesCap * pMP3->
channels *
sizeof(float);
4183 if (newFramesBufferSize > DRMP3_SIZE_MAX) {
4187 pNewFrames = (
float*)drmp3__realloc_from_callbacks(pFrames, (
size_t)newFramesBufferSize, (
size_t)oldFramesBufferSize, &pMP3->
allocationCallbacks);
4188 if (pNewFrames ==
NULL) {
4193 pFrames = pNewFrames;
4194 framesCapacity = newFramesCap;
4197 DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->
channels, temp, (
size_t)(framesJustRead*pMP3->
channels*
sizeof(
float)));
4198 totalFramesRead += framesJustRead;
4201 if (framesJustRead != framesToReadRightNow) {
4206 if (pConfig !=
NULL) {
4213 if (pTotalFrameCount) {
4214 *pTotalFrameCount = totalFramesRead;
4227 DRMP3_ASSERT(pMP3 !=
NULL);
4232 if (framesJustRead == 0) {
4237 if (framesCapacity < totalFramesRead + framesJustRead) {
4243 newFramesCap = framesCapacity * 2;
4244 if (newFramesCap < totalFramesRead + framesJustRead) {
4245 newFramesCap = totalFramesRead + framesJustRead;
4250 if (newFramesBufferSize > DRMP3_SIZE_MAX) {
4254 pNewFrames = (
drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (
size_t)newFramesBufferSize, (
size_t)oldFramesBufferSize, &pMP3->
allocationCallbacks);
4255 if (pNewFrames ==
NULL) {
4260 pFrames = pNewFrames;
4261 framesCapacity = newFramesCap;
4265 totalFramesRead += framesJustRead;
4268 if (framesJustRead != framesToReadRightNow) {
4273 if (pConfig !=
NULL) {
4280 if (pTotalFrameCount) {
4281 *pTotalFrameCount = totalFramesRead;
4291 if (!
drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {
4295 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
4301 if (!
drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {
4305 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
4316 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
4326 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
4330#ifndef DR_MP3_NO_STDIO
4338 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
4348 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
4354 if (pAllocationCallbacks !=
NULL) {
4355 return drmp3__malloc_from_callbacks(sz, pAllocationCallbacks);
4357 return drmp3__malloc_default(sz,
NULL);
4363 if (pAllocationCallbacks !=
NULL) {
4364 drmp3__free_from_callbacks(
p, pAllocationCallbacks);
4366 drmp3__free_default(
p,
NULL);
uint8_t a
Definition Spc_Cpu.h:141
T limit(T val, T min, T max)
Definition Util.h:78
#define DRMP3_DATA_CHUNK_SIZE
Definition ad_dr_mp3.c:30
__attribute__((naked, target("arm")))
Definition asm-nseel-arm-gcc.c:66
static const unsigned long mask[]
Definition bitwise.c:31
* e
Definition inflate.c:1404
UINT_D64 w
Definition inflate.c:942
unsigned z
Definition inflate.c:1589
unsigned * m
Definition inflate.c:1559
struct huft * t
Definition inflate.c:943
register unsigned k
Definition inflate.c:946
register unsigned j
Definition inflate.c:1576
int y
Definition inflate.c:1588
unsigned d
Definition inflate.c:940
struct huft * u[BMAX]
Definition inflate.c:1583
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
#define DRMP3_ALREADY_CONNECTED
Definition dr_mp3.h:214
unsigned char drmp3_uint8
Definition dr_mp3.h:105
#define DRMP3_INVALID_OPERATION
Definition dr_mp3.h:171
#define DRMP3_DOES_NOT_EXIST
Definition dr_mp3.h:175
drmp3_seek_origin
Definition dr_mp3.h:285
@ drmp3_seek_origin_start
Definition dr_mp3.h:286
@ drmp3_seek_origin_current
Definition dr_mp3.h:287
DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3 *pMP3, drmp3_uint64 framesToRead, float *pBufferOut)
#define DRMP3_UNAVAILABLE
Definition dr_mp3.h:190
unsigned short drmp3_uint16
Definition dr_mp3.h:107
#define DRMP3_NOT_DIRECTORY
Definition dr_mp3.h:182
#define DRMP3_NOT_UNIQUE
Definition dr_mp3.h:204
DRMP3_API drmp3_bool32 drmp3_init(drmp3 *pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void *pUserData, const drmp3_allocation_callbacks *pAllocationCallbacks)
DRMP3_API drmp3_bool32 drmp3_init_file(drmp3 *pMP3, const char *pFilePath, const drmp3_allocation_callbacks *pAllocationCallbacks)
#define DRMP3_ALREADY_IN_USE
Definition dr_mp3.h:191
#define DRMP3_IN_PROGRESS
Definition dr_mp3.h:218
signed int drmp3_int32
Definition dr_mp3.h:108
DRMP3_API int drmp3dec_decode_frame(drmp3dec *dec, const drmp3_uint8 *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info)
#define DRMP3_BAD_MESSAGE
Definition dr_mp3.h:199
DRMP3_API drmp3_int16 * drmp3_open_memory_and_read_pcm_frames_s16(const void *pData, size_t dataSize, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount, const drmp3_allocation_callbacks *pAllocationCallbacks)
#define DRMP3_PROTOCOL_FAMILY_NOT_SUPPORTED
Definition dr_mp3.h:210
#define DRMP3_SUCCESS
Definition dr_mp3.h:168
#define DRMP3_PATH_TOO_LONG
Definition dr_mp3.h:180
signed char drmp3_int8
Definition dr_mp3.h:104
DRMP3_API drmp3_bool32 drmp3_calculate_seek_points(drmp3 *pMP3, drmp3_uint32 *pSeekPointCount, drmp3_seek_point *pSeekPoints)
DRMP3_API drmp3_int16 * drmp3_open_file_and_read_pcm_frames_s16(const char *filePath, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount, const drmp3_allocation_callbacks *pAllocationCallbacks)
#define DRMP3_BAD_ADDRESS
Definition dr_mp3.h:192
#define DRMP3_BAD_SEEK
Definition dr_mp3.h:193
DRMP3_API void drmp3_uninit(drmp3 *pMP3)
#define DRMP3_PROTOCOL_UNAVAILABLE
Definition dr_mp3.h:208
drmp3_bool32(* drmp3_seek_proc)(void *pUserData, int offset, drmp3_seek_origin origin)
Definition dr_mp3.h:324
#define DRMP3_INVALID_ARGS
Definition dr_mp3.h:170
#define DRMP3_NO_NETWORK
Definition dr_mp3.h:203
#define DRMP3_IS_DIRECTORY
Definition dr_mp3.h:183
DRMP3_API float * drmp3_open_and_read_pcm_frames_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void *pUserData, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount, const drmp3_allocation_callbacks *pAllocationCallbacks)
DRMP3_API void drmp3_version(drmp3_uint32 *pMajor, drmp3_uint32 *pMinor, drmp3_uint32 *pRevision)
#define DRMP3_BUSY
Definition dr_mp3.h:187
#define DRMP3_CONNECTION_RESET
Definition dr_mp3.h:213
#define DRMP3_INTERRUPT
Definition dr_mp3.h:189
#define DRMP3_PROTOCOL_NOT_SUPPORTED
Definition dr_mp3.h:209
#define DRMP3_ALREADY_EXISTS
Definition dr_mp3.h:176
DRMP3_API drmp3_uint64 drmp3_get_mp3_frame_count(drmp3 *pMP3)
#define DRMP3_OUT_OF_MEMORY
Definition dr_mp3.h:172
DRMP3_API float * drmp3_open_file_and_read_pcm_frames_f32(const char *filePath, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount, const drmp3_allocation_callbacks *pAllocationCallbacks)
DRMP3_API float * drmp3_open_memory_and_read_pcm_frames_f32(const void *pData, size_t dataSize, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount, const drmp3_allocation_callbacks *pAllocationCallbacks)
#define DRMP3_NOT_CONNECTED
Definition dr_mp3.h:215
#define DRMP3_TIMEOUT
Definition dr_mp3.h:202
drmp3_int32 drmp3_result
Definition dr_mp3.h:167
DRMP3_API drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3 *pMP3, drmp3_uint64 *pMP3FrameCount, drmp3_uint64 *pPCMFrameCount)
#define DRMP3_INVALID_FILE
Definition dr_mp3.h:178
DRMP3_API drmp3_bool32 drmp3_bind_seek_table(drmp3 *pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point *pSeekPoints)
DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3 *pMP3, drmp3_uint64 framesToRead, drmp3_int16 *pBufferOut)
#define DRMP3_VERSION_MINOR
Definition dr_mp3.h:97
#define DRMP3_ADDRESS_FAMILY_NOT_SUPPORTED
Definition dr_mp3.h:211
DRMP3_API void * drmp3_malloc(size_t sz, const drmp3_allocation_callbacks *pAllocationCallbacks)
#define DRMP3_MAX_SAMPLES_PER_FRAME
Definition dr_mp3.h:225
#define DRMP3_API
Definition dr_mp3.h:162
DRMP3_API drmp3_bool32 drmp3_init_memory(drmp3 *pMP3, const void *pData, size_t dataSize, const drmp3_allocation_callbacks *pAllocationCallbacks)
size_t(* drmp3_read_proc)(void *pUserData, void *pBufferOut, size_t bytesToRead)
Definition dr_mp3.h:310
DRMP3_API drmp3_uint64 drmp3_get_pcm_frame_count(drmp3 *pMP3)
DRMP3_API void drmp3dec_init(drmp3dec *dec)
#define DRMP3_NO_MESSAGE
Definition dr_mp3.h:198
#define DRMP3_NO_HOST
Definition dr_mp3.h:217
#define DRMP3_DEADLOCK
Definition dr_mp3.h:195
#define DRMP3_ERROR
Definition dr_mp3.h:169
drmp3_uint8 drmp3_bool8
Definition dr_mp3.h:132
#define DRMP3_CANCELLED
Definition dr_mp3.h:219
DRMP3_API void drmp3_free(void *p, const drmp3_allocation_callbacks *pAllocationCallbacks)
unsigned int drmp3_uint32
Definition dr_mp3.h:109
DRMP3_API drmp3_int16 * drmp3_open_and_read_pcm_frames_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void *pUserData, drmp3_config *pConfig, drmp3_uint64 *pTotalFrameCount, const drmp3_allocation_callbacks *pAllocationCallbacks)
#define DRMP3_VERSION_MAJOR
Definition dr_mp3.h:96
drmp3_uint32 drmp3_uintptr
Definition dr_mp3.h:130
#define DRMP3_INVALID_DATA
Definition dr_mp3.h:201
#define DRMP3_IO_ERROR
Definition dr_mp3.h:188
#define DRMP3_NOT_SOCKET
Definition dr_mp3.h:205
#define DRMP3_VERSION_REVISION
Definition dr_mp3.h:98
DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num_samples)
#define DRMP3_CONNECTION_REFUSED
Definition dr_mp3.h:216
#define DRMP3_FALSE
Definition dr_mp3.h:135
DRMP3_API drmp3_bool32 drmp3_init_file_w(drmp3 *pMP3, const wchar_t *pFilePath, const drmp3_allocation_callbacks *pAllocationCallbacks)
signed long long drmp3_int64
Definition dr_mp3.h:121
#define DRMP3_NO_DATA_AVAILABLE
Definition dr_mp3.h:200
DRMP3_API const char * drmp3_version_string(void)
#define DRMP3_BAD_PROTOCOL
Definition dr_mp3.h:207
#define DRMP3_NO_ADDRESS
Definition dr_mp3.h:206
#define DRMP3_VERSION_STRING
Definition dr_mp3.h:99
#define DRMP3_BAD_PIPE
Definition dr_mp3.h:194
signed short drmp3_int16
Definition dr_mp3.h:106
#define DRMP3_TOO_MANY_OPEN_FILES
Definition dr_mp3.h:177
unsigned long long drmp3_uint64
Definition dr_mp3.h:122
#define DRMP3_TRUE
Definition dr_mp3.h:134
#define DRMP3_ACCESS_DENIED
Definition dr_mp3.h:174
#define DRMP3_TOO_MANY_LINKS
Definition dr_mp3.h:196
#define DRMP3_SOCKET_NOT_SUPPORTED
Definition dr_mp3.h:212
#define DRMP3_INLINE
Definition dr_mp3.h:245
#define DRMP3_NO_SPACE
Definition dr_mp3.h:186
#define DRMP3_DIRECTORY_NOT_EMPTY
Definition dr_mp3.h:184
#define DRMP3_OUT_OF_RANGE
Definition dr_mp3.h:173
#define DRMP3_TOO_BIG
Definition dr_mp3.h:179
drmp3_uint32 drmp3_bool32
Definition dr_mp3.h:133
#define DRMP3_NOT_IMPLEMENTED
Definition dr_mp3.h:197
DRMP3_API drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3 *pMP3, drmp3_uint64 frameIndex)
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 left
struct @113205115357366127300225113341150224053346037032::@137033172036070230260373056156374243321245367362 right
struct backing_store_struct * info
Definition jmemsys.h:183
JSAMPIMAGE data
Definition jpeglib.h:945
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
int int32_t
Definition mid.cpp:97
RangedDirectoryIterator end(const RangedDirectoryIterator &)
Definition juce_RangedDirectoryIterator.h:184
@ window
Definition juce_AccessibilityRole.h:63
constexpr T sign(T val) noexcept
returns +1 if val >= 0, else -1
Definition lmms_math.h:218
png_structrp int mode
Definition png.h:1139
void(* onFree)(void *p, void *pUserData)
Definition dr_mp3.h:331
void *(* onRealloc)(void *p, size_t sz, void *pUserData)
Definition dr_mp3.h:330
void * pUserData
Definition dr_mp3.h:328
void *(* onMalloc)(size_t sz, void *pUserData)
Definition dr_mp3.h:329
drmp3_uint32 sampleRate
Definition dr_mp3.h:337
drmp3_uint32 channels
Definition dr_mp3.h:336
drmp3_uint64 seekPosInBytes
Definition dr_mp3.h:292
drmp3_uint64 pcmFrameIndex
Definition dr_mp3.h:293
drmp3_uint16 mp3FramesToDiscard
Definition dr_mp3.h:294
drmp3_uint16 pcmFramesToDiscard
Definition dr_mp3.h:295
drmp3_uint32 sampleRate
Definition dr_mp3.h:345
size_t dataConsumed
Definition dr_mp3.h:361
drmp3_uint32 pcmFramesConsumedInMP3Frame
Definition dr_mp3.h:352
drmp3_uint64 currentPCMFrame
Definition dr_mp3.h:355
drmp3_uint64 streamCursor
Definition dr_mp3.h:356
drmp3dec_frame_info frameInfo
Definition dr_mp3.h:343
drmp3_uint8 pcmFrames[sizeof(float) *DRMP3_MAX_SAMPLES_PER_FRAME]
Definition dr_mp3.h:354
drmp3_uint8 * pData
Definition dr_mp3.h:362
drmp3_seek_proc onSeek
Definition dr_mp3.h:347
drmp3_read_proc onRead
Definition dr_mp3.h:346
drmp3_allocation_callbacks allocationCallbacks
Definition dr_mp3.h:349
size_t currentReadPos
Definition dr_mp3.h:368
size_t dataCapacity
Definition dr_mp3.h:360
size_t dataSize
Definition dr_mp3.h:359
void * pUserData
Definition dr_mp3.h:348
drmp3_uint32 channels
Definition dr_mp3.h:344
drmp3_uint32 mp3FrameSampleRate
Definition dr_mp3.h:351
drmp3_seek_point * pSeekPoints
Definition dr_mp3.h:357
drmp3_uint32 pcmFramesRemainingInMP3Frame
Definition dr_mp3.h:353
drmp3_uint32 seekPointCount
Definition dr_mp3.h:358
drmp3_bool32 atEnd
Definition dr_mp3.h:363
drmp3_uint32 mp3FrameChannels
Definition dr_mp3.h:350
struct drmp3::@320134365217217210067224336214051237136045136031 memory
drmp3dec decoder
Definition dr_mp3.h:342
int channels
Definition dr_mp3.h:259
int frame_bytes
Definition dr_mp3.h:259
int layer
Definition dr_mp3.h:259
int hz
Definition dr_mp3.h:259
int bitrate_kbps
Definition dr_mp3.h:259
drmp3_uint8 reserv_buf[511]
Definition dr_mp3.h:266
int free_format_bytes
Definition dr_mp3.h:265
int reserv
Definition dr_mp3.h:265
drmp3_uint8 header[4]
Definition dr_mp3.h:266
float mdct_overlap[2][9 *32]
Definition dr_mp3.h:264
float qmf_state[15 *2 *32]
Definition dr_mp3.h:264
signed int sample
Definition tap_dynamics_m.c:41
int n
Definition crypt.c:458
uch * p
Definition crypt.c:594
memcpy(hh, h, RAND_HEAD_LEN)
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
#define SEEK_SET
Definition unzpriv.h:1302
#define SEEK_CUR
Definition unzpriv.h:1303
#define EPIPE
Definition unzpriv.h:1089