From e690d67b8069615295a6d117bf7792f4c1658289 Mon Sep 17 00:00:00 2001 From: blue Date: Thu, 24 Jan 2019 22:54:16 +0300 Subject: [PATCH] Decoding with my own translation of libmad, loading and playback progress, next and prev songs --- lib/wModel/file/audio.cpp | 35 +- lib/wModel/file/audio.h | 5 - lib/wModel/file/file.cpp | 22 +- lib/wModel/file/file.h | 1 + libjs/wController/file/audio.js | 73 +- libjs/wController/file/file.js | 57 +- libjs/wController/player.js | 104 +- libjs/wType/blob.js | 30 + lorgar/lib/CMakeLists.txt | 3 +- lorgar/lib/aurora/CMakeLists.txt | 3 - lorgar/lib/aurora/aurora.js | 3938 --------------- lorgar/lib/em/CMakeLists.txt | 4 + lorgar/lib/em/wrapper.js | 4 + lorgar/lib/em/wrapper.wasm | Bin 0 -> 256902 bytes lorgar/lib/mp3/CMakeLists.txt | 3 - lorgar/lib/mp3/mp3.js | 7706 ------------------------------ lorgar/main.js | 10 +- lorgar/views/CMakeLists.txt | 1 + lorgar/views/player.js | 9 +- lorgar/views/songProgress.js | 76 + magnus/app.js | 2 + 21 files changed, 290 insertions(+), 11796 deletions(-) delete mode 100644 lorgar/lib/aurora/CMakeLists.txt delete mode 100644 lorgar/lib/aurora/aurora.js create mode 100644 lorgar/lib/em/CMakeLists.txt create mode 100644 lorgar/lib/em/wrapper.js create mode 100644 lorgar/lib/em/wrapper.wasm delete mode 100644 lorgar/lib/mp3/CMakeLists.txt delete mode 100644 lorgar/lib/mp3/mp3.js create mode 100644 lorgar/views/songProgress.js diff --git a/lib/wModel/file/audio.cpp b/lib/wModel/file/audio.cpp index 6a0987f..a46d754 100644 --- a/lib/wModel/file/audio.cpp +++ b/lib/wModel/file/audio.cpp @@ -3,12 +3,8 @@ #include M::Audio::Audio(W::Blob* p_file, const W::Address& addr, QObject* parent): - File(p_file, addr, parent), - frames() + File(p_file, addr, parent) { - W::Handler* requestFrames = W::Handler::create(address + W::Address({u"requestFrames"}), this, &M::Audio::_h_requestFrames); - - addHandler(requestFrames); } M::Audio::~Audio() @@ -32,41 +28,18 @@ void M::Audio::initAdditional(const W::String& p_mime) uint64_t length = 0; uint64_t tBits = 0; + uint64_t amount = 0; while(stream.error != MAD_ERROR_BUFLEN) { //TODO handle other errors; int success = mad_header_decode(&header, &stream); if (success == 0) { - frames.emplace_back(stream.this_frame - stream.buffer, stream.next_frame - stream.this_frame); + amount++; length += header.duration.seconds * MAD_TIMER_RESOLUTION + header.duration.fraction; tBits += header.bitrate; } } additional.insert(u"duration", new W::Uint64(length / MAD_TIMER_RESOLUTION)); - additional.insert(u"bitrate", new W::Uint64(tBits / frames.size())); - additional.insert(u"framesAmount", new W::Uint64(frames.size())); -} - -void M::Audio::h_requestFrames(const W::Event& ev) -{ - const W::Vocabulary& vc = static_cast(ev.getData()); - const W::Uint64& index = static_cast(vc.at(u"index")); - const W::Uint64& amount = static_cast(vc.at(u"amount")); - - W::Vocabulary* evc = new W::Vocabulary(); - if (index + amount > frames.size()) { - evc->insert(u"result", new W::Uint64(1)); - } else { - evc->insert(u"result", new W::Uint64(0)); - W::Vector* vframes = new W::Vector(); - for (int i = 0; i < amount; ++i) { - const std::pair& pair = frames[index + i]; //TODO optimize? - vframes->push(file->slice(pair.first, pair.second)); - } - - evc->insert(u"frames", vframes); - } - - response(evc, W::Address{u"responseFrames"}, ev); + additional.insert(u"bitrate", new W::Uint64(tBits / amount)); } diff --git a/lib/wModel/file/audio.h b/lib/wModel/file/audio.h index 070e31c..805e0eb 100644 --- a/lib/wModel/file/audio.h +++ b/lib/wModel/file/audio.h @@ -24,11 +24,6 @@ namespace M { protected: void initAdditional(const W::String& p_mime) override; - - handler(requestFrames); - - private: - std::deque> frames; }; } diff --git a/lib/wModel/file/file.cpp b/lib/wModel/file/file.cpp index 5efa9bd..e28caf4 100644 --- a/lib/wModel/file/file.cpp +++ b/lib/wModel/file/file.cpp @@ -16,9 +16,11 @@ M::File::File(W::Blob* p_file, const W::Address& addr, QObject* parent): { W::Handler* get = W::Handler::create(address + W::Address({u"get"}), this, &M::File::_h_get); W::Handler* getAdditional = W::Handler::create(address + W::Address({u"getAdditional"}), this, &M::File::_h_getAdditional); + W::Handler* getSlice = W::Handler::create(address + W::Address({u"getSlice"}), this, &M::File::_h_getSlice); addHandler(get); addHandler(getAdditional); + addHandler(getSlice); } M::File::~File() @@ -35,7 +37,7 @@ void M::File::initAdditional(const W::String& p_mime) { additional.clear(); - additional.insert(u"size", new W::Uint64(file->size())); + additional.insert(u"size", new W::Uint64(file->length())); additional.insert(u"mimeType", p_mime); } @@ -106,3 +108,21 @@ M::File * M::File::create(W::Blob* blob, const W::Address& addr, QObject* parent out->initAdditional(W::String(mime.toStdString())); return out; } + +void M::File::h_getSlice(const W::Event& ev) +{ + const W::Vocabulary& vc = static_cast(ev.getData()); + const W::Uint64& begin = static_cast(vc.at(u"begin")); + const W::Uint64& size = static_cast(vc.at(u"size")); + + W::Vocabulary* evc = new W::Vocabulary(); + if (begin > file->length() || begin + size > file->length()) { + evc->insert(u"result", new W::Uint64(1)); + } else { + evc->insert(u"result", new W::Uint64(0)); + evc->insert(u"slice", file->slice(begin, size)); + } + + response(evc, W::Address{u"getSlice"}, ev); +} + diff --git a/lib/wModel/file/file.h b/lib/wModel/file/file.h index 8c50440..5eeab4e 100644 --- a/lib/wModel/file/file.h +++ b/lib/wModel/file/file.h @@ -32,6 +32,7 @@ namespace M { handler(get); handler(getAdditional); + handler(getSlice); protected: W::Vocabulary additional; diff --git a/libjs/wController/file/audio.js b/libjs/wController/file/audio.js index deb316c..9d8474e 100644 --- a/libjs/wController/file/audio.js +++ b/libjs/wController/file/audio.js @@ -9,79 +9,16 @@ var Audio = File.inherit({ className: "Audio", constructor: function Audio(addr) { File.fn.constructor.call(this, addr); - - this._loadedFrames = 0; - this._totalFrames = 0; - this._waitingForFrames = false; - this._frames = new Vector(); - - this.addHandler("responseFrames"); - }, - destructor: function() { - this._frames.destructor(); - - File.fn.destructor.call(this); }, hasMore: function() { - return this._totalFrames > this._loadedFrames; + return this.getSize() > this.data.length(); }, - _getAdditional: function(add) { - var ac = File.fn._getAdditional.call(this, add); - - if (ac) { - this._loadedFrames = 0; - this._totalFrames = this._additional.at("framesAmount").valueOf(); - this._waitingForFrames = false; - } - - return ac; + getBitrate: function() { + return this._additional.at("bitrate").valueOf(); }, - _h_responseFrames: function(ev) { - if (this._waitingForFrames === true) { - var data = ev.getData(); - - var success = data.at("result").valueOf(); - if (success === 0) { - var frames = data.at("frames"); - var amount = frames.length(); - var buffer = new ArrayBuffer(0); - - for (var i = 0; i < amount; ++i) { - var blob = frames.at(i).clone(); - this._frames.push(blob); - var frame = blob.valueOf(); - - var newArr = new Uint8Array(buffer.byteLength + frame.byteLength); - newArr.set(new Uint8Array(buffer), 0); - newArr.set(new Uint8Array(frame), buffer.byteLength); - buffer = newArr.buffer; - } - - - this._loadedFrames += amount; - this._waitingForFrames = false; - this.trigger("newFrames", buffer); - } - } - }, - requestMore: function() { - if (!this._waitingForFrames) { - if (this._registered && this._subscribed) { - var allowed = this._totalFrames - this._loadedFrames; - - if (allowed > 0) { - var vc = new Vocabulary(); - vc.insert("index", new Uint64(this._loadedFrames)); - vc.insert("amount", new Uint64(Math.min(framePortion, allowed))); - - this.send(vc, "requestFrames"); - this._waitingForFrames = true; - } - } - } + getDuration: function() { + return this._additional.at("duration").valueOf(); } }); -var framePortion = 10; - module.exports = Audio; diff --git a/libjs/wController/file/file.js b/libjs/wController/file/file.js index f220558..57e9941 100644 --- a/libjs/wController/file/file.js +++ b/libjs/wController/file/file.js @@ -2,6 +2,8 @@ var Controller = require("../controller"); var WVocabulary = require("../../wType/vocabulary"); +var Uint64 = require("../../wType/uint64"); +var Blob = require("../../wType/blob"); var File = Controller.inherit({ "className": "File", @@ -10,17 +12,17 @@ var File = Controller.inherit({ this._hasData = false; this._hasAdditional = false; - this.data = null; + this.data = new Blob(); this._additional = null; + this._waitingForSlice = false; this._need = 0; this.addHandler("get"); this.addHandler("getAdditional"); + this.addHandler("getSlice"); }, "destructor": function() { - if (this._hasData) { - this.data.destructor(); - } + this.data.destructor(); if (this._hasAdditional) { this._additional.destructor(); } @@ -46,6 +48,9 @@ var File = Controller.inherit({ "getMimeType": function() { return this._additional.at("mimeType").toString(); }, + "getSize": function() { + return this._additional.at("size").valueOf(); + }, "_h_get": function(ev) { var dt = ev.getData(); @@ -55,7 +60,9 @@ var File = Controller.inherit({ } this._hasData = true; + var oldData = this.data; this.data = dt.at("data").clone(); + oldData.destructor(); this.trigger("data"); }, "_h_getAdditional": function(ev) { @@ -69,6 +76,24 @@ var File = Controller.inherit({ this.trigger("ready"); } }, + "_h_getSlice": function(ev) { + if (this._waitingForSlice) { + this._waitingForSlice = false; + var vc = ev.getData(); + if (vc.at("result").valueOf() == 0) { + var slice = vc.at("slice"); + this.data["+="](slice); + this.trigger("slice", slice); + + if (this.getSize() === this.data.length()) { + this._hasData = true; + this.trigger("data"); + } + } else { + this.trigger("serviceMessage", "Error receiving slice from " + this._pairAddress.toString(), 1); + } + } + }, "needData": function() { if (this._need === 0) { var vc = new WVocabulary(); @@ -77,6 +102,30 @@ var File = Controller.inherit({ } ++this._need; }, + "requestSlice": function(size) { + if (this._hasAdditional) { + if (this._waitingForSlice) { + throw new Error("An attempt to request a slice of data from " + this._pairAddress.toString() + " while another request is in progress"); + } + var begin = this.data.length(); + var newSize = Math.min(size, this.getSize() - begin); + if (newSize !== size) { + //TODO may be inform the developer about that? + } + if (newSize === 0) { + return; //TODO may be inform the developer about that? + } + var vc = new WVocabulary(); + vc.insert("begin", new Uint64(begin)); + vc.insert("size", new Uint64(newSize)); + + this.send(vc, "getSlice"); + this._waitingForSlice = true; + + } else { + throw new Error("An attempt to request a slice of data from " + this._pairAddress.toString() + " before controller got initialized"); + } + }, "subscribe": function() { Controller.fn.subscribe.call(this); diff --git a/libjs/wController/player.js b/libjs/wController/player.js index 10b8aa7..e434890 100644 --- a/libjs/wController/player.js +++ b/libjs/wController/player.js @@ -8,16 +8,11 @@ var Button = require("./button"); var ImageById = require("./imageById"); var Vocabulary = require("./vocabulary"); var Audio = require("./file/audio"); +var Model = require("./localModel"); var Enum = require("../utils/enum"); var StateMachine = require("../utils/stateMachine"); -var Source = AV.EventEmitter.extend(function() { - this.prototype.start = function(){} - this.prototype.pause = function(){} - this.prototype.reset = function(){} -}); - var Player = Controller.inherit({ className: "Player", constructor: function(addr) { @@ -26,6 +21,7 @@ var Player = Controller.inherit({ this.controls = Object.create(null); this.views = Object.create(null); this.mode = PlayerMode.straight.playback; + this.progress = new ProgressModel(); this._audio = null; this._createStateMachine(); this._createPlayingInfrastructure(); @@ -34,10 +30,14 @@ var Player = Controller.inherit({ this.addHandler("viewsChange"); this.addHandler("play"); this.addHandler("pause"); + + this._playbackInterval = setInterval(this._onInterval.bind(this), 250); }, destructor: function() { + this._clearInterval(this._playbackInterval); + this._destroyPlayingInfrastructure(); this._fsm.destructor(); - this._player.stop(); + this.progress.destructor(); Controller.fn.destructor.call(this); }, @@ -109,15 +109,16 @@ var Player = Controller.inherit({ this.trigger("newElement", ctrl, t); } }, - _createPlayingInfrastructure() { - if (this._source) { - this._source.reset(); - this._asset.stop(); - this._player.stop(); - } - this._source = new Source(); - this._asset = new AV.Asset(this._source); - this._player = new AV.Player(this._asset); + _createPlayingInfrastructure: function() { + this._ctx = new AudioContext(); + this._decoder = new Mp3Decoder(); + this._currentTime = 0; + + this._ctx.suspend(); + }, + _destroyPlayingInfrastructure: function() { + this._ctx.close(); + this._decoder.delete(); }, _createStateMachine: function() { this._fsm = new StateMachine("initial", graphs[this.mode]); @@ -177,13 +178,28 @@ var Player = Controller.inherit({ this._addView(vc.at("type"), vc.at("address")); } }, - _onAudioNewFrames: function(frames) { - var data = new Uint8Array(frames); - this._source.emit("data", new AV.Buffer(data)); + _onAudioNewSlice: function(frames) { + var arr = new Uint8Array(frames.valueOf()); + this._decoder.addFragment(arr); + + while (this._decoder.hasMore()) { + var sb = this._decoder.decode(9999); + if (sb === undefined) { + break; + } else { + var src = this._ctx.createBufferSource(); + src.buffer = sb; + src.connect(this._ctx.destination); + src.start(this._currentTime); + this._currentTime += sb.duration; + } + } + + this.progress.setLoad(this._currentTime / this._audio.getDuration()); this._fsm.manipulation("newFrames"); if (this._audio.hasMore()) { - this._audio.requestMore(); + this._audio.requestSlice(audioPortion); } else { this._fsm.manipulation("noMoreFrames"); } @@ -191,6 +207,11 @@ var Player = Controller.inherit({ _onControllerReady: function() { this._fsm.manipulation("controllerReady"); }, + _onInterval: function() { + if (this._audio && this._audio.initialized) { + this.progress.setPlayback(this._ctx.currentTime / this._audio.getDuration()); + } + }, _onNewPlayBackElement: function(key, element) { switch (key) { case "image": @@ -202,7 +223,7 @@ var Player = Controller.inherit({ if (this.mode === PlayerMode.straight.playback) { this._audio = new Audio(new Address(["music", element.toString()])); this.addForeignController("Corax", this._audio); - this._audio.on("newFrames", this._onAudioNewFrames, this); + this._audio.on("slice", this._onAudioNewSlice, this); this._audio.on("ready", this._onControllerReady, this); this._fsm.manipulation("controller"); } @@ -228,16 +249,18 @@ var Player = Controller.inherit({ this.removeForeignController(this._audio); this._audio.destructor(); this._audio = null; + this._destroyPlayingInfrastructure(); this._createPlayingInfrastructure(); } break; case "initialPlaying": if (e.manipulation === "noController") { - this._player.pause(); + this._ctx.suspend(); this.removeForeignController(this._audio); this.audio.destructor(); this._audio = null; + this._destroyPlayingInfrastructure(); this._createPlayingInfrastructure(); } break; @@ -249,9 +272,9 @@ var Player = Controller.inherit({ break; case "hasControllerPlaying": if (this._audio.hasMore()) { - this._audio.requestMore(); + this._audio.requestSlice(audioPortion); - this._player.play(); //todo temporal + this._ctx.resume(); //todo temporal } else { this._fsm.manipulation("noMoreFrames"); } @@ -259,24 +282,24 @@ var Player = Controller.inherit({ case "paused": switch (e.oldState) { case "playing": - this._player.pause(); + this._ctx.suspend(); break; } break; case "pausedAllLoaded": switch (e.oldState) { case "playingAllLoaded": - this._player.pause(); + this._ctx.suspend(); break; } break; case "playing": - this._player.play(); + this._ctx.resume(); break; case "playingAllLoaded": switch (e.oldState) { case "pausedAllLoaded": - this._player.play(); + this._ctx.resume(); break; } break; @@ -371,4 +394,29 @@ graphs[PlayerMode.straight.playback] = { } } +var audioPortion = 1024 * 50; + +var ProgressModel = Model.inherit({ + className: "ProgressModel", + constructor: function(properties) { + Model.fn.constructor.call(this, properties); + + this.load = 0; + this.playback = 0; + this.initialized = true; + }, + setLoad: function(l) { + if (l !== this.load) { + this.load = l; + this.trigger("load", l); + } + }, + setPlayback: function(p) { + if (p !== this.playback) { + this.playback = p; + this.trigger("playback", p); + } + } +}); + module.exports = Player; diff --git a/libjs/wType/blob.js b/libjs/wType/blob.js index 3aa38de..5a33d19 100644 --- a/libjs/wType/blob.js +++ b/libjs/wType/blob.js @@ -17,6 +17,36 @@ var Blob = Object.inherit({ return this.size() == other.size(); //TODO let's pretend one shall never wish to compare blobs) }, + "+=": function(other) { + if (this.getType() !== other.getType()) { + throw new Error("An attempt to add and assign an " + other.className + " to " + this.className); + } + + var newData = new ArrayBuffer(this._data.byteLength + other._data.byteLength); + var newView = new Uint8Array(newData); + var thisView = new Uint8Array(this._data); + var otherView = new Uint8Array(other._data); + + newView.set(thisView, 0); + newView.set(otherView, this._data.byteLength); + + this._data = newData; + }, + "+": function(other) { + if (this.getType() !== other.getType()) { + throw new Error("An attempt to add an " + other.className + " to " + this.className); + } + + var newData = new ArrayBuffer(this._data.byteLength + other._data.byteLength); + var newView = new Uint8Array(newData); + var thisView = new Uint8Array(this._data); + var otherView = new Uint8Array(other._data); + + newView.set(thisView, 0); + newView.set(otherView, this._data.byteLength); + + return new Blob(newData); + }, "base64": function() { var arr = new Uint8Array(this._data); var bin = ""; diff --git a/lorgar/lib/CMakeLists.txt b/lorgar/lib/CMakeLists.txt index 41d77e0..9e87652 100644 --- a/lorgar/lib/CMakeLists.txt +++ b/lorgar/lib/CMakeLists.txt @@ -3,8 +3,6 @@ cmake_minimum_required(VERSION 2.8.12) add_subdirectory(requirejs) add_subdirectory(wSocket) add_subdirectory(bintrees) -add_subdirectory(mp3) -add_subdirectory(aurora) add_subdirectory(wContainer) add_subdirectory(utils) add_subdirectory(wType) @@ -12,3 +10,4 @@ add_subdirectory(wDispatcher) add_subdirectory(wTest) add_subdirectory(wController) add_subdirectory(fonts) +add_subdirectory(em) diff --git a/lorgar/lib/aurora/CMakeLists.txt b/lorgar/lib/aurora/CMakeLists.txt deleted file mode 100644 index b286c2e..0000000 --- a/lorgar/lib/aurora/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) - -configure_file(aurora.js aurora.js) diff --git a/lorgar/lib/aurora/aurora.js b/lorgar/lib/aurora/aurora.js deleted file mode 100644 index fd356b2..0000000 --- a/lorgar/lib/aurora/aurora.js +++ /dev/null @@ -1,3938 +0,0 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.AV=e()}}(function(){var define,module,exports;return (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> 3); - return this.bitPosition = pos & 7; - }; - - Bitstream.prototype.rewind = function(bits) { - var pos; - pos = this.bitPosition - bits; - this.stream.rewind(Math.abs(pos >> 3)); - return this.bitPosition = pos & 7; - }; - - Bitstream.prototype.seek = function(offset) { - var curOffset; - curOffset = this.offset(); - if (offset > curOffset) { - return this.advance(offset - curOffset); - } else if (offset < curOffset) { - return this.rewind(curOffset - offset); - } - }; - - Bitstream.prototype.align = function() { - if (this.bitPosition !== 0) { - this.bitPosition = 0; - return this.stream.advance(1); - } - }; - - Bitstream.prototype.read = function(bits, signed) { - var a, a0, a1, a2, a3, a4, mBits; - if (bits === 0) { - return 0; - } - mBits = bits + this.bitPosition; - if (mBits <= 8) { - a = ((this.stream.peekUInt8() << this.bitPosition) & 0xff) >>> (8 - bits); - } else if (mBits <= 16) { - a = ((this.stream.peekUInt16() << this.bitPosition) & 0xffff) >>> (16 - bits); - } else if (mBits <= 24) { - a = ((this.stream.peekUInt24() << this.bitPosition) & 0xffffff) >>> (24 - bits); - } else if (mBits <= 32) { - a = (this.stream.peekUInt32() << this.bitPosition) >>> (32 - bits); - } else if (mBits <= 40) { - a0 = this.stream.peekUInt8(0) * 0x0100000000; - a1 = this.stream.peekUInt8(1) << 24 >>> 0; - a2 = this.stream.peekUInt8(2) << 16; - a3 = this.stream.peekUInt8(3) << 8; - a4 = this.stream.peekUInt8(4); - a = a0 + a1 + a2 + a3 + a4; - a %= Math.pow(2, 40 - this.bitPosition); - a = Math.floor(a / Math.pow(2, 40 - this.bitPosition - bits)); - } else { - throw new Error("Too many bits!"); - } - if (signed) { - if (mBits < 32) { - if (a >>> (bits - 1)) { - a = ((1 << bits >>> 0) - a) * -1; - } - } else { - if (a / Math.pow(2, bits - 1) | 0) { - a = (Math.pow(2, bits) - a) * -1; - } - } - } - this.advance(bits); - return a; - }; - - Bitstream.prototype.peek = function(bits, signed) { - var a, a0, a1, a2, a3, a4, mBits; - if (bits === 0) { - return 0; - } - mBits = bits + this.bitPosition; - if (mBits <= 8) { - a = ((this.stream.peekUInt8() << this.bitPosition) & 0xff) >>> (8 - bits); - } else if (mBits <= 16) { - a = ((this.stream.peekUInt16() << this.bitPosition) & 0xffff) >>> (16 - bits); - } else if (mBits <= 24) { - a = ((this.stream.peekUInt24() << this.bitPosition) & 0xffffff) >>> (24 - bits); - } else if (mBits <= 32) { - a = (this.stream.peekUInt32() << this.bitPosition) >>> (32 - bits); - } else if (mBits <= 40) { - a0 = this.stream.peekUInt8(0) * 0x0100000000; - a1 = this.stream.peekUInt8(1) << 24 >>> 0; - a2 = this.stream.peekUInt8(2) << 16; - a3 = this.stream.peekUInt8(3) << 8; - a4 = this.stream.peekUInt8(4); - a = a0 + a1 + a2 + a3 + a4; - a %= Math.pow(2, 40 - this.bitPosition); - a = Math.floor(a / Math.pow(2, 40 - this.bitPosition - bits)); - } else { - throw new Error("Too many bits!"); - } - if (signed) { - if (mBits < 32) { - if (a >>> (bits - 1)) { - a = ((1 << bits >>> 0) - a) * -1; - } - } else { - if (a / Math.pow(2, bits - 1) | 0) { - a = (Math.pow(2, bits) - a) * -1; - } - } - } - return a; - }; - - Bitstream.prototype.readLSB = function(bits, signed) { - var a, mBits; - if (bits === 0) { - return 0; - } - if (bits > 40) { - throw new Error("Too many bits!"); - } - mBits = bits + this.bitPosition; - a = (this.stream.peekUInt8(0)) >>> this.bitPosition; - if (mBits > 8) { - a |= (this.stream.peekUInt8(1)) << (8 - this.bitPosition); - } - if (mBits > 16) { - a |= (this.stream.peekUInt8(2)) << (16 - this.bitPosition); - } - if (mBits > 24) { - a += (this.stream.peekUInt8(3)) << (24 - this.bitPosition) >>> 0; - } - if (mBits > 32) { - a += (this.stream.peekUInt8(4)) * Math.pow(2, 32 - this.bitPosition); - } - if (mBits >= 32) { - a %= Math.pow(2, bits); - } else { - a &= (1 << bits) - 1; - } - if (signed) { - if (mBits < 32) { - if (a >>> (bits - 1)) { - a = ((1 << bits >>> 0) - a) * -1; - } - } else { - if (a / Math.pow(2, bits - 1) | 0) { - a = (Math.pow(2, bits) - a) * -1; - } - } - } - this.advance(bits); - return a; - }; - - Bitstream.prototype.peekLSB = function(bits, signed) { - var a, mBits; - if (bits === 0) { - return 0; - } - if (bits > 40) { - throw new Error("Too many bits!"); - } - mBits = bits + this.bitPosition; - a = (this.stream.peekUInt8(0)) >>> this.bitPosition; - if (mBits > 8) { - a |= (this.stream.peekUInt8(1)) << (8 - this.bitPosition); - } - if (mBits > 16) { - a |= (this.stream.peekUInt8(2)) << (16 - this.bitPosition); - } - if (mBits > 24) { - a += (this.stream.peekUInt8(3)) << (24 - this.bitPosition) >>> 0; - } - if (mBits > 32) { - a += (this.stream.peekUInt8(4)) * Math.pow(2, 32 - this.bitPosition); - } - if (mBits >= 32) { - a %= Math.pow(2, bits); - } else { - a &= (1 << bits) - 1; - } - if (signed) { - if (mBits < 32) { - if (a >>> (bits - 1)) { - a = ((1 << bits >>> 0) - a) * -1; - } - } else { - if (a / Math.pow(2, bits - 1) | 0) { - a = (Math.pow(2, bits) - a) * -1; - } - } - } - return a; - }; - - return Bitstream; - -})(); - -module.exports = Bitstream; - - -},{}],7:[function(_dereq_,module,exports){ -(function (global){ -var AVBuffer; - -AVBuffer = (function() { - var BlobBuilder, URL; - - function AVBuffer(input) { - var _ref; - if (input instanceof Uint8Array) { - this.data = input; - } else if (input instanceof ArrayBuffer || Array.isArray(input) || typeof input === 'number' || ((_ref = global.Buffer) != null ? _ref.isBuffer(input) : void 0)) { - this.data = new Uint8Array(input); - } else if (input.buffer instanceof ArrayBuffer) { - this.data = new Uint8Array(input.buffer, input.byteOffset, input.length * input.BYTES_PER_ELEMENT); - } else if (input instanceof AVBuffer) { - this.data = input.data; - } else { - throw new Error("Constructing buffer with unknown type."); - } - this.length = this.data.length; - this.next = null; - this.prev = null; - } - - AVBuffer.allocate = function(size) { - return new AVBuffer(size); - }; - - AVBuffer.prototype.copy = function() { - return new AVBuffer(new Uint8Array(this.data)); - }; - - AVBuffer.prototype.slice = function(position, length) { - if (length == null) { - length = this.length; - } - if (position === 0 && length >= this.length) { - return new AVBuffer(this.data); - } else { - return new AVBuffer(this.data.subarray(position, position + length)); - } - }; - - BlobBuilder = global.BlobBuilder || global.MozBlobBuilder || global.WebKitBlobBuilder; - - URL = global.URL || global.webkitURL || global.mozURL; - - AVBuffer.makeBlob = function(data, type) { - var bb; - if (type == null) { - type = 'application/octet-stream'; - } - try { - return new Blob([data], { - type: type - }); - } catch (_error) {} - if (BlobBuilder != null) { - bb = new BlobBuilder; - bb.append(data); - return bb.getBlob(type); - } - return null; - }; - - AVBuffer.makeBlobURL = function(data, type) { - return URL != null ? URL.createObjectURL(this.makeBlob(data, type)) : void 0; - }; - - AVBuffer.revokeBlobURL = function(url) { - return URL != null ? URL.revokeObjectURL(url) : void 0; - }; - - AVBuffer.prototype.toBlob = function() { - return AVBuffer.makeBlob(this.data.buffer); - }; - - AVBuffer.prototype.toBlobURL = function() { - return AVBuffer.makeBlobURL(this.data.buffer); - }; - - return AVBuffer; - -})(); - -module.exports = AVBuffer; - - -}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],8:[function(_dereq_,module,exports){ -var BufferList; - -BufferList = (function() { - function BufferList() { - this.first = null; - this.last = null; - this.numBuffers = 0; - this.availableBytes = 0; - this.availableBuffers = 0; - } - - BufferList.prototype.copy = function() { - var result; - result = new BufferList; - result.first = this.first; - result.last = this.last; - result.numBuffers = this.numBuffers; - result.availableBytes = this.availableBytes; - result.availableBuffers = this.availableBuffers; - return result; - }; - - BufferList.prototype.append = function(buffer) { - var _ref; - buffer.prev = this.last; - if ((_ref = this.last) != null) { - _ref.next = buffer; - } - this.last = buffer; - if (this.first == null) { - this.first = buffer; - } - this.availableBytes += buffer.length; - this.availableBuffers++; - return this.numBuffers++; - }; - - BufferList.prototype.advance = function() { - if (this.first) { - this.availableBytes -= this.first.length; - this.availableBuffers--; - this.first = this.first.next; - return this.first != null; - } - return false; - }; - - BufferList.prototype.rewind = function() { - var _ref; - if (this.first && !this.first.prev) { - return false; - } - this.first = ((_ref = this.first) != null ? _ref.prev : void 0) || this.last; - if (this.first) { - this.availableBytes += this.first.length; - this.availableBuffers++; - } - return this.first != null; - }; - - BufferList.prototype.reset = function() { - var _results; - _results = []; - while (this.rewind()) { - continue; - } - return _results; - }; - - return BufferList; - -})(); - -module.exports = BufferList; - - -},{}],9:[function(_dereq_,module,exports){ -var Base, EventEmitter, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __slice = [].slice; - -Base = _dereq_('./base'); - -EventEmitter = (function(_super) { - __extends(EventEmitter, _super); - - function EventEmitter() { - return EventEmitter.__super__.constructor.apply(this, arguments); - } - - EventEmitter.prototype.on = function(event, fn) { - var _base; - if (this.events == null) { - this.events = {}; - } - if ((_base = this.events)[event] == null) { - _base[event] = []; - } - return this.events[event].push(fn); - }; - - EventEmitter.prototype.off = function(event, fn) { - var index, _ref; - if (!((_ref = this.events) != null ? _ref[event] : void 0)) { - return; - } - index = this.events[event].indexOf(fn); - if (~index) { - return this.events[event].splice(index, 1); - } - }; - - EventEmitter.prototype.once = function(event, fn) { - var cb; - return this.on(event, cb = function() { - this.off(event, cb); - return fn.apply(this, arguments); - }); - }; - - EventEmitter.prototype.emit = function() { - var args, event, fn, _i, _len, _ref, _ref1; - event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - if (!((_ref = this.events) != null ? _ref[event] : void 0)) { - return; - } - _ref1 = this.events[event].slice(); - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - fn = _ref1[_i]; - fn.apply(this, args); - } - }; - - return EventEmitter; - -})(Base); - -module.exports = EventEmitter; - - -},{"./base":5}],10:[function(_dereq_,module,exports){ -var AVBuffer, BufferList, Stream, UnderflowError; - -BufferList = _dereq_('./bufferlist'); - -AVBuffer = _dereq_('./buffer'); - -UnderflowError = _dereq_('./underflow'); - -Stream = (function() { - var buf, decodeString, float32, float64, float64Fallback, float80, int16, int32, int8, nativeEndian, uint16, uint32, uint8; - - buf = new ArrayBuffer(16); - - uint8 = new Uint8Array(buf); - - int8 = new Int8Array(buf); - - uint16 = new Uint16Array(buf); - - int16 = new Int16Array(buf); - - uint32 = new Uint32Array(buf); - - int32 = new Int32Array(buf); - - float32 = new Float32Array(buf); - - if (typeof Float64Array !== "undefined" && Float64Array !== null) { - float64 = new Float64Array(buf); - } - - nativeEndian = new Uint16Array(new Uint8Array([0x12, 0x34]).buffer)[0] === 0x3412; - - function Stream(list) { - this.list = list; - this.localOffset = 0; - this.offset = 0; - } - - Stream.fromBuffer = function(buffer) { - var list; - list = new BufferList; - list.append(buffer); - return new Stream(list); - }; - - Stream.prototype.copy = function() { - var result; - result = new Stream(this.list.copy()); - result.localOffset = this.localOffset; - result.offset = this.offset; - return result; - }; - - Stream.prototype.available = function(bytes) { - return bytes <= this.list.availableBytes - this.localOffset; - }; - - Stream.prototype.remainingBytes = function() { - return this.list.availableBytes - this.localOffset; - }; - - Stream.prototype.advance = function(bytes) { - if (!this.available(bytes)) { - throw new UnderflowError(); - } - this.localOffset += bytes; - this.offset += bytes; - while (this.list.first && this.localOffset >= this.list.first.length) { - this.localOffset -= this.list.first.length; - this.list.advance(); - } - return this; - }; - - Stream.prototype.rewind = function(bytes) { - if (bytes > this.offset) { - throw new UnderflowError(); - } - if (!this.list.first) { - this.list.rewind(); - this.localOffset = this.list.first.length; - } - this.localOffset -= bytes; - this.offset -= bytes; - while (this.list.first.prev && this.localOffset < 0) { - this.list.rewind(); - this.localOffset += this.list.first.length; - } - return this; - }; - - Stream.prototype.seek = function(position) { - if (position > this.offset) { - return this.advance(position - this.offset); - } else if (position < this.offset) { - return this.rewind(this.offset - position); - } - }; - - Stream.prototype.readUInt8 = function() { - var a; - if (!this.available(1)) { - throw new UnderflowError(); - } - a = this.list.first.data[this.localOffset]; - this.localOffset += 1; - this.offset += 1; - if (this.localOffset === this.list.first.length) { - this.localOffset = 0; - this.list.advance(); - } - return a; - }; - - Stream.prototype.peekUInt8 = function(offset) { - var buffer; - if (offset == null) { - offset = 0; - } - if (!this.available(offset + 1)) { - throw new UnderflowError(); - } - offset = this.localOffset + offset; - buffer = this.list.first; - while (buffer) { - if (buffer.length > offset) { - return buffer.data[offset]; - } - offset -= buffer.length; - buffer = buffer.next; - } - return 0; - }; - - Stream.prototype.read = function(bytes, littleEndian) { - var i, _i, _j, _ref; - if (littleEndian == null) { - littleEndian = false; - } - if (littleEndian === nativeEndian) { - for (i = _i = 0; _i < bytes; i = _i += 1) { - uint8[i] = this.readUInt8(); - } - } else { - for (i = _j = _ref = bytes - 1; _j >= 0; i = _j += -1) { - uint8[i] = this.readUInt8(); - } - } - }; - - Stream.prototype.peek = function(bytes, offset, littleEndian) { - var i, _i, _j; - if (littleEndian == null) { - littleEndian = false; - } - if (littleEndian === nativeEndian) { - for (i = _i = 0; _i < bytes; i = _i += 1) { - uint8[i] = this.peekUInt8(offset + i); - } - } else { - for (i = _j = 0; _j < bytes; i = _j += 1) { - uint8[bytes - i - 1] = this.peekUInt8(offset + i); - } - } - }; - - Stream.prototype.readInt8 = function() { - this.read(1); - return int8[0]; - }; - - Stream.prototype.peekInt8 = function(offset) { - if (offset == null) { - offset = 0; - } - this.peek(1, offset); - return int8[0]; - }; - - Stream.prototype.readUInt16 = function(littleEndian) { - this.read(2, littleEndian); - return uint16[0]; - }; - - Stream.prototype.peekUInt16 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - this.peek(2, offset, littleEndian); - return uint16[0]; - }; - - Stream.prototype.readInt16 = function(littleEndian) { - this.read(2, littleEndian); - return int16[0]; - }; - - Stream.prototype.peekInt16 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - this.peek(2, offset, littleEndian); - return int16[0]; - }; - - Stream.prototype.readUInt24 = function(littleEndian) { - if (littleEndian) { - return this.readUInt16(true) + (this.readUInt8() << 16); - } else { - return (this.readUInt16() << 8) + this.readUInt8(); - } - }; - - Stream.prototype.peekUInt24 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - if (littleEndian) { - return this.peekUInt16(offset, true) + (this.peekUInt8(offset + 2) << 16); - } else { - return (this.peekUInt16(offset) << 8) + this.peekUInt8(offset + 2); - } - }; - - Stream.prototype.readInt24 = function(littleEndian) { - if (littleEndian) { - return this.readUInt16(true) + (this.readInt8() << 16); - } else { - return (this.readInt16() << 8) + this.readUInt8(); - } - }; - - Stream.prototype.peekInt24 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - if (littleEndian) { - return this.peekUInt16(offset, true) + (this.peekInt8(offset + 2) << 16); - } else { - return (this.peekInt16(offset) << 8) + this.peekUInt8(offset + 2); - } - }; - - Stream.prototype.readUInt32 = function(littleEndian) { - this.read(4, littleEndian); - return uint32[0]; - }; - - Stream.prototype.peekUInt32 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - this.peek(4, offset, littleEndian); - return uint32[0]; - }; - - Stream.prototype.readInt32 = function(littleEndian) { - this.read(4, littleEndian); - return int32[0]; - }; - - Stream.prototype.peekInt32 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - this.peek(4, offset, littleEndian); - return int32[0]; - }; - - Stream.prototype.readFloat32 = function(littleEndian) { - this.read(4, littleEndian); - return float32[0]; - }; - - Stream.prototype.peekFloat32 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - this.peek(4, offset, littleEndian); - return float32[0]; - }; - - Stream.prototype.readFloat64 = function(littleEndian) { - this.read(8, littleEndian); - if (float64) { - return float64[0]; - } else { - return float64Fallback(); - } - }; - - float64Fallback = function() { - var exp, frac, high, low, out, sign; - low = uint32[0], high = uint32[1]; - if (!high || high === 0x80000000) { - return 0.0; - } - sign = 1 - (high >>> 31) * 2; - exp = (high >>> 20) & 0x7ff; - frac = high & 0xfffff; - if (exp === 0x7ff) { - if (frac) { - return NaN; - } - return sign * Infinity; - } - exp -= 1023; - out = (frac | 0x100000) * Math.pow(2, exp - 20); - out += low * Math.pow(2, exp - 52); - return sign * out; - }; - - Stream.prototype.peekFloat64 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - this.peek(8, offset, littleEndian); - if (float64) { - return float64[0]; - } else { - return float64Fallback(); - } - }; - - Stream.prototype.readFloat80 = function(littleEndian) { - this.read(10, littleEndian); - return float80(); - }; - - float80 = function() { - var a0, a1, exp, high, low, out, sign; - high = uint32[0], low = uint32[1]; - a0 = uint8[9]; - a1 = uint8[8]; - sign = 1 - (a0 >>> 7) * 2; - exp = ((a0 & 0x7F) << 8) | a1; - if (exp === 0 && low === 0 && high === 0) { - return 0; - } - if (exp === 0x7fff) { - if (low === 0 && high === 0) { - return sign * Infinity; - } - return NaN; - } - exp -= 16383; - out = low * Math.pow(2, exp - 31); - out += high * Math.pow(2, exp - 63); - return sign * out; - }; - - Stream.prototype.peekFloat80 = function(offset, littleEndian) { - if (offset == null) { - offset = 0; - } - this.peek(10, offset, littleEndian); - return float80(); - }; - - Stream.prototype.readBuffer = function(length) { - var i, result, to, _i; - result = AVBuffer.allocate(length); - to = result.data; - for (i = _i = 0; _i < length; i = _i += 1) { - to[i] = this.readUInt8(); - } - return result; - }; - - Stream.prototype.peekBuffer = function(offset, length) { - var i, result, to, _i; - if (offset == null) { - offset = 0; - } - result = AVBuffer.allocate(length); - to = result.data; - for (i = _i = 0; _i < length; i = _i += 1) { - to[i] = this.peekUInt8(offset + i); - } - return result; - }; - - Stream.prototype.readSingleBuffer = function(length) { - var result; - result = this.list.first.slice(this.localOffset, length); - this.advance(result.length); - return result; - }; - - Stream.prototype.peekSingleBuffer = function(offset, length) { - var result; - result = this.list.first.slice(this.localOffset + offset, length); - return result; - }; - - Stream.prototype.readString = function(length, encoding) { - if (encoding == null) { - encoding = 'ascii'; - } - return decodeString.call(this, 0, length, encoding, true); - }; - - Stream.prototype.peekString = function(offset, length, encoding) { - if (offset == null) { - offset = 0; - } - if (encoding == null) { - encoding = 'ascii'; - } - return decodeString.call(this, offset, length, encoding, false); - }; - - decodeString = function(offset, length, encoding, advance) { - var b1, b2, b3, b4, bom, c, end, littleEndian, nullEnd, pt, result, w1, w2; - encoding = encoding.toLowerCase(); - nullEnd = length === null ? 0 : -1; - if (length == null) { - length = Infinity; - } - end = offset + length; - result = ''; - switch (encoding) { - case 'ascii': - case 'latin1': - while (offset < end && (c = this.peekUInt8(offset++)) !== nullEnd) { - result += String.fromCharCode(c); - } - break; - case 'utf8': - case 'utf-8': - while (offset < end && (b1 = this.peekUInt8(offset++)) !== nullEnd) { - if ((b1 & 0x80) === 0) { - result += String.fromCharCode(b1); - } else if ((b1 & 0xe0) === 0xc0) { - b2 = this.peekUInt8(offset++) & 0x3f; - result += String.fromCharCode(((b1 & 0x1f) << 6) | b2); - } else if ((b1 & 0xf0) === 0xe0) { - b2 = this.peekUInt8(offset++) & 0x3f; - b3 = this.peekUInt8(offset++) & 0x3f; - result += String.fromCharCode(((b1 & 0x0f) << 12) | (b2 << 6) | b3); - } else if ((b1 & 0xf8) === 0xf0) { - b2 = this.peekUInt8(offset++) & 0x3f; - b3 = this.peekUInt8(offset++) & 0x3f; - b4 = this.peekUInt8(offset++) & 0x3f; - pt = (((b1 & 0x0f) << 18) | (b2 << 12) | (b3 << 6) | b4) - 0x10000; - result += String.fromCharCode(0xd800 + (pt >> 10), 0xdc00 + (pt & 0x3ff)); - } - } - break; - case 'utf16-be': - case 'utf16be': - case 'utf16le': - case 'utf16-le': - case 'utf16bom': - case 'utf16-bom': - switch (encoding) { - case 'utf16be': - case 'utf16-be': - littleEndian = false; - break; - case 'utf16le': - case 'utf16-le': - littleEndian = true; - break; - case 'utf16bom': - case 'utf16-bom': - if (length < 2 || (bom = this.peekUInt16(offset)) === nullEnd) { - if (advance) { - this.advance(offset += 2); - } - return result; - } - littleEndian = bom === 0xfffe; - offset += 2; - } - while (offset < end && (w1 = this.peekUInt16(offset, littleEndian)) !== nullEnd) { - offset += 2; - if (w1 < 0xd800 || w1 > 0xdfff) { - result += String.fromCharCode(w1); - } else { - if (w1 > 0xdbff) { - throw new Error("Invalid utf16 sequence."); - } - w2 = this.peekUInt16(offset, littleEndian); - if (w2 < 0xdc00 || w2 > 0xdfff) { - throw new Error("Invalid utf16 sequence."); - } - result += String.fromCharCode(w1, w2); - offset += 2; - } - } - if (w1 === nullEnd) { - offset += 2; - } - break; - default: - throw new Error("Unknown encoding: " + encoding); - } - if (advance) { - this.advance(offset); - } - return result; - }; - - return Stream; - -})(); - -module.exports = Stream; - - -},{"./buffer":7,"./bufferlist":8,"./underflow":11}],11:[function(_dereq_,module,exports){ -var UnderflowError, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -UnderflowError = (function(_super) { - __extends(UnderflowError, _super); - - function UnderflowError() { - UnderflowError.__super__.constructor.apply(this, arguments); - this.name = 'UnderflowError'; - this.stack = new Error().stack; - } - - return UnderflowError; - -})(Error); - -module.exports = UnderflowError; - - -},{}],12:[function(_dereq_,module,exports){ -var Bitstream, BufferList, Decoder, EventEmitter, Stream, UnderflowError, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('./core/events'); - -BufferList = _dereq_('./core/bufferlist'); - -Stream = _dereq_('./core/stream'); - -Bitstream = _dereq_('./core/bitstream'); - -UnderflowError = _dereq_('./core/underflow'); - -Decoder = (function(_super) { - var codecs; - - __extends(Decoder, _super); - - function Decoder(demuxer, format) { - var list; - this.demuxer = demuxer; - this.format = format; - list = new BufferList; - this.stream = new Stream(list); - this.bitstream = new Bitstream(this.stream); - this.receivedFinalBuffer = false; - this.waiting = false; - this.demuxer.on('cookie', (function(_this) { - return function(cookie) { - var error; - try { - return _this.setCookie(cookie); - } catch (_error) { - error = _error; - return _this.emit('error', error); - } - }; - })(this)); - this.demuxer.on('data', (function(_this) { - return function(chunk) { - list.append(chunk); - if (_this.waiting) { - return _this.decode(); - } - }; - })(this)); - this.demuxer.on('end', (function(_this) { - return function() { - _this.receivedFinalBuffer = true; - if (_this.waiting) { - return _this.decode(); - } - }; - })(this)); - this.init(); - } - - Decoder.prototype.init = function() {}; - - Decoder.prototype.setCookie = function(cookie) {}; - - Decoder.prototype.readChunk = function() {}; - - Decoder.prototype.decode = function() { - var error, offset, packet; - this.waiting = false; - offset = this.bitstream.offset(); - try { - packet = this.readChunk(); - } catch (_error) { - error = _error; - if (!(error instanceof UnderflowError)) { - this.emit('error', error); - return false; - } - } - if (packet) { - this.emit('data', packet); - return true; - } else if (!this.receivedFinalBuffer) { - this.bitstream.seek(offset); - this.waiting = true; - } else { - this.emit('end'); - } - return false; - }; - - Decoder.prototype.seek = function(timestamp) { - var seekPoint; - seekPoint = this.demuxer.seek(timestamp); - this.stream.seek(seekPoint.offset); - return seekPoint.timestamp; - }; - - codecs = {}; - - Decoder.register = function(id, decoder) { - return codecs[id] = decoder; - }; - - Decoder.find = function(id) { - return codecs[id] || null; - }; - - return Decoder; - -})(EventEmitter); - -module.exports = Decoder; - - -},{"./core/bitstream":6,"./core/bufferlist":8,"./core/events":9,"./core/stream":10,"./core/underflow":11}],13:[function(_dereq_,module,exports){ -var Decoder, LPCMDecoder, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Decoder = _dereq_('../decoder'); - -LPCMDecoder = (function(_super) { - __extends(LPCMDecoder, _super); - - function LPCMDecoder() { - this.readChunk = __bind(this.readChunk, this); - return LPCMDecoder.__super__.constructor.apply(this, arguments); - } - - Decoder.register('lpcm', LPCMDecoder); - - LPCMDecoder.prototype.readChunk = function() { - var chunkSize, i, littleEndian, output, samples, stream, _i, _j, _k, _l, _m, _n; - stream = this.stream; - littleEndian = this.format.littleEndian; - chunkSize = Math.min(4096, stream.remainingBytes()); - samples = chunkSize / (this.format.bitsPerChannel / 8) | 0; - if (chunkSize < this.format.bitsPerChannel / 8) { - return null; - } - if (this.format.floatingPoint) { - switch (this.format.bitsPerChannel) { - case 32: - output = new Float32Array(samples); - for (i = _i = 0; _i < samples; i = _i += 1) { - output[i] = stream.readFloat32(littleEndian); - } - break; - case 64: - output = new Float64Array(samples); - for (i = _j = 0; _j < samples; i = _j += 1) { - output[i] = stream.readFloat64(littleEndian); - } - break; - default: - throw new Error('Unsupported bit depth.'); - } - } else { - switch (this.format.bitsPerChannel) { - case 8: - output = new Int8Array(samples); - for (i = _k = 0; _k < samples; i = _k += 1) { - output[i] = stream.readInt8(); - } - break; - case 16: - output = new Int16Array(samples); - for (i = _l = 0; _l < samples; i = _l += 1) { - output[i] = stream.readInt16(littleEndian); - } - break; - case 24: - output = new Int32Array(samples); - for (i = _m = 0; _m < samples; i = _m += 1) { - output[i] = stream.readInt24(littleEndian); - } - break; - case 32: - output = new Int32Array(samples); - for (i = _n = 0; _n < samples; i = _n += 1) { - output[i] = stream.readInt32(littleEndian); - } - break; - default: - throw new Error('Unsupported bit depth.'); - } - } - return output; - }; - - return LPCMDecoder; - -})(Decoder); - - -},{"../decoder":12}],14:[function(_dereq_,module,exports){ -var Decoder, XLAWDecoder, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Decoder = _dereq_('../decoder'); - -XLAWDecoder = (function(_super) { - var BIAS, QUANT_MASK, SEG_MASK, SEG_SHIFT, SIGN_BIT; - - __extends(XLAWDecoder, _super); - - function XLAWDecoder() { - this.readChunk = __bind(this.readChunk, this); - return XLAWDecoder.__super__.constructor.apply(this, arguments); - } - - Decoder.register('ulaw', XLAWDecoder); - - Decoder.register('alaw', XLAWDecoder); - - SIGN_BIT = 0x80; - - QUANT_MASK = 0xf; - - SEG_SHIFT = 4; - - SEG_MASK = 0x70; - - BIAS = 0x84; - - XLAWDecoder.prototype.init = function() { - var i, seg, t, table, val, _i, _j; - this.format.bitsPerChannel = 16; - this.table = table = new Int16Array(256); - if (this.format.formatID === 'ulaw') { - for (i = _i = 0; _i < 256; i = ++_i) { - val = ~i; - t = ((val & QUANT_MASK) << 3) + BIAS; - t <<= (val & SEG_MASK) >>> SEG_SHIFT; - table[i] = val & SIGN_BIT ? BIAS - t : t - BIAS; - } - } else { - for (i = _j = 0; _j < 256; i = ++_j) { - val = i ^ 0x55; - t = val & QUANT_MASK; - seg = (val & SEG_MASK) >>> SEG_SHIFT; - if (seg) { - t = (t + t + 1 + 32) << (seg + 2); - } else { - t = (t + t + 1) << 3; - } - table[i] = val & SIGN_BIT ? t : -t; - } - } - }; - - XLAWDecoder.prototype.readChunk = function() { - var i, output, samples, stream, table, _i; - stream = this.stream, table = this.table; - samples = Math.min(4096, this.stream.remainingBytes()); - if (samples === 0) { - return; - } - output = new Int16Array(samples); - for (i = _i = 0; _i < samples; i = _i += 1) { - output[i] = table[stream.readUInt8()]; - } - return output; - }; - - return XLAWDecoder; - -})(Decoder); - - -},{"../decoder":12}],15:[function(_dereq_,module,exports){ -var BufferList, Demuxer, EventEmitter, Stream, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('./core/events'); - -BufferList = _dereq_('./core/bufferlist'); - -Stream = _dereq_('./core/stream'); - -Demuxer = (function(_super) { - var formats; - - __extends(Demuxer, _super); - - Demuxer.probe = function(buffer) { - return false; - }; - - function Demuxer(source, chunk) { - var list, received; - list = new BufferList; - list.append(chunk); - this.stream = new Stream(list); - received = false; - source.on('data', (function(_this) { - return function(chunk) { - received = true; - list.append(chunk); - return _this.readChunk(chunk); - }; - })(this)); - source.on('error', (function(_this) { - return function(err) { - return _this.emit('error', err); - }; - })(this)); - source.on('end', (function(_this) { - return function() { - if (!received) { - _this.readChunk(chunk); - } - return _this.emit('end'); - }; - })(this)); - this.seekPoints = []; - this.init(); - } - - Demuxer.prototype.init = function() {}; - - Demuxer.prototype.readChunk = function(chunk) {}; - - Demuxer.prototype.addSeekPoint = function(offset, timestamp) { - var index; - index = this.searchTimestamp(timestamp); - return this.seekPoints.splice(index, 0, { - offset: offset, - timestamp: timestamp - }); - }; - - Demuxer.prototype.searchTimestamp = function(timestamp, backward) { - var high, low, mid, time; - low = 0; - high = this.seekPoints.length; - if (high > 0 && this.seekPoints[high - 1].timestamp < timestamp) { - return high; - } - while (low < high) { - mid = (low + high) >> 1; - time = this.seekPoints[mid].timestamp; - if (time < timestamp) { - low = mid + 1; - } else if (time >= timestamp) { - high = mid; - } - } - if (high > this.seekPoints.length) { - high = this.seekPoints.length; - } - return high; - }; - - Demuxer.prototype.seek = function(timestamp) { - var index, seekPoint; - if (this.format && this.format.framesPerPacket > 0 && this.format.bytesPerPacket > 0) { - seekPoint = { - timestamp: timestamp, - offset: this.format.bytesPerPacket * timestamp / this.format.framesPerPacket - }; - return seekPoint; - } else { - index = this.searchTimestamp(timestamp); - return this.seekPoints[index]; - } - }; - - formats = []; - - Demuxer.register = function(demuxer) { - return formats.push(demuxer); - }; - - Demuxer.find = function(buffer) { - var e, format, offset, stream, _i, _len; - stream = Stream.fromBuffer(buffer); - for (_i = 0, _len = formats.length; _i < _len; _i++) { - format = formats[_i]; - offset = stream.offset; - try { - if (format.probe(stream)) { - return format; - } - } catch (_error) { - e = _error; - } - stream.seek(offset); - } - return null; - }; - - return Demuxer; - -})(EventEmitter); - -module.exports = Demuxer; - - -},{"./core/bufferlist":8,"./core/events":9,"./core/stream":10}],16:[function(_dereq_,module,exports){ -var AIFFDemuxer, Demuxer, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Demuxer = _dereq_('../demuxer'); - -AIFFDemuxer = (function(_super) { - __extends(AIFFDemuxer, _super); - - function AIFFDemuxer() { - return AIFFDemuxer.__super__.constructor.apply(this, arguments); - } - - Demuxer.register(AIFFDemuxer); - - AIFFDemuxer.probe = function(buffer) { - var _ref; - return buffer.peekString(0, 4) === 'FORM' && ((_ref = buffer.peekString(8, 4)) === 'AIFF' || _ref === 'AIFC'); - }; - - AIFFDemuxer.prototype.readChunk = function() { - var buffer, format, offset, _ref; - if (!this.readStart && this.stream.available(12)) { - if (this.stream.readString(4) !== 'FORM') { - return this.emit('error', 'Invalid AIFF.'); - } - this.fileSize = this.stream.readUInt32(); - this.fileType = this.stream.readString(4); - this.readStart = true; - if ((_ref = this.fileType) !== 'AIFF' && _ref !== 'AIFC') { - return this.emit('error', 'Invalid AIFF.'); - } - } - while (this.stream.available(1)) { - if (!this.readHeaders && this.stream.available(8)) { - this.type = this.stream.readString(4); - this.len = this.stream.readUInt32(); - } - switch (this.type) { - case 'COMM': - if (!this.stream.available(this.len)) { - return; - } - this.format = { - formatID: 'lpcm', - channelsPerFrame: this.stream.readUInt16(), - sampleCount: this.stream.readUInt32(), - bitsPerChannel: this.stream.readUInt16(), - sampleRate: this.stream.readFloat80(), - framesPerPacket: 1, - littleEndian: false, - floatingPoint: false - }; - this.format.bytesPerPacket = (this.format.bitsPerChannel / 8) * this.format.channelsPerFrame; - if (this.fileType === 'AIFC') { - format = this.stream.readString(4); - this.format.littleEndian = format === 'sowt' && this.format.bitsPerChannel > 8; - this.format.floatingPoint = format === 'fl32' || format === 'fl64'; - if (format === 'twos' || format === 'sowt' || format === 'fl32' || format === 'fl64' || format === 'NONE') { - format = 'lpcm'; - } - this.format.formatID = format; - this.len -= 4; - } - this.stream.advance(this.len - 18); - this.emit('format', this.format); - this.emit('duration', this.format.sampleCount / this.format.sampleRate * 1000 | 0); - break; - case 'SSND': - if (!(this.readSSNDHeader && this.stream.available(4))) { - offset = this.stream.readUInt32(); - this.stream.advance(4); - this.stream.advance(offset); - this.readSSNDHeader = true; - } - buffer = this.stream.readSingleBuffer(this.len); - this.len -= buffer.length; - this.readHeaders = this.len > 0; - this.emit('data', buffer); - break; - default: - if (!this.stream.available(this.len)) { - return; - } - this.stream.advance(this.len); - } - if (this.type !== 'SSND') { - this.readHeaders = false; - } - } - }; - - return AIFFDemuxer; - -})(Demuxer); - - -},{"../demuxer":15}],17:[function(_dereq_,module,exports){ -var AUDemuxer, Demuxer, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Demuxer = _dereq_('../demuxer'); - -AUDemuxer = (function(_super) { - var bps, formats; - - __extends(AUDemuxer, _super); - - function AUDemuxer() { - return AUDemuxer.__super__.constructor.apply(this, arguments); - } - - Demuxer.register(AUDemuxer); - - AUDemuxer.probe = function(buffer) { - return buffer.peekString(0, 4) === '.snd'; - }; - - bps = [8, 8, 16, 24, 32, 32, 64]; - - bps[26] = 8; - - formats = { - 1: 'ulaw', - 27: 'alaw' - }; - - AUDemuxer.prototype.readChunk = function() { - var bytes, dataSize, encoding, size; - if (!this.readHeader && this.stream.available(24)) { - if (this.stream.readString(4) !== '.snd') { - return this.emit('error', 'Invalid AU file.'); - } - size = this.stream.readUInt32(); - dataSize = this.stream.readUInt32(); - encoding = this.stream.readUInt32(); - this.format = { - formatID: formats[encoding] || 'lpcm', - littleEndian: false, - floatingPoint: encoding === 6 || encoding === 7, - bitsPerChannel: bps[encoding - 1], - sampleRate: this.stream.readUInt32(), - channelsPerFrame: this.stream.readUInt32(), - framesPerPacket: 1 - }; - if (this.format.bitsPerChannel == null) { - return this.emit('error', 'Unsupported encoding in AU file.'); - } - this.format.bytesPerPacket = (this.format.bitsPerChannel / 8) * this.format.channelsPerFrame; - if (dataSize !== 0xffffffff) { - bytes = this.format.bitsPerChannel / 8; - this.emit('duration', dataSize / bytes / this.format.channelsPerFrame / this.format.sampleRate * 1000 | 0); - } - this.emit('format', this.format); - this.readHeader = true; - } - if (this.readHeader) { - while (this.stream.available(1)) { - this.emit('data', this.stream.readSingleBuffer(this.stream.remainingBytes())); - } - } - }; - - return AUDemuxer; - -})(Demuxer); - - -},{"../demuxer":15}],18:[function(_dereq_,module,exports){ -var CAFDemuxer, Demuxer, M4ADemuxer, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Demuxer = _dereq_('../demuxer'); - -M4ADemuxer = _dereq_('./m4a'); - -CAFDemuxer = (function(_super) { - __extends(CAFDemuxer, _super); - - function CAFDemuxer() { - return CAFDemuxer.__super__.constructor.apply(this, arguments); - } - - Demuxer.register(CAFDemuxer); - - CAFDemuxer.probe = function(buffer) { - return buffer.peekString(0, 4) === 'caff'; - }; - - CAFDemuxer.prototype.readChunk = function() { - var buffer, byteOffset, cookie, entries, flags, i, key, metadata, offset, sampleOffset, value, _i, _j, _ref; - if (!this.format && this.stream.available(64)) { - if (this.stream.readString(4) !== 'caff') { - return this.emit('error', "Invalid CAF, does not begin with 'caff'"); - } - this.stream.advance(4); - if (this.stream.readString(4) !== 'desc') { - return this.emit('error', "Invalid CAF, 'caff' is not followed by 'desc'"); - } - if (!(this.stream.readUInt32() === 0 && this.stream.readUInt32() === 32)) { - return this.emit('error', "Invalid 'desc' size, should be 32"); - } - this.format = {}; - this.format.sampleRate = this.stream.readFloat64(); - this.format.formatID = this.stream.readString(4); - flags = this.stream.readUInt32(); - if (this.format.formatID === 'lpcm') { - this.format.floatingPoint = Boolean(flags & 1); - this.format.littleEndian = Boolean(flags & 2); - } - this.format.bytesPerPacket = this.stream.readUInt32(); - this.format.framesPerPacket = this.stream.readUInt32(); - this.format.channelsPerFrame = this.stream.readUInt32(); - this.format.bitsPerChannel = this.stream.readUInt32(); - this.emit('format', this.format); - } - while (this.stream.available(1)) { - if (!this.headerCache) { - this.headerCache = { - type: this.stream.readString(4), - oversize: this.stream.readUInt32() !== 0, - size: this.stream.readUInt32() - }; - if (this.headerCache.oversize) { - return this.emit('error', "Holy Shit, an oversized file, not supported in JS"); - } - } - switch (this.headerCache.type) { - case 'kuki': - if (this.stream.available(this.headerCache.size)) { - if (this.format.formatID === 'aac ') { - offset = this.stream.offset + this.headerCache.size; - if (cookie = M4ADemuxer.readEsds(this.stream)) { - this.emit('cookie', cookie); - } - this.stream.seek(offset); - } else { - buffer = this.stream.readBuffer(this.headerCache.size); - this.emit('cookie', buffer); - } - this.headerCache = null; - } - break; - case 'pakt': - if (this.stream.available(this.headerCache.size)) { - if (this.stream.readUInt32() !== 0) { - return this.emit('error', 'Sizes greater than 32 bits are not supported.'); - } - this.numPackets = this.stream.readUInt32(); - if (this.stream.readUInt32() !== 0) { - return this.emit('error', 'Sizes greater than 32 bits are not supported.'); - } - this.numFrames = this.stream.readUInt32(); - this.primingFrames = this.stream.readUInt32(); - this.remainderFrames = this.stream.readUInt32(); - this.emit('duration', this.numFrames / this.format.sampleRate * 1000 | 0); - this.sentDuration = true; - byteOffset = 0; - sampleOffset = 0; - for (i = _i = 0, _ref = this.numPackets; _i < _ref; i = _i += 1) { - this.addSeekPoint(byteOffset, sampleOffset); - byteOffset += this.format.bytesPerPacket || M4ADemuxer.readDescrLen(this.stream); - sampleOffset += this.format.framesPerPacket || M4ADemuxer.readDescrLen(this.stream); - } - this.headerCache = null; - } - break; - case 'info': - entries = this.stream.readUInt32(); - metadata = {}; - for (i = _j = 0; 0 <= entries ? _j < entries : _j > entries; i = 0 <= entries ? ++_j : --_j) { - key = this.stream.readString(null); - value = this.stream.readString(null); - metadata[key] = value; - } - this.emit('metadata', metadata); - this.headerCache = null; - break; - case 'data': - if (!this.sentFirstDataChunk) { - this.stream.advance(4); - this.headerCache.size -= 4; - if (this.format.bytesPerPacket !== 0 && !this.sentDuration) { - this.numFrames = this.headerCache.size / this.format.bytesPerPacket; - this.emit('duration', this.numFrames / this.format.sampleRate * 1000 | 0); - } - this.sentFirstDataChunk = true; - } - buffer = this.stream.readSingleBuffer(this.headerCache.size); - this.headerCache.size -= buffer.length; - this.emit('data', buffer); - if (this.headerCache.size <= 0) { - this.headerCache = null; - } - break; - default: - if (this.stream.available(this.headerCache.size)) { - this.stream.advance(this.headerCache.size); - this.headerCache = null; - } - } - } - }; - - return CAFDemuxer; - -})(Demuxer); - - -},{"../demuxer":15,"./m4a":19}],19:[function(_dereq_,module,exports){ -var Demuxer, M4ADemuxer, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - -Demuxer = _dereq_('../demuxer'); - -M4ADemuxer = (function(_super) { - var BITS_PER_CHANNEL, TYPES, after, atom, atoms, bool, containers, diskTrack, genres, meta, string; - - __extends(M4ADemuxer, _super); - - function M4ADemuxer() { - return M4ADemuxer.__super__.constructor.apply(this, arguments); - } - - Demuxer.register(M4ADemuxer); - - TYPES = ['M4A ', 'M4P ', 'M4B ', 'M4V ', 'isom', 'mp42', 'qt ']; - - M4ADemuxer.probe = function(buffer) { - var _ref; - return buffer.peekString(4, 4) === 'ftyp' && (_ref = buffer.peekString(8, 4), __indexOf.call(TYPES, _ref) >= 0); - }; - - M4ADemuxer.prototype.init = function() { - this.atoms = []; - this.offsets = []; - this.track = null; - return this.tracks = []; - }; - - atoms = {}; - - containers = {}; - - atom = function(name, fn) { - var c, container, _i, _len, _ref; - c = []; - _ref = name.split('.').slice(0, -1); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - container = _ref[_i]; - c.push(container); - containers[c.join('.')] = true; - } - if (atoms[name] == null) { - atoms[name] = {}; - } - return atoms[name].fn = fn; - }; - - after = function(name, fn) { - if (atoms[name] == null) { - atoms[name] = {}; - } - return atoms[name].after = fn; - }; - - M4ADemuxer.prototype.readChunk = function() { - var handler, path, type; - this["break"] = false; - while (this.stream.available(1) && !this["break"]) { - if (!this.readHeaders) { - if (!this.stream.available(8)) { - return; - } - this.len = this.stream.readUInt32() - 8; - this.type = this.stream.readString(4); - if (this.len === 0) { - continue; - } - this.atoms.push(this.type); - this.offsets.push(this.stream.offset + this.len); - this.readHeaders = true; - } - path = this.atoms.join('.'); - handler = atoms[path]; - if (handler != null ? handler.fn : void 0) { - if (!(this.stream.available(this.len) || path === 'mdat')) { - return; - } - handler.fn.call(this); - if (path in containers) { - this.readHeaders = false; - } - } else if (path in containers) { - this.readHeaders = false; - } else { - if (!this.stream.available(this.len)) { - return; - } - this.stream.advance(this.len); - } - while (this.stream.offset >= this.offsets[this.offsets.length - 1]) { - handler = atoms[this.atoms.join('.')]; - if (handler != null ? handler.after : void 0) { - handler.after.call(this); - } - type = this.atoms.pop(); - this.offsets.pop(); - this.readHeaders = false; - } - } - }; - - atom('ftyp', function() { - var _ref; - if (_ref = this.stream.readString(4), __indexOf.call(TYPES, _ref) < 0) { - return this.emit('error', 'Not a valid M4A file.'); - } - return this.stream.advance(this.len - 4); - }); - - atom('moov.trak', function() { - this.track = {}; - return this.tracks.push(this.track); - }); - - atom('moov.trak.tkhd', function() { - this.stream.advance(4); - this.stream.advance(8); - this.track.id = this.stream.readUInt32(); - return this.stream.advance(this.len - 16); - }); - - atom('moov.trak.mdia.hdlr', function() { - this.stream.advance(4); - this.stream.advance(4); - this.track.type = this.stream.readString(4); - this.stream.advance(12); - return this.stream.advance(this.len - 24); - }); - - atom('moov.trak.mdia.mdhd', function() { - this.stream.advance(4); - this.stream.advance(8); - this.track.timeScale = this.stream.readUInt32(); - this.track.duration = this.stream.readUInt32(); - return this.stream.advance(4); - }); - - BITS_PER_CHANNEL = { - ulaw: 8, - alaw: 8, - in24: 24, - in32: 32, - fl32: 32, - fl64: 64 - }; - - atom('moov.trak.mdia.minf.stbl.stsd', function() { - var format, numEntries, version, _ref, _ref1; - this.stream.advance(4); - numEntries = this.stream.readUInt32(); - if (this.track.type !== 'soun') { - return this.stream.advance(this.len - 8); - } - if (numEntries !== 1) { - return this.emit('error', "Only expecting one entry in sample description atom!"); - } - this.stream.advance(4); - format = this.track.format = {}; - format.formatID = this.stream.readString(4); - this.stream.advance(6); - this.stream.advance(2); - version = this.stream.readUInt16(); - this.stream.advance(6); - format.channelsPerFrame = this.stream.readUInt16(); - format.bitsPerChannel = this.stream.readUInt16(); - this.stream.advance(4); - format.sampleRate = this.stream.readUInt16(); - this.stream.advance(2); - if (version === 1) { - format.framesPerPacket = this.stream.readUInt32(); - this.stream.advance(4); - format.bytesPerFrame = this.stream.readUInt32(); - this.stream.advance(4); - } else if (version !== 0) { - this.emit('error', 'Unknown version in stsd atom'); - } - if (BITS_PER_CHANNEL[format.formatID] != null) { - format.bitsPerChannel = BITS_PER_CHANNEL[format.formatID]; - } - format.floatingPoint = (_ref = format.formatID) === 'fl32' || _ref === 'fl64'; - format.littleEndian = format.formatID === 'sowt' && format.bitsPerChannel > 8; - if ((_ref1 = format.formatID) === 'twos' || _ref1 === 'sowt' || _ref1 === 'in24' || _ref1 === 'in32' || _ref1 === 'fl32' || _ref1 === 'fl64' || _ref1 === 'raw ' || _ref1 === 'NONE') { - return format.formatID = 'lpcm'; - } - }); - - atom('moov.trak.mdia.minf.stbl.stsd.alac', function() { - this.stream.advance(4); - return this.track.cookie = this.stream.readBuffer(this.len - 4); - }); - - atom('moov.trak.mdia.minf.stbl.stsd.esds', function() { - var offset; - offset = this.stream.offset + this.len; - this.track.cookie = M4ADemuxer.readEsds(this.stream); - return this.stream.seek(offset); - }); - - atom('moov.trak.mdia.minf.stbl.stsd.wave.enda', function() { - return this.track.format.littleEndian = !!this.stream.readUInt16(); - }); - - M4ADemuxer.readDescrLen = function(stream) { - var c, count, len; - len = 0; - count = 4; - while (count--) { - c = stream.readUInt8(); - len = (len << 7) | (c & 0x7f); - if (!(c & 0x80)) { - break; - } - } - return len; - }; - - M4ADemuxer.readEsds = function(stream) { - var codec_id, flags, len, tag; - stream.advance(4); - tag = stream.readUInt8(); - len = M4ADemuxer.readDescrLen(stream); - if (tag === 0x03) { - stream.advance(2); - flags = stream.readUInt8(); - if (flags & 0x80) { - stream.advance(2); - } - if (flags & 0x40) { - stream.advance(stream.readUInt8()); - } - if (flags & 0x20) { - stream.advance(2); - } - } else { - stream.advance(2); - } - tag = stream.readUInt8(); - len = M4ADemuxer.readDescrLen(stream); - if (tag === 0x04) { - codec_id = stream.readUInt8(); - stream.advance(1); - stream.advance(3); - stream.advance(4); - stream.advance(4); - tag = stream.readUInt8(); - len = M4ADemuxer.readDescrLen(stream); - if (tag === 0x05) { - return stream.readBuffer(len); - } - } - return null; - }; - - atom('moov.trak.mdia.minf.stbl.stts', function() { - var entries, i, _i; - this.stream.advance(4); - entries = this.stream.readUInt32(); - this.track.stts = []; - for (i = _i = 0; _i < entries; i = _i += 1) { - this.track.stts[i] = { - count: this.stream.readUInt32(), - duration: this.stream.readUInt32() - }; - } - return this.setupSeekPoints(); - }); - - atom('moov.trak.mdia.minf.stbl.stsc', function() { - var entries, i, _i; - this.stream.advance(4); - entries = this.stream.readUInt32(); - this.track.stsc = []; - for (i = _i = 0; _i < entries; i = _i += 1) { - this.track.stsc[i] = { - first: this.stream.readUInt32(), - count: this.stream.readUInt32(), - id: this.stream.readUInt32() - }; - } - return this.setupSeekPoints(); - }); - - atom('moov.trak.mdia.minf.stbl.stsz', function() { - var entries, i, _i; - this.stream.advance(4); - this.track.sampleSize = this.stream.readUInt32(); - entries = this.stream.readUInt32(); - if (this.track.sampleSize === 0 && entries > 0) { - this.track.sampleSizes = []; - for (i = _i = 0; _i < entries; i = _i += 1) { - this.track.sampleSizes[i] = this.stream.readUInt32(); - } - } - return this.setupSeekPoints(); - }); - - atom('moov.trak.mdia.minf.stbl.stco', function() { - var entries, i, _i; - this.stream.advance(4); - entries = this.stream.readUInt32(); - this.track.chunkOffsets = []; - for (i = _i = 0; _i < entries; i = _i += 1) { - this.track.chunkOffsets[i] = this.stream.readUInt32(); - } - return this.setupSeekPoints(); - }); - - atom('moov.trak.tref.chap', function() { - var entries, i, _i; - entries = this.len >> 2; - this.track.chapterTracks = []; - for (i = _i = 0; _i < entries; i = _i += 1) { - this.track.chapterTracks[i] = this.stream.readUInt32(); - } - }); - - M4ADemuxer.prototype.setupSeekPoints = function() { - var i, j, offset, position, sampleIndex, size, stscIndex, sttsIndex, sttsSample, timestamp, _i, _j, _len, _ref, _ref1, _results; - if (!((this.track.chunkOffsets != null) && (this.track.stsc != null) && (this.track.sampleSize != null) && (this.track.stts != null))) { - return; - } - stscIndex = 0; - sttsIndex = 0; - sttsIndex = 0; - sttsSample = 0; - sampleIndex = 0; - offset = 0; - timestamp = 0; - this.track.seekPoints = []; - _ref = this.track.chunkOffsets; - _results = []; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - position = _ref[i]; - for (j = _j = 0, _ref1 = this.track.stsc[stscIndex].count; _j < _ref1; j = _j += 1) { - this.track.seekPoints.push({ - offset: offset, - position: position, - timestamp: timestamp - }); - size = this.track.sampleSize || this.track.sampleSizes[sampleIndex++]; - offset += size; - position += size; - timestamp += this.track.stts[sttsIndex].duration; - if (sttsIndex + 1 < this.track.stts.length && ++sttsSample === this.track.stts[sttsIndex].count) { - sttsSample = 0; - sttsIndex++; - } - } - if (stscIndex + 1 < this.track.stsc.length && i + 1 === this.track.stsc[stscIndex + 1].first) { - _results.push(stscIndex++); - } else { - _results.push(void 0); - } - } - return _results; - }; - - after('moov', function() { - var track, _i, _len, _ref; - if (this.mdatOffset != null) { - this.stream.seek(this.mdatOffset - 8); - } - _ref = this.tracks; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - track = _ref[_i]; - if (!(track.type === 'soun')) { - continue; - } - this.track = track; - break; - } - if (this.track.type !== 'soun') { - this.track = null; - return this.emit('error', 'No audio tracks in m4a file.'); - } - this.emit('format', this.track.format); - this.emit('duration', this.track.duration / this.track.timeScale * 1000 | 0); - if (this.track.cookie) { - this.emit('cookie', this.track.cookie); - } - return this.seekPoints = this.track.seekPoints; - }); - - atom('mdat', function() { - var bytes, chunkSize, length, numSamples, offset, sample, size, _i; - if (!this.startedData) { - if (this.mdatOffset == null) { - this.mdatOffset = this.stream.offset; - } - if (this.tracks.length === 0) { - bytes = Math.min(this.stream.remainingBytes(), this.len); - this.stream.advance(bytes); - this.len -= bytes; - return; - } - this.chunkIndex = 0; - this.stscIndex = 0; - this.sampleIndex = 0; - this.tailOffset = 0; - this.tailSamples = 0; - this.startedData = true; - } - if (!this.readChapters) { - this.readChapters = this.parseChapters(); - if (this["break"] = !this.readChapters) { - return; - } - this.stream.seek(this.mdatOffset); - } - offset = this.track.chunkOffsets[this.chunkIndex] + this.tailOffset; - length = 0; - if (!this.stream.available(offset - this.stream.offset)) { - this["break"] = true; - return; - } - this.stream.seek(offset); - while (this.chunkIndex < this.track.chunkOffsets.length) { - numSamples = this.track.stsc[this.stscIndex].count - this.tailSamples; - chunkSize = 0; - for (sample = _i = 0; _i < numSamples; sample = _i += 1) { - size = this.track.sampleSize || this.track.sampleSizes[this.sampleIndex]; - if (!this.stream.available(length + size)) { - break; - } - length += size; - chunkSize += size; - this.sampleIndex++; - } - if (sample < numSamples) { - this.tailOffset += chunkSize; - this.tailSamples += sample; - break; - } else { - this.chunkIndex++; - this.tailOffset = 0; - this.tailSamples = 0; - if (this.stscIndex + 1 < this.track.stsc.length && this.chunkIndex + 1 === this.track.stsc[this.stscIndex + 1].first) { - this.stscIndex++; - } - if (offset + length !== this.track.chunkOffsets[this.chunkIndex]) { - break; - } - } - } - if (length > 0) { - this.emit('data', this.stream.readBuffer(length)); - return this["break"] = this.chunkIndex === this.track.chunkOffsets.length; - } else { - return this["break"] = true; - } - }); - - M4ADemuxer.prototype.parseChapters = function() { - var bom, id, len, nextTimestamp, point, title, track, _i, _len, _ref, _ref1, _ref2, _ref3; - if (!(((_ref = this.track.chapterTracks) != null ? _ref.length : void 0) > 0)) { - return true; - } - id = this.track.chapterTracks[0]; - _ref1 = this.tracks; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - track = _ref1[_i]; - if (track.id === id) { - break; - } - } - if (track.id !== id) { - this.emit('error', 'Chapter track does not exist.'); - } - if (this.chapters == null) { - this.chapters = []; - } - while (this.chapters.length < track.seekPoints.length) { - point = track.seekPoints[this.chapters.length]; - if (!this.stream.available(point.position - this.stream.offset + 32)) { - return false; - } - this.stream.seek(point.position); - len = this.stream.readUInt16(); - title = null; - if (!this.stream.available(len)) { - return false; - } - if (len > 2) { - bom = this.stream.peekUInt16(); - if (bom === 0xfeff || bom === 0xfffe) { - title = this.stream.readString(len, 'utf16-bom'); - } - } - if (title == null) { - title = this.stream.readString(len, 'utf8'); - } - nextTimestamp = (_ref2 = (_ref3 = track.seekPoints[this.chapters.length + 1]) != null ? _ref3.timestamp : void 0) != null ? _ref2 : track.duration; - this.chapters.push({ - title: title, - timestamp: point.timestamp / track.timeScale * 1000 | 0, - duration: (nextTimestamp - point.timestamp) / track.timeScale * 1000 | 0 - }); - } - this.emit('chapters', this.chapters); - return true; - }; - - atom('moov.udta.meta', function() { - this.metadata = {}; - return this.stream.advance(4); - }); - - after('moov.udta.meta', function() { - return this.emit('metadata', this.metadata); - }); - - meta = function(field, name, fn) { - return atom("moov.udta.meta.ilst." + field + ".data", function() { - this.stream.advance(8); - this.len -= 8; - return fn.call(this, name); - }); - }; - - string = function(field) { - return this.metadata[field] = this.stream.readString(this.len, 'utf8'); - }; - - meta('©alb', 'album', string); - - meta('©arg', 'arranger', string); - - meta('©art', 'artist', string); - - meta('©ART', 'artist', string); - - meta('aART', 'albumArtist', string); - - meta('catg', 'category', string); - - meta('©com', 'composer', string); - - meta('©cpy', 'copyright', string); - - meta('cprt', 'copyright', string); - - meta('©cmt', 'comments', string); - - meta('©day', 'releaseDate', string); - - meta('desc', 'description', string); - - meta('©gen', 'genre', string); - - meta('©grp', 'grouping', string); - - meta('©isr', 'ISRC', string); - - meta('keyw', 'keywords', string); - - meta('©lab', 'recordLabel', string); - - meta('ldes', 'longDescription', string); - - meta('©lyr', 'lyrics', string); - - meta('©nam', 'title', string); - - meta('©phg', 'recordingCopyright', string); - - meta('©prd', 'producer', string); - - meta('©prf', 'performers', string); - - meta('purd', 'purchaseDate', string); - - meta('purl', 'podcastURL', string); - - meta('©swf', 'songwriter', string); - - meta('©too', 'encoder', string); - - meta('©wrt', 'composer', string); - - meta('covr', 'coverArt', function(field) { - return this.metadata[field] = this.stream.readBuffer(this.len); - }); - - genres = ["Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "A Capella", "Euro-House", "Dance Hall"]; - - meta('gnre', 'genre', function(field) { - return this.metadata[field] = genres[this.stream.readUInt16() - 1]; - }); - - meta('tmpo', 'tempo', function(field) { - return this.metadata[field] = this.stream.readUInt16(); - }); - - meta('rtng', 'rating', function(field) { - var rating; - rating = this.stream.readUInt8(); - return this.metadata[field] = rating === 2 ? 'Clean' : rating !== 0 ? 'Explicit' : 'None'; - }); - - diskTrack = function(field) { - this.stream.advance(2); - this.metadata[field] = this.stream.readUInt16() + ' of ' + this.stream.readUInt16(); - return this.stream.advance(this.len - 6); - }; - - meta('disk', 'diskNumber', diskTrack); - - meta('trkn', 'trackNumber', diskTrack); - - bool = function(field) { - return this.metadata[field] = this.stream.readUInt8() === 1; - }; - - meta('cpil', 'compilation', bool); - - meta('pcst', 'podcast', bool); - - meta('pgap', 'gapless', bool); - - return M4ADemuxer; - -})(Demuxer); - -module.exports = M4ADemuxer; - - -},{"../demuxer":15}],20:[function(_dereq_,module,exports){ -var Demuxer, WAVEDemuxer, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Demuxer = _dereq_('../demuxer'); - -WAVEDemuxer = (function(_super) { - var formats; - - __extends(WAVEDemuxer, _super); - - function WAVEDemuxer() { - return WAVEDemuxer.__super__.constructor.apply(this, arguments); - } - - Demuxer.register(WAVEDemuxer); - - WAVEDemuxer.probe = function(buffer) { - return buffer.peekString(0, 4) === 'RIFF' && buffer.peekString(8, 4) === 'WAVE'; - }; - - formats = { - 0x0001: 'lpcm', - 0x0003: 'lpcm', - 0x0006: 'alaw', - 0x0007: 'ulaw' - }; - - WAVEDemuxer.prototype.readChunk = function() { - var buffer, bytes, encoding; - if (!this.readStart && this.stream.available(12)) { - if (this.stream.readString(4) !== 'RIFF') { - return this.emit('error', 'Invalid WAV file.'); - } - this.fileSize = this.stream.readUInt32(true); - this.readStart = true; - if (this.stream.readString(4) !== 'WAVE') { - return this.emit('error', 'Invalid WAV file.'); - } - } - while (this.stream.available(1)) { - if (!this.readHeaders && this.stream.available(8)) { - this.type = this.stream.readString(4); - this.len = this.stream.readUInt32(true); - } - switch (this.type) { - case 'fmt ': - encoding = this.stream.readUInt16(true); - if (!(encoding in formats)) { - return this.emit('error', 'Unsupported format in WAV file.'); - } - this.format = { - formatID: formats[encoding], - floatingPoint: encoding === 0x0003, - littleEndian: formats[encoding] === 'lpcm', - channelsPerFrame: this.stream.readUInt16(true), - sampleRate: this.stream.readUInt32(true), - framesPerPacket: 1 - }; - this.stream.advance(4); - this.stream.advance(2); - this.format.bitsPerChannel = this.stream.readUInt16(true); - this.format.bytesPerPacket = (this.format.bitsPerChannel / 8) * this.format.channelsPerFrame; - this.emit('format', this.format); - this.stream.advance(this.len - 16); - break; - case 'data': - if (!this.sentDuration) { - bytes = this.format.bitsPerChannel / 8; - this.emit('duration', this.len / bytes / this.format.channelsPerFrame / this.format.sampleRate * 1000 | 0); - this.sentDuration = true; - } - buffer = this.stream.readSingleBuffer(this.len); - this.len -= buffer.length; - this.readHeaders = this.len > 0; - this.emit('data', buffer); - break; - default: - if (!this.stream.available(this.len)) { - return; - } - this.stream.advance(this.len); - } - if (this.type !== 'data') { - this.readHeaders = false; - } - } - }; - - return WAVEDemuxer; - -})(Demuxer); - - -},{"../demuxer":15}],21:[function(_dereq_,module,exports){ -var AudioDevice, EventEmitter, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('./core/events'); - -AudioDevice = (function(_super) { - var devices; - - __extends(AudioDevice, _super); - - function AudioDevice(sampleRate, channels) { - this.sampleRate = sampleRate; - this.channels = channels; - this.updateTime = __bind(this.updateTime, this); - this.playing = false; - this.currentTime = 0; - this._lastTime = 0; - } - - AudioDevice.prototype.start = function() { - if (this.playing) { - return; - } - this.playing = true; - if (this.device == null) { - this.device = AudioDevice.create(this.sampleRate, this.channels); - } - if (!this.device) { - throw new Error("No supported audio device found."); - } - this._lastTime = this.device.getDeviceTime(); - this._timer = setInterval(this.updateTime, 200); - return this.device.on('refill', this.refill = (function(_this) { - return function(buffer) { - return _this.emit('refill', buffer); - }; - })(this)); - }; - - AudioDevice.prototype.stop = function() { - if (!this.playing) { - return; - } - this.playing = false; - this.device.off('refill', this.refill); - return clearInterval(this._timer); - }; - - AudioDevice.prototype.destroy = function() { - this.stop(); - return this.device.destroy(); - }; - - AudioDevice.prototype.seek = function(currentTime) { - this.currentTime = currentTime; - if (this.playing) { - this._lastTime = this.device.getDeviceTime(); - } - return this.emit('timeUpdate', this.currentTime); - }; - - AudioDevice.prototype.updateTime = function() { - var time; - time = this.device.getDeviceTime(); - this.currentTime += (time - this._lastTime) / this.device.sampleRate * 1000 | 0; - this._lastTime = time; - return this.emit('timeUpdate', this.currentTime); - }; - - devices = []; - - AudioDevice.register = function(device) { - return devices.push(device); - }; - - AudioDevice.create = function(sampleRate, channels) { - var device, _i, _len; - for (_i = 0, _len = devices.length; _i < _len; _i++) { - device = devices[_i]; - if (device.supported) { - return new device(sampleRate, channels); - } - } - return null; - }; - - return AudioDevice; - -})(EventEmitter); - -module.exports = AudioDevice; - - -},{"./core/events":9}],22:[function(_dereq_,module,exports){ -var AVBuffer, AudioDevice, EventEmitter, MozillaAudioDevice, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('../core/events'); - -AudioDevice = _dereq_('../device'); - -AVBuffer = _dereq_('../core/buffer'); - -MozillaAudioDevice = (function(_super) { - var createTimer, destroyTimer; - - __extends(MozillaAudioDevice, _super); - - AudioDevice.register(MozillaAudioDevice); - - MozillaAudioDevice.supported = (typeof Audio !== "undefined" && Audio !== null) && 'mozWriteAudio' in new Audio; - - function MozillaAudioDevice(sampleRate, channels) { - this.sampleRate = sampleRate; - this.channels = channels; - this.refill = __bind(this.refill, this); - this.audio = new Audio; - this.audio.mozSetup(this.channels, this.sampleRate); - this.writePosition = 0; - this.prebufferSize = this.sampleRate / 2; - this.tail = null; - this.timer = createTimer(this.refill, 100); - } - - MozillaAudioDevice.prototype.refill = function() { - var available, buffer, currentPosition, written; - if (this.tail) { - written = this.audio.mozWriteAudio(this.tail); - this.writePosition += written; - if (this.writePosition < this.tail.length) { - this.tail = this.tail.subarray(written); - } else { - this.tail = null; - } - } - currentPosition = this.audio.mozCurrentSampleOffset(); - available = currentPosition + this.prebufferSize - this.writePosition; - if (available > 0) { - buffer = new Float32Array(available); - this.emit('refill', buffer); - written = this.audio.mozWriteAudio(buffer); - if (written < buffer.length) { - this.tail = buffer.subarray(written); - } - this.writePosition += written; - } - }; - - MozillaAudioDevice.prototype.destroy = function() { - return destroyTimer(this.timer); - }; - - MozillaAudioDevice.prototype.getDeviceTime = function() { - return this.audio.mozCurrentSampleOffset() / this.channels; - }; - - createTimer = function(fn, interval) { - var url, worker; - url = AVBuffer.makeBlobURL("setInterval(function() { postMessage('ping'); }, " + interval + ");"); - if (url == null) { - return setInterval(fn, interval); - } - worker = new Worker(url); - worker.onmessage = fn; - worker.url = url; - return worker; - }; - - destroyTimer = function(timer) { - if (timer.terminate) { - timer.terminate(); - return URL.revokeObjectURL(timer.url); - } else { - return clearInterval(timer); - } - }; - - return MozillaAudioDevice; - -})(EventEmitter); - - -},{"../core/buffer":7,"../core/events":9,"../device":21}],23:[function(_dereq_,module,exports){ -/* - * This resampler is from XAudioJS: https://github.com/grantgalitz/XAudioJS - * Planned to be replaced with src.js, eventually: https://github.com/jussi-kalliokoski/src.js - */ - -//JavaScript Audio Resampler (c) 2011 - Grant Galitz -function Resampler(fromSampleRate, toSampleRate, channels, outputBufferSize, noReturn) { - this.fromSampleRate = fromSampleRate; - this.toSampleRate = toSampleRate; - this.channels = channels | 0; - this.outputBufferSize = outputBufferSize; - this.noReturn = !!noReturn; - this.initialize(); -} - -Resampler.prototype.initialize = function () { - //Perform some checks: - if (this.fromSampleRate > 0 && this.toSampleRate > 0 && this.channels > 0) { - if (this.fromSampleRate == this.toSampleRate) { - //Setup a resampler bypass: - this.resampler = this.bypassResampler; //Resampler just returns what was passed through. - this.ratioWeight = 1; - } - else { - if (this.fromSampleRate < this.toSampleRate) { - /* - Use generic linear interpolation if upsampling, - as linear interpolation produces a gradient that we want - and works fine with two input sample points per output in this case. - */ - this.compileLinearInterpolationFunction(); - this.lastWeight = 1; - } - else { - /* - Custom resampler I wrote that doesn't skip samples - like standard linear interpolation in high downsampling. - This is more accurate than linear interpolation on downsampling. - */ - this.compileMultiTapFunction(); - this.tailExists = false; - this.lastWeight = 0; - } - this.ratioWeight = this.fromSampleRate / this.toSampleRate; - this.initializeBuffers(); - } - } - else { - throw(new Error("Invalid settings specified for the resampler.")); - } -}; - -Resampler.prototype.compileLinearInterpolationFunction = function () { - var toCompile = "var bufferLength = buffer.length;\ - var outLength = this.outputBufferSize;\ - if ((bufferLength % " + this.channels + ") == 0) {\ - if (bufferLength > 0) {\ - var ratioWeight = this.ratioWeight;\ - var weight = this.lastWeight;\ - var firstWeight = 0;\ - var secondWeight = 0;\ - var sourceOffset = 0;\ - var outputOffset = 0;\ - var outputBuffer = this.outputBuffer;\ - for (; weight < 1; weight += ratioWeight) {\ - secondWeight = weight % 1;\ - firstWeight = 1 - secondWeight;"; - for (var channel = 0; channel < this.channels; ++channel) { - toCompile += "outputBuffer[outputOffset++] = (this.lastOutput[" + channel + "] * firstWeight) + (buffer[" + channel + "] * secondWeight);"; - } - toCompile += "}\ - weight -= 1;\ - for (bufferLength -= " + this.channels + ", sourceOffset = Math.floor(weight) * " + this.channels + "; outputOffset < outLength && sourceOffset < bufferLength;) {\ - secondWeight = weight % 1;\ - firstWeight = 1 - secondWeight;"; - for (var channel = 0; channel < this.channels; ++channel) { - toCompile += "outputBuffer[outputOffset++] = (buffer[sourceOffset" + ((channel > 0) ? (" + " + channel) : "") + "] * firstWeight) + (buffer[sourceOffset + " + (this.channels + channel) + "] * secondWeight);"; - } - toCompile += "weight += ratioWeight;\ - sourceOffset = Math.floor(weight) * " + this.channels + ";\ - }"; - for (var channel = 0; channel < this.channels; ++channel) { - toCompile += "this.lastOutput[" + channel + "] = buffer[sourceOffset++];"; - } - toCompile += "this.lastWeight = weight % 1;\ - return this.bufferSlice(outputOffset);\ - }\ - else {\ - return (this.noReturn) ? 0 : [];\ - }\ - }\ - else {\ - throw(new Error(\"Buffer was of incorrect sample length.\"));\ - }"; - this.resampler = Function("buffer", toCompile); -}; - -Resampler.prototype.compileMultiTapFunction = function () { - var toCompile = "var bufferLength = buffer.length;\ - var outLength = this.outputBufferSize;\ - if ((bufferLength % " + this.channels + ") == 0) {\ - if (bufferLength > 0) {\ - var ratioWeight = this.ratioWeight;\ - var weight = 0;"; - for (var channel = 0; channel < this.channels; ++channel) { - toCompile += "var output" + channel + " = 0;" - } - toCompile += "var actualPosition = 0;\ - var amountToNext = 0;\ - var alreadyProcessedTail = !this.tailExists;\ - this.tailExists = false;\ - var outputBuffer = this.outputBuffer;\ - var outputOffset = 0;\ - var currentPosition = 0;\ - do {\ - if (alreadyProcessedTail) {\ - weight = ratioWeight;"; - for (channel = 0; channel < this.channels; ++channel) { - toCompile += "output" + channel + " = 0;" - } - toCompile += "}\ - else {\ - weight = this.lastWeight;"; - for (channel = 0; channel < this.channels; ++channel) { - toCompile += "output" + channel + " = this.lastOutput[" + channel + "];" - } - toCompile += "alreadyProcessedTail = true;\ - }\ - while (weight > 0 && actualPosition < bufferLength) {\ - amountToNext = 1 + actualPosition - currentPosition;\ - if (weight >= amountToNext) {"; - for (channel = 0; channel < this.channels; ++channel) { - toCompile += "output" + channel + " += buffer[actualPosition++] * amountToNext;" - } - toCompile += "currentPosition = actualPosition;\ - weight -= amountToNext;\ - }\ - else {"; - for (channel = 0; channel < this.channels; ++channel) { - toCompile += "output" + channel + " += buffer[actualPosition" + ((channel > 0) ? (" + " + channel) : "") + "] * weight;" - } - toCompile += "currentPosition += weight;\ - weight = 0;\ - break;\ - }\ - }\ - if (weight == 0) {"; - for (channel = 0; channel < this.channels; ++channel) { - toCompile += "outputBuffer[outputOffset++] = output" + channel + " / ratioWeight;" - } - toCompile += "}\ - else {\ - this.lastWeight = weight;"; - for (channel = 0; channel < this.channels; ++channel) { - toCompile += "this.lastOutput[" + channel + "] = output" + channel + ";" - } - toCompile += "this.tailExists = true;\ - break;\ - }\ - } while (actualPosition < bufferLength && outputOffset < outLength);\ - return this.bufferSlice(outputOffset);\ - }\ - else {\ - return (this.noReturn) ? 0 : [];\ - }\ - }\ - else {\ - throw(new Error(\"Buffer was of incorrect sample length.\"));\ - }"; - this.resampler = Function("buffer", toCompile); -}; - -Resampler.prototype.bypassResampler = function (buffer) { - if (this.noReturn) { - //Set the buffer passed as our own, as we don't need to resample it: - this.outputBuffer = buffer; - return buffer.length; - } - else { - //Just return the buffer passsed: - return buffer; - } -}; - -Resampler.prototype.bufferSlice = function (sliceAmount) { - if (this.noReturn) { - //If we're going to access the properties directly from this object: - return sliceAmount; - } - else { - //Typed array and normal array buffer section referencing: - try { - return this.outputBuffer.subarray(0, sliceAmount); - } - catch (error) { - try { - //Regular array pass: - this.outputBuffer.length = sliceAmount; - return this.outputBuffer; - } - catch (error) { - //Nightly Firefox 4 used to have the subarray function named as slice: - return this.outputBuffer.slice(0, sliceAmount); - } - } - } -}; - -Resampler.prototype.initializeBuffers = function () { - //Initialize the internal buffer: - try { - this.outputBuffer = new Float32Array(this.outputBufferSize); - this.lastOutput = new Float32Array(this.channels); - } - catch (error) { - this.outputBuffer = []; - this.lastOutput = []; - } -}; - -module.exports = Resampler; - -},{}],24:[function(_dereq_,module,exports){ -(function (global){ -var AudioDevice, EventEmitter, Resampler, WebAudioDevice, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('../core/events'); - -AudioDevice = _dereq_('../device'); - -Resampler = _dereq_('./resampler'); - -WebAudioDevice = (function(_super) { - var AudioContext, createProcessor, sharedContext; - - __extends(WebAudioDevice, _super); - - AudioDevice.register(WebAudioDevice); - - AudioContext = global.AudioContext || global.webkitAudioContext; - - WebAudioDevice.supported = AudioContext && (typeof AudioContext.prototype[createProcessor = 'createScriptProcessor'] === 'function' || typeof AudioContext.prototype[createProcessor = 'createJavaScriptNode'] === 'function'); - - sharedContext = null; - - function WebAudioDevice(sampleRate, channels) { - this.sampleRate = sampleRate; - this.channels = channels; - this.refill = __bind(this.refill, this); - this.context = sharedContext != null ? sharedContext : sharedContext = new AudioContext; - this.deviceSampleRate = this.context.sampleRate; - this.bufferSize = Math.ceil(4096 / (this.deviceSampleRate / this.sampleRate) * this.channels); - this.bufferSize += this.bufferSize % this.channels; - if (this.deviceSampleRate !== this.sampleRate) { - this.resampler = new Resampler(this.sampleRate, this.deviceSampleRate, this.channels, 4096 * this.channels); - } - this.node = this.context[createProcessor](4096, this.channels, this.channels); - this.node.onaudioprocess = this.refill; - this.node.connect(this.context.destination); - } - - WebAudioDevice.prototype.refill = function(event) { - var channelCount, channels, data, i, n, outputBuffer, _i, _j, _k, _ref; - outputBuffer = event.outputBuffer; - channelCount = outputBuffer.numberOfChannels; - channels = new Array(channelCount); - for (i = _i = 0; _i < channelCount; i = _i += 1) { - channels[i] = outputBuffer.getChannelData(i); - } - data = new Float32Array(this.bufferSize); - this.emit('refill', data); - if (this.resampler) { - data = this.resampler.resampler(data); - } - for (i = _j = 0, _ref = outputBuffer.length; _j < _ref; i = _j += 1) { - for (n = _k = 0; _k < channelCount; n = _k += 1) { - channels[n][i] = data[i * channelCount + n]; - } - } - }; - - WebAudioDevice.prototype.destroy = function() { - return this.node.disconnect(0); - }; - - WebAudioDevice.prototype.getDeviceTime = function() { - return this.context.currentTime * this.sampleRate; - }; - - return WebAudioDevice; - -})(EventEmitter); - - -}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../core/events":9,"../device":21,"./resampler":23}],25:[function(_dereq_,module,exports){ -var Filter; - -Filter = (function() { - function Filter(context, key) { - if (context && key) { - Object.defineProperty(this, 'value', { - get: function() { - return context[key]; - } - }); - } - } - - Filter.prototype.process = function(buffer) {}; - - return Filter; - -})(); - -module.exports = Filter; - - -},{}],26:[function(_dereq_,module,exports){ -var BalanceFilter, Filter, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Filter = _dereq_('../filter'); - -BalanceFilter = (function(_super) { - __extends(BalanceFilter, _super); - - function BalanceFilter() { - return BalanceFilter.__super__.constructor.apply(this, arguments); - } - - BalanceFilter.prototype.process = function(buffer) { - var i, pan, _i, _ref; - if (this.value === 0) { - return; - } - pan = Math.max(-50, Math.min(50, this.value)); - for (i = _i = 0, _ref = buffer.length; _i < _ref; i = _i += 2) { - buffer[i] *= Math.min(1, (50 - pan) / 50); - buffer[i + 1] *= Math.min(1, (50 + pan) / 50); - } - }; - - return BalanceFilter; - -})(Filter); - -module.exports = BalanceFilter; - - -},{"../filter":25}],27:[function(_dereq_,module,exports){ -var Filter, VolumeFilter, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -Filter = _dereq_('../filter'); - -VolumeFilter = (function(_super) { - __extends(VolumeFilter, _super); - - function VolumeFilter() { - return VolumeFilter.__super__.constructor.apply(this, arguments); - } - - VolumeFilter.prototype.process = function(buffer) { - var i, vol, _i, _ref; - if (this.value >= 100) { - return; - } - vol = Math.max(0, Math.min(100, this.value)) / 100; - for (i = _i = 0, _ref = buffer.length; _i < _ref; i = _i += 1) { - buffer[i] *= vol; - } - }; - - return VolumeFilter; - -})(Filter); - -module.exports = VolumeFilter; - - -},{"../filter":25}],28:[function(_dereq_,module,exports){ -var Asset, AudioDevice, BalanceFilter, EventEmitter, Player, Queue, VolumeFilter, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('./core/events'); - -Asset = _dereq_('./asset'); - -VolumeFilter = _dereq_('./filters/volume'); - -BalanceFilter = _dereq_('./filters/balance'); - -Queue = _dereq_('./queue'); - -AudioDevice = _dereq_('./device'); - -Player = (function(_super) { - __extends(Player, _super); - - function Player(asset) { - this.asset = asset; - this.startPlaying = __bind(this.startPlaying, this); - this.playing = false; - this.buffered = 0; - this.currentTime = 0; - this.duration = 0; - this.volume = 100; - this.pan = 0; - this.metadata = {}; - this.filters = [new VolumeFilter(this, 'volume'), new BalanceFilter(this, 'pan')]; - this.asset.on('buffer', (function(_this) { - return function(buffered) { - _this.buffered = buffered; - return _this.emit('buffer', _this.buffered); - }; - })(this)); - this.asset.on('decodeStart', (function(_this) { - return function() { - _this.queue = new Queue(_this.asset); - return _this.queue.once('ready', _this.startPlaying); - }; - })(this)); - this.asset.on('format', (function(_this) { - return function(format) { - _this.format = format; - return _this.emit('format', _this.format); - }; - })(this)); - this.asset.on('metadata', (function(_this) { - return function(metadata) { - _this.metadata = metadata; - return _this.emit('metadata', _this.metadata); - }; - })(this)); - this.asset.on('duration', (function(_this) { - return function(duration) { - _this.duration = duration; - return _this.emit('duration', _this.duration); - }; - })(this)); - this.asset.on('error', (function(_this) { - return function(error) { - return _this.emit('error', error); - }; - })(this)); - } - - Player.fromURL = function(url) { - return new Player(Asset.fromURL(url)); - }; - - Player.fromFile = function(file) { - return new Player(Asset.fromFile(file)); - }; - - Player.fromBuffer = function(buffer) { - return new Player(Asset.fromBuffer(buffer)); - }; - - Player.prototype.preload = function() { - if (!this.asset) { - return; - } - this.startedPreloading = true; - return this.asset.start(false); - }; - - Player.prototype.play = function() { - var _ref; - if (this.playing) { - return; - } - if (!this.startedPreloading) { - this.preload(); - } - this.playing = true; - return (_ref = this.device) != null ? _ref.start() : void 0; - }; - - Player.prototype.pause = function() { - var _ref; - if (!this.playing) { - return; - } - this.playing = false; - return (_ref = this.device) != null ? _ref.stop() : void 0; - }; - - Player.prototype.togglePlayback = function() { - if (this.playing) { - return this.pause(); - } else { - return this.play(); - } - }; - - Player.prototype.stop = function() { - var _ref; - this.pause(); - this.asset.stop(); - return (_ref = this.device) != null ? _ref.destroy() : void 0; - }; - - Player.prototype.seek = function(timestamp) { - var _ref; - if ((_ref = this.device) != null) { - _ref.stop(); - } - this.queue.once('ready', (function(_this) { - return function() { - var _ref1, _ref2; - if ((_ref1 = _this.device) != null) { - _ref1.seek(_this.currentTime); - } - if (_this.playing) { - return (_ref2 = _this.device) != null ? _ref2.start() : void 0; - } - }; - })(this)); - timestamp = (timestamp / 1000) * this.format.sampleRate; - timestamp = this.asset.decoder.seek(timestamp); - this.currentTime = timestamp / this.format.sampleRate * 1000 | 0; - this.queue.reset(); - return this.currentTime; - }; - - Player.prototype.startPlaying = function() { - var frame, frameOffset; - frame = this.queue.read(); - frameOffset = 0; - this.device = new AudioDevice(this.format.sampleRate, this.format.channelsPerFrame); - this.device.on('timeUpdate', (function(_this) { - return function(currentTime) { - _this.currentTime = currentTime; - return _this.emit('progress', _this.currentTime); - }; - })(this)); - this.refill = (function(_this) { - return function(buffer) { - var bufferOffset, filter, i, max, _i, _j, _len, _ref; - if (!_this.playing) { - return; - } - if (!frame) { - frame = _this.queue.read(); - frameOffset = 0; - } - bufferOffset = 0; - while (frame && bufferOffset < buffer.length) { - max = Math.min(frame.length - frameOffset, buffer.length - bufferOffset); - for (i = _i = 0; _i < max; i = _i += 1) { - buffer[bufferOffset++] = frame[frameOffset++]; - } - if (frameOffset === frame.length) { - frame = _this.queue.read(); - frameOffset = 0; - } - } - _ref = _this.filters; - for (_j = 0, _len = _ref.length; _j < _len; _j++) { - filter = _ref[_j]; - filter.process(buffer); - } - if (!frame) { - if (_this.queue.ended) { - _this.currentTime = _this.duration; - _this.emit('progress', _this.currentTime); - _this.emit('end'); - _this.stop(); - } else { - _this.device.stop(); - } - } - }; - })(this); - this.device.on('refill', this.refill); - if (this.playing) { - this.device.start(); - } - return this.emit('ready'); - }; - - return Player; - -})(EventEmitter); - -module.exports = Player; - - -},{"./asset":2,"./core/events":9,"./device":21,"./filters/balance":26,"./filters/volume":27,"./queue":29}],29:[function(_dereq_,module,exports){ -var EventEmitter, Queue, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('./core/events'); - -Queue = (function(_super) { - __extends(Queue, _super); - - function Queue(asset) { - this.asset = asset; - this.write = __bind(this.write, this); - this.readyMark = 64; - this.finished = false; - this.buffering = true; - this.ended = false; - this.buffers = []; - this.asset.on('data', this.write); - this.asset.on('end', (function(_this) { - return function() { - return _this.ended = true; - }; - })(this)); - this.asset.decodePacket(); - } - - Queue.prototype.write = function(buffer) { - if (buffer) { - this.buffers.push(buffer); - } - if (this.buffering) { - if (this.buffers.length >= this.readyMark || this.ended) { - this.buffering = false; - return this.emit('ready'); - } else { - return this.asset.decodePacket(); - } - } - }; - - Queue.prototype.read = function() { - if (this.buffers.length === 0) { - return null; - } - this.asset.decodePacket(); - return this.buffers.shift(); - }; - - Queue.prototype.reset = function() { - this.buffers.length = 0; - this.buffering = true; - return this.asset.decodePacket(); - }; - - return Queue; - -})(EventEmitter); - -module.exports = Queue; - - -},{"./core/events":9}],30:[function(_dereq_,module,exports){ -var AVBuffer, EventEmitter, FileSource, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('../../core/events'); - -AVBuffer = _dereq_('../../core/buffer'); - -FileSource = (function(_super) { - __extends(FileSource, _super); - - function FileSource(file) { - this.file = file; - if (typeof FileReader === "undefined" || FileReader === null) { - return this.emit('error', 'This browser does not have FileReader support.'); - } - this.offset = 0; - this.length = this.file.size; - this.chunkSize = 1 << 20; - this.file[this.slice = 'slice'] || this.file[this.slice = 'webkitSlice'] || this.file[this.slice = 'mozSlice']; - } - - FileSource.prototype.start = function() { - if (this.reader) { - if (!this.active) { - return this.loop(); - } - } - this.reader = new FileReader; - this.active = true; - this.reader.onload = (function(_this) { - return function(e) { - var buf; - buf = new AVBuffer(new Uint8Array(e.target.result)); - _this.offset += buf.length; - _this.emit('data', buf); - _this.active = false; - if (_this.offset < _this.length) { - return _this.loop(); - } - }; - })(this); - this.reader.onloadend = (function(_this) { - return function() { - if (_this.offset === _this.length) { - _this.emit('end'); - return _this.reader = null; - } - }; - })(this); - this.reader.onerror = (function(_this) { - return function(e) { - return _this.emit('error', e); - }; - })(this); - this.reader.onprogress = (function(_this) { - return function(e) { - return _this.emit('progress', (_this.offset + e.loaded) / _this.length * 100); - }; - })(this); - return this.loop(); - }; - - FileSource.prototype.loop = function() { - var blob, endPos; - this.active = true; - endPos = Math.min(this.offset + this.chunkSize, this.length); - blob = this.file[this.slice](this.offset, endPos); - return this.reader.readAsArrayBuffer(blob); - }; - - FileSource.prototype.pause = function() { - var _ref; - this.active = false; - try { - return (_ref = this.reader) != null ? _ref.abort() : void 0; - } catch (_error) {} - }; - - FileSource.prototype.reset = function() { - this.pause(); - return this.offset = 0; - }; - - return FileSource; - -})(EventEmitter); - -module.exports = FileSource; - - -},{"../../core/buffer":7,"../../core/events":9}],31:[function(_dereq_,module,exports){ -var AVBuffer, EventEmitter, HTTPSource, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('../../core/events'); - -AVBuffer = _dereq_('../../core/buffer'); - -HTTPSource = (function(_super) { - __extends(HTTPSource, _super); - - function HTTPSource(url) { - this.url = url; - this.chunkSize = 1 << 20; - this.inflight = false; - this.reset(); - } - - HTTPSource.prototype.start = function() { - if (this.length) { - if (!this.inflight) { - return this.loop(); - } - } - this.inflight = true; - this.xhr = new XMLHttpRequest(); - this.xhr.onload = (function(_this) { - return function(event) { - _this.length = parseInt(_this.xhr.getResponseHeader("Content-Length")); - _this.inflight = false; - return _this.loop(); - }; - })(this); - this.xhr.onerror = (function(_this) { - return function(err) { - _this.pause(); - return _this.emit('error', err); - }; - })(this); - this.xhr.onabort = (function(_this) { - return function(event) { - return _this.inflight = false; - }; - })(this); - this.xhr.open("HEAD", this.url, true); - return this.xhr.send(null); - }; - - HTTPSource.prototype.loop = function() { - var endPos; - if (this.inflight || !this.length) { - return this.emit('error', 'Something is wrong in HTTPSource.loop'); - } - this.inflight = true; - this.xhr = new XMLHttpRequest(); - this.xhr.onload = (function(_this) { - return function(event) { - var buf, buffer, i, txt, _i, _ref; - if (_this.xhr.response) { - buf = new Uint8Array(_this.xhr.response); - } else { - txt = _this.xhr.responseText; - buf = new Uint8Array(txt.length); - for (i = _i = 0, _ref = txt.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { - buf[i] = txt.charCodeAt(i) & 0xff; - } - } - buffer = new AVBuffer(buf); - _this.offset += buffer.length; - _this.emit('data', buffer); - if (_this.offset >= _this.length) { - _this.emit('end'); - } - _this.inflight = false; - if (!(_this.offset >= _this.length)) { - return _this.loop(); - } - }; - })(this); - this.xhr.onprogress = (function(_this) { - return function(event) { - return _this.emit('progress', (_this.offset + event.loaded) / _this.length * 100); - }; - })(this); - this.xhr.onerror = (function(_this) { - return function(err) { - _this.emit('error', err); - return _this.pause(); - }; - })(this); - this.xhr.onabort = (function(_this) { - return function(event) { - return _this.inflight = false; - }; - })(this); - this.xhr.open("GET", this.url, true); - this.xhr.responseType = "arraybuffer"; - endPos = Math.min(this.offset + this.chunkSize, this.length); - this.xhr.setRequestHeader("Range", "bytes=" + this.offset + "-" + endPos); - this.xhr.overrideMimeType('text/plain; charset=x-user-defined'); - return this.xhr.send(null); - }; - - HTTPSource.prototype.pause = function() { - var _ref; - this.inflight = false; - return (_ref = this.xhr) != null ? _ref.abort() : void 0; - }; - - HTTPSource.prototype.reset = function() { - this.pause(); - return this.offset = 0; - }; - - return HTTPSource; - -})(EventEmitter); - -module.exports = HTTPSource; - - -},{"../../core/buffer":7,"../../core/events":9}],32:[function(_dereq_,module,exports){ -(function (global){ -var AVBuffer, BufferList, BufferSource, EventEmitter, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - -EventEmitter = _dereq_('../core/events'); - -BufferList = _dereq_('../core/bufferlist'); - -AVBuffer = _dereq_('../core/buffer'); - -BufferSource = (function(_super) { - var clearImmediate, setImmediate; - - __extends(BufferSource, _super); - - function BufferSource(input) { - this.loop = __bind(this.loop, this); - if (input instanceof BufferList) { - this.list = input; - } else { - this.list = new BufferList; - this.list.append(new AVBuffer(input)); - } - this.paused = true; - } - - setImmediate = global.setImmediate || function(fn) { - return global.setTimeout(fn, 0); - }; - - clearImmediate = global.clearImmediate || function(timer) { - return global.clearTimeout(timer); - }; - - BufferSource.prototype.start = function() { - this.paused = false; - return this._timer = setImmediate(this.loop); - }; - - BufferSource.prototype.loop = function() { - this.emit('progress', (this.list.numBuffers - this.list.availableBuffers + 1) / this.list.numBuffers * 100 | 0); - this.emit('data', this.list.first); - if (this.list.advance()) { - return setImmediate(this.loop); - } else { - return this.emit('end'); - } - }; - - BufferSource.prototype.pause = function() { - clearImmediate(this._timer); - return this.paused = true; - }; - - BufferSource.prototype.reset = function() { - this.pause(); - return this.list.rewind(); - }; - - return BufferSource; - -})(EventEmitter); - -module.exports = BufferSource; - - -}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../core/buffer":7,"../core/bufferlist":8,"../core/events":9}]},{},[1]) - -(1) -}); - -//# sourceMappingURL=aurora.js.map diff --git a/lorgar/lib/em/CMakeLists.txt b/lorgar/lib/em/CMakeLists.txt new file mode 100644 index 0000000..36f775e --- /dev/null +++ b/lorgar/lib/em/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 2.8.12) + +configure_file(wrapper.js wrapper.js) +configure_file(wrapper.wasm wrapper.wasm COPYONLY) diff --git a/lorgar/lib/em/wrapper.js b/lorgar/lib/em/wrapper.js new file mode 100644 index 0000000..1c75774 --- /dev/null +++ b/lorgar/lib/em/wrapper.js @@ -0,0 +1,4 @@ +var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var GLOBAL_BASE=1024;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var str="";while(1){var u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|u8Array[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE=1024,DYNAMIC_BASE=5316240,DYNAMICTOP_PTR=73104;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}var TOTAL_STACK=5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var wasmBinaryFile="wrapper.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_uncaught_exception(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}function ___lock(){}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function ___map_file(pathname,size){___setErrNo(1);return-1}var SYSCALLS={buffers:[null,[],[]],printChar:(function(stream,curr){var buffer=SYSCALLS.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=UTF8ToString(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])}),destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}});clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function runDestructor(handle){var $$=handle.$$;if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}this.$$.count.value-=1;var toDelete=0===this.$$.count.value;if(toDelete){runDestructor(this)}if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=(function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)});proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register((function(){clonedHandle["delete"]()})));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return Object.create(prototype,{$$:{value:record}})}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>2)+i])}return array}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],(function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,(function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}var destructors=[];var args=new Array(argCount);args[0]=rawConstructor;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>1])});case 2:return(function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])});default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":(function(c){return this.constructor.values[c]}),"toWireType":(function(destructors,c){return c.value}),"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,(function(){}))}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,(function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)}),argCount-1);whenDependentTypesAreResolved([],argTypes,(function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]}))}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var endChar=HEAPU8[value+4+length];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAPU8[value+4+length]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0){var stringSegment=UTF8ToString(decodeStartPtr);if(str===undefined)str=stringSegment;else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}if(endCharSwap!=0)HEAPU8[value+4+length]=endCharSwap}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i>2]=rd;return returnType["toWireType"](destructors,handle)}function __emval_allocateDestructors(destructorsRef){var destructors=[];HEAP32[destructorsRef>>2]=__emval_register(destructors);return destructors}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_methodCallers=[];function __emval_call_method(caller,handle,methodName,destructorsRef,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);return caller(handle,methodName,__emval_allocateDestructors(destructorsRef),args)}function __emval_call_void_method(caller,handle,methodName,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);caller(handle,methodName,null,args)}function emval_get_global(){return(function(){return Function})()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function __emval_lookupTypes(argCount,argTypes,argWireTypes){var a=new Array(argCount);for(var i=0;i>2)+i],"parameter "+i)}return a}function __emval_get_method_caller(argCount,argTypes){var types=__emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+"_$"+types.slice(1).map((function(t){return t.name})).join("_")+"$";var params=["retType"];var args=[retType];var argsList="";for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return(new Function("requireRegisteredType","Module","__emval_register",functionBody))(requireRegisteredType,Module,__emval_register)}var emval_newers={};function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function __emval_set_property(handle,key,value){handle=requireHandle(handle);key=requireHandle(key);value=requireHandle(value);handle[key]=value}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){Module["abort"]()}function _emscripten_get_heap_size(){return TOTAL_MEMORY}function _emscripten_resize_heap(requestedSize){abortOnCannotGrowMemory()}var ENV={};function _getenv(name){if(name===0)return 0;name=UTF8ToString(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _llvm_stackrestore(p){var self=_llvm_stacksave;var ret=self.LLVM_SAVEDSTACKS[p];self.LLVM_SAVEDSTACKS.splice(p,1);stackRestore(ret)}function _llvm_stacksave(){var self=_llvm_stacksave;if(!self.LLVM_SAVEDSTACKS){self.LLVM_SAVEDSTACKS=[]}self.LLVM_SAVEDSTACKS.push(stackSave());return self.LLVM_SAVEDSTACKS.length-1}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest)}function _pthread_cond_wait(){return 0}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}var PTHREAD_SPECIFIC_NEXT_KEY=1;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":(function(date){return WEEKDAYS[date.tm_wday].substring(0,3)}),"%A":(function(date){return WEEKDAYS[date.tm_wday]}),"%b":(function(date){return MONTHS[date.tm_mon].substring(0,3)}),"%B":(function(date){return MONTHS[date.tm_mon]}),"%C":(function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)}),"%d":(function(date){return leadingNulls(date.tm_mday,2)}),"%e":(function(date){return leadingSomething(date.tm_mday,2," ")}),"%g":(function(date){return getWeekBasedYear(date).toString().substring(2)}),"%G":(function(date){return getWeekBasedYear(date)}),"%H":(function(date){return leadingNulls(date.tm_hour,2)}),"%I":(function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)}),"%j":(function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)}),"%m":(function(date){return leadingNulls(date.tm_mon+1,2)}),"%M":(function(date){return leadingNulls(date.tm_min,2)}),"%n":(function(){return"\n"}),"%p":(function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}}),"%S":(function(date){return leadingNulls(date.tm_sec,2)}),"%t":(function(){return"\t"}),"%u":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7}),"%U":(function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"}),"%V":(function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)}),"%Z":(function(date){return date.tm_zone}),"%%":(function(){return"%"})};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["wasmTableSize"]=736;Module["wasmMaxTableSize"]=736;var asmGlobalArg={};Module.asmLibraryArg={"d":abort,"ga":abortOnCannotGrowMemory,"u":___assert_fail,"D":___cxa_allocate_exception,"A":___cxa_throw,"Q":___cxa_uncaught_exception,"x":___lock,"I":___map_file,"w":___setErrNo,"H":___syscall140,"fa":___syscall145,"G":___syscall146,"ea":___syscall54,"da":___syscall6,"ca":___syscall91,"v":___unlock,"ba":__embind_finalize_value_object,"aa":__embind_register_bool,"h":__embind_register_class,"m":__embind_register_class_constructor,"f":__embind_register_class_function,"c":__embind_register_class_property,"$":__embind_register_emval,"r":__embind_register_enum,"q":__embind_register_enum_value,"F":__embind_register_float,"l":__embind_register_function,"i":__embind_register_integer,"g":__embind_register_memory_view,"E":__embind_register_std_string,"_":__embind_register_std_wstring,"Z":__embind_register_value_object,"C":__embind_register_value_object_field,"Y":__embind_register_void,"t":__emval_as,"B":__emval_call_method,"X":__emval_call_void_method,"e":__emval_decref,"W":__emval_get_global,"s":__emval_get_method_caller,"z":__emval_get_property,"y":__emval_incref,"V":__emval_new,"U":__emval_new_cstring,"o":__emval_run_destructors,"T":__emval_set_property,"n":__emval_take_value,"b":_abort,"S":_emscripten_get_heap_size,"R":_emscripten_memcpy_big,"P":_emscripten_resize_heap,"p":_getenv,"k":_llvm_stackrestore,"j":_llvm_stacksave,"O":_pthread_cond_wait,"N":_pthread_getspecific,"M":_pthread_key_create,"L":_pthread_once,"K":_pthread_setspecific,"J":_strftime_l,"a":DYNAMICTOP_PTR};var asm=Module["asm"](asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=(function(){return Module["asm"]["ha"].apply(null,arguments)});var __GLOBAL__sub_I_iostream_cpp=Module["__GLOBAL__sub_I_iostream_cpp"]=(function(){return Module["asm"]["ia"].apply(null,arguments)});var __GLOBAL__sub_I_wrapper_cpp=Module["__GLOBAL__sub_I_wrapper_cpp"]=(function(){return Module["asm"]["ja"].apply(null,arguments)});var __ZSt18uncaught_exceptionv=Module["__ZSt18uncaught_exceptionv"]=(function(){return Module["asm"]["ka"].apply(null,arguments)});var ___getTypeName=Module["___getTypeName"]=(function(){return Module["asm"]["la"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["ma"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["na"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["Ia"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["Ja"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["oa"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["pa"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["qa"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["ra"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["sa"].apply(null,arguments)});var dynCall_iiiiid=Module["dynCall_iiiiid"]=(function(){return Module["asm"]["ta"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["ua"].apply(null,arguments)});var dynCall_iiiiiid=Module["dynCall_iiiiiid"]=(function(){return Module["asm"]["va"].apply(null,arguments)});var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=(function(){return Module["asm"]["wa"].apply(null,arguments)});var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=(function(){return Module["asm"]["xa"].apply(null,arguments)});var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=(function(){return Module["asm"]["ya"].apply(null,arguments)});var dynCall_iiiiij=Module["dynCall_iiiiij"]=(function(){return Module["asm"]["za"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["Aa"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["Ba"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["Ca"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["Da"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["Ea"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["Fa"].apply(null,arguments)});var dynCall_viiiiii=Module["dynCall_viiiiii"]=(function(){return Module["asm"]["Ga"].apply(null,arguments)});var dynCall_viijii=Module["dynCall_viijii"]=(function(){return Module["asm"]["Ha"].apply(null,arguments)});Module["asm"]=asm;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run() + + + diff --git a/lorgar/lib/em/wrapper.wasm b/lorgar/lib/em/wrapper.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a80529cf3ae15835b4d4f8fe2c355e668ee6e245 GIT binary patch literal 256902 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
Ht9_H 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�nCCM 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 E0Tc)@DF6Tf literal 0 HcmV?d00001 diff --git a/lorgar/lib/mp3/CMakeLists.txt b/lorgar/lib/mp3/CMakeLists.txt deleted file mode 100644 index 19576d4..0000000 --- a/lorgar/lib/mp3/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) - -configure_file(mp3.js mp3.js) diff --git a/lorgar/lib/mp3/mp3.js b/lorgar/lib/mp3/mp3.js deleted file mode 100644 index 8631e7d..0000000 --- a/lorgar/lib/mp3/mp3.js +++ /dev/null @@ -1,7706 +0,0 @@ -(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 \ No newline at end of file diff --git a/lorgar/main.js b/lorgar/main.js index 7627ece..2dbe195 100644 --- a/lorgar/main.js +++ b/lorgar/main.js @@ -1,10 +1,7 @@ "use strict"; (function main_js() { requirejs.config({ - "baseUrl": "/", - "shim": { - "lib/mp3/mp3": ["lib/aurora/aurora"] - } + "baseUrl": "/" }); requirejs.onError = function(e) { throw e; @@ -14,7 +11,8 @@ defineArray.push("test/test"); defineArray.push("core/lorgar"); defineArray.push("lib/utils/globalMethods"); - defineArray.push("lib/mp3/mp3"); + defineArray.push("lib/em/wrapper"); + require(defineArray, function main_module() { require("lib/utils/globalMethods"); @@ -24,6 +22,8 @@ var Controller = require("lib/wController/controller"); var View = require("views/view"); + window.Mp3Decoder = Module.Decoder; + var waiter = { views: false, controllers: false, diff --git a/lorgar/views/CMakeLists.txt b/lorgar/views/CMakeLists.txt index d8df8e5..7e9ad6f 100644 --- a/lorgar/views/CMakeLists.txt +++ b/lorgar/views/CMakeLists.txt @@ -14,5 +14,6 @@ configure_file(image.js image.js) configure_file(button.js button.js) configure_file(enumeration.js enumeration.js) configure_file(player.js player.js) +configure_file(songProgress.js songProgress.js) add_subdirectory(helpers) diff --git a/lorgar/views/player.js b/lorgar/views/player.js index 160333c..9013cac 100644 --- a/lorgar/views/player.js +++ b/lorgar/views/player.js @@ -8,6 +8,7 @@ deps.push("views/label"); deps.push("views/view"); deps.push("views/image"); + deps.push("views/songProgress"); deps.push("lib/wController/localModel"); @@ -19,6 +20,7 @@ var Label = require("views/label"); var View = require("views/view"); var Image = require("views/image"); + var SongProgress = require("views/songProgress"); var Model = require("lib/wController/localModel"); @@ -34,6 +36,7 @@ this._next = null; this._picture = null; this._cpbCtrl = null; + this._infoModels = { artist: new Model(null, "artist: unknown"), album: new Model(null, "album: unknown"), @@ -46,12 +49,14 @@ var artist = new Label(this._infoModels.artist); var album = new Label(this._infoModels.album); var song = new Label(this._infoModels.song); - var spacer = new View(helper); + var spacer = new View(helper, {maxWidth: 50}); + var progress = new SongProgress(ctrl.progress); this.append(artist, 0, 4, 1, 1, GridLayout.Aligment.LeftCenter); this.append(song, 1, 4, 1, 1, GridLayout.Aligment.LeftCenter); this.append(album, 2, 4, 1, 1, GridLayout.Aligment.LeftCenter); - this.append(spacer, 0, 5, 3, 1, GridLayout.Aligment.LeftCenter); + this.append(spacer, 0, 6, 3, 1, GridLayout.Aligment.LeftCenter); + this.append(progress, 1, 5, 1, 1, GridLayout.Aligment.CenterCenter); this._uncyclic.push(this._infoModels.artist.destructor.bind(this._infoModels.artist)); this._uncyclic.push(this._infoModels.song.destructor.bind(this._infoModels.song)); diff --git a/lorgar/views/songProgress.js b/lorgar/views/songProgress.js new file mode 100644 index 0000000..02c153d --- /dev/null +++ b/lorgar/views/songProgress.js @@ -0,0 +1,76 @@ +"use strict"; +(function() { + var moduleName = "views/songProgress"; + + var deps = []; + deps.push("views/view"); + + define(moduleName, deps, function() { + var View = require("views/view"); + + var SongProgress = View.inherit({ + className: "SongProgress", + constructor: function(controller, options) { + var base = { + minHeight: 10, + maxHeight: 10 + }; + W.extend(base, options) + var el = document.createElement("div"); + this._createBars(); + View.fn.constructor.call(this, controller, base, el); + + this._f.on("load", this._onLoad, this); + this._f.on("playback", this._onPlayback, this); + + this._e.style.backgroundColor = "#eeeeee"; + this._e.appendChild(this._loadProgress); + this._e.appendChild(this._playbackProgress); + }, + destructor: function() { + this._f.off("load", this._onLoad, this); + this._f.off("playback", this._onPlayback, this); + + View.fn.destructor.call(this); + }, + _createBars: function() { + + this._loadProgress = document.createElement("div"); + this._playbackProgress = document.createElement("div"); + + this._loadProgress.style.backgroundColor = View.theme.secondaryColor || "#ffff00"; + this._loadProgress.style.height = "100%"; + this._loadProgress.style.width = "0"; + this._loadProgress.style.position = "absolute"; + this._loadProgress.style.top = "0"; + this._loadProgress.style.left = "0"; + + this._playbackProgress.style.backgroundColor = View.theme.primaryColor || "#ff0000"; + this._playbackProgress.style.height = "100%"; + this._playbackProgress.style.width = "0"; + this._playbackProgress.style.position = "absolute"; + this._playbackProgress.style.top = "0"; + this._playbackProgress.style.left = "0"; + }, + _onData: function() { + this._onLoad(this._f.load); + this._onPlayback(this._f.playback); + }, + _onLoad: function(load) { + this._loadProgress.style.width = load * 100 + "%"; + }, + _onPlayback: function(pb) { + this._playbackProgress.style.width = pb * 100 + "%"; + }, + _resetTheme: function() { + View.fn._resetTheme.call(this); + + this._loadProgress.style.backgroundColor = View.theme.secondaryColor || "#ffff00" + this._playbackProgress.style.backgroundColor = View.theme.primaryColor || "#ff0000"; + } + }); + + return SongProgress; + }) +})(); + diff --git a/magnus/app.js b/magnus/app.js index 389ab9c..451dcfe 100644 --- a/magnus/app.js +++ b/magnus/app.js @@ -3,6 +3,8 @@ var morgan = require("morgan"); var favicon = require("serve-favicon"); var Magnus = require("./core/magnus"); +express.static.mime.types.wasm = 'application/wasm'; + require("./lib/utils/globalMethods"); var config = require("./config");