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 31
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(_M_ARM64) || 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
264 float mdct_overlap[2][9*32], qmf_state[15*2*32];
310typedef size_t (*
drmp3_read_proc)(
void* pUserData,
void* pBufferOut,
size_t bytesToRead);
329 void* (* onMalloc)(
size_t sz,
void* pUserData);
330 void* (* onRealloc)(
void* p,
size_t sz,
void* pUserData);
331 void (* onFree)(
void* p,
void* pUserData);
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
718#define DRMP3_ASSERT(expression) assert(expression)
720#ifndef DRMP3_COPY_MEMORY
721#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
723#ifndef DRMP3_MOVE_MEMORY
724#define DRMP3_MOVE_MEMORY(dst, src, sz) memmove((dst), (src), (sz))
726#ifndef DRMP3_ZERO_MEMORY
727#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
729#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
731#define DRMP3_MALLOC(sz) malloc((sz))
734#define DRMP3_REALLOC(p, sz) realloc((p), (sz))
737#define DRMP3_FREE(p) free((p))
749 drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64];
750} drmp3_L12_scale_info;
754 drmp3_uint8 tab_offset, code_tab_width, band_count;
755} drmp3_L12_subband_alloc;
760 drmp3_uint16 part_23_length, big_values, scalefac_compress;
761 drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
762 drmp3_uint8 table_select[3], region_count[3], subblock_gain[3];
763 drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi;
769 drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES];
770 drmp3_L3_gr_info gr_info[4];
771 float grbuf[2][576], scf[40], syn[18 + 15][2*32];
775static void drmp3_bs_init(drmp3_bs *bs,
const drmp3_uint8 *data,
int bytes)
782static drmp3_uint32 drmp3_bs_get_bits(drmp3_bs *bs,
int n)
787 if ((bs->pos += n) > bs->limit)
789 next = *p++ & (255 >> s);
790 while ((shl -= 8) > 0)
792 cache |= next << shl;
795 return cache | (next >> -shl);
800 return h[0] == 0xff &&
801 ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&
802 (DRMP3_HDR_GET_LAYER(h) != 0) &&
803 (DRMP3_HDR_GET_BITRATE(h) != 15) &&
804 (DRMP3_HDR_GET_SAMPLE_RATE(h) != 3);
809 return drmp3_hdr_valid(h2) &&
810 ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
811 ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
812 !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2));
815static unsigned drmp3_hdr_bitrate_kbps(
const drmp3_uint8 *h)
818 { { 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 } },
819 { { 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 } },
821 return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(h)][DRMP3_HDR_GET_LAYER(h) - 1][DRMP3_HDR_GET_BITRATE(h)];
824static unsigned drmp3_hdr_sample_rate_hz(
const drmp3_uint8 *h)
826 static const unsigned g_hz[3] = { 44100, 48000, 32000 };
827 return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(h)] >> (int)!DRMP3_HDR_TEST_MPEG1(h) >> (int)!DRMP3_HDR_TEST_NOT_MPEG25(h);
830static unsigned drmp3_hdr_frame_samples(
const drmp3_uint8 *h)
832 return DRMP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)DRMP3_HDR_IS_FRAME_576(h));
835static int drmp3_hdr_frame_bytes(
const drmp3_uint8 *h,
int free_format_size)
837 int frame_bytes = drmp3_hdr_frame_samples(h)*drmp3_hdr_bitrate_kbps(h)*125/drmp3_hdr_sample_rate_hz(h);
838 if (DRMP3_HDR_IS_LAYER_1(h))
842 return frame_bytes ? frame_bytes : free_format_size;
847 return DRMP3_HDR_TEST_PADDING(h) ? (DRMP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
850#ifndef DR_MP3_ONLY_MP3
851static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(
const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci)
853 const drmp3_L12_subband_alloc *alloc;
854 int mode = DRMP3_HDR_GET_STEREO_MODE(hdr);
855 int nbands, stereo_bands = (mode == DRMP3_MODE_MONO) ? 0 : (mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
857 if (DRMP3_HDR_IS_LAYER_1(hdr))
859 static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };
862 }
else if (!DRMP3_HDR_TEST_MPEG1(hdr))
864 static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
865 alloc = g_alloc_L2M2;
869 static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
870 int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr);
871 unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (int)(mode != DRMP3_MODE_MONO);
877 alloc = g_alloc_L2M1;
881 static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
882 alloc = g_alloc_L2M1_lowrate;
883 nbands = sample_rate_idx == 2 ? 12 : 8;
884 }
else if (kbps >= 96 && sample_rate_idx != 1)
891 sci->stereo_bands = (
drmp3_uint8)DRMP3_MIN(stereo_bands, nbands);
896static void drmp3_L12_read_scalefactors(drmp3_bs *bs,
drmp3_uint8 *pba,
drmp3_uint8 *scfcod,
int bands,
float *scf)
898 static const float g_deq_L12[18*3] = {
899#define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
900 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)
903 for (i = 0; i < bands; i++)
907 int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
908 for (m = 4; m; m >>= 1)
912 int b = drmp3_bs_get_bits(bs, 6);
913 s = g_deq_L12[ba*3 - 6 + b % 3]*(int)(1 << 21 >> b/3);
920static void drmp3_L12_read_scale_info(
const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci)
923 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
924 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
925 0,17,18, 3,19,4,5,16,
927 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
928 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
929 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
931 const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci);
933 int i, k = 0, ba_bits = 0;
934 const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab;
936 for (i = 0; i < sci->total_bands; i++)
941 k += subband_alloc->band_count;
942 ba_bits = subband_alloc->code_tab_width;
943 ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
946 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
947 sci->bitalloc[2*i] = ba;
948 if (i < sci->stereo_bands)
950 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
952 sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
955 for (i = 0; i < 2*sci->total_bands; i++)
957 sci->scfcod[i] = (
drmp3_uint8)(sci->bitalloc[i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6);
960 drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
962 for (i = sci->stereo_bands; i < sci->total_bands; i++)
964 sci->bitalloc[2*i + 1] = 0;
968static int drmp3_L12_dequantize_granule(
float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci,
int group_size)
970 int i, j, k, choff = 576;
971 for (j = 0; j < 4; j++)
973 float *dst = grbuf + group_size*j;
974 for (i = 0; i < 2*sci->total_bands; i++)
976 int ba = sci->bitalloc[i];
981 int half = (1 << (ba - 1)) - 1;
982 for (k = 0; k < group_size; k++)
984 dst[k] = (float)((
int)drmp3_bs_get_bits(bs, ba) - half);
988 unsigned mod = (2 << (ba - 17)) + 1;
989 unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3));
990 for (k = 0; k < group_size; k++, code /= mod)
992 dst[k] = (float)((
int)(code % mod - mod/2));
1000 return group_size*4;
1003static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci,
const float *scf,
float *dst)
1006 DRMP3_COPY_MEMORY(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*
sizeof(
float));
1007 for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
1009 for (k = 0; k < 12; k++)
1011 dst[k + 0] *= scf[0];
1012 dst[k + 576] *= scf[3];
1018static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr,
const drmp3_uint8 *hdr)
1021 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
1022 { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
1023 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
1024 { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
1025 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
1026 { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
1027 { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
1028 { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
1031 { 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 },
1032 { 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 },
1033 { 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 },
1034 { 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 },
1035 { 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 },
1036 { 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 },
1037 { 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 },
1038 { 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 }
1041 { 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 },
1042 { 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 },
1043 { 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 },
1044 { 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 },
1045 { 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 },
1046 { 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 },
1047 { 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 },
1048 { 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 }
1051 unsigned tables, scfsi = 0;
1052 int main_data_begin, part_23_sum = 0;
1053 int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
1054 int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
1056 if (DRMP3_HDR_TEST_MPEG1(hdr))
1059 main_data_begin = drmp3_bs_get_bits(bs, 9);
1060 scfsi = drmp3_bs_get_bits(bs, 7 + gr_count);
1063 main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;
1068 if (DRMP3_HDR_IS_MONO(hdr))
1072 gr->part_23_length = (
drmp3_uint16)drmp3_bs_get_bits(bs, 12);
1073 part_23_sum += gr->part_23_length;
1074 gr->big_values = (
drmp3_uint16)drmp3_bs_get_bits(bs, 9);
1075 if (gr->big_values > 288)
1079 gr->global_gain = (
drmp3_uint8)drmp3_bs_get_bits(bs, 8);
1080 gr->scalefac_compress = (
drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);
1081 gr->sfbtab = g_scf_long[sr_idx];
1082 gr->n_long_sfb = 22;
1083 gr->n_short_sfb = 0;
1084 if (drmp3_bs_get_bits(bs, 1))
1086 gr->block_type = (
drmp3_uint8)drmp3_bs_get_bits(bs, 2);
1087 if (!gr->block_type)
1091 gr->mixed_block_flag = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
1092 gr->region_count[0] = 7;
1093 gr->region_count[1] = 255;
1094 if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE)
1097 if (!gr->mixed_block_flag)
1099 gr->region_count[0] = 8;
1100 gr->sfbtab = g_scf_short[sr_idx];
1102 gr->n_short_sfb = 39;
1105 gr->sfbtab = g_scf_mixed[sr_idx];
1106 gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;
1107 gr->n_short_sfb = 30;
1110 tables = drmp3_bs_get_bits(bs, 10);
1112 gr->subblock_gain[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1113 gr->subblock_gain[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1114 gr->subblock_gain[2] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1118 gr->mixed_block_flag = 0;
1119 tables = drmp3_bs_get_bits(bs, 15);
1120 gr->region_count[0] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 4);
1121 gr->region_count[1] = (
drmp3_uint8)drmp3_bs_get_bits(bs, 3);
1122 gr->region_count[2] = 255;
1124 gr->table_select[0] = (
drmp3_uint8)(tables >> 10);
1125 gr->table_select[1] = (
drmp3_uint8)((tables >> 5) & 31);
1126 gr->table_select[2] = (
drmp3_uint8)((tables) & 31);
1127 gr->preflag = (
drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));
1128 gr->scalefac_scale = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
1129 gr->count1_table = (
drmp3_uint8)drmp3_bs_get_bits(bs, 1);
1133 }
while(--gr_count);
1135 if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
1140 return main_data_begin;
1146 for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
1148 int cnt = scf_count[i];
1151 DRMP3_COPY_MEMORY(scf, ist_pos, cnt);
1154 int bits = scf_size[i];
1157 DRMP3_ZERO_MEMORY(scf, cnt);
1158 DRMP3_ZERO_MEMORY(ist_pos, cnt);
1161 int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
1162 for (k = 0; k < cnt; k++)
1164 int s = drmp3_bs_get_bits(bitbuf, bits);
1165 ist_pos[k] = (
drmp3_uint8)(s == max_scf ? -1 : s);
1173 scf[0] = scf[1] = scf[2] = 0;
1176static float drmp3_L3_ldexp_q2(
float y,
int exp_q2)
1178 static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
1182 e = DRMP3_MIN(30*4, exp_q2);
1183 y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
1184 }
while ((exp_q2 -= e) > 0);
1188static 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)
1190 static const drmp3_uint8 g_scf_partitions[3][28] = {
1191 { 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 },
1192 { 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 },
1193 { 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 }
1195 const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
1197 int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
1200 if (DRMP3_HDR_TEST_MPEG1(hdr))
1202 static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
1203 int part = g_scfc_decode[gr->scalefac_compress];
1204 scf_size[1] = scf_size[0] = (
drmp3_uint8)(part >> 2);
1205 scf_size[3] = scf_size[2] = (
drmp3_uint8)(part & 3);
1208 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 };
1209 int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch;
1210 sfc = gr->scalefac_compress >> ist;
1211 for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
1213 for (modprod = 1, i = 3; i >= 0; i--)
1215 scf_size[i] = (
drmp3_uint8)(sfc / modprod % g_mod[k + i]);
1216 modprod *= g_mod[k + i];
1222 drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
1224 if (gr->n_short_sfb)
1226 int sh = 3 - scf_shift;
1227 for (i = 0; i < gr->n_short_sfb; i += 3)
1229 iscf[gr->n_long_sfb + i + 0] = (
drmp3_uint8)(iscf[gr->n_long_sfb + i + 0] + (gr->subblock_gain[0] << sh));
1230 iscf[gr->n_long_sfb + i + 1] = (
drmp3_uint8)(iscf[gr->n_long_sfb + i + 1] + (gr->subblock_gain[1] << sh));
1231 iscf[gr->n_long_sfb + i + 2] = (
drmp3_uint8)(iscf[gr->n_long_sfb + i + 2] + (gr->subblock_gain[2] << sh));
1233 }
else if (gr->preflag)
1235 static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
1236 for (i = 0; i < 10; i++)
1238 iscf[11 + i] = (
drmp3_uint8)(iscf[11 + i] + g_preamp[i]);
1242 gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);
1243 gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4), DRMP3_MAX_SCFI - gain_exp);
1244 for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)
1246 scf[i] = drmp3_L3_ldexp_q2(gain, iscf[i] << scf_shift);
1250static const float g_drmp3_pow43[129 + 16] = {
1251 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,
1252 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
1255static float drmp3_L3_pow_43(
int x)
1258 int sign, mult = 256;
1262 return g_drmp3_pow43[16 + x];
1272 frac = (float)((x & 63) - sign) / ((x & ~63) + sign);
1273 return g_drmp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
1276static void drmp3_L3_huffman(
float *dst, drmp3_bs *bs,
const drmp3_L3_gr_info *gr_info,
const float *scf,
int layer3gr_limit)
1278 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,
1279 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,
1280 -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,
1281 -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,
1282 -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,
1283 -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,
1284 -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,
1285 -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,
1286 -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,
1287 -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,
1288 -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,
1289 -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,
1290 -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,
1291 -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,
1292 -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,
1293 -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 };
1294 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};
1295 static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
1296 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 };
1297 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 };
1299#define DRMP3_PEEK_BITS(n) (bs_cache >> (32 - n))
1300#define DRMP3_FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); }
1301#define DRMP3_CHECK_BITS while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
1302#define DRMP3_BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
1305 int ireg = 0, big_val_cnt = gr_info->big_values;
1307 const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8;
1308 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);
1309 int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
1312 while (big_val_cnt > 0)
1314 int tab_num = gr_info->table_select[ireg];
1315 int sfb_cnt = gr_info->region_count[ireg++];
1316 const drmp3_int16 *codebook = tabs + tabindex[tab_num];
1317 int linbits = g_linbits[tab_num];
1323 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1328 int leaf = codebook[DRMP3_PEEK_BITS(w)];
1331 DRMP3_FLUSH_BITS(w);
1333 leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];
1335 DRMP3_FLUSH_BITS(leaf >> 8);
1337 for (j = 0; j < 2; j++, dst++, leaf >>= 4)
1339 int lsb = leaf & 0x0F;
1342 lsb += DRMP3_PEEK_BITS(linbits);
1343 DRMP3_FLUSH_BITS(linbits);
1345 *dst = one*drmp3_L3_pow_43(lsb)*((
drmp3_int32)bs_cache < 0 ? -1: 1);
1348 *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
1350 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1353 }
while (--pairs_to_decode);
1354 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1360 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1365 int leaf = codebook[DRMP3_PEEK_BITS(w)];
1368 DRMP3_FLUSH_BITS(w);
1370 leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];
1372 DRMP3_FLUSH_BITS(leaf >> 8);
1374 for (j = 0; j < 2; j++, dst++, leaf >>= 4)
1376 int lsb = leaf & 0x0F;
1377 *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
1378 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1381 }
while (--pairs_to_decode);
1382 }
while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1386 for (np = 1 - big_val_cnt;; dst += 4)
1388 const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
1389 int leaf = codebook_count1[DRMP3_PEEK_BITS(4)];
1392 leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
1394 DRMP3_FLUSH_BITS(leaf & 7);
1395 if (DRMP3_BSPOS > layer3gr_limit)
1399#define DRMP3_RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }
1400#define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) }
1401 DRMP3_RELOAD_SCALEFACTOR;
1402 DRMP3_DEQ_COUNT1(0);
1403 DRMP3_DEQ_COUNT1(1);
1404 DRMP3_RELOAD_SCALEFACTOR;
1405 DRMP3_DEQ_COUNT1(2);
1406 DRMP3_DEQ_COUNT1(3);
1410 bs->pos = layer3gr_limit;
1413static void drmp3_L3_midside_stereo(
float *left,
int n)
1416 float *right = left + 576;
1418 if (drmp3_have_simd())
1420 for (; i < n - 3; i += 4)
1422 drmp3_f4 vl = DRMP3_VLD(left + i);
1423 drmp3_f4 vr = DRMP3_VLD(right + i);
1424 DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr));
1425 DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr));
1431 if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0)
1445static void drmp3_L3_intensity_stereo_band(
float *left,
int n,
float kl,
float kr)
1448 for (i = 0; i < n; i++)
1450 left[i + 576] = left[i]*kr;
1451 left[i] = left[i]*kl;
1455static void drmp3_L3_stereo_top_band(
const float *right,
const drmp3_uint8 *sfb,
int nbands,
int max_band[3])
1459 max_band[0] = max_band[1] = max_band[2] = -1;
1461 for (i = 0; i < nbands; i++)
1463 for (k = 0; k < sfb[i]; k += 2)
1465 if (right[k] != 0 || right[k + 1] != 0)
1467 max_band[i % 3] = i;
1477 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 };
1478 unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;
1480 for (i = 0; sfb[i]; i++)
1482 unsigned ipos = ist_pos[i];
1483 if ((
int)i > max_band[i % 3] && ipos < max_pos)
1485 float kl, kr, s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
1486 if (DRMP3_HDR_TEST_MPEG1(hdr))
1489 kr = g_pan[2*ipos + 1];
1493 kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
1500 drmp3_L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);
1501 }
else if (DRMP3_HDR_TEST_MS_STEREO(hdr))
1503 drmp3_L3_midside_stereo(left, sfb[i]);
1509static void drmp3_L3_intensity_stereo(
float *left,
drmp3_uint8 *ist_pos,
const drmp3_L3_gr_info *gr,
const drmp3_uint8 *hdr)
1511 int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
1512 int i, max_blocks = gr->n_short_sfb ? 3 : 1;
1514 drmp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
1517 max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]);
1519 for (i = 0; i < max_blocks; i++)
1521 int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;
1522 int itop = n_sfb - max_blocks + i;
1523 int prev = itop - max_blocks;
1524 ist_pos[itop] = (
drmp3_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]);
1526 drmp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
1529static void drmp3_L3_reorder(
float *grbuf,
float *scratch,
const drmp3_uint8 *sfb)
1532 float *src = grbuf, *dst = scratch;
1534 for (;0 != (len = *sfb); sfb += 3, src += 2*len)
1536 for (i = 0; i < len; i++, src++)
1538 *dst++ = src[0*len];
1539 *dst++ = src[1*len];
1540 *dst++ = src[2*len];
1543 DRMP3_COPY_MEMORY(grbuf, scratch, (dst - scratch)*
sizeof(
float));
1546static void drmp3_L3_antialias(
float *grbuf,
int nbands)
1548 static const float g_aa[2][8] = {
1549 {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
1550 {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
1553 for (; nbands > 0; nbands--, grbuf += 18)
1557 if (drmp3_have_simd())
for (; i < 8; i += 4)
1559 drmp3_f4 vu = DRMP3_VLD(grbuf + 18 + i);
1560 drmp3_f4 vd = DRMP3_VLD(grbuf + 14 - i);
1561 drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] + i);
1562 drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] + i);
1563 vd = DRMP3_VREV(vd);
1564 DRMP3_VSTORE(grbuf + 18 + i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1)));
1565 vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0));
1566 DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vd));
1569#ifndef DR_MP3_ONLY_SIMD
1572 float u = grbuf[18 + i];
1573 float d = grbuf[17 - i];
1574 grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];
1575 grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];
1581static void drmp3_L3_dct3_9(
float *y)
1583 float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
1585 s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];
1588 t4 = (s4 + s2)*0.93969262f;
1589 t2 = (s8 + s2)*0.76604444f;
1590 s6 = (s4 - s8)*0.17364818f;
1599 s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];
1602 t0 = (s5 + s1)*0.98480775f;
1603 t4 = (s5 - s7)*0.34202014f;
1604 t2 = (s1 + s7)*0.64278761f;
1605 s1 = (s1 - s5 - s7)*0.86602540f;
1621static void drmp3_L3_imdct36(
float *grbuf,
float *overlap,
const float *window,
int nbands)
1624 static const float g_twid9[18] = {
1625 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
1628 for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)
1633 for (i = 0; i < 4; i++)
1635 si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2];
1636 co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2];
1637 si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3];
1638 co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);
1640 drmp3_L3_dct3_9(co);
1641 drmp3_L3_dct3_9(si);
1651 if (drmp3_have_simd())
for (; i < 8; i += 4)
1653 drmp3_f4 vovl = DRMP3_VLD(overlap + i);
1654 drmp3_f4 vc = DRMP3_VLD(co + i);
1655 drmp3_f4 vs = DRMP3_VLD(si + i);
1656 drmp3_f4 vr0 = DRMP3_VLD(g_twid9 + i);
1657 drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 + i);
1658 drmp3_f4 vw0 = DRMP3_VLD(window + i);
1659 drmp3_f4 vw1 = DRMP3_VLD(window + 9 + i);
1660 drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0));
1661 DRMP3_VSTORE(overlap + i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1)));
1662 DRMP3_VSTORE(grbuf + i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1)));
1663 vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0));
1664 DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vsum));
1669 float ovl = overlap[i];
1670 float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];
1671 overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];
1672 grbuf[i] = ovl*window[0 + i] - sum*window[9 + i];
1673 grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];
1678static void drmp3_L3_idct3(
float x0,
float x1,
float x2,
float *dst)
1680 float m1 = x1*0.86602540f;
1681 float a1 = x0 - x2*0.5f;
1687static void drmp3_L3_imdct12(
float *x,
float *dst,
float *overlap)
1689 static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
1693 drmp3_L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);
1694 drmp3_L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);
1697 for (i = 0; i < 3; i++)
1699 float ovl = overlap[i];
1700 float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];
1701 overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];
1702 dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];
1703 dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];
1707static void drmp3_L3_imdct_short(
float *grbuf,
float *overlap,
int nbands)
1709 for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
1712 DRMP3_COPY_MEMORY(tmp, grbuf,
sizeof(tmp));
1713 DRMP3_COPY_MEMORY(grbuf, overlap, 6*
sizeof(
float));
1714 drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
1715 drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
1716 drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
1720static void drmp3_L3_change_sign(
float *grbuf)
1723 for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)
1724 for (i = 1; i < 18; i += 2)
1725 grbuf[i] = -grbuf[i];
1728static void drmp3_L3_imdct_gr(
float *grbuf,
float *overlap,
unsigned block_type,
unsigned n_long_bands)
1730 static const float g_mdct_window[2][18] = {
1731 { 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 },
1732 { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
1736 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
1737 grbuf += 18*n_long_bands;
1738 overlap += 9*n_long_bands;
1740 if (block_type == DRMP3_SHORT_BLOCK_TYPE)
1741 drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
1743 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands);
1746static void drmp3_L3_save_reservoir(
drmp3dec *h, drmp3dec_scratch *s)
1748 int pos = (s->bs.pos + 7)/8u;
1749 int remains = s->bs.limit/8u - pos;
1750 if (remains > DRMP3_MAX_BITRESERVOIR_BYTES)
1752 pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES;
1753 remains = DRMP3_MAX_BITRESERVOIR_BYTES;
1757 DRMP3_MOVE_MEMORY(h->
reserv_buf, s->maindata + pos, remains);
1762static int drmp3_L3_restore_reservoir(
drmp3dec *h, drmp3_bs *bs, drmp3dec_scratch *s,
int main_data_begin)
1764 int frame_bytes = (bs->limit - bs->pos)/8;
1765 int bytes_have = DRMP3_MIN(h->
reserv, main_data_begin);
1766 DRMP3_COPY_MEMORY(s->maindata, h->
reserv_buf + DRMP3_MAX(0, h->
reserv - main_data_begin), DRMP3_MIN(h->
reserv, main_data_begin));
1767 DRMP3_COPY_MEMORY(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
1768 drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
1769 return h->
reserv >= main_data_begin;
1772static void drmp3_L3_decode(
drmp3dec *h, drmp3dec_scratch *s, drmp3_L3_gr_info *gr_info,
int nch)
1776 for (ch = 0; ch < nch; ch++)
1778 int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;
1779 drmp3_L3_decode_scalefactors(h->
header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);
1780 drmp3_L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);
1783 if (DRMP3_HDR_TEST_I_STEREO(h->
header))
1785 drmp3_L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->
header);
1786 }
else if (DRMP3_HDR_IS_MS_STEREO(h->
header))
1788 drmp3_L3_midside_stereo(s->grbuf[0], 576);
1791 for (ch = 0; ch < nch; ch++, gr_info++)
1794 int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (
int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(h->
header) == 2);
1796 if (gr_info->n_short_sfb)
1798 aa_bands = n_long_bands - 1;
1799 drmp3_L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
1802 drmp3_L3_antialias(s->grbuf[ch], aa_bands);
1803 drmp3_L3_imdct_gr(s->grbuf[ch], h->
mdct_overlap[ch], gr_info->block_type, n_long_bands);
1804 drmp3_L3_change_sign(s->grbuf[ch]);
1808static void drmp3d_DCT_II(
float *grbuf,
int n)
1810 static const float g_sec[24] = {
1811 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
1815 if (drmp3_have_simd())
for (; k < n; k += 4)
1817 drmp3_f4 t[4][8], *x;
1818 float *y = grbuf + k;
1820 for (x = t[0], i = 0; i < 8; i++, x++)
1822 drmp3_f4 x0 = DRMP3_VLD(&y[i*18]);
1823 drmp3_f4 x1 = DRMP3_VLD(&y[(15 - i)*18]);
1824 drmp3_f4 x2 = DRMP3_VLD(&y[(16 + i)*18]);
1825 drmp3_f4 x3 = DRMP3_VLD(&y[(31 - i)*18]);
1826 drmp3_f4 t0 = DRMP3_VADD(x0, x3);
1827 drmp3_f4 t1 = DRMP3_VADD(x1, x2);
1828 drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1, x2), g_sec[3*i + 0]);
1829 drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*i + 1]);
1830 x[0] = DRMP3_VADD(t0, t1);
1831 x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*i + 2]);
1832 x[16] = DRMP3_VADD(t3, t2);
1833 x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*i + 2]);
1835 for (x = t[0], i = 0; i < 4; i++, x += 8)
1837 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;
1838 xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7);
1839 x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6);
1840 x6 = DRMP3_VSUB(x2, x5); x2 = DRMP3_VADD(x2, x5);
1841 x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4);
1842 x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3);
1843 x3 = DRMP3_VSUB(x1, x2); x1 = DRMP3_VADD(x1, x2);
1844 x[0] = DRMP3_VADD(x0, x1);
1845 x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f);
1846 x5 = DRMP3_VADD(x5, x6);
1847 x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f);
1848 x7 = DRMP3_VADD(x7, xt);
1849 x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f);
1850 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
1851 x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f));
1852 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
1853 x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6);
1854 x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f);
1855 x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f);
1856 x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f);
1857 x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f);
1858 x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f);
1859 x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f);
1865#define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
1867#define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
1869 for (i = 0; i < 7; i++, y += 4*18)
1871 drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);
1872 DRMP3_VSAVE2(0, t[0][i]);
1873 DRMP3_VSAVE2(1, DRMP3_VADD(t[2][i], s));
1874 DRMP3_VSAVE2(2, DRMP3_VADD(t[1][i], t[1][i + 1]));
1875 DRMP3_VSAVE2(3, DRMP3_VADD(t[2][1 + i], s));
1877 DRMP3_VSAVE2(0, t[0][7]);
1878 DRMP3_VSAVE2(1, DRMP3_VADD(t[2][7], t[3][7]));
1879 DRMP3_VSAVE2(2, t[1][7]);
1880 DRMP3_VSAVE2(3, t[3][7]);
1883#define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v)
1884 for (i = 0; i < 7; i++, y += 4*18)
1886 drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);
1887 DRMP3_VSAVE4(0, t[0][i]);
1888 DRMP3_VSAVE4(1, DRMP3_VADD(t[2][i], s));
1889 DRMP3_VSAVE4(2, DRMP3_VADD(t[1][i], t[1][i + 1]));
1890 DRMP3_VSAVE4(3, DRMP3_VADD(t[2][1 + i], s));
1892 DRMP3_VSAVE4(0, t[0][7]);
1893 DRMP3_VSAVE4(1, DRMP3_VADD(t[2][7], t[3][7]));
1894 DRMP3_VSAVE4(2, t[1][7]);
1895 DRMP3_VSAVE4(3, t[3][7]);
1899#ifdef DR_MP3_ONLY_SIMD
1904 float t[4][8], *x, *y = grbuf + k;
1906 for (x = t[0], i = 0; i < 8; i++, x++)
1909 float x1 = y[(15 - i)*18];
1910 float x2 = y[(16 + i)*18];
1911 float x3 = y[(31 - i)*18];
1914 float t2 = (x1 - x2)*g_sec[3*i + 0];
1915 float t3 = (x0 - x3)*g_sec[3*i + 1];
1917 x[8] = (t0 - t1)*g_sec[3*i + 2];
1919 x[24] = (t3 - t2)*g_sec[3*i + 2];
1921 for (x = t[0], i = 0; i < 4; i++, x += 8)
1923 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;
1924 xt = x0 - x7; x0 += x7;
1925 x7 = x1 - x6; x1 += x6;
1926 x6 = x2 - x5; x2 += x5;
1927 x5 = x3 - x4; x3 += x4;
1928 x4 = x0 - x3; x0 += x3;
1929 x3 = x1 - x2; x1 += x2;
1931 x[4] = (x0 - x1)*0.70710677f;
1933 x6 = (x6 + x7)*0.70710677f;
1935 x3 = (x3 + x4)*0.70710677f;
1936 x5 -= x7*0.198912367f;
1937 x7 += x5*0.382683432f;
1938 x5 -= x7*0.198912367f;
1939 x0 = xt - x6; xt += x6;
1940 x[1] = (xt + x7)*0.50979561f;
1941 x[2] = (x4 + x3)*0.54119611f;
1942 x[3] = (x0 - x5)*0.60134488f;
1943 x[5] = (x0 + x5)*0.89997619f;
1944 x[6] = (x4 - x3)*1.30656302f;
1945 x[7] = (xt - x7)*2.56291556f;
1948 for (i = 0; i < 7; i++, y += 4*18)
1951 y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];
1952 y[2*18] = t[1][i] + t[1][i + 1];
1953 y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];
1956 y[1*18] = t[2][7] + t[3][7];
1963#ifndef DR_MP3_FLOAT_OUTPUT
1982typedef float drmp3d_sample_t;
1984static float drmp3d_scale_pcm(
float sample)
1986 return sample*(1.f/32768.f);
1990static void drmp3d_synth_pair(drmp3d_sample_t *pcm,
int nch,
const float *z)
1993 a = (z[14*64] - z[ 0]) * 29;
1994 a += (z[ 1*64] + z[13*64]) * 213;
1995 a += (z[12*64] - z[ 2*64]) * 459;
1996 a += (z[ 3*64] + z[11*64]) * 2037;
1997 a += (z[10*64] - z[ 4*64]) * 5153;
1998 a += (z[ 5*64] + z[ 9*64]) * 6574;
1999 a += (z[ 8*64] - z[ 6*64]) * 37489;
2000 a += z[ 7*64] * 75038;
2001 pcm[0] = drmp3d_scale_pcm(a);
2005 a += z[12*64] * 1567;
2006 a += z[10*64] * 9727;
2007 a += z[ 8*64] * 64019;
2008 a += z[ 6*64] * -9975;
2009 a += z[ 4*64] * -45;
2010 a += z[ 2*64] * 146;
2012 pcm[16*nch] = drmp3d_scale_pcm(a);
2015static void drmp3d_synth(
float *xl, drmp3d_sample_t *dstl,
int nch,
float *lins)
2018 float *xr = xl + 576*(nch - 1);
2019 drmp3d_sample_t *dstr = dstl + (nch - 1);
2021 static const float g_win[] = {
2022 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
2023 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
2024 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
2025 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
2026 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
2027 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
2028 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
2029 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
2030 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
2031 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
2032 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
2033 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
2034 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
2035 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
2036 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
2038 float *zlin = lins + 15*64;
2039 const float *w = g_win;
2041 zlin[4*15] = xl[18*16];
2042 zlin[4*15 + 1] = xr[18*16];
2043 zlin[4*15 + 2] = xl[0];
2044 zlin[4*15 + 3] = xr[0];
2046 zlin[4*31] = xl[1 + 18*16];
2047 zlin[4*31 + 1] = xr[1 + 18*16];
2048 zlin[4*31 + 2] = xl[1];
2049 zlin[4*31 + 3] = xr[1];
2051 drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
2052 drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
2053 drmp3d_synth_pair(dstl, nch, lins + 4*15);
2054 drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
2057 if (drmp3_have_simd())
for (i = 14; i >= 0; i--)
2059#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)]);
2060#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)); }
2061#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))); }
2062#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))); }
2064 zlin[4*i] = xl[18*(31 - i)];
2065 zlin[4*i + 1] = xr[18*(31 - i)];
2066 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
2067 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
2068 zlin[4*i + 64] = xl[1 + 18*(1 + i)];
2069 zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];
2070 zlin[4*i - 64 + 2] = xl[18*(1 + i)];
2071 zlin[4*i - 64 + 3] = xr[18*(1 + i)];
2073 DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7)
2076#ifndef DR_MP3_FLOAT_OUTPUT
2078 static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
2079 static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
2080 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
2081 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
2082 dstr[(15 - i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 1);
2083 dstr[(17 + i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 5);
2084 dstl[(15 - i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 0);
2085 dstl[(17 + i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 4);
2086 dstr[(47 - i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 3);
2087 dstr[(49 + i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 7);
2088 dstl[(47 - i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 2);
2089 dstl[(49 + i)*nch] = (
drmp3_int16)_mm_extract_epi16(pcm8, 6);
2091 int16x4_t pcma, pcmb;
2092 a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
2093 b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
2094 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
2095 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
2096 vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);
2097 vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);
2098 vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);
2099 vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);
2100 vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);
2101 vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);
2102 vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);
2103 vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);
2106 static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
2107 a = DRMP3_VMUL(a, g_scale);
2108 b = DRMP3_VMUL(b, g_scale);
2110 _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
2111 _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));
2112 _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));
2113 _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));
2114 _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));
2115 _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));
2116 _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
2117 _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));
2119 vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);
2120 vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);
2121 vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);
2122 vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);
2123 vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);
2124 vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);
2125 vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);
2126 vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);
2132#ifdef DR_MP3_ONLY_SIMD
2135 for (i = 14; i >= 0; i--)
2137#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];
2138#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; }
2139#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; }
2140#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; }
2143 zlin[4*i] = xl[18*(31 - i)];
2144 zlin[4*i + 1] = xr[18*(31 - i)];
2145 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
2146 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
2147 zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
2148 zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
2149 zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
2150 zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
2152 DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7)
2154 dstr[(15 - i)*nch] = drmp3d_scale_pcm(a[1]);
2155 dstr[(17 + i)*nch] = drmp3d_scale_pcm(b[1]);
2156 dstl[(15 - i)*nch] = drmp3d_scale_pcm(a[0]);
2157 dstl[(17 + i)*nch] = drmp3d_scale_pcm(b[0]);
2158 dstr[(47 - i)*nch] = drmp3d_scale_pcm(a[3]);
2159 dstr[(49 + i)*nch] = drmp3d_scale_pcm(b[3]);
2160 dstl[(47 - i)*nch] = drmp3d_scale_pcm(a[2]);
2161 dstl[(49 + i)*nch] = drmp3d_scale_pcm(b[2]);
2166static void drmp3d_synth_granule(
float *qmf_state,
float *grbuf,
int nbands,
int nch, drmp3d_sample_t *pcm,
float *lins)
2169 for (i = 0; i < nch; i++)
2171 drmp3d_DCT_II(grbuf + 576*i, nbands);
2174 DRMP3_COPY_MEMORY(lins, qmf_state,
sizeof(
float)*15*64);
2176 for (i = 0; i < nbands; i += 2)
2178 drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
2180#ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL
2183 for (i = 0; i < 15*64; i += 2)
2185 qmf_state[i] = lins[nbands*64 + i];
2190 DRMP3_COPY_MEMORY(qmf_state, lins + nbands*64,
sizeof(
float)*15*64);
2194static int drmp3d_match_frame(
const drmp3_uint8 *hdr,
int mp3_bytes,
int frame_bytes)
2197 for (i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++)
2199 i += drmp3_hdr_frame_bytes(hdr + i, frame_bytes) + drmp3_hdr_padding(hdr + i);
2200 if (i + DRMP3_HDR_SIZE > mp3_bytes)
2202 if (!drmp3_hdr_compare(hdr, hdr + i))
2208static int drmp3d_find_frame(
const drmp3_uint8 *mp3,
int mp3_bytes,
int *free_format_bytes,
int *ptr_frame_bytes)
2211 for (i = 0; i < mp3_bytes - DRMP3_HDR_SIZE; i++, mp3++)
2213 if (drmp3_hdr_valid(mp3))
2215 int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes);
2216 int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3);
2218 for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++)
2220 if (drmp3_hdr_compare(mp3, mp3 + k))
2222 int fb = k - drmp3_hdr_padding(mp3);
2223 int nextfb = fb + drmp3_hdr_padding(mp3 + k);
2224 if (i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb))
2226 frame_and_padding = k;
2228 *free_format_bytes = fb;
2232 if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&
2233 drmp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||
2234 (!i && frame_and_padding == mp3_bytes))
2236 *ptr_frame_bytes = frame_and_padding;
2239 *free_format_bytes = 0;
2242 *ptr_frame_bytes = 0;
2253 int i = 0, igr, frame_size = 0, success = 1;
2255 drmp3_bs bs_frame[1];
2256 drmp3dec_scratch scratch;
2258 if (mp3_bytes > 4 && dec->
header[0] == 0xff && drmp3_hdr_compare(dec->
header, mp3))
2260 frame_size = drmp3_hdr_frame_bytes(mp3, dec->
free_format_bytes) + drmp3_hdr_padding(mp3);
2261 if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size)))
2268 DRMP3_ZERO_MEMORY(dec,
sizeof(
drmp3dec));
2270 if (!frame_size || i + frame_size > mp3_bytes)
2278 DRMP3_COPY_MEMORY(dec->
header, hdr, DRMP3_HDR_SIZE);
2280 info->
channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
2281 info->
hz = drmp3_hdr_sample_rate_hz(hdr);
2282 info->
layer = 4 - DRMP3_HDR_GET_LAYER(hdr);
2285 drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE);
2286 if (DRMP3_HDR_IS_CRC(hdr))
2288 drmp3_bs_get_bits(bs_frame, 16);
2291 if (info->
layer == 3)
2293 int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);
2294 if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
2299 success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
2300 if (success && pcm !=
NULL)
2302 for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm,
sizeof(drmp3d_sample_t)*576*info->
channels))
2304 DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*
sizeof(
float));
2305 drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->
channels, info->
channels);
2306 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 18, info->
channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2309 drmp3_L3_save_reservoir(dec, &scratch);
2312#ifdef DR_MP3_ONLY_MP3
2315 drmp3_L12_scale_info sci[1];
2318 return drmp3_hdr_frame_samples(hdr);
2321 drmp3_L12_read_scale_info(hdr, bs_frame, sci);
2323 DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*
sizeof(
float));
2324 for (i = 0, igr = 0; igr < 3; igr++)
2326 if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->
layer | 1)))
2329 drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
2330 drmp3d_synth_granule(dec->
qmf_state, scratch.grbuf[0], 12, info->
channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2331 DRMP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*
sizeof(
float));
2332 pcm = DRMP3_OFFSET_PTR(pcm,
sizeof(drmp3d_sample_t)*384*info->
channels);
2334 if (bs_frame->pos > bs_frame->limit)
2343 return success*drmp3_hdr_frame_samples(dec->
header);
2350 size_t aligned_count = num_samples & ~7;
2351 for(; i < aligned_count; i+=8)
2353 drmp3_f4 scale = DRMP3_VSET(32768.0f);
2354 drmp3_f4 a = DRMP3_VMUL(DRMP3_VLD(&in[i ]), scale);
2355 drmp3_f4 b = DRMP3_VMUL(DRMP3_VLD(&in[i+4]), scale);
2357 drmp3_f4 s16max = DRMP3_VSET( 32767.0f);
2358 drmp3_f4 s16min = DRMP3_VSET(-32768.0f);
2359 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, s16max), s16min)),
2360 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, s16max), s16min)));
2361 out[i ] = (
drmp3_int16)_mm_extract_epi16(pcm8, 0);
2362 out[i+1] = (
drmp3_int16)_mm_extract_epi16(pcm8, 1);
2363 out[i+2] = (
drmp3_int16)_mm_extract_epi16(pcm8, 2);
2364 out[i+3] = (
drmp3_int16)_mm_extract_epi16(pcm8, 3);
2365 out[i+4] = (
drmp3_int16)_mm_extract_epi16(pcm8, 4);
2366 out[i+5] = (
drmp3_int16)_mm_extract_epi16(pcm8, 5);
2367 out[i+6] = (
drmp3_int16)_mm_extract_epi16(pcm8, 6);
2368 out[i+7] = (
drmp3_int16)_mm_extract_epi16(pcm8, 7);
2370 int16x4_t pcma, pcmb;
2371 a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
2372 b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
2373 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
2374 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
2375 vst1_lane_s16(out+i , pcma, 0);
2376 vst1_lane_s16(out+i+1, pcma, 1);
2377 vst1_lane_s16(out+i+2, pcma, 2);
2378 vst1_lane_s16(out+i+3, pcma, 3);
2379 vst1_lane_s16(out+i+4, pcmb, 0);
2380 vst1_lane_s16(out+i+5, pcmb, 1);
2381 vst1_lane_s16(out+i+6, pcmb, 2);
2382 vst1_lane_s16(out+i+7, pcmb, 3);
2386 for(; i < num_samples; i++)
2388 float sample = in[i] * 32768.0f;
2391 else if (
sample <= -32767.5)
2411#if defined(SIZE_MAX)
2412 #define DRMP3_SIZE_MAX SIZE_MAX
2414 #if defined(_WIN64) || defined(_LP64) || defined(__LP64__)
2415 #define DRMP3_SIZE_MAX ((drmp3_uint64)0xFFFFFFFFFFFFFFFF)
2417 #define DRMP3_SIZE_MAX 0xFFFFFFFF
2422#ifndef DRMP3_SEEK_LEADING_MP3_FRAMES
2423#define DRMP3_SEEK_LEADING_MP3_FRAMES 2
2426#define DRMP3_MIN_DATA_CHUNK_SIZE 16384
2429#ifndef DRMP3_DATA_CHUNK_SIZE
2430#define DRMP3_DATA_CHUNK_SIZE DRMP3_MIN_DATA_CHUNK_SIZE*4
2434#define DRMP3_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
2435#define DRMP3_CLAMP(x, lo, hi) (DRMP3_MAX(lo, DRMP3_MIN(x, hi)))
2438#define DRMP3_PI_D 3.14159265358979323846264
2441#define DRMP3_DEFAULT_RESAMPLER_LPF_ORDER 2
2443static DRMP3_INLINE float drmp3_mix_f32(
float x,
float y,
float a)
2445 return x*(1-a) + y*a;
2447static DRMP3_INLINE float drmp3_mix_f32_fast(
float x,
float y,
float a)
2489 return drmp3_sin((DRMP3_PI_D*0.5) - x);
2493static void* drmp3__malloc_default(
size_t sz,
void* pUserData)
2499static void* drmp3__realloc_default(
void* p,
size_t sz,
void* pUserData)
2505static void drmp3__free_default(
void* p,
void* pUserData)
2514 if (pAllocationCallbacks ==
NULL) {
2530static void* drmp3__realloc_from_callbacks(
void* p,
size_t szNew,
size_t szOld,
const drmp3_allocation_callbacks* pAllocationCallbacks)
2532 if (pAllocationCallbacks ==
NULL) {
2550 DRMP3_COPY_MEMORY(p2, p, szOld);
2562 if (p ==
NULL || pAllocationCallbacks ==
NULL) {
2574 if (pAllocationCallbacks !=
NULL) {
2576 return *pAllocationCallbacks;
2581 allocationCallbacks.
onMalloc = drmp3__malloc_default;
2582 allocationCallbacks.
onRealloc = drmp3__realloc_default;
2583 allocationCallbacks.
onFree = drmp3__free_default;
2584 return allocationCallbacks;
2590static size_t drmp3__on_read(
drmp3* pMP3,
void* pBufferOut,
size_t bytesToRead)
2592 size_t bytesRead = pMP3->
onRead(pMP3->
pUserData, pBufferOut, bytesToRead);
2599 DRMP3_ASSERT(offset >= 0);
2616 if (offset <= 0x7FFFFFFF) {
2617 return drmp3__on_seek(pMP3, (
int)offset, origin);
2626 offset -= 0x7FFFFFFF;
2627 while (offset > 0) {
2628 if (offset <= 0x7FFFFFFF) {
2637 offset -= 0x7FFFFFFF;
2645static drmp3_uint32 drmp3_decode_next_frame_ex__callbacks(
drmp3* pMP3, drmp3d_sample_t* pPCMFrames)
2649 DRMP3_ASSERT(pMP3 !=
NULL);
2660 if (pMP3->
dataSize < DRMP3_MIN_DATA_CHUNK_SIZE) {
2674 newDataCap = DRMP3_DATA_CHUNK_SIZE;
2677 if (pNewData ==
NULL) {
2681 pMP3->
pData = pNewData;
2686 if (bytesRead == 0) {
2713 if (pcmFramesRead > 0) {
2714 pcmFramesRead = drmp3_hdr_frame_samples(pMP3->
decoder.
header);
2733 newDataCap = pMP3->
dataCapacity + DRMP3_DATA_CHUNK_SIZE;
2736 if (pNewData ==
NULL) {
2740 pMP3->
pData = pNewData;
2746 if (bytesRead == 0) {
2755 return pcmFramesRead;
2758static drmp3_uint32 drmp3_decode_next_frame_ex__memory(
drmp3* pMP3, drmp3d_sample_t* pPCMFrames)
2763 DRMP3_ASSERT(pMP3 !=
NULL);
2772 if (pcmFramesRead > 0) {
2773 pcmFramesRead = drmp3_hdr_frame_samples(pMP3->
decoder.
header);
2791 return pcmFramesRead;
2794static drmp3_uint32 drmp3_decode_next_frame_ex(
drmp3* pMP3, drmp3d_sample_t* pPCMFrames)
2797 return drmp3_decode_next_frame_ex__memory(pMP3, pPCMFrames);
2799 return drmp3_decode_next_frame_ex__callbacks(pMP3, pPCMFrames);
2805 DRMP3_ASSERT(pMP3 !=
NULL);
2806 return drmp3_decode_next_frame_ex(pMP3, (drmp3d_sample_t*)pMP3->
pcmFrames);
2814 DRMP3_ASSERT(pMP3 !=
NULL);
2816 pcmFrameCount = drmp3_decode_next_frame_ex(pMP3,
NULL);
2817 if (pcmFrameCount == 0) {
2826 return pcmFrameCount;
2832 DRMP3_ASSERT(pMP3 !=
NULL);
2833 DRMP3_ASSERT(onRead !=
NULL);
2841 pMP3->
allocationCallbacks = drmp3_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);
2848 if (drmp3_decode_next_frame(pMP3) == 0) {
2861 if (pMP3 ==
NULL || onRead ==
NULL) {
2865 DRMP3_ZERO_OBJECT(pMP3);
2866 return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pAllocationCallbacks);
2870static size_t drmp3__on_read_memory(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
2873 size_t bytesRemaining;
2875 DRMP3_ASSERT(pMP3 !=
NULL);
2879 if (bytesToRead > bytesRemaining) {
2880 bytesToRead = bytesRemaining;
2883 if (bytesToRead > 0) {
2895 DRMP3_ASSERT(pMP3 !=
NULL);
2898 if (byteOffset > 0) {
2927 DRMP3_ZERO_OBJECT(pMP3);
2929 if (pData ==
NULL || dataSize == 0) {
2937 return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pAllocationCallbacks);
2941#ifndef DR_MP3_NO_STDIO
3222 #ifdef EPROTONOSUPPORT
3225 #ifdef ESOCKTNOSUPPORT
3240 #ifdef EADDRNOTAVAIL
3336 #ifdef ENOTRECOVERABLE
3349static drmp3_result drmp3_fopen(FILE** ppFile,
const char* pFilePath,
const char* pOpenMode)
3351#if defined(_MSC_VER) && _MSC_VER >= 1400
3355 if (ppFile !=
NULL) {
3359 if (pFilePath ==
NULL || pOpenMode ==
NULL || ppFile ==
NULL) {
3363#if defined(_MSC_VER) && _MSC_VER >= 1400
3364 err = fopen_s(ppFile, pFilePath, pOpenMode);
3366 return drmp3_result_from_errno(err);
3369#if defined(_WIN32) || defined(__APPLE__)
3370 *ppFile = fopen(pFilePath, pOpenMode);
3372 #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE)
3373 *ppFile = fopen64(pFilePath, pOpenMode);
3375 *ppFile = fopen(pFilePath, pOpenMode);
3378 if (*ppFile ==
NULL) {
3404 #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS))
3405 #define DRMP3_HAS_WFOPEN
3411 if (ppFile !=
NULL) {
3415 if (pFilePath ==
NULL || pOpenMode ==
NULL || ppFile ==
NULL) {
3419#if defined(DRMP3_HAS_WFOPEN)
3422 #if defined(_MSC_VER) && _MSC_VER >= 1400
3423 errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode);
3425 return drmp3_result_from_errno(err);
3428 *ppFile = _wfopen(pFilePath, pOpenMode);
3429 if (*ppFile ==
NULL) {
3430 return drmp3_result_from_errno(errno);
3433 (void)pAllocationCallbacks;
3444 const wchar_t* pFilePathTemp = pFilePath;
3445 char* pFilePathMB =
NULL;
3446 char pOpenModeMB[32] = {0};
3449 DRMP3_ZERO_OBJECT(&mbs);
3450 lenMB = wcsrtombs(
NULL, &pFilePathTemp, 0, &mbs);
3451 if (lenMB == (
size_t)-1) {
3452 return drmp3_result_from_errno(errno);
3455 pFilePathMB = (
char*)drmp3__malloc_from_callbacks(lenMB + 1, pAllocationCallbacks);
3456 if (pFilePathMB ==
NULL) {
3460 pFilePathTemp = pFilePath;
3461 DRMP3_ZERO_OBJECT(&mbs);
3462 wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs);
3468 if (pOpenMode[i] == 0) {
3469 pOpenModeMB[i] =
'\0';
3473 pOpenModeMB[i] = (char)pOpenMode[i];
3478 *ppFile = fopen(pFilePathMB, pOpenModeMB);
3480 drmp3__free_from_callbacks(pFilePathMB, pAllocationCallbacks);
3483 if (*ppFile ==
NULL) {
3493static size_t drmp3__on_read_stdio(
void* pUserData,
void* pBufferOut,
size_t bytesToRead)
3495 return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);
3508 if (drmp3_fopen(&pFile, pFilePath,
"rb") !=
DRMP3_SUCCESS) {
3512 result =
drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (
void*)pFile, pAllocationCallbacks);
3526 if (drmp3_wfopen(&pFile, pFilePath, L
"rb", pAllocationCallbacks) !=
DRMP3_SUCCESS) {
3530 result =
drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (
void*)pFile, pAllocationCallbacks);
3546#ifndef DR_MP3_NO_STDIO
3547 if (pMP3->
onRead == drmp3__on_read_stdio) {
3549 if (pFile !=
NULL) {
3559#if defined(DR_MP3_FLOAT_OUTPUT)
3568 sampleCount4 = sampleCount >> 2;
3569 for (i4 = 0; i4 < sampleCount4; i4 += 1) {
3570 float x0 = src[i+0];
3571 float x1 = src[i+1];
3572 float x2 = src[i+2];
3573 float x3 = src[i+3];
3575 x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0));
3576 x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1));
3577 x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2));
3578 x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3));
3594 for (; i < sampleCount; i += 1) {
3596 x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));
3604#if !defined(DR_MP3_FLOAT_OUTPUT)
3608 for (i = 0; i < sampleCount; i += 1) {
3609 float x = (float)src[i];
3610 x = x * 0.000030517578125f;
3621 DRMP3_ASSERT(pMP3 !=
NULL);
3624 while (framesToRead > 0) {
3626 if (pBufferOut !=
NULL) {
3627 #if defined(DR_MP3_FLOAT_OUTPUT)
3629 float* pFramesOutF32 = (
float*)DRMP3_OFFSET_PTR(pBufferOut,
sizeof(
float) * totalFramesRead * pMP3->
channels);
3631 DRMP3_COPY_MEMORY(pFramesOutF32, pFramesInF32,
sizeof(
float) * framesToConsume * pMP3->
channels);
3636 DRMP3_COPY_MEMORY(pFramesOutS16, pFramesInS16,
sizeof(
drmp3_int16) * framesToConsume * pMP3->
channels);
3643 totalFramesRead += framesToConsume;
3644 framesToRead -= framesToConsume;
3646 if (framesToRead == 0) {
3656 if (drmp3_decode_next_frame(pMP3) == 0) {
3661 return totalFramesRead;
3671#if defined(DR_MP3_FLOAT_OUTPUT)
3673 return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);
3680 while (totalPCMFramesRead < framesToRead) {
3682 drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead;
3684 if (framesToReadNow > framesRemaining) {
3685 framesToReadNow = framesRemaining;
3688 framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempS16);
3689 if (framesJustRead == 0) {
3693 drmp3_s16_to_f32((
float*)DRMP3_OFFSET_PTR(pBufferOut,
sizeof(
float) * totalPCMFramesRead * pMP3->
channels), pTempS16, framesJustRead * pMP3->
channels);
3694 totalPCMFramesRead += framesJustRead;
3697 return totalPCMFramesRead;
3708#if !defined(DR_MP3_FLOAT_OUTPUT)
3710 return drmp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);
3714 float pTempF32[4096];
3717 while (totalPCMFramesRead < framesToRead) {
3719 drmp3_uint64 framesRemaining = framesToRead - totalPCMFramesRead;
3721 if (framesToReadNow > framesRemaining) {
3722 framesToReadNow = framesRemaining;
3725 framesJustRead = drmp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempF32);
3726 if (framesJustRead == 0) {
3731 totalPCMFramesRead += framesJustRead;
3734 return totalPCMFramesRead;
3739static void drmp3_reset(
drmp3* pMP3)
3741 DRMP3_ASSERT(pMP3 !=
NULL);
3753 DRMP3_ASSERT(pMP3 !=
NULL);
3776#if defined(DR_MP3_FLOAT_OUTPUT)
3781 if (framesRead != frameOffset) {
3790 DRMP3_ASSERT(pMP3 !=
NULL);
3800 if (frameIndex < pMP3->currentPCMFrame) {
3802 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3808 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->
currentPCMFrame));
3815 DRMP3_ASSERT(pSeekPointIndex !=
NULL);
3817 *pSeekPointIndex = 0;
3819 if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) {
3824 for (iSeekPoint = 0; iSeekPoint < pMP3->
seekPointCount; ++iSeekPoint) {
3829 *pSeekPointIndex = iSeekPoint;
3842 DRMP3_ASSERT(pMP3 !=
NULL);
3847 if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) {
3848 seekPoint = pMP3->
pSeekPoints[priorSeekPointIndex];
3867 drmp3d_sample_t* pPCMFrames;
3872 pPCMFrames = (drmp3d_sample_t*)pMP3->
pcmFrames;
3876 pcmFramesRead = drmp3_decode_next_frame_ex(pMP3, pPCMFrames);
3877 if (pcmFramesRead == 0) {
3890 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames);
3899 if (frameIndex == 0) {
3900 return drmp3_seek_to_start_of_stream(pMP3);
3905 return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex);
3907 return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex);
3934 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3938 totalPCMFrameCount = 0;
3939 totalMP3FrameCount = 0;
3944 pcmFramesInCurrentMP3Frame = drmp3_decode_next_frame_ex(pMP3,
NULL);
3945 if (pcmFramesInCurrentMP3Frame == 0) {
3949 totalPCMFrameCount += pcmFramesInCurrentMP3Frame;
3950 totalMP3FrameCount += 1;
3954 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3962 if (pMP3FrameCount !=
NULL) {
3963 *pMP3FrameCount = totalMP3FrameCount;
3965 if (pPCMFrameCount !=
NULL) {
3966 *pPCMFrameCount = totalPCMFrameCount;
3979 return totalPCMFrameCount;
3989 return totalMP3FrameCount;
3992static void drmp3__accumulate_running_pcm_frame_count(
drmp3* pMP3,
drmp3_uint32 pcmFrameCountIn,
drmp3_uint64* pRunningPCMFrameCount,
float* pRunningPCMFrameCountFractionalPart)
3995 float pcmFrameCountOutF;
3999 DRMP3_ASSERT(srcRatio > 0);
4001 pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio);
4003 *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut;
4004 *pRunningPCMFrameCount += pcmFrameCountOut;
4011} drmp3__seeking_mp3_frame_info;
4020 if (pMP3 ==
NULL || pSeekPointCount ==
NULL || pSeekPoints ==
NULL) {
4024 seekPointCount = *pSeekPointCount;
4025 if (seekPointCount == 0) {
4038 if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) {
4046 drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1];
4048 float runningPCMFrameCountFractionalPart = 0;
4053 if (seekPointCount > totalMP3FrameCount-1) {
4057 pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1);
4063 if (!drmp3_seek_to_start_of_stream(pMP3)) {
4073 for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) {
4079 mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount;
4082 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3,
NULL);
4083 if (pcmFramesInCurrentMP3FrameIn == 0) {
4087 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
4094 nextTargetPCMFrame = 0;
4095 for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) {
4096 nextTargetPCMFrame += pcmFramesBetweenSeekPoints;
4099 if (nextTargetPCMFrame < runningPCMFrameCount) {
4101 pSeekPoints[iSeekPoint].
seekPosInBytes = mp3FrameInfo[0].bytePos;
4114 for (i = 0; i < DRMP3_COUNTOF(mp3FrameInfo)-1; ++i) {
4115 mp3FrameInfo[i] = mp3FrameInfo[i+1];
4120 mp3FrameInfo[DRMP3_COUNTOF(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount;
4126 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3,
NULL);
4127 if (pcmFramesInCurrentMP3FrameIn == 0) {
4128 pSeekPoints[iSeekPoint].
seekPosInBytes = mp3FrameInfo[0].bytePos;
4135 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
4141 if (!drmp3_seek_to_start_of_stream(pMP3)) {
4149 *pSeekPointCount = seekPointCount;
4159 if (seekPointCount == 0 || pSeekPoints ==
NULL) {
4177 float* pFrames =
NULL;
4180 DRMP3_ASSERT(pMP3 !=
NULL);
4185 if (framesJustRead == 0) {
4190 if (framesCapacity < totalFramesRead + framesJustRead) {
4196 newFramesCap = framesCapacity * 2;
4197 if (newFramesCap < totalFramesRead + framesJustRead) {
4198 newFramesCap = totalFramesRead + framesJustRead;
4201 oldFramesBufferSize = framesCapacity * pMP3->
channels *
sizeof(float);
4202 newFramesBufferSize = newFramesCap * pMP3->
channels *
sizeof(float);
4203 if (newFramesBufferSize > (
drmp3_uint64)DRMP3_SIZE_MAX) {
4207 pNewFrames = (
float*)drmp3__realloc_from_callbacks(pFrames, (
size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->
allocationCallbacks);
4208 if (pNewFrames ==
NULL) {
4213 pFrames = pNewFrames;
4214 framesCapacity = newFramesCap;
4217 DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->
channels, temp, (
size_t)(framesJustRead*pMP3->
channels*
sizeof(
float)));
4218 totalFramesRead += framesJustRead;
4221 if (framesJustRead != framesToReadRightNow) {
4226 if (pConfig !=
NULL) {
4233 if (pTotalFrameCount) {
4234 *pTotalFrameCount = totalFramesRead;
4247 DRMP3_ASSERT(pMP3 !=
NULL);
4252 if (framesJustRead == 0) {
4257 if (framesCapacity < totalFramesRead + framesJustRead) {
4263 newFramesCap = framesCapacity * 2;
4264 if (newFramesCap < totalFramesRead + framesJustRead) {
4265 newFramesCap = totalFramesRead + framesJustRead;
4270 if (newFramesBufferSize > (
drmp3_uint64)DRMP3_SIZE_MAX) {
4274 pNewFrames = (
drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (
size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->
allocationCallbacks);
4275 if (pNewFrames ==
NULL) {
4280 pFrames = pNewFrames;
4281 framesCapacity = newFramesCap;
4285 totalFramesRead += framesJustRead;
4288 if (framesJustRead != framesToReadRightNow) {
4293 if (pConfig !=
NULL) {
4300 if (pTotalFrameCount) {
4301 *pTotalFrameCount = totalFramesRead;
4311 if (!
drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {
4315 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
4321 if (!
drmp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {
4325 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
4336 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
4346 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
4350#ifndef DR_MP3_NO_STDIO
4358 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
4368 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
4374 if (pAllocationCallbacks !=
NULL) {
4375 return drmp3__malloc_from_callbacks(sz, pAllocationCallbacks);
4377 return drmp3__malloc_default(sz,
NULL);
4383 if (pAllocationCallbacks !=
NULL) {
4384 drmp3__free_from_callbacks(p, pAllocationCallbacks);
4386 drmp3__free_default(p,
NULL);
#define DRMP3_ALREADY_CONNECTED
unsigned char drmp3_uint8
#define DRMP3_INVALID_OPERATION
#define DRMP3_DOES_NOT_EXIST
@ drmp3_seek_origin_start
@ drmp3_seek_origin_current
DRMP3_API drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3 *pMP3, drmp3_uint64 framesToRead, float *pBufferOut)
#define DRMP3_UNAVAILABLE
unsigned short drmp3_uint16
#define DRMP3_NOT_DIRECTORY
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
#define DRMP3_IN_PROGRESS
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
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
#define DRMP3_PATH_TOO_LONG
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
DRMP3_API void drmp3_uninit(drmp3 *pMP3)
#define DRMP3_PROTOCOL_UNAVAILABLE
drmp3_bool32(* drmp3_seek_proc)(void *pUserData, int offset, drmp3_seek_origin origin)
#define DRMP3_INVALID_ARGS
#define DRMP3_IS_DIRECTORY
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_CONNECTION_RESET
#define DRMP3_PROTOCOL_NOT_SUPPORTED
#define DRMP3_ALREADY_EXISTS
DRMP3_API drmp3_uint64 drmp3_get_mp3_frame_count(drmp3 *pMP3)
#define DRMP3_OUT_OF_MEMORY
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
DRMP3_API drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3 *pMP3, drmp3_uint64 *pMP3FrameCount, drmp3_uint64 *pPCMFrameCount)
#define DRMP3_INVALID_FILE
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
#define DRMP3_ADDRESS_FAMILY_NOT_SUPPORTED
DRMP3_API void * drmp3_malloc(size_t sz, const drmp3_allocation_callbacks *pAllocationCallbacks)
#define DRMP3_MAX_SAMPLES_PER_FRAME
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)
DRMP3_API drmp3_uint64 drmp3_get_pcm_frame_count(drmp3 *pMP3)
DRMP3_API void drmp3dec_init(drmp3dec *dec)
DRMP3_API void drmp3_free(void *p, const drmp3_allocation_callbacks *pAllocationCallbacks)
unsigned int drmp3_uint32
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
drmp3_uint32 drmp3_uintptr
#define DRMP3_INVALID_DATA
#define DRMP3_VERSION_REVISION
DRMP3_API void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, size_t num_samples)
#define DRMP3_CONNECTION_REFUSED
DRMP3_API drmp3_bool32 drmp3_init_file_w(drmp3 *pMP3, const wchar_t *pFilePath, const drmp3_allocation_callbacks *pAllocationCallbacks)
signed long long drmp3_int64
#define DRMP3_NO_DATA_AVAILABLE
DRMP3_API const char * drmp3_version_string(void)
#define DRMP3_BAD_PROTOCOL
#define DRMP3_VERSION_STRING
#define DRMP3_TOO_MANY_OPEN_FILES
unsigned long long drmp3_uint64
#define DRMP3_ACCESS_DENIED
#define DRMP3_TOO_MANY_LINKS
#define DRMP3_SOCKET_NOT_SUPPORTED
#define DRMP3_DIRECTORY_NOT_EMPTY
#define DRMP3_OUT_OF_RANGE
drmp3_uint32 drmp3_bool32
#define DRMP3_NOT_IMPLEMENTED
DRMP3_API drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3 *pMP3, drmp3_uint64 frameIndex)
void(* onFree)(void *p, void *pUserData)
void *(* onRealloc)(void *p, size_t sz, void *pUserData)
void *(* onMalloc)(size_t sz, void *pUserData)
drmp3_uint64 seekPosInBytes
drmp3_uint64 pcmFrameIndex
drmp3_uint16 mp3FramesToDiscard
drmp3_uint16 pcmFramesToDiscard
drmp3_uint32 pcmFramesConsumedInMP3Frame
drmp3_uint64 currentPCMFrame
const drmp3_uint8 * pData
drmp3_uint64 streamCursor
drmp3dec_frame_info frameInfo
drmp3_uint8 pcmFrames[sizeof(float) *DRMP3_MAX_SAMPLES_PER_FRAME]
drmp3_allocation_callbacks allocationCallbacks
drmp3_uint32 mp3FrameSampleRate
drmp3_seek_point * pSeekPoints
drmp3_uint32 pcmFramesRemainingInMP3Frame
drmp3_uint32 seekPointCount
drmp3_uint32 mp3FrameChannels
drmp3_uint8 reserv_buf[511]
float mdct_overlap[2][9 *32]
float qmf_state[15 *2 *32]