1/*
2MP3 audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.
3dr_mp3 - v0.4.7 - 2019-07-28
4
5David Reid - mackron@gmail.com
6
7Based off minimp3 (https://github.com/lieff/minimp3) which is where the real work was done. See the bottom of this file for
8differences between minimp3 and dr_mp3.
9*/
10
11/*
12USAGE
13=====
14dr_mp3 is a single-file library. To use it, do something like the following in one .c file.
15 #define DR_MP3_IMPLEMENTATION
16 #include "dr_mp3.h"
17
18You can then #include this file in other parts of the program as you would with any other header file. To decode audio data,
19do something like the following:
20
21 drmp3 mp3;
22 if (!drmp3_init_file(&mp3, "MySong.mp3", NULL)) {
23 // Failed to open file
24 }
25
26 ...
27
28 drmp3_uint64 framesRead = drmp3_read_pcm_frames_f32(pMP3, framesToRead, pFrames);
29
30The drmp3 object is transparent so you can get access to the channel count and sample rate like so:
31
32 drmp3_uint32 channels = mp3.channels;
33 drmp3_uint32 sampleRate = mp3.sampleRate;
34
35The third parameter of drmp3_init_file() in the example above allows you to control the output channel count and sample rate. It
36is a pointer to a drmp3_config object. Setting any of the variables of this object to 0 will cause dr_mp3 to use defaults.
37
38The example above initializes a decoder from a file, but you can also initialize it from a block of memory and read and seek
39callbacks with drmp3_init_memory() and drmp3_init() respectively.
40
41You do not need to do any annoying memory management when reading PCM frames - this is all managed internally. You can request
42any number of PCM frames in each call to drmp3_read_pcm_frames_f32() and it will return as many PCM frames as it can, up to the
43requested amount.
44
45You can also decode an entire file in one go with drmp3_open_and_read_f32(), drmp3_open_memory_and_read_f32() and
46drmp3_open_file_and_read_f32().
47
48
49OPTIONS
50=======
51#define these options before including this file.
52
53#define DR_MP3_NO_STDIO
54 Disable drmp3_init_file(), etc.
55
56#define DR_MP3_NO_SIMD
57 Disable SIMD optimizations.
58*/
59
60#ifndef dr_mp3_h
61#define dr_mp3_h
62
63#ifdef __cplusplus
64extern "C" {
65#endif
66
67#include <stddef.h>
68
69#if defined(_MSC_VER) && _MSC_VER < 1600
70typedef signed char drmp3_int8;
71typedef unsigned char drmp3_uint8;
72typedef signed short drmp3_int16;
73typedef unsigned short drmp3_uint16;
74typedef signed int drmp3_int32;
75typedef unsigned int drmp3_uint32;
76typedef signed __int64 drmp3_int64;
77typedef unsigned __int64 drmp3_uint64;
78#else
79#include <stdint.h>
80typedef int8_t drmp3_int8;
81typedef uint8_t drmp3_uint8;
82typedef int16_t drmp3_int16;
83typedef uint16_t drmp3_uint16;
84typedef int32_t drmp3_int32;
85typedef uint32_t drmp3_uint32;
86typedef int64_t drmp3_int64;
87typedef uint64_t drmp3_uint64;
88#endif
89typedef drmp3_uint8 drmp3_bool8;
90typedef drmp3_uint32 drmp3_bool32;
91#define DRMP3_TRUE 1
92#define DRMP3_FALSE 0
93
94#define DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152
95#define DRMP3_MAX_SAMPLES_PER_FRAME (DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2)
96
97#ifdef _MSC_VER
98#define DRMP3_INLINE __forceinline
99#else
100#ifdef __GNUC__
101#define DRMP3_INLINE __inline__ __attribute__((always_inline))
102#else
103#define DRMP3_INLINE
104#endif
105#endif
106
107/*
108Low Level Push API
109==================
110*/
111typedef struct
112{
113 int frame_bytes, channels, hz, layer, bitrate_kbps;
114} drmp3dec_frame_info;
115
116typedef struct
117{
118 float mdct_overlap[2][9*32], qmf_state[15*2*32];
119 int reserv, free_format_bytes;
120 unsigned char header[4], reserv_buf[511];
121} drmp3dec;
122
123/* Initializes a low level decoder. */
124void drmp3dec_init(drmp3dec *dec);
125
126/* Reads a frame from a low level decoder. */
127int drmp3dec_decode_frame(drmp3dec *dec, const unsigned char *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info);
128
129/* Helper for converting between f32 and s16. */
130void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, int num_samples);
131
132
133
134/*
135Main API (Pull API)
136===================
137*/
138#ifndef DR_MP3_DEFAULT_CHANNELS
139#define DR_MP3_DEFAULT_CHANNELS 2
140#endif
141#ifndef DR_MP3_DEFAULT_SAMPLE_RATE
142#define DR_MP3_DEFAULT_SAMPLE_RATE 44100
143#endif
144
145typedef struct drmp3_src drmp3_src;
146typedef drmp3_uint64 (* drmp3_src_read_proc)(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, void* pUserData); /* Returns the number of frames that were read. */
147
148typedef enum
149{
150 drmp3_src_algorithm_none,
151 drmp3_src_algorithm_linear
152} drmp3_src_algorithm;
153
154#define DRMP3_SRC_CACHE_SIZE_IN_FRAMES 512
155typedef struct
156{
157 drmp3_src* pSRC;
158 float pCachedFrames[2 * DRMP3_SRC_CACHE_SIZE_IN_FRAMES];
159 drmp3_uint32 cachedFrameCount;
160 drmp3_uint32 iNextFrame;
161} drmp3_src_cache;
162
163typedef struct
164{
165 drmp3_uint32 sampleRateIn;
166 drmp3_uint32 sampleRateOut;
167 drmp3_uint32 channels;
168 drmp3_src_algorithm algorithm;
169 drmp3_uint32 cacheSizeInFrames; /* The number of frames to read from the client at a time. */
170} drmp3_src_config;
171
172struct drmp3_src
173{
174 drmp3_src_config config;
175 drmp3_src_read_proc onRead;
176 void* pUserData;
177 float bin[256];
178 drmp3_src_cache cache; /* <-- For simplifying and optimizing client -> memory reading. */
179 union
180 {
181 struct
182 {
183 double alpha;
184 drmp3_bool32 isPrevFramesLoaded : 1;
185 drmp3_bool32 isNextFramesLoaded : 1;
186 } linear;
187 } algo;
188};
189
190typedef enum
191{
192 drmp3_seek_origin_start,
193 drmp3_seek_origin_current
194} drmp3_seek_origin;
195
196typedef struct
197{
198 drmp3_uint64 seekPosInBytes; /* Points to the first byte of an MP3 frame. */
199 drmp3_uint64 pcmFrameIndex; /* The index of the PCM frame this seek point targets. */
200 drmp3_uint16 mp3FramesToDiscard; /* The number of whole MP3 frames to be discarded before pcmFramesToDiscard. */
201 drmp3_uint16 pcmFramesToDiscard; /* The number of leading samples to read and discard. These are discarded after mp3FramesToDiscard. */
202} drmp3_seek_point;
203
204/*
205Callback for when data is read. Return value is the number of bytes actually read.
206
207pUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family.
208pBufferOut [out] The output buffer.
209bytesToRead [in] The number of bytes to read.
210
211Returns the number of bytes actually read.
212
213A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until
214either the entire bytesToRead is filled or you have reached the end of the stream.
215*/
216typedef size_t (* drmp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);
217
218/*
219Callback for when data needs to be seeked.
220
221pUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family.
222offset [in] The number of bytes to move, relative to the origin. Will never be negative.
223origin [in] The origin of the seek - the current position or the start of the stream.
224
225Returns whether or not the seek was successful.
226
227Whether or not it is relative to the beginning or current position is determined by the "origin" parameter which
228will be either drmp3_seek_origin_start or drmp3_seek_origin_current.
229*/
230typedef drmp3_bool32 (* drmp3_seek_proc)(void* pUserData, int offset, drmp3_seek_origin origin);
231
232typedef struct
233{
234 drmp3_uint32 outputChannels;
235 drmp3_uint32 outputSampleRate;
236} drmp3_config;
237
238typedef struct
239{
240 drmp3dec decoder;
241 drmp3dec_frame_info frameInfo;
242 drmp3_uint32 channels;
243 drmp3_uint32 sampleRate;
244 drmp3_read_proc onRead;
245 drmp3_seek_proc onSeek;
246 void* pUserData;
247 drmp3_uint32 mp3FrameChannels; /* The number of channels in the currently loaded MP3 frame. Internal use only. */
248 drmp3_uint32 mp3FrameSampleRate; /* The sample rate of the currently loaded MP3 frame. Internal use only. */
249 drmp3_uint32 pcmFramesConsumedInMP3Frame;
250 drmp3_uint32 pcmFramesRemainingInMP3Frame;
251 drmp3_uint8 pcmFrames[sizeof(float)*DRMP3_MAX_SAMPLES_PER_FRAME]; /* <-- Multipled by sizeof(float) to ensure there's enough room for DR_MP3_FLOAT_OUTPUT. */
252 drmp3_uint64 currentPCMFrame; /* The current PCM frame, globally, based on the output sample rate. Mainly used for seeking. */
253 drmp3_uint64 streamCursor; /* The current byte the decoder is sitting on in the raw stream. */
254 drmp3_src src;
255 drmp3_seek_point* pSeekPoints; /* NULL by default. Set with drmp3_bind_seek_table(). Memory is owned by the client. dr_mp3 will never attempt to free this pointer. */
256 drmp3_uint32 seekPointCount; /* The number of items in pSeekPoints. When set to 0 assumes to no seek table. Defaults to zero. */
257 size_t dataSize;
258 size_t dataCapacity;
259 drmp3_uint8* pData;
260 drmp3_bool32 atEnd : 1;
261 struct
262 {
263 const drmp3_uint8* pData;
264 size_t dataSize;
265 size_t currentReadPos;
266 } memory; /* Only used for decoders that were opened against a block of memory. */
267} drmp3;
268
269/*
270Initializes an MP3 decoder.
271
272onRead [in] The function to call when data needs to be read from the client.
273onSeek [in] The function to call when the read position of the client data needs to move.
274pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek.
275
276Returns true if successful; false otherwise.
277
278Close the loader with drmp3_uninit().
279
280See also: drmp3_init_file(), drmp3_init_memory(), drmp3_uninit()
281*/
282drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig);
283
284/*
285Initializes an MP3 decoder from a block of memory.
286
287This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for
288the lifetime of the drmp3 object.
289
290The buffer should contain the contents of the entire MP3 file.
291*/
292drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_config* pConfig);
293
294#ifndef DR_MP3_NO_STDIO
295/*
296Initializes an MP3 decoder from a file.
297
298This holds the internal FILE object until drmp3_uninit() is called. Keep this in mind if you're caching drmp3
299objects because the operating system may restrict the number of file handles an application can have open at
300any given time.
301*/
302drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* filePath, const drmp3_config* pConfig);
303#endif
304
305/*
306Uninitializes an MP3 decoder.
307*/
308void drmp3_uninit(drmp3* pMP3);
309
310/*
311Reads PCM frames as interleaved 32-bit IEEE floating point PCM.
312
313Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames.
314*/
315drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut);
316
317/*
318Reads PCM frames as interleaved signed 16-bit integer PCM.
319
320Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames.
321*/
322drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut);
323
324/*
325Seeks to a specific frame.
326
327Note that this is _not_ an MP3 frame, but rather a PCM frame.
328*/
329drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex);
330
331/*
332Calculates the total number of PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet
333radio. Runs in linear time. Returns 0 on error.
334*/
335drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3);
336
337/*
338Calculates the total number of MP3 frames in the MP3 stream. Cannot be used for infinite streams such as internet
339radio. Runs in linear time. Returns 0 on error.
340*/
341drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3);
342
343/*
344Calculates the total number of MP3 and PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet
345radio. Runs in linear time. Returns 0 on error.
346
347This is equivalent to calling drmp3_get_mp3_frame_count() and drmp3_get_pcm_frame_count() except that it's more efficient.
348*/
349drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount);
350
351/*
352Calculates the seekpoints based on PCM frames. This is slow.
353
354pSeekpoint count is a pointer to a uint32 containing the seekpoint count. On input it contains the desired count.
355On output it contains the actual count. The reason for this design is that the client may request too many
356seekpoints, in which case dr_mp3 will return a corrected count.
357
358Note that seektable seeking is not quite sample exact when the MP3 stream contains inconsistent sample rates.
359*/
360drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints);
361
362/*
363Binds a seek table to the decoder.
364
365This does _not_ make a copy of pSeekPoints - it only references it. It is up to the application to ensure this
366remains valid while it is bound to the decoder.
367
368Use drmp3_calculate_seek_points() to calculate the seek points.
369*/
370drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints);
371
372
373/*
374Opens an decodes an entire MP3 stream as a single operation.
375
376pConfig is both an input and output. On input it contains what you want. On output it contains what you got.
377
378Free the returned pointer with drmp3_free().
379*/
380float* drmp3_open_and_read_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount);
381drmp3_int16* drmp3_open_and_read_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount);
382
383float* drmp3_open_memory_and_read_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount);
384drmp3_int16* drmp3_open_memory_and_read_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount);
385
386#ifndef DR_MP3_NO_STDIO
387float* drmp3_open_file_and_read_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount);
388drmp3_int16* drmp3_open_file_and_read_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount);
389#endif
390
391/*
392Frees any memory that was allocated by a public drmp3 API.
393*/
394void drmp3_free(void* p);
395
396#ifdef __cplusplus
397}
398#endif
399#endif /* dr_mp3_h */
400
401
402/************************************************************************************************************************************************************
403 ************************************************************************************************************************************************************
404
405 IMPLEMENTATION
406
407 ************************************************************************************************************************************************************
408 ************************************************************************************************************************************************************/
409#ifdef DR_MP3_IMPLEMENTATION
410#include <stdlib.h>
411#include <string.h>
412#include <limits.h> /* For INT_MAX */
413
414/* Disable SIMD when compiling with TCC for now. */
415#if defined(__TINYC__)
416#define DR_MP3_NO_SIMD
417#endif
418
419#define DRMP3_OFFSET_PTR(p, offset) ((void*)((drmp3_uint8*)(p) + (offset)))
420
421#define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */
422#ifndef DRMP3_MAX_FRAME_SYNC_MATCHES
423#define DRMP3_MAX_FRAME_SYNC_MATCHES 10
424#endif
425
426#define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES DRMP3_MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */
427
428#define DRMP3_MAX_BITRESERVOIR_BYTES 511
429#define DRMP3_SHORT_BLOCK_TYPE 2
430#define DRMP3_STOP_BLOCK_TYPE 3
431#define DRMP3_MODE_MONO 3
432#define DRMP3_MODE_JOINT_STEREO 1
433#define DRMP3_HDR_SIZE 4
434#define DRMP3_HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0)
435#define DRMP3_HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60)
436#define DRMP3_HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0)
437#define DRMP3_HDR_IS_CRC(h) (!((h[1]) & 1))
438#define DRMP3_HDR_TEST_PADDING(h) ((h[2]) & 0x2)
439#define DRMP3_HDR_TEST_MPEG1(h) ((h[1]) & 0x8)
440#define DRMP3_HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10)
441#define DRMP3_HDR_TEST_I_STEREO(h) ((h[3]) & 0x10)
442#define DRMP3_HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20)
443#define DRMP3_HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3)
444#define DRMP3_HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3)
445#define DRMP3_HDR_GET_LAYER(h) (((h[1]) >> 1) & 3)
446#define DRMP3_HDR_GET_BITRATE(h) ((h[2]) >> 4)
447#define DRMP3_HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3)
448#define DRMP3_HDR_GET_MY_SAMPLE_RATE(h) (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)
449#define DRMP3_HDR_IS_FRAME_576(h) ((h[1] & 14) == 2)
450#define DRMP3_HDR_IS_LAYER_1(h) ((h[1] & 6) == 6)
451
452#define DRMP3_BITS_DEQUANTIZER_OUT -1
453#define DRMP3_MAX_SCF (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210)
454#define DRMP3_MAX_SCFI ((DRMP3_MAX_SCF + 3) & ~3)
455
456#define DRMP3_MIN(a, b) ((a) > (b) ? (b) : (a))
457#define DRMP3_MAX(a, b) ((a) < (b) ? (b) : (a))
458
459#if !defined(DR_MP3_NO_SIMD)
460
461#if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__))
462/* x64 always have SSE2, arm64 always have neon, no need for generic code */
463#define DR_MP3_ONLY_SIMD
464#endif
465
466#if ((defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
467#if defined(_MSC_VER)
468#include <intrin.h>
469#endif
470#include <emmintrin.h>
471#define DRMP3_HAVE_SSE 1
472#define DRMP3_HAVE_SIMD 1
473#define DRMP3_VSTORE _mm_storeu_ps
474#define DRMP3_VLD _mm_loadu_ps
475#define DRMP3_VSET _mm_set1_ps
476#define DRMP3_VADD _mm_add_ps
477#define DRMP3_VSUB _mm_sub_ps
478#define DRMP3_VMUL _mm_mul_ps
479#define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))
480#define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))
481#define DRMP3_VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s))
482#define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))
483typedef __m128 drmp3_f4;
484#if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD)
485#define drmp3_cpuid __cpuid
486#else
487static __inline__ __attribute__((always_inline)) void drmp3_cpuid(int CPUInfo[], const int InfoType)
488{
489#if defined(__PIC__)
490 __asm__ __volatile__(
491#if defined(__x86_64__)
492 "push %%rbx\n"
493 "cpuid\n"
494 "xchgl %%ebx, %1\n"
495 "pop %%rbx\n"
496#else
497 "xchgl %%ebx, %1\n"
498 "cpuid\n"
499 "xchgl %%ebx, %1\n"
500#endif
501 : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
502 : "a" (InfoType));
503#else
504 __asm__ __volatile__(
505 "cpuid"
506 : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
507 : "a" (InfoType));
508#endif
509}
510#endif
511static int drmp3_have_simd()
512{
513#ifdef DR_MP3_ONLY_SIMD
514 return 1;
515#else
516 static int g_have_simd;
517 int CPUInfo[4];
518#ifdef MINIMP3_TEST
519 static int g_counter;
520 if (g_counter++ > 100)
521 return 0;
522#endif
523 if (g_have_simd)
524 goto end;
525 drmp3_cpuid(CPUInfo, 0);
526 if (CPUInfo[0] > 0)
527 {
528 drmp3_cpuid(CPUInfo, 1);
529 g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */
530 return g_have_simd - 1;
531 }
532
533end:
534 return g_have_simd - 1;
535#endif
536}
537#elif defined(__ARM_NEON) || defined(__aarch64__)
538#include <arm_neon.h>
539#define DRMP3_HAVE_SIMD 1
540#define DRMP3_VSTORE vst1q_f32
541#define DRMP3_VLD vld1q_f32
542#define DRMP3_VSET vmovq_n_f32
543#define DRMP3_VADD vaddq_f32
544#define DRMP3_VSUB vsubq_f32
545#define DRMP3_VMUL vmulq_f32
546#define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y)
547#define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y)
548#define DRMP3_VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s))
549#define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))
550typedef float32x4_t drmp3_f4;
551static int drmp3_have_simd()
552{ /* TODO: detect neon for !DR_MP3_ONLY_SIMD */
553 return 1;
554}
555#else
556#define DRMP3_HAVE_SIMD 0
557#ifdef DR_MP3_ONLY_SIMD
558#error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled
559#endif
560#endif
561
562#else
563
564#define DRMP3_HAVE_SIMD 0
565
566#endif
567
568typedef struct
569{
570 const drmp3_uint8 *buf;
571 int pos, limit;
572} drmp3_bs;
573
574typedef struct
575{
576 float scf[3*64];
577 drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64];
578} drmp3_L12_scale_info;
579
580typedef struct
581{
582 drmp3_uint8 tab_offset, code_tab_width, band_count;
583} drmp3_L12_subband_alloc;
584
585typedef struct
586{
587 const drmp3_uint8 *sfbtab;
588 drmp3_uint16 part_23_length, big_values, scalefac_compress;
589 drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
590 drmp3_uint8 table_select[3], region_count[3], subblock_gain[3];
591 drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi;
592} drmp3_L3_gr_info;
593
594typedef struct
595{
596 drmp3_bs bs;
597 drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES];
598 drmp3_L3_gr_info gr_info[4];
599 float grbuf[2][576], scf[40], syn[18 + 15][2*32];
600 drmp3_uint8 ist_pos[2][39];
601} drmp3dec_scratch;
602
603static void drmp3_bs_init(drmp3_bs *bs, const drmp3_uint8 *data, int bytes)
604{
605 bs->buf = data;
606 bs->pos = 0;
607 bs->limit = bytes*8;
608}
609
610static drmp3_uint32 drmp3_bs_get_bits(drmp3_bs *bs, int n)
611{
612 drmp3_uint32 next, cache = 0, s = bs->pos & 7;
613 int shl = n + s;
614 const drmp3_uint8 *p = bs->buf + (bs->pos >> 3);
615 if ((bs->pos += n) > bs->limit)
616 return 0;
617 next = *p++ & (255 >> s);
618 while ((shl -= 8) > 0)
619 {
620 cache |= next << shl;
621 next = *p++;
622 }
623 return cache | (next >> -shl);
624}
625
626static int drmp3_hdr_valid(const drmp3_uint8 *h)
627{
628 return h[0] == 0xff &&
629 ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&
630 (DRMP3_HDR_GET_LAYER(h) != 0) &&
631 (DRMP3_HDR_GET_BITRATE(h) != 15) &&
632 (DRMP3_HDR_GET_SAMPLE_RATE(h) != 3);
633}
634
635static int drmp3_hdr_compare(const drmp3_uint8 *h1, const drmp3_uint8 *h2)
636{
637 return drmp3_hdr_valid(h2) &&
638 ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
639 ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
640 !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2));
641}
642
643static unsigned drmp3_hdr_bitrate_kbps(const drmp3_uint8 *h)
644{
645 static const drmp3_uint8 halfrate[2][3][15] = {
646 { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } },
647 { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } },
648 };
649 return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(h)][DRMP3_HDR_GET_LAYER(h) - 1][DRMP3_HDR_GET_BITRATE(h)];
650}
651
652static unsigned drmp3_hdr_sample_rate_hz(const drmp3_uint8 *h)
653{
654 static const unsigned g_hz[3] = { 44100, 48000, 32000 };
655 return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(h)] >> (int)!DRMP3_HDR_TEST_MPEG1(h) >> (int)!DRMP3_HDR_TEST_NOT_MPEG25(h);
656}
657
658static unsigned drmp3_hdr_frame_samples(const drmp3_uint8 *h)
659{
660 return DRMP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)DRMP3_HDR_IS_FRAME_576(h));
661}
662
663static int drmp3_hdr_frame_bytes(const drmp3_uint8 *h, int free_format_size)
664{
665 int frame_bytes = drmp3_hdr_frame_samples(h)*drmp3_hdr_bitrate_kbps(h)*125/drmp3_hdr_sample_rate_hz(h);
666 if (DRMP3_HDR_IS_LAYER_1(h))
667 {
668 frame_bytes &= ~3; /* slot align */
669 }
670 return frame_bytes ? frame_bytes : free_format_size;
671}
672
673static int drmp3_hdr_padding(const drmp3_uint8 *h)
674{
675 return DRMP3_HDR_TEST_PADDING(h) ? (DRMP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
676}
677
678#ifndef DR_MP3_ONLY_MP3
679static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci)
680{
681 const drmp3_L12_subband_alloc *alloc;
682 int mode = DRMP3_HDR_GET_STEREO_MODE(hdr);
683 int nbands, stereo_bands = (mode == DRMP3_MODE_MONO) ? 0 : (mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
684
685 if (DRMP3_HDR_IS_LAYER_1(hdr))
686 {
687 static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };
688 alloc = g_alloc_L1;
689 nbands = 32;
690 } else if (!DRMP3_HDR_TEST_MPEG1(hdr))
691 {
692 static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
693 alloc = g_alloc_L2M2;
694 nbands = 30;
695 } else
696 {
697 static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
698 int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr);
699 unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (int)(mode != DRMP3_MODE_MONO);
700 if (!kbps) /* free-format */
701 {
702 kbps = 192;
703 }
704
705 alloc = g_alloc_L2M1;
706 nbands = 27;
707 if (kbps < 56)
708 {
709 static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
710 alloc = g_alloc_L2M1_lowrate;
711 nbands = sample_rate_idx == 2 ? 12 : 8;
712 } else if (kbps >= 96 && sample_rate_idx != 1)
713 {
714 nbands = 30;
715 }
716 }
717
718 sci->total_bands = (drmp3_uint8)nbands;
719 sci->stereo_bands = (drmp3_uint8)DRMP3_MIN(stereo_bands, nbands);
720
721 return alloc;
722}
723
724static void drmp3_L12_read_scalefactors(drmp3_bs *bs, drmp3_uint8 *pba, drmp3_uint8 *scfcod, int bands, float *scf)
725{
726 static const float g_deq_L12[18*3] = {
727#define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
728 DRMP3_DQ(3),DRMP3_DQ(7),DRMP3_DQ(15),DRMP3_DQ(31),DRMP3_DQ(63),DRMP3_DQ(127),DRMP3_DQ(255),DRMP3_DQ(511),DRMP3_DQ(1023),DRMP3_DQ(2047),DRMP3_DQ(4095),DRMP3_DQ(8191),DRMP3_DQ(16383),DRMP3_DQ(32767),DRMP3_DQ(65535),DRMP3_DQ(3),DRMP3_DQ(5),DRMP3_DQ(9)
729 };
730 int i, m;
731 for (i = 0; i < bands; i++)
732 {
733 float s = 0;
734 int ba = *pba++;
735 int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
736 for (m = 4; m; m >>= 1)
737 {
738 if (mask & m)
739 {
740 int b = drmp3_bs_get_bits(bs, 6);
741 s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3);
742 }
743 *scf++ = s;
744 }
745 }
746}
747
748static void drmp3_L12_read_scale_info(const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci)
749{
750 static const drmp3_uint8 g_bitalloc_code_tab[] = {
751 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
752 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
753 0,17,18, 3,19,4,5,16,
754 0,17,18,16,
755 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
756 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
757 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
758 };
759 const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci);
760
761 int i, k = 0, ba_bits = 0;
762 const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab;
763
764 for (i = 0; i < sci->total_bands; i++)
765 {
766 drmp3_uint8 ba;
767 if (i == k)
768 {
769 k += subband_alloc->band_count;
770 ba_bits = subband_alloc->code_tab_width;
771 ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
772 subband_alloc++;
773 }
774 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
775 sci->bitalloc[2*i] = ba;
776 if (i < sci->stereo_bands)
777 {
778 ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
779 }
780 sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
781 }
782
783 for (i = 0; i < 2*sci->total_bands; i++)
784 {
785 sci->scfcod[i] = (drmp3_uint8)(sci->bitalloc[i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6);
786 }
787
788 drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
789
790 for (i = sci->stereo_bands; i < sci->total_bands; i++)
791 {
792 sci->bitalloc[2*i + 1] = 0;
793 }
794}
795
796static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci, int group_size)
797{
798 int i, j, k, choff = 576;
799 for (j = 0; j < 4; j++)
800 {
801 float *dst = grbuf + group_size*j;
802 for (i = 0; i < 2*sci->total_bands; i++)
803 {
804 int ba = sci->bitalloc[i];
805 if (ba != 0)
806 {
807 if (ba < 17)
808 {
809 int half = (1 << (ba - 1)) - 1;
810 for (k = 0; k < group_size; k++)
811 {
812 dst[k] = (float)((int)drmp3_bs_get_bits(bs, ba) - half);
813 }
814 } else
815 {
816 unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */
817 unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */
818 for (k = 0; k < group_size; k++, code /= mod)
819 {
820 dst[k] = (float)((int)(code % mod - mod/2));
821 }
822 }
823 }
824 dst += choff;
825 choff = 18 - choff;
826 }
827 }
828 return group_size*4;
829}
830
831static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst)
832{
833 int i, k;
834 memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));
835 for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
836 {
837 for (k = 0; k < 12; k++)
838 {
839 dst[k + 0] *= scf[0];
840 dst[k + 576] *= scf[3];
841 }
842 }
843}
844#endif
845
846static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr)
847{
848 static const drmp3_uint8 g_scf_long[8][23] = {
849 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
850 { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
851 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
852 { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
853 { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
854 { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
855 { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
856 { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
857 };
858 static const drmp3_uint8 g_scf_short[8][40] = {
859 { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
860 { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
861 { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
862 { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
863 { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
864 { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
865 { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
866 { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
867 };
868 static const drmp3_uint8 g_scf_mixed[8][40] = {
869 { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
870 { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
871 { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
872 { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
873 { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
874 { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
875 { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
876 { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
877 };
878
879 unsigned tables, scfsi = 0;
880 int main_data_begin, part_23_sum = 0;
881 int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
882 int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
883
884 if (DRMP3_HDR_TEST_MPEG1(hdr))
885 {
886 gr_count *= 2;
887 main_data_begin = drmp3_bs_get_bits(bs, 9);
888 scfsi = drmp3_bs_get_bits(bs, 7 + gr_count);
889 } else
890 {
891 main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;
892 }
893
894 do
895 {
896 if (DRMP3_HDR_IS_MONO(hdr))
897 {
898 scfsi <<= 4;
899 }
900 gr->part_23_length = (drmp3_uint16)drmp3_bs_get_bits(bs, 12);
901 part_23_sum += gr->part_23_length;
902 gr->big_values = (drmp3_uint16)drmp3_bs_get_bits(bs, 9);
903 if (gr->big_values > 288)
904 {
905 return -1;
906 }
907 gr->global_gain = (drmp3_uint8)drmp3_bs_get_bits(bs, 8);
908 gr->scalefac_compress = (drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);
909 gr->sfbtab = g_scf_long[sr_idx];
910 gr->n_long_sfb = 22;
911 gr->n_short_sfb = 0;
912 if (drmp3_bs_get_bits(bs, 1))
913 {
914 gr->block_type = (drmp3_uint8)drmp3_bs_get_bits(bs, 2);
915 if (!gr->block_type)
916 {
917 return -1;
918 }
919 gr->mixed_block_flag = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);
920 gr->region_count[0] = 7;
921 gr->region_count[1] = 255;
922 if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE)
923 {
924 scfsi &= 0x0F0F;
925 if (!gr->mixed_block_flag)
926 {
927 gr->region_count[0] = 8;
928 gr->sfbtab = g_scf_short[sr_idx];
929 gr->n_long_sfb = 0;
930 gr->n_short_sfb = 39;
931 } else
932 {
933 gr->sfbtab = g_scf_mixed[sr_idx];
934 gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;
935 gr->n_short_sfb = 30;
936 }
937 }
938 tables = drmp3_bs_get_bits(bs, 10);
939 tables <<= 5;
940 gr->subblock_gain[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
941 gr->subblock_gain[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
942 gr->subblock_gain[2] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
943 } else
944 {
945 gr->block_type = 0;
946 gr->mixed_block_flag = 0;
947 tables = drmp3_bs_get_bits(bs, 15);
948 gr->region_count[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 4);
949 gr->region_count[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
950 gr->region_count[2] = 255;
951 }
952 gr->table_select[0] = (drmp3_uint8)(tables >> 10);
953 gr->table_select[1] = (drmp3_uint8)((tables >> 5) & 31);
954 gr->table_select[2] = (drmp3_uint8)((tables) & 31);
955 gr->preflag = (drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));
956 gr->scalefac_scale = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);
957 gr->count1_table = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);
958 gr->scfsi = (drmp3_uint8)((scfsi >> 12) & 15);
959 scfsi <<= 4;
960 gr++;
961 } while(--gr_count);
962
963 if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
964 {
965 return -1;
966 }
967
968 return main_data_begin;
969}
970
971static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, const drmp3_uint8 *scf_size, const drmp3_uint8 *scf_count, drmp3_bs *bitbuf, int scfsi)
972{
973 int i, k;
974 for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
975 {
976 int cnt = scf_count[i];
977 if (scfsi & 8)
978 {
979 memcpy(scf, ist_pos, cnt);
980 } else
981 {
982 int bits = scf_size[i];
983 if (!bits)
984 {
985 memset(scf, 0, cnt);
986 memset(ist_pos, 0, cnt);
987 } else
988 {
989 int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
990 for (k = 0; k < cnt; k++)
991 {
992 int s = drmp3_bs_get_bits(bitbuf, bits);
993 ist_pos[k] = (drmp3_uint8)(s == max_scf ? -1 : s);
994 scf[k] = (drmp3_uint8)s;
995 }
996 }
997 }
998 ist_pos += cnt;
999 scf += cnt;
1000 }
1001 scf[0] = scf[1] = scf[2] = 0;
1002}
1003
1004static float drmp3_L3_ldexp_q2(float y, int exp_q2)
1005{
1006 static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
1007 int e;
1008 do
1009 {
1010 e = DRMP3_MIN(30*4, exp_q2);
1011 y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
1012 } while ((exp_q2 -= e) > 0);
1013 return y;
1014}
1015
1016static 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)
1017{
1018 static const drmp3_uint8 g_scf_partitions[3][28] = {
1019 { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 },
1020 { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 },
1021 { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 }
1022 };
1023 const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
1024 drmp3_uint8 scf_size[4], iscf[40];
1025 int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
1026 float gain;
1027
1028 if (DRMP3_HDR_TEST_MPEG1(hdr))
1029 {
1030 static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
1031 int part = g_scfc_decode[gr->scalefac_compress];
1032 scf_size[1] = scf_size[0] = (drmp3_uint8)(part >> 2);
1033 scf_size[3] = scf_size[2] = (drmp3_uint8)(part & 3);
1034 } else
1035 {
1036 static const drmp3_uint8 g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 };
1037 int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch;
1038 sfc = gr->scalefac_compress >> ist;
1039 for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
1040 {
1041 for (modprod = 1, i = 3; i >= 0; i--)
1042 {
1043 scf_size[i] = (drmp3_uint8)(sfc / modprod % g_mod[k + i]);
1044 modprod *= g_mod[k + i];
1045 }
1046 }
1047 scf_partition += k;
1048 scfsi = -16;
1049 }
1050 drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
1051
1052 if (gr->n_short_sfb)
1053 {
1054 int sh = 3 - scf_shift;
1055 for (i = 0; i < gr->n_short_sfb; i += 3)
1056 {
1057 iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh;
1058 iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh;
1059 iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh;
1060 }
1061 } else if (gr->preflag)
1062 {
1063 static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
1064 for (i = 0; i < 10; i++)
1065 {
1066 iscf[11 + i] += g_preamp[i];
1067 }
1068 }
1069
1070 gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);
1071 gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4), DRMP3_MAX_SCFI - gain_exp);
1072 for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)
1073 {
1074 scf[i] = drmp3_L3_ldexp_q2(gain, iscf[i] << scf_shift);
1075 }
1076}
1077
1078static const float g_drmp3_pow43[129 + 16] = {
1079 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f,
1080 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f
1081};
1082
1083static float drmp3_L3_pow_43(int x)
1084{
1085 float frac;
1086 int sign, mult = 256;
1087
1088 if (x < 129)
1089 {
1090 return g_drmp3_pow43[16 + x];
1091 }
1092
1093 if (x < 1024)
1094 {
1095 mult = 16;
1096 x <<= 3;
1097 }
1098
1099 sign = 2*x & 64;
1100 frac = (float)((x & 63) - sign) / ((x & ~63) + sign);
1101 return g_drmp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
1102}
1103
1104static void drmp3_L3_huffman(float *dst, drmp3_bs *bs, const drmp3_L3_gr_info *gr_info, const float *scf, int layer3gr_limit)
1105{
1106 static const drmp3_int16 tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1107 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,
1108 -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288,
1109 -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288,
1110 -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258,
1111 -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259,
1112 -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258,
1113 -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258,
1114 -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259,
1115 -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258,
1116 -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290,
1117 -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259,
1118 -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258,
1119 -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259,
1120 -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258,
1121 -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 };
1122 static const drmp3_uint8 tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205};
1123 static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
1124 static const drmp3_int16 tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 };
1125 static const drmp3_uint8 g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 };
1126
1127#define DRMP3_PEEK_BITS(n) (bs_cache >> (32 - n))
1128#define DRMP3_FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); }
1129#define DRMP3_CHECK_BITS while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
1130#define DRMP3_BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
1131
1132 float one = 0.0f;
1133 int ireg = 0, big_val_cnt = gr_info->big_values;
1134 const drmp3_uint8 *sfb = gr_info->sfbtab;
1135 const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8;
1136 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);
1137 int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
1138 bs_next_ptr += 4;
1139
1140 while (big_val_cnt > 0)
1141 {
1142 int tab_num = gr_info->table_select[ireg];
1143 int sfb_cnt = gr_info->region_count[ireg++];
1144 const drmp3_int16 *codebook = tabs + tabindex[tab_num];
1145 int linbits = g_linbits[tab_num];
1146 if (linbits)
1147 {
1148 do
1149 {
1150 np = *sfb++ / 2;
1151 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1152 one = *scf++;
1153 do
1154 {
1155 int j, w = 5;
1156 int leaf = codebook[DRMP3_PEEK_BITS(w)];
1157 while (leaf < 0)
1158 {
1159 DRMP3_FLUSH_BITS(w);
1160 w = leaf & 7;
1161 leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];
1162 }
1163 DRMP3_FLUSH_BITS(leaf >> 8);
1164
1165 for (j = 0; j < 2; j++, dst++, leaf >>= 4)
1166 {
1167 int lsb = leaf & 0x0F;
1168 if (lsb == 15)
1169 {
1170 lsb += DRMP3_PEEK_BITS(linbits);
1171 DRMP3_FLUSH_BITS(linbits);
1172 DRMP3_CHECK_BITS;
1173 *dst = one*drmp3_L3_pow_43(lsb)*((drmp3_int32)bs_cache < 0 ? -1: 1);
1174 } else
1175 {
1176 *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
1177 }
1178 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1179 }
1180 DRMP3_CHECK_BITS;
1181 } while (--pairs_to_decode);
1182 } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1183 } else
1184 {
1185 do
1186 {
1187 np = *sfb++ / 2;
1188 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
1189 one = *scf++;
1190 do
1191 {
1192 int j, w = 5;
1193 int leaf = codebook[DRMP3_PEEK_BITS(w)];
1194 while (leaf < 0)
1195 {
1196 DRMP3_FLUSH_BITS(w);
1197 w = leaf & 7;
1198 leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];
1199 }
1200 DRMP3_FLUSH_BITS(leaf >> 8);
1201
1202 for (j = 0; j < 2; j++, dst++, leaf >>= 4)
1203 {
1204 int lsb = leaf & 0x0F;
1205 *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
1206 DRMP3_FLUSH_BITS(lsb ? 1 : 0);
1207 }
1208 DRMP3_CHECK_BITS;
1209 } while (--pairs_to_decode);
1210 } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
1211 }
1212 }
1213
1214 for (np = 1 - big_val_cnt;; dst += 4)
1215 {
1216 const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
1217 int leaf = codebook_count1[DRMP3_PEEK_BITS(4)];
1218 if (!(leaf & 8))
1219 {
1220 leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
1221 }
1222 DRMP3_FLUSH_BITS(leaf & 7);
1223 if (DRMP3_BSPOS > layer3gr_limit)
1224 {
1225 break;
1226 }
1227#define DRMP3_RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }
1228#define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) }
1229 DRMP3_RELOAD_SCALEFACTOR;
1230 DRMP3_DEQ_COUNT1(0);
1231 DRMP3_DEQ_COUNT1(1);
1232 DRMP3_RELOAD_SCALEFACTOR;
1233 DRMP3_DEQ_COUNT1(2);
1234 DRMP3_DEQ_COUNT1(3);
1235 DRMP3_CHECK_BITS;
1236 }
1237
1238 bs->pos = layer3gr_limit;
1239}
1240
1241static void drmp3_L3_midside_stereo(float *left, int n)
1242{
1243 int i = 0;
1244 float *right = left + 576;
1245#if DRMP3_HAVE_SIMD
1246 if (drmp3_have_simd()) for (; i < n - 3; i += 4)
1247 {
1248 drmp3_f4 vl = DRMP3_VLD(left + i);
1249 drmp3_f4 vr = DRMP3_VLD(right + i);
1250 DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr));
1251 DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr));
1252 }
1253#endif
1254 for (; i < n; i++)
1255 {
1256 float a = left[i];
1257 float b = right[i];
1258 left[i] = a + b;
1259 right[i] = a - b;
1260 }
1261}
1262
1263static void drmp3_L3_intensity_stereo_band(float *left, int n, float kl, float kr)
1264{
1265 int i;
1266 for (i = 0; i < n; i++)
1267 {
1268 left[i + 576] = left[i]*kr;
1269 left[i] = left[i]*kl;
1270 }
1271}
1272
1273static void drmp3_L3_stereo_top_band(const float *right, const drmp3_uint8 *sfb, int nbands, int max_band[3])
1274{
1275 int i, k;
1276
1277 max_band[0] = max_band[1] = max_band[2] = -1;
1278
1279 for (i = 0; i < nbands; i++)
1280 {
1281 for (k = 0; k < sfb[i]; k += 2)
1282 {
1283 if (right[k] != 0 || right[k + 1] != 0)
1284 {
1285 max_band[i % 3] = i;
1286 break;
1287 }
1288 }
1289 right += sfb[i];
1290 }
1291}
1292
1293static void drmp3_L3_stereo_process(float *left, const drmp3_uint8 *ist_pos, const drmp3_uint8 *sfb, const drmp3_uint8 *hdr, int max_band[3], int mpeg2_sh)
1294{
1295 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 };
1296 unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;
1297
1298 for (i = 0; sfb[i]; i++)
1299 {
1300 unsigned ipos = ist_pos[i];
1301 if ((int)i > max_band[i % 3] && ipos < max_pos)
1302 {
1303 float kl, kr, s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
1304 if (DRMP3_HDR_TEST_MPEG1(hdr))
1305 {
1306 kl = g_pan[2*ipos];
1307 kr = g_pan[2*ipos + 1];
1308 } else
1309 {
1310 kl = 1;
1311 kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
1312 if (ipos & 1)
1313 {
1314 kl = kr;
1315 kr = 1;
1316 }
1317 }
1318 drmp3_L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);
1319 } else if (DRMP3_HDR_TEST_MS_STEREO(hdr))
1320 {
1321 drmp3_L3_midside_stereo(left, sfb[i]);
1322 }
1323 left += sfb[i];
1324 }
1325}
1326
1327static void drmp3_L3_intensity_stereo(float *left, drmp3_uint8 *ist_pos, const drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr)
1328{
1329 int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
1330 int i, max_blocks = gr->n_short_sfb ? 3 : 1;
1331
1332 drmp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
1333 if (gr->n_long_sfb)
1334 {
1335 max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]);
1336 }
1337 for (i = 0; i < max_blocks; i++)
1338 {
1339 int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;
1340 int itop = n_sfb - max_blocks + i;
1341 int prev = itop - max_blocks;
1342 ist_pos[itop] = (drmp3_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]);
1343 }
1344 drmp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
1345}
1346
1347static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sfb)
1348{
1349 int i, len;
1350 float *src = grbuf, *dst = scratch;
1351
1352 for (;0 != (len = *sfb); sfb += 3, src += 2*len)
1353 {
1354 for (i = 0; i < len; i++, src++)
1355 {
1356 *dst++ = src[0*len];
1357 *dst++ = src[1*len];
1358 *dst++ = src[2*len];
1359 }
1360 }
1361 memcpy(grbuf, scratch, (dst - scratch)*sizeof(float));
1362}
1363
1364static void drmp3_L3_antialias(float *grbuf, int nbands)
1365{
1366 static const float g_aa[2][8] = {
1367 {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
1368 {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
1369 };
1370
1371 for (; nbands > 0; nbands--, grbuf += 18)
1372 {
1373 int i = 0;
1374#if DRMP3_HAVE_SIMD
1375 if (drmp3_have_simd()) for (; i < 8; i += 4)
1376 {
1377 drmp3_f4 vu = DRMP3_VLD(grbuf + 18 + i);
1378 drmp3_f4 vd = DRMP3_VLD(grbuf + 14 - i);
1379 drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] + i);
1380 drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] + i);
1381 vd = DRMP3_VREV(vd);
1382 DRMP3_VSTORE(grbuf + 18 + i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1)));
1383 vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0));
1384 DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vd));
1385 }
1386#endif
1387#ifndef DR_MP3_ONLY_SIMD
1388 for(; i < 8; i++)
1389 {
1390 float u = grbuf[18 + i];
1391 float d = grbuf[17 - i];
1392 grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];
1393 grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];
1394 }
1395#endif
1396 }
1397}
1398
1399static void drmp3_L3_dct3_9(float *y)
1400{
1401 float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
1402
1403 s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];
1404 t0 = s0 + s6*0.5f;
1405 s0 -= s6;
1406 t4 = (s4 + s2)*0.93969262f;
1407 t2 = (s8 + s2)*0.76604444f;
1408 s6 = (s4 - s8)*0.17364818f;
1409 s4 += s8 - s2;
1410
1411 s2 = s0 - s4*0.5f;
1412 y[4] = s4 + s0;
1413 s8 = t0 - t2 + s6;
1414 s0 = t0 - t4 + t2;
1415 s4 = t0 + t4 - s6;
1416
1417 s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];
1418
1419 s3 *= 0.86602540f;
1420 t0 = (s5 + s1)*0.98480775f;
1421 t4 = (s5 - s7)*0.34202014f;
1422 t2 = (s1 + s7)*0.64278761f;
1423 s1 = (s1 - s5 - s7)*0.86602540f;
1424
1425 s5 = t0 - s3 - t2;
1426 s7 = t4 - s3 - t0;
1427 s3 = t4 + s3 - t2;
1428
1429 y[0] = s4 - s7;
1430 y[1] = s2 + s1;
1431 y[2] = s0 - s3;
1432 y[3] = s8 + s5;
1433 y[5] = s8 - s5;
1434 y[6] = s0 + s3;
1435 y[7] = s2 - s1;
1436 y[8] = s4 + s7;
1437}
1438
1439static void drmp3_L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands)
1440{
1441 int i, j;
1442 static const float g_twid9[18] = {
1443 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
1444 };
1445
1446 for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)
1447 {
1448 float co[9], si[9];
1449 co[0] = -grbuf[0];
1450 si[0] = grbuf[17];
1451 for (i = 0; i < 4; i++)
1452 {
1453 si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2];
1454 co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2];
1455 si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3];
1456 co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);
1457 }
1458 drmp3_L3_dct3_9(co);
1459 drmp3_L3_dct3_9(si);
1460
1461 si[1] = -si[1];
1462 si[3] = -si[3];
1463 si[5] = -si[5];
1464 si[7] = -si[7];
1465
1466 i = 0;
1467
1468#if DRMP3_HAVE_SIMD
1469 if (drmp3_have_simd()) for (; i < 8; i += 4)
1470 {
1471 drmp3_f4 vovl = DRMP3_VLD(overlap + i);
1472 drmp3_f4 vc = DRMP3_VLD(co + i);
1473 drmp3_f4 vs = DRMP3_VLD(si + i);
1474 drmp3_f4 vr0 = DRMP3_VLD(g_twid9 + i);
1475 drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 + i);
1476 drmp3_f4 vw0 = DRMP3_VLD(window + i);
1477 drmp3_f4 vw1 = DRMP3_VLD(window + 9 + i);
1478 drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0));
1479 DRMP3_VSTORE(overlap + i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1)));
1480 DRMP3_VSTORE(grbuf + i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1)));
1481 vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0));
1482 DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vsum));
1483 }
1484#endif
1485 for (; i < 9; i++)
1486 {
1487 float ovl = overlap[i];
1488 float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];
1489 overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];
1490 grbuf[i] = ovl*window[0 + i] - sum*window[9 + i];
1491 grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];
1492 }
1493 }
1494}
1495
1496static void drmp3_L3_idct3(float x0, float x1, float x2, float *dst)
1497{
1498 float m1 = x1*0.86602540f;
1499 float a1 = x0 - x2*0.5f;
1500 dst[1] = x0 + x2;
1501 dst[0] = a1 + m1;
1502 dst[2] = a1 - m1;
1503}
1504
1505static void drmp3_L3_imdct12(float *x, float *dst, float *overlap)
1506{
1507 static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
1508 float co[3], si[3];
1509 int i;
1510
1511 drmp3_L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);
1512 drmp3_L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);
1513 si[1] = -si[1];
1514
1515 for (i = 0; i < 3; i++)
1516 {
1517 float ovl = overlap[i];
1518 float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];
1519 overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];
1520 dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];
1521 dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];
1522 }
1523}
1524
1525static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands)
1526{
1527 for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
1528 {
1529 float tmp[18];
1530 memcpy(tmp, grbuf, sizeof(tmp));
1531 memcpy(grbuf, overlap, 6*sizeof(float));
1532 drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
1533 drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
1534 drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
1535 }
1536}
1537
1538static void drmp3_L3_change_sign(float *grbuf)
1539{
1540 int b, i;
1541 for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)
1542 for (i = 1; i < 18; i += 2)
1543 grbuf[i] = -grbuf[i];
1544}
1545
1546static void drmp3_L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands)
1547{
1548 static const float g_mdct_window[2][18] = {
1549 { 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 },
1550 { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
1551 };
1552 if (n_long_bands)
1553 {
1554 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
1555 grbuf += 18*n_long_bands;
1556 overlap += 9*n_long_bands;
1557 }
1558 if (block_type == DRMP3_SHORT_BLOCK_TYPE)
1559 drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
1560 else
1561 drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands);
1562}
1563
1564static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s)
1565{
1566 int pos = (s->bs.pos + 7)/8u;
1567 int remains = s->bs.limit/8u - pos;
1568 if (remains > DRMP3_MAX_BITRESERVOIR_BYTES)
1569 {
1570 pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES;
1571 remains = DRMP3_MAX_BITRESERVOIR_BYTES;
1572 }
1573 if (remains > 0)
1574 {
1575 memmove(h->reserv_buf, s->maindata + pos, remains);
1576 }
1577 h->reserv = remains;
1578}
1579
1580static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratch *s, int main_data_begin)
1581{
1582 int frame_bytes = (bs->limit - bs->pos)/8;
1583 int bytes_have = DRMP3_MIN(h->reserv, main_data_begin);
1584 memcpy(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin));
1585 memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
1586 drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
1587 return h->reserv >= main_data_begin;
1588}
1589
1590static void drmp3_L3_decode(drmp3dec *h, drmp3dec_scratch *s, drmp3_L3_gr_info *gr_info, int nch)
1591{
1592 int ch;
1593
1594 for (ch = 0; ch < nch; ch++)
1595 {
1596 int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;
1597 drmp3_L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);
1598 drmp3_L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);
1599 }
1600
1601 if (DRMP3_HDR_TEST_I_STEREO(h->header))
1602 {
1603 drmp3_L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header);
1604 } else if (DRMP3_HDR_IS_MS_STEREO(h->header))
1605 {
1606 drmp3_L3_midside_stereo(s->grbuf[0], 576);
1607 }
1608
1609 for (ch = 0; ch < nch; ch++, gr_info++)
1610 {
1611 int aa_bands = 31;
1612 int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(h->header) == 2);
1613
1614 if (gr_info->n_short_sfb)
1615 {
1616 aa_bands = n_long_bands - 1;
1617 drmp3_L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
1618 }
1619
1620 drmp3_L3_antialias(s->grbuf[ch], aa_bands);
1621 drmp3_L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands);
1622 drmp3_L3_change_sign(s->grbuf[ch]);
1623 }
1624}
1625
1626static void drmp3d_DCT_II(float *grbuf, int n)
1627{
1628 static const float g_sec[24] = {
1629 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
1630 };
1631 int i, k = 0;
1632#if DRMP3_HAVE_SIMD
1633 if (drmp3_have_simd()) for (; k < n; k += 4)
1634 {
1635 drmp3_f4 t[4][8], *x;
1636 float *y = grbuf + k;
1637
1638 for (x = t[0], i = 0; i < 8; i++, x++)
1639 {
1640 drmp3_f4 x0 = DRMP3_VLD(&y[i*18]);
1641 drmp3_f4 x1 = DRMP3_VLD(&y[(15 - i)*18]);
1642 drmp3_f4 x2 = DRMP3_VLD(&y[(16 + i)*18]);
1643 drmp3_f4 x3 = DRMP3_VLD(&y[(31 - i)*18]);
1644 drmp3_f4 t0 = DRMP3_VADD(x0, x3);
1645 drmp3_f4 t1 = DRMP3_VADD(x1, x2);
1646 drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1, x2), g_sec[3*i + 0]);
1647 drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*i + 1]);
1648 x[0] = DRMP3_VADD(t0, t1);
1649 x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*i + 2]);
1650 x[16] = DRMP3_VADD(t3, t2);
1651 x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*i + 2]);
1652 }
1653 for (x = t[0], i = 0; i < 4; i++, x += 8)
1654 {
1655 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;
1656 xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7);
1657 x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6);
1658 x6 = DRMP3_VSUB(x2, x5); x2 = DRMP3_VADD(x2, x5);
1659 x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4);
1660 x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3);
1661 x3 = DRMP3_VSUB(x1, x2); x1 = DRMP3_VADD(x1, x2);
1662 x[0] = DRMP3_VADD(x0, x1);
1663 x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f);
1664 x5 = DRMP3_VADD(x5, x6);
1665 x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f);
1666 x7 = DRMP3_VADD(x7, xt);
1667 x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f);
1668 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */
1669 x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f));
1670 x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
1671 x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6);
1672 x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f);
1673 x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f);
1674 x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f);
1675 x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f);
1676 x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f);
1677 x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f);
1678 }
1679
1680 if (k > n - 3)
1681 {
1682#if DRMP3_HAVE_SSE
1683#define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
1684#else
1685#define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
1686#endif
1687 for (i = 0; i < 7; i++, y += 4*18)
1688 {
1689 drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);
1690 DRMP3_VSAVE2(0, t[0][i]);
1691 DRMP3_VSAVE2(1, DRMP3_VADD(t[2][i], s));
1692 DRMP3_VSAVE2(2, DRMP3_VADD(t[1][i], t[1][i + 1]));
1693 DRMP3_VSAVE2(3, DRMP3_VADD(t[2][1 + i], s));
1694 }
1695 DRMP3_VSAVE2(0, t[0][7]);
1696 DRMP3_VSAVE2(1, DRMP3_VADD(t[2][7], t[3][7]));
1697 DRMP3_VSAVE2(2, t[1][7]);
1698 DRMP3_VSAVE2(3, t[3][7]);
1699 } else
1700 {
1701#define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v)
1702 for (i = 0; i < 7; i++, y += 4*18)
1703 {
1704 drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);
1705 DRMP3_VSAVE4(0, t[0][i]);
1706 DRMP3_VSAVE4(1, DRMP3_VADD(t[2][i], s));
1707 DRMP3_VSAVE4(2, DRMP3_VADD(t[1][i], t[1][i + 1]));
1708 DRMP3_VSAVE4(3, DRMP3_VADD(t[2][1 + i], s));
1709 }
1710 DRMP3_VSAVE4(0, t[0][7]);
1711 DRMP3_VSAVE4(1, DRMP3_VADD(t[2][7], t[3][7]));
1712 DRMP3_VSAVE4(2, t[1][7]);
1713 DRMP3_VSAVE4(3, t[3][7]);
1714 }
1715 } else
1716#endif
1717#ifdef DR_MP3_ONLY_SIMD
1718 {}
1719#else
1720 for (; k < n; k++)
1721 {
1722 float t[4][8], *x, *y = grbuf + k;
1723
1724 for (x = t[0], i = 0; i < 8; i++, x++)
1725 {
1726 float x0 = y[i*18];
1727 float x1 = y[(15 - i)*18];
1728 float x2 = y[(16 + i)*18];
1729 float x3 = y[(31 - i)*18];
1730 float t0 = x0 + x3;
1731 float t1 = x1 + x2;
1732 float t2 = (x1 - x2)*g_sec[3*i + 0];
1733 float t3 = (x0 - x3)*g_sec[3*i + 1];
1734 x[0] = t0 + t1;
1735 x[8] = (t0 - t1)*g_sec[3*i + 2];
1736 x[16] = t3 + t2;
1737 x[24] = (t3 - t2)*g_sec[3*i + 2];
1738 }
1739 for (x = t[0], i = 0; i < 4; i++, x += 8)
1740 {
1741 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;
1742 xt = x0 - x7; x0 += x7;
1743 x7 = x1 - x6; x1 += x6;
1744 x6 = x2 - x5; x2 += x5;
1745 x5 = x3 - x4; x3 += x4;
1746 x4 = x0 - x3; x0 += x3;
1747 x3 = x1 - x2; x1 += x2;
1748 x[0] = x0 + x1;
1749 x[4] = (x0 - x1)*0.70710677f;
1750 x5 = x5 + x6;
1751 x6 = (x6 + x7)*0.70710677f;
1752 x7 = x7 + xt;
1753 x3 = (x3 + x4)*0.70710677f;
1754 x5 -= x7*0.198912367f; /* rotate by PI/8 */
1755 x7 += x5*0.382683432f;
1756 x5 -= x7*0.198912367f;
1757 x0 = xt - x6; xt += x6;
1758 x[1] = (xt + x7)*0.50979561f;
1759 x[2] = (x4 + x3)*0.54119611f;
1760 x[3] = (x0 - x5)*0.60134488f;
1761 x[5] = (x0 + x5)*0.89997619f;
1762 x[6] = (x4 - x3)*1.30656302f;
1763 x[7] = (xt - x7)*2.56291556f;
1764
1765 }
1766 for (i = 0; i < 7; i++, y += 4*18)
1767 {
1768 y[0*18] = t[0][i];
1769 y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];
1770 y[2*18] = t[1][i] + t[1][i + 1];
1771 y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];
1772 }
1773 y[0*18] = t[0][7];
1774 y[1*18] = t[2][7] + t[3][7];
1775 y[2*18] = t[1][7];
1776 y[3*18] = t[3][7];
1777 }
1778#endif
1779}
1780
1781#ifndef DR_MP3_FLOAT_OUTPUT
1782typedef drmp3_int16 drmp3d_sample_t;
1783
1784static drmp3_int16 drmp3d_scale_pcm(float sample)
1785{
1786 drmp3_int16 s;
1787 if (sample >= 32766.5) return (drmp3_int16) 32767;
1788 if (sample <= -32767.5) return (drmp3_int16)-32768;
1789 s = (drmp3_int16)(sample + .5f);
1790 s -= (s < 0); /* away from zero, to be compliant */
1791 return (drmp3_int16)s;
1792}
1793#else
1794typedef float drmp3d_sample_t;
1795
1796static float drmp3d_scale_pcm(float sample)
1797{
1798 return sample*(1.f/32768.f);
1799}
1800#endif
1801
1802static void drmp3d_synth_pair(drmp3d_sample_t *pcm, int nch, const float *z)
1803{
1804 float a;
1805 a = (z[14*64] - z[ 0]) * 29;
1806 a += (z[ 1*64] + z[13*64]) * 213;
1807 a += (z[12*64] - z[ 2*64]) * 459;
1808 a += (z[ 3*64] + z[11*64]) * 2037;
1809 a += (z[10*64] - z[ 4*64]) * 5153;
1810 a += (z[ 5*64] + z[ 9*64]) * 6574;
1811 a += (z[ 8*64] - z[ 6*64]) * 37489;
1812 a += z[ 7*64] * 75038;
1813 pcm[0] = drmp3d_scale_pcm(a);
1814
1815 z += 2;
1816 a = z[14*64] * 104;
1817 a += z[12*64] * 1567;
1818 a += z[10*64] * 9727;
1819 a += z[ 8*64] * 64019;
1820 a += z[ 6*64] * -9975;
1821 a += z[ 4*64] * -45;
1822 a += z[ 2*64] * 146;
1823 a += z[ 0*64] * -5;
1824 pcm[16*nch] = drmp3d_scale_pcm(a);
1825}
1826
1827static void drmp3d_synth(float *xl, drmp3d_sample_t *dstl, int nch, float *lins)
1828{
1829 int i;
1830 float *xr = xl + 576*(nch - 1);
1831 drmp3d_sample_t *dstr = dstl + (nch - 1);
1832
1833 static const float g_win[] = {
1834 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
1835 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
1836 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
1837 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
1838 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
1839 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
1840 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
1841 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
1842 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
1843 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
1844 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
1845 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
1846 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
1847 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
1848 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
1849 };
1850 float *zlin = lins + 15*64;
1851 const float *w = g_win;
1852
1853 zlin[4*15] = xl[18*16];
1854 zlin[4*15 + 1] = xr[18*16];
1855 zlin[4*15 + 2] = xl[0];
1856 zlin[4*15 + 3] = xr[0];
1857
1858 zlin[4*31] = xl[1 + 18*16];
1859 zlin[4*31 + 1] = xr[1 + 18*16];
1860 zlin[4*31 + 2] = xl[1];
1861 zlin[4*31 + 3] = xr[1];
1862
1863 drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
1864 drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
1865 drmp3d_synth_pair(dstl, nch, lins + 4*15);
1866 drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
1867
1868#if DRMP3_HAVE_SIMD
1869 if (drmp3_have_simd()) for (i = 14; i >= 0; i--)
1870 {
1871#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)]);
1872#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)); }
1873#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))); }
1874#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))); }
1875 drmp3_f4 a, b;
1876 zlin[4*i] = xl[18*(31 - i)];
1877 zlin[4*i + 1] = xr[18*(31 - i)];
1878 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
1879 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
1880 zlin[4*i + 64] = xl[1 + 18*(1 + i)];
1881 zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];
1882 zlin[4*i - 64 + 2] = xl[18*(1 + i)];
1883 zlin[4*i - 64 + 3] = xr[18*(1 + i)];
1884
1885 DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7)
1886
1887 {
1888#ifndef DR_MP3_FLOAT_OUTPUT
1889#if DRMP3_HAVE_SSE
1890 static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
1891 static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
1892 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
1893 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
1894 dstr[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 1);
1895 dstr[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 5);
1896 dstl[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 0);
1897 dstl[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 4);
1898 dstr[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 3);
1899 dstr[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 7);
1900 dstl[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 2);
1901 dstl[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 6);
1902#else
1903 int16x4_t pcma, pcmb;
1904 a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
1905 b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
1906 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
1907 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
1908 vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);
1909 vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);
1910 vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);
1911 vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);
1912 vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);
1913 vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);
1914 vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);
1915 vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);
1916#endif
1917#else
1918 static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
1919 a = DRMP3_VMUL(a, g_scale);
1920 b = DRMP3_VMUL(b, g_scale);
1921#if DRMP3_HAVE_SSE
1922 _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
1923 _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));
1924 _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));
1925 _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));
1926 _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));
1927 _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));
1928 _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
1929 _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));
1930#else
1931 vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);
1932 vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);
1933 vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);
1934 vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);
1935 vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);
1936 vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);
1937 vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);
1938 vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);
1939#endif
1940#endif /* DR_MP3_FLOAT_OUTPUT */
1941 }
1942 } else
1943#endif
1944#ifdef DR_MP3_ONLY_SIMD
1945 {}
1946#else
1947 for (i = 14; i >= 0; i--)
1948 {
1949#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];
1950#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; }
1951#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; }
1952#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; }
1953 float a[4], b[4];
1954
1955 zlin[4*i] = xl[18*(31 - i)];
1956 zlin[4*i + 1] = xr[18*(31 - i)];
1957 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
1958 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
1959 zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
1960 zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
1961 zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
1962 zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
1963
1964 DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7)
1965
1966 dstr[(15 - i)*nch] = drmp3d_scale_pcm(a[1]);
1967 dstr[(17 + i)*nch] = drmp3d_scale_pcm(b[1]);
1968 dstl[(15 - i)*nch] = drmp3d_scale_pcm(a[0]);
1969 dstl[(17 + i)*nch] = drmp3d_scale_pcm(b[0]);
1970 dstr[(47 - i)*nch] = drmp3d_scale_pcm(a[3]);
1971 dstr[(49 + i)*nch] = drmp3d_scale_pcm(b[3]);
1972 dstl[(47 - i)*nch] = drmp3d_scale_pcm(a[2]);
1973 dstl[(49 + i)*nch] = drmp3d_scale_pcm(b[2]);
1974 }
1975#endif
1976}
1977
1978static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, drmp3d_sample_t *pcm, float *lins)
1979{
1980 int i;
1981 for (i = 0; i < nch; i++)
1982 {
1983 drmp3d_DCT_II(grbuf + 576*i, nbands);
1984 }
1985
1986 memcpy(lins, qmf_state, sizeof(float)*15*64);
1987
1988 for (i = 0; i < nbands; i += 2)
1989 {
1990 drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
1991 }
1992#ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL
1993 if (nch == 1)
1994 {
1995 for (i = 0; i < 15*64; i += 2)
1996 {
1997 qmf_state[i] = lins[nbands*64 + i];
1998 }
1999 } else
2000#endif
2001 {
2002 memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64);
2003 }
2004}
2005
2006static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes)
2007{
2008 int i, nmatch;
2009 for (i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++)
2010 {
2011 i += drmp3_hdr_frame_bytes(hdr + i, frame_bytes) + drmp3_hdr_padding(hdr + i);
2012 if (i + DRMP3_HDR_SIZE > mp3_bytes)
2013 return nmatch > 0;
2014 if (!drmp3_hdr_compare(hdr, hdr + i))
2015 return 0;
2016 }
2017 return 1;
2018}
2019
2020static int drmp3d_find_frame(const drmp3_uint8 *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes)
2021{
2022 int i, k;
2023 for (i = 0; i < mp3_bytes - DRMP3_HDR_SIZE; i++, mp3++)
2024 {
2025 if (drmp3_hdr_valid(mp3))
2026 {
2027 int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes);
2028 int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3);
2029
2030 for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++)
2031 {
2032 if (drmp3_hdr_compare(mp3, mp3 + k))
2033 {
2034 int fb = k - drmp3_hdr_padding(mp3);
2035 int nextfb = fb + drmp3_hdr_padding(mp3 + k);
2036 if (i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb))
2037 continue;
2038 frame_and_padding = k;
2039 frame_bytes = fb;
2040 *free_format_bytes = fb;
2041 }
2042 }
2043
2044 if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&
2045 drmp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||
2046 (!i && frame_and_padding == mp3_bytes))
2047 {
2048 *ptr_frame_bytes = frame_and_padding;
2049 return i;
2050 }
2051 *free_format_bytes = 0;
2052 }
2053 }
2054 *ptr_frame_bytes = 0;
2055 return i;
2056}
2057
2058void drmp3dec_init(drmp3dec *dec)
2059{
2060 dec->header[0] = 0;
2061}
2062
2063int drmp3dec_decode_frame(drmp3dec *dec, const unsigned char *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info)
2064{
2065 int i = 0, igr, frame_size = 0, success = 1;
2066 const drmp3_uint8 *hdr;
2067 drmp3_bs bs_frame[1];
2068 drmp3dec_scratch scratch;
2069
2070 if (mp3_bytes > 4 && dec->header[0] == 0xff && drmp3_hdr_compare(dec->header, mp3))
2071 {
2072 frame_size = drmp3_hdr_frame_bytes(mp3, dec->free_format_bytes) + drmp3_hdr_padding(mp3);
2073 if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size)))
2074 {
2075 frame_size = 0;
2076 }
2077 }
2078 if (!frame_size)
2079 {
2080 memset(dec, 0, sizeof(drmp3dec));
2081 i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);
2082 if (!frame_size || i + frame_size > mp3_bytes)
2083 {
2084 info->frame_bytes = i;
2085 return 0;
2086 }
2087 }
2088
2089 hdr = mp3 + i;
2090 memcpy(dec->header, hdr, DRMP3_HDR_SIZE);
2091 info->frame_bytes = i + frame_size;
2092 info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
2093 info->hz = drmp3_hdr_sample_rate_hz(hdr);
2094 info->layer = 4 - DRMP3_HDR_GET_LAYER(hdr);
2095 info->bitrate_kbps = drmp3_hdr_bitrate_kbps(hdr);
2096
2097 drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE);
2098 if (DRMP3_HDR_IS_CRC(hdr))
2099 {
2100 drmp3_bs_get_bits(bs_frame, 16);
2101 }
2102
2103 if (info->layer == 3)
2104 {
2105 int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);
2106 if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
2107 {
2108 drmp3dec_init(dec);
2109 return 0;
2110 }
2111 success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
2112 if (success && pcm != NULL)
2113 {
2114 for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels))
2115 {
2116 memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
2117 drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);
2118 drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2119 }
2120 }
2121 drmp3_L3_save_reservoir(dec, &scratch);
2122 } else
2123 {
2124#ifdef DR_MP3_ONLY_MP3
2125 return 0;
2126#else
2127 drmp3_L12_scale_info sci[1];
2128
2129 if (pcm == NULL) {
2130 return drmp3_hdr_frame_samples(hdr);
2131 }
2132
2133 drmp3_L12_read_scale_info(hdr, bs_frame, sci);
2134
2135 memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
2136 for (i = 0, igr = 0; igr < 3; igr++)
2137 {
2138 if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))
2139 {
2140 i = 0;
2141 drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
2142 drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
2143 memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
2144 pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels);
2145 }
2146 if (bs_frame->pos > bs_frame->limit)
2147 {
2148 drmp3dec_init(dec);
2149 return 0;
2150 }
2151 }
2152#endif
2153 }
2154
2155 return success*drmp3_hdr_frame_samples(dec->header);
2156}
2157
2158void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, int num_samples)
2159{
2160 if(num_samples > 0)
2161 {
2162 int i = 0;
2163#if DRMP3_HAVE_SIMD
2164 int aligned_count = num_samples & ~7;
2165 for(; i < aligned_count; i+=8)
2166 {
2167 drmp3_f4 scale = DRMP3_VSET(32768.0f);
2168 drmp3_f4 a = DRMP3_VMUL(DRMP3_VLD(&in[i ]), scale);
2169 drmp3_f4 b = DRMP3_VMUL(DRMP3_VLD(&in[i+4]), scale);
2170#if DRMP3_HAVE_SSE
2171 drmp3_f4 s16max = DRMP3_VSET( 32767.0f);
2172 drmp3_f4 s16min = DRMP3_VSET(-32768.0f);
2173 __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, s16max), s16min)),
2174 _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, s16max), s16min)));
2175 out[i ] = (drmp3_int16)_mm_extract_epi16(pcm8, 0);
2176 out[i+1] = (drmp3_int16)_mm_extract_epi16(pcm8, 1);
2177 out[i+2] = (drmp3_int16)_mm_extract_epi16(pcm8, 2);
2178 out[i+3] = (drmp3_int16)_mm_extract_epi16(pcm8, 3);
2179 out[i+4] = (drmp3_int16)_mm_extract_epi16(pcm8, 4);
2180 out[i+5] = (drmp3_int16)_mm_extract_epi16(pcm8, 5);
2181 out[i+6] = (drmp3_int16)_mm_extract_epi16(pcm8, 6);
2182 out[i+7] = (drmp3_int16)_mm_extract_epi16(pcm8, 7);
2183#else
2184 int16x4_t pcma, pcmb;
2185 a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
2186 b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
2187 pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
2188 pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
2189 vst1_lane_s16(out+i , pcma, 0);
2190 vst1_lane_s16(out+i+1, pcma, 1);
2191 vst1_lane_s16(out+i+2, pcma, 2);
2192 vst1_lane_s16(out+i+3, pcma, 3);
2193 vst1_lane_s16(out+i+4, pcmb, 0);
2194 vst1_lane_s16(out+i+5, pcmb, 1);
2195 vst1_lane_s16(out+i+6, pcmb, 2);
2196 vst1_lane_s16(out+i+7, pcmb, 3);
2197#endif
2198 }
2199#endif
2200 for(; i < num_samples; i++)
2201 {
2202 float sample = in[i] * 32768.0f;
2203 if (sample >= 32766.5)
2204 out[i] = (drmp3_int16) 32767;
2205 else if (sample <= -32767.5)
2206 out[i] = (drmp3_int16)-32768;
2207 else
2208 {
2209 short s = (drmp3_int16)(sample + .5f);
2210 s -= (s < 0); /* away from zero, to be compliant */
2211 out[i] = s;
2212 }
2213 }
2214 }
2215}
2216
2217
2218
2219/************************************************************************************************************************************************************
2220
2221 Main Public API
2222
2223 ************************************************************************************************************************************************************/
2224
2225#if defined(SIZE_MAX)
2226 #define DRMP3_SIZE_MAX SIZE_MAX
2227#else
2228 #if defined(_WIN64) || defined(_LP64) || defined(__LP64__)
2229 #define DRMP3_SIZE_MAX ((drmp3_uint64)0xFFFFFFFFFFFFFFFF)
2230 #else
2231 #define DRMP3_SIZE_MAX 0xFFFFFFFF
2232 #endif
2233#endif
2234
2235/* Options. */
2236#ifndef DRMP3_SEEK_LEADING_MP3_FRAMES
2237#define DRMP3_SEEK_LEADING_MP3_FRAMES 2
2238#endif
2239
2240
2241/* Standard library stuff. */
2242#ifndef DRMP3_ASSERT
2243#include <assert.h>
2244#define DRMP3_ASSERT(expression) assert(expression)
2245#endif
2246#ifndef DRMP3_COPY_MEMORY
2247#define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
2248#endif
2249#ifndef DRMP3_ZERO_MEMORY
2250#define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
2251#endif
2252#define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
2253#ifndef DRMP3_MALLOC
2254#define DRMP3_MALLOC(sz) malloc((sz))
2255#endif
2256#ifndef DRMP3_REALLOC
2257#define DRMP3_REALLOC(p, sz) realloc((p), (sz))
2258#endif
2259#ifndef DRMP3_FREE
2260#define DRMP3_FREE(p) free((p))
2261#endif
2262
2263#define drmp3_assert DRMP3_ASSERT
2264#define drmp3_copy_memory DRMP3_COPY_MEMORY
2265#define drmp3_zero_memory DRMP3_ZERO_MEMORY
2266#define drmp3_zero_object DRMP3_ZERO_OBJECT
2267#define drmp3_malloc DRMP3_MALLOC
2268#define drmp3_realloc DRMP3_REALLOC
2269
2270#define drmp3_countof(x) (sizeof(x) / sizeof(x[0]))
2271#define drmp3_max(x, y) (((x) > (y)) ? (x) : (y))
2272#define drmp3_min(x, y) (((x) < (y)) ? (x) : (y))
2273
2274#define DRMP3_DATA_CHUNK_SIZE 16384 /* The size in bytes of each chunk of data to read from the MP3 stream. minimp3 recommends 16K. */
2275
2276static DRMP3_INLINE float drmp3_mix_f32(float x, float y, float a)
2277{
2278 return x*(1-a) + y*a;
2279}
2280
2281static void drmp3_blend_f32(float* pOut, float* pInA, float* pInB, float factor, drmp3_uint32 channels)
2282{
2283 drmp3_uint32 i;
2284 for (i = 0; i < channels; ++i) {
2285 pOut[i] = drmp3_mix_f32(pInA[i], pInB[i], factor);
2286 }
2287}
2288
2289void drmp3_src_cache_init(drmp3_src* pSRC, drmp3_src_cache* pCache)
2290{
2291 drmp3_assert(pSRC != NULL);
2292 drmp3_assert(pCache != NULL);
2293
2294 pCache->pSRC = pSRC;
2295 pCache->cachedFrameCount = 0;
2296 pCache->iNextFrame = 0;
2297}
2298
2299drmp3_uint64 drmp3_src_cache_read_frames(drmp3_src_cache* pCache, drmp3_uint64 frameCount, float* pFramesOut)
2300{
2301 drmp3_uint32 channels;
2302 drmp3_uint64 totalFramesRead = 0;
2303
2304 drmp3_assert(pCache != NULL);
2305 drmp3_assert(pCache->pSRC != NULL);
2306 drmp3_assert(pCache->pSRC->onRead != NULL);
2307 drmp3_assert(frameCount > 0);
2308 drmp3_assert(pFramesOut != NULL);
2309
2310 channels = pCache->pSRC->config.channels;
2311
2312 while (frameCount > 0) {
2313 /* If there's anything in memory go ahead and copy that over first. */
2314 drmp3_uint32 framesToReadFromClient;
2315 drmp3_uint64 framesRemainingInMemory = pCache->cachedFrameCount - pCache->iNextFrame;
2316 drmp3_uint64 framesToReadFromMemory = frameCount;
2317 if (framesToReadFromMemory > framesRemainingInMemory) {
2318 framesToReadFromMemory = framesRemainingInMemory;
2319 }
2320
2321 drmp3_copy_memory(pFramesOut, pCache->pCachedFrames + pCache->iNextFrame*channels, (drmp3_uint32)(framesToReadFromMemory * channels * sizeof(float)));
2322 pCache->iNextFrame += (drmp3_uint32)framesToReadFromMemory;
2323
2324 totalFramesRead += framesToReadFromMemory;
2325 frameCount -= framesToReadFromMemory;
2326 if (frameCount == 0) {
2327 break;
2328 }
2329
2330
2331 /* At this point there are still more frames to read from the client, so we'll need to reload the cache with fresh data. */
2332 drmp3_assert(frameCount > 0);
2333 pFramesOut += framesToReadFromMemory * channels;
2334
2335 pCache->iNextFrame = 0;
2336 pCache->cachedFrameCount = 0;
2337
2338 framesToReadFromClient = drmp3_countof(pCache->pCachedFrames) / pCache->pSRC->config.channels;
2339 if (framesToReadFromClient > pCache->pSRC->config.cacheSizeInFrames) {
2340 framesToReadFromClient = pCache->pSRC->config.cacheSizeInFrames;
2341 }
2342
2343 pCache->cachedFrameCount = (drmp3_uint32)pCache->pSRC->onRead(pCache->pSRC, framesToReadFromClient, pCache->pCachedFrames, pCache->pSRC->pUserData);
2344
2345
2346 /* Get out of this loop if nothing was able to be retrieved. */
2347 if (pCache->cachedFrameCount == 0) {
2348 break;
2349 }
2350 }
2351
2352 return totalFramesRead;
2353}
2354
2355
2356drmp3_uint64 drmp3_src_read_frames_passthrough(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush);
2357drmp3_uint64 drmp3_src_read_frames_linear(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush);
2358
2359drmp3_bool32 drmp3_src_init(const drmp3_src_config* pConfig, drmp3_src_read_proc onRead, void* pUserData, drmp3_src* pSRC)
2360{
2361 if (pSRC == NULL) {
2362 return DRMP3_FALSE;
2363 }
2364
2365 drmp3_zero_object(pSRC);
2366
2367 if (pConfig == NULL || onRead == NULL) {
2368 return DRMP3_FALSE;
2369 }
2370
2371 if (pConfig->channels == 0 || pConfig->channels > 2) {
2372 return DRMP3_FALSE;
2373 }
2374
2375 pSRC->config = *pConfig;
2376 pSRC->onRead = onRead;
2377 pSRC->pUserData = pUserData;
2378
2379 if (pSRC->config.cacheSizeInFrames > DRMP3_SRC_CACHE_SIZE_IN_FRAMES || pSRC->config.cacheSizeInFrames == 0) {
2380 pSRC->config.cacheSizeInFrames = DRMP3_SRC_CACHE_SIZE_IN_FRAMES;
2381 }
2382
2383 drmp3_src_cache_init(pSRC, &pSRC->cache);
2384 return DRMP3_TRUE;
2385}
2386
2387drmp3_bool32 drmp3_src_set_input_sample_rate(drmp3_src* pSRC, drmp3_uint32 sampleRateIn)
2388{
2389 if (pSRC == NULL) {
2390 return DRMP3_FALSE;
2391 }
2392
2393 /* Must have a sample rate of > 0. */
2394 if (sampleRateIn == 0) {
2395 return DRMP3_FALSE;
2396 }
2397
2398 pSRC->config.sampleRateIn = sampleRateIn;
2399 return DRMP3_TRUE;
2400}
2401
2402drmp3_bool32 drmp3_src_set_output_sample_rate(drmp3_src* pSRC, drmp3_uint32 sampleRateOut)
2403{
2404 if (pSRC == NULL) {
2405 return DRMP3_FALSE;
2406 }
2407
2408 /* Must have a sample rate of > 0. */
2409 if (sampleRateOut == 0) {
2410 return DRMP3_FALSE;
2411 }
2412
2413 pSRC->config.sampleRateOut = sampleRateOut;
2414 return DRMP3_TRUE;
2415}
2416
2417drmp3_uint64 drmp3_src_read_frames_ex(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush)
2418{
2419 drmp3_src_algorithm algorithm;
2420
2421 if (pSRC == NULL || frameCount == 0 || pFramesOut == NULL) {
2422 return 0;
2423 }
2424
2425 algorithm = pSRC->config.algorithm;
2426
2427 /* Always use passthrough if the sample rates are the same. */
2428 if (pSRC->config.sampleRateIn == pSRC->config.sampleRateOut) {
2429 algorithm = drmp3_src_algorithm_none;
2430 }
2431
2432 /* Could just use a function pointer instead of a switch for this... */
2433 switch (algorithm)
2434 {
2435 case drmp3_src_algorithm_none: return drmp3_src_read_frames_passthrough(pSRC, frameCount, pFramesOut, flush);
2436 case drmp3_src_algorithm_linear: return drmp3_src_read_frames_linear(pSRC, frameCount, pFramesOut, flush);
2437 default: return 0;
2438 }
2439}
2440
2441drmp3_uint64 drmp3_src_read_frames(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut)
2442{
2443 return drmp3_src_read_frames_ex(pSRC, frameCount, pFramesOut, DRMP3_FALSE);
2444}
2445
2446drmp3_uint64 drmp3_src_read_frames_passthrough(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush)
2447{
2448 drmp3_assert(pSRC != NULL);
2449 drmp3_assert(frameCount > 0);
2450 drmp3_assert(pFramesOut != NULL);
2451
2452 (void)flush; /* Passthrough need not care about flushing. */
2453 return pSRC->onRead(pSRC, frameCount, pFramesOut, pSRC->pUserData);
2454}
2455
2456drmp3_uint64 drmp3_src_read_frames_linear(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush)
2457{
2458 double factor;
2459 drmp3_uint64 totalFramesRead;
2460
2461 drmp3_assert(pSRC != NULL);
2462 drmp3_assert(frameCount > 0);
2463 drmp3_assert(pFramesOut != NULL);
2464
2465 /* For linear SRC, the bin is only 2 frames: 1 prior, 1 future. */
2466
2467 /* Load the bin if necessary. */
2468 if (!pSRC->algo.linear.isPrevFramesLoaded) {
2469 drmp3_uint64 framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pSRC->bin);
2470 if (framesRead == 0) {
2471 return 0;
2472 }
2473 pSRC->algo.linear.isPrevFramesLoaded = DRMP3_TRUE;
2474 }
2475 if (!pSRC->algo.linear.isNextFramesLoaded) {
2476 drmp3_uint64 framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pSRC->bin + pSRC->config.channels);
2477 if (framesRead == 0) {
2478 return 0;
2479 }
2480 pSRC->algo.linear.isNextFramesLoaded = DRMP3_TRUE;
2481 }
2482
2483 factor = (double)pSRC->config.sampleRateIn / pSRC->config.sampleRateOut;
2484
2485 totalFramesRead = 0;
2486 while (frameCount > 0) {
2487 drmp3_uint32 i;
2488 drmp3_uint32 framesToReadFromClient;
2489
2490 /* The bin is where the previous and next frames are located. */
2491 float* pPrevFrame = pSRC->bin;
2492 float* pNextFrame = pSRC->bin + pSRC->config.channels;
2493
2494 drmp3_blend_f32((float*)pFramesOut, pPrevFrame, pNextFrame, (float)pSRC->algo.linear.alpha, pSRC->config.channels);
2495
2496 pSRC->algo.linear.alpha += factor;
2497
2498 /* The new alpha value is how we determine whether or not we need to read fresh frames. */
2499 framesToReadFromClient = (drmp3_uint32)pSRC->algo.linear.alpha;
2500 pSRC->algo.linear.alpha = pSRC->algo.linear.alpha - framesToReadFromClient;
2501
2502 for (i = 0; i < framesToReadFromClient; ++i) {
2503 drmp3_uint64 framesRead;
2504 drmp3_uint32 j;
2505
2506 for (j = 0; j < pSRC->config.channels; ++j) {
2507 pPrevFrame[j] = pNextFrame[j];
2508 }
2509
2510 framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pNextFrame);
2511 if (framesRead == 0) {
2512 drmp3_uint32 k;
2513 for (k = 0; k < pSRC->config.channels; ++k) {
2514 pNextFrame[k] = 0;
2515 }
2516
2517 if (pSRC->algo.linear.isNextFramesLoaded) {
2518 pSRC->algo.linear.isNextFramesLoaded = DRMP3_FALSE;
2519 } else {
2520 if (flush) {
2521 pSRC->algo.linear.isPrevFramesLoaded = DRMP3_FALSE;
2522 }
2523 }
2524
2525 break;
2526 }
2527 }
2528
2529 pFramesOut = (drmp3_uint8*)pFramesOut + (1 * pSRC->config.channels * sizeof(float));
2530 frameCount -= 1;
2531 totalFramesRead += 1;
2532
2533 /* If there's no frames available we need to get out of this loop. */
2534 if (!pSRC->algo.linear.isNextFramesLoaded && (!flush || !pSRC->algo.linear.isPrevFramesLoaded)) {
2535 break;
2536 }
2537 }
2538
2539 return totalFramesRead;
2540}
2541
2542
2543static size_t drmp3__on_read(drmp3* pMP3, void* pBufferOut, size_t bytesToRead)
2544{
2545 size_t bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead);
2546 pMP3->streamCursor += bytesRead;
2547 return bytesRead;
2548}
2549
2550static drmp3_bool32 drmp3__on_seek(drmp3* pMP3, int offset, drmp3_seek_origin origin)
2551{
2552 drmp3_assert(offset >= 0);
2553
2554 if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) {
2555 return DRMP3_FALSE;
2556 }
2557
2558 if (origin == drmp3_seek_origin_start) {
2559 pMP3->streamCursor = (drmp3_uint64)offset;
2560 } else {
2561 pMP3->streamCursor += offset;
2562 }
2563
2564 return DRMP3_TRUE;
2565}
2566
2567static drmp3_bool32 drmp3__on_seek_64(drmp3* pMP3, drmp3_uint64 offset, drmp3_seek_origin origin)
2568{
2569 if (offset <= 0x7FFFFFFF) {
2570 return drmp3__on_seek(pMP3, (int)offset, origin);
2571 }
2572
2573
2574 /* Getting here "offset" is too large for a 32-bit integer. We just keep seeking forward until we hit the offset. */
2575 if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_start)) {
2576 return DRMP3_FALSE;
2577 }
2578
2579 offset -= 0x7FFFFFFF;
2580 while (offset > 0) {
2581 if (offset <= 0x7FFFFFFF) {
2582 if (!drmp3__on_seek(pMP3, (int)offset, drmp3_seek_origin_current)) {
2583 return DRMP3_FALSE;
2584 }
2585 offset = 0;
2586 } else {
2587 if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_current)) {
2588 return DRMP3_FALSE;
2589 }
2590 offset -= 0x7FFFFFFF;
2591 }
2592 }
2593
2594 return DRMP3_TRUE;
2595}
2596
2597static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames, drmp3_bool32 discard);
2598static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3);
2599
2600static drmp3_uint64 drmp3_read_src(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, void* pUserData)
2601{
2602 drmp3* pMP3 = (drmp3*)pUserData;
2603 float* pFramesOutF = (float*)pFramesOut;
2604 drmp3_uint64 totalFramesRead = 0;
2605
2606 drmp3_assert(pMP3 != NULL);
2607 drmp3_assert(pMP3->onRead != NULL);
2608
2609 while (frameCount > 0) {
2610 /* Read from the in-memory buffer first. */
2611 while (pMP3->pcmFramesRemainingInMP3Frame > 0 && frameCount > 0) {
2612 drmp3d_sample_t* frames = (drmp3d_sample_t*)pMP3->pcmFrames;
2613#ifndef DR_MP3_FLOAT_OUTPUT
2614 if (pMP3->mp3FrameChannels == 1) {
2615 if (pMP3->channels == 1) {
2616 /* Mono -> Mono. */
2617 pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f;
2618 } else {
2619 /* Mono -> Stereo. */
2620 pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f;
2621 pFramesOutF[1] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f;
2622 }
2623 } else {
2624 if (pMP3->channels == 1) {
2625 /* Stereo -> Mono */
2626 float sample = 0;
2627 sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0] / 32768.0f;
2628 sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1] / 32768.0f;
2629 pFramesOutF[0] = sample * 0.5f;
2630 } else {
2631 /* Stereo -> Stereo */
2632 pFramesOutF[0] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0] / 32768.0f;
2633 pFramesOutF[1] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1] / 32768.0f;
2634 }
2635 }
2636#else
2637 if (pMP3->mp3FrameChannels == 1) {
2638 if (pMP3->channels == 1) {
2639 /* Mono -> Mono. */
2640 pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame];
2641 } else {
2642 /* Mono -> Stereo. */
2643 pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame];
2644 pFramesOutF[1] = frames[pMP3->pcmFramesConsumedInMP3Frame];
2645 }
2646 } else {
2647 if (pMP3->channels == 1) {
2648 /* Stereo -> Mono */
2649 float sample = 0;
2650 sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0];
2651 sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1];
2652 pFramesOutF[0] = sample * 0.5f;
2653 } else {
2654 /* Stereo -> Stereo */
2655 pFramesOutF[0] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0];
2656 pFramesOutF[1] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1];
2657 }
2658 }
2659#endif
2660
2661 pMP3->pcmFramesConsumedInMP3Frame += 1;
2662 pMP3->pcmFramesRemainingInMP3Frame -= 1;
2663 totalFramesRead += 1;
2664 frameCount -= 1;
2665 pFramesOutF += pSRC->config.channels;
2666 }
2667
2668 if (frameCount == 0) {
2669 break;
2670 }
2671
2672 drmp3_assert(pMP3->pcmFramesRemainingInMP3Frame == 0);
2673
2674 /*
2675 At this point we have exhausted our in-memory buffer so we need to re-fill. Note that the sample rate may have changed
2676 at this point which means we'll also need to update our sample rate conversion pipeline.
2677 */
2678 if (drmp3_decode_next_frame(pMP3) == 0) {
2679 break;
2680 }
2681 }
2682
2683 return totalFramesRead;
2684}
2685
2686static drmp3_bool32 drmp3_init_src(drmp3* pMP3)
2687{
2688 drmp3_src_config srcConfig;
2689 drmp3_zero_object(&srcConfig);
2690 srcConfig.sampleRateIn = DR_MP3_DEFAULT_SAMPLE_RATE;
2691 srcConfig.sampleRateOut = pMP3->sampleRate;
2692 srcConfig.channels = pMP3->channels;
2693 srcConfig.algorithm = drmp3_src_algorithm_linear;
2694 if (!drmp3_src_init(&srcConfig, drmp3_read_src, pMP3, &pMP3->src)) {
2695 drmp3_uninit(pMP3);
2696 return DRMP3_FALSE;
2697 }
2698
2699 return DRMP3_TRUE;
2700}
2701
2702static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames, drmp3_bool32 discard)
2703{
2704 drmp3_uint32 pcmFramesRead = 0;
2705
2706 drmp3_assert(pMP3 != NULL);
2707 drmp3_assert(pMP3->onRead != NULL);
2708
2709 if (pMP3->atEnd) {
2710 return 0;
2711 }
2712
2713 do {
2714 drmp3dec_frame_info info;
2715 size_t leftoverDataSize;
2716
2717 /* minimp3 recommends doing data submission in 16K chunks. If we don't have at least 16K bytes available, get more. */
2718 if (pMP3->dataSize < DRMP3_DATA_CHUNK_SIZE) {
2719 size_t bytesRead;
2720
2721 if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) {
2722 drmp3_uint8* pNewData;
2723
2724 pMP3->dataCapacity = DRMP3_DATA_CHUNK_SIZE;
2725 pNewData = (drmp3_uint8*)drmp3_realloc(pMP3->pData, pMP3->dataCapacity);
2726 if (pNewData == NULL) {
2727 return 0; /* Out of memory. */
2728 }
2729
2730 pMP3->pData = pNewData;
2731 }
2732
2733 bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));
2734 if (bytesRead == 0) {
2735 if (pMP3->dataSize == 0) {
2736 pMP3->atEnd = DRMP3_TRUE;
2737 return 0; /* No data. */
2738 }
2739 }
2740
2741 pMP3->dataSize += bytesRead;
2742 }
2743
2744 if (pMP3->dataSize > INT_MAX) {
2745 pMP3->atEnd = DRMP3_TRUE;
2746 return 0; /* File too big. */
2747 }
2748
2749 pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->pData, (int)pMP3->dataSize, pPCMFrames, &info); /* <-- Safe size_t -> int conversion thanks to the check above. */
2750
2751 /* Consume the data. */
2752 leftoverDataSize = (pMP3->dataSize - (size_t)info.frame_bytes);
2753 if (info.frame_bytes > 0) {
2754 memmove(pMP3->pData, pMP3->pData + info.frame_bytes, leftoverDataSize);
2755 pMP3->dataSize = leftoverDataSize;
2756 }
2757
2758 /*
2759 pcmFramesRead will be equal to 0 if decoding failed. If it is zero and info.frame_bytes > 0 then we have successfully
2760 decoded the frame. A special case is if we are wanting to discard the frame, in which case we return successfully.
2761 */
2762 if (pcmFramesRead > 0 || (info.frame_bytes > 0 && discard)) {
2763 pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header);
2764 pMP3->pcmFramesConsumedInMP3Frame = 0;
2765 pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;
2766 pMP3->mp3FrameChannels = info.channels;
2767 pMP3->mp3FrameSampleRate = info.hz;
2768
2769 /* We need to initialize the resampler if we don't yet have the channel count or sample rate. */
2770 if (pMP3->channels == 0 || pMP3->sampleRate == 0) {
2771 if (pMP3->channels == 0) {
2772 pMP3->channels = info.channels;
2773 }
2774 if (pMP3->sampleRate == 0) {
2775 pMP3->sampleRate = info.hz;
2776 }
2777 drmp3_init_src(pMP3);
2778 }
2779
2780 drmp3_src_set_input_sample_rate(&pMP3->src, pMP3->mp3FrameSampleRate);
2781 break;
2782 } else if (info.frame_bytes == 0) {
2783 size_t bytesRead;
2784
2785 /* Need more data. minimp3 recommends doing data submission in 16K chunks. */
2786 if (pMP3->dataCapacity == pMP3->dataSize) {
2787 drmp3_uint8* pNewData;
2788
2789 /* No room. Expand. */
2790 pMP3->dataCapacity += DRMP3_DATA_CHUNK_SIZE;
2791 pNewData = (drmp3_uint8*)drmp3_realloc(pMP3->pData, pMP3->dataCapacity);
2792 if (pNewData == NULL) {
2793 return 0; /* Out of memory. */
2794 }
2795
2796 pMP3->pData = pNewData;
2797 }
2798
2799 /* Fill in a chunk. */
2800 bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));
2801 if (bytesRead == 0) {
2802 pMP3->atEnd = DRMP3_TRUE;
2803 return 0; /* Error reading more data. */
2804 }
2805
2806 pMP3->dataSize += bytesRead;
2807 }
2808 } while (DRMP3_TRUE);
2809
2810 return pcmFramesRead;
2811}
2812
2813static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3)
2814{
2815 drmp3_assert(pMP3 != NULL);
2816 return drmp3_decode_next_frame_ex(pMP3, (drmp3d_sample_t*)pMP3->pcmFrames, DRMP3_FALSE);
2817}
2818
2819#if 0
2820static drmp3_uint32 drmp3_seek_next_frame(drmp3* pMP3)
2821{
2822 drmp3_uint32 pcmFrameCount;
2823
2824 drmp3_assert(pMP3 != NULL);
2825
2826 pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, NULL);
2827 if (pcmFrameCount == 0) {
2828 return 0;
2829 }
2830
2831 /* We have essentially just skipped past the frame, so just set the remaining samples to 0. */
2832 pMP3->currentPCMFrame += pcmFrameCount;
2833 pMP3->pcmFramesConsumedInMP3Frame = pcmFrameCount;
2834 pMP3->pcmFramesRemainingInMP3Frame = 0;
2835
2836 return pcmFrameCount;
2837}
2838#endif
2839
2840drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig)
2841{
2842 drmp3_config config;
2843
2844 drmp3_assert(pMP3 != NULL);
2845 drmp3_assert(onRead != NULL);
2846
2847 /* This function assumes the output object has already been reset to 0. Do not do that here, otherwise things will break. */
2848 drmp3dec_init(&pMP3->decoder);
2849
2850 /* The config can be null in which case we use defaults. */
2851 if (pConfig != NULL) {
2852 config = *pConfig;
2853 } else {
2854 drmp3_zero_object(&config);
2855 }
2856
2857 pMP3->channels = config.outputChannels;
2858
2859 /* Cannot have more than 2 channels. */
2860 if (pMP3->channels > 2) {
2861 pMP3->channels = 2;
2862 }
2863
2864 pMP3->sampleRate = config.outputSampleRate;
2865
2866 pMP3->onRead = onRead;
2867 pMP3->onSeek = onSeek;
2868 pMP3->pUserData = pUserData;
2869
2870 /*
2871 We need a sample rate converter for converting the sample rate from the MP3 frames to the requested output sample rate. Note that if
2872 we don't yet know the channel count or sample rate we defer this until the first frame is read.
2873 */
2874 if (pMP3->channels != 0 && pMP3->sampleRate != 0) {
2875 drmp3_init_src(pMP3);
2876 }
2877
2878 /* Decode the first frame to confirm that it is indeed a valid MP3 stream. */
2879 if (!drmp3_decode_next_frame(pMP3)) {
2880 drmp3_uninit(pMP3);
2881 return DRMP3_FALSE; /* Not a valid MP3 stream. */
2882 }
2883
2884 return DRMP3_TRUE;
2885}
2886
2887drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig)
2888{
2889 if (pMP3 == NULL || onRead == NULL) {
2890 return DRMP3_FALSE;
2891 }
2892
2893 drmp3_zero_object(pMP3);
2894 return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pConfig);
2895}
2896
2897
2898static size_t drmp3__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead)
2899{
2900 drmp3* pMP3 = (drmp3*)pUserData;
2901 size_t bytesRemaining;
2902
2903 drmp3_assert(pMP3 != NULL);
2904 drmp3_assert(pMP3->memory.dataSize >= pMP3->memory.currentReadPos);
2905
2906 bytesRemaining = pMP3->memory.dataSize - pMP3->memory.currentReadPos;
2907 if (bytesToRead > bytesRemaining) {
2908 bytesToRead = bytesRemaining;
2909 }
2910
2911 if (bytesToRead > 0) {
2912 drmp3_copy_memory(pBufferOut, pMP3->memory.pData + pMP3->memory.currentReadPos, bytesToRead);
2913 pMP3->memory.currentReadPos += bytesToRead;
2914 }
2915
2916 return bytesToRead;
2917}
2918
2919static drmp3_bool32 drmp3__on_seek_memory(void* pUserData, int byteOffset, drmp3_seek_origin origin)
2920{
2921 drmp3* pMP3 = (drmp3*)pUserData;
2922
2923 drmp3_assert(pMP3 != NULL);
2924
2925 if (origin == drmp3_seek_origin_current) {
2926 if (byteOffset > 0) {
2927 if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) {
2928 byteOffset = (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos); /* Trying to seek too far forward. */
2929 }
2930 } else {
2931 if (pMP3->memory.currentReadPos < (size_t)-byteOffset) {
2932 byteOffset = -(int)pMP3->memory.currentReadPos; /* Trying to seek too far backwards. */
2933 }
2934 }
2935
2936 /* This will never underflow thanks to the clamps above. */
2937 pMP3->memory.currentReadPos += byteOffset;
2938 } else {
2939 if ((drmp3_uint32)byteOffset <= pMP3->memory.dataSize) {
2940 pMP3->memory.currentReadPos = byteOffset;
2941 } else {
2942 pMP3->memory.currentReadPos = pMP3->memory.dataSize; /* Trying to seek too far forward. */
2943 }
2944 }
2945
2946 return DRMP3_TRUE;
2947}
2948
2949drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_config* pConfig)
2950{
2951 if (pMP3 == NULL) {
2952 return DRMP3_FALSE;
2953 }
2954
2955 drmp3_zero_object(pMP3);
2956
2957 if (pData == NULL || dataSize == 0) {
2958 return DRMP3_FALSE;
2959 }
2960
2961 pMP3->memory.pData = (const drmp3_uint8*)pData;
2962 pMP3->memory.dataSize = dataSize;
2963 pMP3->memory.currentReadPos = 0;
2964
2965 return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pConfig);
2966}
2967
2968
2969#ifndef DR_MP3_NO_STDIO
2970#include <stdio.h>
2971
2972static size_t drmp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead)
2973{
2974 return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);
2975}
2976
2977static drmp3_bool32 drmp3__on_seek_stdio(void* pUserData, int offset, drmp3_seek_origin origin)
2978{
2979 return fseek((FILE*)pUserData, offset, (origin == drmp3_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;
2980}
2981
2982drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* filePath, const drmp3_config* pConfig)
2983{
2984 FILE* pFile;
2985#if defined(_MSC_VER) && _MSC_VER >= 1400
2986 if (fopen_s(&pFile, filePath, "rb") != 0) {
2987 return DRMP3_FALSE;
2988 }
2989#else
2990 pFile = fopen(filePath, "rb");
2991 if (pFile == NULL) {
2992 return DRMP3_FALSE;
2993 }
2994#endif
2995
2996 return drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (void*)pFile, pConfig);
2997}
2998#endif
2999
3000void drmp3_uninit(drmp3* pMP3)
3001{
3002 if (pMP3 == NULL) {
3003 return;
3004 }
3005
3006#ifndef DR_MP3_NO_STDIO
3007 if (pMP3->onRead == drmp3__on_read_stdio) {
3008 fclose((FILE*)pMP3->pUserData);
3009 }
3010#endif
3011
3012 drmp3_free(pMP3->pData);
3013}
3014
3015drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut)
3016{
3017 drmp3_uint64 totalFramesRead = 0;
3018
3019 if (pMP3 == NULL || pMP3->onRead == NULL) {
3020 return 0;
3021 }
3022
3023 if (pBufferOut == NULL) {
3024 float temp[4096];
3025 while (framesToRead > 0) {
3026 drmp3_uint64 framesJustRead;
3027 drmp3_uint64 framesToReadRightNow = sizeof(temp)/sizeof(temp[0]) / pMP3->channels;
3028 if (framesToReadRightNow > framesToRead) {
3029 framesToReadRightNow = framesToRead;
3030 }
3031
3032 framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp);
3033 if (framesJustRead == 0) {
3034 break;
3035 }
3036
3037 framesToRead -= framesJustRead;
3038 totalFramesRead += framesJustRead;
3039 }
3040 } else {
3041 totalFramesRead = drmp3_src_read_frames_ex(&pMP3->src, framesToRead, pBufferOut, DRMP3_TRUE);
3042 pMP3->currentPCMFrame += totalFramesRead;
3043 }
3044
3045 return totalFramesRead;
3046}
3047
3048drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut)
3049{
3050 float tempF32[4096];
3051 drmp3_uint64 pcmFramesJustRead;
3052 drmp3_uint64 totalPCMFramesRead = 0;
3053
3054 if (pMP3 == NULL || pMP3->onRead == NULL) {
3055 return 0;
3056 }
3057
3058 /* Naive implementation: read into a temp f32 buffer, then convert. */
3059 for (;;) {
3060 drmp3_uint64 pcmFramesToReadThisIteration = (framesToRead - totalPCMFramesRead);
3061 if (pcmFramesToReadThisIteration > drmp3_countof(tempF32)/pMP3->channels) {
3062 pcmFramesToReadThisIteration = drmp3_countof(tempF32)/pMP3->channels;
3063 }
3064
3065 pcmFramesJustRead = drmp3_read_pcm_frames_f32(pMP3, pcmFramesToReadThisIteration, tempF32);
3066 if (pcmFramesJustRead == 0) {
3067 break;
3068 }
3069
3070 drmp3dec_f32_to_s16(tempF32, pBufferOut, (int)(pcmFramesJustRead * pMP3->channels)); /* <-- Safe cast since pcmFramesJustRead will be clamped based on the size of tempF32 which is always small. */
3071 pBufferOut += pcmFramesJustRead * pMP3->channels;
3072
3073 totalPCMFramesRead += pcmFramesJustRead;
3074
3075 if (pcmFramesJustRead < pcmFramesToReadThisIteration) {
3076 break;
3077 }
3078 }
3079
3080 return totalPCMFramesRead;
3081}
3082
3083void drmp3_reset(drmp3* pMP3)
3084{
3085 drmp3_assert(pMP3 != NULL);
3086
3087 pMP3->pcmFramesConsumedInMP3Frame = 0;
3088 pMP3->pcmFramesRemainingInMP3Frame = 0;
3089 pMP3->currentPCMFrame = 0;
3090 pMP3->dataSize = 0;
3091 pMP3->atEnd = DRMP3_FALSE;
3092 pMP3->src.bin[0] = 0;
3093 pMP3->src.bin[1] = 0;
3094 pMP3->src.bin[2] = 0;
3095 pMP3->src.bin[3] = 0;
3096 pMP3->src.cache.cachedFrameCount = 0;
3097 pMP3->src.cache.iNextFrame = 0;
3098 pMP3->src.algo.linear.alpha = 0;
3099 pMP3->src.algo.linear.isNextFramesLoaded = 0;
3100 pMP3->src.algo.linear.isPrevFramesLoaded = 0;
3101 drmp3dec_init(&pMP3->decoder);
3102}
3103
3104drmp3_bool32 drmp3_seek_to_start_of_stream(drmp3* pMP3)
3105{
3106 drmp3_assert(pMP3 != NULL);
3107 drmp3_assert(pMP3->onSeek != NULL);
3108
3109 /* Seek to the start of the stream to begin with. */
3110 if (!drmp3__on_seek(pMP3, 0, drmp3_seek_origin_start)) {
3111 return DRMP3_FALSE;
3112 }
3113
3114 /* Clear any cached data. */
3115 drmp3_reset(pMP3);
3116 return DRMP3_TRUE;
3117}
3118
3119float drmp3_get_cached_pcm_frame_count_from_src(drmp3* pMP3)
3120{
3121 return (pMP3->src.cache.cachedFrameCount - pMP3->src.cache.iNextFrame) + (float)pMP3->src.algo.linear.alpha;
3122}
3123
3124float drmp3_get_pcm_frames_remaining_in_mp3_frame(drmp3* pMP3)
3125{
3126 float factor = (float)pMP3->src.config.sampleRateOut / (float)pMP3->src.config.sampleRateIn;
3127 float frameCountPreSRC = drmp3_get_cached_pcm_frame_count_from_src(pMP3) + pMP3->pcmFramesRemainingInMP3Frame;
3128 return frameCountPreSRC * factor;
3129}
3130
3131/*
3132NOTE ON SEEKING
3133===============
3134The seeking code below is a complete mess and is broken for cases when the sample rate changes. The problem
3135is with the resampling and the crappy resampler used by dr_mp3. What needs to happen is the following:
3136
31371) The resampler needs to be replaced.
31382) The resampler has state which needs to be updated whenever an MP3 frame is decoded outside of
3139 drmp3_read_pcm_frames_f32(). The resampler needs an API to "flush" some imaginary input so that it's
3140 state is updated accordingly.
3141*/
3142drmp3_bool32 drmp3_seek_forward_by_pcm_frames__brute_force(drmp3* pMP3, drmp3_uint64 frameOffset)
3143{
3144 drmp3_uint64 framesRead;
3145
3146#if 0
3147 /*
3148 MP3 is a bit annoying when it comes to seeking because of the bit reservoir. It basically means that an MP3 frame can possibly
3149 depend on some of the data of prior frames. This means it's not as simple as seeking to the first byte of the MP3 frame that
3150 contains the sample because that MP3 frame will need the data from the previous MP3 frame (which we just seeked past!). To
3151 resolve this we seek past a number of MP3 frames up to a point, and then read-and-discard the remainder.
3152 */
3153 drmp3_uint64 maxFramesToReadAndDiscard = (drmp3_uint64)(DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME * 3 * ((float)pMP3->src.config.sampleRateOut / (float)pMP3->src.config.sampleRateIn));
3154
3155 /* Now get rid of leading whole frames. */
3156 while (frameOffset > maxFramesToReadAndDiscard) {
3157 float pcmFramesRemainingInCurrentMP3FrameF = drmp3_get_pcm_frames_remaining_in_mp3_frame(pMP3);
3158 drmp3_uint32 pcmFramesRemainingInCurrentMP3Frame = (drmp3_uint32)pcmFramesRemainingInCurrentMP3FrameF;
3159 if (frameOffset > pcmFramesRemainingInCurrentMP3Frame) {
3160 frameOffset -= pcmFramesRemainingInCurrentMP3Frame;
3161 pMP3->currentPCMFrame += pcmFramesRemainingInCurrentMP3Frame;
3162 pMP3->pcmFramesConsumedInMP3Frame += pMP3->pcmFramesRemainingInMP3Frame;
3163 pMP3->pcmFramesRemainingInMP3Frame = 0;
3164 } else {
3165 break;
3166 }
3167
3168 drmp3_uint32 pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, pMP3->pcmFrames, DRMP3_FALSE);
3169 if (pcmFrameCount == 0) {
3170 break;
3171 }
3172 }
3173
3174 /* The last step is to read-and-discard any remaining PCM frames to make it sample-exact. */
3175 framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL);
3176 if (framesRead != frameOffset) {
3177 return DRMP3_FALSE;
3178 }
3179#else
3180 /* Just using a dumb read-and-discard for now pending updates to the resampler. */
3181 framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL);
3182 if (framesRead != frameOffset) {
3183 return DRMP3_FALSE;
3184 }
3185#endif
3186
3187 return DRMP3_TRUE;
3188}
3189
3190drmp3_bool32 drmp3_seek_to_pcm_frame__brute_force(drmp3* pMP3, drmp3_uint64 frameIndex)
3191{
3192 drmp3_assert(pMP3 != NULL);
3193
3194 if (frameIndex == pMP3->currentPCMFrame) {
3195 return DRMP3_TRUE;
3196 }
3197
3198 /*
3199 If we're moving foward we just read from where we're at. Otherwise we need to move back to the start of
3200 the stream and read from the beginning.
3201 */
3202 if (frameIndex < pMP3->currentPCMFrame) {
3203 /* Moving backward. Move to the start of the stream and then move forward. */
3204 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3205 return DRMP3_FALSE;
3206 }
3207 }
3208
3209 drmp3_assert(frameIndex >= pMP3->currentPCMFrame);
3210 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->currentPCMFrame));
3211}
3212
3213drmp3_bool32 drmp3_find_closest_seek_point(drmp3* pMP3, drmp3_uint64 frameIndex, drmp3_uint32* pSeekPointIndex)
3214{
3215 drmp3_uint32 iSeekPoint;
3216
3217 drmp3_assert(pSeekPointIndex != NULL);
3218
3219 *pSeekPointIndex = 0;
3220
3221 if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) {
3222 return DRMP3_FALSE;
3223 }
3224
3225 /* Linear search for simplicity to begin with while I'm getting this thing working. Once it's all working change this to a binary search. */
3226 for (iSeekPoint = 0; iSeekPoint < pMP3->seekPointCount; ++iSeekPoint) {
3227 if (pMP3->pSeekPoints[iSeekPoint].pcmFrameIndex > frameIndex) {
3228 break; /* Found it. */
3229 }
3230
3231 *pSeekPointIndex = iSeekPoint;
3232 }
3233
3234 return DRMP3_TRUE;
3235}
3236
3237drmp3_bool32 drmp3_seek_to_pcm_frame__seek_table(drmp3* pMP3, drmp3_uint64 frameIndex)
3238{
3239 drmp3_seek_point seekPoint;
3240 drmp3_uint32 priorSeekPointIndex;
3241 drmp3_uint16 iMP3Frame;
3242 drmp3_uint64 leftoverFrames;
3243
3244 drmp3_assert(pMP3 != NULL);
3245 drmp3_assert(pMP3->pSeekPoints != NULL);
3246 drmp3_assert(pMP3->seekPointCount > 0);
3247
3248 /* If there is no prior seekpoint it means the target PCM frame comes before the first seek point. Just assume a seekpoint at the start of the file in this case. */
3249 if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) {
3250 seekPoint = pMP3->pSeekPoints[priorSeekPointIndex];
3251 } else {
3252 seekPoint.seekPosInBytes = 0;
3253 seekPoint.pcmFrameIndex = 0;
3254 seekPoint.mp3FramesToDiscard = 0;
3255 seekPoint.pcmFramesToDiscard = 0;
3256 }
3257
3258 /* First thing to do is seek to the first byte of the relevant MP3 frame. */
3259 if (!drmp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, drmp3_seek_origin_start)) {
3260 return DRMP3_FALSE; /* Failed to seek. */
3261 }
3262
3263 /* Clear any cached data. */
3264 drmp3_reset(pMP3);
3265
3266 /* Whole MP3 frames need to be discarded first. */
3267 for (iMP3Frame = 0; iMP3Frame < seekPoint.mp3FramesToDiscard; ++iMP3Frame) {
3268 drmp3_uint32 pcmFramesReadPreSRC;
3269 drmp3d_sample_t* pPCMFrames;
3270
3271 /* Pass in non-null for the last frame because we want to ensure the sample rate converter is preloaded correctly. */
3272 pPCMFrames = NULL;
3273 if (iMP3Frame == seekPoint.mp3FramesToDiscard-1) {
3274 pPCMFrames = (drmp3d_sample_t*)pMP3->pcmFrames;
3275 }
3276
3277 /* We first need to decode the next frame, and then we need to flush the resampler. */
3278 pcmFramesReadPreSRC = drmp3_decode_next_frame_ex(pMP3, pPCMFrames, DRMP3_TRUE);
3279 if (pcmFramesReadPreSRC == 0) {
3280 return DRMP3_FALSE;
3281 }
3282 }
3283
3284 /* We seeked to an MP3 frame in the raw stream so we need to make sure the current PCM frame is set correctly. */
3285 pMP3->currentPCMFrame = seekPoint.pcmFrameIndex - seekPoint.pcmFramesToDiscard;
3286
3287 /*
3288 Update resampler. This is wrong. Need to instead update it on a per MP3 frame basis. Also broken for cases when
3289 the sample rate is being reduced in my testing. Should work fine when the input and output sample rate is the same
3290 or a clean multiple.
3291 */
3292 pMP3->src.algo.linear.alpha = (drmp3_int64)pMP3->currentPCMFrame * ((double)pMP3->src.config.sampleRateIn / pMP3->src.config.sampleRateOut); /* <-- Cast to int64 is required for VC6. */
3293 pMP3->src.algo.linear.alpha = pMP3->src.algo.linear.alpha - (drmp3_uint32)(pMP3->src.algo.linear.alpha);
3294 if (pMP3->src.algo.linear.alpha > 0) {
3295 pMP3->src.algo.linear.isPrevFramesLoaded = 1;
3296 }
3297
3298 /*
3299 Now at this point we can follow the same process as the brute force technique where we just skip over unnecessary MP3 frames and then
3300 read-and-discard at least 2 whole MP3 frames.
3301 */
3302 leftoverFrames = frameIndex - pMP3->currentPCMFrame;
3303 return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames);
3304}
3305
3306drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex)
3307{
3308 if (pMP3 == NULL || pMP3->onSeek == NULL) {
3309 return DRMP3_FALSE;
3310 }
3311
3312 if (frameIndex == 0) {
3313 return drmp3_seek_to_start_of_stream(pMP3);
3314 }
3315
3316 /* Use the seek table if we have one. */
3317 if (pMP3->pSeekPoints != NULL && pMP3->seekPointCount > 0) {
3318 return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex);
3319 } else {
3320 return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex);
3321 }
3322}
3323
3324drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount)
3325{
3326 drmp3_uint64 currentPCMFrame;
3327 drmp3_uint64 totalPCMFrameCount;
3328 drmp3_uint64 totalMP3FrameCount;
3329 float totalPCMFrameCountFractionalPart;
3330
3331 if (pMP3 == NULL) {
3332 return DRMP3_FALSE;
3333 }
3334
3335 /*
3336 The way this works is we move back to the start of the stream, iterate over each MP3 frame and calculate the frame count based
3337 on our output sample rate, the seek back to the PCM frame we were sitting on before calling this function.
3338 */
3339
3340 /* The stream must support seeking for this to work. */
3341 if (pMP3->onSeek == NULL) {
3342 return DRMP3_FALSE;
3343 }
3344
3345 /* We'll need to seek back to where we were, so grab the PCM frame we're currently sitting on so we can restore later. */
3346 currentPCMFrame = pMP3->currentPCMFrame;
3347
3348 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3349 return DRMP3_FALSE;
3350 }
3351
3352 totalPCMFrameCount = 0;
3353 totalMP3FrameCount = 0;
3354
3355 totalPCMFrameCountFractionalPart = 0; /* <-- With resampling there will be a fractional part to each MP3 frame that we need to accumulate. */
3356 for (;;) {
3357 drmp3_uint32 pcmFramesInCurrentMP3FrameIn;
3358 float srcRatio;
3359 float pcmFramesInCurrentMP3FrameOutF;
3360 drmp3_uint32 pcmFramesInCurrentMP3FrameOut;
3361
3362 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_FALSE);
3363 if (pcmFramesInCurrentMP3FrameIn == 0) {
3364 break;
3365 }
3366
3367 srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate;
3368 drmp3_assert(srcRatio > 0);
3369
3370 pcmFramesInCurrentMP3FrameOutF = totalPCMFrameCountFractionalPart + (pcmFramesInCurrentMP3FrameIn / srcRatio);
3371 pcmFramesInCurrentMP3FrameOut = (drmp3_uint32)pcmFramesInCurrentMP3FrameOutF;
3372 totalPCMFrameCountFractionalPart = pcmFramesInCurrentMP3FrameOutF - pcmFramesInCurrentMP3FrameOut;
3373 totalPCMFrameCount += pcmFramesInCurrentMP3FrameOut;
3374 totalMP3FrameCount += 1;
3375 }
3376
3377 /* Finally, we need to seek back to where we were. */
3378 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3379 return DRMP3_FALSE;
3380 }
3381
3382 if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {
3383 return DRMP3_FALSE;
3384 }
3385
3386 if (pMP3FrameCount != NULL) {
3387 *pMP3FrameCount = totalMP3FrameCount;
3388 }
3389 if (pPCMFrameCount != NULL) {
3390 *pPCMFrameCount = totalPCMFrameCount;
3391 }
3392
3393 return DRMP3_TRUE;
3394}
3395
3396drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3)
3397{
3398 drmp3_uint64 totalPCMFrameCount;
3399 if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) {
3400 return 0;
3401 }
3402
3403 return totalPCMFrameCount;
3404}
3405
3406drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3)
3407{
3408 drmp3_uint64 totalMP3FrameCount;
3409 if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, NULL)) {
3410 return 0;
3411 }
3412
3413 return totalMP3FrameCount;
3414}
3415
3416void drmp3__accumulate_running_pcm_frame_count(drmp3* pMP3, drmp3_uint32 pcmFrameCountIn, drmp3_uint64* pRunningPCMFrameCount, float* pRunningPCMFrameCountFractionalPart)
3417{
3418 float srcRatio;
3419 float pcmFrameCountOutF;
3420 drmp3_uint32 pcmFrameCountOut;
3421
3422 srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate;
3423 drmp3_assert(srcRatio > 0);
3424
3425 pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio);
3426 pcmFrameCountOut = (drmp3_uint32)pcmFrameCountOutF;
3427 *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut;
3428 *pRunningPCMFrameCount += pcmFrameCountOut;
3429}
3430
3431typedef struct
3432{
3433 drmp3_uint64 bytePos;
3434 drmp3_uint64 pcmFrameIndex; /* <-- After sample rate conversion. */
3435} drmp3__seeking_mp3_frame_info;
3436
3437drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints)
3438{
3439 drmp3_uint32 seekPointCount;
3440 drmp3_uint64 currentPCMFrame;
3441 drmp3_uint64 totalMP3FrameCount;
3442 drmp3_uint64 totalPCMFrameCount;
3443
3444 if (pMP3 == NULL || pSeekPointCount == NULL || pSeekPoints == NULL) {
3445 return DRMP3_FALSE; /* Invalid args. */
3446 }
3447
3448 seekPointCount = *pSeekPointCount;
3449 if (seekPointCount == 0) {
3450 return DRMP3_FALSE; /* The client has requested no seek points. Consider this to be invalid arguments since the client has probably not intended this. */
3451 }
3452
3453 /* We'll need to seek back to the current sample after calculating the seekpoints so we need to go ahead and grab the current location at the top. */
3454 currentPCMFrame = pMP3->currentPCMFrame;
3455
3456 /* We never do more than the total number of MP3 frames and we limit it to 32-bits. */
3457 if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, &totalPCMFrameCount)) {
3458 return DRMP3_FALSE;
3459 }
3460
3461 /* If there's less than DRMP3_SEEK_LEADING_MP3_FRAMES+1 frames we just report 1 seek point which will be the very start of the stream. */
3462 if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) {
3463 seekPointCount = 1;
3464 pSeekPoints[0].seekPosInBytes = 0;
3465 pSeekPoints[0].pcmFrameIndex = 0;
3466 pSeekPoints[0].mp3FramesToDiscard = 0;
3467 pSeekPoints[0].pcmFramesToDiscard = 0;
3468 } else {
3469 drmp3_uint64 pcmFramesBetweenSeekPoints;
3470 drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1];
3471 drmp3_uint64 runningPCMFrameCount = 0;
3472 float runningPCMFrameCountFractionalPart = 0;
3473 drmp3_uint64 nextTargetPCMFrame;
3474 drmp3_uint32 iMP3Frame;
3475 drmp3_uint32 iSeekPoint;
3476
3477 if (seekPointCount > totalMP3FrameCount-1) {
3478 seekPointCount = (drmp3_uint32)totalMP3FrameCount-1;
3479 }
3480
3481 pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1);
3482
3483 /*
3484 Here is where we actually calculate the seek points. We need to start by moving the start of the stream. We then enumerate over each
3485 MP3 frame.
3486 */
3487 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3488 return DRMP3_FALSE;
3489 }
3490
3491 /*
3492 We need to cache the byte positions of the previous MP3 frames. As a new MP3 frame is iterated, we cycle the byte positions in this
3493 array. The value in the first item in this array is the byte position that will be reported in the next seek point.
3494 */
3495
3496 /* We need to initialize the array of MP3 byte positions for the leading MP3 frames. */
3497 for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) {
3498 drmp3_uint32 pcmFramesInCurrentMP3FrameIn;
3499
3500 /* The byte position of the next frame will be the stream's cursor position, minus whatever is sitting in the buffer. */
3501 drmp3_assert(pMP3->streamCursor >= pMP3->dataSize);
3502 mp3FrameInfo[iMP3Frame].bytePos = pMP3->streamCursor - pMP3->dataSize;
3503 mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount;
3504
3505 /* We need to get information about this frame so we can know how many samples it contained. */
3506 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_FALSE);
3507 if (pcmFramesInCurrentMP3FrameIn == 0) {
3508 return DRMP3_FALSE; /* This should never happen. */
3509 }
3510
3511 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
3512 }
3513
3514 /*
3515 At this point we will have extracted the byte positions of the leading MP3 frames. We can now start iterating over each seek point and
3516 calculate them.
3517 */
3518 nextTargetPCMFrame = 0;
3519 for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) {
3520 nextTargetPCMFrame += pcmFramesBetweenSeekPoints;
3521
3522 for (;;) {
3523 if (nextTargetPCMFrame < runningPCMFrameCount) {
3524 /* The next seek point is in the current MP3 frame. */
3525 pSeekPoints[iSeekPoint].seekPosInBytes = mp3FrameInfo[0].bytePos;
3526 pSeekPoints[iSeekPoint].pcmFrameIndex = nextTargetPCMFrame;
3527 pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES;
3528 pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);
3529 break;
3530 } else {
3531 size_t i;
3532 drmp3_uint32 pcmFramesInCurrentMP3FrameIn;
3533
3534 /*
3535 The next seek point is not in the current MP3 frame, so continue on to the next one. The first thing to do is cycle the cached
3536 MP3 frame info.
3537 */
3538 for (i = 0; i < drmp3_countof(mp3FrameInfo)-1; ++i) {
3539 mp3FrameInfo[i] = mp3FrameInfo[i+1];
3540 }
3541
3542 /* Cache previous MP3 frame info. */
3543 mp3FrameInfo[drmp3_countof(mp3FrameInfo)-1].bytePos = pMP3->streamCursor - pMP3->dataSize;
3544 mp3FrameInfo[drmp3_countof(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount;
3545
3546 /*
3547 Go to the next MP3 frame. This shouldn't ever fail, but just in case it does we just set the seek point and break. If it happens, it
3548 should only ever do it for the last seek point.
3549 */
3550 pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_TRUE);
3551 if (pcmFramesInCurrentMP3FrameIn == 0) {
3552 pSeekPoints[iSeekPoint].seekPosInBytes = mp3FrameInfo[0].bytePos;
3553 pSeekPoints[iSeekPoint].pcmFrameIndex = nextTargetPCMFrame;
3554 pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES;
3555 pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);
3556 break;
3557 }
3558
3559 drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
3560 }
3561 }
3562 }
3563
3564 /* Finally, we need to seek back to where we were. */
3565 if (!drmp3_seek_to_start_of_stream(pMP3)) {
3566 return DRMP3_FALSE;
3567 }
3568 if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {
3569 return DRMP3_FALSE;
3570 }
3571 }
3572
3573 *pSeekPointCount = seekPointCount;
3574 return DRMP3_TRUE;
3575}
3576
3577drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints)
3578{
3579 if (pMP3 == NULL) {
3580 return DRMP3_FALSE;
3581 }
3582
3583 if (seekPointCount == 0 || pSeekPoints == NULL) {
3584 /* Unbinding. */
3585 pMP3->seekPointCount = 0;
3586 pMP3->pSeekPoints = NULL;
3587 } else {
3588 /* Binding. */
3589 pMP3->seekPointCount = seekPointCount;
3590 pMP3->pSeekPoints = pSeekPoints;
3591 }
3592
3593 return DRMP3_TRUE;
3594}
3595
3596
3597float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3598{
3599 drmp3_uint64 totalFramesRead = 0;
3600 drmp3_uint64 framesCapacity = 0;
3601 float* pFrames = NULL;
3602 float temp[4096];
3603
3604 drmp3_assert(pMP3 != NULL);
3605
3606 for (;;) {
3607 drmp3_uint64 framesToReadRightNow = drmp3_countof(temp) / pMP3->channels;
3608 drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp);
3609 if (framesJustRead == 0) {
3610 break;
3611 }
3612
3613 /* Reallocate the output buffer if there's not enough room. */
3614 if (framesCapacity < totalFramesRead + framesJustRead) {
3615 drmp3_uint64 newFramesBufferSize;
3616 float* pNewFrames;
3617
3618 framesCapacity *= 2;
3619 if (framesCapacity < totalFramesRead + framesJustRead) {
3620 framesCapacity = totalFramesRead + framesJustRead;
3621 }
3622
3623 newFramesBufferSize = framesCapacity*pMP3->channels*sizeof(float);
3624 if (newFramesBufferSize > DRMP3_SIZE_MAX) {
3625 break;
3626 }
3627
3628 pNewFrames = (float*)drmp3_realloc(pFrames, (size_t)newFramesBufferSize);
3629 if (pNewFrames == NULL) {
3630 drmp3_free(pFrames);
3631 break;
3632 }
3633
3634 pFrames = pNewFrames;
3635 }
3636
3637 drmp3_copy_memory(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(float)));
3638 totalFramesRead += framesJustRead;
3639
3640 /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */
3641 if (framesJustRead != framesToReadRightNow) {
3642 break;
3643 }
3644 }
3645
3646 if (pConfig != NULL) {
3647 pConfig->outputChannels = pMP3->channels;
3648 pConfig->outputSampleRate = pMP3->sampleRate;
3649 }
3650
3651 drmp3_uninit(pMP3);
3652
3653 if (pTotalFrameCount) {
3654 *pTotalFrameCount = totalFramesRead;
3655 }
3656
3657 return pFrames;
3658}
3659
3660drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3661{
3662 drmp3_uint64 totalFramesRead = 0;
3663 drmp3_uint64 framesCapacity = 0;
3664 drmp3_int16* pFrames = NULL;
3665 drmp3_int16 temp[4096];
3666
3667 drmp3_assert(pMP3 != NULL);
3668
3669 for (;;) {
3670 drmp3_uint64 framesToReadRightNow = drmp3_countof(temp) / pMP3->channels;
3671 drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_s16(pMP3, framesToReadRightNow, temp);
3672 if (framesJustRead == 0) {
3673 break;
3674 }
3675
3676 /* Reallocate the output buffer if there's not enough room. */
3677 if (framesCapacity < totalFramesRead + framesJustRead) {
3678 drmp3_uint64 newFramesBufferSize;
3679 drmp3_int16* pNewFrames;
3680
3681 framesCapacity *= 2;
3682 if (framesCapacity < totalFramesRead + framesJustRead) {
3683 framesCapacity = totalFramesRead + framesJustRead;
3684 }
3685
3686 newFramesBufferSize = framesCapacity*pMP3->channels*sizeof(drmp3_int16);
3687 if (newFramesBufferSize > DRMP3_SIZE_MAX) {
3688 break;
3689 }
3690
3691 pNewFrames = (drmp3_int16*)drmp3_realloc(pFrames, (size_t)newFramesBufferSize);
3692 if (pNewFrames == NULL) {
3693 drmp3_free(pFrames);
3694 break;
3695 }
3696
3697 pFrames = pNewFrames;
3698 }
3699
3700 drmp3_copy_memory(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(drmp3_int16)));
3701 totalFramesRead += framesJustRead;
3702
3703 /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */
3704 if (framesJustRead != framesToReadRightNow) {
3705 break;
3706 }
3707 }
3708
3709 if (pConfig != NULL) {
3710 pConfig->outputChannels = pMP3->channels;
3711 pConfig->outputSampleRate = pMP3->sampleRate;
3712 }
3713
3714 drmp3_uninit(pMP3);
3715
3716 if (pTotalFrameCount) {
3717 *pTotalFrameCount = totalFramesRead;
3718 }
3719
3720 return pFrames;
3721}
3722
3723
3724float* drmp3_open_and_read_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3725{
3726 drmp3 mp3;
3727 if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig)) {
3728 return NULL;
3729 }
3730
3731 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
3732}
3733
3734drmp3_int16* drmp3_open_and_read_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3735{
3736 drmp3 mp3;
3737 if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig)) {
3738 return NULL;
3739 }
3740
3741 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
3742}
3743
3744
3745float* drmp3_open_memory_and_read_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3746{
3747 drmp3 mp3;
3748 if (!drmp3_init_memory(&mp3, pData, dataSize, pConfig)) {
3749 return NULL;
3750 }
3751
3752 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
3753}
3754
3755drmp3_int16* drmp3_open_memory_and_read_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3756{
3757 drmp3 mp3;
3758 if (!drmp3_init_memory(&mp3, pData, dataSize, pConfig)) {
3759 return NULL;
3760 }
3761
3762 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
3763}
3764
3765
3766#ifndef DR_MP3_NO_STDIO
3767float* drmp3_open_file_and_read_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3768{
3769 drmp3 mp3;
3770 if (!drmp3_init_file(&mp3, filePath, pConfig)) {
3771 return NULL;
3772 }
3773
3774 return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
3775}
3776
3777drmp3_int16* drmp3_open_file_and_read_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
3778{
3779 drmp3 mp3;
3780 if (!drmp3_init_file(&mp3, filePath, pConfig)) {
3781 return NULL;
3782 }
3783
3784 return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
3785}
3786#endif
3787
3788void drmp3_free(void* p)
3789{
3790 DRMP3_FREE(p);
3791}
3792
3793#endif /*DR_MP3_IMPLEMENTATION*/
3794
3795/*
3796DIFFERENCES BETWEEN minimp3 AND dr_mp3
3797======================================
3798- First, keep in mind that minimp3 (https://github.com/lieff/minimp3) is where all the real work was done. All of the
3799 code relating to the actual decoding remains mostly unmodified, apart from some namespacing changes.
3800- dr_mp3 adds a pulling style API which allows you to deliver raw data via callbacks. So, rather than pushing data
3801 to the decoder, the decoder _pulls_ data from your callbacks.
3802- In addition to callbacks, a decoder can be initialized from a block of memory and a file.
3803- The dr_mp3 pull API reads PCM frames rather than whole MP3 frames.
3804- dr_mp3 adds convenience APIs for opening and decoding entire files in one go.
3805- dr_mp3 is fully namespaced, including the implementation section, which is more suitable when compiling projects
3806 as a single translation unit (aka unity builds). At the time of writing this, a unity build is not possible when
3807 using minimp3 in conjunction with stb_vorbis. dr_mp3 addresses this.
3808*/
3809
3810/*
3811REVISION HISTORY
3812================
3813v0.4.7 - 2019-07-28
3814 - Fix a compiler error.
3815
3816v0.4.6 - 2019-06-14
3817 - Fix a compiler error.
3818
3819v0.4.5 - 2019-06-06
3820 - Bring up to date with minimp3.
3821
3822v0.4.4 - 2019-05-06
3823 - Fixes to the VC6 build.
3824
3825v0.4.3 - 2019-05-05
3826 - Use the channel count and/or sample rate of the first MP3 frame instead of DR_MP3_DEFAULT_CHANNELS and
3827 DR_MP3_DEFAULT_SAMPLE_RATE when they are set to 0. To use the old behaviour, just set the relevant property to
3828 DR_MP3_DEFAULT_CHANNELS or DR_MP3_DEFAULT_SAMPLE_RATE.
3829 - Add s16 reading APIs
3830 - drmp3_read_pcm_frames_s16
3831 - drmp3_open_memory_and_read_s16
3832 - drmp3_open_and_read_s16
3833 - drmp3_open_file_and_read_s16
3834 - Add drmp3_get_mp3_and_pcm_frame_count() to the public header section.
3835 - Add support for C89.
3836 - Change license to choice of public domain or MIT-0.
3837
3838v0.4.2 - 2019-02-21
3839 - Fix a warning.
3840
3841v0.4.1 - 2018-12-30
3842 - Fix a warning.
3843
3844v0.4.0 - 2018-12-16
3845 - API CHANGE: Rename some APIs:
3846 - drmp3_read_f32 -> to drmp3_read_pcm_frames_f32
3847 - drmp3_seek_to_frame -> drmp3_seek_to_pcm_frame
3848 - drmp3_open_and_decode_f32 -> drmp3_open_and_read_f32
3849 - drmp3_open_and_decode_memory_f32 -> drmp3_open_memory_and_read_f32
3850 - drmp3_open_and_decode_file_f32 -> drmp3_open_file_and_read_f32
3851 - Add drmp3_get_pcm_frame_count().
3852 - Add drmp3_get_mp3_frame_count().
3853 - Improve seeking performance.
3854
3855v0.3.2 - 2018-09-11
3856 - Fix a couple of memory leaks.
3857 - Bring up to date with minimp3.
3858
3859v0.3.1 - 2018-08-25
3860 - Fix C++ build.
3861
3862v0.3.0 - 2018-08-25
3863 - Bring up to date with minimp3. This has a minor API change: the "pcm" parameter of drmp3dec_decode_frame() has
3864 been changed from short* to void* because it can now output both s16 and f32 samples, depending on whether or
3865 not the DR_MP3_FLOAT_OUTPUT option is set.
3866
3867v0.2.11 - 2018-08-08
3868 - Fix a bug where the last part of a file is not read.
3869
3870v0.2.10 - 2018-08-07
3871 - Improve 64-bit detection.
3872
3873v0.2.9 - 2018-08-05
3874 - Fix C++ build on older versions of GCC.
3875 - Bring up to date with minimp3.
3876
3877v0.2.8 - 2018-08-02
3878 - Fix compilation errors with older versions of GCC.
3879
3880v0.2.7 - 2018-07-13
3881 - Bring up to date with minimp3.
3882
3883v0.2.6 - 2018-07-12
3884 - Bring up to date with minimp3.
3885
3886v0.2.5 - 2018-06-22
3887 - Bring up to date with minimp3.
3888
3889v0.2.4 - 2018-05-12
3890 - Bring up to date with minimp3.
3891
3892v0.2.3 - 2018-04-29
3893 - Fix TCC build.
3894
3895v0.2.2 - 2018-04-28
3896 - Fix bug when opening a decoder from memory.
3897
3898v0.2.1 - 2018-04-27
3899 - Efficiency improvements when the decoder reaches the end of the stream.
3900
3901v0.2 - 2018-04-21
3902 - Bring up to date with minimp3.
3903 - Start using major.minor.revision versioning.
3904
3905v0.1d - 2018-03-30
3906 - Bring up to date with minimp3.
3907
3908v0.1c - 2018-03-11
3909 - Fix C++ build error.
3910
3911v0.1b - 2018-03-07
3912 - Bring up to date with minimp3.
3913
3914v0.1a - 2018-02-28
3915 - Fix compilation error on GCC/Clang.
3916 - Fix some warnings.
3917
3918v0.1 - 2018-02-xx
3919 - Initial versioned release.
3920*/
3921
3922/*
3923This software is available as a choice of the following licenses. Choose
3924whichever you prefer.
3925
3926===============================================================================
3927ALTERNATIVE 1 - Public Domain (www.unlicense.org)
3928===============================================================================
3929This is free and unencumbered software released into the public domain.
3930
3931Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
3932software, either in source code form or as a compiled binary, for any purpose,
3933commercial or non-commercial, and by any means.
3934
3935In jurisdictions that recognize copyright laws, the author or authors of this
3936software dedicate any and all copyright interest in the software to the public
3937domain. We make this dedication for the benefit of the public at large and to
3938the detriment of our heirs and successors. We intend this dedication to be an
3939overt act of relinquishment in perpetuity of all present and future rights to
3940this software under copyright law.
3941
3942THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3943IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3944FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3945AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
3946ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
3947WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3948
3949For more information, please refer to <http://unlicense.org/>
3950
3951===============================================================================
3952ALTERNATIVE 2 - MIT No Attribution
3953===============================================================================
3954Copyright 2018 David Reid
3955
3956Permission is hereby granted, free of charge, to any person obtaining a copy of
3957this software and associated documentation files (the "Software"), to deal in
3958the Software without restriction, including without limitation the rights to
3959use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
3960of the Software, and to permit persons to whom the Software is furnished to do
3961so.
3962
3963THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3964IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3965FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3966AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3967LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
3968OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3969SOFTWARE.
3970*/
3971
3972/*
3973 https://github.com/lieff/minimp3
3974 To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide.
3975 This software is distributed without any warranty.
3976 See <http://creativecommons.org/publicdomain/zero/1.0/>.
3977*/
3978