2 * MPEG Audio Layer III decoder
3 * Copyright (c) 2001, 2002 Fabrice Bellard,
4 * (c) 2007 Martin J. Fiedler
6 * D conversion by Ketmar // Invisible Vector
8 * This file is a stripped-down version of the MPEG Audio decoder from
9 * the FFmpeg libavcodec library.
11 * FFmpeg and minimp3 are free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * FFmpeg and minimp3 are distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 module iv
.minimp3
/*is aliced*/;
29 auto fi = File(args[1]);
31 auto reader = delegate (void[] buf) {
32 auto rd = fi.rawRead(buf[]);
33 return cast(int)rd.length;
36 auto mp3 = new MP3Decoder(reader);
39 writeln("invalid MP3 file!");
43 writeln("sample rate: ", mp3.sampleRate);
44 writeln("channels : ", mp3.channels);
46 auto fo = File("z00.raw", "w");
48 fo.rawWrite(mp3.frameSamples);
49 mp3.decodeNextFrame(reader);
54 /* determining mp3 duration with scanning:
55 auto fi = File(args.length > 1 ? args[1] : FileName);
57 auto info = mp3Scan((void[] buf) {
58 auto rd = fi.rawRead(buf[]);
59 return cast(uint)rd.length;
63 writeln("invalid MP3 file!");
65 writeln("sample rate: ", info.sampleRate);
66 writeln("channels : ", info.channels);
67 writeln("samples : ", info.samples);
68 auto seconds = info.samples/info.sampleRate;
69 writefln("time: %2s:%02s", seconds/60, seconds%60);
74 // ////////////////////////////////////////////////////////////////////////// //
75 alias MP3Decoder
= MP3DecoderImpl
!true;
76 alias MP3DecoderNoGC
= MP3DecoderImpl
!false;
79 // ////////////////////////////////////////////////////////////////////////// //
87 @property bool valid () const pure nothrow @safe @nogc { return (sampleRate != 0); }
91 MP3Info mp3Scan(RDG) (scope RDG rdg) if (is(typeof({
98 enum inbufsize = cast(uint)inbuf.length;
99 uint inbufpos, inbufused;
100 mp3_context_t* s = cast(mp3_context_t*)libc_calloc(mp3_context_t.sizeof, 1);
101 if (s is null) return info;
102 scope(exit) libc_free(s);
106 void readMoreData () {
107 if (inbufused-inbufpos < 1441) {
108 import core.stdc.string : memmove;
109 auto left = inbufused-inbufpos;
110 if (inbufpos > 0) memmove(inbuf.ptr, inbuf.ptr+inbufpos, left);
114 left = inbufsize-inbufused;
115 int rd = rdg(inbuf[inbufused..inbufused+left]);
127 if (eofhit && inbufused-inbufpos < 1024) break;
128 auto left = inbufused-inbufpos;
134 if (inbuf.ptr[0] == 'I' && inbuf.ptr[1] == 'D' && inbuf.ptr[2] == '3' && inbuf.ptr[3] != 0xff && inbuf.ptr[4] != 0xff &&
135 ((inbuf.ptr[6]|inbuf.ptr[7]|inbuf.ptr[8]|inbuf.ptr[9])&0x80) == 0) { // see ID3v2 specs
137 uint sz = (inbuf.ptr[9]|(inbuf.ptr[8]<<7)|(inbuf.ptr[7]<<14)|(inbuf.ptr[6]<<21))+10;
138 // skip `sz` bytes, it's a tag
139 while (sz > 0 && !eofhit) {
141 left = inbufused-inbufpos;
142 if (left > sz) left = sz;
151 if (inbuf.ptr[0] == 'T' && inbuf.ptr[1] == 'A' && inbuf.ptr[2] == 'G') {
152 // this may be ID3v1, just skip 128 bytes
154 while (sz > 0 && !eofhit) {
156 left = inbufused-inbufpos;
157 if (left > sz) left = sz;
165 int res = mp3_skip_frame(s, inbuf.ptr+inbufpos, left);
167 // can't decode frame
168 if (inbufused-inbufpos < 1024) inbufpos = inbufused; else inbufpos += 1024;
170 if (headersCount < 6) ++headersCount;
172 if (s.sample_rate < 1024 || s.sample_rate > 96000) break;
173 if (s.nb_channels < 1 || s.nb_channels > 2) break;
174 info.sampleRate = s.sample_rate;
175 info.channels = cast(ubyte)s.nb_channels;
177 info.samples += s.sample_count;
181 //{ import core.stdc.stdio : printf; printf("%d\n", headersCount); }
182 if (headersCount < 6) info = info.init;
188 // ////////////////////////////////////////////////////////////////////////// //
189 final class MP3DecoderImpl(bool allowGC
) {
191 enum MaxSamplesPerFrame
= 1152*2;
193 // read bytes into the buffer, return number of bytes read or 0 for EOF, -1 on error
194 // will never be called with empty buffer, or buffer more than 128KB
195 static if (allowGC
) {
196 alias ReadBufFn
= int delegate (void[] buf
);
198 alias ReadBufFn
= int delegate (void[] buf
) nothrow @nogc;
202 static struct mp3_info_t
{
205 int audio_bytes
; // generated amount of audio per frame
212 uint inbufsize
; // will allocate enough bytes for one frame
213 uint inbufpos
, inbufused
;
215 short[MaxSamplesPerFrame
] samples
;
216 uint scanLeft
= 256*1024+16; // how much bytes we should scan (max ID3 size is 256KB)
218 static if (allowGC
) mixin(ObjectCodeMixin
); else mixin("nothrow @nogc: "~ObjectCodeMixin
);
221 private enum ObjectCodeMixin
= q
{
223 uint ensureBytes (scope ReadBufFn readBuf
, uint size
) {
224 import core
.stdc
.string
: memmove
;
226 assert(inbufused
>= inbufpos
);
227 uint left
= inbufused
-inbufpos
;
228 if (left
>= size
) return size
;
229 if (eofhit
) return left
;
231 if (inbufpos
> 0) memmove(inbuf
, inbuf
+inbufpos
, left
);
237 //{ import std.conv : to; assert(size > inbufused, "size="~to!string(size)~"; inbufpos="~to!string(inbufpos)~"; inbufused="~to!string(inbufused)~"; inbufsize="~to!string(inbufsize)); }
238 assert(size
> inbufused
);
239 left
= size
-inbufused
;
241 if (inbufsize
< inbufused
+left
) {
242 auto np
= libc_realloc(inbuf
, inbufused
+left
);
243 if (np
is null) assert(0, "out of memory"); //FIXME
244 inbufsize
= inbufused
+left
;
245 inbuf
= cast(ubyte*)np
;
247 auto rd
= readBuf(inbuf
[inbufused
..inbufused
+left
]);
248 if (rd
> left
) assert(0, "mp3 reader returned too many bytes");
249 if (rd
<= 0) eofhit
= true; else inbufused
+= rd
;
253 void removeBytes (uint size
) {
254 if (size
== 0) return;
255 if (size
> inbufused
-inbufpos
) {
256 //assert(0, "the thing that should not be");
257 // we will come here when we are scanning for MP3 frame and no more bytes left
259 inbufpos
= inbufused
;
271 bool decodeOneFrame (scope ReadBufFn readBuf
, bool first
=false) {
273 if (!eofhit
&& inbufused
-inbufpos
< 1441) ensureBytes(readBuf
, 64*1024);
278 skipTagCheck
= false;
279 if (inbufused
-inbufpos
>= 10) {
281 if (inbuf
[inbufpos
+0] == 'I' && inbuf
[inbufpos
+1] == 'D' && inbuf
[inbufpos
+2] == '3' && inbuf
[inbufpos
+3] != 0xff && inbuf
[inbufpos
+4] != 0xff &&
282 ((inbuf
[inbufpos
+6]|inbuf
[inbufpos
+7]|inbuf
[inbufpos
+8]|inbuf
[inbufpos
+9])&0x80) == 0) { // see ID3v2 specs
284 uint sz
= (inbuf
[inbufpos
+9]|
(inbuf
[inbufpos
+8]<<7)|
(inbuf
[inbufpos
+7]<<14)|
(inbuf
[inbufpos
+6]<<21))+10;
285 // skip `sz` bytes, it's a tag
286 while (sz
> 0 && !eofhit
) {
287 ensureBytes(readBuf
, 64*1024);
288 auto left
= inbufused
-inbufpos
;
289 if (left
> sz
) left
= sz
;
293 if (eofhit
) { curFrameIsOk
= false; return false; }
298 if (inbuf
[inbufpos
+0] == 'T' && inbuf
[inbufpos
+1] == 'A' && inbuf
[inbufpos
+2] == 'G') {
299 // this may be ID3v1, just skip 128 bytes
301 while (sz
> 0 && !eofhit
) {
302 ensureBytes(readBuf
, 64*1024);
303 auto left
= inbufused
-inbufpos
;
304 if (left
> sz
) left
= sz
;
308 if (eofhit
) { curFrameIsOk
= false; return false; }
313 mp3_context_t
* s
= cast(mp3_context_t
*)dec;
314 res
= mp3_decode_frame(s
, /*cast(int16_t*)out_*/samples
.ptr
, &size
, inbuf
+inbufpos
, /*bytes*/inbufused
-inbufpos
);
316 // can't decode frame
317 if (scanLeft
>= 1024) {
322 curFrameIsOk
= false;
325 info
.audio_bytes
= size
;
327 info
.sample_rate
= s
.sample_rate
;
328 info
.channels
= s
.nb_channels
;
329 if ((info
.sample_rate
< 1024 || info
.sample_rate
> 96000) ||
330 (info
.channels
< 1 || info
.channels
> 2) ||
331 (info
.audio_bytes
< 2 || info
.audio_bytes
> MaxSamplesPerFrame
*2 || info
.audio_bytes
%2 != 0))
333 curFrameIsOk
= false;
338 if ((s
.sample_rate
< 1024 || s
.sample_rate
> 96000) ||
339 (s
.nb_channels
< 1 || s
.nb_channels
> 2) ||
340 (size
< 2 || size
> MaxSamplesPerFrame
*2 || size
%2 != 0))
342 curFrameIsOk
= false;
348 scanLeft
= 256*1024+16;
349 removeBytes(s
.frame_size
);
350 return /*s.frame_size*/true;
352 if (scanLeft
>= 1024) {
362 this (scope ReadBufFn reader
) {
363 static if (allowGC
) {
364 if (reader
is null) throw new Exception("reader is null");
366 if (reader
is null) assert(0, "reader is null");
369 dec = libc_calloc(mp3_context_t
.sizeof
, 1);
370 if (dec is null) assert(0, "out of memory"); // no, really! ;-)
371 //mp3_decode_init(cast(mp3_context_t*)dec);
372 if (!decodeOneFrame(reader
, true)) close();
375 ~this () { close(); }
378 if (dec !is null) { libc_free(dec); dec = null; }
379 if (inbuf
!is null) { libc_free(inbuf
); inbuf
= null; }
380 info
.audio_bytes
= 0;
384 void restart (scope ReadBufFn reader
) {
385 inbufpos
= inbufused
= 0;
387 info
.audio_bytes
= 0;
388 scanLeft
= 256*1024+16;
389 skipTagCheck
= false;
390 if (!decodeOneFrame(reader
, true)) close();
393 // empty read buffers and decode next frame; should be used to sync after seeking in input stream
394 void sync (scope ReadBufFn reader
) {
395 inbufpos
= inbufused
= 0;
397 info
.audio_bytes
= 0;
398 scanLeft
= 256*1024+16;
399 skipTagCheck
= false;
400 if (!decodeOneFrame(reader
)) close();
403 bool decodeNextFrame (scope ReadBufFn reader
) {
404 if (!valid
) return false;
405 static if (allowGC
) scope(failure
) close();
406 if (reader
is null) return false;
407 if (!decodeOneFrame(reader
)) {
414 @property bool valid () const pure nothrow @safe @nogc { return (dec !is null && curFrameIsOk
); }
415 @property uint sampleRate () const pure nothrow @safe @nogc { return (valid ? info
.sample_rate
: 0); }
416 @property ubyte channels () const pure nothrow @safe @nogc { return (valid ?
cast(ubyte)info
.channels
: 0); }
417 @property int samplesInFrame () const pure nothrow @safe @nogc { return (valid ?
cast(ubyte)info
.audio_bytes
: 0); }
419 @property short[] frameSamples () nothrow @nogc {
420 if (!valid
) return null;
421 return samples
[0..info
.audio_bytes
/2];
426 // ////////////////////////////////////////////////////////////////////////// //
429 import core
.stdc
.stdlib
: libc_calloc
= calloc
, libc_malloc
= malloc
, libc_realloc
= realloc
, libc_free
= free
;
430 import core
.stdc
.string
: libc_memcpy
= memcpy
, libc_memset
= memset
, libc_memmove
= memmove
;
432 import std
.math
: libc_pow
= pow
, libc_frexp
= frexp
, tan
, M_PI
= PI
, sqrt
, cos
, sin
;
435 void* libc_calloc (usize nmemb, usize count) {
436 import core.stdc.stdlib : calloc;
437 import core.stdc.stdio : printf;
438 printf("calloc(%zu, %zu)\n", nmemb, count);
439 return calloc(nmemb, count);
442 void* libc_malloc (usize count) {
443 import core.stdc.stdlib : malloc;
444 import core.stdc.stdio : printf;
445 printf("malloc(%zu)\n", count+1024*1024);
446 return malloc(count);
449 void* libc_realloc (void* ptr, usize count) {
450 import core.stdc.stdlib : realloc;
451 import core.stdc.stdio : printf;
452 printf("realloc(%p, %zu)\n", ptr, count);
453 return realloc(ptr, count+1024*1024);
456 void libc_free (void* ptr) {
457 import core.stdc.stdlib : free;
458 import core.stdc.stdio : printf;
459 printf("free(%p)\n", ptr);
464 enum MP3_FRAME_SIZE
= 1152;
465 enum MP3_MAX_CODED_FRAME_SIZE
= 1792;
466 enum MP3_MAX_CHANNELS
= 2;
470 enum MP3_JSTEREO
= 1;
474 enum SAME_HEADER_MASK
= (0xffe00000 |
(3 << 17) |
(0xf << 12) |
(3 << 10) |
(3 << 19));
477 enum WFRAC_BITS
= 14;
479 enum OUT_MAX
= (32767);
480 enum OUT_MIN
= (-32768);
481 enum OUT_SHIFT
= (WFRAC_BITS
+ FRAC_BITS
- 15);
483 enum MODE_EXT_MS_STEREO
= 2;
484 enum MODE_EXT_I_STEREO
= 1;
486 enum FRAC_ONE
= (1 << FRAC_BITS
);
487 //enum FIX(a) ((int)((a) * FRAC_ONE))
488 enum FIXR(double a
) = (cast(int)((a
) * FRAC_ONE
+ 0.5));
489 int FIXRx(double a
) { static if (__VERSION__
> 2067) pragma(inline
, true); return (cast(int)((a
) * FRAC_ONE
+ 0.5)); }
490 //enum FRAC_RND(a) (((a) + (FRAC_ONE/2)) >> FRAC_BITS)
491 enum FIXHR(double a
) = (cast(int)((a
) * (1L<<32) + 0.5));
492 int FIXHRx() (double a
) { static if (__VERSION__
> 2067) pragma(inline
, true); return (cast(int)((a
) * (1L<<32) + 0.5)); }
494 long MULL() (int a
, int b
) { static if (__VERSION__
> 2067) pragma(inline
, true); return ((cast(long)(a
) * cast(long)(b
)) >> FRAC_BITS
); }
495 long MULH() (int a
, int b
) { static if (__VERSION__
> 2067) pragma(inline
, true); return ((cast(long)(a
) * cast(long)(b
)) >> 32); }
496 auto MULS(T
) (T ra
, T rb
) { static if (__VERSION__
> 2067) pragma(inline
, true); return ((ra
) * (rb
)); }
498 enum ISQRT2
= FIXR
!(0.70710678118654752440);
500 enum HEADER_SIZE
= 4;
501 enum BACKSTEP_SIZE
= 512;
502 enum EXTRABYTES
= 24;
505 // ////////////////////////////////////////////////////////////////////////// //
506 alias VLC_TYPE
= short;
507 alias VT2
= VLC_TYPE
[2];
510 alias int16_t
= short;
512 alias int64_t
= long;
514 alias uint8_t
= ubyte;
515 alias uint16_t
= ushort;
516 alias uint32_t
= uint;
517 alias uint64_t
= ulong;
520 const(ubyte)* buffer
, buffer_end
;
527 //VLC_TYPE (*table)[2]; ///< code, bits
529 int table_size
, table_allocated
;
532 struct mp3_context_t
{
533 uint8_t
[2*BACKSTEP_SIZE
+EXTRABYTES
] last_buf
;
536 uint32_t free_format_next_header
;
537 int error_protection
;
539 int sample_rate_index
;
548 int16_t
[512*2][MP3_MAX_CHANNELS
] synth_buf
;
549 int[MP3_MAX_CHANNELS
] synth_buf_offset
;
550 int32_t
[SBLIMIT
][36][MP3_MAX_CHANNELS
] sb_samples
;
551 int32_t
[SBLIMIT
*18][MP3_MAX_CHANNELS
] mdct_buf
;
553 uint last_header
; //&0xffff0c00u;
561 int scalefac_compress
;
563 uint8_t switch_point
;
565 int[3] subblock_gain
;
566 uint8_t scalefac_scale
;
567 uint8_t count1table_select
;
570 int short_start
, long_end
;
571 uint8_t
[40] scale_factors
;
572 int32_t
[SBLIMIT
* 18] sb_hybrid
;
575 struct huff_table_t
{
577 immutable(uint8_t
)* bits
;
578 immutable(uint16_t
)* codes
;
581 __gshared vlc_t
[16] huff_vlc
;
582 __gshared vlc_t
[2] huff_quad_vlc
;
583 __gshared uint16_t
[23][9] band_index_long
;
584 enum TABLE_4_3_SIZE
= (8191 + 16)*4;
585 __gshared int8_t
* table_4_3_exp
;
586 __gshared uint32_t
* table_4_3_value
;
587 __gshared uint32_t
[512] exp_table
;
588 __gshared uint32_t
[16][512] expval_table
;
589 __gshared int32_t
[16][2] is_table
;
590 __gshared int32_t
[16][2][2] is_table_lsf
;
591 __gshared int32_t
[4][8] csa_table
;
592 __gshared
float[4][8] csa_table_float
;
593 __gshared int32_t
[36][8] mdct_win
;
594 __gshared int16_t
[512] window
;
597 // ////////////////////////////////////////////////////////////////////////// //
598 static immutable uint16_t
[15][2] mp3_bitrate_tab
= [
599 [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 ],
600 [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
603 static immutable uint16_t
[3] mp3_freq_tab
= [ 44100, 48000, 32000 ];
605 static immutable int32_t
[257] mp3_enwindow
= [
606 0, -1, -1, -1, -1, -1, -1, -2,
607 -2, -2, -2, -3, -3, -4, -4, -5,
608 -5, -6, -7, -7, -8, -9, -10, -11,
609 -13, -14, -16, -17, -19, -21, -24, -26,
610 -29, -31, -35, -38, -41, -45, -49, -53,
611 -58, -63, -68, -73, -79, -85, -91, -97,
612 -104, -111, -117, -125, -132, -139, -147, -154,
613 -161, -169, -176, -183, -190, -196, -202, -208,
614 213, 218, 222, 225, 227, 228, 228, 227,
615 224, 221, 215, 208, 200, 189, 177, 163,
616 146, 127, 106, 83, 57, 29, -2, -36,
617 -72, -111, -153, -197, -244, -294, -347, -401,
618 -459, -519, -581, -645, -711, -779, -848, -919,
619 -991, -1064, -1137, -1210, -1283, -1356, -1428, -1498,
620 -1567, -1634, -1698, -1759, -1817, -1870, -1919, -1962,
621 -2001, -2032, -2057, -2075, -2085, -2087, -2080, -2063,
622 2037, 2000, 1952, 1893, 1822, 1739, 1644, 1535,
623 1414, 1280, 1131, 970, 794, 605, 402, 185,
624 -45, -288, -545, -814, -1095, -1388, -1692, -2006,
625 -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
626 -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597,
627 -7910, -8209, -8491, -8755, -8998, -9219, -9416, -9585,
628 -9727, -9838, -9916, -9959, -9966, -9935, -9863, -9750,
629 -9592, -9389, -9139, -8840, -8492, -8092, -7640, -7134,
630 6574, 5959, 5288, 4561, 3776, 2935, 2037, 1082,
631 70, -998, -2122, -3300, -4533, -5818, -7154, -8540,
632 -9975,-11455,-12980,-14548,-16155,-17799,-19478,-21189,
633 -22929,-24694,-26482,-28289,-30112,-31947,-33791,-35640,
634 -37489,-39336,-41176,-43006,-44821,-46617,-48390,-50137,
635 -51853,-53534,-55178,-56778,-58333,-59838,-61289,-62684,
636 -64019,-65290,-66494,-67629,-68692,-69679,-70590,-71420,
637 -72169,-72835,-73415,-73908,-74313,-74630,-74856,-74992,
641 static immutable uint8_t
[16][2] slen_table
= [
642 [ 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 ],
643 [ 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 ],
646 static immutable uint8_t
[4][3][6] lsf_nsf_table
= [
647 [ [ 6, 5, 5, 5 ], [ 9, 9, 9, 9 ], [ 6, 9, 9, 9 ] ],
648 [ [ 6, 5, 7, 3 ], [ 9, 9, 12, 6 ], [ 6, 9, 12, 6 ] ],
649 [ [ 11, 10, 0, 0 ], [ 18, 18, 0, 0 ], [ 15, 18, 0, 0 ] ],
650 [ [ 7, 7, 7, 0 ], [ 12, 12, 12, 0 ], [ 6, 15, 12, 0 ] ],
651 [ [ 6, 6, 6, 3 ], [ 12, 9, 9, 6 ], [ 6, 12, 9, 6 ] ],
652 [ [ 8, 8, 5, 0 ], [ 15, 12, 9, 0 ], [ 6, 18, 9, 0 ] ],
655 static immutable uint16_t
[4] mp3_huffcodes_1
= [ 0x0001, 0x0001, 0x0001, 0x0000, ];
657 static immutable uint8_t
[4] mp3_huffbits_1
= [ 1, 3, 2, 3, ];
659 static immutable uint16_t
[9] mp3_huffcodes_2
= [ 0x0001, 0x0002, 0x0001, 0x0003, 0x0001, 0x0001, 0x0003, 0x0002, 0x0000, ];
661 static immutable uint8_t
[9] mp3_huffbits_2
= [ 1, 3, 6, 3, 3, 5, 5, 5, 6, ];
663 static immutable uint16_t
[9] mp3_huffcodes_3
= [ 0x0003, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003, 0x0002, 0x0000, ];
665 static immutable uint8_t
[9] mp3_huffbits_3
= [ 2, 2, 6, 3, 2, 5, 5, 5, 6, ];
667 static immutable uint16_t
[16] mp3_huffcodes_5
= [
668 0x0001, 0x0002, 0x0006, 0x0005, 0x0003, 0x0001, 0x0004, 0x0004,
669 0x0007, 0x0005, 0x0007, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000,
672 static immutable uint8_t
[16] mp3_huffbits_5
= [
673 1, 3, 6, 7, 3, 3, 6, 7,
674 6, 6, 7, 8, 7, 6, 7, 8,
677 static immutable uint16_t
[16] mp3_huffcodes_6
= [
678 0x0007, 0x0003, 0x0005, 0x0001, 0x0006, 0x0002, 0x0003, 0x0002,
679 0x0005, 0x0004, 0x0004, 0x0001, 0x0003, 0x0003, 0x0002, 0x0000,
682 static immutable uint8_t
[16] mp3_huffbits_6
= [
683 3, 3, 5, 7, 3, 2, 4, 5,
684 4, 4, 5, 6, 6, 5, 6, 7,
687 static immutable uint16_t
[36] mp3_huffcodes_7
= [
688 0x0001, 0x0002, 0x000a, 0x0013, 0x0010, 0x000a, 0x0003, 0x0003,
689 0x0007, 0x000a, 0x0005, 0x0003, 0x000b, 0x0004, 0x000d, 0x0011,
690 0x0008, 0x0004, 0x000c, 0x000b, 0x0012, 0x000f, 0x000b, 0x0002,
691 0x0007, 0x0006, 0x0009, 0x000e, 0x0003, 0x0001, 0x0006, 0x0004,
692 0x0005, 0x0003, 0x0002, 0x0000,
695 static immutable uint8_t
[36] mp3_huffbits_7
= [
696 1, 3, 6, 8, 8, 9, 3, 4,
697 6, 7, 7, 8, 6, 5, 7, 8,
698 8, 9, 7, 7, 8, 9, 9, 9,
699 7, 7, 8, 9, 9, 10, 8, 8,
703 static immutable uint16_t
[36] mp3_huffcodes_8
= [
704 0x0003, 0x0004, 0x0006, 0x0012, 0x000c, 0x0005, 0x0005, 0x0001,
705 0x0002, 0x0010, 0x0009, 0x0003, 0x0007, 0x0003, 0x0005, 0x000e,
706 0x0007, 0x0003, 0x0013, 0x0011, 0x000f, 0x000d, 0x000a, 0x0004,
707 0x000d, 0x0005, 0x0008, 0x000b, 0x0005, 0x0001, 0x000c, 0x0004,
708 0x0004, 0x0001, 0x0001, 0x0000,
711 static immutable uint8_t
[36] mp3_huffbits_8
= [
712 2, 3, 6, 8, 8, 9, 3, 2,
713 4, 8, 8, 8, 6, 4, 6, 8,
714 8, 9, 8, 8, 8, 9, 9, 10,
715 8, 7, 8, 9, 10, 10, 9, 8,
719 static immutable uint16_t
[36] mp3_huffcodes_9
= [
720 0x0007, 0x0005, 0x0009, 0x000e, 0x000f, 0x0007, 0x0006, 0x0004,
721 0x0005, 0x0005, 0x0006, 0x0007, 0x0007, 0x0006, 0x0008, 0x0008,
722 0x0008, 0x0005, 0x000f, 0x0006, 0x0009, 0x000a, 0x0005, 0x0001,
723 0x000b, 0x0007, 0x0009, 0x0006, 0x0004, 0x0001, 0x000e, 0x0004,
724 0x0006, 0x0002, 0x0006, 0x0000,
727 static immutable uint8_t
[36] mp3_huffbits_9
= [
728 3, 3, 5, 6, 8, 9, 3, 3,
729 4, 5, 6, 8, 4, 4, 5, 6,
730 7, 8, 6, 5, 6, 7, 7, 8,
731 7, 6, 7, 7, 8, 9, 8, 7,
735 static immutable uint16_t
[64] mp3_huffcodes_10
= [
736 0x0001, 0x0002, 0x000a, 0x0017, 0x0023, 0x001e, 0x000c, 0x0011,
737 0x0003, 0x0003, 0x0008, 0x000c, 0x0012, 0x0015, 0x000c, 0x0007,
738 0x000b, 0x0009, 0x000f, 0x0015, 0x0020, 0x0028, 0x0013, 0x0006,
739 0x000e, 0x000d, 0x0016, 0x0022, 0x002e, 0x0017, 0x0012, 0x0007,
740 0x0014, 0x0013, 0x0021, 0x002f, 0x001b, 0x0016, 0x0009, 0x0003,
741 0x001f, 0x0016, 0x0029, 0x001a, 0x0015, 0x0014, 0x0005, 0x0003,
742 0x000e, 0x000d, 0x000a, 0x000b, 0x0010, 0x0006, 0x0005, 0x0001,
743 0x0009, 0x0008, 0x0007, 0x0008, 0x0004, 0x0004, 0x0002, 0x0000,
746 static immutable uint8_t
[64] mp3_huffbits_10
= [
747 1, 3, 6, 8, 9, 9, 9, 10,
748 3, 4, 6, 7, 8, 9, 8, 8,
749 6, 6, 7, 8, 9, 10, 9, 9,
750 7, 7, 8, 9, 10, 10, 9, 10,
751 8, 8, 9, 10, 10, 10, 10, 10,
752 9, 9, 10, 10, 11, 11, 10, 11,
753 8, 8, 9, 10, 10, 10, 11, 11,
754 9, 8, 9, 10, 10, 11, 11, 11,
757 static immutable uint16_t
[64] mp3_huffcodes_11
= [
758 0x0003, 0x0004, 0x000a, 0x0018, 0x0022, 0x0021, 0x0015, 0x000f,
759 0x0005, 0x0003, 0x0004, 0x000a, 0x0020, 0x0011, 0x000b, 0x000a,
760 0x000b, 0x0007, 0x000d, 0x0012, 0x001e, 0x001f, 0x0014, 0x0005,
761 0x0019, 0x000b, 0x0013, 0x003b, 0x001b, 0x0012, 0x000c, 0x0005,
762 0x0023, 0x0021, 0x001f, 0x003a, 0x001e, 0x0010, 0x0007, 0x0005,
763 0x001c, 0x001a, 0x0020, 0x0013, 0x0011, 0x000f, 0x0008, 0x000e,
764 0x000e, 0x000c, 0x0009, 0x000d, 0x000e, 0x0009, 0x0004, 0x0001,
765 0x000b, 0x0004, 0x0006, 0x0006, 0x0006, 0x0003, 0x0002, 0x0000,
768 static immutable uint8_t
[64] mp3_huffbits_11
= [
769 2, 3, 5, 7, 8, 9, 8, 9,
770 3, 3, 4, 6, 8, 8, 7, 8,
771 5, 5, 6, 7, 8, 9, 8, 8,
772 7, 6, 7, 9, 8, 10, 8, 9,
773 8, 8, 8, 9, 9, 10, 9, 10,
774 8, 8, 9, 10, 10, 11, 10, 11,
775 8, 7, 7, 8, 9, 10, 10, 10,
776 8, 7, 8, 9, 10, 10, 10, 10,
779 static immutable uint16_t
[64] mp3_huffcodes_12
= [
780 0x0009, 0x0006, 0x0010, 0x0021, 0x0029, 0x0027, 0x0026, 0x001a,
781 0x0007, 0x0005, 0x0006, 0x0009, 0x0017, 0x0010, 0x001a, 0x000b,
782 0x0011, 0x0007, 0x000b, 0x000e, 0x0015, 0x001e, 0x000a, 0x0007,
783 0x0011, 0x000a, 0x000f, 0x000c, 0x0012, 0x001c, 0x000e, 0x0005,
784 0x0020, 0x000d, 0x0016, 0x0013, 0x0012, 0x0010, 0x0009, 0x0005,
785 0x0028, 0x0011, 0x001f, 0x001d, 0x0011, 0x000d, 0x0004, 0x0002,
786 0x001b, 0x000c, 0x000b, 0x000f, 0x000a, 0x0007, 0x0004, 0x0001,
787 0x001b, 0x000c, 0x0008, 0x000c, 0x0006, 0x0003, 0x0001, 0x0000,
790 static immutable uint8_t
[64] mp3_huffbits_12
= [
791 4, 3, 5, 7, 8, 9, 9, 9,
792 3, 3, 4, 5, 7, 7, 8, 8,
793 5, 4, 5, 6, 7, 8, 7, 8,
794 6, 5, 6, 6, 7, 8, 8, 8,
795 7, 6, 7, 7, 8, 8, 8, 9,
796 8, 7, 8, 8, 8, 9, 8, 9,
797 8, 7, 7, 8, 8, 9, 9, 10,
798 9, 8, 8, 9, 9, 9, 9, 10,
801 static immutable uint16_t
[256] mp3_huffcodes_13
= [
802 0x0001, 0x0005, 0x000e, 0x0015, 0x0022, 0x0033, 0x002e, 0x0047,
803 0x002a, 0x0034, 0x0044, 0x0034, 0x0043, 0x002c, 0x002b, 0x0013,
804 0x0003, 0x0004, 0x000c, 0x0013, 0x001f, 0x001a, 0x002c, 0x0021,
805 0x001f, 0x0018, 0x0020, 0x0018, 0x001f, 0x0023, 0x0016, 0x000e,
806 0x000f, 0x000d, 0x0017, 0x0024, 0x003b, 0x0031, 0x004d, 0x0041,
807 0x001d, 0x0028, 0x001e, 0x0028, 0x001b, 0x0021, 0x002a, 0x0010,
808 0x0016, 0x0014, 0x0025, 0x003d, 0x0038, 0x004f, 0x0049, 0x0040,
809 0x002b, 0x004c, 0x0038, 0x0025, 0x001a, 0x001f, 0x0019, 0x000e,
810 0x0023, 0x0010, 0x003c, 0x0039, 0x0061, 0x004b, 0x0072, 0x005b,
811 0x0036, 0x0049, 0x0037, 0x0029, 0x0030, 0x0035, 0x0017, 0x0018,
812 0x003a, 0x001b, 0x0032, 0x0060, 0x004c, 0x0046, 0x005d, 0x0054,
813 0x004d, 0x003a, 0x004f, 0x001d, 0x004a, 0x0031, 0x0029, 0x0011,
814 0x002f, 0x002d, 0x004e, 0x004a, 0x0073, 0x005e, 0x005a, 0x004f,
815 0x0045, 0x0053, 0x0047, 0x0032, 0x003b, 0x0026, 0x0024, 0x000f,
816 0x0048, 0x0022, 0x0038, 0x005f, 0x005c, 0x0055, 0x005b, 0x005a,
817 0x0056, 0x0049, 0x004d, 0x0041, 0x0033, 0x002c, 0x002b, 0x002a,
818 0x002b, 0x0014, 0x001e, 0x002c, 0x0037, 0x004e, 0x0048, 0x0057,
819 0x004e, 0x003d, 0x002e, 0x0036, 0x0025, 0x001e, 0x0014, 0x0010,
820 0x0035, 0x0019, 0x0029, 0x0025, 0x002c, 0x003b, 0x0036, 0x0051,
821 0x0042, 0x004c, 0x0039, 0x0036, 0x0025, 0x0012, 0x0027, 0x000b,
822 0x0023, 0x0021, 0x001f, 0x0039, 0x002a, 0x0052, 0x0048, 0x0050,
823 0x002f, 0x003a, 0x0037, 0x0015, 0x0016, 0x001a, 0x0026, 0x0016,
824 0x0035, 0x0019, 0x0017, 0x0026, 0x0046, 0x003c, 0x0033, 0x0024,
825 0x0037, 0x001a, 0x0022, 0x0017, 0x001b, 0x000e, 0x0009, 0x0007,
826 0x0022, 0x0020, 0x001c, 0x0027, 0x0031, 0x004b, 0x001e, 0x0034,
827 0x0030, 0x0028, 0x0034, 0x001c, 0x0012, 0x0011, 0x0009, 0x0005,
828 0x002d, 0x0015, 0x0022, 0x0040, 0x0038, 0x0032, 0x0031, 0x002d,
829 0x001f, 0x0013, 0x000c, 0x000f, 0x000a, 0x0007, 0x0006, 0x0003,
830 0x0030, 0x0017, 0x0014, 0x0027, 0x0024, 0x0023, 0x0035, 0x0015,
831 0x0010, 0x0017, 0x000d, 0x000a, 0x0006, 0x0001, 0x0004, 0x0002,
832 0x0010, 0x000f, 0x0011, 0x001b, 0x0019, 0x0014, 0x001d, 0x000b,
833 0x0011, 0x000c, 0x0010, 0x0008, 0x0001, 0x0001, 0x0000, 0x0001,
836 static immutable uint8_t
[256] mp3_huffbits_13
= [
837 1, 4, 6, 7, 8, 9, 9, 10,
838 9, 10, 11, 11, 12, 12, 13, 13,
839 3, 4, 6, 7, 8, 8, 9, 9,
840 9, 9, 10, 10, 11, 12, 12, 12,
841 6, 6, 7, 8, 9, 9, 10, 10,
842 9, 10, 10, 11, 11, 12, 13, 13,
843 7, 7, 8, 9, 9, 10, 10, 10,
844 10, 11, 11, 11, 11, 12, 13, 13,
845 8, 7, 9, 9, 10, 10, 11, 11,
846 10, 11, 11, 12, 12, 13, 13, 14,
847 9, 8, 9, 10, 10, 10, 11, 11,
848 11, 11, 12, 11, 13, 13, 14, 14,
849 9, 9, 10, 10, 11, 11, 11, 11,
850 11, 12, 12, 12, 13, 13, 14, 14,
851 10, 9, 10, 11, 11, 11, 12, 12,
852 12, 12, 13, 13, 13, 14, 16, 16,
853 9, 8, 9, 10, 10, 11, 11, 12,
854 12, 12, 12, 13, 13, 14, 15, 15,
855 10, 9, 10, 10, 11, 11, 11, 13,
856 12, 13, 13, 14, 14, 14, 16, 15,
857 10, 10, 10, 11, 11, 12, 12, 13,
858 12, 13, 14, 13, 14, 15, 16, 17,
859 11, 10, 10, 11, 12, 12, 12, 12,
860 13, 13, 13, 14, 15, 15, 15, 16,
861 11, 11, 11, 12, 12, 13, 12, 13,
862 14, 14, 15, 15, 15, 16, 16, 16,
863 12, 11, 12, 13, 13, 13, 14, 14,
864 14, 14, 14, 15, 16, 15, 16, 16,
865 13, 12, 12, 13, 13, 13, 15, 14,
866 14, 17, 15, 15, 15, 17, 16, 16,
867 12, 12, 13, 14, 14, 14, 15, 14,
868 15, 15, 16, 16, 19, 18, 19, 16,
871 static immutable uint16_t
[256] mp3_huffcodes_15
= [
872 0x0007, 0x000c, 0x0012, 0x0035, 0x002f, 0x004c, 0x007c, 0x006c,
873 0x0059, 0x007b, 0x006c, 0x0077, 0x006b, 0x0051, 0x007a, 0x003f,
874 0x000d, 0x0005, 0x0010, 0x001b, 0x002e, 0x0024, 0x003d, 0x0033,
875 0x002a, 0x0046, 0x0034, 0x0053, 0x0041, 0x0029, 0x003b, 0x0024,
876 0x0013, 0x0011, 0x000f, 0x0018, 0x0029, 0x0022, 0x003b, 0x0030,
877 0x0028, 0x0040, 0x0032, 0x004e, 0x003e, 0x0050, 0x0038, 0x0021,
878 0x001d, 0x001c, 0x0019, 0x002b, 0x0027, 0x003f, 0x0037, 0x005d,
879 0x004c, 0x003b, 0x005d, 0x0048, 0x0036, 0x004b, 0x0032, 0x001d,
880 0x0034, 0x0016, 0x002a, 0x0028, 0x0043, 0x0039, 0x005f, 0x004f,
881 0x0048, 0x0039, 0x0059, 0x0045, 0x0031, 0x0042, 0x002e, 0x001b,
882 0x004d, 0x0025, 0x0023, 0x0042, 0x003a, 0x0034, 0x005b, 0x004a,
883 0x003e, 0x0030, 0x004f, 0x003f, 0x005a, 0x003e, 0x0028, 0x0026,
884 0x007d, 0x0020, 0x003c, 0x0038, 0x0032, 0x005c, 0x004e, 0x0041,
885 0x0037, 0x0057, 0x0047, 0x0033, 0x0049, 0x0033, 0x0046, 0x001e,
886 0x006d, 0x0035, 0x0031, 0x005e, 0x0058, 0x004b, 0x0042, 0x007a,
887 0x005b, 0x0049, 0x0038, 0x002a, 0x0040, 0x002c, 0x0015, 0x0019,
888 0x005a, 0x002b, 0x0029, 0x004d, 0x0049, 0x003f, 0x0038, 0x005c,
889 0x004d, 0x0042, 0x002f, 0x0043, 0x0030, 0x0035, 0x0024, 0x0014,
890 0x0047, 0x0022, 0x0043, 0x003c, 0x003a, 0x0031, 0x0058, 0x004c,
891 0x0043, 0x006a, 0x0047, 0x0036, 0x0026, 0x0027, 0x0017, 0x000f,
892 0x006d, 0x0035, 0x0033, 0x002f, 0x005a, 0x0052, 0x003a, 0x0039,
893 0x0030, 0x0048, 0x0039, 0x0029, 0x0017, 0x001b, 0x003e, 0x0009,
894 0x0056, 0x002a, 0x0028, 0x0025, 0x0046, 0x0040, 0x0034, 0x002b,
895 0x0046, 0x0037, 0x002a, 0x0019, 0x001d, 0x0012, 0x000b, 0x000b,
896 0x0076, 0x0044, 0x001e, 0x0037, 0x0032, 0x002e, 0x004a, 0x0041,
897 0x0031, 0x0027, 0x0018, 0x0010, 0x0016, 0x000d, 0x000e, 0x0007,
898 0x005b, 0x002c, 0x0027, 0x0026, 0x0022, 0x003f, 0x0034, 0x002d,
899 0x001f, 0x0034, 0x001c, 0x0013, 0x000e, 0x0008, 0x0009, 0x0003,
900 0x007b, 0x003c, 0x003a, 0x0035, 0x002f, 0x002b, 0x0020, 0x0016,
901 0x0025, 0x0018, 0x0011, 0x000c, 0x000f, 0x000a, 0x0002, 0x0001,
902 0x0047, 0x0025, 0x0022, 0x001e, 0x001c, 0x0014, 0x0011, 0x001a,
903 0x0015, 0x0010, 0x000a, 0x0006, 0x0008, 0x0006, 0x0002, 0x0000,
906 static immutable uint8_t
[256] mp3_huffbits_15
= [
907 3, 4, 5, 7, 7, 8, 9, 9,
908 9, 10, 10, 11, 11, 11, 12, 13,
909 4, 3, 5, 6, 7, 7, 8, 8,
910 8, 9, 9, 10, 10, 10, 11, 11,
911 5, 5, 5, 6, 7, 7, 8, 8,
912 8, 9, 9, 10, 10, 11, 11, 11,
913 6, 6, 6, 7, 7, 8, 8, 9,
914 9, 9, 10, 10, 10, 11, 11, 11,
915 7, 6, 7, 7, 8, 8, 9, 9,
916 9, 9, 10, 10, 10, 11, 11, 11,
917 8, 7, 7, 8, 8, 8, 9, 9,
918 9, 9, 10, 10, 11, 11, 11, 12,
919 9, 7, 8, 8, 8, 9, 9, 9,
920 9, 10, 10, 10, 11, 11, 12, 12,
921 9, 8, 8, 9, 9, 9, 9, 10,
922 10, 10, 10, 10, 11, 11, 11, 12,
923 9, 8, 8, 9, 9, 9, 9, 10,
924 10, 10, 10, 11, 11, 12, 12, 12,
925 9, 8, 9, 9, 9, 9, 10, 10,
926 10, 11, 11, 11, 11, 12, 12, 12,
927 10, 9, 9, 9, 10, 10, 10, 10,
928 10, 11, 11, 11, 11, 12, 13, 12,
929 10, 9, 9, 9, 10, 10, 10, 10,
930 11, 11, 11, 11, 12, 12, 12, 13,
931 11, 10, 9, 10, 10, 10, 11, 11,
932 11, 11, 11, 11, 12, 12, 13, 13,
933 11, 10, 10, 10, 10, 11, 11, 11,
934 11, 12, 12, 12, 12, 12, 13, 13,
935 12, 11, 11, 11, 11, 11, 11, 11,
936 12, 12, 12, 12, 13, 13, 12, 13,
937 12, 11, 11, 11, 11, 11, 11, 12,
938 12, 12, 12, 12, 13, 13, 13, 13,
941 static immutable uint16_t
[256] mp3_huffcodes_16
= [
942 0x0001, 0x0005, 0x000e, 0x002c, 0x004a, 0x003f, 0x006e, 0x005d,
943 0x00ac, 0x0095, 0x008a, 0x00f2, 0x00e1, 0x00c3, 0x0178, 0x0011,
944 0x0003, 0x0004, 0x000c, 0x0014, 0x0023, 0x003e, 0x0035, 0x002f,
945 0x0053, 0x004b, 0x0044, 0x0077, 0x00c9, 0x006b, 0x00cf, 0x0009,
946 0x000f, 0x000d, 0x0017, 0x0026, 0x0043, 0x003a, 0x0067, 0x005a,
947 0x00a1, 0x0048, 0x007f, 0x0075, 0x006e, 0x00d1, 0x00ce, 0x0010,
948 0x002d, 0x0015, 0x0027, 0x0045, 0x0040, 0x0072, 0x0063, 0x0057,
949 0x009e, 0x008c, 0x00fc, 0x00d4, 0x00c7, 0x0183, 0x016d, 0x001a,
950 0x004b, 0x0024, 0x0044, 0x0041, 0x0073, 0x0065, 0x00b3, 0x00a4,
951 0x009b, 0x0108, 0x00f6, 0x00e2, 0x018b, 0x017e, 0x016a, 0x0009,
952 0x0042, 0x001e, 0x003b, 0x0038, 0x0066, 0x00b9, 0x00ad, 0x0109,
953 0x008e, 0x00fd, 0x00e8, 0x0190, 0x0184, 0x017a, 0x01bd, 0x0010,
954 0x006f, 0x0036, 0x0034, 0x0064, 0x00b8, 0x00b2, 0x00a0, 0x0085,
955 0x0101, 0x00f4, 0x00e4, 0x00d9, 0x0181, 0x016e, 0x02cb, 0x000a,
956 0x0062, 0x0030, 0x005b, 0x0058, 0x00a5, 0x009d, 0x0094, 0x0105,
957 0x00f8, 0x0197, 0x018d, 0x0174, 0x017c, 0x0379, 0x0374, 0x0008,
958 0x0055, 0x0054, 0x0051, 0x009f, 0x009c, 0x008f, 0x0104, 0x00f9,
959 0x01ab, 0x0191, 0x0188, 0x017f, 0x02d7, 0x02c9, 0x02c4, 0x0007,
960 0x009a, 0x004c, 0x0049, 0x008d, 0x0083, 0x0100, 0x00f5, 0x01aa,
961 0x0196, 0x018a, 0x0180, 0x02df, 0x0167, 0x02c6, 0x0160, 0x000b,
962 0x008b, 0x0081, 0x0043, 0x007d, 0x00f7, 0x00e9, 0x00e5, 0x00db,
963 0x0189, 0x02e7, 0x02e1, 0x02d0, 0x0375, 0x0372, 0x01b7, 0x0004,
964 0x00f3, 0x0078, 0x0076, 0x0073, 0x00e3, 0x00df, 0x018c, 0x02ea,
965 0x02e6, 0x02e0, 0x02d1, 0x02c8, 0x02c2, 0x00df, 0x01b4, 0x0006,
966 0x00ca, 0x00e0, 0x00de, 0x00da, 0x00d8, 0x0185, 0x0182, 0x017d,
967 0x016c, 0x0378, 0x01bb, 0x02c3, 0x01b8, 0x01b5, 0x06c0, 0x0004,
968 0x02eb, 0x00d3, 0x00d2, 0x00d0, 0x0172, 0x017b, 0x02de, 0x02d3,
969 0x02ca, 0x06c7, 0x0373, 0x036d, 0x036c, 0x0d83, 0x0361, 0x0002,
970 0x0179, 0x0171, 0x0066, 0x00bb, 0x02d6, 0x02d2, 0x0166, 0x02c7,
971 0x02c5, 0x0362, 0x06c6, 0x0367, 0x0d82, 0x0366, 0x01b2, 0x0000,
972 0x000c, 0x000a, 0x0007, 0x000b, 0x000a, 0x0011, 0x000b, 0x0009,
973 0x000d, 0x000c, 0x000a, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
976 static immutable uint8_t
[256] mp3_huffbits_16
= [
977 1, 4, 6, 8, 9, 9, 10, 10,
978 11, 11, 11, 12, 12, 12, 13, 9,
979 3, 4, 6, 7, 8, 9, 9, 9,
980 10, 10, 10, 11, 12, 11, 12, 8,
981 6, 6, 7, 8, 9, 9, 10, 10,
982 11, 10, 11, 11, 11, 12, 12, 9,
983 8, 7, 8, 9, 9, 10, 10, 10,
984 11, 11, 12, 12, 12, 13, 13, 10,
985 9, 8, 9, 9, 10, 10, 11, 11,
986 11, 12, 12, 12, 13, 13, 13, 9,
987 9, 8, 9, 9, 10, 11, 11, 12,
988 11, 12, 12, 13, 13, 13, 14, 10,
989 10, 9, 9, 10, 11, 11, 11, 11,
990 12, 12, 12, 12, 13, 13, 14, 10,
991 10, 9, 10, 10, 11, 11, 11, 12,
992 12, 13, 13, 13, 13, 15, 15, 10,
993 10, 10, 10, 11, 11, 11, 12, 12,
994 13, 13, 13, 13, 14, 14, 14, 10,
995 11, 10, 10, 11, 11, 12, 12, 13,
996 13, 13, 13, 14, 13, 14, 13, 11,
997 11, 11, 10, 11, 12, 12, 12, 12,
998 13, 14, 14, 14, 15, 15, 14, 10,
999 12, 11, 11, 11, 12, 12, 13, 14,
1000 14, 14, 14, 14, 14, 13, 14, 11,
1001 12, 12, 12, 12, 12, 13, 13, 13,
1002 13, 15, 14, 14, 14, 14, 16, 11,
1003 14, 12, 12, 12, 13, 13, 14, 14,
1004 14, 16, 15, 15, 15, 17, 15, 11,
1005 13, 13, 11, 12, 14, 14, 13, 14,
1006 14, 15, 16, 15, 17, 15, 14, 11,
1007 9, 8, 8, 9, 9, 10, 10, 10,
1008 11, 11, 11, 11, 11, 11, 11, 8,
1011 static immutable uint16_t
[256] mp3_huffcodes_24
= [
1012 0x000f, 0x000d, 0x002e, 0x0050, 0x0092, 0x0106, 0x00f8, 0x01b2,
1013 0x01aa, 0x029d, 0x028d, 0x0289, 0x026d, 0x0205, 0x0408, 0x0058,
1014 0x000e, 0x000c, 0x0015, 0x0026, 0x0047, 0x0082, 0x007a, 0x00d8,
1015 0x00d1, 0x00c6, 0x0147, 0x0159, 0x013f, 0x0129, 0x0117, 0x002a,
1016 0x002f, 0x0016, 0x0029, 0x004a, 0x0044, 0x0080, 0x0078, 0x00dd,
1017 0x00cf, 0x00c2, 0x00b6, 0x0154, 0x013b, 0x0127, 0x021d, 0x0012,
1018 0x0051, 0x0027, 0x004b, 0x0046, 0x0086, 0x007d, 0x0074, 0x00dc,
1019 0x00cc, 0x00be, 0x00b2, 0x0145, 0x0137, 0x0125, 0x010f, 0x0010,
1020 0x0093, 0x0048, 0x0045, 0x0087, 0x007f, 0x0076, 0x0070, 0x00d2,
1021 0x00c8, 0x00bc, 0x0160, 0x0143, 0x0132, 0x011d, 0x021c, 0x000e,
1022 0x0107, 0x0042, 0x0081, 0x007e, 0x0077, 0x0072, 0x00d6, 0x00ca,
1023 0x00c0, 0x00b4, 0x0155, 0x013d, 0x012d, 0x0119, 0x0106, 0x000c,
1024 0x00f9, 0x007b, 0x0079, 0x0075, 0x0071, 0x00d7, 0x00ce, 0x00c3,
1025 0x00b9, 0x015b, 0x014a, 0x0134, 0x0123, 0x0110, 0x0208, 0x000a,
1026 0x01b3, 0x0073, 0x006f, 0x006d, 0x00d3, 0x00cb, 0x00c4, 0x00bb,
1027 0x0161, 0x014c, 0x0139, 0x012a, 0x011b, 0x0213, 0x017d, 0x0011,
1028 0x01ab, 0x00d4, 0x00d0, 0x00cd, 0x00c9, 0x00c1, 0x00ba, 0x00b1,
1029 0x00a9, 0x0140, 0x012f, 0x011e, 0x010c, 0x0202, 0x0179, 0x0010,
1030 0x014f, 0x00c7, 0x00c5, 0x00bf, 0x00bd, 0x00b5, 0x00ae, 0x014d,
1031 0x0141, 0x0131, 0x0121, 0x0113, 0x0209, 0x017b, 0x0173, 0x000b,
1032 0x029c, 0x00b8, 0x00b7, 0x00b3, 0x00af, 0x0158, 0x014b, 0x013a,
1033 0x0130, 0x0122, 0x0115, 0x0212, 0x017f, 0x0175, 0x016e, 0x000a,
1034 0x028c, 0x015a, 0x00ab, 0x00a8, 0x00a4, 0x013e, 0x0135, 0x012b,
1035 0x011f, 0x0114, 0x0107, 0x0201, 0x0177, 0x0170, 0x016a, 0x0006,
1036 0x0288, 0x0142, 0x013c, 0x0138, 0x0133, 0x012e, 0x0124, 0x011c,
1037 0x010d, 0x0105, 0x0200, 0x0178, 0x0172, 0x016c, 0x0167, 0x0004,
1038 0x026c, 0x012c, 0x0128, 0x0126, 0x0120, 0x011a, 0x0111, 0x010a,
1039 0x0203, 0x017c, 0x0176, 0x0171, 0x016d, 0x0169, 0x0165, 0x0002,
1040 0x0409, 0x0118, 0x0116, 0x0112, 0x010b, 0x0108, 0x0103, 0x017e,
1041 0x017a, 0x0174, 0x016f, 0x016b, 0x0168, 0x0166, 0x0164, 0x0000,
1042 0x002b, 0x0014, 0x0013, 0x0011, 0x000f, 0x000d, 0x000b, 0x0009,
1043 0x0007, 0x0006, 0x0004, 0x0007, 0x0005, 0x0003, 0x0001, 0x0003,
1046 static immutable uint8_t
[256] mp3_huffbits_24
= [
1047 4, 4, 6, 7, 8, 9, 9, 10,
1048 10, 11, 11, 11, 11, 11, 12, 9,
1049 4, 4, 5, 6, 7, 8, 8, 9,
1050 9, 9, 10, 10, 10, 10, 10, 8,
1051 6, 5, 6, 7, 7, 8, 8, 9,
1052 9, 9, 9, 10, 10, 10, 11, 7,
1053 7, 6, 7, 7, 8, 8, 8, 9,
1054 9, 9, 9, 10, 10, 10, 10, 7,
1055 8, 7, 7, 8, 8, 8, 8, 9,
1056 9, 9, 10, 10, 10, 10, 11, 7,
1057 9, 7, 8, 8, 8, 8, 9, 9,
1058 9, 9, 10, 10, 10, 10, 10, 7,
1059 9, 8, 8, 8, 8, 9, 9, 9,
1060 9, 10, 10, 10, 10, 10, 11, 7,
1061 10, 8, 8, 8, 9, 9, 9, 9,
1062 10, 10, 10, 10, 10, 11, 11, 8,
1063 10, 9, 9, 9, 9, 9, 9, 9,
1064 9, 10, 10, 10, 10, 11, 11, 8,
1065 10, 9, 9, 9, 9, 9, 9, 10,
1066 10, 10, 10, 10, 11, 11, 11, 8,
1067 11, 9, 9, 9, 9, 10, 10, 10,
1068 10, 10, 10, 11, 11, 11, 11, 8,
1069 11, 10, 9, 9, 9, 10, 10, 10,
1070 10, 10, 10, 11, 11, 11, 11, 8,
1071 11, 10, 10, 10, 10, 10, 10, 10,
1072 10, 10, 11, 11, 11, 11, 11, 8,
1073 11, 10, 10, 10, 10, 10, 10, 10,
1074 11, 11, 11, 11, 11, 11, 11, 8,
1075 12, 10, 10, 10, 10, 10, 10, 11,
1076 11, 11, 11, 11, 11, 11, 11, 8,
1077 8, 7, 7, 7, 7, 7, 7, 7,
1078 7, 7, 7, 8, 8, 8, 8, 4,
1081 static immutable huff_table_t
[16] mp3_huff_tables
= [
1082 huff_table_t( 1, null, null ),
1083 huff_table_t( 2, mp3_huffbits_1
.ptr
, mp3_huffcodes_1
.ptr
),
1084 huff_table_t( 3, mp3_huffbits_2
.ptr
, mp3_huffcodes_2
.ptr
),
1085 huff_table_t( 3, mp3_huffbits_3
.ptr
, mp3_huffcodes_3
.ptr
),
1086 huff_table_t( 4, mp3_huffbits_5
.ptr
, mp3_huffcodes_5
.ptr
),
1087 huff_table_t( 4, mp3_huffbits_6
.ptr
, mp3_huffcodes_6
.ptr
),
1088 huff_table_t( 6, mp3_huffbits_7
.ptr
, mp3_huffcodes_7
.ptr
),
1089 huff_table_t( 6, mp3_huffbits_8
.ptr
, mp3_huffcodes_8
.ptr
),
1090 huff_table_t( 6, mp3_huffbits_9
.ptr
, mp3_huffcodes_9
.ptr
),
1091 huff_table_t( 8, mp3_huffbits_10
.ptr
, mp3_huffcodes_10
.ptr
),
1092 huff_table_t( 8, mp3_huffbits_11
.ptr
, mp3_huffcodes_11
.ptr
),
1093 huff_table_t( 8, mp3_huffbits_12
.ptr
, mp3_huffcodes_12
.ptr
),
1094 huff_table_t( 16, mp3_huffbits_13
.ptr
, mp3_huffcodes_13
.ptr
),
1095 huff_table_t( 16, mp3_huffbits_15
.ptr
, mp3_huffcodes_15
.ptr
),
1096 huff_table_t( 16, mp3_huffbits_16
.ptr
, mp3_huffcodes_16
.ptr
),
1097 huff_table_t( 16, mp3_huffbits_24
.ptr
, mp3_huffcodes_24
.ptr
),
1100 static immutable uint8_t
[2][32] mp3_huff_data
= [
1135 static immutable uint8_t
[16][2] mp3_quad_codes
= [
1136 [ 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1, ],
1137 [ 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ],
1140 static immutable uint8_t
[16][2] mp3_quad_bits
= [
1141 [ 1, 4, 4, 5, 4, 6, 5, 6, 4, 5, 5, 6, 5, 6, 6, 6, ],
1142 [ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ],
1145 static immutable uint8_t
[22][9] band_size_long
= [
1146 [ 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
1147 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158, ], /* 44100 */
1148 [ 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
1149 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192, ], /* 48000 */
1150 [ 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
1151 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26, ], /* 32000 */
1152 [ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
1153 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, ], /* 22050 */
1154 [ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
1155 18, 22, 26, 32, 38, 46, 52, 64, 70, 76, 36, ], /* 24000 */
1156 [ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
1157 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, ], /* 16000 */
1158 [ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
1159 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, ], /* 11025 */
1160 [ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
1161 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54, ], /* 12000 */
1162 [ 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
1163 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2, ], /* 8000 */
1166 static immutable uint8_t
[13][9] band_size_short
= [
1167 [ 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56, ], /* 44100 */
1168 [ 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66, ], /* 48000 */
1169 [ 4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12, ], /* 32000 */
1170 [ 4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18, ], /* 22050 */
1171 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12, ], /* 24000 */
1172 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, ], /* 16000 */
1173 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, ], /* 11025 */
1174 [ 4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18, ], /* 12000 */
1175 [ 8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26, ], /* 8000 */
1178 static immutable uint8_t
[22][2] mp3_pretab
= [
1179 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
1180 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 ],
1183 static immutable float[8] ci_table
= [
1184 -0.6f, -0.535f, -0.33f, -0.185f, -0.095f, -0.041f, -0.0142f, -0.0037f,
1187 enum C1
= FIXHR
!(0.98480775301220805936/2);
1188 enum C2
= FIXHR
!(0.93969262078590838405/2);
1189 enum C3
= FIXHR
!(0.86602540378443864676/2);
1190 enum C4
= FIXHR
!(0.76604444311897803520/2);
1191 enum C5
= FIXHR
!(0.64278760968653932632/2);
1192 enum C6
= FIXHR
!(0.5/2);
1193 enum C7
= FIXHR
!(0.34202014332566873304/2);
1194 enum C8
= FIXHR
!(0.17364817766693034885/2);
1196 static immutable int[9] icos36
= [
1197 FIXR
!(0.50190991877167369479),
1198 FIXR
!(0.51763809020504152469), //0
1199 FIXR
!(0.55168895948124587824),
1200 FIXR
!(0.61038729438072803416),
1201 FIXR
!(0.70710678118654752439), //1
1202 FIXR
!(0.87172339781054900991),
1203 FIXR
!(1.18310079157624925896),
1204 FIXR
!(1.93185165257813657349), //2
1205 FIXR
!(5.73685662283492756461),
1208 static immutable int[9] icos36h
= [
1209 FIXHR
!(0.50190991877167369479/2),
1210 FIXHR
!(0.51763809020504152469/2), //0
1211 FIXHR
!(0.55168895948124587824/2),
1212 FIXHR
!(0.61038729438072803416/2),
1213 FIXHR
!(0.70710678118654752439/2), //1
1214 FIXHR
!(0.87172339781054900991/2),
1215 FIXHR
!(1.18310079157624925896/4),
1216 FIXHR
!(1.93185165257813657349/4), //2
1217 //FIXHR!(5.73685662283492756461),
1220 ////////////////////////////////////////////////////////////////////////////////
1222 int unaligned32_be (const(uint8_t
)* p
) {
1223 static if (__VERSION__
> 2067) pragma(inline
, true);
1224 return (((p
[0]<<8) | p
[1])<<16) |
(p
[2]<<8) |
(p
[3]);
1227 enum MIN_CACHE_BITS
= 25;
1229 enum NEG_SSR32(string a
, string s
) = "((cast( int32_t)("~a
~"))>>(32-("~s
~")))";
1230 enum NEG_USR32(string a
, string s
) = "((cast(uint32_t)("~a
~"))>>(32-("~s
~")))";
1232 enum OPEN_READER(string name
, string gb
) =
1233 "int "~name
~"_index = ("~gb
~").index;\n"~
1234 "int "~name
~"_cache = 0;\n";
1236 enum CLOSE_READER(string name
, string gb
) = "("~gb
~").index = "~name
~"_index;";
1238 enum UPDATE_CACHE(string name
, string gb
) = name
~"_cache = unaligned32_be(&(("~gb
~").buffer["~name
~"_index>>3])) << ("~name
~"_index&0x07);";
1240 enum SKIP_CACHE(string name
, string gb
, string num
) = name
~"_cache <<= ("~num
~");";
1242 enum SKIP_COUNTER(string name
, string gb
, string num
) = name
~"_index += ("~num
~");";
1244 enum SKIP_BITS(string name
, string gb
, string num
) = "{"~SKIP_CACHE
!(name
, gb
, num
)~SKIP_COUNTER
!(name
, gb
, num
)~"}";
1246 enum LAST_SKIP_BITS(string name
, string gb
, string num
) = SKIP_COUNTER
!(name
, gb
, num
);
1247 enum LAST_SKIP_CACHE(string name
, string gb
, string num
) = "{}";
1249 enum SHOW_UBITS(string name
, string gb
, string num
) = NEG_USR32
!(name
~"_cache", num
);
1251 enum SHOW_SBITS(string name
, string gb
, string num
) = NEG_SSR32(name
~"_cache", num
);
1253 enum GET_CACHE(string name
, string gb
) = "(cast(uint32_t)"~name
~"_cache)";
1255 int get_bits_count() (const(bitstream_t
)* s
) { static if (__VERSION__
> 2067) pragma(inline
, true); return s
.index
; }
1257 void skip_bits_long (bitstream_t
* s
, int n
) { static if (__VERSION__
> 2067) pragma(inline
, true); s
.index
+= n
; }
1258 //#define skip_bits skip_bits_long
1259 alias skip_bits
= skip_bits_long
;
1261 void init_get_bits (bitstream_t
* s
, const(uint8_t
)* buffer
, int bit_size
) {
1262 int buffer_size
= (bit_size
+7)>>3;
1263 if (buffer_size
< 0 || bit_size
< 0) {
1264 buffer_size
= bit_size
= 0;
1268 s
.size_in_bits
= bit_size
;
1269 s
.buffer_end
= buffer
+ buffer_size
;
1273 uint get_bits (bitstream_t
* s
, int n
){
1275 mixin(OPEN_READER
!("re", "s"));
1276 mixin(UPDATE_CACHE
!("re", "s"));
1277 tmp
= mixin(SHOW_UBITS
!("re", "s", "n"));
1278 mixin(LAST_SKIP_BITS
!("re", "s", "n"));
1279 mixin(CLOSE_READER
!("re", "s"));
1283 int get_bitsz (bitstream_t
* s
, int n
) {
1284 static if (__VERSION__
> 2067) pragma(inline
, true);
1285 return (n
== 0 ?
0 : get_bits(s
, n
));
1288 uint get_bits1 (bitstream_t
* s
) {
1289 int index
= s
.index
;
1290 uint8_t result
= s
.buffer
[index
>>3];
1291 result
<<= (index
&0x07);
1298 void align_get_bits (bitstream_t
* s
) {
1299 int n
= (-get_bits_count(s
)) & 7;
1300 if (n
) skip_bits(s
, n
);
1303 enum GET_DATA(string v
, string table
, string i
, string wrap
, string size
) =
1305 " const(uint8_t)* ptr = cast(const(uint8_t)*)"~table
~"+"~i
~"*"~wrap
~";\n"~
1306 " switch ("~size
~") {\n"~
1307 " case 1: "~v
~" = *cast(const(uint8_t)*)ptr; break;\n"~
1308 " case 2: "~v
~" = *cast(const(uint16_t)*)ptr; break;\n"~
1309 " default: "~v
~" = *cast(const(uint32_t)*)ptr; break;\n"~
1314 int alloc_table (vlc_t
* vlc
, int size
) {
1316 index
= vlc
.table_size
;
1317 vlc
.table_size
+= size
;
1318 if (vlc
.table_size
> vlc
.table_allocated
) {
1319 vlc
.table_allocated
+= (1 << vlc
.bits
);
1320 vlc
.table
= cast(VT2
*)libc_realloc(vlc
.table
, VT2
.sizeof
* vlc
.table_allocated
);
1321 if (!vlc
.table
) return -1;
1328 vlc_t
* vlc
, int table_nb_bits
,
1330 const(void)* bits
, int bits_wrap
, int bits_size
,
1331 const(void)* codes
, int codes_wrap
, int codes_size
,
1332 uint32_t code_prefix
, int n_prefix
1334 int i
, j
, k
, n
, table_size
, table_index
, nb
, n1
, index
, code_prefix2
;
1336 //VLC_TYPE (*table)[2];
1339 table_size
= 1 << table_nb_bits
;
1340 table_index
= alloc_table(vlc
, table_size
);
1341 if (table_index
< 0) return -1;
1342 table
= &vlc
.table
[table_index
];
1344 for (i
= 0; i
< table_size
; i
++) {
1345 table
[i
][1] = 0; //bits
1346 table
[i
][0] = -1; //codes
1349 for (i
= 0; i
< nb_codes
; i
++) {
1350 mixin(GET_DATA
!("n", "bits", "i", "bits_wrap", "bits_size"));
1351 mixin(GET_DATA
!("code", "codes", "i", "codes_wrap", "codes_size"));
1352 if (n
<= 0) continue;
1354 code_prefix2
= code
>> n
;
1355 if (n
> 0 && code_prefix2
== code_prefix
) {
1356 if (n
<= table_nb_bits
) {
1357 j
= (code
<< (table_nb_bits
- n
)) & (table_size
- 1);
1358 nb
= 1 << (table_nb_bits
- n
);
1360 if (table
[j
][1] /*bits*/ != 0) {
1363 table
[j
][1] = cast(short)n
; //bits
1364 table
[j
][0] = cast(short)i
; //code
1369 j
= (code
>> n
) & ((1 << table_nb_bits
) - 1);
1370 n1
= -cast(int)table
[j
][1]; //bits
1373 table
[j
][1] = cast(short)(-n1
); //bits
1377 for(i
=0;i
<table_size
;i
++) {
1378 n
= table
[i
][1]; //bits
1381 if (n
> table_nb_bits
) {
1383 table
[i
][1] = cast(short)(-n
); //bits
1385 index
= build_table(vlc
, n
, nb_codes
,
1386 bits
, bits_wrap
, bits_size
,
1387 codes
, codes_wrap
, codes_size
,
1388 (code_prefix
<< table_nb_bits
) | i
,
1389 n_prefix
+ table_nb_bits
);
1392 table
= &vlc
.table
[table_index
];
1393 table
[i
][0] = cast(short)index
; //code
1400 vlc_t
*vlc
, int nb_bits
, int nb_codes
,
1401 const void *bits
, int bits_wrap
, int bits_size
,
1402 const void *codes
, int codes_wrap
, int codes_size
1405 if (build_table(vlc
, nb_bits
, nb_codes
,
1406 bits
, bits_wrap
, bits_size
,
1407 codes
, codes_wrap
, codes_size
,
1409 libc_free(vlc
.table
);
1415 enum GET_VLC(string code
, string name
, string gb
, string table
, string bits
, string max_depth
) =
1417 " int n, index, nb_bits;\n"~
1419 " index= "~SHOW_UBITS
!(name
, gb
, bits
)~";\n"~
1420 " "~code
~" = "~table
~"[index][0];\n"~
1421 " n = "~table
~"[index][1];\n"~
1423 " if ("~max_depth
~" > 1 && n < 0){\n"~
1424 " "~LAST_SKIP_BITS
!(name
, gb
, bits
)~"\n"~
1425 " "~UPDATE_CACHE
!(name
, gb
)~"\n"~
1429 " index= "~SHOW_UBITS
!(name
, gb
, "nb_bits")~" + "~code
~";\n"~
1430 " "~code
~" = "~table
~"[index][0];\n"~
1431 " n = "~table
~"[index][1];\n"~
1432 " if ("~max_depth
~" > 2 && n < 0){\n"~
1433 " "~LAST_SKIP_BITS
!(name
, gb
, "nb_bits")~"\n"~
1434 " "~UPDATE_CACHE
!(name
, gb
)~"\n"~
1438 " index= "~SHOW_UBITS
!(name
, gb
, "nb_bits")~" + "~code
~";\n"~
1439 " "~code
~" = "~table
~"[index][0];\n"~
1440 " n = "~table
~"[index][1];\n"~
1443 " "~SKIP_BITS
!(name
, gb
, "n")~"\n"~
1447 int get_vlc2(bitstream_t
*s
, VT2
* table
, int bits
, int max_depth
) {
1450 mixin(OPEN_READER
!("re", "s"));
1451 mixin(UPDATE_CACHE
!("re", "s"));
1453 mixin(GET_VLC
!("code", "re", "s", "table", "bits", "max_depth"));
1455 mixin(CLOSE_READER
!("re", "s"));
1459 void switch_buffer (mp3_context_t
*s
, int *pos
, int *end_pos
, int *end_pos2
) {
1460 if(s
.in_gb
.buffer
&& *pos
>= s
.gb
.size_in_bits
){
1462 s
.in_gb
.buffer
=null;
1463 skip_bits_long(&s
.gb
, *pos
- *end_pos
);
1465 *end_pos
= *end_pos2
+ get_bits_count(&s
.gb
) - *pos
;
1466 *pos
= get_bits_count(&s
.gb
);
1471 // ////////////////////////////////////////////////////////////////////////// //
1472 int mp3_check_header(uint32_t header
){
1473 //pragma(inline, true);
1475 if ((header
& 0xffe00000) != 0xffe00000) return -1;
1477 if ((header
& (3<<17)) != (1 << 17)) return -1;
1479 if ((header
& (0xf<<12)) == 0xf<<12) return -1;
1481 if ((header
& (3<<10)) == 3<<10) return -1;
1486 void lsf_sf_expand (int *slen
, int sf
, int n1
, int n2
, int n3
) {
1504 int l3_unscale(int value
, int exponent
)
1509 e
= table_4_3_exp
[4*value
+ (exponent
&3)];
1510 m
= table_4_3_value
[4*value
+ (exponent
&3)];
1511 e
-= (exponent
>> 2);
1514 m
= (m
+ (1 << (e
-1))) >> e
;
1519 int round_sample(int *sum
) {
1521 sum1
= (*sum
) >> OUT_SHIFT
;
1522 *sum
&= (1<<OUT_SHIFT
)-1;
1525 else if (sum1
> OUT_MAX
)
1530 void exponents_from_scale_factors (mp3_context_t
*s
, granule_t
*g
, int16_t
*exponents
) {
1531 const(uint8_t
)* bstab
, pretab
;
1532 int len
, i
, j
, k
, l
, v0
, shift
, gain
;
1536 exp_ptr
= exponents
;
1537 gain
= g
.global_gain
- 210;
1538 shift
= g
.scalefac_scale
+ 1;
1540 bstab
= band_size_long
[s
.sample_rate_index
].ptr
;
1541 pretab
= mp3_pretab
[g
.preflag
].ptr
;
1542 for(i
=0;i
<g
.long_end
;i
++) {
1543 v0
= gain
- ((g
.scale_factors
[i
] + pretab
[i
]) << shift
) + 400;
1546 *exp_ptr
++ = cast(short)v0
;
1549 if (g
.short_start
< 13) {
1550 bstab
= band_size_short
[s
.sample_rate_index
].ptr
;
1551 gains
[0] = gain
- (g
.subblock_gain
[0] << 3);
1552 gains
[1] = gain
- (g
.subblock_gain
[1] << 3);
1553 gains
[2] = gain
- (g
.subblock_gain
[2] << 3);
1555 for(i
=g
.short_start
;i
<13;i
++) {
1558 v0
= gains
[l
] - (g
.scale_factors
[k
++] << shift
) + 400;
1560 *exp_ptr
++ = cast(short)v0
;
1566 void reorder_block(mp3_context_t
*s
, granule_t
*g
)
1569 int32_t
* ptr
, dst
, ptr1
;
1572 if (g
.block_type
!= 2)
1575 if (g
.switch_point
) {
1576 if (s
.sample_rate_index
!= 8) {
1577 ptr
= g
.sb_hybrid
.ptr
+ 36;
1579 ptr
= g
.sb_hybrid
.ptr
+ 48;
1582 ptr
= g
.sb_hybrid
.ptr
;
1585 for(i
=g
.short_start
;i
<13;i
++) {
1586 len
= band_size_short
[s
.sample_rate_index
][i
];
1589 for(j
=len
;j
>0;j
--) {
1590 *dst
++ = ptr
[0*len
];
1591 *dst
++ = ptr
[1*len
];
1592 *dst
++ = ptr
[2*len
];
1596 libc_memcpy(ptr1
, tmp
.ptr
, len
* 3 * (*ptr1
).sizeof
);
1600 void compute_antialias(mp3_context_t
*s
, granule_t
*g
) {
1601 enum INT_AA(string j
) =
1602 "tmp0 = ptr[-1-"~j
~"];\n"~
1603 "tmp1 = ptr[ "~j
~"];\n"~
1604 "tmp2= cast(int)MULH(tmp0 + tmp1, csa[0+4*"~j
~"]);\n"~
1605 "ptr[-1-"~j
~"] = cast(int)(4*(tmp2 - MULH(tmp1, csa[2+4*"~j
~"])));\n"~
1606 "ptr[ "~j
~"] = cast(int)(4*(tmp2 + MULH(tmp0, csa[3+4*"~j
~"])));\n";
1611 /* we antialias only "long" bands */
1612 if (g
.block_type
== 2) {
1613 if (!g
.switch_point
)
1615 /* XXX: check this for 8000Hz case */
1621 ptr
= g
.sb_hybrid
.ptr
+ 18;
1622 for(i
= n
;i
> 0;i
--) {
1623 int tmp0
, tmp1
, tmp2
;
1624 csa
= &csa_table
[0][0];
1626 mixin(INT_AA
!("0"));
1627 mixin(INT_AA
!("1"));
1628 mixin(INT_AA
!("2"));
1629 mixin(INT_AA
!("3"));
1630 mixin(INT_AA
!("4"));
1631 mixin(INT_AA
!("5"));
1632 mixin(INT_AA
!("6"));
1633 mixin(INT_AA
!("7"));
1639 void compute_stereo (mp3_context_t
*s
, granule_t
*g0
, granule_t
*g1
) {
1642 int sf_max
, tmp0
, tmp1
, sf
, len
, non_zero_found
;
1643 int32_t
[16]* is_tab
;
1644 int32_t
* tab0
, tab1
;
1645 int[3] non_zero_found_short
;
1647 if (s
.mode_ext
& MODE_EXT_I_STEREO
) {
1649 is_tab
= is_table
.ptr
;
1652 is_tab
= is_table_lsf
[g1
.scalefac_compress
& 1].ptr
;
1656 tab0
= g0
.sb_hybrid
.ptr
+ 576;
1657 tab1
= g1
.sb_hybrid
.ptr
+ 576;
1659 non_zero_found_short
[0] = 0;
1660 non_zero_found_short
[1] = 0;
1661 non_zero_found_short
[2] = 0;
1662 k
= (13 - g1
.short_start
) * 3 + g1
.long_end
- 3;
1663 for(i
= 12;i
>= g1
.short_start
;i
--) {
1664 /* for last band, use previous scale factor */
1667 len
= band_size_short
[s
.sample_rate_index
][i
];
1671 if (!non_zero_found_short
[l
]) {
1672 /* test if non zero band. if so, stop doing i-stereo */
1673 for(j
=0;j
<len
;j
++) {
1675 non_zero_found_short
[l
] = 1;
1679 sf
= g1
.scale_factors
[k
+ l
];
1685 for(j
=0;j
<len
;j
++) {
1687 tab0
[j
] = cast(int)MULL(tmp0
, v1
);
1688 tab1
[j
] = cast(int)MULL(tmp0
, v2
);
1692 if (s
.mode_ext
& MODE_EXT_MS_STEREO
) {
1693 /* lower part of the spectrum : do ms stereo
1695 for(j
=0;j
<len
;j
++) {
1698 tab0
[j
] = cast(int)MULL(tmp0
+ tmp1
, ISQRT2
);
1699 tab1
[j
] = cast(int)MULL(tmp0
- tmp1
, ISQRT2
);
1706 non_zero_found
= non_zero_found_short
[0] |
1707 non_zero_found_short
[1] |
1708 non_zero_found_short
[2];
1710 for(i
= g1
.long_end
- 1;i
>= 0;i
--) {
1711 len
= band_size_long
[s
.sample_rate_index
][i
];
1714 /* test if non zero band. if so, stop doing i-stereo */
1715 if (!non_zero_found
) {
1716 for(j
=0;j
<len
;j
++) {
1722 /* for last band, use previous scale factor */
1723 k
= (i
== 21) ?
20 : i
;
1724 sf
= g1
.scale_factors
[k
];
1729 for(j
=0;j
<len
;j
++) {
1731 tab0
[j
] = cast(int)MULL(tmp0
, v1
);
1732 tab1
[j
] = cast(int)MULL(tmp0
, v2
);
1736 if (s
.mode_ext
& MODE_EXT_MS_STEREO
) {
1737 /* lower part of the spectrum : do ms stereo
1739 for(j
=0;j
<len
;j
++) {
1742 tab0
[j
] = cast(int)MULL(tmp0
+ tmp1
, ISQRT2
);
1743 tab1
[j
] = cast(int)MULL(tmp0
- tmp1
, ISQRT2
);
1748 } else if (s
.mode_ext
& MODE_EXT_MS_STEREO
) {
1749 /* ms stereo ONLY */
1750 /* NOTE: the 1/sqrt(2) normalization factor is included in the
1752 tab0
= g0
.sb_hybrid
.ptr
;
1753 tab1
= g1
.sb_hybrid
.ptr
;
1754 for(i
=0;i
<576;i
++) {
1757 tab0
[i
] = tmp0
+ tmp1
;
1758 tab1
[i
] = tmp0
- tmp1
;
1763 int huffman_decode (mp3_context_t
*s
, granule_t
*g
, int16_t
*exponents
, int end_pos2
) {
1766 int last_pos
, bits_left
;
1768 int end_pos
= s
.gb
.size_in_bits
;
1769 if (end_pos2
< end_pos
) end_pos
= end_pos2
;
1771 /* low frequencies (called big values) */
1774 int j
, k
, l
, linbits
;
1775 j
= g
.region_size
[i
];
1778 /* select vlc table */
1779 k
= g
.table_select
[i
];
1780 l
= mp3_huff_data
[k
][0];
1781 linbits
= mp3_huff_data
[k
][1];
1785 libc_memset(&g
.sb_hybrid
[s_index
], 0, (g
.sb_hybrid
[0]).sizeof
*2*j
);
1790 /* read huffcode and compute each couple */
1792 int exponent
, x
, y
, v
;
1793 int pos
= get_bits_count(&s
.gb
);
1795 if (pos
>= end_pos
){
1796 switch_buffer(s
, &pos
, &end_pos
, &end_pos2
);
1800 y
= get_vlc2(&s
.gb
, vlc
.table
, 7, 3);
1803 g
.sb_hybrid
[s_index
] =
1804 g
.sb_hybrid
[s_index
+1] = 0;
1809 exponent
= exponents
[s_index
];
1815 v
= expval_table
[ exponent
][ x
];
1817 x
+= get_bitsz(&s
.gb
, linbits
);
1818 v
= l3_unscale(x
, exponent
);
1820 if (get_bits1(&s
.gb
))
1822 g
.sb_hybrid
[s_index
] = v
;
1824 v
= expval_table
[ exponent
][ y
];
1826 y
+= get_bitsz(&s
.gb
, linbits
);
1827 v
= l3_unscale(y
, exponent
);
1829 if (get_bits1(&s
.gb
))
1831 g
.sb_hybrid
[s_index
+1] = v
;
1837 v
= expval_table
[ exponent
][ x
];
1839 x
+= get_bitsz(&s
.gb
, linbits
);
1840 v
= l3_unscale(x
, exponent
);
1842 if (get_bits1(&s
.gb
))
1844 g
.sb_hybrid
[s_index
+!!y
] = v
;
1845 g
.sb_hybrid
[s_index
+ !y
] = 0;
1851 /* high frequencies */
1852 vlc
= &huff_quad_vlc
[g
.count1table_select
];
1854 while (s_index
<= 572) {
1856 pos
= get_bits_count(&s
.gb
);
1857 if (pos
>= end_pos
) {
1858 if (pos
> end_pos2
&& last_pos
){
1859 /* some encoders generate an incorrect size for this
1860 part. We must go back into the data */
1862 skip_bits_long(&s
.gb
, last_pos
- pos
);
1865 switch_buffer(s
, &pos
, &end_pos
, &end_pos2
);
1871 code
= get_vlc2(&s
.gb
, vlc
.table
, vlc
.bits
, 1);
1872 g
.sb_hybrid
[s_index
+0]=
1873 g
.sb_hybrid
[s_index
+1]=
1874 g
.sb_hybrid
[s_index
+2]=
1875 g
.sb_hybrid
[s_index
+3]= 0;
1877 static immutable int[16] idxtab
= [3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0];
1879 int pos_
= s_index
+idxtab
[code
];
1880 code ^
= 8>>idxtab
[code
];
1881 v
= exp_table
[ exponents
[pos_
] ];
1882 if(get_bits1(&s
.gb
))
1884 g
.sb_hybrid
[pos_
] = v
;
1889 if (s_index >= g.sb_hybrid.length) {
1890 import core.stdc.stdio : printf;
1891 printf("s_index=%u; len=%u; len=%u\n", cast(uint)s_index, cast(uint)g.sb_hybrid.length, cast(uint)((g.sb_hybrid[0]).sizeof*(576 - s_index)));
1895 if ((g
.sb_hybrid
[0]).sizeof
*(576 - s_index
) > 0) {
1896 libc_memset(&g
.sb_hybrid
[s_index
], 0, (g
.sb_hybrid
[0]).sizeof
*(576 - s_index
));
1899 /* skip extension bits */
1900 bits_left
= end_pos2
- get_bits_count(&s
.gb
);
1901 if (bits_left
< 0) {
1904 skip_bits_long(&s
.gb
, bits_left
);
1906 i
= get_bits_count(&s
.gb
);
1907 switch_buffer(s
, &i
, &end_pos
, &end_pos2
);
1913 // ////////////////////////////////////////////////////////////////////////// //
1914 void imdct12(int *out_
, int *in_
)
1916 int in0
, in1
, in2
, in3
, in4
, in5
, t1
, t2
;
1919 in1
= in_
[1*3] + in_
[0*3];
1920 in2
= in_
[2*3] + in_
[1*3];
1921 in3
= in_
[3*3] + in_
[2*3];
1922 in4
= in_
[4*3] + in_
[3*3];
1923 in5
= in_
[5*3] + in_
[4*3];
1927 in2
= cast(int)MULH(2*in2
, C3
);
1928 in3
= cast(int)MULH(4*in3
, C3
);
1931 t2
= cast(int)MULH(2*(in1
- in5
), icos36h
[4]);
1941 in1
= cast(int)MULH(in5
+ in3
, icos36h
[1]);
1943 out_
[ 9]= in4
+ in1
;
1945 out_
[ 3]= in4
- in1
;
1948 in5
= cast(int)MULH(2*(in5
- in3
), icos36h
[7]);
1950 out_
[ 5]= in0
- in5
;
1952 out_
[11]= in0
+ in5
;
1955 void imdct36(int *out_
, int *buf
, int *in_
, int *win
)
1957 int i
, j
, t0
, t1
, t2
, t3
, s0
, s1
, s2
, s3
;
1969 t2
= in1
[2*4] + in1
[2*8] - in1
[2*2];
1971 t3
= in1
[2*0] + (in1
[2*6]>>1);
1972 t1
= in1
[2*0] - in1
[2*6];
1973 tmp1
[ 6] = t1
- (t2
>>1);
1976 t0
= cast(int)MULH(2*(in1
[2*2] + in1
[2*4]), C2
);
1977 t1
= cast(int)MULH( in1
[2*4] - in1
[2*8] , -2*C8
);
1978 t2
= cast(int)MULH(2*(in1
[2*2] + in1
[2*8]), -C4
);
1980 tmp1
[10] = t3
- t0
- t2
;
1981 tmp1
[ 2] = t3
+ t0
+ t1
;
1982 tmp1
[14] = t3
+ t2
- t1
;
1984 tmp1
[ 4] = cast(int)MULH(2*(in1
[2*5] + in1
[2*7] - in1
[2*1]), -C3
);
1985 t2
= cast(int)MULH(2*(in1
[2*1] + in1
[2*5]), C1
);
1986 t3
= cast(int)MULH( in1
[2*5] - in1
[2*7] , -2*C7
);
1987 t0
= cast(int)MULH(2*in1
[2*3], C3
);
1989 t1
= cast(int)MULH(2*(in1
[2*1] + in1
[2*7]), -C5
);
1991 tmp1
[ 0] = t2
+ t3
+ t0
;
1992 tmp1
[12] = t2
+ t1
- t0
;
1993 tmp1
[ 8] = t3
- t1
- t0
;
2005 s1
= cast(int)MULH(2*(t3
+ t2
), icos36h
[j
]);
2006 s3
= cast(int)MULL(t3
- t2
, icos36
[8 - j
]);
2010 out_
[(9 + j
)*SBLIMIT
] = cast(int)MULH(t1
, win
[9 + j
]) + buf
[9 + j
];
2011 out_
[(8 - j
)*SBLIMIT
] = cast(int)MULH(t1
, win
[8 - j
]) + buf
[8 - j
];
2012 buf
[9 + j
] = cast(int)MULH(t0
, win
[18 + 9 + j
]);
2013 buf
[8 - j
] = cast(int)MULH(t0
, win
[18 + 8 - j
]);
2017 out_
[(9 + 8 - j
)*SBLIMIT
] = cast(int)MULH(t1
, win
[9 + 8 - j
]) + buf
[9 + 8 - j
];
2018 out_
[( j
)*SBLIMIT
] = cast(int)MULH(t1
, win
[ j
]) + buf
[ j
];
2019 buf
[9 + 8 - j
] = cast(int)MULH(t0
, win
[18 + 9 + 8 - j
]);
2020 buf
[ + j
] = cast(int)MULH(t0
, win
[18 + j
]);
2025 s1
= cast(int)MULH(2*tmp
[17], icos36h
[4]);
2028 out_
[(9 + 4)*SBLIMIT
] = cast(int)MULH(t1
, win
[9 + 4]) + buf
[9 + 4];
2029 out_
[(8 - 4)*SBLIMIT
] = cast(int)MULH(t1
, win
[8 - 4]) + buf
[8 - 4];
2030 buf
[9 + 4] = cast(int)MULH(t0
, win
[18 + 9 + 4]);
2031 buf
[8 - 4] = cast(int)MULH(t0
, win
[18 + 8 - 4]);
2034 void compute_imdct (mp3_context_t
*s
, granule_t
*g
, int32_t
*sb_samples
, int32_t
*mdct_buf
) {
2035 int32_t
* ptr
, win
, win1
, buf
, out_ptr
, ptr1
;
2037 int i
, j
, mdct_long_end
, v
, sblimit
;
2039 /* find last non zero block */
2040 ptr
= g
.sb_hybrid
.ptr
+ 576;
2041 ptr1
= g
.sb_hybrid
.ptr
+ 2 * 18;
2042 while (ptr
>= ptr1
) {
2044 v
= ptr
[0] | ptr
[1] | ptr
[2] | ptr
[3] | ptr
[4] | ptr
[5];
2048 sblimit
= cast(int)((ptr
- g
.sb_hybrid
.ptr
) / 18) + 1;
2050 if (g
.block_type
== 2) {
2051 /* XXX: check for 8000 Hz */
2057 mdct_long_end
= sblimit
;
2061 ptr
= g
.sb_hybrid
.ptr
;
2062 for(j
=0;j
<mdct_long_end
;j
++) {
2063 /* apply window & overlap with previous buffer */
2064 out_ptr
= sb_samples
+ j
;
2066 if (g
.switch_point
&& j
< 2)
2067 win1
= mdct_win
[0].ptr
;
2069 win1
= mdct_win
[g
.block_type
].ptr
;
2070 /* select frequency inversion */
2071 win
= win1
+ ((4 * 36) & -(j
& 1));
2072 imdct36(out_ptr
, buf
, ptr
, win
);
2073 out_ptr
+= 18*SBLIMIT
;
2077 for(j
=mdct_long_end
;j
<sblimit
;j
++) {
2078 /* select frequency inversion */
2079 win
= mdct_win
[2].ptr
+ ((4 * 36) & -(j
& 1));
2080 out_ptr
= sb_samples
+ j
;
2086 imdct12(out2
.ptr
, ptr
+ 0);
2088 *out_ptr
= cast(int)MULH(out2
[i
], win
[i
]) + buf
[i
+ 6*1];
2089 buf
[i
+ 6*2] = cast(int)MULH(out2
[i
+ 6], win
[i
+ 6]);
2092 imdct12(out2
.ptr
, ptr
+ 1);
2094 *out_ptr
= cast(int)MULH(out2
[i
], win
[i
]) + buf
[i
+ 6*2];
2095 buf
[i
+ 6*0] = cast(int)MULH(out2
[i
+ 6], win
[i
+ 6]);
2098 imdct12(out2
.ptr
, ptr
+ 2);
2100 buf
[i
+ 6*0] = cast(int)MULH(out2
[i
], win
[i
]) + buf
[i
+ 6*0];
2101 buf
[i
+ 6*1] = cast(int)MULH(out2
[i
+ 6], win
[i
+ 6]);
2108 for(j
=sblimit
;j
<SBLIMIT
;j
++) {
2110 out_ptr
= sb_samples
+ j
;
2120 enum SUM8(string sum
, string op
, string w
, string p
) =
2122 " "~sum
~" "~op
~" MULS(("~w
~")[0 * 64], "~p
~"[0 * 64]);\n"~
2123 " "~sum
~" "~op
~" MULS(("~w
~")[1 * 64], "~p
~"[1 * 64]);\n"~
2124 " "~sum
~" "~op
~" MULS(("~w
~")[2 * 64], "~p
~"[2 * 64]);\n"~
2125 " "~sum
~" "~op
~" MULS(("~w
~")[3 * 64], "~p
~"[3 * 64]);\n"~
2126 " "~sum
~" "~op
~" MULS(("~w
~")[4 * 64], "~p
~"[4 * 64]);\n"~
2127 " "~sum
~" "~op
~" MULS(("~w
~")[5 * 64], "~p
~"[5 * 64]);\n"~
2128 " "~sum
~" "~op
~" MULS(("~w
~")[6 * 64], "~p
~"[6 * 64]);\n"~
2129 " "~sum
~" "~op
~" MULS(("~w
~")[7 * 64], "~p
~"[7 * 64]);\n"~
2132 enum SUM8P2(string sum1
, string op1
, string sum2
, string op2
, string w1
, string w2
, string p
) =
2135 " tmp_ = "~p
~"[0 * 64];\n"~
2136 " "~sum1
~" "~op1
~" MULS(("~w1
~")[0 * 64], tmp_);\n"~
2137 " "~sum2
~" "~op2
~" MULS(("~w2
~")[0 * 64], tmp_);\n"~
2138 " tmp_ = "~p
~"[1 * 64];\n"~
2139 " "~sum1
~" "~op1
~" MULS(("~w1
~")[1 * 64], tmp_);\n"~
2140 " "~sum2
~" "~op2
~" MULS(("~w2
~")[1 * 64], tmp_);\n"~
2141 " tmp_ = "~p
~"[2 * 64];\n"~
2142 " "~sum1
~" "~op1
~" MULS(("~w1
~")[2 * 64], tmp_);\n"~
2143 " "~sum2
~" "~op2
~" MULS(("~w2
~")[2 * 64], tmp_);\n"~
2144 " tmp_ = "~p
~"[3 * 64];\n"~
2145 " "~sum1
~" "~op1
~" MULS(("~w1
~")[3 * 64], tmp_);\n"~
2146 " "~sum2
~" "~op2
~" MULS(("~w2
~")[3 * 64], tmp_);\n"~
2147 " tmp_ = "~p
~"[4 * 64];\n"~
2148 " "~sum1
~" "~op1
~" MULS(("~w1
~")[4 * 64], tmp_);\n"~
2149 " "~sum2
~" "~op2
~" MULS(("~w2
~")[4 * 64], tmp_);\n"~
2150 " tmp_ = "~p
~"[5 * 64];\n"~
2151 " "~sum1
~" "~op1
~" MULS(("~w1
~")[5 * 64], tmp_);\n"~
2152 " "~sum2
~" "~op2
~" MULS(("~w2
~")[5 * 64], tmp_);\n"~
2153 " tmp_ = "~p
~"[6 * 64];\n"~
2154 " "~sum1
~" "~op1
~" MULS(("~w1
~")[6 * 64], tmp_);\n"~
2155 " "~sum2
~" "~op2
~" MULS(("~w2
~")[6 * 64], tmp_);\n"~
2156 " tmp_ = "~p
~"[7 * 64];\n"~
2157 " "~sum1
~" "~op1
~" MULS(("~w1
~")[7 * 64], tmp_);\n"~
2158 " "~sum2
~" "~op2
~" MULS(("~w2
~")[7 * 64], tmp_);\n"~
2161 enum COS0_0
= FIXHR
!(0.50060299823519630134/2);
2162 enum COS0_1
= FIXHR
!(0.50547095989754365998/2);
2163 enum COS0_2
= FIXHR
!(0.51544730992262454697/2);
2164 enum COS0_3
= FIXHR
!(0.53104259108978417447/2);
2165 enum COS0_4
= FIXHR
!(0.55310389603444452782/2);
2166 enum COS0_5
= FIXHR
!(0.58293496820613387367/2);
2167 enum COS0_6
= FIXHR
!(0.62250412303566481615/2);
2168 enum COS0_7
= FIXHR
!(0.67480834145500574602/2);
2169 enum COS0_8
= FIXHR
!(0.74453627100229844977/2);
2170 enum COS0_9
= FIXHR
!(0.83934964541552703873/2);
2171 enum COS0_10
= FIXHR
!(0.97256823786196069369/2);
2172 enum COS0_11
= FIXHR
!(1.16943993343288495515/4);
2173 enum COS0_12
= FIXHR
!(1.48416461631416627724/4);
2174 enum COS0_13
= FIXHR
!(2.05778100995341155085/8);
2175 enum COS0_14
= FIXHR
!(3.40760841846871878570/8);
2176 enum COS0_15
= FIXHR
!(10.19000812354805681150/32);
2178 enum COS1_0
= FIXHR
!(0.50241928618815570551/2);
2179 enum COS1_1
= FIXHR
!(0.52249861493968888062/2);
2180 enum COS1_2
= FIXHR
!(0.56694403481635770368/2);
2181 enum COS1_3
= FIXHR
!(0.64682178335999012954/2);
2182 enum COS1_4
= FIXHR
!(0.78815462345125022473/2);
2183 enum COS1_5
= FIXHR
!(1.06067768599034747134/4);
2184 enum COS1_6
= FIXHR
!(1.72244709823833392782/4);
2185 enum COS1_7
= FIXHR
!(5.10114861868916385802/16);
2187 enum COS2_0
= FIXHR
!(0.50979557910415916894/2);
2188 enum COS2_1
= FIXHR
!(0.60134488693504528054/2);
2189 enum COS2_2
= FIXHR
!(0.89997622313641570463/2);
2190 enum COS2_3
= FIXHR
!(2.56291544774150617881/8);
2192 enum COS3_0
= FIXHR
!(0.54119610014619698439/2);
2193 enum COS3_1
= FIXHR
!(1.30656296487637652785/4);
2195 enum COS4_0
= FIXHR
!(0.70710678118654752439/2);
2197 enum BF(string a
, string b
, string c
, string s
) =
2199 " tmp0 = tab["~a
~"] + tab["~b
~"];\n"~
2200 " tmp1 = tab["~a
~"] - tab["~b
~"];\n"~
2201 " tab["~a
~"] = tmp0;\n"~
2202 " tab["~b
~"] = cast(int)MULH(tmp1<<("~s
~"), "~c
~");\n"~
2205 enum BF1(string a
, string b
, string c
, string d
) =
2207 " "~BF
!(a
, b
, "COS4_0", "1")~"\n"~
2208 " "~BF
!(c
, d
,"-COS4_0", "1")~"\n"~
2209 " tab["~c
~"] += tab["~d
~"];\n"~
2212 enum BF2(string a
, string b
, string c
, string d
) =
2214 " "~BF
!(a
, b
, "COS4_0", "1")~"\n"~
2215 " "~BF
!(c
, d
,"-COS4_0", "1")~"\n"~
2216 " tab["~c
~"] += tab["~d
~"];\n"~
2217 " tab["~a
~"] += tab["~c
~"];\n"~
2218 " tab["~c
~"] += tab["~b
~"];\n"~
2219 " tab["~b
~"] += tab["~d
~"];\n"~
2222 void dct32(int32_t
*out_
, int32_t
*tab
) {
2226 mixin(BF
!("0", "31", "COS0_0", "1"));
2227 mixin(BF
!("15", "16", "COS0_15", "5"));
2229 mixin(BF
!("0", "15", "COS1_0", "1"));
2230 mixin(BF
!("16", "31", "-COS1_0", "1"));
2232 mixin(BF
!("7", "24", "COS0_7", "1"));
2233 mixin(BF
!("8", "23", "COS0_8", "1"));
2235 mixin(BF
!("7", "8", "COS1_7", "4"));
2236 mixin(BF
!("23", "24", "-COS1_7", "4"));
2238 mixin(BF
!("0", "7", "COS2_0", "1"));
2239 mixin(BF
!("8", "15", "-COS2_0", "1"));
2240 mixin(BF
!("16", "23", "COS2_0", "1"));
2241 mixin(BF
!("24", "31", "-COS2_0", "1"));
2243 mixin(BF
!("3", "28", "COS0_3", "1"));
2244 mixin(BF
!("12", "19", "COS0_12", "2"));
2246 mixin(BF
!("3", "12", "COS1_3", "1"));
2247 mixin(BF
!("19", "28", "-COS1_3", "1"));
2249 mixin(BF
!("4", "27", "COS0_4", "1"));
2250 mixin(BF
!("11", "20", "COS0_11", "2"));
2252 mixin(BF
!("4", "11", "COS1_4", "1"));
2253 mixin(BF
!("20", "27", "-COS1_4", "1"));
2255 mixin(BF
!("3", "4", "COS2_3", "3"));
2256 mixin(BF
!("11", "12", "-COS2_3", "3"));
2257 mixin(BF
!("19", "20", "COS2_3", "3"));
2258 mixin(BF
!("27", "28", "-COS2_3", "3"));
2260 mixin(BF
!("0", "3", "COS3_0", "1"));
2261 mixin(BF
!("4", "7", "-COS3_0", "1"));
2262 mixin(BF
!("8", "11", "COS3_0", "1"));
2263 mixin(BF
!("12", "15", "-COS3_0", "1"));
2264 mixin(BF
!("16", "19", "COS3_0", "1"));
2265 mixin(BF
!("20", "23", "-COS3_0", "1"));
2266 mixin(BF
!("24", "27", "COS3_0", "1"));
2267 mixin(BF
!("28", "31", "-COS3_0", "1"));
2272 mixin(BF
!("1", "30", "COS0_1", "1"));
2273 mixin(BF
!("14", "17", "COS0_14", "3"));
2275 mixin(BF
!("1", "14", "COS1_1", "1"));
2276 mixin(BF
!("17", "30", "-COS1_1", "1"));
2278 mixin(BF
!("6", "25", "COS0_6", "1"));
2279 mixin(BF
!("9", "22", "COS0_9", "1"));
2281 mixin(BF
!("6", "9", "COS1_6", "2"));
2282 mixin(BF
!("22", "25", "-COS1_6", "2"));
2284 mixin(BF
!("1", "6", "COS2_1", "1"));
2285 mixin(BF
!("9", "14", "-COS2_1", "1"));
2286 mixin(BF
!("17", "22", "COS2_1", "1"));
2287 mixin(BF
!("25", "30", "-COS2_1", "1"));
2290 mixin(BF
!("2", "29", "COS0_2", "1"));
2291 mixin(BF
!("13", "18", "COS0_13", "3"));
2293 mixin(BF
!("2", "13", "COS1_2", "1"));
2294 mixin(BF
!("18", "29", "-COS1_2", "1"));
2296 mixin(BF
!("5", "26", "COS0_5", "1"));
2297 mixin(BF
!("10", "21", "COS0_10", "1"));
2299 mixin(BF
!("5", "10", "COS1_5", "2"));
2300 mixin(BF
!("21", "26", "-COS1_5", "2"));
2302 mixin(BF
!("2", "5", "COS2_2", "1"));
2303 mixin(BF
!("10", "13", "-COS2_2", "1"));
2304 mixin(BF
!("18", "21", "COS2_2", "1"));
2305 mixin(BF
!("26", "29", "-COS2_2", "1"));
2307 mixin(BF
!("1", "2", "COS3_1", "2"));
2308 mixin(BF
!("5", "6", "-COS3_1", "2"));
2309 mixin(BF
!("9", "10", "COS3_1", "2"));
2310 mixin(BF
!("13", "14", "-COS3_1", "2"));
2311 mixin(BF
!("17", "18", "COS3_1", "2"));
2312 mixin(BF
!("21", "22", "-COS3_1", "2"));
2313 mixin(BF
!("25", "26", "COS3_1", "2"));
2314 mixin(BF
!("29", "30", "-COS3_1", "2"));
2317 mixin(BF1
!("0", "1", "2", "3"));
2318 mixin(BF2
!("4", "5", "6", "7"));
2319 mixin(BF1
!("8", "9", "10", "11"));
2320 mixin(BF2
!("12", "13", "14", "15"));
2321 mixin(BF1
!("16", "17", "18", "19"));
2322 mixin(BF2
!("20", "21", "22", "23"));
2323 mixin(BF1
!("24", "25", "26", "27"));
2324 mixin(BF2
!("28", "29", "30", "31"));
2361 out_
[ 1] = tab
[16] + tab
[24];
2362 out_
[17] = tab
[17] + tab
[25];
2363 out_
[ 9] = tab
[18] + tab
[26];
2364 out_
[25] = tab
[19] + tab
[27];
2365 out_
[ 5] = tab
[20] + tab
[28];
2366 out_
[21] = tab
[21] + tab
[29];
2367 out_
[13] = tab
[22] + tab
[30];
2368 out_
[29] = tab
[23] + tab
[31];
2369 out_
[ 3] = tab
[24] + tab
[20];
2370 out_
[19] = tab
[25] + tab
[21];
2371 out_
[11] = tab
[26] + tab
[22];
2372 out_
[27] = tab
[27] + tab
[23];
2373 out_
[ 7] = tab
[28] + tab
[18];
2374 out_
[23] = tab
[29] + tab
[19];
2375 out_
[15] = tab
[30] + tab
[17];
2379 void mp3_synth_filter(
2380 int16_t
*synth_buf_ptr
, int *synth_buf_offset
,
2381 int16_t
*window
, int *dither_state
,
2382 int16_t
*samples
, int incr
,
2383 int32_t
* sb_samples
/*[SBLIMIT]*/
2387 const(int16_t
)* w
, w2
, p
;
2392 dct32(tmp
.ptr
, sb_samples
);
2394 offset
= *synth_buf_offset
;
2395 synth_buf
= synth_buf_ptr
+ offset
;
2399 /* NOTE: can cause a loss in precision if very high amplitude
2403 else if (v
< -32768)
2405 synth_buf
[j
] = cast(short)v
;
2407 /* copy to avoid wrap */
2408 libc_memcpy(synth_buf
+ 512, synth_buf
, 32 * int16_t
.sizeof
);
2410 samples2
= samples
+ 31 * incr
;
2414 sum
= *dither_state
;
2416 mixin(SUM8
!("sum", "+=", "w", "p"));
2418 mixin(SUM8
!("sum", "-=", "w + 32", "p"));
2419 *samples
= cast(short)round_sample(&sum
);
2423 /* we calculate two samples at the same time to avoid one memory
2424 access per two sample */
2427 p
= synth_buf
+ 16 + j
;
2428 mixin(SUM8P2
!("sum", "+=", "sum2", "-=", "w", "w2", "p"));
2429 p
= synth_buf
+ 48 - j
;
2430 mixin(SUM8P2
!("sum", "-=", "sum2", "-=", "w + 32", "w2 + 32", "p"));
2432 *samples
= cast(short)round_sample(&sum
);
2435 *samples2
= cast(short)round_sample(&sum
);
2442 mixin(SUM8
!("sum", "-=", "w + 32", "p"));
2443 *samples
= cast(short)round_sample(&sum
);
2446 offset
= (offset
- 32) & 511;
2447 *synth_buf_offset
= offset
;
2451 // ////////////////////////////////////////////////////////////////////////// //
2452 int decode_header(mp3_context_t
*s
, uint32_t header
) {
2453 static immutable short[4][4] sampleCount
= [
2454 [0, 576, 1152, 384], // v2.5
2455 [0, 0, 0, 0], // reserved
2456 [0, 576, 1152, 384], // v2
2457 [0, 1152, 1152, 384], // v1
2459 ubyte mpid
= (header
>>19)&0x03;
2460 ubyte layer
= (header
>>17)&0x03;
2462 s
.sample_count
= sampleCount
.ptr
[mpid
].ptr
[layer
];
2464 int sample_rate
, frame_size
, mpeg25
, padding
;
2465 int sample_rate_index
, bitrate_index
;
2466 if (header
& (1<<20)) {
2467 s
.lsf
= (header
& (1<<19)) ?
0 : 1;
2474 sample_rate_index
= (header
>> 10) & 3;
2475 sample_rate
= mp3_freq_tab
[sample_rate_index
] >> (s
.lsf
+ mpeg25
);
2476 sample_rate_index
+= 3 * (s
.lsf
+ mpeg25
);
2477 s
.sample_rate_index
= sample_rate_index
;
2478 s
.error_protection
= ((header
>> 16) & 1) ^
1;
2479 s
.sample_rate
= sample_rate
;
2481 bitrate_index
= (header
>> 12) & 0xf;
2482 padding
= (header
>> 9) & 1;
2483 s
.mode
= (header
>> 6) & 3;
2484 s
.mode_ext
= (header
>> 4) & 3;
2485 s
.nb_channels
= (s
.mode
== MP3_MONO
) ?
1 : 2;
2487 if (bitrate_index
!= 0) {
2488 frame_size
= mp3_bitrate_tab
[s
.lsf
][bitrate_index
];
2489 s
.bit_rate
= frame_size
* 1000;
2490 s
.frame_size
= (frame_size
* 144000) / (sample_rate
<< s
.lsf
) + padding
;
2492 /* if no frame size computed, signal it */
2498 int mp_decode_layer3(mp3_context_t
*s
) {
2499 int nb_granules
, main_data_begin
, private_bits
;
2500 int gr
, ch
, blocksplit_flag
, i
, j
, k
, n
, bits_pos
;
2502 static granule_t
[2][2] granules
;
2503 static int16_t
[576] exponents
;
2504 const(uint8_t
)* ptr
;
2507 main_data_begin
= get_bits(&s
.gb
, 8);
2508 private_bits
= get_bits(&s
.gb
, s
.nb_channels
);
2511 main_data_begin
= get_bits(&s
.gb
, 9);
2512 if (s
.nb_channels
== 2)
2513 private_bits
= get_bits(&s
.gb
, 3);
2515 private_bits
= get_bits(&s
.gb
, 5);
2517 for(ch
=0;ch
<s
.nb_channels
;ch
++) {
2518 granules
[ch
][0].scfsi
= 0; /* all scale factors are transmitted */
2519 granules
[ch
][1].scfsi
= cast(ubyte)get_bits(&s
.gb
, 4);
2523 for(gr
=0;gr
<nb_granules
;gr
++) {
2524 for(ch
=0;ch
<s
.nb_channels
;ch
++) {
2525 g
= &granules
[ch
][gr
];
2526 g
.part2_3_length
= get_bits(&s
.gb
, 12);
2527 g
.big_values
= get_bits(&s
.gb
, 9);
2528 g
.global_gain
= get_bits(&s
.gb
, 8);
2529 /* if MS stereo only is selected, we precompute the
2530 1/sqrt(2) renormalization factor */
2531 if ((s
.mode_ext
& (MODE_EXT_MS_STEREO | MODE_EXT_I_STEREO
)) ==
2535 g
.scalefac_compress
= get_bits(&s
.gb
, 9);
2537 g
.scalefac_compress
= get_bits(&s
.gb
, 4);
2538 blocksplit_flag
= get_bits(&s
.gb
, 1);
2539 if (blocksplit_flag
) {
2540 g
.block_type
= cast(ubyte)get_bits(&s
.gb
, 2);
2541 if (g
.block_type
== 0)
2543 g
.switch_point
= cast(ubyte)get_bits(&s
.gb
, 1);
2545 g
.table_select
[i
] = get_bits(&s
.gb
, 5);
2547 g
.subblock_gain
[i
] = get_bits(&s
.gb
, 3);
2548 /* compute huffman coded region sizes */
2549 if (g
.block_type
== 2)
2550 g
.region_size
[0] = (36 / 2);
2552 if (s
.sample_rate_index
<= 2)
2553 g
.region_size
[0] = (36 / 2);
2554 else if (s
.sample_rate_index
!= 8)
2555 g
.region_size
[0] = (54 / 2);
2557 g
.region_size
[0] = (108 / 2);
2559 g
.region_size
[1] = (576 / 2);
2561 int region_address1
, region_address2
, l
;
2565 g
.table_select
[i
] = get_bits(&s
.gb
, 5);
2566 /* compute huffman coded region sizes */
2567 region_address1
= get_bits(&s
.gb
, 4);
2568 region_address2
= get_bits(&s
.gb
, 3);
2570 band_index_long
[s
.sample_rate_index
][region_address1
+ 1] >> 1;
2571 l
= region_address1
+ region_address2
+ 2;
2572 /* should not overflow */
2576 band_index_long
[s
.sample_rate_index
][l
] >> 1;
2578 /* convert region offsets to region sizes and truncate
2579 size to big_values */
2580 g
.region_size
[2] = (576 / 2);
2583 k
= g
.region_size
[i
];
2584 if (g
.big_values
< k
) k
= g
.big_values
;
2585 g
.region_size
[i
] = k
- j
;
2589 /* compute band indexes */
2590 if (g
.block_type
== 2) {
2591 if (g
.switch_point
) {
2592 /* if switched mode, we handle the 36 first samples as
2593 long blocks. For 8000Hz, we handle the 48 first
2594 exponents as long blocks (XXX: check this!) */
2595 if (s
.sample_rate_index
<= 2)
2597 else if (s
.sample_rate_index
!= 8)
2600 g
.long_end
= 4; /* 8000 Hz */
2602 g
.short_start
= 2 + (s
.sample_rate_index
!= 8);
2614 g
.preflag
= get_bits(&s
.gb
, 1);
2615 g
.scalefac_scale
= cast(ubyte)get_bits(&s
.gb
, 1);
2616 g
.count1table_select
= cast(ubyte)get_bits(&s
.gb
, 1);
2620 ptr
= s
.gb
.buffer
+ (get_bits_count(&s
.gb
)>>3);
2621 /* now we get bits from the main_data_begin offset */
2622 if(main_data_begin
> s
.last_buf_size
){
2623 s
.last_buf_size
= main_data_begin
;
2626 libc_memcpy(s
.last_buf
.ptr
+ s
.last_buf_size
, ptr
, EXTRABYTES
);
2628 init_get_bits(&s
.gb
, s
.last_buf
.ptr
+ s
.last_buf_size
- main_data_begin
, main_data_begin
*8);
2630 for(gr
=0;gr
<nb_granules
;gr
++) {
2631 for(ch
=0;ch
<s
.nb_channels
;ch
++) {
2632 g
= &granules
[ch
][gr
];
2634 bits_pos
= get_bits_count(&s
.gb
);
2638 int slen
, slen1
, slen2
;
2640 /* MPEG1 scale factors */
2641 slen1
= slen_table
[0][g
.scalefac_compress
];
2642 slen2
= slen_table
[1][g
.scalefac_compress
];
2643 if (g
.block_type
== 2) {
2644 n
= g
.switch_point ?
17 : 18;
2648 g
.scale_factors
[j
++] = cast(ubyte)get_bits(&s
.gb
, slen1
);
2650 libc_memset(cast(void*) &g
.scale_factors
[j
], 0, n
);
2653 // g.scale_factors[j++] = 0;
2657 g
.scale_factors
[j
++] = cast(ubyte)get_bits(&s
.gb
, slen2
);
2659 g
.scale_factors
[j
++] = 0;
2662 g
.scale_factors
[j
++] = 0;
2665 sc
= granules
[ch
][0].scale_factors
.ptr
;
2668 n
= (k
== 0 ?
6 : 5);
2669 if ((g
.scfsi
& (0x8 >> k
)) == 0) {
2670 slen
= (k
< 2) ? slen1
: slen2
;
2673 g
.scale_factors
[j
++] = cast(ubyte)get_bits(&s
.gb
, slen
);
2675 libc_memset(cast(void*) &g
.scale_factors
[j
], 0, n
);
2678 // g.scale_factors[j++] = 0;
2681 /* simply copy from last granule */
2683 g
.scale_factors
[j
] = sc
[j
];
2688 g
.scale_factors
[j
++] = 0;
2691 int tindex
, tindex2
, sl
, sf
;
2694 /* LSF scale factors */
2695 if (g
.block_type
== 2) {
2696 tindex
= g
.switch_point ?
2 : 1;
2700 sf
= g
.scalefac_compress
;
2701 if ((s
.mode_ext
& MODE_EXT_I_STEREO
) && ch
== 1) {
2702 /* intensity stereo case */
2705 lsf_sf_expand(slen
.ptr
, sf
, 6, 6, 0);
2707 } else if (sf
< 244) {
2708 lsf_sf_expand(slen
.ptr
, sf
- 180, 4, 4, 0);
2711 lsf_sf_expand(slen
.ptr
, sf
- 244, 3, 0, 0);
2717 lsf_sf_expand(slen
.ptr
, sf
, 5, 4, 4);
2719 } else if (sf
< 500) {
2720 lsf_sf_expand(slen
.ptr
, sf
- 400, 5, 4, 0);
2723 lsf_sf_expand(slen
.ptr
, sf
- 500, 3, 0, 0);
2731 n
= lsf_nsf_table
[tindex2
][tindex
][k
];
2735 g
.scale_factors
[j
++] = cast(ubyte)get_bits(&s
.gb
, sl
);
2737 libc_memset(cast(void*) &g
.scale_factors
[j
], 0, n
);
2740 // g.scale_factors[j++] = 0;
2743 /* XXX: should compute exact size */
2744 libc_memset(cast(void*) &g
.scale_factors
[j
], 0, 40 - j
);
2746 // g.scale_factors[j] = 0;
2749 exponents_from_scale_factors(s
, g
, exponents
.ptr
);
2751 /* read Huffman coded residue */
2752 if (huffman_decode(s
, g
, exponents
.ptr
,
2753 bits_pos
+ g
.part2_3_length
) < 0)
2757 if (s
.nb_channels
== 2)
2758 compute_stereo(s
, &granules
[0][gr
], &granules
[1][gr
]);
2760 for(ch
=0;ch
<s
.nb_channels
;ch
++) {
2761 g
= &granules
[ch
][gr
];
2762 reorder_block(s
, g
);
2763 compute_antialias(s
, g
);
2764 compute_imdct(s
, g
, &s
.sb_samples
[ch
][18 * gr
][0], s
.mdct_buf
[ch
].ptr
);
2767 return nb_granules
* 18;
2770 int mp3_decode_main(
2772 int16_t
*samples
, const uint8_t
*buf
, int buf_size
2774 int i
, nb_frames
, ch
;
2775 int16_t
*samples_ptr
;
2777 init_get_bits(&s
.gb
, buf
+ HEADER_SIZE
, (buf_size
- HEADER_SIZE
)*8);
2779 if (s
.error_protection
)
2780 get_bits(&s
.gb
, 16);
2782 nb_frames
= mp_decode_layer3(s
);
2786 align_get_bits(&s
.gb
);
2787 i
= (s
.gb
.size_in_bits
- get_bits_count(&s
.gb
))>>3;
2788 if(i
>= 0 && i
<= BACKSTEP_SIZE
){
2789 libc_memmove(s
.last_buf
.ptr
, s
.gb
.buffer
+ (get_bits_count(&s
.gb
)>>3), i
);
2795 align_get_bits(&s
.gb
);
2796 i
= (s
.gb
.size_in_bits
- get_bits_count(&s
.gb
))>>3;
2798 if(i
<0 || i
> BACKSTEP_SIZE || nb_frames
<0){
2799 i
= buf_size
- HEADER_SIZE
;
2800 if (BACKSTEP_SIZE
< i
) i
= BACKSTEP_SIZE
;
2802 libc_memcpy(s
.last_buf
.ptr
+ s
.last_buf_size
, s
.gb
.buffer
+ buf_size
- HEADER_SIZE
- i
, i
);
2803 s
.last_buf_size
+= i
;
2805 /* apply the synthesis filter */
2806 for(ch
=0;ch
<s
.nb_channels
;ch
++) {
2807 samples_ptr
= samples
+ ch
;
2808 for(i
=0;i
<nb_frames
;i
++) {
2810 s
.synth_buf
[ch
].ptr
, &(s
.synth_buf_offset
[ch
]),
2811 window
.ptr
, &s
.dither_state
,
2812 samples_ptr
, s
.nb_channels
,
2813 s
.sb_samples
[ch
][i
].ptr
2815 samples_ptr
+= 32 * s
.nb_channels
;
2818 return nb_frames
* 32 * cast(int)uint16_t
.sizeof
* s
.nb_channels
;
2822 // ////////////////////////////////////////////////////////////////////////// //
2823 shared static this () {
2824 auto res
= mp3_decode_init();
2825 if (res
< 0) assert(0, "mp3 initialization failed");
2828 int mp3_decode_init () {
2833 for(i
=0;i
<257;i
++) {
2835 v
= mp3_enwindow
[i
];
2836 static if (WFRAC_BITS
< 16) {
2837 v
= (v
+ (1 << (16 - WFRAC_BITS
- 1))) >> (16 - WFRAC_BITS
);
2839 window
[i
] = cast(short)v
;
2843 window
[512 - i
] = cast(short)v
;
2846 /* huffman decode tables */
2848 const huff_table_t
*h
= &mp3_huff_tables
[i
];
2851 uint8_t
[512] tmp_bits
;
2852 uint16_t
[512] tmp_codes
;
2854 libc_memset(tmp_bits
.ptr
, 0, tmp_bits
.sizeof
);
2855 libc_memset(tmp_codes
.ptr
, 0, tmp_codes
.sizeof
);
2861 for(x
=0;x
<xsize
;x
++) {
2862 for(y
=0;y
<xsize
;y
++){
2863 tmp_bits
[(x
<< 5) | y |
((x
&&y
)<<4)]= h
.bits
[j
];
2864 tmp_codes
[(x
<< 5) | y |
((x
&&y
)<<4)]= h
.codes
[j
++];
2868 init_vlc(&huff_vlc
[i
], 7, 512,
2869 tmp_bits
.ptr
, 1, 1, tmp_codes
.ptr
, 2, 2);
2872 init_vlc(&huff_quad_vlc
[i
], (i
== 0 ?
7 : 4), 16,
2873 mp3_quad_bits
[i
].ptr
, 1, 1, mp3_quad_codes
[i
].ptr
, 1, 1);
2879 band_index_long
[i
][j
] = cast(ushort)k
;
2880 k
+= band_size_long
[i
][j
];
2882 band_index_long
[i
][22] = cast(ushort)k
;
2885 /* compute n ^ (4/3) and store it in mantissa/exp format */
2886 table_4_3_exp
= cast(byte*)libc_malloc(TABLE_4_3_SIZE
* (table_4_3_exp
[0]).sizeof
);
2889 table_4_3_value
= cast(uint*)libc_malloc(TABLE_4_3_SIZE
* (table_4_3_value
[0]).sizeof
);
2890 if(!table_4_3_value
)
2893 for(i
=1;i
<TABLE_4_3_SIZE
;i
++) {
2896 f
= libc_pow(cast(double)(i
/4), 4.0 / 3.0) * libc_pow(2, (i
&3)*0.25);
2897 fm
= libc_frexp(f
, e
);
2898 m
= cast(uint32_t
)(fm
*(1L<<31) + 0.5);
2899 e
+= FRAC_BITS
- 31 + 5 - 100;
2900 table_4_3_value
[i
] = m
;
2901 table_4_3_exp
[i
] = cast(byte)(-e
);
2903 for(i
=0; i
<512*16; i
++){
2904 int exponent
= (i
>>4);
2905 double f
= libc_pow(i
&15, 4.0 / 3.0) * libc_pow(2, (exponent
-400)*0.25 + FRAC_BITS
+ 5);
2906 expval_table
[exponent
][i
&15]= cast(uint)f
;
2908 exp_table
[exponent
]= cast(uint)f
;
2915 f
= tan(cast(double)i
* M_PI
/ 12.0);
2916 v
= FIXRx(f
/ (1.0 + f
));
2921 is_table
[1][6 - i
] = v
;
2924 is_table
[0][i
] = is_table
[1][i
] = cast(int)0.0;
2931 e
= -(j
+ 1) * ((i
+ 1) >> 1);
2932 f
= libc_pow(2.0, e
/ 4.0);
2934 is_table_lsf
[j
][k_ ^
1][i
] = FIXRx(f
);
2935 is_table_lsf
[j
][k_
][i
] = FIXR
!(1.0);
2942 cs
= 1.0 / sqrt(1.0 + ci
* ci
);
2944 csa_table
[i
][0] = FIXHRx(cs
/4);
2945 csa_table
[i
][1] = FIXHRx(ca
/4);
2946 csa_table
[i
][2] = FIXHRx(ca
/4) + FIXHRx(cs
/4);
2947 csa_table
[i
][3] = FIXHRx(ca
/4) - FIXHRx(cs
/4);
2948 csa_table_float
[i
][0] = cs
;
2949 csa_table_float
[i
][1] = ca
;
2950 csa_table_float
[i
][2] = ca
+ cs
;
2951 csa_table_float
[i
][3] = ca
- cs
;
2954 /* compute mdct windows */
2959 if(j
==2 && i
%3 != 1)
2962 d
= sin(M_PI
* (i
+ 0.5) / 36.0);
2965 else if(i
>=24) d
= sin(M_PI
* (i
- 18 + 0.5) / 12.0);
2966 else if(i
>=18) d
= 1;
2969 else if(i
< 12) d
= sin(M_PI
* (i
- 6 + 0.5) / 12.0);
2970 else if(i
< 18) d
= 1;
2972 d
*= 0.5 / cos(M_PI
*(2*i
+ 19)/72);
2974 mdct_win
[j
][i
/3] = FIXHRx((d
/ (1<<5)));
2976 mdct_win
[j
][i
] = FIXHRx((d
/ (1<<5)));
2980 for(i
=0;i
<36;i
+=2) {
2981 mdct_win
[j
+ 4][i
] = mdct_win
[j
][i
];
2982 mdct_win
[j
+ 4][i
+ 1] = -mdct_win
[j
][i
+ 1];
2990 int mp3_decode_frame (mp3_context_t
*s
, int16_t
*out_samples
, int *data_size
, uint8_t
*buf
, int buf_size
) {
2993 int extra_bytes
= 0;
2996 if (buf_size
< HEADER_SIZE
) return -1;
2998 header
= (buf
[0]<<24)|
(buf
[1]<<16)|
(buf
[2]<<8)|buf
[3];
2999 if (mp3_check_header(header
) < 0){
3006 if (s
.last_header
&& (header
&0xffff0c00u
) != s
.last_header
) {
3013 if (decode_header(s
, header
) == 1) {
3018 if (s
.frame_size
<=0 || s
.frame_size
> buf_size
) return -1; // incomplete frame
3019 if (s
.frame_size
< buf_size
) buf_size
= s
.frame_size
;
3021 out_size
= mp3_decode_main(s
, out_samples
, buf
, buf_size
);
3022 if (out_size
>= 0) {
3023 *data_size
= out_size
;
3024 s
.last_header
= header
&0xffff0c00u
;
3026 // else: Error while decoding MPEG audio frame.
3027 s
.frame_size
+= extra_bytes
;
3033 int mp3_skip_frame (mp3_context_t *s, uint8_t *buf, int buf_size) {
3036 int extra_bytes = 0;
3039 if (buf_size < HEADER_SIZE) return -1;
3041 header = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
3042 if (mp3_check_header(header) < 0) {
3049 if (s.last_header && (header&0xffff0c00u) != s.last_header) {
3056 if (decode_header(s, header) == 1) {
3061 if (s.frame_size <= 0 || s.frame_size > buf_size) return -1; // incomplete frame
3062 if (s.frame_size < buf_size) buf_size = s.frame_size;
3063 s.last_header = header&0xffff0c00u;
3064 s.frame_size += extra_bytes;