summaryrefslogtreecommitdiff
path: root/apps/recorder/jpeg_load.c
diff options
context:
space:
mode:
authorBoris Gjenero <boris.gjenero@gmail.com>2016-01-06 00:46:42 -0500
committerGerrit Rockbox <gerrit@rockbox.org>2016-04-01 19:29:41 +0200
commit26697d08912feecd3c0c924773d518d1720f0640 (patch)
treef68906327c04fad29344f1ae30ec2c622b32c970 /apps/recorder/jpeg_load.c
parent25fc7f1860f31ae31f14f17449fae8105d21f628 (diff)
downloadrockbox-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.c15
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