cod.selectiveArithmeticCodingBypass ||
cod.resetContextProbabilities ||
cod.terminationOnEachCodingPass ||
- cod.verticalyStripe || cod.predictableTermination ||
- cod.segmentationSymbolUsed)
+ cod.verticalyStripe || cod.predictableTermination)
throw 'Unsupported COD options: ' + uneval(cod);
if (context.mainHeader)
return position;
}
function copyCoefficients(coefficients, x0, y0, width, height,
- delta, mb, codeblocks, transformation) {
+ delta, mb, codeblocks, transformation,
+ segmentationSymbolUsed) {
var r = 0.5; // formula (E-6)
for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
var codeblock = codeblocks[i];
break;
case 2:
bitModel.runCleanupPass();
+ if (segmentationSymbolUsed)
+ bitModel.checkSegmentationSymbol();
break;
}
currentCodingpassType = (currentCodingpassType + 1) % 3;
var scalarExpounded = quantizationParameters.scalarExpounded;
var guardBits = quantizationParameters.guardBits;
var transformation = codingStyleParameters.transformation;
+ var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
var precision = context.components[c].precision;
var subbandCoefficients = [];
var coefficients = new Float32Array(width * height);
copyCoefficients(coefficients, subband.tbx0, subband.tby0,
- width, height, delta, mb, subband.codeblocks, transformation);
+ width, height, delta, mb, subband.codeblocks, transformation,
+ segmentationSymbolUsed);
subbandCoefficients.push({
width: width,
}
}
}
+ },
+ checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
+ var decoder = this.decoder;
+ var cx = this.uniformContext;
+ var symbol = (decoder.readBit(cx) << 3) | (decoder.readBit(cx) << 2) |
+ (decoder.readBit(cx) << 1) | decoder.readBit(cx);
+ if (symbol != 0xA)
+ throw 'Invalid segmentation symbol';
}
};