(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { timestamp = this._super(timestamp); offset = this.stream.offset; } else { offset = timestamp * this.format.bitrate / 8 / this.format.sampleRate; } this.mp3_stream.reset(offset); // try to find 3 consecutive valid frame headers in a row for (var i = 0; i < 4096; i++) { var pos = offset + i; for (var j = 0; j < 3; j++) { this.mp3_stream.reset(pos); try { var header = MP3FrameHeader.decode(this.mp3_stream); } catch (e) { break; } // skip the rest of the frame var size = header.framesize(); if (size == null) break; pos += size; } // check if we're done if (j === 3) break; } // if we didn't find 3 frames, just try the first one and hope for the best if (j !== 3) i = 0; this.mp3_stream.reset(offset + i); // if we guesstimated, update the timestamp to another estimate of where we actually seeked to if (this.demuxer.seekPoints.length === 0) timestamp = this.stream.offset / (this.format.bitrate / 8) * this.format.sampleRate; this.seeking = true; return timestamp; }; }); module.exports = MP3Decoder; },{"./frame":4,"./header":5,"./layer1":9,"./layer2":10,"./layer3":11,"./stream":12,"./synth":13}],3:[function(require,module,exports){ var AV = (window.AV); var ID3v23Stream = require('./id3').ID3v23Stream; var ID3v22Stream = require('./id3').ID3v22Stream; var MP3FrameHeader = require('./header'); var MP3Stream = require('./stream'); var MP3Demuxer = AV.Demuxer.extend(function() { AV.Demuxer.register(this); this.probe = function(stream) { var off = stream.offset; // skip id3 metadata if it exists var id3header = MP3Demuxer.getID3v2Header(stream); if (id3header) stream.advance(10 + id3header.length); // attempt to read the header of the first audio frame var s = new MP3Stream(new AV.Bitstream(stream)); var header = null; try { header = MP3FrameHeader.decode(s); } catch (e) {}; // go back to the beginning, for other probes stream.seek(off); return !!header; }; this.getID3v2Header = function(stream) { if (stream.peekString(0, 3) == 'ID3') { stream = AV.Stream.fromBuffer(stream.peekBuffer(0, 10)); stream.advance(3); // 'ID3' var major = stream.readUInt8(); var minor = stream.readUInt8(); var flags = stream.readUInt8(); var bytes = stream.readBuffer(4).data; var length = (bytes[0] << 21) | (bytes[1] << 14) | (bytes[2] << 7) | bytes[3]; return { version: '2.' + major + '.' + minor, major: major, minor: minor, flags: flags, length: length }; } return null; }; const XING_OFFSETS = [[32, 17], [17, 9]]; this.prototype.parseDuration = function(header) { var stream = this.stream; var frames; var offset = stream.offset; if (!header || header.layer !== 3) return false; // Check for Xing/Info tag stream.advance(XING_OFFSETS[header.flags & MP3FrameHeader.FLAGS.LSF_EXT ? 1 : 0][header.nchannels() === 1 ? 1 : 0]); var tag = stream.readString(4); if (tag === 'Xing' || tag === 'Info') { var flags = stream.readUInt32(); if (flags & 1) frames = stream.readUInt32(); if (flags & 2) var size = stream.readUInt32(); if (flags & 4 && frames && size) { for (var i = 0; i < 100; i++) { var b = stream.readUInt8(); var pos = b / 256 * size | 0; var time = i / 100 * (frames * header.nbsamples() * 32) | 0; this.addSeekPoint(pos, time); } } if (flags & 8) stream.advance(4); } else { // Check for VBRI tag (always 32 bytes after end of mpegaudio header) stream.seek(offset + 4 + 32); tag = stream.readString(4); if (tag == 'VBRI' && stream.readUInt16() === 1) { // Check tag version stream.advance(4); // skip delay and quality stream.advance(4); // skip size frames = stream.readUInt32(); var entries = stream.readUInt16(); var scale = stream.readUInt16(); var bytesPerEntry = stream.readUInt16(); var framesPerEntry = stream.readUInt16(); var fn = 'readUInt' + (bytesPerEntry * 8); var pos = 0; for (var i = 0; i < entries; i++) { this.addSeekPoint(pos, framesPerEntry * i); pos += stream[fn](); } } } if (!frames) return false; this.emit('duration', (frames * header.nbsamples() * 32) / header.samplerate * 1000 | 0); return true; }; this.prototype.readChunk = function() { var stream = this.stream; if (!this.sentInfo) { // read id3 metadata if it exists var id3header = MP3Demuxer.getID3v2Header(stream); if (id3header) { stream.advance(10); if (id3header.major > 2) { var id3 = new ID3v23Stream(id3header, stream); } else { var id3 = new ID3v22Stream(id3header, stream); } this.emit('metadata', id3.read()); } // read the header of the first audio frame var off = stream.offset; var s = new MP3Stream(new AV.Bitstream(stream)); var header = MP3FrameHeader.decode(s); if (!header) return this.emit('error', 'Could not find first frame.'); this.emit('format', { formatID: 'mp3', sampleRate: header.samplerate, channelsPerFrame: header.nchannels(), bitrate: header.bitrate, floatingPoint: true }); var sentDuration = this.parseDuration(header); stream.advance(off - stream.offset); // if there were no Xing/VBRI tags, guesstimate the duration based on data size and bitrate this.dataSize = 0; if (!sentDuration) { this.on('end', function() { this.emit('duration', this.dataSize * 8 / header.bitrate * 1000 | 0); }); } this.sentInfo = true; } while (stream.available(1)) { var buffer = stream.readSingleBuffer(stream.remainingBytes()); this.dataSize += buffer.length; this.emit('data', buffer); } }; }); module.exports = MP3Demuxer; },{"./header":5,"./id3":7,"./stream":12}],4:[function(require,module,exports){ var MP3FrameHeader = require('./header'); var utils = require('./utils'); function MP3Frame() { this.header = null; // MPEG audio header this.options = 0; // decoding options (from stream) this.sbsample = utils.makeArray([2, 36, 32]); // synthesis subband filter samples this.overlap = utils.makeArray([2, 32, 18]); // Layer III block overlap data this.decoders = []; } // included layer decoders are registered here MP3Frame.layers = []; MP3Frame.prototype.decode = function(stream) { if (!this.header || !(this.header.flags & MP3FrameHeader.FLAGS.INCOMPLETE)) this.header = MP3FrameHeader.decode(stream); this.header.flags &= ~MP3FrameHeader.FLAGS.INCOMPLETE; // make an instance of the decoder for this layer if needed var decoder = this.decoders[this.header.layer - 1]; if (!decoder) { var Layer = MP3Frame.layers[this.header.layer]; if (!Layer) throw new Error("Layer " + this.header.layer + " is not supported."); decoder = this.decoders[this.header.layer - 1] = new Layer(); } decoder.decode(stream, this); }; module.exports = MP3Frame; },{"./header":5,"./utils":15}],5:[function(require,module,exports){ var AV = (window.AV); function MP3FrameHeader() { this.layer = 0; // audio layer (1, 2, or 3) this.mode = 0; // channel mode (see above) this.mode_extension = 0; // additional mode info this.emphasis = 0; // de-emphasis to use (see above) this.bitrate = 0; // stream bitrate (bps) this.samplerate = 0; // sampling frequency (Hz) this.crc_check = 0; // frame CRC accumulator this.crc_target = 0; // final target CRC checksum this.flags = 0; // flags (see above) this.private_bits = 0; // private bits } const BITRATES = [ // MPEG-1 [ 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, // Layer I 256000, 288000, 320000, 352000, 384000, 416000, 448000 ], [ 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, // Layer II 128000, 160000, 192000, 224000, 256000, 320000, 384000 ], [ 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, // Layer III 112000, 128000, 160000, 192000, 224000, 256000, 320000 ], // MPEG-2 LSF [ 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, // Layer I 128000, 144000, 160000, 176000, 192000, 224000, 256000 ], [ 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, // Layers 64000, 80000, 96000, 112000, 128000, 144000, 160000 ] // II & III ]; const SAMPLERATES = [ 44100, 48000, 32000 ]; MP3FrameHeader.FLAGS = { NPRIVATE_III: 0x0007, // number of Layer III private bits INCOMPLETE : 0x0008, // header but not data is decoded PROTECTION : 0x0010, // frame has CRC protection COPYRIGHT : 0x0020, // frame is copyright ORIGINAL : 0x0040, // frame is original (else copy) PADDING : 0x0080, // frame has additional slot I_STEREO : 0x0100, // uses intensity joint stereo MS_STEREO : 0x0200, // uses middle/side joint stereo FREEFORMAT : 0x0400, // uses free format bitrate LSF_EXT : 0x1000, // lower sampling freq. extension MC_EXT : 0x2000, // multichannel audio extension MPEG_2_5_EXT: 0x4000 // MPEG 2.5 (unofficial) extension }; const PRIVATE = { HEADER : 0x0100, // header private bit III : 0x001f // Layer III private bits (up to 5) }; MP3FrameHeader.MODE = { SINGLE_CHANNEL: 0, // single channel DUAL_CHANNEL : 1, // dual channel JOINT_STEREO : 2, // joint (MS/intensity) stereo STEREO : 3 // normal LR stereo }; const EMPHASIS = { NONE : 0, // no emphasis _50_15_US : 1, // 50/15 microseconds emphasis CCITT_J_17: 3, // CCITT J.17 emphasis RESERVED : 2 // unknown emphasis }; MP3FrameHeader.BUFFER_GUARD = 8; MP3FrameHeader.BUFFER_MDLEN = (511 + 2048 + MP3FrameHeader.BUFFER_GUARD); MP3FrameHeader.prototype.copy = function() { var clone = new MP3FrameHeader(); var keys = Object.keys(this); for (var key in keys) { clone[key] = this[key]; } return clone; } MP3FrameHeader.prototype.nchannels = function () { return this.mode === 0 ? 1 : 2; }; MP3FrameHeader.prototype.nbsamples = function() { return (this.layer === 1 ? 12 : ((this.layer === 3 && (this.flags & MP3FrameHeader.FLAGS.LSF_EXT)) ? 18 : 36)); }; MP3FrameHeader.prototype.framesize = function() { if (this.bitrate === 0) return null; var padding = (this.flags & MP3FrameHeader.FLAGS.PADDING ? 1 : 0); switch (this.layer) { case 1: var size = (this.bitrate * 12) / this.samplerate | 0; return (size + padding) * 4; case 2: var size = (this.bitrate * 144) / this.samplerate | 0; return size + padding; case 3: default: var lsf = this.flags & MP3FrameHeader.FLAGS.LSF_EXT ? 1 : 0; var size = (this.bitrate * 144) / (this.samplerate << lsf) | 0; return size + padding; } }; MP3FrameHeader.prototype.decode = function(stream) { this.flags = 0; this.private_bits = 0; // syncword stream.advance(11); // MPEG 2.5 indicator (really part of syncword) if (stream.read(1) === 0) this.flags |= MP3FrameHeader.FLAGS.MPEG_2_5_EXT; // ID if (stream.read(1) === 0) { this.flags |= MP3FrameHeader.FLAGS.LSF_EXT; } else if (this.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT) { throw new AV.UnderflowError(); // LOSTSYNC } // layer this.layer = 4 - stream.read(2); if (this.layer === 4) throw new Error('Invalid layer'); // protection_bit if (stream.read(1) === 0) this.flags |= MP3FrameHeader.FLAGS.PROTECTION; // bitrate_index var index = stream.read(4); if (index === 15) throw new Error('Invalid bitrate'); if (this.flags & MP3FrameHeader.FLAGS.LSF_EXT) { this.bitrate = BITRATES[3 + (this.layer >> 1)][index]; } else { this.bitrate = BITRATES[this.layer - 1][index]; } // sampling_frequency index = stream.read(2); if (index === 3) throw new Error('Invalid sampling frequency'); this.samplerate = SAMPLERATES[index]; if (this.flags & MP3FrameHeader.FLAGS.LSF_EXT) { this.samplerate /= 2; if (this.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT) this.samplerate /= 2; } // padding_bit if (stream.read(1)) this.flags |= MP3FrameHeader.FLAGS.PADDING; // private_bit if (stream.read(1)) this.private_bits |= PRIVATE.HEADER; // mode this.mode = 3 - stream.read(2); // mode_extension this.mode_extension = stream.read(2); // copyright if (stream.read(1)) this.flags |= MP3FrameHeader.FLAGS.COPYRIGHT; // original/copy if (stream.read(1)) this.flags |= MP3FrameHeader.FLAGS.ORIGINAL; // emphasis this.emphasis = stream.read(2); // crc_check if (this.flags & MP3FrameHeader.FLAGS.PROTECTION) this.crc_target = stream.read(16); }; MP3FrameHeader.decode = function(stream) { // synchronize var ptr = stream.next_frame; var syncing = true; var header = null; while (syncing) { syncing = false; if (stream.sync) { if (!stream.available(MP3FrameHeader.BUFFER_GUARD)) { stream.next_frame = ptr; throw new AV.UnderflowError(); } else if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) { // mark point where frame sync word was expected stream.this_frame = ptr; stream.next_frame = ptr + 1; throw new AV.UnderflowError(); // LOSTSYNC } } else { stream.seek(ptr * 8); if (!stream.doSync()) throw new AV.UnderflowError(); ptr = stream.nextByte(); } // begin processing stream.this_frame = ptr; stream.next_frame = ptr + 1; // possibly bogus sync word stream.seek(stream.this_frame * 8); header = new MP3FrameHeader(); header.decode(stream); if (header.bitrate === 0) { if (stream.freerate === 0 || !stream.sync || (header.layer === 3 && stream.freerate > 640000)) MP3FrameHeader.free_bitrate(stream, header); header.bitrate = stream.freerate; header.flags |= MP3FrameHeader.FLAGS.FREEFORMAT; } // calculate beginning of next frame var pad_slot = (header.flags & MP3FrameHeader.FLAGS.PADDING) ? 1 : 0; if (header.layer === 1) { var N = (((12 * header.bitrate / header.samplerate) << 0) + pad_slot) * 4; } else { var slots_per_frame = (header.layer === 3 && (header.flags & MP3FrameHeader.FLAGS.LSF_EXT)) ? 72 : 144; var N = ((slots_per_frame * header.bitrate / header.samplerate) << 0) + pad_slot; } // verify there is enough data left in buffer to decode this frame if (!stream.available(N + MP3FrameHeader.BUFFER_GUARD)) { stream.next_frame = stream.this_frame; throw new AV.UnderflowError(); } stream.next_frame = stream.this_frame + N; if (!stream.sync) { // check that a valid frame header follows this frame ptr = stream.next_frame; if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) { ptr = stream.next_frame = stream.this_frame + 1; // emulating 'goto sync' syncing = true; continue; } stream.sync = true; } } header.flags |= MP3FrameHeader.FLAGS.INCOMPLETE; return header; }; MP3FrameHeader.free_bitrate = function(stream, header) { var pad_slot = header.flags & MP3FrameHeader.FLAGS.PADDING ? 1 : 0, slots_per_frame = header.layer === 3 && header.flags & MP3FrameHeader.FLAGS.LSF_EXT ? 72 : 144; var start = stream.offset(); var rate = 0; while (stream.doSync()) { var peek_header = header.copy(); var peek_stream = stream.copy(); if (peek_header.decode(peek_stream) && peek_header.layer === header.layer && peek_header.samplerate === header.samplerate) { var N = stream.nextByte() - stream.this_frame; if (header.layer === 1) { rate = header.samplerate * (N - 4 * pad_slot + 4) / 48 / 1000 | 0; } else { rate = header.samplerate * (N - pad_slot + 1) / slots_per_frame / 1000 | 0; } if (rate >= 8) break; } stream.advance(8); } stream.seek(start); if (rate < 8 || (header.layer === 3 && rate > 640)) throw new AV.UnderflowError(); // LOSTSYNC stream.freerate = rate * 1000; }; module.exports = MP3FrameHeader; },{}],6:[function(require,module,exports){ /* * These are the Huffman code words for Layer III. * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3. * * These tables support decoding up to 4 Huffman code bits at a time. */ var PTR = function(offs, bits) { return { final: 0, ptr: { bits: bits, offset: offs } }; }; var huffquad_V = function (v, w, x, y, hlen) { return { final: 1, value: { v: v, w: w, x: x, y: y, hlen: hlen } }; }; const hufftabA = [ /* 0000 */ PTR(16, 2), /* 0001 */ PTR(20, 2), /* 0010 */ PTR(24, 1), /* 0011 */ PTR(26, 1), /* 0100 */ huffquad_V(0, 0, 1, 0, 4), /* 0101 */ huffquad_V(0, 0, 0, 1, 4), /* 0110 */ huffquad_V(0, 1, 0, 0, 4), /* 0111 */ huffquad_V(1, 0, 0, 0, 4), /* 1000 */ huffquad_V(0, 0, 0, 0, 1), /* 1001 */ huffquad_V(0, 0, 0, 0, 1), /* 1010 */ huffquad_V(0, 0, 0, 0, 1), /* 1011 */ huffquad_V(0, 0, 0, 0, 1), /* 1100 */ huffquad_V(0, 0, 0, 0, 1), /* 1101 */ huffquad_V(0, 0, 0, 0, 1), /* 1110 */ huffquad_V(0, 0, 0, 0, 1), /* 1111 */ huffquad_V(0, 0, 0, 0, 1), /* 0000 ... */ /* 00 */ huffquad_V(1, 0, 1, 1, 2), /* 16 */ /* 01 */ huffquad_V(1, 1, 1, 1, 2), /* 10 */ huffquad_V(1, 1, 0, 1, 2), /* 11 */ huffquad_V(1, 1, 1, 0, 2), /* 0001 ... */ /* 00 */ huffquad_V(0, 1, 1, 1, 2), /* 20 */ /* 01 */ huffquad_V(0, 1, 0, 1, 2), /* 10 */ huffquad_V(1, 0, 0, 1, 1), /* 11 */ huffquad_V(1, 0, 0, 1, 1), /* 0010 ... */ /* 0 */ huffquad_V(0, 1, 1, 0, 1), /* 24 */ /* 1 */ huffquad_V(0, 0, 1, 1, 1), /* 0011 ... */ /* 0 */ huffquad_V(1, 0, 1, 0, 1), /* 26 */ /* 1 */ huffquad_V(1, 1, 0, 0, 1) ]; const hufftabB = [ /* 0000 */ huffquad_V(1, 1, 1, 1, 4), /* 0001 */ huffquad_V(1, 1, 1, 0, 4), /* 0010 */ huffquad_V(1, 1, 0, 1, 4), /* 0011 */ huffquad_V(1, 1, 0, 0, 4), /* 0100 */ huffquad_V(1, 0, 1, 1, 4), /* 0101 */ huffquad_V(1, 0, 1, 0, 4), /* 0110 */ huffquad_V(1, 0, 0, 1, 4), /* 0111 */ huffquad_V(1, 0, 0, 0, 4), /* 1000 */ huffquad_V(0, 1, 1, 1, 4), /* 1001 */ huffquad_V(0, 1, 1, 0, 4), /* 1010 */ huffquad_V(0, 1, 0, 1, 4), /* 1011 */ huffquad_V(0, 1, 0, 0, 4), /* 1100 */ huffquad_V(0, 0, 1, 1, 4), /* 1101 */ huffquad_V(0, 0, 1, 0, 4), /* 1110 */ huffquad_V(0, 0, 0, 1, 4), /* 1111 */ huffquad_V(0, 0, 0, 0, 4) ]; var V = function (x, y, hlen) { return { final: 1, value: { x: x, y: y, hlen: hlen } }; }; const hufftab0 = [ /* */ V(0, 0, 0) ]; const hufftab1 = [ /* 000 */ V(1, 1, 3), /* 001 */ V(0, 1, 3), /* 010 */ V(1, 0, 2), /* 011 */ V(1, 0, 2), /* 100 */ V(0, 0, 1), /* 101 */ V(0, 0, 1), /* 110 */ V(0, 0, 1), /* 111 */ V(0, 0, 1) ]; const hufftab2 = [ /* 000 */ PTR(8, 3), /* 001 */ V(1, 1, 3), /* 010 */ V(0, 1, 3), /* 011 */ V(1, 0, 3), /* 100 */ V(0, 0, 1), /* 101 */ V(0, 0, 1), /* 110 */ V(0, 0, 1), /* 111 */ V(0, 0, 1), /* 000 ... */ /* 000 */ V(2, 2, 3), /* 8 */ /* 001 */ V(0, 2, 3), /* 010 */ V(1, 2, 2), /* 011 */ V(1, 2, 2), /* 100 */ V(2, 1, 2), /* 101 */ V(2, 1, 2), /* 110 */ V(2, 0, 2), /* 111 */ V(2, 0, 2) ]; const hufftab3 = [ /* 000 */ PTR(8, 3), /* 001 */ V(1, 0, 3), /* 010 */ V(1, 1, 2), /* 011 */ V(1, 1, 2), /* 100 */ V(0, 1, 2), /* 101 */ V(0, 1, 2), /* 110 */ V(0, 0, 2), /* 111 */ V(0, 0, 2), /* 000 ... */ /* 000 */ V(2, 2, 3), /* 8 */ /* 001 */ V(0, 2, 3), /* 010 */ V(1, 2, 2), /* 011 */ V(1, 2, 2), /* 100 */ V(2, 1, 2), /* 101 */ V(2, 1, 2), /* 110 */ V(2, 0, 2), /* 111 */ V(2, 0, 2) ]; const hufftab5 = [ /* 000 */ PTR(8, 4), /* 001 */ V(1, 1, 3), /* 010 */ V(0, 1, 3), /* 011 */ V(1, 0, 3), /* 100 */ V(0, 0, 1), /* 101 */ V(0, 0, 1), /* 110 */ V(0, 0, 1), /* 111 */ V(0, 0, 1), /* 000 ... */ /* 0000 */ PTR(24, 1), /* 8 */ /* 0001 */ V(3, 2, 4), /* 0010 */ V(3, 1, 3), /* 0011 */ V(3, 1, 3), /* 0100 */ V(1, 3, 4), /* 0101 */ V(0, 3, 4), /* 0110 */ V(3, 0, 4), /* 0111 */ V(2, 2, 4), /* 1000 */ V(1, 2, 3), /* 1001 */ V(1, 2, 3), /* 1010 */ V(2, 1, 3), /* 1011 */ V(2, 1, 3), /* 1100 */ V(0, 2, 3), /* 1101 */ V(0, 2, 3), /* 1110 */ V(2, 0, 3), /* 1111 */ V(2, 0, 3), /* 000 0000 ... */ /* 0 */ V(3, 3, 1), /* 24 */ /* 1 */ V(2, 3, 1) ]; const hufftab6 = [ /* 0000 */ PTR(16, 3), /* 0001 */ PTR(24, 1), /* 0010 */ PTR(26, 1), /* 0011 */ V(1, 2, 4), /* 0100 */ V(2, 1, 4), /* 0101 */ V(2, 0, 4), /* 0110 */ V(0, 1, 3), /* 0111 */ V(0, 1, 3), /* 1000 */ V(1, 1, 2), /* 1001 */ V(1, 1, 2), /* 1010 */ V(1, 1, 2), /* 1011 */ V(1, 1, 2), /* 1100 */ V(1, 0, 3), /* 1101 */ V(1, 0, 3), /* 1110 */ V(0, 0, 3), /* 1111 */ V(0, 0, 3), /* 0000 ... */ /* 000 */ V(3, 3, 3), /* 16 */ /* 001 */ V(0, 3, 3), /* 010 */ V(2, 3, 2), /* 011 */ V(2, 3, 2), /* 100 */ V(3, 2, 2), /* 101 */ V(3, 2, 2), /* 110 */ V(3, 0, 2), /* 111 */ V(3, 0, 2), /* 0001 ... */ /* 0 */ V(1, 3, 1), /* 24 */ /* 1 */ V(3, 1, 1), /* 0010 ... */ /* 0 */ V(2, 2, 1), /* 26 */ /* 1 */ V(0, 2, 1) ]; const hufftab7 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 2), /* 0011 */ V(1, 1, 4), /* 0100 */ V(0, 1, 3), /* 0101 */ V(0, 1, 3), /* 0110 */ V(1, 0, 3), /* 0111 */ V(1, 0, 3), /* 1000 */ V(0, 0, 1), /* 1001 */ V(0, 0, 1), /* 1010 */ V(0, 0, 1), /* 1011 */ V(0, 0, 1), /* 1100 */ V(0, 0, 1), /* 1101 */ V(0, 0, 1), /* 1110 */ V(0, 0, 1), /* 1111 */ V(0, 0, 1), /* 0000 ... */ /* 0000 */ PTR(52, 2), /* 16 */ /* 0001 */ PTR(56, 1), /* 0010 */ PTR(58, 1), /* 0011 */ V(1, 5, 4), /* 0100 */ V(5, 1, 4), /* 0101 */ PTR(60, 1), /* 0110 */ V(5, 0, 4), /* 0111 */ PTR(62, 1), /* 1000 */ V(2, 4, 4), /* 1001 */ V(4, 2, 4), /* 1010 */ V(1, 4, 3), /* 1011 */ V(1, 4, 3), /* 1100 */ V(4, 1, 3), /* 1101 */ V(4, 1, 3), /* 1110 */ V(4, 0, 3), /* 1111 */ V(4, 0, 3), /* 0001 ... */ /* 0000 */ V(0, 4, 4), /* 32 */ /* 0001 */ V(2, 3, 4), /* 0010 */ V(3, 2, 4), /* 0011 */ V(0, 3, 4), /* 0100 */ V(1, 3, 3), /* 0101 */ V(1, 3, 3), /* 0110 */ V(3, 1, 3), /* 0111 */ V(3, 1, 3), /* 1000 */ V(3, 0, 3), /* 1001 */ V(3, 0, 3), /* 1010 */ V(2, 2, 3), /* 1011 */ V(2, 2, 3), /* 1100 */ V(1, 2, 2), /* 1101 */ V(1, 2, 2), /* 1110 */ V(1, 2, 2), /* 1111 */ V(1, 2, 2), /* 0010 ... */ /* 00 */ V(2, 1, 1), /* 48 */ /* 01 */ V(2, 1, 1), /* 10 */ V(0, 2, 2), /* 11 */ V(2, 0, 2), /* 0000 0000 ... */ /* 00 */ V(5, 5, 2), /* 52 */ /* 01 */ V(4, 5, 2), /* 10 */ V(5, 4, 2), /* 11 */ V(5, 3, 2), /* 0000 0001 ... */ /* 0 */ V(3, 5, 1), /* 56 */ /* 1 */ V(4, 4, 1), /* 0000 0010 ... */ /* 0 */ V(2, 5, 1), /* 58 */ /* 1 */ V(5, 2, 1), /* 0000 0101 ... */ /* 0 */ V(0, 5, 1), /* 60 */ /* 1 */ V(3, 4, 1), /* 0000 0111 ... */ /* 0 */ V(4, 3, 1), /* 62 */ /* 1 */ V(3, 3, 1) ]; const hufftab8 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ V(1, 2, 4), /* 0011 */ V(2, 1, 4), /* 0100 */ V(1, 1, 2), /* 0101 */ V(1, 1, 2), /* 0110 */ V(1, 1, 2), /* 0111 */ V(1, 1, 2), /* 1000 */ V(0, 1, 3), /* 1001 */ V(0, 1, 3), /* 1010 */ V(1, 0, 3), /* 1011 */ V(1, 0, 3), /* 1100 */ V(0, 0, 2), /* 1101 */ V(0, 0, 2), /* 1110 */ V(0, 0, 2), /* 1111 */ V(0, 0, 2), /* 0000 ... */ /* 0000 */ PTR(48, 3), /* 16 */ /* 0001 */ PTR(56, 2), /* 0010 */ PTR(60, 1), /* 0011 */ V(1, 5, 4), /* 0100 */ V(5, 1, 4), /* 0101 */ PTR(62, 1), /* 0110 */ PTR(64, 1), /* 0111 */ V(2, 4, 4), /* 1000 */ V(4, 2, 4), /* 1001 */ V(1, 4, 4), /* 1010 */ V(4, 1, 3), /* 1011 */ V(4, 1, 3), /* 1100 */ V(0, 4, 4), /* 1101 */ V(4, 0, 4), /* 1110 */ V(2, 3, 4), /* 1111 */ V(3, 2, 4), /* 0001 ... */ /* 0000 */ V(1, 3, 4), /* 32 */ /* 0001 */ V(3, 1, 4), /* 0010 */ V(0, 3, 4), /* 0011 */ V(3, 0, 4), /* 0100 */ V(2, 2, 2), /* 0101 */ V(2, 2, 2), /* 0110 */ V(2, 2, 2), /* 0111 */ V(2, 2, 2), /* 1000 */ V(0, 2, 2), /* 1001 */ V(0, 2, 2), /* 1010 */ V(0, 2, 2), /* 1011 */ V(0, 2, 2), /* 1100 */ V(2, 0, 2), /* 1101 */ V(2, 0, 2), /* 1110 */ V(2, 0, 2), /* 1111 */ V(2, 0, 2), /* 0000 0000 ... */ /* 000 */ V(5, 5, 3), /* 48 */ /* 001 */ V(5, 4, 3), /* 010 */ V(4, 5, 2), /* 011 */ V(4, 5, 2), /* 100 */ V(5, 3, 1), /* 101 */ V(5, 3, 1), /* 110 */ V(5, 3, 1), /* 111 */ V(5, 3, 1), /* 0000 0001 ... */ /* 00 */ V(3, 5, 2), /* 56 */ /* 01 */ V(4, 4, 2), /* 10 */ V(2, 5, 1), /* 11 */ V(2, 5, 1), /* 0000 0010 ... */ /* 0 */ V(5, 2, 1), /* 60 */ /* 1 */ V(0, 5, 1), /* 0000 0101 ... */ /* 0 */ V(3, 4, 1), /* 62 */ /* 1 */ V(4, 3, 1), /* 0000 0110 ... */ /* 0 */ V(5, 0, 1), /* 64 */ /* 1 */ V(3, 3, 1) ]; const hufftab9 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 3), /* 0010 */ PTR(40, 2), /* 0011 */ PTR(44, 2), /* 0100 */ PTR(48, 1), /* 0101 */ V(1, 2, 4), /* 0110 */ V(2, 1, 4), /* 0111 */ V(2, 0, 4), /* 1000 */ V(1, 1, 3), /* 1001 */ V(1, 1, 3), /* 1010 */ V(0, 1, 3), /* 1011 */ V(0, 1, 3), /* 1100 */ V(1, 0, 3), /* 1101 */ V(1, 0, 3), /* 1110 */ V(0, 0, 3), /* 1111 */ V(0, 0, 3), /* 0000 ... */ /* 0000 */ PTR(50, 1), /* 16 */ /* 0001 */ V(3, 5, 4), /* 0010 */ V(5, 3, 4), /* 0011 */ PTR(52, 1), /* 0100 */ V(4, 4, 4), /* 0101 */ V(2, 5, 4), /* 0110 */ V(5, 2, 4), /* 0111 */ V(1, 5, 4), /* 1000 */ V(5, 1, 3), /* 1001 */ V(5, 1, 3), /* 1010 */ V(3, 4, 3), /* 1011 */ V(3, 4, 3), /* 1100 */ V(4, 3, 3), /* 1101 */ V(4, 3, 3), /* 1110 */ V(5, 0, 4), /* 1111 */ V(0, 4, 4), /* 0001 ... */ /* 000 */ V(2, 4, 3), /* 32 */ /* 001 */ V(4, 2, 3), /* 010 */ V(3, 3, 3), /* 011 */ V(4, 0, 3), /* 100 */ V(1, 4, 2), /* 101 */ V(1, 4, 2), /* 110 */ V(4, 1, 2), /* 111 */ V(4, 1, 2), /* 0010 ... */ /* 00 */ V(2, 3, 2), /* 40 */ /* 01 */ V(3, 2, 2), /* 10 */ V(1, 3, 1), /* 11 */ V(1, 3, 1), /* 0011 ... */ /* 00 */ V(3, 1, 1), /* 44 */ /* 01 */ V(3, 1, 1), /* 10 */ V(0, 3, 2), /* 11 */ V(3, 0, 2), /* 0100 ... */ /* 0 */ V(2, 2, 1), /* 48 */ /* 1 */ V(0, 2, 1), /* 0000 0000 ... */ /* 0 */ V(5, 5, 1), /* 50 */ /* 1 */ V(4, 5, 1), /* 0000 0011 ... */ /* 0 */ V(5, 4, 1), /* 52 */ /* 1 */ V(0, 5, 1) ]; const hufftab10 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 2), /* 0011 */ V(1, 1, 4), /* 0100 */ V(0, 1, 3), /* 0101 */ V(0, 1, 3), /* 0110 */ V(1, 0, 3), /* 0111 */ V(1, 0, 3), /* 1000 */ V(0, 0, 1), /* 1001 */ V(0, 0, 1), /* 1010 */ V(0, 0, 1), /* 1011 */ V(0, 0, 1), /* 1100 */ V(0, 0, 1), /* 1101 */ V(0, 0, 1), /* 1110 */ V(0, 0, 1), /* 1111 */ V(0, 0, 1), /* 0000 ... */ /* 0000 */ PTR(52, 3), /* 16 */ /* 0001 */ PTR(60, 2), /* 0010 */ PTR(64, 3), /* 0011 */ PTR(72, 1), /* 0100 */ PTR(74, 2), /* 0101 */ PTR(78, 2), /* 0110 */ PTR(82, 2), /* 0111 */ V(1, 7, 4), /* 1000 */ V(7, 1, 4), /* 1001 */ PTR(86, 1), /* 1010 */ PTR(88, 2), /* 1011 */ PTR(92, 2), /* 1100 */ V(1, 6, 4), /* 1101 */ V(6, 1, 4), /* 1110 */ V(6, 0, 4), /* 1111 */ PTR(96, 1), /* 0001 ... */ /* 0000 */ PTR(98, 1), /* 32 */ /* 0001 */ PTR(100, 1), /* 0010 */ V(1, 4, 4), /* 0011 */ V(4, 1, 4), /* 0100 */ V(4, 0, 4), /* 0101 */ V(2, 3, 4), /* 0110 */ V(3, 2, 4), /* 0111 */ V(0, 3, 4), /* 1000 */ V(1, 3, 3), /* 1001 */ V(1, 3, 3), /* 1010 */ V(3, 1, 3), /* 1011 */ V(3, 1, 3), /* 1100 */ V(3, 0, 3), /* 1101 */ V(3, 0, 3), /* 1110 */ V(2, 2, 3), /* 1111 */ V(2, 2, 3), /* 0010 ... */ /* 00 */ V(1, 2, 2), /* 48 */ /* 01 */ V(2, 1, 2), /* 10 */ V(0, 2, 2), /* 11 */ V(2, 0, 2), /* 0000 0000 ... */ /* 000 */ V(7, 7, 3), /* 52 */ /* 001 */ V(6, 7, 3), /* 010 */ V(7, 6, 3), /* 011 */ V(5, 7, 3), /* 100 */ V(7, 5, 3), /* 101 */ V(6, 6, 3), /* 110 */ V(4, 7, 2), /* 111 */ V(4, 7, 2), /* 0000 0001 ... */ /* 00 */ V(7, 4, 2), /* 60 */ /* 01 */ V(5, 6, 2), /* 10 */ V(6, 5, 2), /* 11 */ V(3, 7, 2), /* 0000 0010 ... */ /* 000 */ V(7, 3, 2), /* 64 */ /* 001 */ V(7, 3, 2), /* 010 */ V(4, 6, 2), /* 011 */ V(4, 6, 2), /* 100 */ V(5, 5, 3), /* 101 */ V(5, 4, 3), /* 110 */ V(6, 3, 2), /* 111 */ V(6, 3, 2), /* 0000 0011 ... */ /* 0 */ V(2, 7, 1), /* 72 */ /* 1 */ V(7, 2, 1), /* 0000 0100 ... */ /* 00 */ V(6, 4, 2), /* 74 */ /* 01 */ V(0, 7, 2), /* 10 */ V(7, 0, 1), /* 11 */ V(7, 0, 1), /* 0000 0101 ... */ /* 00 */ V(6, 2, 1), /* 78 */ /* 01 */ V(6, 2, 1), /* 10 */ V(4, 5, 2), /* 11 */ V(3, 5, 2), /* 0000 0110 ... */ /* 00 */ V(0, 6, 1), /* 82 */ /* 01 */ V(0, 6, 1), /* 10 */ V(5, 3, 2), /* 11 */ V(4, 4, 2), /* 0000 1001 ... */ /* 0 */ V(3, 6, 1), /* 86 */ /* 1 */ V(2, 6, 1), /* 0000 1010 ... */ /* 00 */ V(2, 5, 2), /* 88 */ /* 01 */ V(5, 2, 2), /* 10 */ V(1, 5, 1), /* 11 */ V(1, 5, 1), /* 0000 1011 ... */ /* 00 */ V(5, 1, 1), /* 92 */ /* 01 */ V(5, 1, 1), /* 10 */ V(3, 4, 2), /* 11 */ V(4, 3, 2), /* 0000 1111 ... */ /* 0 */ V(0, 5, 1), /* 96 */ /* 1 */ V(5, 0, 1), /* 0001 0000 ... */ /* 0 */ V(2, 4, 1), /* 98 */ /* 1 */ V(4, 2, 1), /* 0001 0001 ... */ /* 0 */ V(3, 3, 1), /* 100 */ /* 1 */ V(0, 4, 1) ]; const hufftab11 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 4), /* 0011 */ PTR(64, 3), /* 0100 */ V(1, 2, 4), /* 0101 */ PTR(72, 1), /* 0110 */ V(1, 1, 3), /* 0111 */ V(1, 1, 3), /* 1000 */ V(0, 1, 3), /* 1001 */ V(0, 1, 3), /* 1010 */ V(1, 0, 3), /* 1011 */ V(1, 0, 3), /* 1100 */ V(0, 0, 2), /* 1101 */ V(0, 0, 2), /* 1110 */ V(0, 0, 2), /* 1111 */ V(0, 0, 2), /* 0000 ... */ /* 0000 */ PTR(74, 2), /* 16 */ /* 0001 */ PTR(78, 3), /* 0010 */ PTR(86, 2), /* 0011 */ PTR(90, 1), /* 0100 */ PTR(92, 2), /* 0101 */ V(2, 7, 4), /* 0110 */ V(7, 2, 4), /* 0111 */ PTR(96, 1), /* 1000 */ V(7, 1, 3), /* 1001 */ V(7, 1, 3), /* 1010 */ V(1, 7, 4), /* 1011 */ V(7, 0, 4), /* 1100 */ V(3, 6, 4), /* 1101 */ V(6, 3, 4), /* 1110 */ V(6, 0, 4), /* 1111 */ PTR(98, 1), /* 0001 ... */ /* 0000 */ PTR(100, 1), /* 32 */ /* 0001 */ V(1, 5, 4), /* 0010 */ V(6, 2, 3), /* 0011 */ V(6, 2, 3), /* 0100 */ V(2, 6, 4), /* 0101 */ V(0, 6, 4), /* 0110 */ V(1, 6, 3), /* 0111 */ V(1, 6, 3), /* 1000 */ V(6, 1, 3), /* 1001 */ V(6, 1, 3), /* 1010 */ V(5, 1, 4), /* 1011 */ V(3, 4, 4), /* 1100 */ V(5, 0, 4), /* 1101 */ PTR(102, 1), /* 1110 */ V(2, 4, 4), /* 1111 */ V(4, 2, 4), /* 0010 ... */ /* 0000 */ V(1, 4, 4), /* 48 */ /* 0001 */ V(4, 1, 4), /* 0010 */ V(0, 4, 4), /* 0011 */ V(4, 0, 4), /* 0100 */ V(2, 3, 3), /* 0101 */ V(2, 3, 3), /* 0110 */ V(3, 2, 3), /* 0111 */ V(3, 2, 3), /* 1000 */ V(1, 3, 2), /* 1001 */ V(1, 3, 2), /* 1010 */ V(1, 3, 2), /* 1011 */ V(1, 3, 2), /* 1100 */ V(3, 1, 2), /* 1101 */ V(3, 1, 2), /* 1110 */ V(3, 1, 2), /* 1111 */ V(3, 1, 2), /* 0011 ... */ /* 000 */ V(0, 3, 3), /* 64 */ /* 001 */ V(3, 0, 3), /* 010 */ V(2, 2, 2), /* 011 */ V(2, 2, 2), /* 100 */ V(2, 1, 1), /* 101 */ V(2, 1, 1), /* 110 */ V(2, 1, 1), /* 111 */ V(2, 1, 1), /* 0101 ... */ /* 0 */ V(0, 2, 1), /* 72 */ /* 1 */ V(2, 0, 1), /* 0000 0000 ... */ /* 00 */ V(7, 7, 2), /* 74 */ /* 01 */ V(6, 7, 2), /* 10 */ V(7, 6, 2), /* 11 */ V(7, 5, 2), /* 0000 0001 ... */ /* 000 */ V(6, 6, 2), /* 78 */ /* 001 */ V(6, 6, 2), /* 010 */ V(4, 7, 2), /* 011 */ V(4, 7, 2), /* 100 */ V(7, 4, 2), /* 101 */ V(7, 4, 2), /* 110 */ V(5, 7, 3), /* 111 */ V(5, 5, 3), /* 0000 0010 ... */ /* 00 */ V(5, 6, 2), /* 86 */ /* 01 */ V(6, 5, 2), /* 10 */ V(3, 7, 1), /* 11 */ V(3, 7, 1), /* 0000 0011 ... */ /* 0 */ V(7, 3, 1), /* 90 */ /* 1 */ V(4, 6, 1), /* 0000 0100 ... */ /* 00 */ V(4, 5, 2), /* 92 */ /* 01 */ V(5, 4, 2), /* 10 */ V(3, 5, 2), /* 11 */ V(5, 3, 2), /* 0000 0111 ... */ /* 0 */ V(6, 4, 1), /* 96 */ /* 1 */ V(0, 7, 1), /* 0000 1111 ... */ /* 0 */ V(4, 4, 1), /* 98 */ /* 1 */ V(2, 5, 1), /* 0001 0000 ... */ /* 0 */ V(5, 2, 1), /* 100 */ /* 1 */ V(0, 5, 1), /* 0001 1101 ... */ /* 0 */ V(4, 3, 1), /* 102 */ /* 1 */ V(3, 3, 1) ]; const hufftab12 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 4), /* 0011 */ PTR(64, 2), /* 0100 */ PTR(68, 3), /* 0101 */ PTR(76, 1), /* 0110 */ V(1, 2, 4), /* 0111 */ V(2, 1, 4), /* 1000 */ PTR(78, 1), /* 1001 */ V(0, 0, 4), /* 1010 */ V(1, 1, 3), /* 1011 */ V(1, 1, 3), /* 1100 */ V(0, 1, 3), /* 1101 */ V(0, 1, 3), /* 1110 */ V(1, 0, 3), /* 1111 */ V(1, 0, 3), /* 0000 ... */ /* 0000 */ PTR(80, 2), /* 16 */ /* 0001 */ PTR(84, 1), /* 0010 */ PTR(86, 1), /* 0011 */ PTR(88, 1), /* 0100 */ V(5, 6, 4), /* 0101 */ V(3, 7, 4), /* 0110 */ PTR(90, 1), /* 0111 */ V(2, 7, 4), /* 1000 */ V(7, 2, 4), /* 1001 */ V(4, 6, 4), /* 1010 */ V(6, 4, 4), /* 1011 */ V(1, 7, 4), /* 1100 */ V(7, 1, 4), /* 1101 */ PTR(92, 1), /* 1110 */ V(3, 6, 4), /* 1111 */ V(6, 3, 4), /* 0001 ... */ /* 0000 */ V(4, 5, 4), /* 32 */ /* 0001 */ V(5, 4, 4), /* 0010 */ V(4, 4, 4), /* 0011 */ PTR(94, 1), /* 0100 */ V(2, 6, 3), /* 0101 */ V(2, 6, 3), /* 0110 */ V(6, 2, 3), /* 0111 */ V(6, 2, 3), /* 1000 */ V(6, 1, 3), /* 1001 */ V(6, 1, 3), /* 1010 */ V(1, 6, 4), /* 1011 */ V(6, 0, 4), /* 1100 */ V(3, 5, 4), /* 1101 */ V(5, 3, 4), /* 1110 */ V(2, 5, 4), /* 1111 */ V(5, 2, 4), /* 0010 ... */ /* 0000 */ V(1, 5, 3), /* 48 */ /* 0001 */ V(1, 5, 3), /* 0010 */ V(5, 1, 3), /* 0011 */ V(5, 1, 3), /* 0100 */ V(3, 4, 3), /* 0101 */ V(3, 4, 3), /* 0110 */ V(4, 3, 3), /* 0111 */ V(4, 3, 3), /* 1000 */ V(5, 0, 4), /* 1001 */ V(0, 4, 4), /* 1010 */ V(2, 4, 3), /* 1011 */ V(2, 4, 3), /* 1100 */ V(4, 2, 3), /* 1101 */ V(4, 2, 3), /* 1110 */ V(1, 4, 3), /* 1111 */ V(1, 4, 3), /* 0011 ... */ /* 00 */ V(3, 3, 2), /* 64 */ /* 01 */ V(4, 1, 2), /* 10 */ V(2, 3, 2), /* 11 */ V(3, 2, 2), /* 0100 ... */ /* 000 */ V(4, 0, 3), /* 68 */ /* 001 */ V(0, 3, 3), /* 010 */ V(3, 0, 2), /* 011 */ V(3, 0, 2), /* 100 */ V(1, 3, 1), /* 101 */ V(1, 3, 1), /* 110 */ V(1, 3, 1), /* 111 */ V(1, 3, 1), /* 0101 ... */ /* 0 */ V(3, 1, 1), /* 76 */ /* 1 */ V(2, 2, 1), /* 1000 ... */ /* 0 */ V(0, 2, 1), /* 78 */ /* 1 */ V(2, 0, 1), /* 0000 0000 ... */ /* 00 */ V(7, 7, 2), /* 80 */ /* 01 */ V(6, 7, 2), /* 10 */ V(7, 6, 1), /* 11 */ V(7, 6, 1), /* 0000 0001 ... */ /* 0 */ V(5, 7, 1), /* 84 */ /* 1 */ V(7, 5, 1), /* 0000 0010 ... */ /* 0 */ V(6, 6, 1), /* 86 */ /* 1 */ V(4, 7, 1), /* 0000 0011 ... */ /* 0 */ V(7, 4, 1), /* 88 */ /* 1 */ V(6, 5, 1), /* 0000 0110 ... */ /* 0 */ V(7, 3, 1), /* 90 */ /* 1 */ V(5, 5, 1), /* 0000 1101 ... */ /* 0 */ V(0, 7, 1), /* 92 */ /* 1 */ V(7, 0, 1), /* 0001 0011 ... */ /* 0 */ V(0, 6, 1), /* 94 */ /* 1 */ V(0, 5, 1) ]; const hufftab13 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 4), /* 0011 */ PTR(64, 2), /* 0100 */ V(1, 1, 4), /* 0101 */ V(0, 1, 4), /* 0110 */ V(1, 0, 3), /* 0111 */ V(1, 0, 3), /* 1000 */ V(0, 0, 1), /* 1001 */ V(0, 0, 1), /* 1010 */ V(0, 0, 1), /* 1011 */ V(0, 0, 1), /* 1100 */ V(0, 0, 1), /* 1101 */ V(0, 0, 1), /* 1110 */ V(0, 0, 1), /* 1111 */ V(0, 0, 1), /* 0000 ... */ /* 0000 */ PTR(68, 4), /* 16 */ /* 0001 */ PTR(84, 4), /* 0010 */ PTR(100, 4), /* 0011 */ PTR(116, 4), /* 0100 */ PTR(132, 4), /* 0101 */ PTR(148, 4), /* 0110 */ PTR(164, 3), /* 0111 */ PTR(172, 3), /* 1000 */ PTR(180, 3), /* 1001 */ PTR(188, 3), /* 1010 */ PTR(196, 3), /* 1011 */ PTR(204, 3), /* 1100 */ PTR(212, 1), /* 1101 */ PTR(214, 2), /* 1110 */ PTR(218, 3), /* 1111 */ PTR(226, 1), /* 0001 ... */ /* 0000 */ PTR(228, 2), /* 32 */ /* 0001 */ PTR(232, 2), /* 0010 */ PTR(236, 2), /* 0011 */ PTR(240, 2), /* 0100 */ V(8, 1, 4), /* 0101 */ PTR(244, 1), /* 0110 */ PTR(246, 1), /* 0111 */ PTR(248, 1), /* 1000 */ PTR(250, 2), /* 1001 */ PTR(254, 1), /* 1010 */ V(1, 5, 4), /* 1011 */ V(5, 1, 4), /* 1100 */ PTR(256, 1), /* 1101 */ PTR(258, 1), /* 1110 */ PTR(260, 1), /* 1111 */ V(1, 4, 4), /* 0010 ... */ /* 0000 */ V(4, 1, 3), /* 48 */ /* 0001 */ V(4, 1, 3), /* 0010 */ V(0, 4, 4), /* 0011 */ V(4, 0, 4), /* 0100 */ V(2, 3, 4), /* 0101 */ V(3, 2, 4), /* 0110 */ V(1, 3, 3), /* 0111 */ V(1, 3, 3), /* 1000 */ V(3, 1, 3), /* 1001 */ V(3, 1, 3), /* 1010 */ V(0, 3, 3), /* 1011 */ V(0, 3, 3), /* 1100 */ V(3, 0, 3), /* 1101 */ V(3, 0, 3), /* 1110 */ V(2, 2, 3), /* 1111 */ V(2, 2, 3), /* 0011 ... */ /* 00 */ V(1, 2, 2), /* 64 */ /* 01 */ V(2, 1, 2), /* 10 */ V(0, 2, 2), /* 11 */ V(2, 0, 2), /* 0000 0000 ... */ /* 0000 */ PTR(262, 4), /* 68 */ /* 0001 */ PTR(278, 4), /* 0010 */ PTR(294, 4), /* 0011 */ PTR(310, 3), /* 0100 */ PTR(318, 2), /* 0101 */ PTR(322, 2), /* 0110 */ PTR(326, 3), /* 0111 */ PTR(334, 2), /* 1000 */ PTR(338, 1), /* 1001 */ PTR(340, 2), /* 1010 */ PTR(344, 2), /* 1011 */ PTR(348, 2), /* 1100 */ PTR(352, 2), /* 1101 */ PTR(356, 2), /* 1110 */ V(1, 15, 4), /* 1111 */ V(15, 1, 4), /* 0000 0001 ... */ /* 0000 */ V(15, 0, 4), /* 84 */ /* 0001 */ PTR(360, 1), /* 0010 */ PTR(362, 1), /* 0011 */ PTR(364, 1), /* 0100 */ V(14, 2, 4), /* 0101 */ PTR(366, 1), /* 0110 */ V(1, 14, 4), /* 0111 */ V(14, 1, 4), /* 1000 */ PTR(368, 1), /* 1001 */ PTR(370, 1), /* 1010 */ PTR(372, 1), /* 1011 */ PTR(374, 1), /* 1100 */ PTR(376, 1), /* 1101 */ PTR(378, 1), /* 1110 */ V(12, 6, 4), /* 1111 */ V(3, 13, 4), /* 0000 0010 ... */ /* 0000 */ PTR(380, 1), /* 100 */ /* 0001 */ V(2, 13, 4), /* 0010 */ V(13, 2, 4), /* 0011 */ V(1, 13, 4), /* 0100 */ V(11, 7, 4), /* 0101 */ PTR(382, 1), /* 0110 */ PTR(384, 1), /* 0111 */ V(12, 3, 4), /* 1000 */ PTR(386, 1), /* 1001 */ V(4, 11, 4), /* 1010 */ V(13, 1, 3), /* 1011 */ V(13, 1, 3), /* 1100 */ V(0, 13, 4), /* 1101 */ V(13, 0, 4), /* 1110 */ V(8, 10, 4), /* 1111 */ V(10, 8, 4), /* 0000 0011 ... */ /* 0000 */ V(4, 12, 4), /* 116 */ /* 0001 */ V(12, 4, 4), /* 0010 */ V(6, 11, 4), /* 0011 */ V(11, 6, 4), /* 0100 */ V(3, 12, 3), /* 0101 */ V(3, 12, 3), /* 0110 */ V(2, 12, 3), /* 0111 */ V(2, 12, 3), /* 1000 */ V(12, 2, 3), /* 1001 */ V(12, 2, 3), /* 1010 */ V(5, 11, 3), /* 1011 */ V(5, 11, 3), /* 1100 */ V(11, 5, 4), /* 1101 */ V(8, 9, 4), /* 1110 */ V(1, 12, 3), /* 1111 */ V(1, 12, 3), /* 0000 0100 ... */ /* 0000 */ V(12, 1, 3), /* 132 */ /* 0001 */ V(12, 1, 3), /* 0010 */ V(9, 8, 4), /* 0011 */ V(0, 12, 4), /* 0100 */ V(12, 0, 3), /* 0101 */ V(12, 0, 3), /* 0110 */ V(11, 4, 4), /* 0111 */ V(6, 10, 4), /* 1000 */ V(10, 6, 4), /* 1001 */ V(7, 9, 4), /* 1010 */ V(3, 11, 3), /* 1011 */ V(3, 11, 3), /* 1100 */ V(11, 3, 3), /* 1101 */ V(11, 3, 3), /* 1110 */ V(8, 8, 4), /* 1111 */ V(5, 10, 4), /* 0000 0101 ... */ /* 0000 */ V(2, 11, 3), /* 148 */ /* 0001 */ V(2, 11, 3), /* 0010 */ V(10, 5, 4), /* 0011 */ V(6, 9, 4), /* 0100 */ V(10, 4, 3), /* 0101 */ V(10, 4, 3), /* 0110 */ V(7, 8, 4), /* 0111 */ V(8, 7, 4), /* 1000 */ V(9, 4, 3), /* 1001 */ V(9, 4, 3), /* 1010 */ V(7, 7, 4), /* 1011 */ V(7, 6, 4), /* 1100 */ V(11, 2, 2), /* 1101 */ V(11, 2, 2), /* 1110 */ V(11, 2, 2), /* 1111 */ V(11, 2, 2), /* 0000 0110 ... */ /* 000 */ V(1, 11, 2), /* 164 */ /* 001 */ V(1, 11, 2), /* 010 */ V(11, 1, 2), /* 011 */ V(11, 1, 2), /* 100 */ V(0, 11, 3), /* 101 */ V(11, 0, 3), /* 110 */ V(9, 6, 3), /* 111 */ V(4, 10, 3), /* 0000 0111 ... */ /* 000 */ V(3, 10, 3), /* 172 */ /* 001 */ V(10, 3, 3), /* 010 */ V(5, 9, 3), /* 011 */ V(9, 5, 3), /* 100 */ V(2, 10, 2), /* 101 */ V(2, 10, 2), /* 110 */ V(10, 2, 2), /* 111 */ V(10, 2, 2), /* 0000 1000 ... */ /* 000 */ V(1, 10, 2), /* 180 */ /* 001 */ V(1, 10, 2), /* 010 */ V(10, 1, 2), /* 011 */ V(10, 1, 2), /* 100 */ V(0, 10, 3), /* 101 */ V(6, 8, 3), /* 110 */ V(10, 0, 2), /* 111 */ V(10, 0, 2), /* 0000 1001 ... */ /* 000 */ V(8, 6, 3), /* 188 */ /* 001 */ V(4, 9, 3), /* 010 */ V(9, 3, 2), /* 011 */ V(9, 3, 2), /* 100 */ V(3, 9, 3), /* 101 */ V(5, 8, 3), /* 110 */ V(8, 5, 3), /* 111 */ V(6, 7, 3), /* 0000 1010 ... */ /* 000 */ V(2, 9, 2), /* 196 */ /* 001 */ V(2, 9, 2), /* 010 */ V(9, 2, 2), /* 011 */ V(9, 2, 2), /* 100 */ V(5, 7, 3), /* 101 */ V(7, 5, 3), /* 110 */ V(3, 8, 2), /* 111 */ V(3, 8, 2), /* 0000 1011 ... */ /* 000 */ V(8, 3, 2), /* 204 */ /* 001 */ V(8, 3, 2), /* 010 */ V(6, 6, 3), /* 011 */ V(4, 7, 3), /* 100 */ V(7, 4, 3), /* 101 */ V(5, 6, 3), /* 110 */ V(6, 5, 3), /* 111 */ V(7, 3, 3), /* 0000 1100 ... */ /* 0 */ V(1, 9, 1), /* 212 */ /* 1 */ V(9, 1, 1), /* 0000 1101 ... */ /* 00 */ V(0, 9, 2), /* 214 */ /* 01 */ V(9, 0, 2), /* 10 */ V(4, 8, 2), /* 11 */ V(8, 4, 2), /* 0000 1110 ... */ /* 000 */ V(7, 2, 2), /* 218 */ /* 001 */ V(7, 2, 2), /* 010 */ V(4, 6, 3), /* 011 */ V(6, 4, 3), /* 100 */ V(2, 8, 1), /* 101 */ V(2, 8, 1), /* 110 */ V(2, 8, 1), /* 111 */ V(2, 8, 1), /* 0000 1111 ... */ /* 0 */ V(8, 2, 1), /* 226 */ /* 1 */ V(1, 8, 1), /* 0001 0000 ... */ /* 00 */ V(3, 7, 2), /* 228 */ /* 01 */ V(2, 7, 2), /* 10 */ V(1, 7, 1), /* 11 */ V(1, 7, 1), /* 0001 0001 ... */ /* 00 */ V(7, 1, 1), /* 232 */ /* 01 */ V(7, 1, 1), /* 10 */ V(5, 5, 2), /* 11 */ V(0, 7, 2), /* 0001 0010 ... */ /* 00 */ V(7, 0, 2), /* 236 */ /* 01 */ V(3, 6, 2), /* 10 */ V(6, 3, 2), /* 11 */ V(4, 5, 2), /* 0001 0011 ... */ /* 00 */ V(5, 4, 2), /* 240 */ /* 01 */ V(2, 6, 2), /* 10 */ V(6, 2, 2), /* 11 */ V(3, 5, 2), /* 0001 0101 ... */ /* 0 */ V(0, 8, 1), /* 244 */ /* 1 */ V(8, 0, 1), /* 0001 0110 ... */ /* 0 */ V(1, 6, 1), /* 246 */ /* 1 */ V(6, 1, 1), /* 0001 0111 ... */ /* 0 */ V(0, 6, 1), /* 248 */ /* 1 */ V(6, 0, 1), /* 0001 1000 ... */ /* 00 */ V(5, 3, 2), /* 250 */ /* 01 */ V(4, 4, 2), /* 10 */ V(2, 5, 1), /* 11 */ V(2, 5, 1), /* 0001 1001 ... */ /* 0 */ V(5, 2, 1), /* 254 */ /* 1 */ V(0, 5, 1), /* 0001 1100 ... */ /* 0 */ V(3, 4, 1), /* 256 */ /* 1 */ V(4, 3, 1), /* 0001 1101 ... */ /* 0 */ V(5, 0, 1), /* 258 */ /* 1 */ V(2, 4, 1), /* 0001 1110 ... */ /* 0 */ V(4, 2, 1), /* 260 */ /* 1 */ V(3, 3, 1), /* 0000 0000 0000 ... */ /* 0000 */ PTR(388, 3), /* 262 */ /* 0001 */ V(15, 15, 4), /* 0010 */ V(14, 15, 4), /* 0011 */ V(13, 15, 4), /* 0100 */ V(14, 14, 4), /* 0101 */ V(12, 15, 4), /* 0110 */ V(13, 14, 4), /* 0111 */ V(11, 15, 4), /* 1000 */ V(15, 11, 4), /* 1001 */ V(12, 14, 4), /* 1010 */ V(13, 12, 4), /* 1011 */ PTR(396, 1), /* 1100 */ V(14, 12, 3), /* 1101 */ V(14, 12, 3), /* 1110 */ V(13, 13, 3), /* 1111 */ V(13, 13, 3), /* 0000 0000 0001 ... */ /* 0000 */ V(15, 10, 4), /* 278 */ /* 0001 */ V(12, 13, 4), /* 0010 */ V(11, 14, 3), /* 0011 */ V(11, 14, 3), /* 0100 */ V(14, 11, 3), /* 0101 */ V(14, 11, 3), /* 0110 */ V(9, 15, 3), /* 0111 */ V(9, 15, 3), /* 1000 */ V(15, 9, 3), /* 1001 */ V(15, 9, 3), /* 1010 */ V(14, 10, 3), /* 1011 */ V(14, 10, 3), /* 1100 */ V(11, 13, 3), /* 1101 */ V(11, 13, 3), /* 1110 */ V(13, 11, 3), /* 1111 */ V(13, 11, 3), /* 0000 0000 0010 ... */ /* 0000 */ V(8, 15, 3), /* 294 */ /* 0001 */ V(8, 15, 3), /* 0010 */ V(15, 8, 3), /* 0011 */ V(15, 8, 3), /* 0100 */ V(12, 12, 3), /* 0101 */ V(12, 12, 3), /* 0110 */ V(10, 14, 4), /* 0111 */ V(9, 14, 4), /* 1000 */ V(8, 14, 3), /* 1001 */ V(8, 14, 3), /* 1010 */ V(7, 15, 4), /* 1011 */ V(7, 14, 4), /* 1100 */ V(15, 7, 2), /* 1101 */ V(15, 7, 2), /* 1110 */ V(15, 7, 2), /* 1111 */ V(15, 7, 2), /* 0000 0000 0011 ... */ /* 000 */ V(13, 10, 2), /* 310 */ /* 001 */ V(13, 10, 2), /* 010 */ V(10, 13, 3), /* 011 */ V(11, 12, 3), /* 100 */ V(12, 11, 3), /* 101 */ V(15, 6, 3), /* 110 */ V(6, 15, 2), /* 111 */ V(6, 15, 2), /* 0000 0000 0100 ... */ /* 00 */ V(14, 8, 2), /* 318 */ /* 01 */ V(5, 15, 2), /* 10 */ V(9, 13, 2), /* 11 */ V(13, 9, 2), /* 0000 0000 0101 ... */ /* 00 */ V(15, 5, 2), /* 322 */ /* 01 */ V(14, 7, 2), /* 10 */ V(10, 12, 2), /* 11 */ V(11, 11, 2), /* 0000 0000 0110 ... */ /* 000 */ V(4, 15, 2), /* 326 */ /* 001 */ V(4, 15, 2), /* 010 */ V(15, 4, 2), /* 011 */ V(15, 4, 2), /* 100 */ V(12, 10, 3), /* 101 */ V(14, 6, 3), /* 110 */ V(15, 3, 2), /* 111 */ V(15, 3, 2), /* 0000 0000 0111 ... */ /* 00 */ V(3, 15, 1), /* 334 */ /* 01 */ V(3, 15, 1), /* 10 */ V(8, 13, 2), /* 11 */ V(13, 8, 2), /* 0000 0000 1000 ... */ /* 0 */ V(2, 15, 1), /* 338 */ /* 1 */ V(15, 2, 1), /* 0000 0000 1001 ... */ /* 00 */ V(6, 14, 2), /* 340 */ /* 01 */ V(9, 12, 2), /* 10 */ V(0, 15, 1), /* 11 */ V(0, 15, 1), /* 0000 0000 1010 ... */ /* 00 */ V(12, 9, 2), /* 344 */ /* 01 */ V(5, 14, 2), /* 10 */ V(10, 11, 1), /* 11 */ V(10, 11, 1), /* 0000 0000 1011 ... */ /* 00 */ V(7, 13, 2), /* 348 */ /* 01 */ V(13, 7, 2), /* 10 */ V(4, 14, 1), /* 11 */ V(4, 14, 1), /* 0000 0000 1100 ... */ /* 00 */ V(12, 8, 2), /* 352 */ /* 01 */ V(13, 6, 2), /* 10 */ V(3, 14, 1), /* 11 */ V(3, 14, 1), /* 0000 0000 1101 ... */ /* 00 */ V(11, 9, 1), /* 356 */ /* 01 */ V(11, 9, 1), /* 10 */ V(9, 11, 2), /* 11 */ V(10, 10, 2), /* 0000 0001 0001 ... */ /* 0 */ V(11, 10, 1), /* 360 */ /* 1 */ V(14, 5, 1), /* 0000 0001 0010 ... */ /* 0 */ V(14, 4, 1), /* 362 */ /* 1 */ V(8, 12, 1), /* 0000 0001 0011 ... */ /* 0 */ V(6, 13, 1), /* 364 */ /* 1 */ V(14, 3, 1), /* 0000 0001 0101 ... */ /* 0 */ V(2, 14, 1), /* 366 */ /* 1 */ V(0, 14, 1), /* 0000 0001 1000 ... */ /* 0 */ V(14, 0, 1), /* 368 */ /* 1 */ V(5, 13, 1), /* 0000 0001 1001 ... */ /* 0 */ V(13, 5, 1), /* 370 */ /* 1 */ V(7, 12, 1), /* 0000 0001 1010 ... */ /* 0 */ V(12, 7, 1), /* 372 */ /* 1 */ V(4, 13, 1), /* 0000 0001 1011 ... */ /* 0 */ V(8, 11, 1), /* 374 */ /* 1 */ V(11, 8, 1), /* 0000 0001 1100 ... */ /* 0 */ V(13, 4, 1), /* 376 */ /* 1 */ V(9, 10, 1), /* 0000 0001 1101 ... */ /* 0 */ V(10, 9, 1), /* 378 */ /* 1 */ V(6, 12, 1), /* 0000 0010 0000 ... */ /* 0 */ V(13, 3, 1), /* 380 */ /* 1 */ V(7, 11, 1), /* 0000 0010 0101 ... */ /* 0 */ V(5, 12, 1), /* 382 */ /* 1 */ V(12, 5, 1), /* 0000 0010 0110 ... */ /* 0 */ V(9, 9, 1), /* 384 */ /* 1 */ V(7, 10, 1), /* 0000 0010 1000 ... */ /* 0 */ V(10, 7, 1), /* 386 */ /* 1 */ V(9, 7, 1), /* 0000 0000 0000 0000 ... */ /* 000 */ V(15, 14, 3), /* 388 */ /* 001 */ V(15, 12, 3), /* 010 */ V(15, 13, 2), /* 011 */ V(15, 13, 2), /* 100 */ V(14, 13, 1), /* 101 */ V(14, 13, 1), /* 110 */ V(14, 13, 1), /* 111 */ V(14, 13, 1), /* 0000 0000 0000 1011 ... */ /* 0 */ V(10, 15, 1), /* 396 */ /* 1 */ V(14, 9, 1) ]; const hufftab15 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 4), /* 0011 */ PTR(64, 4), /* 0100 */ PTR(80, 4), /* 0101 */ PTR(96, 3), /* 0110 */ PTR(104, 3), /* 0111 */ PTR(112, 2), /* 1000 */ PTR(116, 1), /* 1001 */ PTR(118, 1), /* 1010 */ V(1, 1, 3), /* 1011 */ V(1, 1, 3), /* 1100 */ V(0, 1, 4), /* 1101 */ V(1, 0, 4), /* 1110 */ V(0, 0, 3), /* 1111 */ V(0, 0, 3), /* 0000 ... */ /* 0000 */ PTR(120, 4), /* 16 */ /* 0001 */ PTR(136, 4), /* 0010 */ PTR(152, 4), /* 0011 */ PTR(168, 4), /* 0100 */ PTR(184, 4), /* 0101 */ PTR(200, 3), /* 0110 */ PTR(208, 3), /* 0111 */ PTR(216, 4), /* 1000 */ PTR(232, 3), /* 1001 */ PTR(240, 3), /* 1010 */ PTR(248, 3), /* 1011 */ PTR(256, 3), /* 1100 */ PTR(264, 2), /* 1101 */ PTR(268, 3), /* 1110 */ PTR(276, 3), /* 1111 */ PTR(284, 2), /* 0001 ... */ /* 0000 */ PTR(288, 2), /* 32 */ /* 0001 */ PTR(292, 2), /* 0010 */ PTR(296, 2), /* 0011 */ PTR(300, 2), /* 0100 */ PTR(304, 2), /* 0101 */ PTR(308, 2), /* 0110 */ PTR(312, 2), /* 0111 */ PTR(316, 2), /* 1000 */ PTR(320, 1), /* 1001 */ PTR(322, 1), /* 1010 */ PTR(324, 1), /* 1011 */ PTR(326, 2), /* 1100 */ PTR(330, 1), /* 1101 */ PTR(332, 1), /* 1110 */ PTR(334, 2), /* 1111 */ PTR(338, 1), /* 0010 ... */ /* 0000 */ PTR(340, 1), /* 48 */ /* 0001 */ PTR(342, 1), /* 0010 */ V(9, 1, 4), /* 0011 */ PTR(344, 1), /* 0100 */ PTR(346, 1), /* 0101 */ PTR(348, 1), /* 0110 */ PTR(350, 1), /* 0111 */ PTR(352, 1), /* 1000 */ V(2, 8, 4), /* 1001 */ V(8, 2, 4), /* 1010 */ V(1, 8, 4), /* 1011 */ V(8, 1, 4), /* 1100 */ PTR(354, 1), /* 1101 */ PTR(356, 1), /* 1110 */ PTR(358, 1), /* 1111 */ PTR(360, 1), /* 0011 ... */ /* 0000 */ V(2, 7, 4), /* 64 */ /* 0001 */ V(7, 2, 4), /* 0010 */ V(6, 4, 4), /* 0011 */ V(1, 7, 4), /* 0100 */ V(5, 5, 4), /* 0101 */ V(7, 1, 4), /* 0110 */ PTR(362, 1), /* 0111 */ V(3, 6, 4), /* 1000 */ V(6, 3, 4), /* 1001 */ V(4, 5, 4), /* 1010 */ V(5, 4, 4), /* 1011 */ V(2, 6, 4), /* 1100 */ V(6, 2, 4), /* 1101 */ V(1, 6, 4), /* 1110 */ PTR(364, 1), /* 1111 */ V(3, 5, 4), /* 0100 ... */ /* 0000 */ V(6, 1, 3), /* 80 */ /* 0001 */ V(6, 1, 3), /* 0010 */ V(5, 3, 4), /* 0011 */ V(4, 4, 4), /* 0100 */ V(2, 5, 3), /* 0101 */ V(2, 5, 3), /* 0110 */ V(5, 2, 3), /* 0111 */ V(5, 2, 3), /* 1000 */ V(1, 5, 3), /* 1001 */ V(1, 5, 3), /* 1010 */ V(5, 1, 3), /* 1011 */ V(5, 1, 3), /* 1100 */ V(0, 5, 4), /* 1101 */ V(5, 0, 4), /* 1110 */ V(3, 4, 3), /* 1111 */ V(3, 4, 3), /* 0101 ... */ /* 000 */ V(4, 3, 3), /* 96 */ /* 001 */ V(2, 4, 3), /* 010 */ V(4, 2, 3), /* 011 */ V(3, 3, 3), /* 100 */ V(4, 1, 2), /* 101 */ V(4, 1, 2), /* 110 */ V(1, 4, 3), /* 111 */ V(0, 4, 3), /* 0110 ... */ /* 000 */ V(2, 3, 2), /* 104 */ /* 001 */ V(2, 3, 2), /* 010 */ V(3, 2, 2), /* 011 */ V(3, 2, 2), /* 100 */ V(4, 0, 3), /* 101 */ V(0, 3, 3), /* 110 */ V(1, 3, 2), /* 111 */ V(1, 3, 2), /* 0111 ... */ /* 00 */ V(3, 1, 2), /* 112 */ /* 01 */ V(3, 0, 2), /* 10 */ V(2, 2, 1), /* 11 */ V(2, 2, 1), /* 1000 ... */ /* 0 */ V(1, 2, 1), /* 116 */ /* 1 */ V(2, 1, 1), /* 1001 ... */ /* 0 */ V(0, 2, 1), /* 118 */ /* 1 */ V(2, 0, 1), /* 0000 0000 ... */ /* 0000 */ PTR(366, 1), /* 120 */ /* 0001 */ PTR(368, 1), /* 0010 */ V(14, 14, 4), /* 0011 */ PTR(370, 1), /* 0100 */ PTR(372, 1), /* 0101 */ PTR(374, 1), /* 0110 */ V(15, 11, 4), /* 0111 */ PTR(376, 1), /* 1000 */ V(13, 13, 4), /* 1001 */ V(10, 15, 4), /* 1010 */ V(15, 10, 4), /* 1011 */ V(11, 14, 4), /* 1100 */ V(14, 11, 4), /* 1101 */ V(12, 13, 4), /* 1110 */ V(13, 12, 4), /* 1111 */ V(9, 15, 4), /* 0000 0001 ... */ /* 0000 */ V(15, 9, 4), /* 136 */ /* 0001 */ V(14, 10, 4), /* 0010 */ V(11, 13, 4), /* 0011 */ V(13, 11, 4), /* 0100 */ V(8, 15, 4), /* 0101 */ V(15, 8, 4), /* 0110 */ V(12, 12, 4), /* 0111 */ V(9, 14, 4), /* 1000 */ V(14, 9, 4), /* 1001 */ V(7, 15, 4), /* 1010 */ V(15, 7, 4), /* 1011 */ V(10, 13, 4), /* 1100 */ V(13, 10, 4), /* 1101 */ V(11, 12, 4), /* 1110 */ V(6, 15, 4), /* 1111 */ PTR(378, 1), /* 0000 0010 ... */ /* 0000 */ V(12, 11, 3), /* 152 */ /* 0001 */ V(12, 11, 3), /* 0010 */ V(15, 6, 3), /* 0011 */ V(15, 6, 3), /* 0100 */ V(8, 14, 4), /* 0101 */ V(14, 8, 4), /* 0110 */ V(5, 15, 4), /* 0111 */ V(9, 13, 4), /* 1000 */ V(15, 5, 3), /* 1001 */ V(15, 5, 3), /* 1010 */ V(7, 14, 3), /* 1011 */ V(7, 14, 3), /* 1100 */ V(14, 7, 3), /* 1101 */ V(14, 7, 3), /* 1110 */ V(10, 12, 3), /* 1111 */ V(10, 12, 3), /* 0000 0011 ... */ /* 0000 */ V(12, 10, 3), /* 168 */ /* 0001 */ V(12, 10, 3), /* 0010 */ V(11, 11, 3), /* 0011 */ V(11, 11, 3), /* 0100 */ V(13, 9, 4), /* 0101 */ V(8, 13, 4), /* 0110 */ V(4, 15, 3), /* 0111 */ V(4, 15, 3), /* 1000 */ V(15, 4, 3), /* 1001 */ V(15, 4, 3), /* 1010 */ V(3, 15, 3), /* 1011 */ V(3, 15, 3), /* 1100 */ V(15, 3, 3), /* 1101 */ V(15, 3, 3), /* 1110 */ V(13, 8, 3), /* 1111 */ V(13, 8, 3), /* 0000 0100 ... */ /* 0000 */ V(14, 6, 3), /* 184 */ /* 0001 */ V(14, 6, 3), /* 0010 */ V(2, 15, 3), /* 0011 */ V(2, 15, 3), /* 0100 */ V(15, 2, 3), /* 0101 */ V(15, 2, 3), /* 0110 */ V(6, 14, 4), /* 0111 */ V(15, 0, 4), /* 1000 */ V(1, 15, 3), /* 1001 */ V(1, 15, 3), /* 1010 */ V(15, 1, 3), /* 1011 */ V(15, 1, 3), /* 1100 */ V(9, 12, 3), /* 1101 */ V(9, 12, 3), /* 1110 */ V(12, 9, 3), /* 1111 */ V(12, 9, 3), /* 0000 0101 ... */ /* 000 */ V(5, 14, 3), /* 200 */ /* 001 */ V(10, 11, 3), /* 010 */ V(11, 10, 3), /* 011 */ V(14, 5, 3), /* 100 */ V(7, 13, 3), /* 101 */ V(13, 7, 3), /* 110 */ V(4, 14, 3), /* 111 */ V(14, 4, 3), /* 0000 0110 ... */ /* 000 */ V(8, 12, 3), /* 208 */ /* 001 */ V(12, 8, 3), /* 010 */ V(3, 14, 3), /* 011 */ V(6, 13, 3), /* 100 */ V(13, 6, 3), /* 101 */ V(14, 3, 3), /* 110 */ V(9, 11, 3), /* 111 */ V(11, 9, 3), /* 0000 0111 ... */ /* 0000 */ V(2, 14, 3), /* 216 */ /* 0001 */ V(2, 14, 3), /* 0010 */ V(10, 10, 3), /* 0011 */ V(10, 10, 3), /* 0100 */ V(14, 2, 3), /* 0101 */ V(14, 2, 3), /* 0110 */ V(1, 14, 3), /* 0111 */ V(1, 14, 3), /* 1000 */ V(14, 1, 3), /* 1001 */ V(14, 1, 3), /* 1010 */ V(0, 14, 4), /* 1011 */ V(14, 0, 4), /* 1100 */ V(5, 13, 3), /* 1101 */ V(5, 13, 3), /* 1110 */ V(13, 5, 3), /* 1111 */ V(13, 5, 3), /* 0000 1000 ... */ /* 000 */ V(7, 12, 3), /* 232 */ /* 001 */ V(12, 7, 3), /* 010 */ V(4, 13, 3), /* 011 */ V(8, 11, 3), /* 100 */ V(13, 4, 2), /* 101 */ V(13, 4, 2), /* 110 */ V(11, 8, 3), /* 111 */ V(9, 10, 3), /* 0000 1001 ... */ /* 000 */ V(10, 9, 3), /* 240 */ /* 001 */ V(6, 12, 3), /* 010 */ V(12, 6, 3), /* 011 */ V(3, 13, 3), /* 100 */ V(13, 3, 2), /* 101 */ V(13, 3, 2), /* 110 */ V(13, 2, 2), /* 111 */ V(13, 2, 2), /* 0000 1010 ... */ /* 000 */ V(2, 13, 3), /* 248 */ /* 001 */ V(0, 13, 3), /* 010 */ V(1, 13, 2), /* 011 */ V(1, 13, 2), /* 100 */ V(7, 11, 2), /* 101 */ V(7, 11, 2), /* 110 */ V(11, 7, 2), /* 111 */ V(11, 7, 2), /* 0000 1011 ... */ /* 000 */ V(13, 1, 2), /* 256 */ /* 001 */ V(13, 1, 2), /* 010 */ V(5, 12, 3), /* 011 */ V(13, 0, 3), /* 100 */ V(12, 5, 2), /* 101 */ V(12, 5, 2), /* 110 */ V(8, 10, 2), /* 111 */ V(8, 10, 2), /* 0000 1100 ... */ /* 00 */ V(10, 8, 2), /* 264 */ /* 01 */ V(4, 12, 2), /* 10 */ V(12, 4, 2), /* 11 */ V(6, 11, 2), /* 0000 1101 ... */ /* 000 */ V(11, 6, 2), /* 268 */ /* 001 */ V(11, 6, 2), /* 010 */ V(9, 9, 3), /* 011 */ V(0, 12, 3), /* 100 */ V(3, 12, 2), /* 101 */ V(3, 12, 2), /* 110 */ V(12, 3, 2), /* 111 */ V(12, 3, 2), /* 0000 1110 ... */ /* 000 */ V(7, 10, 2), /* 276 */ /* 001 */ V(7, 10, 2), /* 010 */ V(10, 7, 2), /* 011 */ V(10, 7, 2), /* 100 */ V(10, 6, 2), /* 101 */ V(10, 6, 2), /* 110 */ V(12, 0, 3), /* 111 */ V(0, 11, 3), /* 0000 1111 ... */ /* 00 */ V(12, 2, 1), /* 284 */ /* 01 */ V(12, 2, 1), /* 10 */ V(2, 12, 2), /* 11 */ V(5, 11, 2), /* 0001 0000 ... */ /* 00 */ V(11, 5, 2), /* 288 */ /* 01 */ V(1, 12, 2), /* 10 */ V(8, 9, 2), /* 11 */ V(9, 8, 2), /* 0001 0001 ... */ /* 00 */ V(12, 1, 2), /* 292 */ /* 01 */ V(4, 11, 2), /* 10 */ V(11, 4, 2), /* 11 */ V(6, 10, 2), /* 0001 0010 ... */ /* 00 */ V(3, 11, 2), /* 296 */ /* 01 */ V(7, 9, 2), /* 10 */ V(11, 3, 1), /* 11 */ V(11, 3, 1), /* 0001 0011 ... */ /* 00 */ V(9, 7, 2), /* 300 */ /* 01 */ V(8, 8, 2), /* 10 */ V(2, 11, 2), /* 11 */ V(5, 10, 2), /* 0001 0100 ... */ /* 00 */ V(11, 2, 1), /* 304 */ /* 01 */ V(11, 2, 1), /* 10 */ V(10, 5, 2), /* 11 */ V(1, 11, 2), /* 0001 0101 ... */ /* 00 */ V(11, 1, 1), /* 308 */ /* 01 */ V(11, 1, 1), /* 10 */ V(11, 0, 2), /* 11 */ V(6, 9, 2), /* 0001 0110 ... */ /* 00 */ V(9, 6, 2), /* 312 */ /* 01 */ V(4, 10, 2), /* 10 */ V(10, 4, 2), /* 11 */ V(7, 8, 2), /* 0001 0111 ... */ /* 00 */ V(8, 7, 2), /* 316 */ /* 01 */ V(3, 10, 2), /* 10 */ V(10, 3, 1), /* 11 */ V(10, 3, 1), /* 0001 1000 ... */ /* 0 */ V(5, 9, 1), /* 320 */ /* 1 */ V(9, 5, 1), /* 0001 1001 ... */ /* 0 */ V(2, 10, 1), /* 322 */ /* 1 */ V(10, 2, 1), /* 0001 1010 ... */ /* 0 */ V(1, 10, 1), /* 324 */ /* 1 */ V(10, 1, 1), /* 0001 1011 ... */ /* 00 */ V(0, 10, 2), /* 326 */ /* 01 */ V(10, 0, 2), /* 10 */ V(6, 8, 1), /* 11 */ V(6, 8, 1), /* 0001 1100 ... */ /* 0 */ V(8, 6, 1), /* 330 */ /* 1 */ V(4, 9, 1), /* 0001 1101 ... */ /* 0 */ V(9, 4, 1), /* 332 */ /* 1 */ V(3, 9, 1), /* 0001 1110 ... */ /* 00 */ V(9, 3, 1), /* 334 */ /* 01 */ V(9, 3, 1), /* 10 */ V(7, 7, 2), /* 11 */ V(0, 9, 2), /* 0001 1111 ... */ /* 0 */ V(5, 8, 1), /* 338 */ /* 1 */ V(8, 5, 1), /* 0010 0000 ... */ /* 0 */ V(2, 9, 1), /* 340 */ /* 1 */ V(6, 7, 1), /* 0010 0001 ... */ /* 0 */ V(7, 6, 1), /* 342 */ /* 1 */ V(9, 2, 1), /* 0010 0011 ... */ /* 0 */ V(1, 9, 1), /* 344 */ /* 1 */ V(9, 0, 1), /* 0010 0100 ... */ /* 0 */ V(4, 8, 1), /* 346 */ /* 1 */ V(8, 4, 1), /* 0010 0101 ... */ /* 0 */ V(5, 7, 1), /* 348 */ /* 1 */ V(7, 5, 1), /* 0010 0110 ... */ /* 0 */ V(3, 8, 1), /* 350 */ /* 1 */ V(8, 3, 1), /* 0010 0111 ... */ /* 0 */ V(6, 6, 1), /* 352 */ /* 1 */ V(4, 7, 1), /* 0010 1100 ... */ /* 0 */ V(7, 4, 1), /* 354 */ /* 1 */ V(0, 8, 1), /* 0010 1101 ... */ /* 0 */ V(8, 0, 1), /* 356 */ /* 1 */ V(5, 6, 1), /* 0010 1110 ... */ /* 0 */ V(6, 5, 1), /* 358 */ /* 1 */ V(3, 7, 1), /* 0010 1111 ... */ /* 0 */ V(7, 3, 1), /* 360 */ /* 1 */ V(4, 6, 1), /* 0011 0110 ... */ /* 0 */ V(0, 7, 1), /* 362 */ /* 1 */ V(7, 0, 1), /* 0011 1110 ... */ /* 0 */ V(0, 6, 1), /* 364 */ /* 1 */ V(6, 0, 1), /* 0000 0000 0000 ... */ /* 0 */ V(15, 15, 1), /* 366 */ /* 1 */ V(14, 15, 1), /* 0000 0000 0001 ... */ /* 0 */ V(15, 14, 1), /* 368 */ /* 1 */ V(13, 15, 1), /* 0000 0000 0011 ... */ /* 0 */ V(15, 13, 1), /* 370 */ /* 1 */ V(12, 15, 1), /* 0000 0000 0100 ... */ /* 0 */ V(15, 12, 1), /* 372 */ /* 1 */ V(13, 14, 1), /* 0000 0000 0101 ... */ /* 0 */ V(14, 13, 1), /* 374 */ /* 1 */ V(11, 15, 1), /* 0000 0000 0111 ... */ /* 0 */ V(12, 14, 1), /* 376 */ /* 1 */ V(14, 12, 1), /* 0000 0001 1111 ... */ /* 0 */ V(10, 14, 1), /* 378 */ /* 1 */ V(0, 15, 1) ]; const hufftab16 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 4), /* 0011 */ PTR(64, 2), /* 0100 */ V(1, 1, 4), /* 0101 */ V(0, 1, 4), /* 0110 */ V(1, 0, 3), /* 0111 */ V(1, 0, 3), /* 1000 */ V(0, 0, 1), /* 1001 */ V(0, 0, 1), /* 1010 */ V(0, 0, 1), /* 1011 */ V(0, 0, 1), /* 1100 */ V(0, 0, 1), /* 1101 */ V(0, 0, 1), /* 1110 */ V(0, 0, 1), /* 1111 */ V(0, 0, 1), /* 0000 ... */ /* 0000 */ PTR(68, 3), /* 16 */ /* 0001 */ PTR(76, 3), /* 0010 */ PTR(84, 2), /* 0011 */ V(15, 15, 4), /* 0100 */ PTR(88, 2), /* 0101 */ PTR(92, 1), /* 0110 */ PTR(94, 4), /* 0111 */ V(15, 2, 4), /* 1000 */ PTR(110, 1), /* 1001 */ V(1, 15, 4), /* 1010 */ V(15, 1, 4), /* 1011 */ PTR(112, 4), /* 1100 */ PTR(128, 4), /* 1101 */ PTR(144, 4), /* 1110 */ PTR(160, 4), /* 1111 */ PTR(176, 4), /* 0001 ... */ /* 0000 */ PTR(192, 4), /* 32 */ /* 0001 */ PTR(208, 3), /* 0010 */ PTR(216, 3), /* 0011 */ PTR(224, 3), /* 0100 */ PTR(232, 3), /* 0101 */ PTR(240, 3), /* 0110 */ PTR(248, 3), /* 0111 */ PTR(256, 3), /* 1000 */ PTR(264, 2), /* 1001 */ PTR(268, 2), /* 1010 */ PTR(272, 1), /* 1011 */ PTR(274, 2), /* 1100 */ PTR(278, 2), /* 1101 */ PTR(282, 1), /* 1110 */ V(5, 1, 4), /* 1111 */ PTR(284, 1), /* 0010 ... */ /* 0000 */ PTR(286, 1), /* 48 */ /* 0001 */ PTR(288, 1), /* 0010 */ PTR(290, 1), /* 0011 */ V(1, 4, 4), /* 0100 */ V(4, 1, 4), /* 0101 */ PTR(292, 1), /* 0110 */ V(2, 3, 4), /* 0111 */ V(3, 2, 4), /* 1000 */ V(1, 3, 3), /* 1001 */ V(1, 3, 3), /* 1010 */ V(3, 1, 3), /* 1011 */ V(3, 1, 3), /* 1100 */ V(0, 3, 4), /* 1101 */ V(3, 0, 4), /* 1110 */ V(2, 2, 3), /* 1111 */ V(2, 2, 3), /* 0011 ... */ /* 00 */ V(1, 2, 2), /* 64 */ /* 01 */ V(2, 1, 2), /* 10 */ V(0, 2, 2), /* 11 */ V(2, 0, 2), /* 0000 0000 ... */ /* 000 */ V(14, 15, 3), /* 68 */ /* 001 */ V(15, 14, 3), /* 010 */ V(13, 15, 3), /* 011 */ V(15, 13, 3), /* 100 */ V(12, 15, 3), /* 101 */ V(15, 12, 3), /* 110 */ V(11, 15, 3), /* 111 */ V(15, 11, 3), /* 0000 0001 ... */ /* 000 */ V(10, 15, 2), /* 76 */ /* 001 */ V(10, 15, 2), /* 010 */ V(15, 10, 3), /* 011 */ V(9, 15, 3), /* 100 */ V(15, 9, 3), /* 101 */ V(15, 8, 3), /* 110 */ V(8, 15, 2), /* 111 */ V(8, 15, 2), /* 0000 0010 ... */ /* 00 */ V(7, 15, 2), /* 84 */ /* 01 */ V(15, 7, 2), /* 10 */ V(6, 15, 2), /* 11 */ V(15, 6, 2), /* 0000 0100 ... */ /* 00 */ V(5, 15, 2), /* 88 */ /* 01 */ V(15, 5, 2), /* 10 */ V(4, 15, 1), /* 11 */ V(4, 15, 1), /* 0000 0101 ... */ /* 0 */ V(15, 4, 1), /* 92 */ /* 1 */ V(15, 3, 1), /* 0000 0110 ... */ /* 0000 */ V(15, 0, 1), /* 94 */ /* 0001 */ V(15, 0, 1), /* 0010 */ V(15, 0, 1), /* 0011 */ V(15, 0, 1), /* 0100 */ V(15, 0, 1), /* 0101 */ V(15, 0, 1), /* 0110 */ V(15, 0, 1), /* 0111 */ V(15, 0, 1), /* 1000 */ V(3, 15, 2), /* 1001 */ V(3, 15, 2), /* 1010 */ V(3, 15, 2), /* 1011 */ V(3, 15, 2), /* 1100 */ PTR(294, 4), /* 1101 */ PTR(310, 3), /* 1110 */ PTR(318, 3), /* 1111 */ PTR(326, 3), /* 0000 1000 ... */ /* 0 */ V(2, 15, 1), /* 110 */ /* 1 */ V(0, 15, 1), /* 0000 1011 ... */ /* 0000 */ PTR(334, 2), /* 112 */ /* 0001 */ PTR(338, 2), /* 0010 */ PTR(342, 2), /* 0011 */ PTR(346, 1), /* 0100 */ PTR(348, 2), /* 0101 */ PTR(352, 2), /* 0110 */ PTR(356, 1), /* 0111 */ PTR(358, 2), /* 1000 */ PTR(362, 2), /* 1001 */ PTR(366, 2), /* 1010 */ PTR(370, 2), /* 1011 */ V(14, 3, 4), /* 1100 */ PTR(374, 1), /* 1101 */ PTR(376, 1), /* 1110 */ PTR(378, 1), /* 1111 */ PTR(380, 1), /* 0000 1100 ... */ /* 0000 */ PTR(382, 1), /* 128 */ /* 0001 */ PTR(384, 1), /* 0010 */ PTR(386, 1), /* 0011 */ V(0, 13, 4), /* 0100 */ PTR(388, 1), /* 0101 */ PTR(390, 1), /* 0110 */ PTR(392, 1), /* 0111 */ V(3, 12, 4), /* 1000 */ PTR(394, 1), /* 1001 */ V(1, 12, 4), /* 1010 */ V(12, 0, 4), /* 1011 */ PTR(396, 1), /* 1100 */ V(14, 2, 3), /* 1101 */ V(14, 2, 3), /* 1110 */ V(2, 14, 4), /* 1111 */ V(1, 14, 4), /* 0000 1101 ... */ /* 0000 */ V(13, 3, 4), /* 144 */ /* 0001 */ V(2, 13, 4), /* 0010 */ V(13, 2, 4), /* 0011 */ V(13, 1, 4), /* 0100 */ V(3, 11, 4), /* 0101 */ PTR(398, 1), /* 0110 */ V(1, 13, 3), /* 0111 */ V(1, 13, 3), /* 1000 */ V(12, 4, 4), /* 1001 */ V(6, 11, 4), /* 1010 */ V(12, 3, 4), /* 1011 */ V(10, 7, 4), /* 1100 */ V(2, 12, 3), /* 1101 */ V(2, 12, 3), /* 1110 */ V(12, 2, 4), /* 1111 */ V(11, 5, 4), /* 0000 1110 ... */ /* 0000 */ V(12, 1, 4), /* 160 */ /* 0001 */ V(0, 12, 4), /* 0010 */ V(4, 11, 4), /* 0011 */ V(11, 4, 4), /* 0100 */ V(6, 10, 4), /* 0101 */ V(10, 6, 4), /* 0110 */ V(11, 3, 3), /* 0111 */ V(11, 3, 3), /* 1000 */ V(5, 10, 4), /* 1001 */ V(10, 5, 4), /* 1010 */ V(2, 11, 3), /* 1011 */ V(2, 11, 3), /* 1100 */ V(11, 2, 3), /* 1101 */ V(11, 2, 3), /* 1110 */ V(1, 11, 3), /* 1111 */ V(1, 11, 3), /* 0000 1111 ... */ /* 0000 */ V(11, 1, 3), /* 176 */ /* 0001 */ V(11, 1, 3), /* 0010 */ V(0, 11, 4), /* 0011 */ V(11, 0, 4), /* 0100 */ V(6, 9, 4), /* 0101 */ V(9, 6, 4), /* 0110 */ V(4, 10, 4), /* 0111 */ V(10, 4, 4), /* 1000 */ V(7, 8, 4), /* 1001 */ V(8, 7, 4), /* 1010 */ V(10, 3, 3), /* 1011 */ V(10, 3, 3), /* 1100 */ V(3, 10, 4), /* 1101 */ V(5, 9, 4), /* 1110 */ V(2, 10, 3), /* 1111 */ V(2, 10, 3), /* 0001 0000 ... */ /* 0000 */ V(9, 5, 4), /* 192 */ /* 0001 */ V(6, 8, 4), /* 0010 */ V(10, 1, 3), /* 0011 */ V(10, 1, 3), /* 0100 */ V(8, 6, 4), /* 0101 */ V(7, 7, 4), /* 0110 */ V(9, 4, 3), /* 0111 */ V(9, 4, 3), /* 1000 */ V(4, 9, 4), /* 1001 */ V(5, 7, 4), /* 1010 */ V(6, 7, 3), /* 1011 */ V(6, 7, 3), /* 1100 */ V(10, 2, 2), /* 1101 */ V(10, 2, 2), /* 1110 */ V(10, 2, 2), /* 1111 */ V(10, 2, 2), /* 0001 0001 ... */ /* 000 */ V(1, 10, 2), /* 208 */ /* 001 */ V(1, 10, 2), /* 010 */ V(0, 10, 3), /* 011 */ V(10, 0, 3), /* 100 */ V(3, 9, 3), /* 101 */ V(9, 3, 3), /* 110 */ V(5, 8, 3), /* 111 */ V(8, 5, 3), /* 0001 0010 ... */ /* 000 */ V(2, 9, 2), /* 216 */ /* 001 */ V(2, 9, 2), /* 010 */ V(9, 2, 2), /* 011 */ V(9, 2, 2), /* 100 */ V(7, 6, 3), /* 101 */ V(0, 9, 3), /* 110 */ V(1, 9, 2), /* 111 */ V(1, 9, 2), /* 0001 0011 ... */ /* 000 */ V(9, 1, 2), /* 224 */ /* 001 */ V(9, 1, 2), /* 010 */ V(9, 0, 3), /* 011 */ V(4, 8, 3), /* 100 */ V(8, 4, 3), /* 101 */ V(7, 5, 3), /* 110 */ V(3, 8, 3), /* 111 */ V(8, 3, 3), /* 0001 0100 ... */ /* 000 */ V(6, 6, 3), /* 232 */ /* 001 */ V(2, 8, 3), /* 010 */ V(8, 2, 2), /* 011 */ V(8, 2, 2), /* 100 */ V(4, 7, 3), /* 101 */ V(7, 4, 3), /* 110 */ V(1, 8, 2), /* 111 */ V(1, 8, 2), /* 0001 0101 ... */ /* 000 */ V(8, 1, 2), /* 240 */ /* 001 */ V(8, 1, 2), /* 010 */ V(8, 0, 2), /* 011 */ V(8, 0, 2), /* 100 */ V(0, 8, 3), /* 101 */ V(5, 6, 3), /* 110 */ V(3, 7, 2), /* 111 */ V(3, 7, 2), /* 0001 0110 ... */ /* 000 */ V(7, 3, 2), /* 248 */ /* 001 */ V(7, 3, 2), /* 010 */ V(6, 5, 3), /* 011 */ V(4, 6, 3), /* 100 */ V(2, 7, 2), /* 101 */ V(2, 7, 2), /* 110 */ V(7, 2, 2), /* 111 */ V(7, 2, 2), /* 0001 0111 ... */ /* 000 */ V(6, 4, 3), /* 256 */ /* 001 */ V(5, 5, 3), /* 010 */ V(0, 7, 2), /* 011 */ V(0, 7, 2), /* 100 */ V(1, 7, 1), /* 101 */ V(1, 7, 1), /* 110 */ V(1, 7, 1), /* 111 */ V(1, 7, 1), /* 0001 1000 ... */ /* 00 */ V(7, 1, 1), /* 264 */ /* 01 */ V(7, 1, 1), /* 10 */ V(7, 0, 2), /* 11 */ V(3, 6, 2), /* 0001 1001 ... */ /* 00 */ V(6, 3, 2), /* 268 */ /* 01 */ V(4, 5, 2), /* 10 */ V(5, 4, 2), /* 11 */ V(2, 6, 2), /* 0001 1010 ... */ /* 0 */ V(6, 2, 1), /* 272 */ /* 1 */ V(1, 6, 1), /* 0001 1011 ... */ /* 00 */ V(6, 1, 1), /* 274 */ /* 01 */ V(6, 1, 1), /* 10 */ V(0, 6, 2), /* 11 */ V(6, 0, 2), /* 0001 1100 ... */ /* 00 */ V(5, 3, 1), /* 278 */ /* 01 */ V(5, 3, 1), /* 10 */ V(3, 5, 2), /* 11 */ V(4, 4, 2), /* 0001 1101 ... */ /* 0 */ V(2, 5, 1), /* 282 */ /* 1 */ V(5, 2, 1), /* 0001 1111 ... */ /* 0 */ V(1, 5, 1), /* 284 */ /* 1 */ V(0, 5, 1), /* 0010 0000 ... */ /* 0 */ V(3, 4, 1), /* 286 */ /* 1 */ V(4, 3, 1), /* 0010 0001 ... */ /* 0 */ V(5, 0, 1), /* 288 */ /* 1 */ V(2, 4, 1), /* 0010 0010 ... */ /* 0 */ V(4, 2, 1), /* 290 */ /* 1 */ V(3, 3, 1), /* 0010 0101 ... */ /* 0 */ V(0, 4, 1), /* 292 */ /* 1 */ V(4, 0, 1), /* 0000 0110 1100 ... */ /* 0000 */ V(12, 14, 4), /* 294 */ /* 0001 */ PTR(400, 1), /* 0010 */ V(13, 14, 3), /* 0011 */ V(13, 14, 3), /* 0100 */ V(14, 9, 3), /* 0101 */ V(14, 9, 3), /* 0110 */ V(14, 10, 4), /* 0111 */ V(13, 9, 4), /* 1000 */ V(14, 14, 2), /* 1001 */ V(14, 14, 2), /* 1010 */ V(14, 14, 2), /* 1011 */ V(14, 14, 2), /* 1100 */ V(14, 13, 3), /* 1101 */ V(14, 13, 3), /* 1110 */ V(14, 11, 3), /* 1111 */ V(14, 11, 3), /* 0000 0110 1101 ... */ /* 000 */ V(11, 14, 2), /* 310 */ /* 001 */ V(11, 14, 2), /* 010 */ V(12, 13, 2), /* 011 */ V(12, 13, 2), /* 100 */ V(13, 12, 3), /* 101 */ V(13, 11, 3), /* 110 */ V(10, 14, 2), /* 111 */ V(10, 14, 2), /* 0000 0110 1110 ... */ /* 000 */ V(12, 12, 2), /* 318 */ /* 001 */ V(12, 12, 2), /* 010 */ V(10, 13, 3), /* 011 */ V(13, 10, 3), /* 100 */ V(7, 14, 3), /* 101 */ V(10, 12, 3), /* 110 */ V(12, 10, 2), /* 111 */ V(12, 10, 2), /* 0000 0110 1111 ... */ /* 000 */ V(12, 9, 3), /* 326 */ /* 001 */ V(7, 13, 3), /* 010 */ V(5, 14, 2), /* 011 */ V(5, 14, 2), /* 100 */ V(11, 13, 1), /* 101 */ V(11, 13, 1), /* 110 */ V(11, 13, 1), /* 111 */ V(11, 13, 1), /* 0000 1011 0000 ... */ /* 00 */ V(9, 14, 1), /* 334 */ /* 01 */ V(9, 14, 1), /* 10 */ V(11, 12, 2), /* 11 */ V(12, 11, 2), /* 0000 1011 0001 ... */ /* 00 */ V(8, 14, 2), /* 338 */ /* 01 */ V(14, 8, 2), /* 10 */ V(9, 13, 2), /* 11 */ V(14, 7, 2), /* 0000 1011 0010 ... */ /* 00 */ V(11, 11, 2), /* 342 */ /* 01 */ V(8, 13, 2), /* 10 */ V(13, 8, 2), /* 11 */ V(6, 14, 2), /* 0000 1011 0011 ... */ /* 0 */ V(14, 6, 1), /* 346 */ /* 1 */ V(9, 12, 1), /* 0000 1011 0100 ... */ /* 00 */ V(10, 11, 2), /* 348 */ /* 01 */ V(11, 10, 2), /* 10 */ V(14, 5, 2), /* 11 */ V(13, 7, 2), /* 0000 1011 0101 ... */ /* 00 */ V(4, 14, 1), /* 352 */ /* 01 */ V(4, 14, 1), /* 10 */ V(14, 4, 2), /* 11 */ V(8, 12, 2), /* 0000 1011 0110 ... */ /* 0 */ V(12, 8, 1), /* 356 */ /* 1 */ V(3, 14, 1), /* 0000 1011 0111 ... */ /* 00 */ V(6, 13, 1), /* 358 */ /* 01 */ V(6, 13, 1), /* 10 */ V(13, 6, 2), /* 11 */ V(9, 11, 2), /* 0000 1011 1000 ... */ /* 00 */ V(11, 9, 2), /* 362 */ /* 01 */ V(10, 10, 2), /* 10 */ V(14, 1, 1), /* 11 */ V(14, 1, 1), /* 0000 1011 1001 ... */ /* 00 */ V(13, 4, 1), /* 366 */ /* 01 */ V(13, 4, 1), /* 10 */ V(11, 8, 2), /* 11 */ V(10, 9, 2), /* 0000 1011 1010 ... */ /* 00 */ V(7, 11, 1), /* 370 */ /* 01 */ V(7, 11, 1), /* 10 */ V(11, 7, 2), /* 11 */ V(13, 0, 2), /* 0000 1011 1100 ... */ /* 0 */ V(0, 14, 1), /* 374 */ /* 1 */ V(14, 0, 1), /* 0000 1011 1101 ... */ /* 0 */ V(5, 13, 1), /* 376 */ /* 1 */ V(13, 5, 1), /* 0000 1011 1110 ... */ /* 0 */ V(7, 12, 1), /* 378 */ /* 1 */ V(12, 7, 1), /* 0000 1011 1111 ... */ /* 0 */ V(4, 13, 1), /* 380 */ /* 1 */ V(8, 11, 1), /* 0000 1100 0000 ... */ /* 0 */ V(9, 10, 1), /* 382 */ /* 1 */ V(6, 12, 1), /* 0000 1100 0001 ... */ /* 0 */ V(12, 6, 1), /* 384 */ /* 1 */ V(3, 13, 1), /* 0000 1100 0010 ... */ /* 0 */ V(5, 12, 1), /* 386 */ /* 1 */ V(12, 5, 1), /* 0000 1100 0100 ... */ /* 0 */ V(8, 10, 1), /* 388 */ /* 1 */ V(10, 8, 1), /* 0000 1100 0101 ... */ /* 0 */ V(9, 9, 1), /* 390 */ /* 1 */ V(4, 12, 1), /* 0000 1100 0110 ... */ /* 0 */ V(11, 6, 1), /* 392 */ /* 1 */ V(7, 10, 1), /* 0000 1100 1000 ... */ /* 0 */ V(5, 11, 1), /* 394 */ /* 1 */ V(8, 9, 1), /* 0000 1100 1011 ... */ /* 0 */ V(9, 8, 1), /* 396 */ /* 1 */ V(7, 9, 1), /* 0000 1101 0101 ... */ /* 0 */ V(9, 7, 1), /* 398 */ /* 1 */ V(8, 8, 1), /* 0000 0110 1100 0001 ... */ /* 0 */ V(14, 12, 1), /* 400 */ /* 1 */ V(13, 13, 1) ]; const hufftab24 = [ /* 0000 */ PTR(16, 4), /* 0001 */ PTR(32, 4), /* 0010 */ PTR(48, 4), /* 0011 */ V(15, 15, 4), /* 0100 */ PTR(64, 4), /* 0101 */ PTR(80, 4), /* 0110 */ PTR(96, 4), /* 0111 */ PTR(112, 4), /* 1000 */ PTR(128, 4), /* 1001 */ PTR(144, 4), /* 1010 */ PTR(160, 3), /* 1011 */ PTR(168, 2), /* 1100 */ V(1, 1, 4), /* 1101 */ V(0, 1, 4), /* 1110 */ V(1, 0, 4), /* 1111 */ V(0, 0, 4), /* 0000 ... */ /* 0000 */ V(14, 15, 4), /* 16 */ /* 0001 */ V(15, 14, 4), /* 0010 */ V(13, 15, 4), /* 0011 */ V(15, 13, 4), /* 0100 */ V(12, 15, 4), /* 0101 */ V(15, 12, 4), /* 0110 */ V(11, 15, 4), /* 0111 */ V(15, 11, 4), /* 1000 */ V(15, 10, 3), /* 1001 */ V(15, 10, 3), /* 1010 */ V(10, 15, 4), /* 1011 */ V(9, 15, 4), /* 1100 */ V(15, 9, 3), /* 1101 */ V(15, 9, 3), /* 1110 */ V(15, 8, 3), /* 1111 */ V(15, 8, 3), /* 0001 ... */ /* 0000 */ V(8, 15, 4), /* 32 */ /* 0001 */ V(7, 15, 4), /* 0010 */ V(15, 7, 3), /* 0011 */ V(15, 7, 3), /* 0100 */ V(6, 15, 3), /* 0101 */ V(6, 15, 3), /* 0110 */ V(15, 6, 3), /* 0111 */ V(15, 6, 3), /* 1000 */ V(5, 15, 3), /* 1001 */ V(5, 15, 3), /* 1010 */ V(15, 5, 3), /* 1011 */ V(15, 5, 3), /* 1100 */ V(4, 15, 3), /* 1101 */ V(4, 15, 3), /* 1110 */ V(15, 4, 3), /* 1111 */ V(15, 4, 3), /* 0010 ... */ /* 0000 */ V(3, 15, 3), /* 48 */ /* 0001 */ V(3, 15, 3), /* 0010 */ V(15, 3, 3), /* 0011 */ V(15, 3, 3), /* 0100 */ V(2, 15, 3), /* 0101 */ V(2, 15, 3), /* 0110 */ V(15, 2, 3), /* 0111 */ V(15, 2, 3), /* 1000 */ V(15, 1, 3), /* 1001 */ V(15, 1, 3), /* 1010 */ V(1, 15, 4), /* 1011 */ V(15, 0, 4), /* 1100 */ PTR(172, 3), /* 1101 */ PTR(180, 3), /* 1110 */ PTR(188, 3), /* 1111 */ PTR(196, 3), /* 0100 ... */ /* 0000 */ PTR(204, 4), /* 64 */ /* 0001 */ PTR(220, 3), /* 0010 */ PTR(228, 3), /* 0011 */ PTR(236, 3), /* 0100 */ PTR(244, 2), /* 0101 */ PTR(248, 2), /* 0110 */ PTR(252, 2), /* 0111 */ PTR(256, 2), /* 1000 */ PTR(260, 2), /* 1001 */ PTR(264, 2), /* 1010 */ PTR(268, 2), /* 1011 */ PTR(272, 2), /* 1100 */ PTR(276, 2), /* 1101 */ PTR(280, 3), /* 1110 */ PTR(288, 2), /* 1111 */ PTR(292, 2), /* 0101 ... */ /* 0000 */ PTR(296, 2), /* 80 */ /* 0001 */ PTR(300, 3), /* 0010 */ PTR(308, 2), /* 0011 */ PTR(312, 3), /* 0100 */ PTR(320, 1), /* 0101 */ PTR(322, 2), /* 0110 */ PTR(326, 2), /* 0111 */ PTR(330, 1), /* 1000 */ PTR(332, 2), /* 1001 */ PTR(336, 1), /* 1010 */ PTR(338, 1), /* 1011 */ PTR(340, 1), /* 1100 */ PTR(342, 1), /* 1101 */ PTR(344, 1), /* 1110 */ PTR(346, 1), /* 1111 */ PTR(348, 1), /* 0110 ... */ /* 0000 */ PTR(350, 1), /* 96 */ /* 0001 */ PTR(352, 1), /* 0010 */ PTR(354, 1), /* 0011 */ PTR(356, 1), /* 0100 */ PTR(358, 1), /* 0101 */ PTR(360, 1), /* 0110 */ PTR(362, 1), /* 0111 */ PTR(364, 1), /* 1000 */ PTR(366, 1), /* 1001 */ PTR(368, 1), /* 1010 */ PTR(370, 2), /* 1011 */ PTR(374, 1), /* 1100 */ PTR(376, 2), /* 1101 */ V(7, 3, 4), /* 1110 */ PTR(380, 1), /* 1111 */ V(7, 2, 4), /* 0111 ... */ /* 0000 */ V(4, 6, 4), /* 112 */ /* 0001 */ V(6, 4, 4), /* 0010 */ V(5, 5, 4), /* 0011 */ V(7, 1, 4), /* 0100 */ V(3, 6, 4), /* 0101 */ V(6, 3, 4), /* 0110 */ V(4, 5, 4), /* 0111 */ V(5, 4, 4), /* 1000 */ V(2, 6, 4), /* 1001 */ V(6, 2, 4), /* 1010 */ V(1, 6, 4), /* 1011 */ V(6, 1, 4), /* 1100 */ PTR(382, 1), /* 1101 */ V(3, 5, 4), /* 1110 */ V(5, 3, 4), /* 1111 */ V(4, 4, 4), /* 1000 ... */ /* 0000 */ V(2, 5, 4), /* 128 */ /* 0001 */ V(5, 2, 4), /* 0010 */ V(1, 5, 4), /* 0011 */ PTR(384, 1), /* 0100 */ V(5, 1, 3), /* 0101 */ V(5, 1, 3), /* 0110 */ V(3, 4, 4), /* 0111 */ V(4, 3, 4), /* 1000 */ V(2, 4, 3), /* 1001 */ V(2, 4, 3), /* 1010 */ V(4, 2, 3), /* 1011 */ V(4, 2, 3), /* 1100 */ V(3, 3, 3), /* 1101 */ V(3, 3, 3), /* 1110 */ V(1, 4, 3), /* 1111 */ V(1, 4, 3), /* 1001 ... */ /* 0000 */ V(4, 1, 3), /* 144 */ /* 0001 */ V(4, 1, 3), /* 0010 */ V(0, 4, 4), /* 0011 */ V(4, 0, 4), /* 0100 */ V(2, 3, 3), /* 0101 */ V(2, 3, 3), /* 0110 */ V(3, 2, 3), /* 0111 */ V(3, 2, 3), /* 1000 */ V(1, 3, 2), /* 1001 */ V(1, 3, 2), /* 1010 */ V(1, 3, 2), /* 1011 */ V(1, 3, 2), /* 1100 */ V(3, 1, 2), /* 1101 */ V(3, 1, 2), /* 1110 */ V(3, 1, 2), /* 1111 */ V(3, 1, 2), /* 1010 ... */ /* 000 */ V(0, 3, 3), /* 160 */ /* 001 */ V(3, 0, 3), /* 010 */ V(2, 2, 2), /* 011 */ V(2, 2, 2), /* 100 */ V(1, 2, 1), /* 101 */ V(1, 2, 1), /* 110 */ V(1, 2, 1), /* 111 */ V(1, 2, 1), /* 1011 ... */ /* 00 */ V(2, 1, 1), /* 168 */ /* 01 */ V(2, 1, 1), /* 10 */ V(0, 2, 2), /* 11 */ V(2, 0, 2), /* 0010 1100 ... */ /* 000 */ V(0, 15, 1), /* 172 */ /* 001 */ V(0, 15, 1), /* 010 */ V(0, 15, 1), /* 011 */ V(0, 15, 1), /* 100 */ V(14, 14, 3), /* 101 */ V(13, 14, 3), /* 110 */ V(14, 13, 3), /* 111 */ V(12, 14, 3), /* 0010 1101 ... */ /* 000 */ V(14, 12, 3), /* 180 */ /* 001 */ V(13, 13, 3), /* 010 */ V(11, 14, 3), /* 011 */ V(14, 11, 3), /* 100 */ V(12, 13, 3), /* 101 */ V(13, 12, 3), /* 110 */ V(10, 14, 3), /* 111 */ V(14, 10, 3), /* 0010 1110 ... */ /* 000 */ V(11, 13, 3), /* 188 */ /* 001 */ V(13, 11, 3), /* 010 */ V(12, 12, 3), /* 011 */ V(9, 14, 3), /* 100 */ V(14, 9, 3), /* 101 */ V(10, 13, 3), /* 110 */ V(13, 10, 3), /* 111 */ V(11, 12, 3), /* 0010 1111 ... */ /* 000 */ V(12, 11, 3), /* 196 */ /* 001 */ V(8, 14, 3), /* 010 */ V(14, 8, 3), /* 011 */ V(9, 13, 3), /* 100 */ V(13, 9, 3), /* 101 */ V(7, 14, 3), /* 110 */ V(14, 7, 3), /* 111 */ V(10, 12, 3), /* 0100 0000 ... */ /* 0000 */ V(12, 10, 3), /* 204 */ /* 0001 */ V(12, 10, 3), /* 0010 */ V(11, 11, 3), /* 0011 */ V(11, 11, 3), /* 0100 */ V(8, 13, 3), /* 0101 */ V(8, 13, 3), /* 0110 */ V(13, 8, 3), /* 0111 */ V(13, 8, 3), /* 1000 */ V(0, 14, 4), /* 1001 */ V(14, 0, 4), /* 1010 */ V(0, 13, 3), /* 1011 */ V(0, 13, 3), /* 1100 */ V(14, 6, 2), /* 1101 */ V(14, 6, 2), /* 1110 */ V(14, 6, 2), /* 1111 */ V(14, 6, 2), /* 0100 0001 ... */ /* 000 */ V(6, 14, 3), /* 220 */ /* 001 */ V(9, 12, 3), /* 010 */ V(12, 9, 2), /* 011 */ V(12, 9, 2), /* 100 */ V(5, 14, 2), /* 101 */ V(5, 14, 2), /* 110 */ V(11, 10, 2), /* 111 */ V(11, 10, 2), /* 0100 0010 ... */ /* 000 */ V(14, 5, 2), /* 228 */ /* 001 */ V(14, 5, 2), /* 010 */ V(10, 11, 3), /* 011 */ V(7, 13, 3), /* 100 */ V(13, 7, 2), /* 101 */ V(13, 7, 2), /* 110 */ V(14, 4, 2), /* 111 */ V(14, 4, 2), /* 0100 0011 ... */ /* 000 */ V(8, 12, 2), /* 236 */ /* 001 */ V(8, 12, 2), /* 010 */ V(12, 8, 2), /* 011 */ V(12, 8, 2), /* 100 */ V(4, 14, 3), /* 101 */ V(2, 14, 3), /* 110 */ V(3, 14, 2), /* 111 */ V(3, 14, 2), /* 0100 0100 ... */ /* 00 */ V(6, 13, 2), /* 244 */ /* 01 */ V(13, 6, 2), /* 10 */ V(14, 3, 2), /* 11 */ V(9, 11, 2), /* 0100 0101 ... */ /* 00 */ V(11, 9, 2), /* 248 */ /* 01 */ V(10, 10, 2), /* 10 */ V(14, 2, 2), /* 11 */ V(1, 14, 2), /* 0100 0110 ... */ /* 00 */ V(14, 1, 2), /* 252 */ /* 01 */ V(5, 13, 2), /* 10 */ V(13, 5, 2), /* 11 */ V(7, 12, 2), /* 0100 0111 ... */ /* 00 */ V(12, 7, 2), /* 256 */ /* 01 */ V(4, 13, 2), /* 10 */ V(8, 11, 2), /* 11 */ V(11, 8, 2), /* 0100 1000 ... */ /* 00 */ V(13, 4, 2), /* 260 */ /* 01 */ V(9, 10, 2), /* 10 */ V(10, 9, 2), /* 11 */ V(6, 12, 2), /* 0100 1001 ... */ /* 00 */ V(12, 6, 2), /* 264 */ /* 01 */ V(3, 13, 2), /* 10 */ V(13, 3, 2), /* 11 */ V(2, 13, 2), /* 0100 1010 ... */ /* 00 */ V(13, 2, 2), /* 268 */ /* 01 */ V(1, 13, 2), /* 10 */ V(7, 11, 2), /* 11 */ V(11, 7, 2), /* 0100 1011 ... */ /* 00 */ V(13, 1, 2), /* 272 */ /* 01 */ V(5, 12, 2), /* 10 */ V(12, 5, 2), /* 11 */ V(8, 10, 2), /* 0100 1100 ... */ /* 00 */ V(10, 8, 2), /* 276 */ /* 01 */ V(9, 9, 2), /* 10 */ V(4, 12, 2), /* 11 */ V(12, 4, 2), /* 0100 1101 ... */ /* 000 */ V(6, 11, 2), /* 280 */ /* 001 */ V(6, 11, 2), /* 010 */ V(11, 6, 2), /* 011 */ V(11, 6, 2), /* 100 */ V(13, 0, 3), /* 101 */ V(0, 12, 3), /* 110 */ V(3, 12, 2), /* 111 */ V(3, 12, 2), /* 0100 1110 ... */ /* 00 */ V(12, 3, 2), /* 288 */ /* 01 */ V(7, 10, 2), /* 10 */ V(10, 7, 2), /* 11 */ V(2, 12, 2), /* 0100 1111 ... */ /* 00 */ V(12, 2, 2), /* 292 */ /* 01 */ V(5, 11, 2), /* 10 */ V(11, 5, 2), /* 11 */ V(1, 12, 2), /* 0101 0000 ... */ /* 00 */ V(8, 9, 2), /* 296 */ /* 01 */ V(9, 8, 2), /* 10 */ V(12, 1, 2), /* 11 */ V(4, 11, 2), /* 0101 0001 ... */ /* 000 */ V(12, 0, 3), /* 300 */ /* 001 */ V(0, 11, 3), /* 010 */ V(3, 11, 2), /* 011 */ V(3, 11, 2), /* 100 */ V(11, 0, 3), /* 101 */ V(0, 10, 3), /* 110 */ V(1, 10, 2), /* 111 */ V(1, 10, 2), /* 0101 0010 ... */ /* 00 */ V(11, 4, 1), /* 308 */ /* 01 */ V(11, 4, 1), /* 10 */ V(6, 10, 2), /* 11 */ V(10, 6, 2), /* 0101 0011 ... */ /* 000 */ V(7, 9, 2), /* 312 */ /* 001 */ V(7, 9, 2), /* 010 */ V(9, 7, 2), /* 011 */ V(9, 7, 2), /* 100 */ V(10, 0, 3), /* 101 */ V(0, 9, 3), /* 110 */ V(9, 0, 2), /* 111 */ V(9, 0, 2), /* 0101 0100 ... */ /* 0 */ V(11, 3, 1), /* 320 */ /* 1 */ V(8, 8, 1), /* 0101 0101 ... */ /* 00 */ V(2, 11, 2), /* 322 */ /* 01 */ V(5, 10, 2), /* 10 */ V(11, 2, 1), /* 11 */ V(11, 2, 1), /* 0101 0110 ... */ /* 00 */ V(10, 5, 2), /* 326 */ /* 01 */ V(1, 11, 2), /* 10 */ V(11, 1, 2), /* 11 */ V(6, 9, 2), /* 0101 0111 ... */ /* 0 */ V(9, 6, 1), /* 330 */ /* 1 */ V(10, 4, 1), /* 0101 1000 ... */ /* 00 */ V(4, 10, 2), /* 332 */ /* 01 */ V(7, 8, 2), /* 10 */ V(8, 7, 1), /* 11 */ V(8, 7, 1), /* 0101 1001 ... */ /* 0 */ V(3, 10, 1), /* 336 */ /* 1 */ V(10, 3, 1), /* 0101 1010 ... */ /* 0 */ V(5, 9, 1), /* 338 */ /* 1 */ V(9, 5, 1), /* 0101 1011 ... */ /* 0 */ V(2, 10, 1), /* 340 */ /* 1 */ V(10, 2, 1), /* 0101 1100 ... */ /* 0 */ V(10, 1, 1), /* 342 */ /* 1 */ V(6, 8, 1), /* 0101 1101 ... */ /* 0 */ V(8, 6, 1), /* 344 */ /* 1 */ V(7, 7, 1), /* 0101 1110 ... */ /* 0 */ V(4, 9, 1), /* 346 */ /* 1 */ V(9, 4, 1), /* 0101 1111 ... */ /* 0 */ V(3, 9, 1), /* 348 */ /* 1 */ V(9, 3, 1), /* 0110 0000 ... */ /* 0 */ V(5, 8, 1), /* 350 */ /* 1 */ V(8, 5, 1), /* 0110 0001 ... */ /* 0 */ V(2, 9, 1), /* 352 */ /* 1 */ V(6, 7, 1), /* 0110 0010 ... */ /* 0 */ V(7, 6, 1), /* 354 */ /* 1 */ V(9, 2, 1), /* 0110 0011 ... */ /* 0 */ V(1, 9, 1), /* 356 */ /* 1 */ V(9, 1, 1), /* 0110 0100 ... */ /* 0 */ V(4, 8, 1), /* 358 */ /* 1 */ V(8, 4, 1), /* 0110 0101 ... */ /* 0 */ V(5, 7, 1), /* 360 */ /* 1 */ V(7, 5, 1), /* 0110 0110 ... */ /* 0 */ V(3, 8, 1), /* 362 */ /* 1 */ V(8, 3, 1), /* 0110 0111 ... */ /* 0 */ V(6, 6, 1), /* 364 */ /* 1 */ V(2, 8, 1), /* 0110 1000 ... */ /* 0 */ V(8, 2, 1), /* 366 */ /* 1 */ V(1, 8, 1), /* 0110 1001 ... */ /* 0 */ V(4, 7, 1), /* 368 */ /* 1 */ V(7, 4, 1), /* 0110 1010 ... */ /* 00 */ V(8, 1, 1), /* 370 */ /* 01 */ V(8, 1, 1), /* 10 */ V(0, 8, 2), /* 11 */ V(8, 0, 2), /* 0110 1011 ... */ /* 0 */ V(5, 6, 1), /* 374 */ /* 1 */ V(6, 5, 1), /* 0110 1100 ... */ /* 00 */ V(1, 7, 1), /* 376 */ /* 01 */ V(1, 7, 1), /* 10 */ V(0, 7, 2), /* 11 */ V(7, 0, 2), /* 0110 1110 ... */ /* 0 */ V(3, 7, 1), /* 380 */ /* 1 */ V(2, 7, 1), /* 0111 1100 ... */ /* 0 */ V(0, 6, 1), /* 382 */ /* 1 */ V(6, 0, 1), /* 1000 0011 ... */ /* 0 */ V(0, 5, 1), /* 384 */ /* 1 */ V(5, 0, 1) ]; /* hufftable constructor */ function MP3Hufftable(table, linbits, startbits) { this.table = table; this.linbits = linbits; this.startbits = startbits; }; /* external tables */ exports.huff_quad_table = [ hufftabA, hufftabB ]; exports.huff_pair_table = [ /* 0 */ new MP3Hufftable(hufftab0, 0, 0), /* 1 */ new MP3Hufftable(hufftab1, 0, 3), /* 2 */ new MP3Hufftable(hufftab2, 0, 3), /* 3 */ new MP3Hufftable(hufftab3, 0, 3), /* 4 */ null, //new MP3Hufftable(0 /* not used */), /* 5 */ new MP3Hufftable(hufftab5, 0, 3), /* 6 */ new MP3Hufftable(hufftab6, 0, 4), /* 7 */ new MP3Hufftable(hufftab7, 0, 4), /* 8 */ new MP3Hufftable(hufftab8, 0, 4), /* 9 */ new MP3Hufftable(hufftab9, 0, 4), /* 10 */ new MP3Hufftable(hufftab10, 0, 4), /* 11 */ new MP3Hufftable(hufftab11, 0, 4), /* 12 */ new MP3Hufftable(hufftab12, 0, 4), /* 13 */ new MP3Hufftable(hufftab13, 0, 4), /* 14 */ null, //new MP3Hufftable(0 /* not used */), /* 15 */ new MP3Hufftable(hufftab15, 0, 4), /* 16 */ new MP3Hufftable(hufftab16, 1, 4), /* 17 */ new MP3Hufftable(hufftab16, 2, 4), /* 18 */ new MP3Hufftable(hufftab16, 3, 4), /* 19 */ new MP3Hufftable(hufftab16, 4, 4), /* 20 */ new MP3Hufftable(hufftab16, 6, 4), /* 21 */ new MP3Hufftable(hufftab16, 8, 4), /* 22 */ new MP3Hufftable(hufftab16, 10, 4), /* 23 */ new MP3Hufftable(hufftab16, 13, 4), /* 24 */ new MP3Hufftable(hufftab24, 4, 4), /* 25 */ new MP3Hufftable(hufftab24, 5, 4), /* 26 */ new MP3Hufftable(hufftab24, 6, 4), /* 27 */ new MP3Hufftable(hufftab24, 7, 4), /* 28 */ new MP3Hufftable(hufftab24, 8, 4), /* 29 */ new MP3Hufftable(hufftab24, 9, 4), /* 30 */ new MP3Hufftable(hufftab24, 11, 4), /* 31 */ new MP3Hufftable(hufftab24, 13, 4) ]; },{}],7:[function(require,module,exports){ var AV = (window.AV); const ENCODINGS = ['latin1', 'utf16-bom', 'utf16-be', 'utf8']; var ID3Stream = AV.Base.extend({ constructor: function(header, stream) { this.header = header; this.stream = stream; this.offset = 0; }, read: function() { if (!this.data) { this.data = {}; // read all frames var frame; while (frame = this.readFrame()) { // if we already have an instance of this key, add it to an array if (frame.key in this.data) { if (!Array.isArray(this.data[frame.key])) this.data[frame.key] = [this.data[frame.key]]; this.data[frame.key].push(frame.value); } else { this.data[frame.key] = frame.value; } } } return this.data; }, readFrame: function() { if (this.offset >= this.header.length) return null; // get the header var header = this.readHeader(); var decoder = header.identifier; if (header.identifier.charCodeAt(0) === 0) { this.offset += this.header.length + 1; return null; } // map common frame names to a single type if (!this.frameTypes[decoder]) { for (var key in this.map) { if (this.map[key].indexOf(decoder) !== -1) { decoder = key; break; } } } if (this.frameTypes[decoder]) { // decode the frame var frame = this.decodeFrame(header, this.frameTypes[decoder]), keys = Object.keys(frame); // if it only returned one key, use that as the value if (keys.length === 1) frame = frame[keys[0]]; var result = { value: frame }; } else { // No frame type found, treat it as binary var result = { value: this.stream.readBuffer(Math.min(header.length, this.header.length - this.offset)) }; } result.key = this.names[header.identifier] ? this.names[header.identifier] : header.identifier; // special sauce for cover art, which should just be a buffer if (result.key === 'coverArt') result.value = result.value.data; this.offset += 10 + header.length; return result; }, decodeFrame: function(header, fields) { var stream = this.stream, start = stream.offset; var encoding = 0, ret = {}; var len = Object.keys(fields).length, i = 0; for (var key in fields) { var type = fields[key]; var rest = header.length - (stream.offset - start); i++; // check for special field names switch (key) { case 'encoding': encoding = stream.readUInt8(); continue; case 'language': ret.language = stream.readString(3); continue; } // check types switch (type) { case 'latin1': ret[key] = stream.readString(i === len ? rest : null, 'latin1'); break; case 'string': ret[key] = stream.readString(i === len ? rest : null, ENCODINGS[encoding]); break; case 'binary': ret[key] = stream.readBuffer(rest) break; case 'int16': ret[key] = stream.readInt16(); break; case 'int8': ret[key] = stream.readInt8(); break; case 'int24': ret[key] = stream.readInt24(); break; case 'int32': ret[key] = stream.readInt32(); break; case 'int32+': ret[key] = stream.readInt32(); if (rest > 4) throw new Error('Seriously dude? Stop playing this song and get a life!'); break; case 'date': var val = stream.readString(8); ret[key] = new Date(val.slice(0, 4), val.slice(4, 6) - 1, val.slice(6, 8)); break; case 'frame_id': ret[key] = stream.readString(4); break; default: throw new Error('Unknown key type ' + type); } } // Just in case something went wrong... var rest = header.length - (stream.offset - start); if (rest > 0) stream.advance(rest); return ret; } }); // ID3 v2.3 and v2.4 support exports.ID3v23Stream = ID3Stream.extend({ readHeader: function() { var identifier = this.stream.readString(4); var length = 0; if (this.header.major === 4) { for (var i = 0; i < 4; i++) length = (length << 7) + (this.stream.readUInt8() & 0x7f); } else { length = this.stream.readUInt32(); } return { identifier: identifier, length: length, flags: this.stream.readUInt16() }; }, map: { text: [ // Identification Frames 'TIT1', 'TIT2', 'TIT3', 'TALB', 'TOAL', 'TRCK', 'TPOS', 'TSST', 'TSRC', // Involved Persons Frames 'TPE1', 'TPE2', 'TPE3', 'TPE4', 'TOPE', 'TEXT', 'TOLY', 'TCOM', 'TMCL', 'TIPL', 'TENC', // Derived and Subjective Properties Frames 'TBPM', 'TLEN', 'TKEY', 'TLAN', 'TCON', 'TFLT', 'TMED', 'TMOO', // Rights and Licence Frames 'TCOP', 'TPRO', 'TPUB', 'TOWN', 'TRSN', 'TRSO', // Other Text Frames 'TOFN', 'TDLY', 'TDEN', 'TDOR', 'TDRC', 'TDRL', 'TDTG', 'TSSE', 'TSOA', 'TSOP', 'TSOT', // Deprecated Text Frames 'TDAT', 'TIME', 'TORY', 'TRDA', 'TSIZ', 'TYER', // Non-standard iTunes Frames 'TCMP', 'TSO2', 'TSOC' ], url: [ 'WCOM', 'WCOP', 'WOAF', 'WOAR', 'WOAS', 'WORS', 'WPAY', 'WPUB' ] }, frameTypes: { text: { encoding: 1, value: 'string' }, url: { value: 'latin1' }, TXXX: { encoding: 1, description: 'string', value: 'string' }, WXXX: { encoding: 1, description: 'string', value: 'latin1', }, USLT: { encoding: 1, language: 1, description: 'string', value: 'string' }, COMM: { encoding: 1, language: 1, description: 'string', value: 'string' }, APIC: { encoding: 1, mime: 'latin1', type: 'int8', description: 'string', data: 'binary' }, UFID: { owner: 'latin1', identifier: 'binary' }, MCDI: { value: 'binary' }, PRIV: { owner: 'latin1', value: 'binary' }, GEOB: { encoding: 1, mime: 'latin1', filename: 'string', description: 'string', data: 'binary' }, PCNT: { value: 'int32+' }, POPM: { email: 'latin1', rating: 'int8', counter: 'int32+' }, AENC: { owner: 'latin1', previewStart: 'int16', previewLength: 'int16', encryptionInfo: 'binary' }, ETCO: { format: 'int8', data: 'binary' // TODO }, MLLT: { framesBetweenReference: 'int16', bytesBetweenReference: 'int24', millisecondsBetweenReference: 'int24', bitsForBytesDeviation: 'int8', bitsForMillisecondsDev: 'int8', data: 'binary' // TODO }, SYTC: { format: 'int8', tempoData: 'binary' // TODO }, SYLT: { encoding: 1, language: 1, format: 'int8', contentType: 'int8', description: 'string', data: 'binary' // TODO }, RVA2: { identification: 'latin1', data: 'binary' // TODO }, EQU2: { interpolationMethod: 'int8', identification: 'latin1', data: 'binary' // TODO }, RVRB: { left: 'int16', right: 'int16', bouncesLeft: 'int8', bouncesRight: 'int8', feedbackLL: 'int8', feedbackLR: 'int8', feedbackRR: 'int8', feedbackRL: 'int8', premixLR: 'int8', premixRL: 'int8' }, RBUF: { size: 'int24', flag: 'int8', offset: 'int32' }, LINK: { identifier: 'frame_id', url: 'latin1', data: 'binary' // TODO stringlist? }, POSS: { format: 'int8', position: 'binary' // TODO }, USER: { encoding: 1, language: 1, value: 'string' }, OWNE: { encoding: 1, price: 'latin1', purchaseDate: 'date', seller: 'string' }, COMR: { encoding: 1, price: 'latin1', validUntil: 'date', contactURL: 'latin1', receivedAs: 'int8', seller: 'string', description: 'string', logoMime: 'latin1', logo: 'binary' }, ENCR: { owner: 'latin1', methodSymbol: 'int8', data: 'binary' }, GRID: { owner: 'latin1', groupSymbol: 'int8', data: 'binary' }, SIGN: { groupSymbol: 'int8', signature: 'binary' }, SEEK: { value: 'int32' }, ASPI: { dataStart: 'int32', dataLength: 'int32', numPoints: 'int16', bitsPerPoint: 'int8', data: 'binary' // TODO }, // Deprecated ID3 v2.3 frames IPLS: { encoding: 1, value: 'string' // list? }, RVAD: { adjustment: 'int8', bits: 'int8', data: 'binary' // TODO }, EQUA: { adjustmentBits: 'int8', data: 'binary' // TODO } }, names: { // Identification Frames 'TIT1': 'grouping', 'TIT2': 'title', 'TIT3': 'subtitle', 'TALB': 'album', 'TOAL': 'originalAlbumTitle', 'TRCK': 'trackNumber', 'TPOS': 'diskNumber', 'TSST': 'setSubtitle', 'TSRC': 'ISRC', // Involved Persons Frames 'TPE1': 'artist', 'TPE2': 'albumArtist', 'TPE3': 'conductor', 'TPE4': 'modifiedBy', 'TOPE': 'originalArtist', 'TEXT': 'lyricist', 'TOLY': 'originalLyricist', 'TCOM': 'composer', 'TMCL': 'musicianCreditsList', 'TIPL': 'involvedPeopleList', 'TENC': 'encodedBy', // Derived and Subjective Properties Frames 'TBPM': 'tempo', 'TLEN': 'length', 'TKEY': 'initialKey', 'TLAN': 'language', 'TCON': 'genre', 'TFLT': 'fileType', 'TMED': 'mediaType', 'TMOO': 'mood', // Rights and Licence Frames 'TCOP': 'copyright', 'TPRO': 'producedNotice', 'TPUB': 'publisher', 'TOWN': 'fileOwner', 'TRSN': 'internetRadioStationName', 'TRSO': 'internetRadioStationOwner', // Other Text Frames 'TOFN': 'originalFilename', 'TDLY': 'playlistDelay', 'TDEN': 'encodingTime', 'TDOR': 'originalReleaseTime', 'TDRC': 'recordingTime', 'TDRL': 'releaseTime', 'TDTG': 'taggingTime', 'TSSE': 'encodedWith', 'TSOA': 'albumSortOrder', 'TSOP': 'performerSortOrder', 'TSOT': 'titleSortOrder', // User defined text information 'TXXX': 'userText', // Unsynchronised lyrics/text transcription 'USLT': 'lyrics', // Attached Picture Frame 'APIC': 'coverArt', // Unique Identifier Frame 'UFID': 'uniqueIdentifier', // Music CD Identifier Frame 'MCDI': 'CDIdentifier', // Comment Frame 'COMM': 'comments', // URL link frames 'WCOM': 'commercialInformation', 'WCOP': 'copyrightInformation', 'WOAF': 'officialAudioFileWebpage', 'WOAR': 'officialArtistWebpage', 'WOAS': 'officialAudioSourceWebpage', 'WORS': 'officialInternetRadioStationHomepage', 'WPAY': 'payment', 'WPUB': 'officialPublisherWebpage', // User Defined URL Link Frame 'WXXX': 'url', 'PRIV': 'private', 'GEOB': 'generalEncapsulatedObject', 'PCNT': 'playCount', 'POPM': 'rating', 'AENC': 'audioEncryption', 'ETCO': 'eventTimingCodes', 'MLLT': 'MPEGLocationLookupTable', 'SYTC': 'synchronisedTempoCodes', 'SYLT': 'synchronisedLyrics', 'RVA2': 'volumeAdjustment', 'EQU2': 'equalization', 'RVRB': 'reverb', 'RBUF': 'recommendedBufferSize', 'LINK': 'link', 'POSS': 'positionSynchronisation', 'USER': 'termsOfUse', 'OWNE': 'ownership', 'COMR': 'commercial', 'ENCR': 'encryption', 'GRID': 'groupIdentifier', 'SIGN': 'signature', 'SEEK': 'seek', 'ASPI': 'audioSeekPointIndex', // Deprecated ID3 v2.3 frames 'TDAT': 'date', 'TIME': 'time', 'TORY': 'originalReleaseYear', 'TRDA': 'recordingDates', 'TSIZ': 'size', 'TYER': 'year', 'IPLS': 'involvedPeopleList', 'RVAD': 'volumeAdjustment', 'EQUA': 'equalization', // Non-standard iTunes frames 'TCMP': 'compilation', 'TSO2': 'albumArtistSortOrder', 'TSOC': 'composerSortOrder' } }); // ID3 v2.2 support exports.ID3v22Stream = exports.ID3v23Stream.extend({ readHeader: function() { var id = this.stream.readString(3); if (this.frameReplacements[id] && !this.frameTypes[id]) this.frameTypes[id] = this.frameReplacements[id]; return { identifier: this.replacements[id] || id, length: this.stream.readUInt24() }; }, // map 3 char ID3 v2.2 names to 4 char ID3 v2.3/4 names replacements: { 'UFI': 'UFID', 'TT1': 'TIT1', 'TT2': 'TIT2', 'TT3': 'TIT3', 'TP1': 'TPE1', 'TP2': 'TPE2', 'TP3': 'TPE3', 'TP4': 'TPE4', 'TCM': 'TCOM', 'TXT': 'TEXT', 'TLA': 'TLAN', 'TCO': 'TCON', 'TAL': 'TALB', 'TPA': 'TPOS', 'TRK': 'TRCK', 'TRC': 'TSRC', 'TYE': 'TYER', 'TDA': 'TDAT', 'TIM': 'TIME', 'TRD': 'TRDA', 'TMT': 'TMED', 'TFT': 'TFLT', 'TBP': 'TBPM', 'TCR': 'TCOP', 'TPB': 'TPUB', 'TEN': 'TENC', 'TSS': 'TSSE', 'TOF': 'TOFN', 'TLE': 'TLEN', 'TSI': 'TSIZ', 'TDY': 'TDLY', 'TKE': 'TKEY', 'TOT': 'TOAL', 'TOA': 'TOPE', 'TOL': 'TOLY', 'TOR': 'TORY', 'TXX': 'TXXX', 'WAF': 'WOAF', 'WAR': 'WOAR', 'WAS': 'WOAS', 'WCM': 'WCOM', 'WCP': 'WCOP', 'WPB': 'WPUB', 'WXX': 'WXXX', 'IPL': 'IPLS', 'MCI': 'MCDI', 'ETC': 'ETCO', 'MLL': 'MLLT', 'STC': 'SYTC', 'ULT': 'USLT', 'SLT': 'SYLT', 'COM': 'COMM', 'RVA': 'RVAD', 'EQU': 'EQUA', 'REV': 'RVRB', 'GEO': 'GEOB', 'CNT': 'PCNT', 'POP': 'POPM', 'BUF': 'RBUF', 'CRA': 'AENC', 'LNK': 'LINK', // iTunes stuff 'TST': 'TSOT', 'TSP': 'TSOP', 'TSA': 'TSOA', 'TCP': 'TCMP', 'TS2': 'TSO2', 'TSC': 'TSOC' }, // replacements for ID3 v2.3/4 frames frameReplacements: { PIC: { encoding: 1, format: 'int24', type: 'int8', description: 'string', data: 'binary' }, CRM: { owner: 'latin1', description: 'latin1', data: 'binary' } } }); },{}],8:[function(require,module,exports){ function IMDCT() { this.tmp_imdct36 = new Float64Array(18); this.tmp_dctIV = new Float64Array(18); this.tmp_sdctII = new Float64Array(9); } // perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm IMDCT.prototype.imdct36 = function(x, y) { var tmp = this.tmp_imdct36; /* DCT-IV */ this.dctIV(x, tmp); // convert 18-point DCT-IV to 36-point IMDCT for (var i = 0; i < 9; ++i) { y[i] = tmp[9 + i]; } for (var i = 9; i < 27; ++i) { y[i] = -tmp[36 - (9 + i) - 1]; } for (var i = 27; i < 36; ++i) { y[i] = -tmp[i - 27]; } }; var dctIV_scale = []; for(i = 0; i < 18; i++) { dctIV_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (4 * 18)); } IMDCT.prototype.dctIV = function(y, X) { var tmp = this.tmp_dctIV; // scaling for (var i = 0; i < 18; ++i) { tmp[i] = y[i] * dctIV_scale[i]; } // SDCT-II this.sdctII(tmp, X); // scale reduction and output accumulation X[0] /= 2; for (var i = 1; i < 18; ++i) { X[i] = X[i] / 2 - X[i - 1]; } }; var sdctII_scale = []; for (var i = 0; i < 9; ++i) { sdctII_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (2 * 18)); } IMDCT.prototype.sdctII = function(x, X) { // divide the 18-point SDCT-II into two 9-point SDCT-IIs var tmp = this.tmp_sdctII; // even input butterfly for (var i = 0; i < 9; ++i) { tmp[i] = x[i] + x[18 - i - 1]; } fastsdct(tmp, X, 0); // odd input butterfly and scaling for (var i = 0; i < 9; ++i) { tmp[i] = (x[i] - x[18 - i - 1]) * sdctII_scale[i]; } fastsdct(tmp, X, 1); // output accumulation for (var i = 3; i < 18; i += 2) { X[i] -= X[i - 2]; } }; var c0 = 2 * Math.cos( 1 * Math.PI / 18); var c1 = 2 * Math.cos( 3 * Math.PI / 18); var c2 = 2 * Math.cos( 4 * Math.PI / 18); var c3 = 2 * Math.cos( 5 * Math.PI / 18); var c4 = 2 * Math.cos( 7 * Math.PI / 18); var c5 = 2 * Math.cos( 8 * Math.PI / 18); var c6 = 2 * Math.cos(16 * Math.PI / 18); function fastsdct(x, y, offset) { var a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; var a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25; var m0, m1, m2, m3, m4, m5, m6, m7; a0 = x[3] + x[5]; a1 = x[3] - x[5]; a2 = x[6] + x[2]; a3 = x[6] - x[2]; a4 = x[1] + x[7]; a5 = x[1] - x[7]; a6 = x[8] + x[0]; a7 = x[8] - x[0]; a8 = a0 + a2; a9 = a0 - a2; a10 = a0 - a6; a11 = a2 - a6; a12 = a8 + a6; a13 = a1 - a3; a14 = a13 + a7; a15 = a3 + a7; a16 = a1 - a7; a17 = a1 + a3; m0 = a17 * -c3; m1 = a16 * -c0; m2 = a15 * -c4; m3 = a14 * -c1; m4 = a5 * -c1; m5 = a11 * -c6; m6 = a10 * -c5; m7 = a9 * -c2; a18 = x[4] + a4; a19 = 2 * x[4] - a4; a20 = a19 + m5; a21 = a19 - m5; a22 = a19 + m6; a23 = m4 + m2; a24 = m4 - m2; a25 = m4 + m1; // output to every other slot for convenience y[offset + 0] = a18 + a12; y[offset + 2] = m0 - a25; y[offset + 4] = m7 - a20; y[offset + 6] = m3; y[offset + 8] = a21 - m6; y[offset + 10] = a24 - m1; y[offset + 12] = a12 - 2 * a18; y[offset + 14] = a23 + m0; y[offset + 16] = a22 + m7; } IMDCT.S = [ /* 0 */ [ 0.608761429, -0.923879533, -0.130526192, 0.991444861, -0.382683432, -0.793353340 ], /* 6 */ [ -0.793353340, 0.382683432, 0.991444861, 0.130526192, -0.923879533, -0.608761429 ], /* 1 */ [ 0.382683432, -0.923879533, 0.923879533, -0.382683432, -0.382683432, 0.923879533 ], /* 7 */ [ -0.923879533, -0.382683432, 0.382683432, 0.923879533, 0.923879533, 0.382683432 ], /* 2 */ [ 0.130526192, -0.382683432, 0.608761429, -0.793353340, 0.923879533, -0.991444861 ], /* 8 */ [ -0.991444861, -0.923879533, -0.793353340, -0.608761429, -0.382683432, -0.130526192 ] ]; module.exports = IMDCT; },{}],9:[function(require,module,exports){ var tables = require('./tables'); var MP3FrameHeader = require('./header'); var MP3Frame = require('./frame'); var utils = require('./utils'); function Layer1() { this.allocation = utils.makeArray([2, 32], Uint8Array); this.scalefactor = utils.makeArray([2, 32], Uint8Array); } MP3Frame.layers[1] = Layer1; // linear scaling table const LINEAR_TABLE = new Float32Array([ 1.33333333333333, 1.14285714285714, 1.06666666666667, 1.03225806451613, 1.01587301587302, 1.00787401574803, 1.00392156862745, 1.00195694716243, 1.00097751710655, 1.00048851978505, 1.00024420024420, 1.00012208521548, 1.00006103888177, 1.00003051850948 ]); Layer1.prototype.decode = function(stream, frame) { var header = frame.header; var nch = header.nchannels(); var bound = 32; if (header.mode === MP3FrameHeader.MODE.JOINT_STEREO) { header.flags |= MP3FrameHeader.FLAGS.I_STEREO; bound = 4 + header.mode_extension * 4; } if (header.flags & MP3FrameHeader.FLAGS.PROTECTION) { // TODO: crc check } // decode bit allocations var allocation = this.allocation; for (var sb = 0; sb < bound; sb++) { for (var ch = 0; ch < nch; ch++) { var nb = stream.read(4); if (nb === 15) throw new Error("forbidden bit allocation value"); allocation[ch][sb] = nb ? nb + 1 : 0; } } for (var sb = bound; sb < 32; sb++) { var nb = stream.read(4); if (nb === 15) throw new Error("forbidden bit allocation value"); allocation[0][sb] = allocation[1][sb] = nb ? nb + 1 : 0; } // decode scalefactors var scalefactor = this.scalefactor; for (var sb = 0; sb < 32; sb++) { for (var ch = 0; ch < nch; ch++) { if (allocation[ch][sb]) { scalefactor[ch][sb] = stream.read(6); /* * Scalefactor index 63 does not appear in Table B.1 of * ISO/IEC 11172-3. Nonetheless, other implementations accept it, * so we do as well */ } } } // decode samples for (var s = 0; s < 12; s++) { for (var sb = 0; sb < bound; sb++) { for (var ch = 0; ch < nch; ch++) { var nb = allocation[ch][sb]; frame.sbsample[ch][s][sb] = nb ? this.sample(stream, nb) * tables.SF_TABLE[scalefactor[ch][sb]] : 0; } } for (var sb = bound; sb < 32; sb++) { var nb = allocation[0][sb]; if (nb) { var sample = this.sample(stream, nb); for (var ch = 0; ch < nch; ch++) { frame.sbsample[ch][s][sb] = sample * tables.SF_TABLE[scalefactor[ch][sb]]; } } else { for (var ch = 0; ch < nch; ch++) { frame.sbsample[ch][s][sb] = 0; } } } } }; Layer1.prototype.sample = function(stream, nb) { var sample = stream.read(nb); // invert most significant bit, and form a 2's complement sample sample ^= 1 << (nb - 1); sample |= -(sample & (1 << (nb - 1))); sample /= (1 << (nb - 1)); // requantize the sample // s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1)) sample += 1 >> (nb - 1); return sample * LINEAR_TABLE[nb - 2]; }; module.exports = Layer1; },{"./frame":4,"./header":5,"./tables":14,"./utils":15}],10:[function(require,module,exports){ var tables = require('./tables'); var MP3FrameHeader = require('./header'); var MP3Frame = require('./frame'); var utils = require('./utils'); function Layer2() { this.samples = new Float64Array(3); this.allocation = utils.makeArray([2, 32], Uint8Array); this.scfsi = utils.makeArray([2, 32], Uint8Array); this.scalefactor = utils.makeArray([2, 32, 3], Uint8Array); } MP3Frame.layers[2] = Layer2; // possible quantization per subband table const SBQUANT = [ // ISO/IEC 11172-3 Table B.2a { sblimit: 27, offsets: [ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 ] }, // ISO/IEC 11172-3 Table B.2b { sblimit: 30, offsets: [ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 ] }, // ISO/IEC 11172-3 Table B.2c { sblimit: 8, offsets: [ 5, 5, 2, 2, 2, 2, 2, 2 ] }, // ISO/IEC 11172-3 Table B.2d { sblimit: 12, offsets: [ 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ] }, // ISO/IEC 13818-3 Table B.1 { sblimit: 30, offsets: [ 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] } ]; // bit allocation table const BITALLOC = [ { nbal: 2, offset: 0 }, // 0 { nbal: 2, offset: 3 }, // 1 { nbal: 3, offset: 3 }, // 2 { nbal: 3, offset: 1 }, // 3 { nbal: 4, offset: 2 }, // 4 { nbal: 4, offset: 3 }, // 5 { nbal: 4, offset: 4 }, // 6 { nbal: 4, offset: 5 } // 7 ]; // offsets into quantization class table const OFFSETS = [ [ 0, 1, 16 ], // 0 [ 0, 1, 2, 3, 4, 5, 16 ], // 1 [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ], // 2 [ 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ], // 3 [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 ], // 4 [ 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ] // 5 ]; /* * These are the Layer II classes of quantization. * The table is derived from Table B.4 of ISO/IEC 11172-3. */ const QC_TABLE = [ { nlevels: 3, group: 2, bits: 5, C: 1.33333333333, D: 0.50000000000 }, { nlevels: 5, group: 3, bits: 7, C: 1.60000000000, D: 0.50000000000 }, { nlevels: 7, group: 0, bits: 3, C: 1.14285714286, D: 0.25000000000 }, { nlevels: 9, group: 4, bits: 10, C: 1.77777777777, D: 0.50000000000 }, { nlevels: 15, group: 0, bits: 4, C: 1.06666666666, D: 0.12500000000 }, { nlevels: 31, group: 0, bits: 5, C: 1.03225806452, D: 0.06250000000 }, { nlevels: 63, group: 0, bits: 6, C: 1.01587301587, D: 0.03125000000 }, { nlevels: 127, group: 0, bits: 7, C: 1.00787401575, D: 0.01562500000 }, { nlevels: 255, group: 0, bits: 8, C: 1.00392156863, D: 0.00781250000 }, { nlevels: 511, group: 0, bits: 9, C: 1.00195694716, D: 0.00390625000 }, { nlevels: 1023, group: 0, bits: 10, C: 1.00097751711, D: 0.00195312500 }, { nlevels: 2047, group: 0, bits: 11, C: 1.00048851979, D: 0.00097656250 }, { nlevels: 4095, group: 0, bits: 12, C: 1.00024420024, D: 0.00048828125 }, { nlevels: 8191, group: 0, bits: 13, C: 1.00012208522, D: 0.00024414063 }, { nlevels: 16383, group: 0, bits: 14, C: 1.00006103888, D: 0.00012207031 }, { nlevels: 32767, group: 0, bits: 15, C: 1.00003051851, D: 0.00006103516 }, { nlevels: 65535, group: 0, bits: 16, C: 1.00001525902, D: 0.00003051758 } ]; Layer2.prototype.decode = function(stream, frame) { var header = frame.header; var nch = header.nchannels(); var index; if (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) { index = 4; } else if (header.flags & MP3FrameHeader.FLAGS.FREEFORMAT) { index = header.samplerate === 48000 ? 0 : 1; } else { var bitrate_per_channel = header.bitrate; if (nch === 2) { bitrate_per_channel /= 2; /* * ISO/IEC 11172-3 allows only single channel mode for 32, 48, 56, and * 80 kbps bitrates in Layer II, but some encoders ignore this * restriction, so we ignore it as well. */ } else { /* * ISO/IEC 11172-3 does not allow single channel mode for 224, 256, * 320, or 384 kbps bitrates in Layer II. */ if (bitrate_per_channel > 192000) throw new Error('bad bitrate/mode combination'); } if (bitrate_per_channel <= 48000) index = header.samplerate === 32000 ? 3 : 2; else if (bitrate_per_channel <= 80000) index = 0; else index = header.samplerate === 48000 ? 0 : 1; } var sblimit = SBQUANT[index].sblimit; var offsets = SBQUANT[index].offsets; var bound = 32; if (header.mode === MP3FrameHeader.MODE.JOINT_STEREO) { header.flags |= MP3FrameHeader.FLAGS.I_STEREO; bound = 4 + header.mode_extension * 4; } if (bound > sblimit) bound = sblimit; // decode bit allocations var allocation = this.allocation; for (var sb = 0; sb < bound; sb++) { var nbal = BITALLOC[offsets[sb]].nbal; for (var ch = 0; ch < nch; ch++) allocation[ch][sb] = stream.read(nbal); } for (var sb = bound; sb < sblimit; sb++) { var nbal = BITALLOC[offsets[sb]].nbal; allocation[0][sb] = allocation[1][sb] = stream.read(nbal); } // decode scalefactor selection info var scfsi = this.scfsi; for (var sb = 0; sb < sblimit; sb++) { for (var ch = 0; ch < nch; ch++) { if (allocation[ch][sb]) scfsi[ch][sb] = stream.read(2); } } if (header.flags & MP3FrameHeader.FLAGS.PROTECTION) { // TODO: crc check } // decode scalefactors var scalefactor = this.scalefactor; for (var sb = 0; sb < sblimit; sb++) { for (var ch = 0; ch < nch; ch++) { if (allocation[ch][sb]) { scalefactor[ch][sb][0] = stream.read(6); switch (scfsi[ch][sb]) { case 2: scalefactor[ch][sb][2] = scalefactor[ch][sb][1] = scalefactor[ch][sb][0]; break; case 0: scalefactor[ch][sb][1] = stream.read(6); // fall through case 1: case 3: scalefactor[ch][sb][2] = stream.read(6); } if (scfsi[ch][sb] & 1) scalefactor[ch][sb][1] = scalefactor[ch][sb][scfsi[ch][sb] - 1]; /* * Scalefactor index 63 does not appear in Table B.1 of * ISO/IEC 11172-3. Nonetheless, other implementations accept it, * so we do as well. */ } } } // decode samples for (var gr = 0; gr < 12; gr++) { // normal for (var sb = 0; sb < bound; sb++) { for (var ch = 0; ch < nch; ch++) { if (index = allocation[ch][sb]) { index = OFFSETS[BITALLOC[offsets[sb]].offset][index - 1]; this.decodeSamples(stream, QC_TABLE[index]); var scale = tables.SF_TABLE[scalefactor[ch][sb][gr >> 2]]; for (var s = 0; s < 3; s++) { frame.sbsample[ch][3 * gr + s][sb] = this.samples[s] * scale; } } else { for (var s = 0; s < 3; s++) { frame.sbsample[ch][3 * gr + s][sb] = 0; } } } } // joint stereo for (var sb = bound; sb < sblimit; sb++) { if (index = allocation[0][sb]) { index = OFFSETS[BITALLOC[offsets[sb]].offset][index - 1]; this.decodeSamples(stream, QC_TABLE[index]); for (var ch = 0; ch < nch; ch++) { var scale = tables.SF_TABLE[scalefactor[ch][sb][gr >> 2]]; for (var s = 0; s < 3; s++) { frame.sbsample[ch][3 * gr + s][sb] = this.samples[s] * scale; } } } else { for (var ch = 0; ch < nch; ch++) { for (var s = 0; s < 3; s++) { frame.sbsample[ch][3 * gr + s][sb] = 0; } } } } // the rest for (var ch = 0; ch < nch; ch++) { for (var s = 0; s < 3; s++) { for (var sb = sblimit; sb < 32; sb++) { frame.sbsample[ch][3 * gr + s][sb] = 0; } } } } }; Layer2.prototype.decodeSamples = function(stream, quantclass) { var sample = this.samples; var nb = quantclass.group; if (nb) { // degrouping var c = stream.read(quantclass.bits); var nlevels = quantclass.nlevels; for (var s = 0; s < 3; s++) { sample[s] = c % nlevels; c = c / nlevels | 0; } } else { nb = quantclass.bits; for (var s = 0; s < 3; s++) { sample[s] = stream.read(nb); } } for (var s = 0; s < 3; s++) { // invert most significant bit, and form a 2's complement sample var requantized = sample[s] ^ (1 << (nb - 1)); requantized |= -(requantized & (1 << (nb - 1))); requantized /= (1 << (nb - 1)); // requantize the sample sample[s] = (requantized + quantclass.D) * quantclass.C; } }; module.exports = Layer2; },{"./frame":4,"./header":5,"./tables":14,"./utils":15}],11:[function(require,module,exports){ var AV = (window.AV); var tables = require('./tables'); var MP3FrameHeader = require('./header'); var MP3Frame = require('./frame'); var huffman = require('./huffman'); var IMDCT = require('./imdct'); var utils = require('./utils'); function MP3SideInfo() { this.main_data_begin = null; this.private_bits = null; this.gr = [new MP3Granule(), new MP3Granule()]; this.scfsi = new Uint8Array(2); } function MP3Granule() { this.ch = [new MP3Channel(), new MP3Channel()]; } function MP3Channel() { // from side info this.part2_3_length = null; this.big_values = null; this.global_gain = null; this.scalefac_compress = null; this.flags = null; this.block_type = null; this.table_select = new Uint8Array(3); this.subblock_gain = new Uint8Array(3); this.region0_count = null; this.region1_count = null; // from main_data this.scalefac = new Uint8Array(39); } function Layer3() { this.imdct = new IMDCT(); this.si = new MP3SideInfo(); // preallocate reusable typed arrays for performance this.xr = [new Float64Array(576), new Float64Array(576)]; this._exponents = new Int32Array(39); this.reqcache = new Float64Array(16); this.modes = new Int16Array(39); this.output = new Float64Array(36); this.tmp = utils.makeArray([32, 3, 6]); this.tmp2 = new Float64Array(32 * 3 * 6); } MP3Frame.layers[3] = Layer3; Layer3.prototype.decode = function(stream, frame) { var header = frame.header; var next_md_begin = 0; var md_len = 0; var nch = header.nchannels(); var si_len = (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) ? (nch === 1 ? 9 : 17) : (nch === 1 ? 17 : 32); // check frame sanity if (stream.next_frame - stream.nextByte() < si_len) { stream.md_len = 0; throw new Error('Bad frame length'); } // check CRC word if (header.flags & MP3FrameHeader.FLAGS.PROTECTION) { // TODO: crc check } // decode frame side information var sideInfo = this.sideInfo(stream, nch, header.flags & MP3FrameHeader.FLAGS.LSF_EXT); var si = sideInfo.si; var data_bitlen = sideInfo.data_bitlen; var priv_bitlen = sideInfo.priv_bitlen; header.flags |= priv_bitlen; header.private_bits |= si.private_bits; // find main_data of next frame var peek = stream.copy(); peek.seek(stream.next_frame * 8); var nextHeader = peek.read(16); if ((nextHeader & 0xffe6) === 0xffe2) { // syncword | layer if ((nextHeader & 1) === 0) // protection bit peek.advance(16); // crc check peek.advance(16); // skip the rest of the header next_md_begin = peek.read((nextHeader & 8) ? 9 : 8); } // find main_data of this frame var frame_space = stream.next_frame - stream.nextByte(); if (next_md_begin > si.main_data_begin + frame_space) next_md_begin = 0; var md_len = si.main_data_begin + frame_space - next_md_begin; var frame_used = 0; var ptr; if (si.main_data_begin === 0) { ptr = stream.stream; stream.md_len = 0; frame_used = md_len; } else { if (si.main_data_begin > stream.md_len) { throw new Error('bad main_data_begin pointer'); } else { var old_md_len = stream.md_len; if (md_len > si.main_data_begin) { if (stream.md_len + md_len - si.main_data_begin > MP3FrameHeader.BUFFER_MDLEN) { throw new Error("Assertion failed: (stream.md_len + md_len - si.main_data_begin <= MAD_MP3FrameHeader.BUFFER_MDLEN)"); } frame_used = md_len - si.main_data_begin; this.memcpy(stream.main_data, stream.md_len, stream.stream.stream, stream.nextByte(), frame_used); stream.md_len += frame_used; } ptr = new AV.Bitstream(AV.Stream.fromBuffer(new AV.Buffer(stream.main_data))); ptr.advance((old_md_len - si.main_data_begin) * 8); } } var frame_free = frame_space - frame_used; // decode main_data this.decodeMainData(ptr, frame, si, nch); // preload main_data buffer with up to 511 bytes for next frame(s) if (frame_free >= next_md_begin) { this.memcpy(stream.main_data, 0, stream.stream.stream, stream.next_frame - next_md_begin, next_md_begin); stream.md_len = next_md_begin; } else { if (md_len < si.main_data_begin) { var extra = si.main_data_begin - md_len; if (extra + frame_free > next_md_begin) extra = next_md_begin - frame_free; if (extra < stream.md_len) { this.memcpy(stream.main_data, 0, stream.main_data, stream.md_len - extra, extra); stream.md_len = extra; } } else { stream.md_len = 0; } this.memcpy(stream.main_data, stream.md_len, stream.stream.stream, stream.next_frame - frame_free, frame_free); stream.md_len += frame_free; } }; Layer3.prototype.memcpy = function(dst, dstOffset, pSrc, srcOffset, length) { var subarr; if (pSrc.subarray) subarr = pSrc.subarray(srcOffset, srcOffset + length); else subarr = pSrc.peekBuffer(srcOffset - pSrc.offset, length).data; // oh my, memcpy actually exists in JavaScript? dst.set(subarr, dstOffset); return dst; }; Layer3.prototype.sideInfo = function(stream, nch, lsf) { var si = this.si; var data_bitlen = 0; var priv_bitlen = lsf ? ((nch === 1) ? 1 : 2) : ((nch === 1) ? 5 : 3); si.main_data_begin = stream.read(lsf ? 8 : 9); si.private_bits = stream.read(priv_bitlen); var ngr = 1; if (!lsf) { ngr = 2; for (var ch = 0; ch < nch; ++ch) si.scfsi[ch] = stream.read(4); } for (var gr = 0; gr < ngr; gr++) { var granule = si.gr[gr]; for (var ch = 0; ch < nch; ch++) { var channel = granule.ch[ch]; channel.part2_3_length = stream.read(12); channel.big_values = stream.read(9); channel.global_gain = stream.read(8); channel.scalefac_compress = stream.read(lsf ? 9 : 4); data_bitlen += channel.part2_3_length; if (channel.big_values > 288) throw new Error('bad big_values count'); channel.flags = 0; // window_switching_flag if (stream.read(1)) { channel.block_type = stream.read(2); if (channel.block_type === 0) throw new Error('reserved block_type'); if (!lsf && channel.block_type === 2 && si.scfsi[ch]) throw new Error('bad scalefactor selection info'); channel.region0_count = 7; channel.region1_count = 36; if (stream.read(1)) channel.flags |= tables.MIXED_BLOCK_FLAG; else if (channel.block_type === 2) channel.region0_count = 8; for (var i = 0; i < 2; i++) channel.table_select[i] = stream.read(5); for (var i = 0; i < 3; i++) channel.subblock_gain[i] = stream.read(3); } else { channel.block_type = 0; for (var i = 0; i < 3; i++) channel.table_select[i] = stream.read(5); channel.region0_count = stream.read(4); channel.region1_count = stream.read(3); } // [preflag,] scalefac_scale, count1table_select channel.flags |= stream.read(lsf ? 2 : 3); } } return { si: si, data_bitlen: data_bitlen, priv_bitlen: priv_bitlen }; }; Layer3.prototype.decodeMainData = function(stream, frame, si, nch) { var header = frame.header; var sfreq = header.samplerate; if (header.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT) sfreq *= 2; // 48000 => 0, 44100 => 1, 32000 => 2, // 24000 => 3, 22050 => 4, 16000 => 5 var sfreqi = ((sfreq >> 7) & 0x000f) + ((sfreq >> 15) & 0x0001) - 8; if (header.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT) sfreqi += 3; // scalefactors, Huffman decoding, requantization var ngr = (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) ? 1 : 2; var xr = this.xr; for (var gr = 0; gr < ngr; ++gr) { var granule = si.gr[gr]; var sfbwidth = []; var l = 0; for (var ch = 0; ch < nch; ++ch) { var channel = granule.ch[ch]; var part2_length; sfbwidth[ch] = tables.SFBWIDTH_TABLE[sfreqi].l; if (channel.block_type === 2) { sfbwidth[ch] = (channel.flags & tables.MIXED_BLOCK_FLAG) ? tables.SFBWIDTH_TABLE[sfreqi].m : tables.SFBWIDTH_TABLE[sfreqi].s; } if (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) { part2_length = this.scalefactors_lsf(stream, channel, ch === 0 ? 0 : si.gr[1].ch[1], header.mode_extension); } else { part2_length = this.scalefactors(stream, channel, si.gr[0].ch[ch], gr === 0 ? 0 : si.scfsi[ch]); } this.huffmanDecode(stream, xr[ch], channel, sfbwidth[ch], part2_length); } // joint stereo processing if (header.mode === MP3FrameHeader.MODE.JOINT_STEREO && header.mode_extension !== 0) this.stereo(xr, si.gr, gr, header, sfbwidth[0]); // reordering, alias reduction, IMDCT, overlap-add, frequency inversion for (var ch = 0; ch < nch; ch++) { var channel = granule.ch[ch]; var sample = frame.sbsample[ch].slice(18 * gr); var sb, l = 0, i, sblimit; var output = this.output; if (channel.block_type === 2) { this.reorder(xr[ch], channel, sfbwidth[ch]); /* * According to ISO/IEC 11172-3, "Alias reduction is not applied for * granules with block_type === 2 (short block)." However, other * sources suggest alias reduction should indeed be performed on the * lower two subbands of mixed blocks. Most other implementations do * this, so by default we will too. */ if (channel.flags & tables.MIXED_BLOCK_FLAG) this.aliasreduce(xr[ch], 36); } else { this.aliasreduce(xr[ch], 576); } // subbands 0-1 if (channel.block_type !== 2 || (channel.flags & tables.MIXED_BLOCK_FLAG)) { var block_type = channel.block_type; if (channel.flags & tables.MIXED_BLOCK_FLAG) block_type = 0; // long blocks for (var sb = 0; sb < 2; ++sb, l += 18) { this.imdct_l(xr[ch].subarray(l, l + 18), output, block_type); this.overlap(output, frame.overlap[ch][sb], sample, sb); } } else { // short blocks for (var sb = 0; sb < 2; ++sb, l += 18) { this.imdct_s(xr[ch].subarray(l, l + 18), output); this.overlap(output, frame.overlap[ch][sb], sample, sb); } } this.freqinver(sample, 1); // (nonzero) subbands 2-31 var i = 576; while (i > 36 && xr[ch][i - 1] === 0) { --i; } sblimit = 32 - (((576 - i) / 18) << 0); if (channel.block_type !== 2) { // long blocks for (var sb = 2; sb < sblimit; ++sb, l += 18) { this.imdct_l(xr[ch].subarray(l, l + 18), output, channel.block_type); this.overlap(output, frame.overlap[ch][sb], sample, sb); if (sb & 1) this.freqinver(sample, sb); } } else { // short blocks for (var sb = 2; sb < sblimit; ++sb, l += 18) { this.imdct_s(xr[ch].subarray(l, l + 18), output); this.overlap(output, frame.overlap[ch][sb], sample, sb); if (sb & 1) this.freqinver(sample, sb); } } // remaining (zero) subbands for (var sb = sblimit; sb < 32; ++sb) { this.overlap_z(frame.overlap[ch][sb], sample, sb); if (sb & 1) this.freqinver(sample, sb); } } } }; Layer3.prototype.scalefactors = function(stream, channel, gr0ch, scfsi) { var start = stream.offset(); var slen1 = tables.SFLEN_TABLE[channel.scalefac_compress].slen1; var slen2 = tables.SFLEN_TABLE[channel.scalefac_compress].slen2; var sfbi; if (channel.block_type === 2) { sfbi = 0; var nsfb = (channel.flags & tables.MIXED_BLOCK_FLAG) ? 8 + 3 * 3 : 6 * 3; while (nsfb--) channel.scalefac[sfbi++] = stream.read(slen1); nsfb = 6 * 3; while (nsfb--) channel.scalefac[sfbi++] = stream.read(slen2); nsfb = 1 * 3; while (nsfb--) channel.scalefac[sfbi++] = 0; } else { if (scfsi & 0x8) { for (var sfbi = 0; sfbi < 6; ++sfbi) channel.scalefac[sfbi] = gr0ch.scalefac[sfbi]; } else { for (var sfbi = 0; sfbi < 6; ++sfbi) channel.scalefac[sfbi] = stream.read(slen1); } if (scfsi & 0x4) { for (var sfbi = 6; sfbi < 11; ++sfbi) channel.scalefac[sfbi] = gr0ch.scalefac[sfbi]; } else { for (var sfbi = 6; sfbi < 11; ++sfbi) channel.scalefac[sfbi] = stream.read(slen1); } if (scfsi & 0x2) { for (var sfbi = 11; sfbi < 16; ++sfbi) channel.scalefac[sfbi] = gr0ch.scalefac[sfbi]; } else { for (var sfbi = 11; sfbi < 16; ++sfbi) channel.scalefac[sfbi] = stream.read(slen2); } if (scfsi & 0x1) { for (var sfbi = 16; sfbi < 21; ++sfbi) channel.scalefac[sfbi] = gr0ch.scalefac[sfbi]; } else { for (var sfbi = 16; sfbi < 21; ++sfbi) channel.scalefac[sfbi] = stream.read(slen2); } channel.scalefac[21] = 0; } return stream.offset() - start; }; Layer3.prototype.scalefactors_lsf = function(stream, channel, gr1ch, mode_extension) { var start = stream.offset(); var scalefac_compress = channel.scalefac_compress; var index = channel.block_type === 2 ? (channel.flags & tables.MIXED_BLOCK_FLAG ? 2 : 1) : 0; var slen = new Int32Array(4); var nsfb; if (!((mode_extension & tables.I_STEREO) && gr1ch)) { if (scalefac_compress < 400) { slen[0] = (scalefac_compress >>> 4) / 5; slen[1] = (scalefac_compress >>> 4) % 5; slen[2] = (scalefac_compress % 16) >>> 2; slen[3] = scalefac_compress % 4; nsfb = tables.NSFB_TABLE[0][index]; } else if (scalefac_compress < 500) { scalefac_compress -= 400; slen[0] = (scalefac_compress >>> 2) / 5; slen[1] = (scalefac_compress >>> 2) % 5; slen[2] = scalefac_compress % 4; slen[3] = 0; nsfb = tables.NSFB_TABLE[1][index]; } else { scalefac_compress -= 500; slen[0] = scalefac_compress / 3; slen[1] = scalefac_compress % 3; slen[2] = 0; slen[3] = 0; channel.flags |= tables.PREFLAG; nsfb = tables.NSFB_TABLE[2][index]; } var n = 0; for (var part = 0; part < 4; part++) { for (var i = 0; i < nsfb[part]; i++) { channel.scalefac[n++] = stream.read(slen[part]); } } while (n < 39) { channel.scalefac[n++] = 0; } } else { // (mode_extension & tables.I_STEREO) && gr1ch (i.e. ch == 1) scalefac_compress >>>= 1; if (scalefac_compress < 180) { slen[0] = scalefac_compress / 36; slen[1] = (scalefac_compress % 36) / 6; slen[2] = (scalefac_compress % 36) % 6; slen[3] = 0; nsfb = tables.NSFB_TABLE[3][index]; } else if (scalefac_compress < 244) { scalefac_compress -= 180; slen[0] = (scalefac_compress % 64) >>> 4; slen[1] = (scalefac_compress % 16) >>> 2; slen[2] = scalefac_compress % 4; slen[3] = 0; nsfb = tables.NSFB_TABLE[4][index]; } else { scalefac_compress -= 244; slen[0] = scalefac_compress / 3; slen[1] = scalefac_compress % 3; slen[2] = 0; slen[3] = 0; nsfb = tables.NSFB_TABLE[5][index]; } var n = 0; for (var part = 0; part < 4; ++part) { var max = (1 << slen[part]) - 1; for (var i = 0; i < nsfb[part]; ++i) { var is_pos = stream.read(slen[part]); channel.scalefac[n] = is_pos; gr1ch.scalefac[n++] = is_pos === max ? 1 : 0; } } while (n < 39) { channel.scalefac[n] = 0; gr1ch.scalefac[n++] = 0; // apparently not illegal } } return stream.offset() - start; }; Layer3.prototype.huffmanDecode = function(stream, xr, channel, sfbwidth, part2_length) { var exponents = this._exponents; var sfbwidthptr = 0; var bits_left = channel.part2_3_length - part2_length; if (bits_left < 0) throw new Error('bad audio data length'); this.exponents(channel, sfbwidth, exponents); var peek = stream.copy(); stream.advance(bits_left); /* align bit reads to byte boundaries */ var cachesz = 8 - peek.bitPosition; cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7; var bitcache = peek.read(cachesz); bits_left -= cachesz; var xrptr = 0; // big_values var region = 0; var reqcache = this.reqcache; var sfbound = xrptr + sfbwidth[sfbwidthptr++]; var rcount = channel.region0_count + 1; var entry = huffman.huff_pair_table[channel.table_select[region]]; var table = entry.table; var linbits = entry.linbits; var startbits = entry.startbits; if (typeof table === 'undefined') throw new Error('bad Huffman table select'); var expptr = 0; var exp = exponents[expptr++]; var reqhits = 0; var big_values = channel.big_values; while (big_values-- && cachesz + bits_left > 0) { if (xrptr === sfbound) { sfbound += sfbwidth[sfbwidthptr++]; // change table if region boundary if (--rcount === 0) { if (region === 0) rcount = channel.region1_count + 1; else rcount = 0; // all remaining entry = huffman.huff_pair_table[channel.table_select[++region]]; table = entry.table; linbits = entry.linbits; startbits = entry.startbits; if (typeof table === 'undefined') throw new Error('bad Huffman table select'); } if (exp !== exponents[expptr]) { exp = exponents[expptr]; reqhits = 0; } ++expptr; } if (cachesz < 21) { var bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7; bitcache = (bitcache << bits) | peek.read(bits); cachesz += bits; bits_left -= bits; } var clumpsz = startbits; var pair = table[ (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))]; while (!pair.final) { cachesz -= clumpsz; clumpsz = pair.ptr.bits; pair = table[pair.ptr.offset + (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))]; } cachesz -= pair.value.hlen; if (linbits) { var value = pair.value.x; var x_final = false; switch (value) { case 0: xr[xrptr] = 0; break; case 15: if (cachesz < linbits + 2) { bitcache = (bitcache << 16) | peek.read(16); cachesz += 16; bits_left -= 16; } value += (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1)); cachesz -= linbits; requantized = this.requantize(value, exp); x_final = true; // simulating goto, yay break; default: if (reqhits & (1 << value)) { requantized = reqcache[value]; } else { reqhits |= (1 << value); requantized = reqcache[value] = this.requantize(value, exp); } x_final = true; } if(x_final) { xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized; } value = pair.value.y; var y_final = false; switch (value) { case 0: xr[xrptr + 1] = 0; break; case 15: if (cachesz < linbits + 1) { bitcache = (bitcache << 16) | peek.read(16); cachesz += 16; bits_left -= 16; } value += (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1)); cachesz -= linbits; requantized = this.requantize(value, exp); y_final = true; break; // simulating goto, yayzor default: if (reqhits & (1 << value)) { requantized = reqcache[value]; } else { reqhits |= (1 << value); reqcache[value] = this.requantize(value, exp); requantized = reqcache[value]; } y_final = true; } if(y_final) { xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized; } } else { var value = pair.value.x; if (value === 0) { xr[xrptr] = 0; } else { if (reqhits & (1 << value)) requantized = reqcache[value]; else { reqhits |= (1 << value); requantized = reqcache[value] = this.requantize(value, exp); } xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized; } value = pair.value.y; if (value === 0) { xr[xrptr + 1] = 0; } else { if (reqhits & (1 << value)) requantized = reqcache[value]; else { reqhits |= (1 << value); requantized = reqcache[value] = this.requantize(value, exp); } xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized; } } xrptr += 2; } if (cachesz + bits_left < 0) throw new Error('Huffman data overrun'); // count1 var table = huffman.huff_quad_table[channel.flags & tables.COUNT1TABLE_SELECT]; var requantized = this.requantize(1, exp); while (cachesz + bits_left > 0 && xrptr <= 572) { if (cachesz < 10) { bitcache = (bitcache << 16) | peek.read(16); cachesz += 16; bits_left -= 16; } var quad = table[(((bitcache) >> ((cachesz) - (4))) & ((1 << (4)) - 1))]; // quad tables guaranteed to have at most one extra lookup if (!quad.final) { cachesz -= 4; quad = table[quad.ptr.offset + (((bitcache) >> ((cachesz) - (quad.ptr.bits))) & ((1 << (quad.ptr.bits)) - 1))]; } cachesz -= quad.value.hlen; if (xrptr === sfbound) { sfbound += sfbwidth[sfbwidthptr++]; if (exp !== exponents[expptr]) { exp = exponents[expptr]; requantized = this.requantize(1, exp); } ++expptr; } // v (0..1) xr[xrptr] = quad.value.v ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0; // w (0..1) xr[xrptr + 1] = quad.value.w ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0; xrptr += 2; if (xrptr === sfbound) { sfbound += sfbwidth[sfbwidthptr++]; if (exp !== exponents[expptr]) { exp = exponents[expptr]; requantized = this.requantize(1, exp); } ++expptr; } // x (0..1) xr[xrptr] = quad.value.x ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0; // y (0..1) xr[xrptr + 1] = quad.value.y ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0; xrptr += 2; if (cachesz + bits_left < 0) { // technically the bitstream is misformatted, but apparently // some encoders are just a bit sloppy with stuffing bits xrptr -= 4; } } if (-bits_left > MP3FrameHeader.BUFFER_GUARD * 8) { throw new Error("assertion failed: (-bits_left <= MP3FrameHeader.BUFFER_GUARD * CHAR_BIT)"); } // rzero while (xrptr < 576) { xr[xrptr] = 0; xr[xrptr + 1] = 0; xrptr += 2; } }; Layer3.prototype.requantize = function(value, exp) { // usual (x >> 0) tricks to make sure frac and exp stay integers var frac = (exp % 4) >> 0; // assumes sign(frac) === sign(exp) exp = (exp / 4) >> 0; var requantized = Math.pow(value, 4.0 / 3.0); requantized *= Math.pow(2.0, (exp / 4.0)); if (frac) { requantized *= Math.pow(2.0, (frac / 4.0)); } if (exp < 0) { requantized /= Math.pow(2.0, -exp * (3.0 / 4.0)); } return requantized; }; Layer3.prototype.exponents = function(channel, sfbwidth, exponents) { var gain = channel.global_gain - 210; var scalefac_multiplier = (channel.flags & tables.SCALEFAC_SCALE) ? 2 : 1; if (channel.block_type === 2) { var sfbi = 0, l = 0; if (channel.flags & tables.MIXED_BLOCK_FLAG) { var premask = (channel.flags & tables.PREFLAG) ? ~0 : 0; // long block subbands 0-1 while (l < 36) { exponents[sfbi] = gain - ((channel.scalefac[sfbi] + (tables.PRETAB[sfbi] & premask)) << scalefac_multiplier); l += sfbwidth[sfbi++]; } } // this is probably wrong for 8000 Hz short/mixed blocks var gain0 = gain - 8 * channel.subblock_gain[0]; var gain1 = gain - 8 * channel.subblock_gain[1]; var gain2 = gain - 8 * channel.subblock_gain[2]; while (l < 576) { exponents[sfbi + 0] = gain0 - (channel.scalefac[sfbi + 0] << scalefac_multiplier); exponents[sfbi + 1] = gain1 - (channel.scalefac[sfbi + 1] << scalefac_multiplier); exponents[sfbi + 2] = gain2 - (channel.scalefac[sfbi + 2] << scalefac_multiplier); l += 3 * sfbwidth[sfbi]; sfbi += 3; } } else { if (channel.flags & tables.PREFLAG) { for (var sfbi = 0; sfbi < 22; sfbi++) { exponents[sfbi] = gain - ((channel.scalefac[sfbi] + tables.PRETAB[sfbi]) << scalefac_multiplier); } } else { for (var sfbi = 0; sfbi < 22; sfbi++) { exponents[sfbi] = gain - (channel.scalefac[sfbi] << scalefac_multiplier); } } } }; Layer3.prototype.stereo = function(xr, granules, gr, header, sfbwidth) { var granule = granules[gr]; var modes = this.modes; var sfbi, l, n, i; if (granule.ch[0].block_type !== granule.ch[1].block_type || (granule.ch[0].flags & tables.MIXED_BLOCK_FLAG) !== (granule.ch[1].flags & tables.MIXED_BLOCK_FLAG)) throw new Error('incompatible stereo block_type'); for (var i = 0; i < 39; i++) modes[i] = header.mode_extension; // intensity stereo if (header.mode_extension & tables.I_STEREO) { var right_ch = granule.ch[1]; var right_xr = xr[1]; header.flags |= MP3FrameHeader.FLAGS.tables.I_STEREO; // first determine which scalefactor bands are to be processed if (right_ch.block_type === 2) { var lower, start, max, bound = new Uint32Array(3), w; lower = start = max = bound[0] = bound[1] = bound[2] = 0; sfbi = l = 0; if (right_ch.flags & tables.MIXED_BLOCK_FLAG) { while (l < 36) { n = sfbwidth[sfbi++]; for (var i = 0; i < n; ++i) { if (right_xr[i]) { lower = sfbi; break; } } right_xr += n; l += n; } start = sfbi; } var w = 0; while (l < 576) { n = sfbwidth[sfbi++]; for (i = 0; i < n; ++i) { if (right_xr[i]) { max = bound[w] = sfbi; break; } } right_xr += n; l += n; w = (w + 1) % 3; } if (max) lower = start; // long blocks for (i = 0; i < lower; ++i) modes[i] = header.mode_extension & ~tables.I_STEREO; // short blocks w = 0; for (i = start; i < max; ++i) { if (i < bound[w]) modes[i] = header.mode_extension & ~tables.I_STEREO; w = (w + 1) % 3; } } else { var bound = 0; for (sfbi = l = 0; l < 576; l += n) { n = sfbwidth[sfbi++]; for (i = 0; i < n; ++i) { if (right_xr[i]) { bound = sfbi; break; } } right_xr += n; } for (i = 0; i < bound; ++i) modes[i] = header.mode_extension & ~tables.I_STEREO; } // now do the actual processing if (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) { var illegal_pos = granules[gr + 1].ch[1].scalefac; // intensity_scale var lsf_scale = IS_Ltables.SF_TABLE[right_ch.scalefac_compress & 0x1]; for (sfbi = l = 0; l < 576; ++sfbi, l += n) { n = sfbwidth[sfbi]; if (!(modes[sfbi] & tables.I_STEREO)) continue; if (illegal_pos[sfbi]) { modes[sfbi] &= ~tables.I_STEREO; continue; } is_pos = right_ch.scalefac[sfbi]; for (i = 0; i < n; ++i) { var left = xr[0][l + i]; if (is_pos === 0) { xr[1][l + i] = left; } else { var opposite = left * lsf_scale[(is_pos - 1) / 2]; if (is_pos & 1) { xr[0][l + i] = opposite; xr[1][l + i] = left; } else { xr[1][l + i] = opposite; } } } } } else { for (sfbi = l = 0; l < 576; ++sfbi, l += n) { n = sfbwidth[sfbi]; if (!(modes[sfbi] & tables.I_STEREO)) continue; is_pos = right_ch.scalefac[sfbi]; if (is_pos >= 7) { // illegal intensity position modes[sfbi] &= ~tables.I_STEREO; continue; } for (i = 0; i < n; ++i) { var left = xr[0][l + i]; xr[0][l + i] = left * tables.IS_TABLE[is_pos]; xr[1][l + i] = left * tables.IS_TABLE[6 - is_pos]; } } } } // middle/side stereo if (header.mode_extension & tables.MS_STEREO) { header.flags |= tables.MS_STEREO; var invsqrt2 = tables.ROOT_TABLE[3 + -2]; for (sfbi = l = 0; l < 576; ++sfbi, l += n) { n = sfbwidth[sfbi]; if (modes[sfbi] !== tables.MS_STEREO) continue; for (i = 0; i < n; ++i) { var m = xr[0][l + i]; var s = xr[1][l + i]; xr[0][l + i] = (m + s) * invsqrt2; // l = (m + s) / sqrt(2) xr[1][l + i] = (m - s) * invsqrt2; // r = (m - s) / sqrt(2) } } } }; Layer3.prototype.aliasreduce = function(xr, lines) { for (var xrPointer = 18; xrPointer < lines; xrPointer += 18) { for (var i = 0; i < 8; ++i) { var a = xr[xrPointer - i - 1]; var b = xr[xrPointer + i]; xr[xrPointer - i - 1] = a * tables.CS[i] - b * tables.CA[i]; xr[xrPointer + i] = b * tables.CS[i] + a * tables.CA[i]; } } }; // perform IMDCT and windowing for long blocks Layer3.prototype.imdct_l = function (X, z, block_type) { // IMDCT this.imdct.imdct36(X, z); // windowing switch (block_type) { case 0: // normal window for (var i = 0; i < 36; ++i) z[i] = z[i] * tables.WINDOW_L[i]; break; case 1: // start block for (var i = 0; i < 18; ++i) z[i] = z[i] * tables.WINDOW_L[i]; for (var i = 24; i < 30; ++i) z[i] = z[i] * tables.WINDOW_S[i - 18]; for (var i = 30; i < 36; ++i) z[i] = 0; break; case 3: // stop block for (var i = 0; i < 6; ++i) z[i] = 0; for (var i = 6; i < 12; ++i) z[i] = z[i] * tables.WINDOW_S[i - 6]; for (var i = 18; i < 36; ++i) z[i] = z[i] * tables.WINDOW_L[i]; break; } }; /* * perform IMDCT and windowing for short blocks */ Layer3.prototype.imdct_s = function (X, z) { var yptr = 0; var wptr; var Xptr = 0; var y = new Float64Array(36); var hi, lo; // IMDCT for (var w = 0; w < 3; ++w) { var sptr = 0; for (var i = 0; i < 3; ++i) { lo = X[Xptr + 0] * IMDCT.S[sptr][0] + X[Xptr + 1] * IMDCT.S[sptr][1] + X[Xptr + 2] * IMDCT.S[sptr][2] + X[Xptr + 3] * IMDCT.S[sptr][3] + X[Xptr + 4] * IMDCT.S[sptr][4] + X[Xptr + 5] * IMDCT.S[sptr][5]; y[yptr + i + 0] = lo; y[yptr + 5 - i] = -y[yptr + i + 0]; ++sptr; lo = X[Xptr + 0] * IMDCT.S[sptr][0] + X[Xptr + 1] * IMDCT.S[sptr][1] + X[Xptr + 2] * IMDCT.S[sptr][2] + X[Xptr + 3] * IMDCT.S[sptr][3] + X[Xptr + 4] * IMDCT.S[sptr][4] + X[Xptr + 5] * IMDCT.S[sptr][5]; y[yptr + i + 6] = lo; y[yptr + 11 - i] = y[yptr + i + 6]; ++sptr; } yptr += 12; Xptr += 6; } // windowing, overlapping and concatenation yptr = 0; var wptr = 0; for (var i = 0; i < 6; ++i) { z[i + 0] = 0; z[i + 6] = y[yptr + 0 + 0] * tables.WINDOW_S[wptr + 0]; lo = y[yptr + 0 + 6] * tables.WINDOW_S[wptr + 6] + y[yptr + 12 + 0] * tables.WINDOW_S[wptr + 0]; z[i + 12] = lo; lo = y[yptr + 12 + 6] * tables.WINDOW_S[wptr + 6] + y[yptr + 24 + 0] * tables.WINDOW_S[wptr + 0]; z[i + 18] = lo; z[i + 24] = y[yptr + 24 + 6] * tables.WINDOW_S[wptr + 6]; z[i + 30] = 0; ++yptr; ++wptr; } }; Layer3.prototype.overlap = function (output, overlap, sample, sb) { for (var i = 0; i < 18; ++i) { sample[i][sb] = output[i] + overlap[i]; overlap[i] = output[i + 18]; } }; Layer3.prototype.freqinver = function (sample, sb) { for (var i = 1; i < 18; i += 2) sample[i][sb] = -sample[i][sb]; }; Layer3.prototype.overlap_z = function (overlap, sample, sb) { for (var i = 0; i < 18; ++i) { sample[i][sb] = overlap[i]; overlap[i] = 0; } }; Layer3.prototype.reorder = function (xr, channel, sfbwidth) { var sfbwidthPointer = 0; var tmp = this.tmp; var sbw = new Uint32Array(3); var sw = new Uint32Array(3); // this is probably wrong for 8000 Hz mixed blocks var sb = 0; if (channel.flags & tables.MIXED_BLOCK_FLAG) { var sb = 2; var l = 0; while (l < 36) l += sfbwidth[sfbwidthPointer++]; } for (var w = 0; w < 3; ++w) { sbw[w] = sb; sw[w] = 0; } f = sfbwidth[sfbwidthPointer++]; w = 0; for (var l = 18 * sb; l < 576; ++l) { if (f-- === 0) { f = sfbwidth[sfbwidthPointer++] - 1; w = (w + 1) % 3; } tmp[sbw[w]][w][sw[w]++] = xr[l]; if (sw[w] === 6) { sw[w] = 0; ++sbw[w]; } } var tmp2 = this.tmp2; var ptr = 0; for (var i = 0; i < 32; i++) { for (var j = 0; j < 3; j++) { for (var k = 0; k < 6; k++) { tmp2[ptr++] = tmp[i][j][k]; } } } var len = (576 - 18 * sb); for (var i = 0; i < len; i++) { xr[18 * sb + i] = tmp2[sb + i]; } }; module.exports = Layer3; },{"./frame":4,"./header":5,"./huffman":6,"./imdct":8,"./tables":14,"./utils":15}],12:[function(require,module,exports){ var AV = (window.AV); var MP3FrameHeader = require('./header'); function MP3Stream(stream) { this.stream = stream; // actual bitstream this.sync = false; // stream sync found this.freerate = 0; // free bitrate (fixed) this.this_frame = stream.stream.offset; // start of current frame this.next_frame = stream.stream.offset; // start of next frame this.main_data = new Uint8Array(MP3FrameHeader.BUFFER_MDLEN); // actual audio data this.md_len = 0; // length of main data // copy methods from actual stream for (var key in stream) { if (typeof stream[key] === 'function') this[key] = stream[key].bind(stream); } } MP3Stream.prototype.getU8 = function(offset) { var stream = this.stream.stream; return stream.peekUInt8(offset - stream.offset); }; MP3Stream.prototype.nextByte = function() { var stream = this.stream; return stream.bitPosition === 0 ? stream.stream.offset : stream.stream.offset + 1; }; MP3Stream.prototype.doSync = function() { var stream = this.stream.stream; this.align(); while (this.available(16) && !(stream.peekUInt8(0) === 0xff && (stream.peekUInt8(1) & 0xe0) === 0xe0)) { this.advance(8); } if (!this.available(MP3FrameHeader.BUFFER_GUARD)) return false; return true; }; MP3Stream.prototype.reset = function(byteOffset) { this.seek(byteOffset * 8); this.next_frame = byteOffset; this.sync = true; }; module.exports = MP3Stream; },{"./header":5}],13:[function(require,module,exports){ var utils = require('./utils'); function MP3Synth() { this.filter = utils.makeArray([2, 2, 2, 16, 8]); // polyphase filterbank outputs this.phase = 0; this.pcm = { samplerate: 0, channels: 0, length: 0, samples: [new Float64Array(1152), new Float64Array(1152)] }; } /* costab[i] = cos(PI / (2 * 32) * i) */ const costab1 = 0.998795456; const costab2 = 0.995184727; const costab3 = 0.989176510; const costab4 = 0.980785280; const costab5 = 0.970031253; const costab6 = 0.956940336; const costab7 = 0.941544065; const costab8 = 0.923879533; const costab9 = 0.903989293; const costab10 = 0.881921264; const costab11 = 0.857728610; const costab12 = 0.831469612; const costab13 = 0.803207531; const costab14 = 0.773010453; const costab15 = 0.740951125; const costab16 = 0.707106781; const costab17 = 0.671558955; const costab18 = 0.634393284; const costab19 = 0.595699304; const costab20 = 0.555570233; const costab21 = 0.514102744; const costab22 = 0.471396737; const costab23 = 0.427555093; const costab24 = 0.382683432; const costab25 = 0.336889853; const costab26 = 0.290284677; const costab27 = 0.242980180; const costab28 = 0.195090322; const costab29 = 0.146730474; const costab30 = 0.098017140; const costab31 = 0.049067674; /* * NAME: dct32() * DESCRIPTION: perform fast in[32].out[32] DCT */ MP3Synth.dct32 = function (_in, slot, lo, hi) { var t0, t1, t2, t3, t4, t5, t6, t7; var t8, t9, t10, t11, t12, t13, t14, t15; var t16, t17, t18, t19, t20, t21, t22, t23; var t24, t25, t26, t27, t28, t29, t30, t31; var t32, t33, t34, t35, t36, t37, t38, t39; var t40, t41, t42, t43, t44, t45, t46, t47; var t48, t49, t50, t51, t52, t53, t54, t55; var t56, t57, t58, t59, t60, t61, t62, t63; var t64, t65, t66, t67, t68, t69, t70, t71; var t72, t73, t74, t75, t76, t77, t78, t79; var t80, t81, t82, t83, t84, t85, t86, t87; var t88, t89, t90, t91, t92, t93, t94, t95; var t96, t97, t98, t99, t100, t101, t102, t103; var t104, t105, t106, t107, t108, t109, t110, t111; var t112, t113, t114, t115, t116, t117, t118, t119; var t120, t121, t122, t123, t124, t125, t126, t127; var t128, t129, t130, t131, t132, t133, t134, t135; var t136, t137, t138, t139, t140, t141, t142, t143; var t144, t145, t146, t147, t148, t149, t150, t151; var t152, t153, t154, t155, t156, t157, t158, t159; var t160, t161, t162, t163, t164, t165, t166, t167; var t168, t169, t170, t171, t172, t173, t174, t175; var t176; t0 = _in[0] + _in[31]; t16 = ((_in[0] - _in[31]) * (costab1)); t1 = _in[15] + _in[16]; t17 = ((_in[15] - _in[16]) * (costab31)); t41 = t16 + t17; t59 = ((t16 - t17) * (costab2)); t33 = t0 + t1; t50 = ((t0 - t1) * ( costab2)); t2 = _in[7] + _in[24]; t18 = ((_in[7] - _in[24]) * (costab15)); t3 = _in[8] + _in[23]; t19 = ((_in[8] - _in[23]) * (costab17)); t42 = t18 + t19; t60 = ((t18 - t19) * (costab30)); t34 = t2 + t3; t51 = ((t2 - t3) * ( costab30)); t4 = _in[3] + _in[28]; t20 = ((_in[3] - _in[28]) * (costab7)); t5 = _in[12] + _in[19]; t21 = ((_in[12] - _in[19]) * (costab25)); t43 = t20 + t21; t61 = ((t20 - t21) * (costab14)); t35 = t4 + t5; t52 = ((t4 - t5) * ( costab14)); t6 = _in[4] + _in[27]; t22 = ((_in[4] - _in[27]) * (costab9)); t7 = _in[11] + _in[20]; t23 = ((_in[11] - _in[20]) * (costab23)); t44 = t22 + t23; t62 = ((t22 - t23) * (costab18)); t36 = t6 + t7; t53 = ((t6 - t7) * ( costab18)); t8 = _in[1] + _in[30]; t24 = ((_in[1] - _in[30]) * (costab3)); t9 = _in[14] + _in[17]; t25 = ((_in[14] - _in[17]) * (costab29)); t45 = t24 + t25; t63 = ((t24 - t25) * (costab6)); t37 = t8 + t9; t54 = ((t8 - t9) * ( costab6)); t10 = _in[6] + _in[25]; t26 = ((_in[6] - _in[25]) * (costab13)); t11 = _in[9] + _in[22]; t27 = ((_in[9] - _in[22]) * (costab19)); t46 = t26 + t27; t64 = ((t26 - t27) * (costab26)); t38 = t10 + t11; t55 = ((t10 - t11) * (costab26)); t12 = _in[2] + _in[29]; t28 = ((_in[2] - _in[29]) * (costab5)); t13 = _in[13] + _in[18]; t29 = ((_in[13] - _in[18]) * (costab27)); t47 = t28 + t29; t65 = ((t28 - t29) * (costab10)); t39 = t12 + t13; t56 = ((t12 - t13) * (costab10)); t14 = _in[5] + _in[26]; t30 = ((_in[5] - _in[26]) * (costab11)); t15 = _in[10] + _in[21]; t31 = ((_in[10] - _in[21]) * (costab21)); t48 = t30 + t31; t66 = ((t30 - t31) * (costab22)); t40 = t14 + t15; t57 = ((t14 - t15) * (costab22)); t69 = t33 + t34; t89 = ((t33 - t34) * (costab4)); t70 = t35 + t36; t90 = ((t35 - t36) * (costab28)); t71 = t37 + t38; t91 = ((t37 - t38) * (costab12)); t72 = t39 + t40; t92 = ((t39 - t40) * (costab20)); t73 = t41 + t42; t94 = ((t41 - t42) * (costab4)); t74 = t43 + t44; t95 = ((t43 - t44) * (costab28)); t75 = t45 + t46; t96 = ((t45 - t46) * (costab12)); t76 = t47 + t48; t97 = ((t47 - t48) * (costab20)); t78 = t50 + t51; t100 = ((t50 - t51) * (costab4)); t79 = t52 + t53; t101 = ((t52 - t53) * (costab28)); t80 = t54 + t55; t102 = ((t54 - t55) * (costab12)); t81 = t56 + t57; t103 = ((t56 - t57) * (costab20)); t83 = t59 + t60; t106 = ((t59 - t60) * (costab4)); t84 = t61 + t62; t107 = ((t61 - t62) * (costab28)); t85 = t63 + t64; t108 = ((t63 - t64) * (costab12)); t86 = t65 + t66; t109 = ((t65 - t66) * (costab20)); t113 = t69 + t70; t114 = t71 + t72; /* 0 */ hi[15][slot] = t113 + t114; /* 16 */ lo[ 0][slot] = ((t113 - t114) * (costab16)); t115 = t73 + t74; t116 = t75 + t76; t32 = t115 + t116; /* 1 */ hi[14][slot] = t32; t118 = t78 + t79; t119 = t80 + t81; t58 = t118 + t119; /* 2 */ hi[13][slot] = t58; t121 = t83 + t84; t122 = t85 + t86; t67 = t121 + t122; t49 = (t67 * 2) - t32; /* 3 */ hi[12][slot] = t49; t125 = t89 + t90; t126 = t91 + t92; t93 = t125 + t126; /* 4 */ hi[11][slot] = t93; t128 = t94 + t95; t129 = t96 + t97; t98 = t128 + t129; t68 = (t98 * 2) - t49; /* 5 */ hi[10][slot] = t68; t132 = t100 + t101; t133 = t102 + t103; t104 = t132 + t133; t82 = (t104 * 2) - t58; /* 6 */ hi[ 9][slot] = t82; t136 = t106 + t107; t137 = t108 + t109; t110 = t136 + t137; t87 = (t110 * 2) - t67; t77 = (t87 * 2) - t68; /* 7 */ hi[ 8][slot] = t77; t141 = ((t69 - t70) * (costab8)); t142 = ((t71 - t72) * (costab24)); t143 = t141 + t142; /* 8 */ hi[ 7][slot] = t143; /* 24 */ lo[ 8][slot] = (((t141 - t142) * (costab16) * 2)) - t143; t144 = ((t73 - t74) * (costab8)); t145 = ((t75 - t76) * (costab24)); t146 = t144 + t145; t88 = (t146 * 2) - t77; /* 9 */ hi[ 6][slot] = t88; t148 = ((t78 - t79) * (costab8)); t149 = ((t80 - t81) * (costab24)); t150 = t148 + t149; t105 = (t150 * 2) - t82; /* 10 */ hi[ 5][slot] = t105; t152 = ((t83 - t84) * (costab8)); t153 = ((t85 - t86) * (costab24)); t154 = t152 + t153; t111 = (t154 * 2) - t87; t99 = (t111 * 2) - t88; /* 11 */ hi[ 4][slot] = t99; t157 = ((t89 - t90) * (costab8)); t158 = ((t91 - t92) * (costab24)); t159 = t157 + t158; t127 = (t159 * 2) - t93; /* 12 */ hi[ 3][slot] = t127; t160 = (((t125 - t126) * (costab16) * 2)) - t127; /* 20 */ lo[ 4][slot] = t160; /* 28 */ lo[12][slot] = (((((t157 - t158) * (costab16) * 2) - t159) * 2)) - t160; t161 = ((t94 - t95) * (costab8)); t162 = ((t96 - t97) * (costab24)); t163 = t161 + t162; t130 = (t163 * 2) - t98; t112 = (t130 * 2) - t99; /* 13 */ hi[ 2][slot] = t112; t164 = (((t128 - t129) * (costab16) * 2)) - t130; t166 = ((t100 - t101) * (costab8)); t167 = ((t102 - t103) * (costab24)); t168 = t166 + t167; t134 = (t168 * 2) - t104; t120 = (t134 * 2) - t105; /* 14 */ hi[ 1][slot] = t120; t135 = (((t118 - t119) * (costab16) * 2)) - t120; /* 18 */ lo[ 2][slot] = t135; t169 = (((t132 - t133) * (costab16) * 2)) - t134; t151 = (t169 * 2) - t135; /* 22 */ lo[ 6][slot] = t151; t170 = (((((t148 - t149) * (costab16) * 2) - t150) * 2)) - t151; /* 26 */ lo[10][slot] = t170; /* 30 */ lo[14][slot] = (((((((t166 - t167) * (costab16)) * 2 - t168) * 2) - t169) * 2) - t170); t171 = ((t106 - t107) * (costab8)); t172 = ((t108 - t109) * (costab24)); t173 = t171 + t172; t138 = (t173 * 2) - t110; t123 = (t138 * 2) - t111; t139 = (((t121 - t122) * (costab16) * 2)) - t123; t117 = (t123 * 2) - t112; /* 15 */ hi[ 0][slot] = t117; t124 = (((t115 - t116) * (costab16) * 2)) - t117; /* 17 */ lo[ 1][slot] = t124; t131 = (t139 * 2) - t124; /* 19 */ lo[ 3][slot] = t131; t140 = (t164 * 2) - t131; /* 21 */ lo[ 5][slot] = t140; t174 = (((t136 - t137) * (costab16) * 2)) - t138; t155 = (t174 * 2) - t139; t147 = (t155 * 2) - t140; /* 23 */ lo[ 7][slot] = t147; t156 = (((((t144 - t145) * (costab16) * 2) - t146) * 2)) - t147; /* 25 */ lo[ 9][slot] = t156; t175 = (((((t152 - t153) * (costab16) * 2) - t154) * 2)) - t155; t165 = (t175 * 2) - t156; /* 27 */ lo[11][slot] = t165; t176 = (((((((t161 - t162) * (costab16) * 2)) - t163) * 2) - t164) * 2) - t165; /* 29 */ lo[13][slot] = t176; /* 31 */ lo[15][slot] = (((((((((t171 - t172) * (costab16)) * 2 - t173) * 2) - t174) * 2) - t175) * 2) - t176); /* * Totals: * 80 multiplies * 80 additions * 119 subtractions * 49 shifts (not counting SSO) */ }; /* * These are the coefficients for the subband synthesis window. This is a * reordered version of Table B.3 from ISO/IEC 11172-3. */ const D = [ [ 0.000000000, /* 0 */ -0.000442505, 0.003250122, -0.007003784, 0.031082153, -0.078628540, 0.100311279, -0.572036743, 1.144989014, 0.572036743, 0.100311279, 0.078628540, 0.031082153, 0.007003784, 0.003250122, 0.000442505, 0.000000000, -0.000442505, 0.003250122, -0.007003784, 0.031082153, -0.078628540, 0.100311279, -0.572036743, 1.144989014, 0.572036743, 0.100311279, 0.078628540, 0.031082153, 0.007003784, 0.003250122, 0.000442505 ], [ -0.000015259, /* 1 */ -0.000473022, 0.003326416, -0.007919312, 0.030517578, -0.084182739, 0.090927124, -0.600219727, 1.144287109, 0.543823242, 0.108856201, 0.073059082, 0.031478882, 0.006118774, 0.003173828, 0.000396729, -0.000015259, -0.000473022, 0.003326416, -0.007919312, 0.030517578, -0.084182739, 0.090927124, -0.600219727, 1.144287109, 0.543823242, 0.108856201, 0.073059082, 0.031478882, 0.006118774, 0.003173828, 0.000396729 ], [ -0.000015259, /* 2 */ -0.000534058, 0.003387451, -0.008865356, 0.029785156, -0.089706421, 0.080688477, -0.628295898, 1.142211914, 0.515609741, 0.116577148, 0.067520142, 0.031738281, 0.005294800, 0.003082275, 0.000366211, -0.000015259, -0.000534058, 0.003387451, -0.008865356, 0.029785156, -0.089706421, 0.080688477, -0.628295898, 1.142211914, 0.515609741, 0.116577148, 0.067520142, 0.031738281, 0.005294800, 0.003082275, 0.000366211 ], [ -0.000015259, /* 3 */ -0.000579834, 0.003433228, -0.009841919, 0.028884888, -0.095169067, 0.069595337, -0.656219482, 1.138763428, 0.487472534, 0.123474121, 0.061996460, 0.031845093, 0.004486084, 0.002990723, 0.000320435, -0.000015259, -0.000579834, 0.003433228, -0.009841919, 0.028884888, -0.095169067, 0.069595337, -0.656219482, 1.138763428, 0.487472534, 0.123474121, 0.061996460, 0.031845093, 0.004486084, 0.002990723, 0.000320435 ], [ -0.000015259, /* 4 */ -0.000625610, 0.003463745, -0.010848999, 0.027801514, -0.100540161, 0.057617187, -0.683914185, 1.133926392, 0.459472656, 0.129577637, 0.056533813, 0.031814575, 0.003723145, 0.002899170, 0.000289917, -0.000015259, -0.000625610, 0.003463745, -0.010848999, 0.027801514, -0.100540161, 0.057617187, -0.683914185, 1.133926392, 0.459472656, 0.129577637, 0.056533813, 0.031814575, 0.003723145, 0.002899170, 0.000289917 ], [ -0.000015259, /* 5 */ -0.000686646, 0.003479004, -0.011886597, 0.026535034, -0.105819702, 0.044784546, -0.711318970, 1.127746582, 0.431655884, 0.134887695, 0.051132202, 0.031661987, 0.003005981, 0.002792358, 0.000259399, -0.000015259, -0.000686646, 0.003479004, -0.011886597, 0.026535034, -0.105819702, 0.044784546, -0.711318970, 1.127746582, 0.431655884, 0.134887695, 0.051132202, 0.031661987, 0.003005981, 0.002792358, 0.000259399 ], [ -0.000015259, /* 6 */ -0.000747681, 0.003479004, -0.012939453, 0.025085449, -0.110946655, 0.031082153, -0.738372803, 1.120223999, 0.404083252, 0.139450073, 0.045837402, 0.031387329, 0.002334595, 0.002685547, 0.000244141, -0.000015259, -0.000747681, 0.003479004, -0.012939453, 0.025085449, -0.110946655, 0.031082153, -0.738372803, 1.120223999, 0.404083252, 0.139450073, 0.045837402, 0.031387329, 0.002334595, 0.002685547, 0.000244141 ], [ -0.000030518, /* 7 */ -0.000808716, 0.003463745, -0.014022827, 0.023422241, -0.115921021, 0.016510010, -0.765029907, 1.111373901, 0.376800537, 0.143264771, 0.040634155, 0.031005859, 0.001693726, 0.002578735, 0.000213623, -0.000030518, -0.000808716, 0.003463745, -0.014022827, 0.023422241, -0.115921021, 0.016510010, -0.765029907, 1.111373901, 0.376800537, 0.143264771, 0.040634155, 0.031005859, 0.001693726, 0.002578735, 0.000213623 ], [ -0.000030518, /* 8 */ -0.000885010, 0.003417969, -0.015121460, 0.021575928, -0.120697021, 0.001068115, -0.791213989, 1.101211548, 0.349868774, 0.146362305, 0.035552979, 0.030532837, 0.001098633, 0.002456665, 0.000198364, -0.000030518, -0.000885010, 0.003417969, -0.015121460, 0.021575928, -0.120697021, 0.001068115, -0.791213989, 1.101211548, 0.349868774, 0.146362305, 0.035552979, 0.030532837, 0.001098633, 0.002456665, 0.000198364 ], [ -0.000030518, /* 9 */ -0.000961304, 0.003372192, -0.016235352, 0.019531250, -0.125259399, -0.015228271, -0.816864014, 1.089782715, 0.323318481, 0.148773193, 0.030609131, 0.029937744, 0.000549316, 0.002349854, 0.000167847, -0.000030518, -0.000961304, 0.003372192, -0.016235352, 0.019531250, -0.125259399, -0.015228271, -0.816864014, 1.089782715, 0.323318481, 0.148773193, 0.030609131, 0.029937744, 0.000549316, 0.002349854, 0.000167847 ], [ -0.000030518, /* 10 */ -0.001037598, 0.003280640, -0.017349243, 0.017257690, -0.129562378, -0.032379150, -0.841949463, 1.077117920, 0.297210693, 0.150497437, 0.025817871, 0.029281616, 0.000030518, 0.002243042, 0.000152588, -0.000030518, -0.001037598, 0.003280640, -0.017349243, 0.017257690, -0.129562378, -0.032379150, -0.841949463, 1.077117920, 0.297210693, 0.150497437, 0.025817871, 0.029281616, 0.000030518, 0.002243042, 0.000152588 ], [ -0.000045776, /* 11 */ -0.001113892, 0.003173828, -0.018463135, 0.014801025, -0.133590698, -0.050354004, -0.866363525, 1.063217163, 0.271591187, 0.151596069, 0.021179199, 0.028533936, -0.000442505, 0.002120972, 0.000137329, -0.000045776, -0.001113892, 0.003173828, -0.018463135, 0.014801025, -0.133590698, -0.050354004, -0.866363525, 1.063217163, 0.271591187, 0.151596069, 0.021179199, 0.028533936, -0.000442505, 0.002120972, 0.000137329 ], [ -0.000045776, /* 12 */ -0.001205444, 0.003051758, -0.019577026, 0.012115479, -0.137298584, -0.069168091, -0.890090942, 1.048156738, 0.246505737, 0.152069092, 0.016708374, 0.027725220, -0.000869751, 0.002014160, 0.000122070, -0.000045776, -0.001205444, 0.003051758, -0.019577026, 0.012115479, -0.137298584, -0.069168091, -0.890090942, 1.048156738, 0.246505737, 0.152069092, 0.016708374, 0.027725220, -0.000869751, 0.002014160, 0.000122070 ], [ -0.000061035, /* 13 */ -0.001296997, 0.002883911, -0.020690918, 0.009231567, -0.140670776, -0.088775635, -0.913055420, 1.031936646, 0.221984863, 0.151962280, 0.012420654, 0.026840210, -0.001266479, 0.001907349, 0.000106812, -0.000061035, -0.001296997, 0.002883911, -0.020690918, 0.009231567, -0.140670776, -0.088775635, -0.913055420, 1.031936646, 0.221984863, 0.151962280, 0.012420654, 0.026840210, -0.001266479, 0.001907349, 0.000106812 ], [ -0.000061035, /* 14 */ -0.001388550, 0.002700806, -0.021789551, 0.006134033, -0.143676758, -0.109161377, -0.935195923, 1.014617920, 0.198059082, 0.151306152, 0.008316040, 0.025909424, -0.001617432, 0.001785278, 0.000106812, -0.000061035, -0.001388550, 0.002700806, -0.021789551, 0.006134033, -0.143676758, -0.109161377, -0.935195923, 1.014617920, 0.198059082, 0.151306152, 0.008316040, 0.025909424, -0.001617432, 0.001785278, 0.000106812 ], [ -0.000076294, /* 15 */ -0.001480103, 0.002487183, -0.022857666, 0.002822876, -0.146255493, -0.130310059, -0.956481934, 0.996246338, 0.174789429, 0.150115967, 0.004394531, 0.024932861, -0.001937866, 0.001693726, 0.000091553, -0.000076294, -0.001480103, 0.002487183, -0.022857666, 0.002822876, -0.146255493, -0.130310059, -0.956481934, 0.996246338, 0.174789429, 0.150115967, 0.004394531, 0.024932861, -0.001937866, 0.001693726, 0.000091553 ], [ -0.000076294, /* 16 */ -0.001586914, 0.002227783, -0.023910522, -0.000686646, -0.148422241, -0.152206421, -0.976852417, 0.976852417, 0.152206421, 0.148422241, 0.000686646, 0.023910522, -0.002227783, 0.001586914, 0.000076294, -0.000076294, -0.001586914, 0.002227783, -0.023910522, -0.000686646, -0.148422241, -0.152206421, -0.976852417, 0.976852417, 0.152206421, 0.148422241, 0.000686646, 0.023910522, -0.002227783, 0.001586914, 0.000076294 ] ]; /* * perform full frequency PCM synthesis */ MP3Synth.prototype.full = function(frame, nch, ns) { var Dptr, hi, lo, ptr; for (var ch = 0; ch < nch; ++ch) { var sbsample = frame.sbsample[ch]; var filter = this.filter[ch]; var phase = this.phase; var pcm = this.pcm.samples[ch]; var pcm1Ptr = 0; var pcm2Ptr = 0; for (var s = 0; s < ns; ++s) { MP3Synth.dct32(sbsample[s], phase >> 1, filter[0][phase & 1], filter[1][phase & 1]); var pe = phase & ~1; var po = ((phase - 1) & 0xf) | 1; /* calculate 32 samples */ var fe = filter[0][ phase & 1]; var fx = filter[0][~phase & 1]; var fo = filter[1][~phase & 1]; var fePtr = 0; var fxPtr = 0; var foPtr = 0; Dptr = 0; ptr = D[Dptr]; _fx = fx[fxPtr]; _fe = fe[fePtr]; lo = _fx[0] * ptr[po + 0]; lo += _fx[1] * ptr[po + 14]; lo += _fx[2] * ptr[po + 12]; lo += _fx[3] * ptr[po + 10]; lo += _fx[4] * ptr[po + 8]; lo += _fx[5] * ptr[po + 6]; lo += _fx[6] * ptr[po + 4]; lo += _fx[7] * ptr[po + 2]; lo = -lo; lo += _fe[0] * ptr[pe + 0]; lo += _fe[1] * ptr[pe + 14]; lo += _fe[2] * ptr[pe + 12]; lo += _fe[3] * ptr[pe + 10]; lo += _fe[4] * ptr[pe + 8]; lo += _fe[5] * ptr[pe + 6]; lo += _fe[6] * ptr[pe + 4]; lo += _fe[7] * ptr[pe + 2]; pcm[pcm1Ptr++] = lo; pcm2Ptr = pcm1Ptr + 30; for (var sb = 1; sb < 16; ++sb) { ++fePtr; ++Dptr; /* D[32 - sb][i] === -D[sb][31 - i] */ ptr = D[Dptr]; _fo = fo[foPtr]; _fe = fe[fePtr]; lo = _fo[0] * ptr[po + 0]; lo += _fo[1] * ptr[po + 14]; lo += _fo[2] * ptr[po + 12]; lo += _fo[3] * ptr[po + 10]; lo += _fo[4] * ptr[po + 8]; lo += _fo[5] * ptr[po + 6]; lo += _fo[6] * ptr[po + 4]; lo += _fo[7] * ptr[po + 2]; lo = -lo; lo += _fe[7] * ptr[pe + 2]; lo += _fe[6] * ptr[pe + 4]; lo += _fe[5] * ptr[pe + 6]; lo += _fe[4] * ptr[pe + 8]; lo += _fe[3] * ptr[pe + 10]; lo += _fe[2] * ptr[pe + 12]; lo += _fe[1] * ptr[pe + 14]; lo += _fe[0] * ptr[pe + 0]; pcm[pcm1Ptr++] = lo; lo = _fe[0] * ptr[-pe + 31 - 16]; lo += _fe[1] * ptr[-pe + 31 - 14]; lo += _fe[2] * ptr[-pe + 31 - 12]; lo += _fe[3] * ptr[-pe + 31 - 10]; lo += _fe[4] * ptr[-pe + 31 - 8]; lo += _fe[5] * ptr[-pe + 31 - 6]; lo += _fe[6] * ptr[-pe + 31 - 4]; lo += _fe[7] * ptr[-pe + 31 - 2]; lo += _fo[7] * ptr[-po + 31 - 2]; lo += _fo[6] * ptr[-po + 31 - 4]; lo += _fo[5] * ptr[-po + 31 - 6]; lo += _fo[4] * ptr[-po + 31 - 8]; lo += _fo[3] * ptr[-po + 31 - 10]; lo += _fo[2] * ptr[-po + 31 - 12]; lo += _fo[1] * ptr[-po + 31 - 14]; lo += _fo[0] * ptr[-po + 31 - 16]; pcm[pcm2Ptr--] = lo; ++foPtr; } ++Dptr; ptr = D[Dptr]; _fo = fo[foPtr]; lo = _fo[0] * ptr[po + 0]; lo += _fo[1] * ptr[po + 14]; lo += _fo[2] * ptr[po + 12]; lo += _fo[3] * ptr[po + 10]; lo += _fo[4] * ptr[po + 8]; lo += _fo[5] * ptr[po + 6]; lo += _fo[6] * ptr[po + 4]; lo += _fo[7] * ptr[po + 2]; pcm[pcm1Ptr] = -lo; pcm1Ptr += 16; phase = (phase + 1) % 16; } } }; // TODO: synth.half() /* * NAME: synth.frame() * DESCRIPTION: perform PCM synthesis of frame subband samples */ MP3Synth.prototype.frame = function (frame) { var nch = frame.header.nchannels(); var ns = frame.header.nbsamples(); this.pcm.samplerate = frame.header.samplerate; this.pcm.channels = nch; this.pcm.length = 32 * ns; /* if (frame.options & Mad.Option.HALFSAMPLERATE) { this.pcm.samplerate /= 2; this.pcm.length /= 2; throw new Error("HALFSAMPLERATE is not supported. What do you think? As if I have the time for this"); } */ this.full(frame, nch, ns); this.phase = (this.phase + ns) % 16; }; module.exports = MP3Synth; },{"./utils":15}],14:[function(require,module,exports){ /* * These are the scalefactor values for Layer I and Layer II. * The values are from Table B.1 of ISO/IEC 11172-3. * * Strictly speaking, Table B.1 has only 63 entries (0-62), thus a strict * interpretation of ISO/IEC 11172-3 would suggest that a scalefactor index of * 63 is invalid. However, for better compatibility with current practices, we * add a 64th entry. */ exports.SF_TABLE = new Float32Array([ 2.000000000000, 1.587401051968, 1.259921049895, 1.000000000000, 0.793700525984, 0.629960524947, 0.500000000000, 0.396850262992, 0.314980262474, 0.250000000000, 0.198425131496, 0.157490131237, 0.125000000000, 0.099212565748, 0.078745065618, 0.062500000000, 0.049606282874, 0.039372532809, 0.031250000000, 0.024803141437, 0.019686266405, 0.015625000000, 0.012401570719, 0.009843133202, 0.007812500000, 0.006200785359, 0.004921566601, 0.003906250000, 0.003100392680, 0.002460783301, 0.001953125000, 0.001550196340, 0.001230391650, 0.000976562500, 0.000775098170, 0.000615195825, 0.000488281250, 0.000387549085, 0.000307597913, 0.000244140625, 0.000193774542, 0.000153798956, 0.000122070313, 0.000096887271, 0.000076899478, 0.000061035156, 0.000048443636, 0.000038449739, 0.000030517578, 0.000024221818, 0.000019224870, 0.000015258789, 0.000012110909, 0.000009612435, 0.000007629395, 0.000006055454, 0.000004806217, 0.000003814697, 0.000003027727, 0.000002403109, 0.000001907349, 0.000001513864, 0.000001201554, 0.000000000000 ]); /* * MPEG-1 scalefactor band widths * derived from Table B.8 of ISO/IEC 11172-3 */ const SFB_48000_LONG = new Uint8Array([ 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192 ]); const SFB_44100_LONG = new Uint8Array([ 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158 ]); const SFB_32000_LONG = new Uint8Array([ 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26 ]); const SFB_48000_SHORT = new Uint8Array([ 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 ]); const SFB_44100_SHORT = new Uint8Array([ 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 ]); const SFB_32000_SHORT = new Uint8Array([ 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 ]); const SFB_48000_MIXED = new Uint8Array([ /* long */ 4, 4, 4, 4, 4, 4, 6, 6, /* short */ 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 ]); const SFB_44100_MIXED = new Uint8Array([ /* long */ 4, 4, 4, 4, 4, 4, 6, 6, /* short */ 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 ]); const SFB_32000_MIXED = new Uint8Array([ /* long */ 4, 4, 4, 4, 4, 4, 6, 6, /* short */ 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 ]); /* * MPEG-2 scalefactor band widths * derived from Table B.2 of ISO/IEC 13818-3 */ const SFB_24000_LONG = new Uint8Array([ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 ]); const SFB_22050_LONG = new Uint8Array([ 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 ]); const SFB_16000_LONG = SFB_22050_LONG; const SFB_24000_SHORT = new Uint8Array([ 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 ]); const SFB_22050_SHORT = new Uint8Array([ 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 ]); const SFB_16000_SHORT = new Uint8Array([ 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 ]); const SFB_24000_MIXED = new Uint8Array([ /* long */ 6, 6, 6, 6, 6, 6, /* short */ 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 ]); const SFB_22050_MIXED = new Uint8Array([ /* long */ 6, 6, 6, 6, 6, 6, /* short */ 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 ]); const SFB_16000_MIXED = new Uint8Array([ /* long */ 6, 6, 6, 6, 6, 6, /* short */ 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 ]); /* * MPEG 2.5 scalefactor band widths * derived from public sources */ const SFB_12000_LONG = SFB_16000_LONG; const SFB_11025_LONG = SFB_12000_LONG; const SFB_8000_LONG = new Uint8Array([ 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 ]); const SFB_12000_SHORT = SFB_16000_SHORT; const SFB_11025_SHORT = SFB_12000_SHORT; const SFB_8000_SHORT = new Uint8Array([ 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 ]); const SFB_12000_MIXED = SFB_16000_MIXED; const SFB_11025_MIXED = SFB_12000_MIXED; /* the 8000 Hz short block scalefactor bands do not break after the first 36 frequency lines, so this is probably wrong */ const SFB_8000_MIXED = new Uint8Array([ /* long */ 12, 12, 12, /* short */ 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 ]); exports.SFBWIDTH_TABLE = [ { l: SFB_48000_LONG, s: SFB_48000_SHORT, m: SFB_48000_MIXED }, { l: SFB_44100_LONG, s: SFB_44100_SHORT, m: SFB_44100_MIXED }, { l: SFB_32000_LONG, s: SFB_32000_SHORT, m: SFB_32000_MIXED }, { l: SFB_24000_LONG, s: SFB_24000_SHORT, m: SFB_24000_MIXED }, { l: SFB_22050_LONG, s: SFB_22050_SHORT, m: SFB_22050_MIXED }, { l: SFB_16000_LONG, s: SFB_16000_SHORT, m: SFB_16000_MIXED }, { l: SFB_12000_LONG, s: SFB_12000_SHORT, m: SFB_12000_MIXED }, { l: SFB_11025_LONG, s: SFB_11025_SHORT, m: SFB_11025_MIXED }, { l: SFB_8000_LONG, s: SFB_8000_SHORT, m: SFB_8000_MIXED } ]; exports.PRETAB = new Uint8Array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 ]); /* * fractional powers of two * used for requantization and joint stereo decoding * * ROOT_TABLE[3 + x] = 2^(x/4) */ exports.ROOT_TABLE = new Float32Array([ /* 2^(-3/4) */ 0.59460355750136, /* 2^(-2/4) */ 0.70710678118655, /* 2^(-1/4) */ 0.84089641525371, /* 2^( 0/4) */ 1.00000000000000, /* 2^(+1/4) */ 1.18920711500272, /* 2^(+2/4) */ 1.41421356237310, /* 2^(+3/4) */ 1.68179283050743 ]); exports.CS = new Float32Array([ +0.857492926 , +0.881741997, +0.949628649 , +0.983314592, +0.995517816 , +0.999160558, +0.999899195 , +0.999993155 ]); exports.CA = new Float32Array([ -0.514495755, -0.471731969, -0.313377454, -0.181913200, -0.094574193, -0.040965583, -0.014198569, -0.003699975 ]); exports.COUNT1TABLE_SELECT = 0x01; exports.SCALEFAC_SCALE = 0x02; exports.PREFLAG = 0x04; exports.MIXED_BLOCK_FLAG = 0x08; exports.I_STEREO = 0x1; exports.MS_STEREO = 0x2; /* * windowing coefficients for long blocks * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 * * WINDOW_L[i] = sin((PI / 36) * (i + 1/2)) */ exports.WINDOW_L = new Float32Array([ 0.043619387, 0.130526192, 0.216439614, 0.300705800, 0.382683432, 0.461748613, 0.537299608, 0.608761429, 0.675590208, 0.737277337, 0.793353340, 0.843391446, 0.887010833, 0.923879533, 0.953716951, 0.976296007, 0.991444861, 0.999048222, 0.999048222, 0.991444861, 0.976296007, 0.953716951, 0.923879533, 0.887010833, 0.843391446, 0.793353340, 0.737277337, 0.675590208, 0.608761429, 0.537299608, 0.461748613, 0.382683432, 0.300705800, 0.216439614, 0.130526192, 0.043619387 ]); /* * windowing coefficients for short blocks * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 * * WINDOW_S[i] = sin((PI / 12) * (i + 1/2)) */ exports.WINDOW_S = new Float32Array([ 0.130526192, 0.382683432, 0.608761429, 0.793353340, 0.923879533, 0.991444861, 0.991444861, 0.923879533, 0.793353340, 0.608761429, 0.382683432, 0.130526192 ]); /* * coefficients for intensity stereo processing * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 * * is_ratio[i] = tan(i * (PI / 12)) * IS_TABLE[i] = is_ratio[i] / (1 + is_ratio[i]) */ exports.IS_TABLE = new Float32Array([ 0.000000000, 0.211324865, 0.366025404, 0.500000000, 0.633974596, 0.788675135, 1.000000000 ]); /* * coefficients for LSF intensity stereo processing * derived from section 2.4.3.2 of ISO/IEC 13818-3 * * IS_LSF_TABLE[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) * IS_LSF_TABLE[1][i] = (1 / sqrt(2)) ^(i + 1) */ exports.IS_LSF_TABLE = [ new Float32Array([ 0.840896415, 0.707106781, 0.594603558, 0.500000000, 0.420448208, 0.353553391, 0.297301779, 0.250000000, 0.210224104, 0.176776695, 0.148650889, 0.125000000, 0.105112052, 0.088388348, 0.074325445 ]), new Float32Array([ 0.707106781, 0.500000000, 0.353553391, 0.250000000, 0.176776695, 0.125000000, 0.088388348, 0.062500000, 0.044194174, 0.031250000, 0.022097087, 0.015625000, 0.011048543, 0.007812500, 0.005524272 ]) ]; /* * scalefactor bit lengths * derived from section 2.4.2.7 of ISO/IEC 11172-3 */ exports.SFLEN_TABLE = [ { slen1: 0, slen2: 0 }, { slen1: 0, slen2: 1 }, { slen1: 0, slen2: 2 }, { slen1: 0, slen2: 3 }, { slen1: 3, slen2: 0 }, { slen1: 1, slen2: 1 }, { slen1: 1, slen2: 2 }, { slen1: 1, slen2: 3 }, { slen1: 2, slen2: 1 }, { slen1: 2, slen2: 2 }, { slen1: 2, slen2: 3 }, { slen1: 3, slen2: 1 }, { slen1: 3, slen2: 2 }, { slen1: 3, slen2: 3 }, { slen1: 4, slen2: 2 }, { slen1: 4, slen2: 3 } ]; /* * number of LSF scalefactor band values * derived from section 2.4.3.2 of ISO/IEC 13818-3 */ exports.NSFB_TABLE = [ [ [ 6, 5, 5, 5 ], [ 9, 9, 9, 9 ], [ 6, 9, 9, 9 ] ], [ [ 6, 5, 7, 3 ], [ 9, 9, 12, 6 ], [ 6, 9, 12, 6 ] ], [ [ 11, 10, 0, 0 ], [ 18, 18, 0, 0 ], [ 15, 18, 0, 0 ] ], [ [ 7, 7, 7, 0 ], [ 12, 12, 12, 0 ], [ 6, 15, 12, 0 ] ], [ [ 6, 6, 6, 3 ], [ 12, 9, 9, 6 ], [ 6, 12, 9, 6 ] ], [ [ 8, 8, 5, 0 ], [ 15, 12, 9, 0 ], [ 6, 18, 9, 0 ] ] ]; },{}],15:[function(require,module,exports){ /** * Makes a multidimensional array */ exports.makeArray = function(lengths, Type) { if (!Type) Type = Float64Array; if (lengths.length === 1) { return new Type(lengths[0]); } var ret = [], len = lengths[0]; for (var j = 0; j < len; j++) { ret[j] = exports.makeArray(lengths.slice(1), Type); } return ret; }; },{}]},{},[1]) //# sourceMappingURL=mp3.js.map