|
@@ -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)) {
|