10 #define JPEG_INTERNALS 89 jpeg_marker_parser_method process_APPn[16];
93 unsigned int length_limit_APPn[16];
112 #define INPUT_VARS(cinfo) \ 113 struct jpeg_source_mgr* datasrc = (cinfo)->src; \ 114 const JOCTET* next_input_byte = datasrc->next_input_byte; \ 115 size_t bytes_in_buffer = datasrc->bytes_in_buffer 118 #define INPUT_SYNC(cinfo) \ 119 (datasrc->next_input_byte = next_input_byte, \ 120 datasrc->bytes_in_buffer = bytes_in_buffer) 123 #define INPUT_RELOAD(cinfo) \ 124 (next_input_byte = datasrc->next_input_byte, \ 125 bytes_in_buffer = datasrc->bytes_in_buffer) 131 #define MAKE_BYTE_AVAIL(cinfo, action) \ 132 if (bytes_in_buffer == 0) \ 134 if (!(*datasrc->fill_input_buffer)(cinfo)) \ 138 INPUT_RELOAD(cinfo); \ 144 #define INPUT_BYTE(cinfo, V, action) \ 146 MAKE_BYTE_AVAIL(cinfo, action); bytes_in_buffer--; \ 147 V = GETJOCTET(*next_input_byte++);) 152 #define INPUT_2BYTES(cinfo, V, action) \ 154 MAKE_BYTE_AVAIL(cinfo, action); bytes_in_buffer--; \ 155 V = ((unsigned int)GETJOCTET(*next_input_byte++)) << 8; \ 156 MAKE_BYTE_AVAIL(cinfo, action); bytes_in_buffer--; \ 157 V += GETJOCTET(*next_input_byte++);) 197 if (cinfo->marker->saw_SOI)
ERREXIT(cinfo, JERR_SOI_DUPLICATE);
203 cinfo->arith_dc_L[i] = 0;
204 cinfo->arith_dc_U[i] = 1;
205 cinfo->arith_ac_K[i] = 5;
207 cinfo->restart_interval = 0;
212 cinfo->CCIR601_sampling =
FALSE;
214 cinfo->saw_JFIF_marker =
FALSE;
215 cinfo->JFIF_major_version = 1;
216 cinfo->JFIF_minor_version = 1;
217 cinfo->density_unit = 0;
218 cinfo->X_density = 1;
219 cinfo->Y_density = 1;
220 cinfo->saw_Adobe_marker =
FALSE;
221 cinfo->Adobe_transform = 0;
223 cinfo->marker->saw_SOI =
TRUE;
237 cinfo->progressive_mode = is_prog;
238 cinfo->arith_code = is_arith;
250 cinfo, 1, JTRC_SOF, cinfo->unread_marker, (
int)cinfo->image_width,
251 (
int)cinfo->image_height, cinfo->num_components);
253 if (cinfo->marker->saw_SOF)
ERREXIT(cinfo, JERR_SOF_DUPLICATE);
259 if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
260 cinfo->num_components <= 0)
261 ERREXIT(cinfo, JERR_EMPTY_IMAGE);
263 if (
length != (cinfo->num_components * 3))
ERREXIT(cinfo, JERR_BAD_LENGTH);
265 if (cinfo->comp_info ==
nullptr)
270 for (ci = 0,
compptr = cinfo->comp_info; ci < cinfo->num_components;
286 cinfo->marker->saw_SOF =
TRUE;
301 if (!cinfo->marker->saw_SOF)
ERREXIT(cinfo, JERR_SOS_NO_SOF);
310 ERREXIT(cinfo, JERR_BAD_LENGTH);
312 cinfo->comps_in_scan =
n;
316 for (i = 0; i <
n; i++)
321 for (ci = 0,
compptr = cinfo->comp_info; ci < cinfo->num_components;
327 ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
331 cinfo->cur_comp_info[i] =
compptr;
346 cinfo->Ah = (
c >> 4) & 15;
350 cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
353 cinfo->marker->next_restart_num = 0;
356 cinfo->input_scan_number++;
362 #ifdef D_ARITH_CODING_SUPPORTED 408 #define get_dac(cinfo) skip_variable(cinfo) 434 for (i = 1; i <= 16; i++)
443 cinfo, 2, JTRC_HUFFBITS, bits[1], bits[2], bits[3], bits[4],
444 bits[5], bits[6], bits[7], bits[8]);
446 cinfo, 2, JTRC_HUFFBITS, bits[9], bits[10], bits[11], bits[12],
447 bits[13], bits[14], bits[15], bits[16]);
453 ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
462 htblptr = &cinfo->ac_huff_tbl_ptrs[
index];
466 htblptr = &cinfo->dc_huff_tbl_ptrs[
index];
472 if (*htblptr ==
nullptr)
476 MEMCOPY((*htblptr)->huffval, huffval,
SIZEOF((*htblptr)->huffval));
508 if (cinfo->quant_tbl_ptrs[
n] ==
nullptr)
509 cinfo->quant_tbl_ptrs[
n] =
511 quant_ptr = cinfo->quant_tbl_ptrs[
n];
523 if (cinfo->err->trace_level >= 2)
528 cinfo, 2, JTRC_QUANTVALS, quant_ptr->
quantval[i],
562 cinfo->restart_interval = tmp;
575 #define APP0_DATA_LEN 14 576 #define APP14_DATA_LEN 12 577 #define APPN_DATA_LEN 14 595 cinfo->saw_JFIF_marker =
TRUE;
608 if (cinfo->JFIF_major_version != 1)
610 cinfo, JWRN_JFIF_MAJOR, cinfo->JFIF_major_version,
611 cinfo->JFIF_minor_version);
614 cinfo, 1, JTRC_JFIF, cinfo->JFIF_major_version,
615 cinfo->JFIF_minor_version, cinfo->X_density, cinfo->Y_density,
616 cinfo->density_unit);
625 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);
657 TRACEMS1(cinfo, 1, JTRC_APP0, (
int)totallen);
670 unsigned int version, flags0, flags1,
transform;
682 cinfo->saw_Adobe_marker =
TRUE;
688 TRACEMS1(cinfo, 1, JTRC_APP14, (
int)(datalen + remaining));
698 unsigned int i, numtoread;
708 numtoread = (
unsigned int)
length;
715 switch (cinfo->unread_marker)
726 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
732 if (
length > 0) (*cinfo->src->skip_input_data)(cinfo, (
long)
length);
737 #ifdef SAVE_MARKERS_SUPPORTED 745 unsigned int bytes_read, data_length;
750 if (cur_marker ==
nullptr)
759 if (cinfo->unread_marker == (
int)
M_COM)
760 limit = marker->length_limit_COM;
764 ->length_limit_APPn[cinfo->unread_marker - (int)
M_APP0];
770 cur_marker->next =
nullptr;
771 cur_marker->marker = (
UINT8)cinfo->unread_marker;
772 cur_marker->original_length = (
unsigned int)
length;
773 cur_marker->data_length =
limit;
776 marker->cur_marker = cur_marker;
777 marker->bytes_read = 0;
784 bytes_read = data_length = 0;
791 bytes_read = marker->bytes_read;
792 data_length = cur_marker->data_length;
793 data = cur_marker->data + bytes_read;
796 while (bytes_read < data_length)
799 marker->bytes_read = bytes_read;
803 while (bytes_read < data_length && bytes_in_buffer > 0)
805 *
data++ = *next_input_byte++;
812 if (cur_marker !=
nullptr)
815 if (cinfo->marker_list ==
nullptr)
817 cinfo->marker_list = cur_marker;
822 while (prev->next !=
nullptr) prev = prev->next;
823 prev->next = cur_marker;
826 data = cur_marker->data;
827 length = cur_marker->original_length - data_length;
830 marker->cur_marker =
nullptr;
833 switch (cinfo->unread_marker)
843 cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
844 (
int)(data_length +
length));
850 if (
length > 0) (*cinfo->src->skip_input_data)(cinfo, (
long)
length);
867 TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (
int)
length);
870 if (
length > 0) (*cinfo->src->skip_input_data)(cinfo, (
long)
length);
901 cinfo->marker->discarded_bytes++;
918 cinfo->marker->discarded_bytes += 2;
922 if (cinfo->marker->discarded_bytes != 0)
924 WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes,
c);
925 cinfo->marker->discarded_bytes = 0;
928 cinfo->unread_marker =
c;
948 if (
c != 0xFF || c2 != (
int)
M_SOI)
ERREXIT2(cinfo, JERR_NO_SOI,
c, c2);
950 cinfo->unread_marker = c2;
971 if (cinfo->unread_marker == 0)
973 if (!cinfo->marker->saw_SOI)
987 switch (cinfo->unread_marker)
1020 ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
1025 cinfo->unread_marker = 0;
1030 cinfo->unread_marker = 0;
1066 ->process_APPn[cinfo->unread_marker - (
int)
M_APP0])(
1085 TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
1101 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
1105 cinfo->unread_marker = 0;
1126 if (cinfo->unread_marker == 0)
1131 if (cinfo->unread_marker == ((
int)
M_RST0 + cinfo->marker->next_restart_num))
1135 TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
1136 cinfo->unread_marker = 0;
1142 if (!(*cinfo->src->resync_to_restart)(
1143 cinfo, cinfo->marker->next_restart_num))
1148 cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
1205 int marker = cinfo->unread_marker;
1209 WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
1214 if (marker < (
int)
M_SOF0)
1220 if (marker == ((
int)
M_RST0 + ((desired + 1) & 7)) ||
1221 marker == ((
int)
M_RST0 + ((desired + 2) & 7)))
1224 marker == ((
int)
M_RST0 + ((desired - 1) & 7)) ||
1225 marker == ((
int)
M_RST0 + ((desired - 2) & 7)))
1230 TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
1235 cinfo->unread_marker = 0;
1240 marker = cinfo->unread_marker;
1260 cinfo->comp_info =
nullptr;
1261 cinfo->input_scan_number = 0;
1262 cinfo->unread_marker = 0;
1265 marker->
pub.discarded_bytes = 0;
1266 marker->cur_marker =
nullptr;
1293 marker->length_limit_COM = 0;
1294 for (i = 0; i < 16; i++)
1297 marker->length_limit_APPn[i] = 0;
1309 #ifdef SAVE_MARKERS_SUPPORTED 1317 jpeg_marker_parser_method processor;
1323 if (((
long)length_limit) > maxlength)
1324 length_limit = (
unsigned int)maxlength;
1342 if (marker_code == (
int)
M_APP0 || marker_code == (int)
M_APP14)
1346 if (marker_code == (
int)
M_COM)
1348 marker->process_COM = processor;
1349 marker->length_limit_COM = length_limit;
1351 else if (marker_code >= (
int)
M_APP0 && marker_code <= (int)
M_APP15)
1353 marker->process_APPn[marker_code - (int)
M_APP0] = processor;
1354 marker->length_limit_APPn[marker_code - (int)
M_APP0] = length_limit;
1357 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
1368 j_decompress_ptr cinfo,
int marker_code, jpeg_marker_parser_method routine)
1372 if (marker_code == (
int)
M_COM)
1373 marker->process_COM = routine;
1374 else if (marker_code >= (
int)
M_APP0 && marker_code <= (int)
M_APP15)
1375 marker->process_APPn[marker_code - (int)
M_APP0] = routine;
1377 ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
#define INPUT_VARS(cinfo)
jinit_marker_reader(j_decompress_ptr cinfo)
#define INPUT_2BYTES(cinfo, V, action)
GLuint GLuint GLsizei count
UINT16 quantval[DCTSIZE2]
get_sof(j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
first_marker(j_decompress_ptr cinfo)
skip_variable(j_decompress_ptr cinfo)
#define MAX_COMPS_IN_SCAN
UINT8 arith_dc_U[NUM_ARITH_TBLS]
const int jpeg_natural_order[]
struct jpeg_common_struct * j_common_ptr
#define ERREXIT(cinfo, code)
#define TRACEMS2(cinfo, lvl, code, p1, p2)
struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr
read_markers(j_decompress_ptr cinfo)
my_marker_reader * my_marker_ptr
#define INPUT_BYTE(cinfo, V, action)
UINT8 arith_dc_L[NUM_ARITH_TBLS]
#define TRACEMS(cinfo, lvl, code)
get_sos(j_decompress_ptr cinfo)
#define WARNMS2(cinfo, code, p1, p2)
jpeg_resync_to_restart(j_decompress_ptr cinfo, int desired)
UINT8 arith_ac_K[NUM_ARITH_TBLS]
#define TRACEMS1(cinfo, lvl, code, p1)
#define MEMCOPY(dest, src, size)
read_restart_marker(j_decompress_ptr cinfo)
#define TRACEMS5(cinfo, lvl, code, p1, p2, p3, p4, p5)
save_marker(j_decompress_ptr cinfo)
jpeg_alloc_huff_table(j_common_ptr cinfo)
examine_app0(j_decompress_ptr cinfo, JOCTET FAR *data, unsigned int datalen, INT32 remaining)
jpeg_marker_parser_method process_COM
reset_marker_reader(j_decompress_ptr cinfo)
get_dht(j_decompress_ptr cinfo)
jpeg_alloc_quant_table(j_common_ptr cinfo)
#define ERREXIT1(cinfo, code, p1)
get_dqt(j_decompress_ptr cinfo)
jpeg_save_markers(j_decompress_ptr cinfo, int marker_code, unsigned int length_limit)
next_marker(j_decompress_ptr cinfo)
GLuint GLsizei GLsizei * length
#define MAKE_BYTE_AVAIL(cinfo, action)
get_dri(j_decompress_ptr cinfo)
#define TRACEMS8(cinfo, lvl, code, p1, p2, p3, p4, p5, p6, p7, p8)
get_soi(j_decompress_ptr cinfo)
struct jpeg_marker_writer pub
#define TRACEMS3(cinfo, lvl, code, p1, p2, p3)
jpeg_saved_marker_ptr cur_marker
#define TRACEMS4(cinfo, lvl, code, p1, p2, p3, p4)
jpeg_set_marker_processor(j_decompress_ptr cinfo, int marker_code, jpeg_marker_parser_method routine)
GLuint GLenum GLenum transform
#define ERREXIT2(cinfo, code, p1, p2)
GLsizei GLsizei GLenum GLenum const GLvoid * data
unsigned int length_limit_COM
#define INPUT_SYNC(cinfo)
examine_app14(j_decompress_ptr cinfo, JOCTET FAR *data, unsigned int datalen, INT32 remaining)
jpeg_component_info * compptr
get_interesting_appn(j_decompress_ptr cinfo)