Assign the quantizationTables after parsing the entire JPEG image, to prevent issues when the DQT (Define Quantization Tables) marker is encountered after SOF{n} (Start of Frame) markers (issue 7406)

This is a tentative patch that fixes 7406.
This commit is contained in:
Jonas Jenwald 2016-06-13 13:29:32 +02:00
parent 23b13d368e
commit 1bbc694ac3

View File

@ -387,6 +387,10 @@ var JpegImage = (function jpegImage() {
var p0, p1, p2, p3, p4, p5, p6, p7;
var t;
if (!qt) {
throw 'missing required Quantization Table.';
}
// inverse DCT on rows
for (var row = 0; row < 64; row += 8) {
// gather block data
@ -738,7 +742,8 @@ var JpegImage = (function jpegImage() {
l = frame.components.push({
h: h,
v: v,
quantizationTable: quantizationTables[qId]
quantizationId: qId,
quantizationTable: null, // See comment below.
});
frame.componentIds[componentId] = l - 1;
offset += 3;
@ -822,6 +827,15 @@ var JpegImage = (function jpegImage() {
this.components = [];
for (i = 0; i < frame.components.length; i++) {
component = frame.components[i];
// Prevent errors when DQT markers are placed after SOF{n} markers,
// by assigning the `quantizationTable` entry after the entire image
// has been parsed (fixes issue7406.pdf).
var quantizationTable = quantizationTables[component.quantizationId];
if (quantizationTable) {
component.quantizationTable = quantizationTable;
}
this.components.push({
output: buildComponentData(frame, component),
scaleX: component.h / frame.maxH,