Skip to content

Commit 356eab4

Browse files
committed
Scan all buffered data looking for JPEG end
This is much more efficient than looking at two bytes at a time.
1 parent d5b18a8 commit 356eab4

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

core/decoders/jpeg.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,18 +119,33 @@ export default class JPEGDecoder {
119119
let extra = 0;
120120
if (type === 0xDA) {
121121
// start of scan
122-
extra += 2;
122+
if (sock.rQwait("JPEG", length-2 + 2, 4)) {
123+
return null;
124+
}
125+
126+
let len = sock.rQlen();
127+
let data = sock.rQpeekBytes(len, false);
128+
123129
while (true) {
124-
if (sock.rQwait("JPEG", length-2+extra, 4)) {
130+
let idx = data.indexOf(0xFF, length-2+extra);
131+
if (idx === -1) {
132+
sock.rQwait("JPEG", Infinity, 4);
125133
return null;
126134
}
127-
let data = sock.rQpeekBytes(length-2+extra, false);
128-
if (data.at(-2) === 0xFF && data.at(-1) !== 0x00 &&
129-
!(data.at(-1) >= 0xD0 && data.at(-1) <= 0xD7)) {
130-
extra -= 2;
131-
break;
135+
136+
if (idx === len-1) {
137+
sock.rQwait("JPEG", Infinity, 4);
138+
return null;
132139
}
133-
extra++;
140+
141+
if (data.at(idx+1) === 0x00 ||
142+
(data.at(idx+1) >= 0xD0 && data.at(idx+1) <= 0xD7)) {
143+
extra = idx+2 - (length-2);
144+
continue;
145+
}
146+
147+
extra = idx - (length-2);
148+
break;
134149
}
135150
}
136151

0 commit comments

Comments
 (0)