You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
355 lines
6.5 KiB
355 lines
6.5 KiB
/** |
|
* @licstart The following is the entire license notice for the |
|
* Javascript code in this page |
|
* |
|
* Copyright 2017 Mozilla Foundation |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* |
|
* @licend The above is the entire license notice for the |
|
* Javascript code in this page |
|
*/ |
|
"use strict"; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
var ArithmeticDecoder = function ArithmeticDecoderClosure() { |
|
var QeTable = [{ |
|
qe: 0x5601, |
|
nmps: 1, |
|
nlps: 1, |
|
switchFlag: 1 |
|
}, { |
|
qe: 0x3401, |
|
nmps: 2, |
|
nlps: 6, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1801, |
|
nmps: 3, |
|
nlps: 9, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0AC1, |
|
nmps: 4, |
|
nlps: 12, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0521, |
|
nmps: 5, |
|
nlps: 29, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0221, |
|
nmps: 38, |
|
nlps: 33, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x5601, |
|
nmps: 7, |
|
nlps: 6, |
|
switchFlag: 1 |
|
}, { |
|
qe: 0x5401, |
|
nmps: 8, |
|
nlps: 14, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x4801, |
|
nmps: 9, |
|
nlps: 14, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x3801, |
|
nmps: 10, |
|
nlps: 14, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x3001, |
|
nmps: 11, |
|
nlps: 17, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x2401, |
|
nmps: 12, |
|
nlps: 18, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1C01, |
|
nmps: 13, |
|
nlps: 20, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1601, |
|
nmps: 29, |
|
nlps: 21, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x5601, |
|
nmps: 15, |
|
nlps: 14, |
|
switchFlag: 1 |
|
}, { |
|
qe: 0x5401, |
|
nmps: 16, |
|
nlps: 14, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x5101, |
|
nmps: 17, |
|
nlps: 15, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x4801, |
|
nmps: 18, |
|
nlps: 16, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x3801, |
|
nmps: 19, |
|
nlps: 17, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x3401, |
|
nmps: 20, |
|
nlps: 18, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x3001, |
|
nmps: 21, |
|
nlps: 19, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x2801, |
|
nmps: 22, |
|
nlps: 19, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x2401, |
|
nmps: 23, |
|
nlps: 20, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x2201, |
|
nmps: 24, |
|
nlps: 21, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1C01, |
|
nmps: 25, |
|
nlps: 22, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1801, |
|
nmps: 26, |
|
nlps: 23, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1601, |
|
nmps: 27, |
|
nlps: 24, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1401, |
|
nmps: 28, |
|
nlps: 25, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1201, |
|
nmps: 29, |
|
nlps: 26, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x1101, |
|
nmps: 30, |
|
nlps: 27, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0AC1, |
|
nmps: 31, |
|
nlps: 28, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x09C1, |
|
nmps: 32, |
|
nlps: 29, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x08A1, |
|
nmps: 33, |
|
nlps: 30, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0521, |
|
nmps: 34, |
|
nlps: 31, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0441, |
|
nmps: 35, |
|
nlps: 32, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x02A1, |
|
nmps: 36, |
|
nlps: 33, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0221, |
|
nmps: 37, |
|
nlps: 34, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0141, |
|
nmps: 38, |
|
nlps: 35, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0111, |
|
nmps: 39, |
|
nlps: 36, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0085, |
|
nmps: 40, |
|
nlps: 37, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0049, |
|
nmps: 41, |
|
nlps: 38, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0025, |
|
nmps: 42, |
|
nlps: 39, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0015, |
|
nmps: 43, |
|
nlps: 40, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0009, |
|
nmps: 44, |
|
nlps: 41, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0005, |
|
nmps: 45, |
|
nlps: 42, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x0001, |
|
nmps: 45, |
|
nlps: 43, |
|
switchFlag: 0 |
|
}, { |
|
qe: 0x5601, |
|
nmps: 46, |
|
nlps: 46, |
|
switchFlag: 0 |
|
}]; |
|
function ArithmeticDecoder(data, start, end) { |
|
this.data = data; |
|
this.bp = start; |
|
this.dataEnd = end; |
|
this.chigh = data[start]; |
|
this.clow = 0; |
|
this.byteIn(); |
|
this.chigh = this.chigh << 7 & 0xFFFF | this.clow >> 9 & 0x7F; |
|
this.clow = this.clow << 7 & 0xFFFF; |
|
this.ct -= 7; |
|
this.a = 0x8000; |
|
} |
|
ArithmeticDecoder.prototype = { |
|
byteIn: function ArithmeticDecoder_byteIn() { |
|
var data = this.data; |
|
var bp = this.bp; |
|
if (data[bp] === 0xFF) { |
|
var b1 = data[bp + 1]; |
|
if (b1 > 0x8F) { |
|
this.clow += 0xFF00; |
|
this.ct = 8; |
|
} else { |
|
bp++; |
|
this.clow += data[bp] << 9; |
|
this.ct = 7; |
|
this.bp = bp; |
|
} |
|
} else { |
|
bp++; |
|
this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00; |
|
this.ct = 8; |
|
this.bp = bp; |
|
} |
|
if (this.clow > 0xFFFF) { |
|
this.chigh += this.clow >> 16; |
|
this.clow &= 0xFFFF; |
|
} |
|
}, |
|
readBit: function ArithmeticDecoder_readBit(contexts, pos) { |
|
var cx_index = contexts[pos] >> 1, |
|
cx_mps = contexts[pos] & 1; |
|
var qeTableIcx = QeTable[cx_index]; |
|
var qeIcx = qeTableIcx.qe; |
|
var d; |
|
var a = this.a - qeIcx; |
|
if (this.chigh < qeIcx) { |
|
if (a < qeIcx) { |
|
a = qeIcx; |
|
d = cx_mps; |
|
cx_index = qeTableIcx.nmps; |
|
} else { |
|
a = qeIcx; |
|
d = 1 ^ cx_mps; |
|
if (qeTableIcx.switchFlag === 1) { |
|
cx_mps = d; |
|
} |
|
cx_index = qeTableIcx.nlps; |
|
} |
|
} else { |
|
this.chigh -= qeIcx; |
|
if ((a & 0x8000) !== 0) { |
|
this.a = a; |
|
return cx_mps; |
|
} |
|
if (a < qeIcx) { |
|
d = 1 ^ cx_mps; |
|
if (qeTableIcx.switchFlag === 1) { |
|
cx_mps = d; |
|
} |
|
cx_index = qeTableIcx.nlps; |
|
} else { |
|
d = cx_mps; |
|
cx_index = qeTableIcx.nmps; |
|
} |
|
} |
|
do { |
|
if (this.ct === 0) { |
|
this.byteIn(); |
|
} |
|
a <<= 1; |
|
this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1; |
|
this.clow = this.clow << 1 & 0xFFFF; |
|
this.ct--; |
|
} while ((a & 0x8000) === 0); |
|
this.a = a; |
|
contexts[pos] = cx_index << 1 | cx_mps; |
|
return d; |
|
} |
|
}; |
|
return ArithmeticDecoder; |
|
}(); |
|
exports.ArithmeticDecoder = ArithmeticDecoder; |