Skip to content

Commit f4c16aa

Browse files
committed
Merge pull request mozilla#1882 from yurydelendik/jpx-segsymbol
Segmentation symbol check for JPX
2 parents f98db29 + 48e115c commit f4c16aa

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

src/jpx.js

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,7 @@ var JpxImage = (function JpxImageClosure() {
254254
cod.selectiveArithmeticCodingBypass ||
255255
cod.resetContextProbabilities ||
256256
cod.terminationOnEachCodingPass ||
257-
cod.verticalyStripe || cod.predictableTermination ||
258-
cod.segmentationSymbolUsed)
257+
cod.verticalyStripe || cod.predictableTermination)
259258
throw 'Unsupported COD options: ' + uneval(cod);
260259

261260
if (context.mainHeader)
@@ -832,7 +831,8 @@ var JpxImage = (function JpxImageClosure() {
832831
return position;
833832
}
834833
function copyCoefficients(coefficients, x0, y0, width, height,
835-
delta, mb, codeblocks, transformation) {
834+
delta, mb, codeblocks, transformation,
835+
segmentationSymbolUsed) {
836836
var r = 0.5; // formula (E-6)
837837
for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
838838
var codeblock = codeblocks[i];
@@ -876,6 +876,8 @@ var JpxImage = (function JpxImageClosure() {
876876
break;
877877
case 2:
878878
bitModel.runCleanupPass();
879+
if (segmentationSymbolUsed)
880+
bitModel.checkSegmentationSymbol();
879881
break;
880882
}
881883
currentCodingpassType = (currentCodingpassType + 1) % 3;
@@ -912,6 +914,7 @@ var JpxImage = (function JpxImageClosure() {
912914
var scalarExpounded = quantizationParameters.scalarExpounded;
913915
var guardBits = quantizationParameters.guardBits;
914916
var transformation = codingStyleParameters.transformation;
917+
var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
915918
var precision = context.components[c].precision;
916919

917920
var subbandCoefficients = [];
@@ -942,7 +945,8 @@ var JpxImage = (function JpxImageClosure() {
942945

943946
var coefficients = new Float32Array(width * height);
944947
copyCoefficients(coefficients, subband.tbx0, subband.tby0,
945-
width, height, delta, mb, subband.codeblocks, transformation);
948+
width, height, delta, mb, subband.codeblocks, transformation,
949+
segmentationSymbolUsed);
946950

947951
subbandCoefficients.push({
948952
width: width,
@@ -1645,6 +1649,14 @@ var JpxImage = (function JpxImageClosure() {
16451649
}
16461650
}
16471651
}
1652+
},
1653+
checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
1654+
var decoder = this.decoder;
1655+
var cx = this.uniformContext;
1656+
var symbol = (decoder.readBit(cx) << 3) | (decoder.readBit(cx) << 2) |
1657+
(decoder.readBit(cx) << 1) | decoder.readBit(cx);
1658+
if (symbol != 0xA)
1659+
throw 'Invalid segmentation symbol';
16481660
}
16491661
};
16501662

0 commit comments

Comments
 (0)