'use strict';
/* eslint-disable consistent-return */
var readUInt16BE = require('../common').readUInt16BE;
module.exports = function (data) {
if (data.length < 2) return;
// first marker of the file MUST be 0xFFD8
if (data[0] !== 0xFF || data[1] !== 0xD8) return;
var offset = 2;
for (;;) {
if (data.length - offset < 2) return;
// not a JPEG marker
if (data[offset++] !== 0xFF) return;
var code = data[offset++];
var length;
// skip padding bytes
while (code === 0xFF) code = data[offset++];
// standalone markers, according to JPEG 1992,
// http://www.w3.org/Graphics/JPEG/itu-t81.pdf, see Table B.1
if ((0xD0 <= code && code <= 0xD9) || code === 0x01) {
length = 0;
} else if (0xC0 <= code && code <= 0xFE) {
// the rest of the unreserved markers
if (data.length - offset < 2) return;
length = readUInt16BE(data, offset) - 2;
offset += 2;
} else {
// unknown markers
return;
}
if (code === 0xD9 /* EOI */ || code === 0xDA /* SOS */) {
// end of the datastream
return;
}
if (length >= 5 &&
(0xC0 <= code && code <= 0xCF) &&
code !== 0xC4 && code !== 0xC8 && code !== 0xCC) {
if (data.length - offset < length) return;
return {
width: readUInt16BE(data, offset + 3),
height: readUInt16BE(data, offset + 1),
type: 'jpg',
mime: 'image/jpeg',
wUnits: 'px',
hUnits: 'px'
};
}
offset += length;
}
};