diff options
author | Boris Gjenero <boris.gjenero@gmail.com> | 2016-01-06 00:46:42 -0500 |
---|---|---|
committer | Gerrit Rockbox <gerrit@rockbox.org> | 2016-04-01 19:29:41 +0200 |
commit | 26697d08912feecd3c0c924773d518d1720f0640 (patch) | |
tree | f68906327c04fad29344f1ae30ec2c622b32c970 /apps/recorder/jpeg_load.c | |
parent | 25fc7f1860f31ae31f14f17449fae8105d21f628 (diff) | |
download | rockbox-26697d08912feecd3c0c924773d518d1720f0640.tar.gz rockbox-26697d08912feecd3c0c924773d518d1720f0640.zip |
Fix FS#12981 JPEG decoding problem when entropy data starts with FF
This changes JPEG fill and invalid byte handling to be like
mozjpeg, and bases entropy data start on SOS marker location.
Thanks to Stefan Waldmann and Dean Tersigni for reporting.
Change-Id: I3c79cc6ac8d714fdc75c12b57ba427d611c99519
Chaange-Id: Ibc7c17d38d5be63642bdaf6adfd6acc2a6cf4450
Diffstat (limited to 'apps/recorder/jpeg_load.c')
-rw-r--r-- | apps/recorder/jpeg_load.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/apps/recorder/jpeg_load.c b/apps/recorder/jpeg_load.c index 46b7cc9bc5..e326d1c18a 100644 --- a/apps/recorder/jpeg_load.c +++ b/apps/recorder/jpeg_load.c | |||
@@ -956,25 +956,25 @@ static int process_markers(struct jpeg* p_jpeg) | |||
956 | int marker_size; /* variable length of marker segment */ | 956 | int marker_size; /* variable length of marker segment */ |
957 | int i, j, n; | 957 | int i, j, n; |
958 | int ret = 0; /* returned flags */ | 958 | int ret = 0; /* returned flags */ |
959 | bool done = false; | ||
959 | 960 | ||
960 | while ((c = e_getc(p_jpeg, -1))) | 961 | while (!done && (c = e_getc(p_jpeg, -1))) |
961 | { | 962 | { |
962 | if (c != 0xFF) /* no marker? */ | 963 | if (c != 0xFF) /* no marker? */ |
963 | { | 964 | { |
964 | JDEBUGF("Non-marker data\n"); | 965 | JDEBUGF("Non-marker data\n"); |
965 | jpeg_putc(p_jpeg); | 966 | continue; /* discard */ |
966 | break; /* exit marker processing */ | ||
967 | } | 967 | } |
968 | 968 | ||
969 | c = e_getc(p_jpeg, -1); | 969 | c = e_getc(p_jpeg, -1); |
970 | JDEBUGF("marker value %X\n",c); | 970 | JDEBUGF("marker value %X\n",c); |
971 | switch (c) | 971 | switch (c) |
972 | { | 972 | { |
973 | case 0xFF: /* Fill byte */ | 973 | case 0xFF: /* Previous FF was fill byte */ |
974 | ret |= FILL_FF; | 974 | jpeg_putc(p_jpeg); /* This FF could be start of a marker */ |
975 | case 0x00: /* Zero stuffed byte - entropy data */ | ||
976 | jpeg_putc(p_jpeg); | ||
977 | continue; | 975 | continue; |
976 | case 0x00: /* Zero stuffed byte */ | ||
977 | break; /* discard */ | ||
978 | 978 | ||
979 | case 0xC0: /* SOF Huff - Baseline DCT */ | 979 | case 0xC0: /* SOF Huff - Baseline DCT */ |
980 | { | 980 | { |
@@ -1132,6 +1132,7 @@ static int process_markers(struct jpeg* p_jpeg) | |||
1132 | } | 1132 | } |
1133 | /* skip spectral information */ | 1133 | /* skip spectral information */ |
1134 | e_skip_bytes(p_jpeg, marker_size); | 1134 | e_skip_bytes(p_jpeg, marker_size); |
1135 | done = true; | ||
1135 | } | 1136 | } |
1136 | break; | 1137 | break; |
1137 | 1138 | ||