|
|
|
@ -3383,6 +3383,28 @@ static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) |
|
|
|
|
{ |
|
|
|
|
// some JPEGs have junk at end, skip over it but if we find what looks
|
|
|
|
|
// like a valid marker, resume there
|
|
|
|
|
while (!stbi__at_eof(j->s)) { |
|
|
|
|
int x = stbi__get8(j->s); |
|
|
|
|
while (x == 255) { // might be a marker
|
|
|
|
|
if (stbi__at_eof(j->s)) return STBI__MARKER_none; |
|
|
|
|
x = stbi__get8(j->s); |
|
|
|
|
if (x != 0x00 && x != 0xff) { |
|
|
|
|
// not a stuffed zero or lead-in to another marker, looks
|
|
|
|
|
// like an actual marker, return it
|
|
|
|
|
return x; |
|
|
|
|
} |
|
|
|
|
// stuffed zero has x=0 now which ends the loop, meaning we go
|
|
|
|
|
// back to regular scan loop.
|
|
|
|
|
// repeated 0xff keeps trying to read the next byte of the marker.
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return STBI__MARKER_none; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// decode image to YCbCr format
|
|
|
|
|
static int stbi__decode_jpeg_image(stbi__jpeg *j) |
|
|
|
|
{ |
|
|
|
@ -3399,14 +3421,7 @@ static int stbi__decode_jpeg_image(stbi__jpeg *j) |
|
|
|
|
if (!stbi__process_scan_header(j)) return 0; |
|
|
|
|
if (!stbi__parse_entropy_coded_data(j)) return 0; |
|
|
|
|
if (j->marker == STBI__MARKER_none ) { |
|
|
|
|
// handle 0s at the end of image data from IP Kamera 9060
|
|
|
|
|
while (!stbi__at_eof(j->s)) { |
|
|
|
|
int x = stbi__get8(j->s); |
|
|
|
|
if (x == 255) { |
|
|
|
|
j->marker = stbi__get8(j->s); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
j->marker = stbi__skip_jpeg_junk_at_end(j); |
|
|
|
|
// if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
|
|
|
|
|
} |
|
|
|
|
} else if (stbi__DNL(m)) { |
|
|
|
|