00001 /* 00002 * jpegint.h 00003 * 00004 * Copyright (C) 1991-1998, Thomas G. Lane. 00005 * This file is part of the Independent JPEG Group's software. 00006 * For conditions of distribution and use, see the accompanying README file. 00007 * 00008 * This file provides common declarations for the various JPEG modules. 00009 * These declarations are considered internal to the JPEG library; most 00010 * applications using the library shouldn't need to include this file. 00011 */ 00012 00013 00014 /* Declarations for both compression & decompression */ 00015 00016 typedef enum { /* Operating modes for buffer controllers */ 00017 JBUF_PASS_THRU, /* Plain stripwise operation */ 00018 /* Remaining modes require a full-image buffer to have been created */ 00019 JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ 00020 JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ 00021 JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ 00022 } J_BUF_MODE; 00023 00024 /* Values of global_state field (jdapi.c has some dependencies on ordering!) */ 00025 #define CSTATE_START 100 /* after create_compress */ 00026 #define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ 00027 #define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ 00028 #define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ 00029 #define DSTATE_START 200 /* after create_decompress */ 00030 #define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ 00031 #define DSTATE_READY 202 /* found SOS, ready for start_decompress */ 00032 #define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ 00033 #define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ 00034 #define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ 00035 #define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ 00036 #define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ 00037 #define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ 00038 #define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ 00039 #define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ 00040 00041 00042 /* Declarations for compression modules */ 00043 00044 /* Master control module */ 00045 struct jpeg_comp_master { 00046 JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); 00047 JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); 00048 JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); 00049 00050 /* State variables made visible to other modules */ 00051 boolean call_pass_startup; /* True if pass_startup must be called */ 00052 boolean is_last_pass; /* True during last pass */ 00053 }; 00054 00055 /* Main buffer control (downsampled-data buffer) */ 00056 struct jpeg_c_main_controller { 00057 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 00058 JMETHOD(void, process_data, (j_compress_ptr cinfo, 00059 JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, 00060 JDIMENSION in_rows_avail)); 00061 }; 00062 00063 /* Compression preprocessing (downsampling input buffer control) */ 00064 struct jpeg_c_prep_controller { 00065 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 00066 JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, 00067 JSAMPARRAY input_buf, 00068 JDIMENSION *in_row_ctr, 00069 JDIMENSION in_rows_avail, 00070 JSAMPIMAGE output_buf, 00071 JDIMENSION *out_row_group_ctr, 00072 JDIMENSION out_row_groups_avail)); 00073 }; 00074 00075 /* Compression codec (compressor proper) */ 00076 struct jpeg_c_codec { 00077 JMETHOD(void, entropy_start_pass, (j_compress_ptr cinfo, 00078 boolean gather_statistics)); 00079 JMETHOD(void, entropy_finish_pass, (j_compress_ptr cinfo)); 00080 JMETHOD(boolean, need_optimization_pass, (j_compress_ptr cinfo)); 00081 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 00082 JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, 00083 JSAMPIMAGE input_buf)); 00084 }; 00085 00086 /* Colorspace conversion */ 00087 struct jpeg_color_converter { 00088 JMETHOD(void, start_pass, (j_compress_ptr cinfo)); 00089 JMETHOD(void, color_convert, (j_compress_ptr cinfo, 00090 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, 00091 JDIMENSION output_row, int num_rows)); 00092 }; 00093 00094 /* Downsampling */ 00095 struct jpeg_downsampler { 00096 JMETHOD(void, start_pass, (j_compress_ptr cinfo)); 00097 JMETHOD(void, downsample, (j_compress_ptr cinfo, 00098 JSAMPIMAGE input_buf, JDIMENSION in_row_index, 00099 JSAMPIMAGE output_buf, 00100 JDIMENSION out_row_group_index)); 00101 00102 boolean need_context_rows; /* TRUE if need rows above & below */ 00103 }; 00104 00105 /* Marker writing */ 00106 struct jpeg_marker_writer { 00107 JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); 00108 JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); 00109 JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); 00110 JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); 00111 JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); 00112 /* These routines are exported to allow insertion of extra markers */ 00113 /* Probably only COM and APPn markers should be written this way */ 00114 JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, 00115 unsigned int datalen)); 00116 JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); 00117 }; 00118 00119 00120 /* Declarations for decompression modules */ 00121 00122 /* Master control module */ 00123 struct jpeg_decomp_master { 00124 JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); 00125 JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); 00126 00127 /* State variables made visible to other modules */ 00128 boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ 00129 }; 00130 00131 /* Input control module */ 00132 struct jpeg_input_controller { 00133 JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); 00134 JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); 00135 JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); 00136 JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); 00137 00138 /* State variables made visible to other modules */ 00139 boolean has_multiple_scans; /* True if file has multiple scans */ 00140 boolean eoi_reached; /* True when EOI has been consumed */ 00141 }; 00142 00143 /* Main buffer control (downsampled-data buffer) */ 00144 struct jpeg_d_main_controller { 00145 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); 00146 JMETHOD(void, process_data, (j_decompress_ptr cinfo, 00147 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 00148 JDIMENSION out_rows_avail)); 00149 }; 00150 00151 /* Decompression codec (decompressor proper) */ 00152 struct jpeg_d_codec { 00153 JMETHOD(void, calc_output_dimensions, (j_decompress_ptr cinfo)); 00154 JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); 00155 JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); 00156 JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); 00157 JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, 00158 JSAMPIMAGE output_buf)); 00159 }; 00160 00161 /* Decompression postprocessing (color quantization buffer control) */ 00162 struct jpeg_d_post_controller { 00163 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); 00164 JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, 00165 JSAMPIMAGE input_buf, 00166 JDIMENSION *in_row_group_ctr, 00167 JDIMENSION in_row_groups_avail, 00168 JSAMPARRAY output_buf, 00169 JDIMENSION *out_row_ctr, 00170 JDIMENSION out_rows_avail)); 00171 }; 00172 00173 /* Marker reading & parsing */ 00174 struct jpeg_marker_reader { 00175 JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); 00176 /* Read markers until SOS or EOI. 00177 * Returns same codes as are defined for jpeg_consume_input: 00178 * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. 00179 */ 00180 JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); 00181 /* Read a restart marker --- exported for use by entropy decoder only */ 00182 jpeg_marker_parser_method read_restart_marker; 00183 00184 /* State of marker reader --- nominally internal, but applications 00185 * supplying COM or APPn handlers might like to know the state. 00186 */ 00187 boolean saw_SOI; /* found SOI? */ 00188 boolean saw_SOF; /* found SOF? */ 00189 int next_restart_num; /* next restart number expected (0-7) */ 00190 unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ 00191 }; 00192 00193 /* Upsampling (note that upsampler must also call color converter) */ 00194 struct jpeg_upsampler { 00195 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 00196 JMETHOD(void, upsample, (j_decompress_ptr cinfo, 00197 JSAMPIMAGE input_buf, 00198 JDIMENSION *in_row_group_ctr, 00199 JDIMENSION in_row_groups_avail, 00200 JSAMPARRAY output_buf, 00201 JDIMENSION *out_row_ctr, 00202 JDIMENSION out_rows_avail)); 00203 00204 boolean need_context_rows; /* TRUE if need rows above & below */ 00205 }; 00206 00207 /* Colorspace conversion */ 00208 struct jpeg_color_deconverter { 00209 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 00210 JMETHOD(void, color_convert, (j_decompress_ptr cinfo, 00211 JSAMPIMAGE input_buf, JDIMENSION input_row, 00212 JSAMPARRAY output_buf, int num_rows)); 00213 }; 00214 00215 /* Color quantization or color precision reduction */ 00216 struct jpeg_color_quantizer { 00217 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); 00218 JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, 00219 JSAMPARRAY input_buf, JSAMPARRAY output_buf, 00220 int num_rows)); 00221 JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); 00222 JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); 00223 }; 00224 00225 00226 /* Miscellaneous useful macros */ 00227 00228 #undef MAX 00229 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 00230 #undef MIN 00231 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 00232 00233 00234 /* We assume that right shift corresponds to signed division by 2 with 00235 * rounding towards minus infinity. This is correct for typical "arithmetic 00236 * shift" instructions that shift in copies of the sign bit. But some 00237 * C compilers implement >> with an unsigned shift. For these machines you 00238 * must define RIGHT_SHIFT_IS_UNSIGNED. 00239 * RIGHT_SHIFT provides a proper signed right shift of an IJG_INT32 quantity. 00240 * It is only applied with constant shift counts. SHIFT_TEMPS must be 00241 * included in the variables of any routine using RIGHT_SHIFT. 00242 */ 00243 00244 #ifdef RIGHT_SHIFT_IS_UNSIGNED 00245 #define SHIFT_TEMPS IJG_INT32 shift_temp; 00246 #define RIGHT_SHIFT(x,shft) \ 00247 ((shift_temp = (x)) < 0 ? \ 00248 (shift_temp >> (shft)) | ((~((IJG_INT32) 0)) << (32-(shft))) : \ 00249 (shift_temp >> (shft))) 00250 #else 00251 #define SHIFT_TEMPS 00252 #define RIGHT_SHIFT(x,shft) ((x) >> (shft)) 00253 #endif 00254 00255 00256 /* Short forms of external names for systems with brain-damaged linkers. */ 00257 00258 #ifdef NEED_SHORT_EXTERNAL_NAMES 00259 #define jinit_c_codec jinit8_c_codec 00260 #define jinit_c_diff_controller jinit8_c_diff_controller 00261 #define jinit_lossy_c_codec jinit8_lossy_c_codec 00262 #define jinit_lossless_c_codec jinit8_lossless_c_codec 00263 #define jinit_compress_master jinit8_compress_master 00264 #define jinit_c_master_control jinit8_c_master_control 00265 #define jinit_c_main_controller jinit8_c_main_controller 00266 #define jinit_c_prep_controller jinit8_c_prep_controller 00267 #define jinit_c_coef_controller jinit8_c_coef_controller 00268 #define jinit_color_converter jinit8_color_converter 00269 #define jinit_downsampler jinit8_downsampler 00270 #define jinit_forward_dct jinit8_forward_dct 00271 #define jinit_shuff_encoder jinit8_shuff_encoder 00272 #define jinit_phuff_encoder jinit8_phuff_encoder 00273 #ifdef WITH_ARITHMETIC_PATCH 00274 #define jinit_arith_encoder jinit8_arith_encoder 00275 #endif 00276 #define jinit_marker_writer jinit8_marker_writer 00277 #define jinit_d_codec jinit8_d_codec 00278 #define jinit_lossy_d_codec jinit8_lossy_d_codec 00279 #define jinit_lossless_d_codec jinit8_lossless_d_codec 00280 #define jinit_master_decompress jinit8_master_decompress 00281 #define jinit_d_main_controller jinit8_d_main_controller 00282 #define jinit_d_coef_controller jinit8_d_coef_controller 00283 #define jinit_d_diff_controller jinit8_d_diff_controller 00284 #define jinit_d_post_controller jinit8_d_post_controller 00285 #define jinit_input_controller jinit8_input_controller 00286 #define jinit_marker_reader jinit8_marker_reader 00287 #define jinit_shuff_decoder jinit8_shuff_decoder 00288 #define jinit_phuff_decoder jinit8_phuff_decoder 00289 #ifdef WITH_ARITHMETIC_PATCH 00290 #define jinit_arith_decoder jinit8_arith_decoder 00291 #endif 00292 #define jinit_lhuff_decoder jinit8_lhuff_decoder 00293 #define jinit_undifferencer jinit8_undifferencer 00294 #define jinit_d_scaler jinit8_d_scaler 00295 #define jinit_inverse_dct jinit8_inverse_dct 00296 #define jinit_upsampler jinit8_upsampler 00297 #define jinit_color_deconverter jinit8_color_deconverter 00298 #define jinit_1pass_quantizer jinit8_1pass_quantizer 00299 #define jinit_2pass_quantizer jinit8_2pass_quantizer 00300 #define jinit_merged_upsampler jinit8_merged_upsampler 00301 #define jinit_memory_mgr jinit8_memory_mgr 00302 #define jdiv_round_up jdiv8_round_up 00303 #define jround_up jround8_up 00304 #define jcopy_sample_rows jcopy8_sample_rows 00305 #define jcopy_block_row jcopy8_block_row 00306 #define jzero_far jzero8_far 00307 #define jpeg_zigzag_order jpeg8_zigzag_order 00308 #define jpeg_natural_order jpeg8_natural_order 00309 #endif /* NEED_SHORT_EXTERNAL_NAMES */ 00310 00311 00312 /* Compression module initialization routines */ 00313 EXTERN(void) jinit_c_codec JPP((j_compress_ptr cinfo)); 00314 EXTERN(void) jinit_c_diff_controller JPP((j_compress_ptr cinfo, boolean need_full_buffer)); 00315 EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); 00316 EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, 00317 boolean transcode_only)); 00318 EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, 00319 boolean need_full_buffer)); 00320 EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, 00321 boolean need_full_buffer)); 00322 EXTERN(void) jinit_compressor JPP((j_compress_ptr cinfo)); 00323 EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); 00324 EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); 00325 EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); 00326 #ifdef WITH_ARITHMETIC_PATCH 00327 EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo)); 00328 #endif 00329 /* Decompression module initialization routines */ 00330 EXTERN(void) jinit_d_codec JPP((j_decompress_ptr cinfo)); 00331 EXTERN(void) jinit_d_diff_controller JPP((j_decompress_ptr cinfo, boolean need_full_buffer)); 00332 EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); 00333 EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, 00334 boolean need_full_buffer)); 00335 EXTERN(void) jinit_decompressor JPP((j_decompress_ptr cinfo)); 00336 EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, 00337 boolean need_full_buffer)); 00338 EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); 00339 EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); 00340 #ifdef WITH_ARITHMETIC_PATCH 00341 EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo)); 00342 #endif 00343 EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); 00344 EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); 00345 EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); 00346 EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); 00347 EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); 00348 /* Memory manager initialization */ 00349 EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); 00350 00351 /* Utility routines in jutils.c */ 00352 EXTERN(long) jdiv_round_up JPP((long a, long b)); 00353 EXTERN(long) jround_up JPP((long a, long b)); 00354 EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, 00355 JSAMPARRAY output_array, int dest_row, 00356 int num_rows, JDIMENSION num_cols)); 00357 EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, 00358 JDIMENSION num_blocks)); 00359 EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); 00360 /* Constant tables in jutils.c */ 00361 #if 0 /* This table is not actually needed in v6a */ 00362 extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ 00363 #endif 00364 extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ 00365 00366 /* Suppress undefined-structure complaints if necessary. */ 00367 00368 #ifdef INCOMPLETE_TYPES_BROKEN 00369 #ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ 00370 struct jvirt_sarray_control { long dummy; }; 00371 struct jvirt_barray_control { long dummy; }; 00372 #endif 00373 #endif /* INCOMPLETE_TYPES_BROKEN */