1 | /* |
2 | MP3 audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file. |
3 | dr_mp3 - v0.4.7 - 2019-07-28 |
4 | |
5 | David Reid - mackron@gmail.com |
6 | |
7 | Based off minimp3 (https://github.com/lieff/minimp3) which is where the real work was done. See the bottom of this file for |
8 | differences between minimp3 and dr_mp3. |
9 | */ |
10 | |
11 | /* |
12 | USAGE |
13 | ===== |
14 | dr_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 | |
18 | You can then #include this file in other parts of the program as you would with any other header file. To decode audio data, |
19 | do 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 | |
30 | The 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 | |
35 | The third parameter of drmp3_init_file() in the example above allows you to control the output channel count and sample rate. It |
36 | is 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 | |
38 | The example above initializes a decoder from a file, but you can also initialize it from a block of memory and read and seek |
39 | callbacks with drmp3_init_memory() and drmp3_init() respectively. |
40 | |
41 | You do not need to do any annoying memory management when reading PCM frames - this is all managed internally. You can request |
42 | any 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 |
43 | requested amount. |
44 | |
45 | You can also decode an entire file in one go with drmp3_open_and_read_f32(), drmp3_open_memory_and_read_f32() and |
46 | drmp3_open_file_and_read_f32(). |
47 | |
48 | |
49 | OPTIONS |
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 |
64 | extern "C" { |
65 | #endif |
66 | |
67 | #include <stddef.h> |
68 | |
69 | #if defined(_MSC_VER) && _MSC_VER < 1600 |
70 | typedef signed char drmp3_int8; |
71 | typedef unsigned char drmp3_uint8; |
72 | typedef signed short drmp3_int16; |
73 | typedef unsigned short drmp3_uint16; |
74 | typedef signed int drmp3_int32; |
75 | typedef unsigned int drmp3_uint32; |
76 | typedef signed __int64 drmp3_int64; |
77 | typedef unsigned __int64 drmp3_uint64; |
78 | #else |
79 | #include <stdint.h> |
80 | typedef int8_t drmp3_int8; |
81 | typedef uint8_t drmp3_uint8; |
82 | typedef int16_t drmp3_int16; |
83 | typedef uint16_t drmp3_uint16; |
84 | typedef int32_t drmp3_int32; |
85 | typedef uint32_t drmp3_uint32; |
86 | typedef int64_t drmp3_int64; |
87 | typedef uint64_t drmp3_uint64; |
88 | #endif |
89 | typedef drmp3_uint8 drmp3_bool8; |
90 | typedef 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 | /* |
108 | Low Level Push API |
109 | ================== |
110 | */ |
111 | typedef struct |
112 | { |
113 | int frame_bytes, channels, hz, layer, bitrate_kbps; |
114 | } drmp3dec_frame_info; |
115 | |
116 | typedef struct |
117 | { |
118 | float mdct_overlap[2][9*32], qmf_state[15*2*32]; |
119 | int reserv, free_format_bytes; |
120 | unsigned char [4], reserv_buf[511]; |
121 | } drmp3dec; |
122 | |
123 | /* Initializes a low level decoder. */ |
124 | void drmp3dec_init(drmp3dec *dec); |
125 | |
126 | /* Reads a frame from a low level decoder. */ |
127 | int 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. */ |
130 | void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, int num_samples); |
131 | |
132 | |
133 | |
134 | /* |
135 | Main 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 | |
145 | typedef struct drmp3_src drmp3_src; |
146 | typedef 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 | |
148 | typedef 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 |
155 | typedef 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 | |
163 | typedef 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 | |
172 | struct 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 | |
190 | typedef enum |
191 | { |
192 | drmp3_seek_origin_start, |
193 | drmp3_seek_origin_current |
194 | } drmp3_seek_origin; |
195 | |
196 | typedef 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 | /* |
205 | Callback for when data is read. Return value is the number of bytes actually read. |
206 | |
207 | pUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family. |
208 | pBufferOut [out] The output buffer. |
209 | bytesToRead [in] The number of bytes to read. |
210 | |
211 | Returns the number of bytes actually read. |
212 | |
213 | A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until |
214 | either the entire bytesToRead is filled or you have reached the end of the stream. |
215 | */ |
216 | typedef size_t (* drmp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); |
217 | |
218 | /* |
219 | Callback for when data needs to be seeked. |
220 | |
221 | pUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family. |
222 | offset [in] The number of bytes to move, relative to the origin. Will never be negative. |
223 | origin [in] The origin of the seek - the current position or the start of the stream. |
224 | |
225 | Returns whether or not the seek was successful. |
226 | |
227 | Whether or not it is relative to the beginning or current position is determined by the "origin" parameter which |
228 | will be either drmp3_seek_origin_start or drmp3_seek_origin_current. |
229 | */ |
230 | typedef drmp3_bool32 (* drmp3_seek_proc)(void* pUserData, int offset, drmp3_seek_origin origin); |
231 | |
232 | typedef struct |
233 | { |
234 | drmp3_uint32 outputChannels; |
235 | drmp3_uint32 outputSampleRate; |
236 | } drmp3_config; |
237 | |
238 | typedef 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 | /* |
270 | Initializes an MP3 decoder. |
271 | |
272 | onRead [in] The function to call when data needs to be read from the client. |
273 | onSeek [in] The function to call when the read position of the client data needs to move. |
274 | pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek. |
275 | |
276 | Returns true if successful; false otherwise. |
277 | |
278 | Close the loader with drmp3_uninit(). |
279 | |
280 | See also: drmp3_init_file(), drmp3_init_memory(), drmp3_uninit() |
281 | */ |
282 | drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig); |
283 | |
284 | /* |
285 | Initializes an MP3 decoder from a block of memory. |
286 | |
287 | This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for |
288 | the lifetime of the drmp3 object. |
289 | |
290 | The buffer should contain the contents of the entire MP3 file. |
291 | */ |
292 | drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_config* pConfig); |
293 | |
294 | #ifndef DR_MP3_NO_STDIO |
295 | /* |
296 | Initializes an MP3 decoder from a file. |
297 | |
298 | This holds the internal FILE object until drmp3_uninit() is called. Keep this in mind if you're caching drmp3 |
299 | objects because the operating system may restrict the number of file handles an application can have open at |
300 | any given time. |
301 | */ |
302 | drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* filePath, const drmp3_config* pConfig); |
303 | #endif |
304 | |
305 | /* |
306 | Uninitializes an MP3 decoder. |
307 | */ |
308 | void drmp3_uninit(drmp3* pMP3); |
309 | |
310 | /* |
311 | Reads PCM frames as interleaved 32-bit IEEE floating point PCM. |
312 | |
313 | Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames. |
314 | */ |
315 | drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut); |
316 | |
317 | /* |
318 | Reads PCM frames as interleaved signed 16-bit integer PCM. |
319 | |
320 | Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames. |
321 | */ |
322 | drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut); |
323 | |
324 | /* |
325 | Seeks to a specific frame. |
326 | |
327 | Note that this is _not_ an MP3 frame, but rather a PCM frame. |
328 | */ |
329 | drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex); |
330 | |
331 | /* |
332 | Calculates the total number of PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet |
333 | radio. Runs in linear time. Returns 0 on error. |
334 | */ |
335 | drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3); |
336 | |
337 | /* |
338 | Calculates the total number of MP3 frames in the MP3 stream. Cannot be used for infinite streams such as internet |
339 | radio. Runs in linear time. Returns 0 on error. |
340 | */ |
341 | drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3); |
342 | |
343 | /* |
344 | Calculates the total number of MP3 and PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet |
345 | radio. Runs in linear time. Returns 0 on error. |
346 | |
347 | This is equivalent to calling drmp3_get_mp3_frame_count() and drmp3_get_pcm_frame_count() except that it's more efficient. |
348 | */ |
349 | drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount); |
350 | |
351 | /* |
352 | Calculates the seekpoints based on PCM frames. This is slow. |
353 | |
354 | pSeekpoint count is a pointer to a uint32 containing the seekpoint count. On input it contains the desired count. |
355 | On output it contains the actual count. The reason for this design is that the client may request too many |
356 | seekpoints, in which case dr_mp3 will return a corrected count. |
357 | |
358 | Note that seektable seeking is not quite sample exact when the MP3 stream contains inconsistent sample rates. |
359 | */ |
360 | drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints); |
361 | |
362 | /* |
363 | Binds a seek table to the decoder. |
364 | |
365 | This does _not_ make a copy of pSeekPoints - it only references it. It is up to the application to ensure this |
366 | remains valid while it is bound to the decoder. |
367 | |
368 | Use drmp3_calculate_seek_points() to calculate the seek points. |
369 | */ |
370 | drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints); |
371 | |
372 | |
373 | /* |
374 | Opens an decodes an entire MP3 stream as a single operation. |
375 | |
376 | pConfig is both an input and output. On input it contains what you want. On output it contains what you got. |
377 | |
378 | Free the returned pointer with drmp3_free(). |
379 | */ |
380 | float* drmp3_open_and_read_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); |
381 | drmp3_int16* drmp3_open_and_read_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); |
382 | |
383 | float* drmp3_open_memory_and_read_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); |
384 | drmp3_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 |
387 | float* drmp3_open_file_and_read_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); |
388 | drmp3_int16* drmp3_open_file_and_read_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); |
389 | #endif |
390 | |
391 | /* |
392 | Frees any memory that was allocated by a public drmp3 API. |
393 | */ |
394 | void 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)) |
483 | typedef __m128 drmp3_f4; |
484 | #if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD) |
485 | #define drmp3_cpuid __cpuid |
486 | #else |
487 | static __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 |
511 | static 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 | |
533 | end: |
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))) |
550 | typedef float32x4_t drmp3_f4; |
551 | static 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 | |
568 | typedef struct |
569 | { |
570 | const drmp3_uint8 *buf; |
571 | int pos, limit; |
572 | } drmp3_bs; |
573 | |
574 | typedef struct |
575 | { |
576 | float scf[3*64]; |
577 | drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64]; |
578 | } drmp3_L12_scale_info; |
579 | |
580 | typedef struct |
581 | { |
582 | drmp3_uint8 tab_offset, code_tab_width, band_count; |
583 | } drmp3_L12_subband_alloc; |
584 | |
585 | typedef 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 | |
594 | typedef 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 | |
603 | static 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 | |
610 | static 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 | |
626 | static 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 | |
635 | static 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 | |
643 | static 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 | |
652 | static 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 | |
658 | static 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 | |
663 | static 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 | |
673 | static 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 |
679 | static 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 | |
724 | static 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 | |
748 | static 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 | |
796 | static 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 | |
831 | static 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 | |
846 | static 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 | |
971 | static 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 | |
1004 | static 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 | |
1016 | static void drmp3_L3_decode_scalefactors(const drmp3_uint8 *hdr, drmp3_uint8 *ist_pos, drmp3_bs *bs, const drmp3_L3_gr_info *gr, float *scf, int ch) |
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 | |
1078 | static const float g_drmp3_pow43[129 + 16] = { |
1079 | 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, |
1080 | 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f |
1081 | }; |
1082 | |
1083 | static 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 | |
1104 | static 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 | |
1241 | static 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 | |
1263 | static 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 | |
1273 | static 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 | |
1293 | static 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 | |
1327 | static 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 | |
1347 | static 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 | |
1364 | static 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 | |
1399 | static 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 | |
1439 | static 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 | |
1496 | static 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 | |
1505 | static 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 | |
1525 | static 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 | |
1538 | static 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 | |
1546 | static 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 | |
1564 | static 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 | |
1580 | static 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 | |
1590 | static 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 | |
1626 | static 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 |
1782 | typedef drmp3_int16 drmp3d_sample_t; |
1783 | |
1784 | static 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 |
1794 | typedef float drmp3d_sample_t; |
1795 | |
1796 | static float drmp3d_scale_pcm(float sample) |
1797 | { |
1798 | return sample*(1.f/32768.f); |
1799 | } |
1800 | #endif |
1801 | |
1802 | static 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 | |
1827 | static 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 | |
1978 | static 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 | |
2006 | static 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 | |
2020 | static 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 | |
2058 | void drmp3dec_init(drmp3dec *dec) |
2059 | { |
2060 | dec->header[0] = 0; |
2061 | } |
2062 | |
2063 | int 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 | |
2158 | void 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 | |
2276 | static DRMP3_INLINE float drmp3_mix_f32(float x, float y, float a) |
2277 | { |
2278 | return x*(1-a) + y*a; |
2279 | } |
2280 | |
2281 | static 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 | |
2289 | void 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 | |
2299 | drmp3_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 | |
2356 | drmp3_uint64 drmp3_src_read_frames_passthrough(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush); |
2357 | drmp3_uint64 drmp3_src_read_frames_linear(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush); |
2358 | |
2359 | drmp3_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 | |
2387 | drmp3_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 | |
2402 | drmp3_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 | |
2417 | drmp3_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 | |
2441 | drmp3_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 | |
2446 | drmp3_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 | |
2456 | drmp3_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 | |
2543 | static 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 | |
2550 | static 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 | |
2567 | static 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 | |
2597 | static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames, drmp3_bool32 discard); |
2598 | static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3); |
2599 | |
2600 | static 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 | |
2686 | static 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 | |
2702 | static 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 | |
2813 | static 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 |
2820 | static 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 | |
2840 | drmp3_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 | |
2887 | drmp3_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 | |
2898 | static 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 | |
2919 | static 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 | |
2949 | drmp3_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 | |
2972 | static size_t drmp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead) |
2973 | { |
2974 | return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData); |
2975 | } |
2976 | |
2977 | static 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 | |
2982 | drmp3_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 | |
3000 | void 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 | |
3015 | drmp3_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 | |
3048 | drmp3_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 | |
3083 | void 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 | |
3104 | drmp3_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 | |
3119 | float 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 | |
3124 | float 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 | /* |
3132 | NOTE ON SEEKING |
3133 | =============== |
3134 | The seeking code below is a complete mess and is broken for cases when the sample rate changes. The problem |
3135 | is with the resampling and the crappy resampler used by dr_mp3. What needs to happen is the following: |
3136 | |
3137 | 1) The resampler needs to be replaced. |
3138 | 2) 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 | */ |
3142 | drmp3_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 | |
3190 | drmp3_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 | |
3213 | drmp3_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 | |
3237 | drmp3_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 | |
3306 | drmp3_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 | |
3324 | drmp3_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 | |
3396 | drmp3_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 | |
3406 | drmp3_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 | |
3416 | void 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 | |
3431 | typedef struct |
3432 | { |
3433 | drmp3_uint64 bytePos; |
3434 | drmp3_uint64 pcmFrameIndex; /* <-- After sample rate conversion. */ |
3435 | } drmp3__seeking_mp3_frame_info; |
3436 | |
3437 | drmp3_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 | |
3577 | drmp3_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 | |
3597 | float* 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 | |
3660 | drmp3_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 | |
3724 | float* 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 | |
3734 | drmp3_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 | |
3745 | float* 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 | |
3755 | drmp3_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 |
3767 | float* 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 | |
3777 | drmp3_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 | |
3788 | void drmp3_free(void* p) |
3789 | { |
3790 | DRMP3_FREE(p); |
3791 | } |
3792 | |
3793 | #endif /*DR_MP3_IMPLEMENTATION*/ |
3794 | |
3795 | /* |
3796 | DIFFERENCES 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 | /* |
3811 | REVISION HISTORY |
3812 | ================ |
3813 | v0.4.7 - 2019-07-28 |
3814 | - Fix a compiler error. |
3815 | |
3816 | v0.4.6 - 2019-06-14 |
3817 | - Fix a compiler error. |
3818 | |
3819 | v0.4.5 - 2019-06-06 |
3820 | - Bring up to date with minimp3. |
3821 | |
3822 | v0.4.4 - 2019-05-06 |
3823 | - Fixes to the VC6 build. |
3824 | |
3825 | v0.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 | |
3838 | v0.4.2 - 2019-02-21 |
3839 | - Fix a warning. |
3840 | |
3841 | v0.4.1 - 2018-12-30 |
3842 | - Fix a warning. |
3843 | |
3844 | v0.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 | |
3855 | v0.3.2 - 2018-09-11 |
3856 | - Fix a couple of memory leaks. |
3857 | - Bring up to date with minimp3. |
3858 | |
3859 | v0.3.1 - 2018-08-25 |
3860 | - Fix C++ build. |
3861 | |
3862 | v0.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 | |
3867 | v0.2.11 - 2018-08-08 |
3868 | - Fix a bug where the last part of a file is not read. |
3869 | |
3870 | v0.2.10 - 2018-08-07 |
3871 | - Improve 64-bit detection. |
3872 | |
3873 | v0.2.9 - 2018-08-05 |
3874 | - Fix C++ build on older versions of GCC. |
3875 | - Bring up to date with minimp3. |
3876 | |
3877 | v0.2.8 - 2018-08-02 |
3878 | - Fix compilation errors with older versions of GCC. |
3879 | |
3880 | v0.2.7 - 2018-07-13 |
3881 | - Bring up to date with minimp3. |
3882 | |
3883 | v0.2.6 - 2018-07-12 |
3884 | - Bring up to date with minimp3. |
3885 | |
3886 | v0.2.5 - 2018-06-22 |
3887 | - Bring up to date with minimp3. |
3888 | |
3889 | v0.2.4 - 2018-05-12 |
3890 | - Bring up to date with minimp3. |
3891 | |
3892 | v0.2.3 - 2018-04-29 |
3893 | - Fix TCC build. |
3894 | |
3895 | v0.2.2 - 2018-04-28 |
3896 | - Fix bug when opening a decoder from memory. |
3897 | |
3898 | v0.2.1 - 2018-04-27 |
3899 | - Efficiency improvements when the decoder reaches the end of the stream. |
3900 | |
3901 | v0.2 - 2018-04-21 |
3902 | - Bring up to date with minimp3. |
3903 | - Start using major.minor.revision versioning. |
3904 | |
3905 | v0.1d - 2018-03-30 |
3906 | - Bring up to date with minimp3. |
3907 | |
3908 | v0.1c - 2018-03-11 |
3909 | - Fix C++ build error. |
3910 | |
3911 | v0.1b - 2018-03-07 |
3912 | - Bring up to date with minimp3. |
3913 | |
3914 | v0.1a - 2018-02-28 |
3915 | - Fix compilation error on GCC/Clang. |
3916 | - Fix some warnings. |
3917 | |
3918 | v0.1 - 2018-02-xx |
3919 | - Initial versioned release. |
3920 | */ |
3921 | |
3922 | /* |
3923 | This software is available as a choice of the following licenses. Choose |
3924 | whichever you prefer. |
3925 | |
3926 | =============================================================================== |
3927 | ALTERNATIVE 1 - Public Domain (www.unlicense.org) |
3928 | =============================================================================== |
3929 | This is free and unencumbered software released into the public domain. |
3930 | |
3931 | Anyone is free to copy, modify, publish, use, compile, sell, or distribute this |
3932 | software, either in source code form or as a compiled binary, for any purpose, |
3933 | commercial or non-commercial, and by any means. |
3934 | |
3935 | In jurisdictions that recognize copyright laws, the author or authors of this |
3936 | software dedicate any and all copyright interest in the software to the public |
3937 | domain. We make this dedication for the benefit of the public at large and to |
3938 | the detriment of our heirs and successors. We intend this dedication to be an |
3939 | overt act of relinquishment in perpetuity of all present and future rights to |
3940 | this software under copyright law. |
3941 | |
3942 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
3943 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
3944 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
3945 | AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
3946 | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
3947 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
3948 | |
3949 | For more information, please refer to <http://unlicense.org/> |
3950 | |
3951 | =============================================================================== |
3952 | ALTERNATIVE 2 - MIT No Attribution |
3953 | =============================================================================== |
3954 | Copyright 2018 David Reid |
3955 | |
3956 | Permission is hereby granted, free of charge, to any person obtaining a copy of |
3957 | this software and associated documentation files (the "Software"), to deal in |
3958 | the Software without restriction, including without limitation the rights to |
3959 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
3960 | of the Software, and to permit persons to whom the Software is furnished to do |
3961 | so. |
3962 | |
3963 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
3964 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
3965 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
3966 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
3967 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
3968 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
3969 | SOFTWARE. |
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 | |