ampache/ampache

View on GitHub
public/lib/modules/aurora.js/alac.js

Summary

Maintainability
F
5 days
Test Coverage
(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<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
// Generated by CoffeeScript 1.7.1
(function() {
  var Aglib;

  Aglib = (function() {
    var BITOFF, KB0, MAX_DATATYPE_BITS_16, MAX_PREFIX_16, MAX_PREFIX_32, MAX_RUN_DEFAULT, MB0, MDENSHIFT, MMULSHIFT, MOFF, N_MAX_MEAN_CLAMP, N_MEAN_CLAMP_VAL, PB0, QB, QBSHIFT, dyn_get_16, dyn_get_32, lead;

    function Aglib() {}

    PB0 = 40;

    MB0 = 10;

    KB0 = 14;

    MAX_RUN_DEFAULT = 255;

    MAX_PREFIX_16 = 9;

    MAX_PREFIX_32 = 9;

    QBSHIFT = 9;

    QB = 1 << QBSHIFT;

    MMULSHIFT = 2;

    MDENSHIFT = QBSHIFT - MMULSHIFT - 1;

    MOFF = 1 << (MDENSHIFT - 2);

    N_MAX_MEAN_CLAMP = 0xFFFF;

    N_MEAN_CLAMP_VAL = 0xFFFF;

    MMULSHIFT = 2;

    BITOFF = 24;

    MAX_DATATYPE_BITS_16 = 16;

    lead = function(input) {
      var curbyte, output;
      output = 0;
      curbyte = 0;
      while (true) {
        curbyte = input >>> 24;
        if (curbyte) {
          break;
        }
        output += 8;
        curbyte = input >>> 16;
        if (curbyte & 0xff) {
          break;
        }
        output += 8;
        curbyte = input >>> 8;
        if (curbyte & 0xff) {
          break;
        }
        output += 8;
        curbyte = input;
        if (curbyte & 0xff) {
          break;
        }
        output += 8;
        return output;
      }
      if (curbyte & 0xf0) {
        curbyte >>>= 4;
      } else {
        output += 4;
      }
      if (curbyte & 0x8) {
        return output;
      }
      if (curbyte & 0x4) {
        return output + 1;
      }
      if (curbyte & 0x2) {
        return output + 2;
      }
      if (curbyte & 0x1) {
        return output + 3;
      }
      return output + 4;
    };

    dyn_get_16 = function(data, m, k) {
      var bitsInPrefix, offs, result, stream, v;
      offs = data.bitPosition;
      stream = data.peek(32 - offs) << offs;
      bitsInPrefix = lead(~stream);
      if (bitsInPrefix >= MAX_PREFIX_16) {
        data.advance(MAX_PREFIX_16 + MAX_DATATYPE_BITS_16);
        stream <<= MAX_PREFIX_16;
        result = stream >>> (32 - MAX_DATATYPE_BITS_16);
      } else {
        data.advance(bitsInPrefix + k);
        stream <<= bitsInPrefix + 1;
        v = stream >>> (32 - k);
        result = bitsInPrefix * m + v - 1;
        if (v < 2) {
          result -= v - 1;
        } else {
          data.advance(1);
        }
      }
      return result;
    };

    dyn_get_32 = function(data, m, k, maxbits) {
      var offs, result, stream, v;
      offs = data.bitPosition;
      stream = data.peek(32 - offs) << offs;
      result = lead(~stream);
      if (result >= MAX_PREFIX_32) {
        data.advance(MAX_PREFIX_32);
        return data.read(maxbits);
      } else {
        data.advance(result + 1);
        if (k !== 1) {
          stream <<= result + 1;
          result *= m;
          v = stream >>> (32 - k);
          data.advance(k - 1);
          if (v > 1) {
            result += v - 1;
            data.advance(1);
          }
        }
      }
      return result;
    };

    Aglib.ag_params = function(m, p, k, f, s, maxrun) {
      return {
        mb: m,
        mb0: m,
        pb: p,
        kb: k,
        wb: (1 << k) - 1,
        qb: QB - p,
        fw: f,
        sw: s,
        maxrun: maxrun
      };
    };

    Aglib.dyn_decomp = function(params, data, pc, samples, maxSize) {
      var c, j, k, kb, m, mb, multiplier, mz, n, ndecode, pb, wb, zmode, _i;
      pb = params.pb, kb = params.kb, wb = params.wb, mb = params.mb0;
      zmode = 0;
      c = 0;
      while (c < samples) {
        m = mb >>> QBSHIFT;
        k = Math.min(31 - lead(m + 3), kb);
        m = (1 << k) - 1;
        n = dyn_get_32(data, m, k, maxSize);
        ndecode = n + zmode;
        multiplier = -(ndecode & 1) | 1;
        pc[c++] = ((ndecode + 1) >>> 1) * multiplier;
        mb = pb * (n + zmode) + mb - ((pb * mb) >> QBSHIFT);
        if (n > N_MAX_MEAN_CLAMP) {
          mb = N_MEAN_CLAMP_VAL;
        }
        zmode = 0;
        if (((mb << MMULSHIFT) < QB) && (c < samples)) {
          zmode = 1;
          k = lead(mb) - BITOFF + ((mb + MOFF) >> MDENSHIFT);
          mz = ((1 << k) - 1) & wb;
          n = dyn_get_16(data, mz, k);
          if (!(c + n <= samples)) {
            return false;
          }
          for (j = _i = 0; _i < n; j = _i += 1) {
            pc[c++] = 0;
          }
          if (n >= 65535) {
            zmode = 0;
          }
          mb = 0;
        }
      }
      return true;
    };

    return Aglib;

  })();

  module.exports = Aglib;

}).call(this);

},{}],2:[function(require,module,exports){
// Generated by CoffeeScript 1.7.1
(function() {
  var ALACDecoder, AV, Aglib, Dplib, Matrixlib,
    __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; };

  AV = (window.AV);

  Aglib = require('./ag_dec');

  Dplib = require('./dp_dec');

  Matrixlib = require('./matrix_dec');

  ALACDecoder = (function(_super) {
    var ID_CCE, ID_CPE, ID_DSE, ID_END, ID_FIL, ID_LFE, ID_PCE, ID_SCE;

    __extends(ALACDecoder, _super);

    function ALACDecoder() {
      return ALACDecoder.__super__.constructor.apply(this, arguments);
    }

    AV.Decoder.register('alac', ALACDecoder);

    ID_SCE = 0;

    ID_CPE = 1;

    ID_CCE = 2;

    ID_LFE = 3;

    ID_DSE = 4;

    ID_PCE = 5;

    ID_FIL = 6;

    ID_END = 7;

    ALACDecoder.prototype.setCookie = function(cookie) {
      var data, predictorBuffer, _base;
      data = AV.Stream.fromBuffer(cookie);
      if (data.peekString(4, 4) === 'frma') {
        data.advance(12);
      }
      if (data.peekString(4, 4) === 'alac') {
        data.advance(12);
      }
      this.config = {
        frameLength: data.readUInt32(),
        compatibleVersion: data.readUInt8(),
        bitDepth: data.readUInt8(),
        pb: data.readUInt8(),
        mb: data.readUInt8(),
        kb: data.readUInt8(),
        numChannels: data.readUInt8(),
        maxRun: data.readUInt16(),
        maxFrameBytes: data.readUInt32(),
        avgBitRate: data.readUInt32(),
        sampleRate: data.readUInt32()
      };
      (_base = this.format).bitsPerChannel || (_base.bitsPerChannel = this.config.bitDepth);
      this.mixBuffers = [new Int32Array(this.config.frameLength), new Int32Array(this.config.frameLength)];
      predictorBuffer = new ArrayBuffer(this.config.frameLength * 4);
      this.predictor = new Int32Array(predictorBuffer);
      return this.shiftBuffer = new Int16Array(predictorBuffer);
    };

    ALACDecoder.prototype.readChunk = function(data) {
      var buf, bytesShifted, ch, chanBits, channelIndex, channels, coefs, count, dataByteAlignFlag, denShift, elementInstanceTag, end, escapeFlag, i, j, kb, maxRun, mb, mixBits, mixRes, mode, num, numChannels, out16, output, params, partialFrame, pb, pbFactor, samples, shift, shiftbits, status, table, tag, unused, val, _i, _j, _k, _l, _m, _n, _o, _ref, _ref1, _ref2;
      if (!this.stream.available(4)) {
        return;
      }
      data = this.bitstream;
      samples = this.config.frameLength;
      numChannels = this.config.numChannels;
      channelIndex = 0;
      output = new ArrayBuffer(samples * numChannels * this.config.bitDepth / 8);
      end = false;
      while (!end) {
        tag = data.read(3);
        switch (tag) {
          case ID_SCE:
          case ID_LFE:
          case ID_CPE:
            channels = tag === ID_CPE ? 2 : 1;
            if (channelIndex + channels > numChannels) {
              throw new Error('Too many channels!');
            }
            elementInstanceTag = data.read(4);
            unused = data.read(12);
            if (unused !== 0) {
              throw new Error('Unused part of header does not contain 0, it should');
            }
            partialFrame = data.read(1);
            bytesShifted = data.read(2);
            escapeFlag = data.read(1);
            if (bytesShifted === 3) {
              throw new Error("Bytes are shifted by 3, they shouldn't be");
            }
            if (partialFrame) {
              samples = data.read(32);
            }
            if (escapeFlag === 0) {
              shift = bytesShifted * 8;
              chanBits = this.config.bitDepth - shift + channels - 1;
              mixBits = data.read(8);
              mixRes = data.read(8);
              mode = [];
              denShift = [];
              pbFactor = [];
              num = [];
              coefs = [];
              for (ch = _i = 0; _i < channels; ch = _i += 1) {
                mode[ch] = data.read(4);
                denShift[ch] = data.read(4);
                pbFactor[ch] = data.read(3);
                num[ch] = data.read(5);
                table = coefs[ch] = new Int16Array(32);
                for (i = _j = 0, _ref = num[ch]; _j < _ref; i = _j += 1) {
                  table[i] = data.read(16);
                }
              }
              if (bytesShifted) {
                shiftbits = data.copy();
                data.advance(shift * channels * samples);
              }
              _ref1 = this.config, mb = _ref1.mb, pb = _ref1.pb, kb = _ref1.kb, maxRun = _ref1.maxRun;
              for (ch = _k = 0; _k < channels; ch = _k += 1) {
                params = Aglib.ag_params(mb, (pb * pbFactor[ch]) / 4, kb, samples, samples, maxRun);
                status = Aglib.dyn_decomp(params, data, this.predictor, samples, chanBits);
                if (!status) {
                  throw new Error('Error in Aglib.dyn_decomp');
                }
                if (mode[ch] === 0) {
                  Dplib.unpc_block(this.predictor, this.mixBuffers[ch], samples, coefs[ch], num[ch], chanBits, denShift[ch]);
                } else {
                  Dplib.unpc_block(this.predictor, this.predictor, samples, null, 31, chanBits, 0);
                  Dplib.unpc_block(this.predictor, this.mixBuffers[ch], samples, coefs[ch], num[ch], chanBits, denShift[ch]);
                }
              }
            } else {
              chanBits = this.config.bitDepth;
              shift = 32 - chanBits;
              for (i = _l = 0; _l < samples; i = _l += 1) {
                for (ch = _m = 0; _m < channels; ch = _m += 1) {
                  val = (data.read(chanBits) << shift) >> shift;
                  this.mixBuffers[ch][i] = val;
                }
              }
              mixBits = mixRes = 0;
              bytesShifted = 0;
            }
            if (bytesShifted) {
              shift = bytesShifted * 8;
              for (i = _n = 0, _ref2 = samples * channels; _n < _ref2; i = _n += 1) {
                this.shiftBuffer[i] = shiftbits.read(shift);
              }
            }
            switch (this.config.bitDepth) {
              case 16:
                out16 = new Int16Array(output, channelIndex);
                if (channels === 2) {
                  Matrixlib.unmix16(this.mixBuffers[0], this.mixBuffers[1], out16, numChannels, samples, mixBits, mixRes);
                } else {
                  j = 0;
                  buf = this.mixBuffers[0];
                  for (i = _o = 0; _o < samples; i = _o += 1) {
                    out16[j] = buf[i];
                    j += numChannels;
                  }
                }
                break;
              default:
                throw new Error('Only supports 16-bit samples right now');
            }
            channelIndex += channels;
            break;
          case ID_CCE:
          case ID_PCE:
            throw new Error("Unsupported element: " + tag);
            break;
          case ID_DSE:
            elementInstanceTag = data.read(4);
            dataByteAlignFlag = data.read(1);
            count = data.read(8);
            if (count === 255) {
              count += data.read(8);
            }
            if (dataByteAlignFlag) {
              data.align();
            }
            data.advance(count * 8);
            if (!(data.pos < data.length)) {
              throw new Error('buffer overrun');
            }
            break;
          case ID_FIL:
            count = data.read(4);
            if (count === 15) {
              count += data.read(8) - 1;
            }
            data.advance(count * 8);
            if (!(data.pos < data.length)) {
              throw new Error('buffer overrun');
            }
            break;
          case ID_END:
            data.align();
            end = true;
            break;
          default:
            throw new Error("Unknown element: " + tag);
        }
        if (channelIndex > numChannels) {
          throw new Error('Channel index too large.');
        }
      }
      return new Int16Array(output);
    };

    return ALACDecoder;

  })(AV.Decoder);

  module.exports = ALACDecoder;

}).call(this);

},{"./ag_dec":1,"./dp_dec":3,"./matrix_dec":4}],3:[function(require,module,exports){
// Generated by CoffeeScript 1.7.1
(function() {
  var Dplib;

  Dplib = (function() {
    var copy;

    function Dplib() {}

    copy = function(dst, dstOffset, src, srcOffset, n) {
      var destination, source;
      destination = new Uint8Array(dst, dstOffset, n);
      source = new Uint8Array(src, srcOffset, n);
      destination.set(source);
      return dst;
    };

    Dplib.unpc_block = function(pc1, out, num, coefs, active, chanbits, denshift) {
      var a0, a1, a2, a3, a4, a5, a6, a7, b0, b1, b2, b3, b4, b5, b6, b7, chanshift, dd, del, del0, denhalf, i, j, lim, offset, prev, sg, sgn, sum1, top, _i, _j, _k, _l, _m, _n, _o, _p, _ref, _ref1;
      chanshift = 32 - chanbits;
      denhalf = 1 << (denshift - 1);
      out[0] = pc1[0];
      if (active === 0) {
        return copy(out, 0, pc1, 0, num * 4);
      }
      if (active === 31) {
        prev = out[0];
        for (i = _i = 1; _i < num; i = _i += 1) {
          del = pc1[i] + prev;
          prev = (del << chanshift) >> chanshift;
          out[i] = prev;
        }
        return;
      }
      for (i = _j = 1; _j <= active; i = _j += 1) {
        del = pc1[i] + out[i - 1];
        out[i] = (del << chanshift) >> chanshift;
      }
      lim = active + 1;
      if (active === 4) {
        a0 = coefs[0], a1 = coefs[1], a2 = coefs[2], a3 = coefs[3];
        for (j = _k = lim; _k < num; j = _k += 1) {
          top = out[j - lim];
          offset = j - 1;
          b0 = top - out[offset];
          b1 = top - out[offset - 1];
          b2 = top - out[offset - 2];
          b3 = top - out[offset - 3];
          sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3) >> denshift;
          del = del0 = pc1[j];
          sg = (-del >>> 31) | (del >> 31);
          del += top + sum1;
          out[j] = (del << chanshift) >> chanshift;
          if (sg > 0) {
            sgn = (-b3 >>> 31) | (b3 >> 31);
            a3 -= sgn;
            del0 -= 1 * ((sgn * b3) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b2 >>> 31) | (b2 >> 31);
            a2 -= sgn;
            del0 -= 2 * ((sgn * b2) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b1 >>> 31) | (b1 >> 31);
            a1 -= sgn;
            del0 -= 3 * ((sgn * b1) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            a0 -= (-b0 >>> 31) | (b0 >> 31);
          } else if (sg < 0) {
            sgn = -((-b3 >>> 31) | (b3 >> 31));
            a3 -= sgn;
            del0 -= 1 * ((sgn * b3) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b2 >>> 31) | (b2 >> 31));
            a2 -= sgn;
            del0 -= 2 * ((sgn * b2) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b1 >>> 31) | (b1 >> 31));
            a1 -= sgn;
            del0 -= 3 * ((sgn * b1) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            a0 += (-b0 >>> 31) | (b0 >> 31);
          }
        }
        coefs[0] = a0;
        coefs[1] = a1;
        coefs[2] = a2;
        coefs[3] = a3;
      } else if (active === 8) {
        a0 = coefs[0], a1 = coefs[1], a2 = coefs[2], a3 = coefs[3], a4 = coefs[4], a5 = coefs[5], a6 = coefs[6], a7 = coefs[7];
        for (j = _l = lim; _l < num; j = _l += 1) {
          top = out[j - lim];
          offset = j - 1;
          b0 = top - out[offset];
          b1 = top - out[offset - 1];
          b2 = top - out[offset - 2];
          b3 = top - out[offset - 3];
          b4 = top - out[offset - 4];
          b5 = top - out[offset - 5];
          b6 = top - out[offset - 6];
          b7 = top - out[offset - 7];
          sum1 = (denhalf - a0 * b0 - a1 * b1 - a2 * b2 - a3 * b3 - a4 * b4 - a5 * b5 - a6 * b6 - a7 * b7) >> denshift;
          del = del0 = pc1[j];
          sg = (-del >>> 31) | (del >> 31);
          del += top + sum1;
          out[j] = (del << chanshift) >> chanshift;
          if (sg > 0) {
            sgn = (-b7 >>> 31) | (b7 >> 31);
            a7 -= sgn;
            del0 -= 1 * ((sgn * b7) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b6 >>> 31) | (b6 >> 31);
            a6 -= sgn;
            del0 -= 2 * ((sgn * b6) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b5 >>> 31) | (b5 >> 31);
            a5 -= sgn;
            del0 -= 3 * ((sgn * b5) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b4 >>> 31) | (b4 >> 31);
            a4 -= sgn;
            del0 -= 4 * ((sgn * b4) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b3 >>> 31) | (b3 >> 31);
            a3 -= sgn;
            del0 -= 5 * ((sgn * b3) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b2 >>> 31) | (b2 >> 31);
            a2 -= sgn;
            del0 -= 6 * ((sgn * b2) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            sgn = (-b1 >>> 31) | (b1 >> 31);
            a1 -= sgn;
            del0 -= 7 * ((sgn * b1) >> denshift);
            if (del0 <= 0) {
              continue;
            }
            a0 -= (-b0 >>> 31) | (b0 >> 31);
          } else if (sg < 0) {
            sgn = -((-b7 >>> 31) | (b7 >> 31));
            a7 -= sgn;
            del0 -= 1 * ((sgn * b7) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b6 >>> 31) | (b6 >> 31));
            a6 -= sgn;
            del0 -= 2 * ((sgn * b6) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b5 >>> 31) | (b5 >> 31));
            a5 -= sgn;
            del0 -= 3 * ((sgn * b5) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b4 >>> 31) | (b4 >> 31));
            a4 -= sgn;
            del0 -= 4 * ((sgn * b4) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b3 >>> 31) | (b3 >> 31));
            a3 -= sgn;
            del0 -= 5 * ((sgn * b3) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b2 >>> 31) | (b2 >> 31));
            a2 -= sgn;
            del0 -= 6 * ((sgn * b2) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            sgn = -((-b1 >>> 31) | (b1 >> 31));
            a1 -= sgn;
            del0 -= 7 * ((sgn * b1) >> denshift);
            if (del0 >= 0) {
              continue;
            }
            a0 += (-b0 >>> 31) | (b0 >> 31);
          }
        }
        coefs[0] = a0;
        coefs[1] = a1;
        coefs[2] = a2;
        coefs[3] = a3;
        coefs[4] = a4;
        coefs[5] = a5;
        coefs[6] = a6;
        coefs[7] = a7;
      } else {
        for (i = _m = lim; _m < num; i = _m += 1) {
          sum1 = 0;
          top = out[i - lim];
          offset = i - 1;
          for (j = _n = 0; _n < active; j = _n += 1) {
            sum1 += coefs[j] * (out[offset - j] - top);
          }
          del = del0 = pc1[i];
          sg = (-del >>> 31) | (del >> 31);
          del += top + ((sum1 + denhalf) >> denshift);
          out[i] = (del << chanshift) >> chanshift;
          if (sg > 0) {
            for (j = _o = _ref = active - 1; _o >= 0; j = _o += -1) {
              dd = top - out[offset - j];
              sgn = (-dd >>> 31) | (dd >> 31);
              coefs[j] -= sgn;
              del0 -= (active - j) * ((sgn * dd) >> denshift);
              if (del0 <= 0) {
                break;
              }
            }
          } else if (sg < 0) {
            for (j = _p = _ref1 = active - 1; _p >= 0; j = _p += -1) {
              dd = top - out[offset - j];
              sgn = (-dd >>> 31) | (dd >> 31);
              coefs[j] += sgn;
              del0 -= (active - j) * ((-sgn * dd) >> denshift);
              if (del0 >= 0) {
                break;
              }
            }
          }
        }
      }
    };

    return Dplib;

  })();

  module.exports = Dplib;

}).call(this);

},{}],4:[function(require,module,exports){
// Generated by CoffeeScript 1.7.1
(function() {
  var Matrixlib;

  Matrixlib = (function() {
    function Matrixlib() {}

    Matrixlib.unmix16 = function(u, v, out, stride, samples, mixbits, mixres) {
      var i, l, _i, _j;
      if (mixres === 0) {
        for (i = _i = 0; _i < samples; i = _i += 1) {
          out[i * stride + 0] = u[i];
          out[i * stride + 1] = v[i];
        }
      } else {
        for (i = _j = 0; _j < samples; i = _j += 1) {
          l = u[i] + v[i] - ((mixres * v[i]) >> mixbits);
          out[i * stride + 0] = l;
          out[i * stride + 1] = l - v[i];
        }
      }
    };

    return Matrixlib;

  })();

  module.exports = Matrixlib;

}).call(this);

},{}]},{},[2])


//# sourceMappingURL=alac.js.map