Commit Diff


commit - 867feca8227fc51e897039267b0188160b733e02
commit + d1b596e5014a1ae0e44bc04cf4baf5f84f69835a
blob - c0fd252e51df618c2c1812d4efbeef50918c5d57
blob + 0cd209a838eff40e6c46ca4012ed4351a738fb87
--- pdf.c
+++ pdf.c
@@ -905,13 +905,13 @@ init_dct_parser(struct Env *aux)
 	H_RULE(app0_rgb, h_repeat_n(h_uint8(), 3));
 	H_RULE(app0_rgb_n, h_many(app0_rgb));
 
-	H_RULE(app0, SEQ(app0_marker, app0_length, app0_magic, app0_vmajor, app0_vminor, app0_densityunits,
+	H_RULE(app0, SEQ(jpgmagic, app0_marker, app0_length, app0_magic, app0_vmajor, app0_vminor, app0_densityunits,
 			app0_densityx, app0_densityy, app0_thumbnailx, app0_thumbnaily, app0_rgb_n));
 
 	H_RULE(app1_marker, h_ch('\xE1'));
 	H_RULE(app1_zero, h_ch('\0'));
 	H_RULE(app1_exifdata, h_many(h_uint8()));
-	H_RULE(app1, SEQ(app1_marker, app1_zero, app1_exifdata));
+	H_RULE(app1, SEQ(jpgmagic, app1_marker, app1_zero, app1_exifdata));
 
 	H_RULE(sof0_marker, h_ch('\xC0'));
 	/* Bits per sample */
@@ -923,16 +923,15 @@ init_dct_parser(struct Env *aux)
 	H_RULE(sof0_samplingfactors, h_uint8());
 	/* Quantization table ID */
 	H_RULE(sof0_qtableid, h_uint8());
-	H_RULE(sof0_component, SEQ(sof0_componentid, sof0_samplingfactors, sof0_qtableid));
+	H_RULE(sof0_component, SEQ(jpgmagic, sof0_componentid, sof0_samplingfactors, sof0_qtableid));
 
 	/* Rule for the component itself */
 	H_RULE(sof0_component_lv, h_length_value(sof0_numcomponents, sof0_component));
 
-	H_RULE(sof0, SEQ(sof0_marker, sof0_bps, sof0_imgheight, sof0_imgwidth, sof0_component_lv));
+	H_RULE(sof0, SEQ(jpgmagic, sof0_marker, sof0_bps, sof0_imgheight, sof0_imgwidth, sof0_component_lv));
 
-
 	H_RULE(soi_marker, h_ch('\xD8'));
-	H_RULE(soi, SEQ(soi_marker));
+	H_RULE(soi, SEQ(jpgmagic, soi_marker));
 
 	/* start of scan marker segment */
 	H_RULE(sos_marker, h_ch('\xDA'));
@@ -954,18 +953,51 @@ init_dct_parser(struct Env *aux)
 	H_RULE(sos_approxbitpos, h_uint8());
 
 	/* Final SOS segment parser */
-	H_RULE(sos, SEQ(sos_marker, sos_component_lv, sos_startspectral, sos_endspectral, sos_approxbitpos));
+	H_RULE(sos, SEQ(jpgmagic, sos_marker, sos_component_lv, sos_startspectral, sos_endspectral, sos_approxbitpos));
 
 	// XXX rest of the markers
 	H_RULE(eoi_marker, h_ch('\xD9'));
-	H_RULE(eoi, SEQ(eoi_marker));
+	H_RULE(eoi, SEQ(jpgmagic, eoi_marker));
+
+	H_RULE(dnl_marker, h_ch('\xDC'));
+	H_RULE(dnl_length, h_uint16());
+	H_RULE(dnl_numoflines, h_uint16());
+	H_RULE(dnl, SEQ(jpgmagic, dnl_marker, dnl_length, dnl_numoflines));
+
+	H_RULE(rst0_marker, h_ch('\xD0'));
+	H_RULE(rst0, SEQ(jpgmagic, rst0_marker));
+	H_RULE(rst1_marker, h_ch('\xD1'));
+	H_RULE(rst1, SEQ(jpgmagic, rst1_marker));
+	H_RULE(rst2_marker, h_ch('\xD2'));
+	H_RULE(rst2, SEQ(jpgmagic, rst2_marker));
+	H_RULE(rst3_marker, h_ch('\xD3'));
+	H_RULE(rst3, SEQ(jpgmagic, rst3_marker));
+	H_RULE(rst4_marker, h_ch('\xD4'));
+	H_RULE(rst4, SEQ(jpgmagic, rst4_marker));
+	H_RULE(rst5_marker, h_ch('\xD5'));
+	H_RULE(rst5, SEQ(jpgmagic, rst5_marker));
+	H_RULE(rst6_marker, h_ch('\xD6'));
+	H_RULE(rst6, SEQ(jpgmagic, rst6_marker));
+	H_RULE(rst7_marker, h_ch('\xD7'));
+	H_RULE(rst7, SEQ(jpgmagic, rst7_marker));
 
+	H_RULE(rst, CHX(rst0, rst1, rst2, rst3, rst4, rst5, rst6, rst7, rst8));
+
 	// XXX for now this is to prevent unused variable errors when compiling
 	//H_ARULE(dct, SEQ(jpgmagic, app0, sos));
-	//H_RULE(jpg_frame);
-	//H_RULE(jpg_scan);
-	H_RULE(dct, SEQ(soi, eoi);
+	//H_RULE(jpg_tables_misc, h_many(CHX(app0, )
+	H_RULE(jpg_tables_misc, h_many(app0)); // XXX other APP segments and table definition segments, ITU T.81 B.2.4
+
+	H_RULE(ecs, h_many(h_uint8());
+
+	H_RULE(jpg_scan_header, sos);
+	H_RULE(jpg_scan, SEQ(OPT(jpg_tables_misc), jpg_scan_header, OPT(h_many(SEQ(ecs, rst)), ecs)));
 
+	//H_RULE(jpg_frame_header, CHX(sof0, sof1,...));
+	H_RULE(jpg_frame_header, sof0); // XXX other frame types
+	H_RULE(jpg_frame, SEQ(OPT(jpg_tables_misc), jpg_frame_header, jpg_scan, OPT(dnl), OPT(h_many(jpg_scan))));
+	H_RULE(dct, SEQ(soi, jpg_frame, eoi));
+
 	p_dct = dct;
 }