1 /* 2 * jpegint.h 3 * 4 * Copyright (C) 1991-1998, Thomas G. Lane. 5 * This file is part of the Independent JPEG Group's software. 6 * For conditions of distribution and use, see the accompanying README file. 7 * 8 * This file provides common declarations for the various JPEG modules. 9 * These declarations are considered internal to the JPEG library; most 10 * applications using the library shouldn't need to include this file. 11 */ 12 13 14 /* Declarations for both compression & decompression */ 15 16 typedef enum { /* Operating modes for buffer controllers */ 17 JBUF_PASS_THRU, /* Plain stripwise operation */ 18 /* Remaining modes require a full-image buffer to have been created */ 19 JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ 20 JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ 21 JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ 22 } J_BUF_MODE; 23 24 /* Values of global_state field (jdapi.c has some dependencies on ordering!) */ 25 #define CSTATE_START 100 /* after create_compress */ 26 #define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ 27 #define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ 28 #define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ 29 #define DSTATE_START 200 /* after create_decompress */ 30 #define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ 31 #define DSTATE_READY 202 /* found SOS, ready for start_decompress */ 32 #define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ 33 #define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ 34 #define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ 35 #define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ 36 #define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ 37 #define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ 38 #define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ 39 #define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ 40 41 42 /* Declarations for compression modules */ 43 44 /* Master control module */ 45 struct jpeg_comp_master { 46 JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); 47 JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); 48 JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); 49 50 /* State variables made visible to other modules */ 51 boolean call_pass_startup; /* True if pass_startup must be called */ 52 boolean is_last_pass; /* True during last pass */ 53 }; 54 55 /* Main buffer control (downsampled-data buffer) */ 56 struct jpeg_c_main_controller { 57 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 58 JMETHOD(void, process_data, (j_compress_ptr cinfo, 59 JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, 60 JDIMENSION in_rows_avail)); 61 }; 62 63 /* Compression preprocessing (downsampling input buffer control) */ 64 struct jpeg_c_prep_controller { 65 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 66 JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, 67 JSAMPARRAY input_buf, 68 JDIMENSION *in_row_ctr, 69 JDIMENSION in_rows_avail, 70 JSAMPIMAGE output_buf, 71 JDIMENSION *out_row_group_ctr, 72 JDIMENSION out_row_groups_avail)); 73 }; 74 75 /* Compression codec (compressor proper) */ 76 struct jpeg_c_codec { 77 JMETHOD(void, entropy_start_pass, (j_compress_ptr cinfo, 78 boolean gather_statistics)); 79 JMETHOD(void, entropy_finish_pass, (j_compress_ptr cinfo)); 80 JMETHOD(boolean, need_optimization_pass, (j_compress_ptr cinfo)); 81 JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); 82 JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, 83 JSAMPIMAGE input_buf)); 84 }; 85 86 /* Colorspace conversion */ 87 struct jpeg_color_converter { 88 JMETHOD(void, start_pass, (j_compress_ptr cinfo)); 89 JMETHOD(void, color_convert, (j_compress_ptr cinfo, 90 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, 91 JDIMENSION output_row, int num_rows)); 92 }; 93 94 /* Downsampling */ 95 struct jpeg_downsampler { 96 JMETHOD(void, start_pass, (j_compress_ptr cinfo)); 97 JMETHOD(void, downsample, (j_compress_ptr cinfo, 98 JSAMPIMAGE input_buf, JDIMENSION in_row_index, 99 JSAMPIMAGE output_buf, 100 JDIMENSION out_row_group_index)); 101 102 boolean need_context_rows; /* TRUE if need rows above & below */ 103 }; 104 105 /* Marker writing */ 106 struct jpeg_marker_writer { 107 JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); 108 JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); 109 JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); 110 JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); 111 JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); 112 /* These routines are exported to allow insertion of extra markers */ 113 /* Probably only COM and APPn markers should be written this way */ 114 JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, 115 unsigned int datalen)); 116 JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); 117 }; 118 119 120 /* Declarations for decompression modules */ 121 122 /* Master control module */ 123 struct jpeg_decomp_master { 124 JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); 125 JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); 126 127 /* State variables made visible to other modules */ 128 boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ 129 }; 130 131 /* Input control module */ 132 struct jpeg_input_controller { 133 JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); 134 JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); 135 JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); 136 JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); 137 138 /* State variables made visible to other modules */ 139 boolean has_multiple_scans; /* True if file has multiple scans */ 140 boolean eoi_reached; /* True when EOI has been consumed */ 141 }; 142 143 /* Main buffer control (downsampled-data buffer) */ 144 struct jpeg_d_main_controller { 145 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); 146 JMETHOD(void, process_data, (j_decompress_ptr cinfo, 147 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, 148 JDIMENSION out_rows_avail)); 149 }; 150 151 /* Decompression codec (decompressor proper) */ 152 struct jpeg_d_codec { 153 JMETHOD(void, calc_output_dimensions, (j_decompress_ptr cinfo)); 154 JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); 155 JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); 156 JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); 157 JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, 158 JSAMPIMAGE output_buf)); 159 }; 160 161 /* Decompression postprocessing (color quantization buffer control) */ 162 struct jpeg_d_post_controller { 163 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); 164 JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, 165 JSAMPIMAGE input_buf, 166 JDIMENSION *in_row_group_ctr, 167 JDIMENSION in_row_groups_avail, 168 JSAMPARRAY output_buf, 169 JDIMENSION *out_row_ctr, 170 JDIMENSION out_rows_avail)); 171 }; 172 173 /* Marker reading & parsing */ 174 struct jpeg_marker_reader { 175 JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); 176 /* Read markers until SOS or EOI. 177 * Returns same codes as are defined for jpeg_consume_input: 178 * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. 179 */ 180 JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); 181 /* Read a restart marker --- exported for use by entropy decoder only */ 182 jpeg_marker_parser_method read_restart_marker; 183 184 /* State of marker reader --- nominally internal, but applications 185 * supplying COM or APPn handlers might like to know the state. 186 */ 187 boolean saw_SOI; /* found SOI? */ 188 boolean saw_SOF; /* found SOF? */ 189 int next_restart_num; /* next restart number expected (0-7) */ 190 unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ 191 }; 192 193 /* Upsampling (note that upsampler must also call color converter) */ 194 struct jpeg_upsampler { 195 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 196 JMETHOD(void, upsample, (j_decompress_ptr cinfo, 197 JSAMPIMAGE input_buf, 198 JDIMENSION *in_row_group_ctr, 199 JDIMENSION in_row_groups_avail, 200 JSAMPARRAY output_buf, 201 JDIMENSION *out_row_ctr, 202 JDIMENSION out_rows_avail)); 203 204 boolean need_context_rows; /* TRUE if need rows above & below */ 205 }; 206 207 /* Colorspace conversion */ 208 struct jpeg_color_deconverter { 209 JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); 210 JMETHOD(void, color_convert, (j_decompress_ptr cinfo, 211 JSAMPIMAGE input_buf, JDIMENSION input_row, 212 JSAMPARRAY output_buf, int num_rows)); 213 }; 214 215 /* Color quantization or color precision reduction */ 216 struct jpeg_color_quantizer { 217 JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); 218 JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, 219 JSAMPARRAY input_buf, JSAMPARRAY output_buf, 220 int num_rows)); 221 JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); 222 JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); 223 }; 224 225 226 /* Miscellaneous useful macros */ 227 228 #undef MAX 229 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 230 #undef MIN 231 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 232 233 234 /* We assume that right shift corresponds to signed division by 2 with 235 * rounding towards minus infinity. This is correct for typical "arithmetic 236 * shift" instructions that shift in copies of the sign bit. But some 237 * C compilers implement >> with an unsigned shift. For these machines you 238 * must define RIGHT_SHIFT_IS_UNSIGNED. 239 * RIGHT_SHIFT provides a proper signed right shift of an IJG_INT32 quantity. 240 * It is only applied with constant shift counts. SHIFT_TEMPS must be 241 * included in the variables of any routine using RIGHT_SHIFT. 242 */ 243 244 #ifdef RIGHT_SHIFT_IS_UNSIGNED 245 #define SHIFT_TEMPS IJG_INT32 shift_temp; 246 #define RIGHT_SHIFT(x,shft) \ 247 ((shift_temp = (x)) < 0 ? \ 248 (shift_temp >> (shft)) | ((~((IJG_INT32) 0)) << (32-(shft))) : \ 249 (shift_temp >> (shft))) 250 #else 251 #define SHIFT_TEMPS 252 #define RIGHT_SHIFT(x,shft) ((x) >> (shft)) 253 #endif 254 255 256 /* Short forms of external names for systems with brain-damaged linkers. */ 257 258 #ifdef NEED_SHORT_EXTERNAL_NAMES 259 #define jinit_c_codec jinit16_c_codec 260 #define jinit_c_diff_controller jinit16_c_diff_controller 261 #define jinit_lossy_c_codec jinit16_lossy_c_codec 262 #define jinit_lossless_c_codec jinit16_lossless_c_codec 263 #define jinit_compress_master jinit16_compress_master 264 #define jinit_c_master_control jinit16_c_master_control 265 #define jinit_c_main_controller jinit16_c_main_controller 266 #define jinit_c_prep_controller jinit16_c_prep_controller 267 #define jinit_c_coef_controller jinit16_c_coef_controller 268 #define jinit_color_converter jinit16_color_converter 269 #define jinit_downsampler jinit16_downsampler 270 #define jinit_forward_dct jinit16_forward_dct 271 #define jinit_shuff_encoder jinit16_shuff_encoder 272 #define jinit_phuff_encoder jinit16_phuff_encoder 273 #ifdef WITH_ARITHMETIC_PATCH 274 #define jinit_arith_encoder jinit16_arith_encoder 275 #endif 276 #define jinit_marker_writer jinit16_marker_writer 277 #define jinit_d_codec jinit16_d_codec 278 #define jinit_lossy_d_codec jinit16_lossy_d_codec 279 #define jinit_lossless_d_codec jinit16_lossless_d_codec 280 #define jinit_master_decompress jinit16_master_decompress 281 #define jinit_d_main_controller jinit16_d_main_controller 282 #define jinit_d_coef_controller jinit16_d_coef_controller 283 #define jinit_d_diff_controller jinit16_d_diff_controller 284 #define jinit_d_post_controller jinit16_d_post_controller 285 #define jinit_input_controller jinit16_input_controller 286 #define jinit_marker_reader jinit16_marker_reader 287 #define jinit_shuff_decoder jinit16_shuff_decoder 288 #define jinit_phuff_decoder jinit16_phuff_decoder 289 #ifdef WITH_ARITHMETIC_PATCH 290 #define jinit_arith_decoder jinit16_arith_decoder 291 #endif 292 #define jinit_lhuff_decoder jinit16_lhuff_decoder 293 #define jinit_undifferencer jinit16_undifferencer 294 #define jinit_d_scaler jinit16_d_scaler 295 #define jinit_inverse_dct jinit16_inverse_dct 296 #define jinit_upsampler jinit16_upsampler 297 #define jinit_color_deconverter jinit16_color_deconverter 298 #define jinit_1pass_quantizer jinit16_1pass_quantizer 299 #define jinit_2pass_quantizer jinit16_2pass_quantizer 300 #define jinit_merged_upsampler jinit16_merged_upsampler 301 #define jinit_memory_mgr jinit16_memory_mgr 302 #define jdiv_round_up jdiv16_round_up 303 #define jround_up jround16_up 304 #define jcopy_sample_rows jcopy16_sample_rows 305 #define jcopy_block_row jcopy16_block_row 306 #define jzero_far jzero16_far 307 #define jpeg_zigzag_order jpeg16_zigzag_order 308 #define jpeg_natural_order jpeg16_natural_order 309 #endif /* NEED_SHORT_EXTERNAL_NAMES */ 310 311 312 /* Compression module initialization routines */ 313 EXTERN(void) jinit_c_codec JPP((j_compress_ptr cinfo)); 314 EXTERN(void) jinit_c_diff_controller JPP((j_compress_ptr cinfo, boolean need_full_buffer)); 315 EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); 316 EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, 317 boolean transcode_only)); 318 EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, 319 boolean need_full_buffer)); 320 EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, 321 boolean need_full_buffer)); 322 EXTERN(void) jinit_compressor JPP((j_compress_ptr cinfo)); 323 EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); 324 EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); 325 EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); 326 #ifdef WITH_ARITHMETIC_PATCH 327 EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo)); 328 #endif 329 /* Decompression module initialization routines */ 330 EXTERN(void) jinit_d_codec JPP((j_decompress_ptr cinfo)); 331 EXTERN(void) jinit_d_diff_controller JPP((j_decompress_ptr cinfo, boolean need_full_buffer)); 332 EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); 333 EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, 334 boolean need_full_buffer)); 335 EXTERN(void) jinit_decompressor JPP((j_decompress_ptr cinfo)); 336 EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, 337 boolean need_full_buffer)); 338 EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); 339 EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); 340 #ifdef WITH_ARITHMETIC_PATCH 341 EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo)); 342 #endif 343 EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); 344 EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); 345 EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); 346 EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); 347 EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); 348 /* Memory manager initialization */ 349 EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); 350 351 /* Utility routines in jutils.c */ 352 EXTERN(long) jdiv_round_up JPP((long a, long b)); 353 EXTERN(long) jround_up JPP((long a, long b)); 354 EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, 355 JSAMPARRAY output_array, int dest_row, 356 int num_rows, JDIMENSION num_cols)); 357 EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, 358 JDIMENSION num_blocks)); 359 EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); 360 /* Constant tables in jutils.c */ 361 #if 0 /* This table is not actually needed in v6a */ 362 extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ 363 #endif 364 extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ 365 366 /* Suppress undefined-structure complaints if necessary. */ 367 368 #ifdef INCOMPLETE_TYPES_BROKEN 369 #ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ 370 struct jvirt_sarray_control { long dummy; }; 371 struct jvirt_barray_control { long dummy; }; 372 #endif 373 #endif /* INCOMPLETE_TYPES_BROKEN */ 374