File indexing completed on 2024-05-12 04:19:44
0001 /* 0002 * jpegint.h 0003 * 0004 * Copyright (C) 1991-1997, Thomas G. Lane. 0005 * This file is part of the Independent JPEG Group's software. 0006 * For conditions of distribution and use, see the accompanying README.jpeg file. 0007 * 0008 * This file provides common declarations for the various JPEG modules. 0009 * These declarations are considered internal to the JPEG library; most 0010 * applications using the library shouldn't need to include this file. 0011 */ 0012 0013 /* Declarations for both compression & decompression */ 0014 0015 typedef enum { /* Operating modes for buffer controllers */ 0016 JBUF_PASS_THRU, /* Plain stripwise operation */ 0017 /* Remaining modes require a full-image buffer to have been created */ 0018 JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ 0019 JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ 0020 JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ 0021 } J_BUF_MODE; 0022 0023 /* Values of global_state field (jdapi.c has some dependencies on ordering!) */ 0024 #define CSTATE_START 100 /* after create_compress */ 0025 #define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ 0026 #define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ 0027 #define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ 0028 #define DSTATE_START 200 /* after create_decompress */ 0029 #define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ 0030 #define DSTATE_READY 202 /* found SOS, ready for start_decompress */ 0031 #define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ 0032 #define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ 0033 #define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ 0034 #define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ 0035 #define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ 0036 #define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ 0037 #define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ 0038 #define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ 0039 0040 /* Declarations for compression modules */ 0041 0042 /* Master control module */ 0043 struct jpeg_comp_master { 0044 JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); 0045 JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); 0046 JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); 0047 0048 /* State variables made visible to other modules */ 0049 boolean call_pass_startup; /* True if pass_startup must be called */ 0050 boolean is_last_pass; /* True during last pass */ 0051 }; 0052 0053 /* Main buffer control (downsampled-data buffer) */ 0054 struct jpeg_c_main_controller { 0055 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 0056 JMETHOD(void, process_data, (j_compress_ptr cinfo, 0057 JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, 0058 JDIMENSION in_rows_avail)); 0059 }; 0060 0061 /* Compression preprocessing (downsampling input buffer control) */ 0062 struct jpeg_c_prep_controller { 0063 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 0064 JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, 0065 JSAMPARRAY input_buf, 0066 JDIMENSION *in_row_ctr, 0067 JDIMENSION in_rows_avail, 0068 JSAMPIMAGE output_buf, 0069 JDIMENSION *out_row_group_ctr, 0070 JDIMENSION out_row_groups_avail)); 0071 }; 0072 0073 /* Coefficient buffer control */ 0074 struct jpeg_c_coef_controller { 0075 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 0076 JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, 0077 JSAMPIMAGE input_buf)); 0078 }; 0079 0080 /* Colorspace conversion */ 0081 struct jpeg_color_converter { 0082 JMETHOD(void, start_pass, (j_compress_ptr cinfo)); 0083 JMETHOD(void, color_convert, (j_compress_ptr cinfo, 0084 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, 0085 JDIMENSION output_row, int num_rows)); 0086 }; 0087 0088 /* Downsampling */ 0089 struct jpeg_downsampler { 0090 JMETHOD(void, start_pass, (j_compress_ptr cinfo)); 0091 JMETHOD(void, downsample, (j_compress_ptr cinfo, 0092 JSAMPIMAGE input_buf, JDIMENSION in_row_index, 0093 JSAMPIMAGE output_buf, 0094 JDIMENSION out_row_group_index)); 0095 0096 boolean need_context_rows; /* TRUE if need rows above & below */ 0097 }; 0098 0099 /* Forward DCT (also controls coefficient quantization) */ 0100 struct jpeg_forward_dct { 0101 JMETHOD(void, start_pass, (j_compress_ptr cinfo)); 0102 /* perhaps this should be an array??? */ 0103 JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, 0104 jpeg_component_info * compptr, 0105 JSAMPARRAY sample_data, JBLOCKROW coef_blocks, 0106 JDIMENSION start_row, JDIMENSION start_col, 0107 JDIMENSION num_blocks)); 0108 }; 0109 0110 /* Entropy encoding */ 0111 struct jpeg_entropy_encoder { 0112 JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); 0113 JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); 0114 JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); 0115 }; 0116 0117 /* Marker writing */ 0118 struct jpeg_marker_writer { 0119 JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); 0120 JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); 0121 JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); 0122 JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); 0123 JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); 0124 /* These routines are exported to allow insertion of extra markers */ 0125 /* Probably only COM and APPn markers should be written this way */ 0126 JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, 0127 unsigned int datalen)); 0128 JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); 0129 }; 0130 0131 /* Declarations for decompression modules */ 0132 0133 /* Master control module */ 0134 struct jpeg_decomp_master { 0135 JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); 0136 JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); 0137 0138 /* State variables made visible to other modules */ 0139 boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ 0140 }; 0141 0142 /* Input control module */ 0143 struct jpeg_input_controller { 0144 JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); 0145 JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); 0146 JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); 0147 JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); 0148 0149 /* State variables made visible to other modules */ 0150 boolean has_multiple_scans; /* True if file has multiple scans */ 0151 boolean eoi_reached; /* True when EOI has been consumed */ 0152 }; 0153 0154 /* Main buffer control (downsampled-data buffer) */ 0155 struct jpeg_d_main_controller { 0156 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); 0157 JMETHOD(void, process_data, (j_decompress_ptr cinfo, 0158 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 0159 JDIMENSION out_rows_avail)); 0160 }; 0161 0162 /* Coefficient buffer control */ 0163 struct jpeg_d_coef_controller { 0164 JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); 0165 JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); 0166 JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); 0167 JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, 0168 JSAMPIMAGE output_buf)); 0169 /* Pointer to array of coefficient virtual arrays, or NULL if none */ 0170 jvirt_barray_ptr *coef_arrays; 0171 }; 0172 0173 /* Decompression postprocessing (color quantization buffer control) */ 0174 struct jpeg_d_post_controller { 0175 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); 0176 JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, 0177 JSAMPIMAGE input_buf, 0178 JDIMENSION *in_row_group_ctr, 0179 JDIMENSION in_row_groups_avail, 0180 JSAMPARRAY output_buf, 0181 JDIMENSION *out_row_ctr, 0182 JDIMENSION out_rows_avail)); 0183 }; 0184 0185 /* Marker reading & parsing */ 0186 struct jpeg_marker_reader { 0187 JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); 0188 /* Read markers until SOS or EOI. 0189 * Returns same codes as are defined for jpeg_consume_input: 0190 * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. 0191 */ 0192 JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); 0193 /* Read a restart marker --- exported for use by entropy decoder only */ 0194 jpeg_marker_parser_method read_restart_marker; 0195 0196 /* State of marker reader --- nominally internal, but applications 0197 * supplying COM or APPn handlers might like to know the state. 0198 */ 0199 boolean saw_SOI; /* found SOI? */ 0200 boolean saw_SOF; /* found SOF? */ 0201 int next_restart_num; /* next restart number expected (0-7) */ 0202 unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ 0203 }; 0204 0205 /* Entropy decoding */ 0206 struct jpeg_entropy_decoder { 0207 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 0208 JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, 0209 JBLOCKROW *MCU_data)); 0210 0211 /* This is here to share code between baseline and progressive decoders; */ 0212 /* other modules probably should not use it */ 0213 boolean insufficient_data; /* set TRUE after emitting warning */ 0214 }; 0215 0216 /* Inverse DCT (also performs dequantization) */ 0217 typedef JMETHOD(void, inverse_DCT_method_ptr, 0218 (j_decompress_ptr cinfo, jpeg_component_info * compptr, 0219 JCOEFPTR coef_block, 0220 JSAMPARRAY output_buf, JDIMENSION output_col)); 0221 0222 struct jpeg_inverse_dct { 0223 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 0224 /* It is useful to allow each component to have a separate IDCT method. */ 0225 inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; 0226 }; 0227 0228 /* Upsampling (note that upsampler must also call color converter) */ 0229 struct jpeg_upsampler { 0230 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 0231 JMETHOD(void, upsample, (j_decompress_ptr cinfo, 0232 JSAMPIMAGE input_buf, 0233 JDIMENSION *in_row_group_ctr, 0234 JDIMENSION in_row_groups_avail, 0235 JSAMPARRAY output_buf, 0236 JDIMENSION *out_row_ctr, 0237 JDIMENSION out_rows_avail)); 0238 0239 boolean need_context_rows; /* TRUE if need rows above & below */ 0240 }; 0241 0242 /* Colorspace conversion */ 0243 struct jpeg_color_deconverter { 0244 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 0245 JMETHOD(void, color_convert, (j_decompress_ptr cinfo, 0246 JSAMPIMAGE input_buf, JDIMENSION input_row, 0247 JSAMPARRAY output_buf, int num_rows)); 0248 }; 0249 0250 /* Color quantization or color precision reduction */ 0251 struct jpeg_color_quantizer { 0252 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); 0253 JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, 0254 JSAMPARRAY input_buf, JSAMPARRAY output_buf, 0255 int num_rows)); 0256 JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); 0257 JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); 0258 }; 0259 0260 /* Miscellaneous useful macros */ 0261 0262 #undef MAX 0263 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 0264 #undef MIN 0265 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 0266 0267 /* We assume that right shift corresponds to signed division by 2 with 0268 * rounding towards minus infinity. This is correct for typical "arithmetic 0269 * shift" instructions that shift in copies of the sign bit. But some 0270 * C compilers implement >> with an unsigned shift. For these machines you 0271 * must define RIGHT_SHIFT_IS_UNSIGNED. 0272 * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. 0273 * It is only applied with constant shift counts. SHIFT_TEMPS must be 0274 * included in the variables of any routine using RIGHT_SHIFT. 0275 */ 0276 0277 #ifdef RIGHT_SHIFT_IS_UNSIGNED 0278 #define SHIFT_TEMPS INT32 shift_temp; 0279 #define RIGHT_SHIFT(x,shft) \ 0280 ((shift_temp = (x)) < 0 ? \ 0281 (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ 0282 (shift_temp >> (shft))) 0283 #else 0284 #define SHIFT_TEMPS 0285 #define RIGHT_SHIFT(x,shft) ((x) >> (shft)) 0286 #endif 0287 0288 /* Short forms of external names for systems with brain-damaged linkers. */ 0289 0290 #ifdef NEED_SHORT_EXTERNAL_NAMES 0291 #define jinit_compress_master jICompress 0292 #define jinit_c_master_control jICMaster 0293 #define jinit_c_main_controller jICMainC 0294 #define jinit_c_prep_controller jICPrepC 0295 #define jinit_c_coef_controller jICCoefC 0296 #define jinit_color_converter jICColor 0297 #define jinit_downsampler jIDownsampler 0298 #define jinit_forward_dct jIFDCT 0299 #define jinit_huff_encoder jIHEncoder 0300 #define jinit_phuff_encoder jIPHEncoder 0301 #define jinit_marker_writer jIMWriter 0302 #define jinit_master_decompress jIDMaster 0303 #define jinit_d_main_controller jIDMainC 0304 #define jinit_d_coef_controller jIDCoefC 0305 #define jinit_d_post_controller jIDPostC 0306 #define jinit_input_controller jIInCtlr 0307 #define jinit_marker_reader jIMReader 0308 #define jinit_huff_decoder jIHDecoder 0309 #define jinit_phuff_decoder jIPHDecoder 0310 #define jinit_inverse_dct jIIDCT 0311 #define jinit_upsampler jIUpsampler 0312 #define jinit_color_deconverter jIDColor 0313 #define jinit_1pass_quantizer jI1Quant 0314 #define jinit_2pass_quantizer jI2Quant 0315 #define jinit_merged_upsampler jIMUpsampler 0316 #define jinit_memory_mgr jIMemMgr 0317 #define jdiv_round_up jDivRound 0318 #define jround_up jRound 0319 #define jcopy_sample_rows jCopySamples 0320 #define jcopy_block_row jCopyBlocks 0321 #define jzero_far jZeroFar 0322 #define jpeg_zigzag_order jZIGTable 0323 #define jpeg_natural_order jZAGTable 0324 #endif /* NEED_SHORT_EXTERNAL_NAMES */ 0325 0326 /* Compression module initialization routines */ 0327 EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); 0328 EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, 0329 boolean transcode_only)); 0330 EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, 0331 boolean need_full_buffer)); 0332 EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, 0333 boolean need_full_buffer)); 0334 EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, 0335 boolean need_full_buffer)); 0336 EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); 0337 EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); 0338 EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); 0339 EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); 0340 EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo)); 0341 EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); 0342 /* Decompression module initialization routines */ 0343 EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); 0344 EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, 0345 boolean need_full_buffer)); 0346 EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, 0347 boolean need_full_buffer)); 0348 EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, 0349 boolean need_full_buffer)); 0350 EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); 0351 EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); 0352 EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); 0353 EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo)); 0354 EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); 0355 EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); 0356 EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); 0357 EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); 0358 EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); 0359 EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); 0360 /* Memory manager initialization */ 0361 EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); 0362 0363 /* Utility routines in jutils.c */ 0364 EXTERN(long) jdiv_round_up JPP((long a, long b)); 0365 EXTERN(long) jround_up JPP((long a, long b)); 0366 EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, 0367 JSAMPARRAY output_array, int dest_row, 0368 int num_rows, JDIMENSION num_cols)); 0369 EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, 0370 JDIMENSION num_blocks)); 0371 EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); 0372 /* Constant tables in jutils.c */ 0373 #if 0 /* This table is not actually needed in v6a */ 0374 extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ 0375 #endif 0376 extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ 0377 0378 /* Suppress undefined-structure complaints if necessary. */ 0379 0380 #ifdef INCOMPLETE_TYPES_BROKEN 0381 #ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ 0382 struct jvirt_sarray_control { 0383 long dummy; 0384 }; 0385 struct jvirt_barray_control { 0386 long dummy; 0387 }; 0388 #endif 0389 #endif /* INCOMPLETE_TYPES_BROKEN */