dcmjpeg/libijg16/jpegint16.h

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       jinit16_c_codec
00260 #define jinit_c_diff_controller     jinit16_c_diff_controller
00261 #define jinit_lossy_c_codec     jinit16_lossy_c_codec
00262 #define jinit_lossless_c_codec      jinit16_lossless_c_codec
00263 #define jinit_compress_master       jinit16_compress_master
00264 #define jinit_c_master_control      jinit16_c_master_control
00265 #define jinit_c_main_controller     jinit16_c_main_controller
00266 #define jinit_c_prep_controller     jinit16_c_prep_controller
00267 #define jinit_c_coef_controller     jinit16_c_coef_controller
00268 #define jinit_color_converter       jinit16_color_converter
00269 #define jinit_downsampler       jinit16_downsampler
00270 #define jinit_forward_dct       jinit16_forward_dct
00271 #define jinit_shuff_encoder     jinit16_shuff_encoder
00272 #define jinit_phuff_encoder     jinit16_phuff_encoder
00273 #ifdef WITH_ARITHMETIC_PATCH
00274 #define jinit_arith_encoder     jinit16_arith_encoder
00275 #endif
00276 #define jinit_marker_writer     jinit16_marker_writer
00277 #define jinit_d_codec       jinit16_d_codec
00278 #define jinit_lossy_d_codec     jinit16_lossy_d_codec
00279 #define jinit_lossless_d_codec      jinit16_lossless_d_codec
00280 #define jinit_master_decompress     jinit16_master_decompress
00281 #define jinit_d_main_controller     jinit16_d_main_controller
00282 #define jinit_d_coef_controller     jinit16_d_coef_controller
00283 #define jinit_d_diff_controller     jinit16_d_diff_controller
00284 #define jinit_d_post_controller     jinit16_d_post_controller
00285 #define jinit_input_controller      jinit16_input_controller
00286 #define jinit_marker_reader     jinit16_marker_reader
00287 #define jinit_shuff_decoder     jinit16_shuff_decoder
00288 #define jinit_phuff_decoder     jinit16_phuff_decoder
00289 #ifdef WITH_ARITHMETIC_PATCH
00290 #define jinit_arith_decoder     jinit16_arith_decoder
00291 #endif
00292 #define jinit_lhuff_decoder     jinit16_lhuff_decoder
00293 #define jinit_undifferencer     jinit16_undifferencer
00294 #define jinit_d_scaler      jinit16_d_scaler
00295 #define jinit_inverse_dct       jinit16_inverse_dct
00296 #define jinit_upsampler     jinit16_upsampler
00297 #define jinit_color_deconverter     jinit16_color_deconverter
00298 #define jinit_1pass_quantizer       jinit16_1pass_quantizer
00299 #define jinit_2pass_quantizer       jinit16_2pass_quantizer
00300 #define jinit_merged_upsampler      jinit16_merged_upsampler
00301 #define jinit_memory_mgr        jinit16_memory_mgr
00302 #define jdiv_round_up       jdiv16_round_up
00303 #define jround_up       jround16_up
00304 #define jcopy_sample_rows       jcopy16_sample_rows
00305 #define jcopy_block_row     jcopy16_block_row
00306 #define jzero_far       jzero16_far
00307 #define jpeg_zigzag_order       jpeg16_zigzag_order
00308 #define jpeg_natural_order      jpeg16_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 */


Generated on 6 Jan 2011 for OFFIS DCMTK Version 3.6.0 by Doxygen 1.5.1