15 #define JPEG_INTERNALS
95 jpeg_marker_parser_method process_APPn[16];
99 unsigned int length_limit_APPn[16];
119 #define INPUT_VARS(cinfo) \
120 struct jpeg_source_mgr * datasrc = (cinfo)->src; \
121 const JOCTET * next_input_byte = datasrc->next_input_byte; \
122 size_t bytes_in_buffer = datasrc->bytes_in_buffer
125 #define INPUT_SYNC(cinfo) \
126 ( datasrc->next_input_byte = next_input_byte, \
127 datasrc->bytes_in_buffer = bytes_in_buffer )
130 #define INPUT_RELOAD(cinfo) \
131 ( next_input_byte = datasrc->next_input_byte, \
132 bytes_in_buffer = datasrc->bytes_in_buffer )
138 #define MAKE_BYTE_AVAIL(cinfo,action) \
139 if (bytes_in_buffer == 0) { \
140 if (! (*datasrc->fill_input_buffer) (cinfo)) \
142 INPUT_RELOAD(cinfo); \
148 #define INPUT_BYTE(cinfo,V,action) \
149 MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
151 V = GETJOCTET(*next_input_byte++); )
156 #define INPUT_2BYTES(cinfo,V,action) \
157 MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
159 V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
160 MAKE_BYTE_AVAIL(cinfo,action); \
162 V += GETJOCTET(*next_input_byte++); )
204 if (cinfo->marker->saw_SOI)
205 ERREXIT(cinfo, JERR_SOI_DUPLICATE);
210 cinfo->arith_dc_L[
i] = 0;
211 cinfo->arith_dc_U[
i] = 1;
212 cinfo->arith_ac_K[
i] = 5;
214 cinfo->restart_interval = 0;
219 cinfo->CCIR601_sampling =
FALSE;
221 cinfo->saw_JFIF_marker =
FALSE;
222 cinfo->JFIF_major_version = 1;
223 cinfo->JFIF_minor_version = 1;
224 cinfo->density_unit = 0;
225 cinfo->X_density = 1;
226 cinfo->Y_density = 1;
227 cinfo->saw_Adobe_marker =
FALSE;
228 cinfo->Adobe_transform = 0;
230 cinfo->marker->saw_SOI =
TRUE;
245 cinfo->progressive_mode = is_prog;
246 cinfo->arith_code = is_arith;
257 TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
258 (
int) cinfo->image_width, (
int) cinfo->image_height,
259 cinfo->num_components);
261 if (cinfo->marker->saw_SOF)
262 ERREXIT(cinfo, JERR_SOF_DUPLICATE);
267 if (cinfo->image_height <= 0 || cinfo->image_width <= 0
268 || cinfo->num_components <= 0)
269 ERREXIT(cinfo, JERR_EMPTY_IMAGE);
271 if (
length != (cinfo->num_components * 3))
272 ERREXIT(cinfo, JERR_BAD_LENGTH);
274 if (cinfo->comp_info == NULL)
279 for (ci = 0,
compptr = cinfo->comp_info; ci < cinfo->num_components;
288 TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
293 cinfo->marker->saw_SOF =
TRUE;
309 if (! cinfo->marker->saw_SOF)
310 ERREXIT(cinfo, JERR_SOS_NO_SOF);
319 ERREXIT(cinfo, JERR_BAD_LENGTH);
321 cinfo->comps_in_scan =
n;
325 for (
i = 0;
i <
n;
i++) {
329 for (ci = 0,
compptr = cinfo->comp_info; ci < cinfo->num_components;
335 ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
343 TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
353 cinfo->Ah = (
c >> 4) & 15;
354 cinfo->Al = (
c ) & 15;
356 TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
357 cinfo->Ah, cinfo->Al);
360 cinfo->marker->next_restart_num = 0;
363 cinfo->input_scan_number++;
370 #ifdef D_ARITH_CODING_SUPPORTED
392 ERREXIT1(cinfo, JERR_DAC_INDEX, index);
405 ERREXIT(cinfo, JERR_BAD_LENGTH);
413 #define get_dac(cinfo) skip_variable(cinfo)
435 TRACEMS1(cinfo, 1, JTRC_DHT, index);
439 for (
i = 1;
i <= 16;
i++) {
447 bits[1], bits[2], bits[3], bits[4],
448 bits[5], bits[6], bits[7], bits[8]);
450 bits[9], bits[10], bits[11], bits[12],
451 bits[13], bits[14], bits[15], bits[16]);
457 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
459 for (
i = 0;
i < count;
i++)
466 htblptr = &cinfo->ac_huff_tbl_ptrs[index];
468 htblptr = &cinfo->dc_huff_tbl_ptrs[index];
472 ERREXIT1(cinfo, JERR_DHT_INDEX, index);
474 if (*htblptr == NULL)
478 MEMCOPY((*htblptr)->huffval, huffval,
SIZEOF((*htblptr)->huffval));
482 ERREXIT(cinfo, JERR_BAD_LENGTH);
512 if (cinfo->quant_tbl_ptrs[
n] == NULL)
514 quant_ptr = cinfo->quant_tbl_ptrs[
n];
525 if (cinfo->err->trace_level >= 2) {
540 ERREXIT(cinfo, JERR_BAD_LENGTH);
558 ERREXIT(cinfo, JERR_BAD_LENGTH);
564 cinfo->restart_interval = tmp;
578 #define APP0_DATA_LEN 14
579 #define APP14_DATA_LEN 12
580 #define APPN_DATA_LEN 14
600 cinfo->saw_JFIF_marker =
TRUE;
612 if (cinfo->JFIF_major_version != 1)
613 WARNMS2(cinfo, JWRN_JFIF_MAJOR,
614 cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
617 cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
618 cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
621 TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
626 TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (
int) totallen);
639 TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (
int) totallen);
642 TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (
int) totallen);
645 TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (
int) totallen);
648 TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
654 TRACEMS1(cinfo, 1, JTRC_APP0, (
int) totallen);
667 unsigned int version, flags0, flags1, transform;
681 cinfo->saw_Adobe_marker =
TRUE;
682 cinfo->Adobe_transform = (
UINT8) transform;
696 unsigned int i, numtoread;
709 for (
i = 0;
i < numtoread;
i++)
714 switch (cinfo->unread_marker) {
723 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
730 (*cinfo->src->skip_input_data) (cinfo, (
long)
length);
736 #ifdef SAVE_MARKERS_SUPPORTED
744 unsigned int bytes_read, data_length;
749 if (cur_marker == NULL) {
756 if (cinfo->unread_marker == (
int)
M_COM)
757 limit =
marker->length_limit_COM;
759 limit =
marker->length_limit_APPn[cinfo->unread_marker - (
int)
M_APP0];
760 if ((
unsigned int)
length < limit)
761 limit = (
unsigned int)
length;
766 cur_marker->next = NULL;
767 cur_marker->marker = (
UINT8) cinfo->unread_marker;
768 cur_marker->original_length = (
unsigned int)
length;
769 cur_marker->data_length = limit;
772 marker->cur_marker = cur_marker;
778 bytes_read = data_length = 0;
783 bytes_read =
marker->bytes_read;
784 data_length = cur_marker->data_length;
785 data = cur_marker->data + bytes_read;
788 while (bytes_read < data_length) {
790 marker->bytes_read = bytes_read;
794 while (bytes_read < data_length && bytes_in_buffer > 0) {
795 *
data++ = *next_input_byte++;
802 if (cur_marker != NULL) {
804 if (cinfo->marker_list == NULL) {
805 cinfo->marker_list = cur_marker;
808 while (prev->next != NULL)
810 prev->next = cur_marker;
813 data = cur_marker->data;
814 length = cur_marker->original_length - data_length;
817 marker->cur_marker = NULL;
820 switch (cinfo->unread_marker) {
828 TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
829 (
int) (data_length +
length));
836 (*cinfo->src->skip_input_data) (cinfo, (
long)
length);
854 TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (
int)
length);
858 (*cinfo->src->skip_input_data) (cinfo, (
long)
length);
887 cinfo->marker->discarded_bytes++;
904 cinfo->marker->discarded_bytes += 2;
908 if (cinfo->marker->discarded_bytes != 0) {
909 WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes,
c);
910 cinfo->marker->discarded_bytes = 0;
913 cinfo->unread_marker =
c;
934 if (
c != 0xFF || c2 != (
int)
M_SOI)
937 cinfo->unread_marker = c2;
958 if (cinfo->unread_marker == 0) {
959 if (! cinfo->marker->saw_SOI) {
971 switch (cinfo->unread_marker) {
1008 ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
1014 cinfo->unread_marker = 0;
1019 cinfo->unread_marker = 0;
1059 cinfo->unread_marker - (
int)
M_APP0]) (cinfo))
1064 if (! (*((
my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
1077 TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
1091 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
1095 cinfo->unread_marker = 0;
1117 if (cinfo->unread_marker == 0) {
1122 if (cinfo->unread_marker ==
1123 ((
int)
M_RST0 + cinfo->marker->next_restart_num)) {
1125 TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
1126 cinfo->unread_marker = 0;
1130 if (! (*cinfo->src->resync_to_restart) (cinfo,
1131 cinfo->marker->next_restart_num))
1136 cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
1194 int marker = cinfo->unread_marker;
1220 cinfo->unread_marker = 0;
1226 marker = cinfo->unread_marker;
1246 cinfo->comp_info = NULL;
1247 cinfo->input_scan_number = 0;
1248 cinfo->unread_marker = 0;
1251 marker->pub.discarded_bytes = 0;
1252 marker->cur_marker = NULL;
1281 marker->length_limit_COM = 0;
1282 for (
i = 0;
i < 16;
i++) {
1284 marker->length_limit_APPn[
i] = 0;
1297 #ifdef SAVE_MARKERS_SUPPORTED
1305 jpeg_marker_parser_method processor;
1332 marker->process_COM = processor;
1350 jpeg_marker_parser_method
routine)