From 356eab4f4d259b6db7d1c7b84d43408b2e7acb09 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Wed, 3 Sep 2025 11:24:34 +0200 Subject: [PATCH] Scan all buffered data looking for JPEG end This is much more efficient than looking at two bytes at a time. --- core/decoders/jpeg.js | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/core/decoders/jpeg.js b/core/decoders/jpeg.js index 5fd1e056..f7984603 100644 --- a/core/decoders/jpeg.js +++ b/core/decoders/jpeg.js @@ -119,18 +119,33 @@ export default class JPEGDecoder { let extra = 0; if (type === 0xDA) { // start of scan - extra += 2; + if (sock.rQwait("JPEG", length-2 + 2, 4)) { + return null; + } + + let len = sock.rQlen(); + let data = sock.rQpeekBytes(len, false); + while (true) { - if (sock.rQwait("JPEG", length-2+extra, 4)) { + let idx = data.indexOf(0xFF, length-2+extra); + if (idx === -1) { + sock.rQwait("JPEG", Infinity, 4); return null; } - let data = sock.rQpeekBytes(length-2+extra, false); - if (data.at(-2) === 0xFF && data.at(-1) !== 0x00 && - !(data.at(-1) >= 0xD0 && data.at(-1) <= 0xD7)) { - extra -= 2; - break; + + if (idx === len-1) { + sock.rQwait("JPEG", Infinity, 4); + return null; } - extra++; + + if (data.at(idx+1) === 0x00 || + (data.at(idx+1) >= 0xD0 && data.at(idx+1) <= 0xD7)) { + extra = idx+2 - (length-2); + continue; + } + + extra = idx - (length-2); + break; } }