4  * Copyright (C) 1991-1997, 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. 
   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. 
  14 /* Declarations for both compression & decompression */ 
  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 */ 
  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 */ 
  42 /* Declarations for compression modules */ 
  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
)); 
  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 */ 
  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
)); 
  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
, 
  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
)); 
  75 /* Coefficient buffer control */ 
  76 struct jpeg_c_coef_controller 
{ 
  77   JMETHOD(void, start_pass
, (j_compress_ptr cinfo
, J_BUF_MODE pass_mode
)); 
  78   JMETHOD(boolean
, compress_data
, (j_compress_ptr cinfo
, 
  79                                    JSAMPIMAGE input_buf
)); 
  82 /* Colorspace conversion */ 
  83 struct jpeg_color_converter 
{ 
  84   JMETHOD(void, start_pass
, (j_compress_ptr cinfo
)); 
  85   JMETHOD(void, color_convert
, (j_compress_ptr cinfo
, 
  86                                 JSAMPARRAY input_buf
, JSAMPIMAGE output_buf
, 
  87                                 JDIMENSION output_row
, int num_rows
)); 
  91 struct jpeg_downsampler 
{ 
  92   JMETHOD(void, start_pass
, (j_compress_ptr cinfo
)); 
  93   JMETHOD(void, downsample
, (j_compress_ptr cinfo
, 
  94                              JSAMPIMAGE input_buf
, JDIMENSION in_row_index
, 
  95                              JSAMPIMAGE output_buf
, 
  96                              JDIMENSION out_row_group_index
)); 
  98   boolean need_context_rows
;    /* TRUE if need rows above & below */ 
 101 /* Forward DCT (also controls coefficient quantization) */ 
 102 struct jpeg_forward_dct 
{ 
 103   JMETHOD(void, start_pass
, (j_compress_ptr cinfo
)); 
 104   /* perhaps this should be an array??? */ 
 105   JMETHOD(void, forward_DCT
, (j_compress_ptr cinfo
, 
 106                               jpeg_component_info 
* compptr
, 
 107                               JSAMPARRAY sample_data
, JBLOCKROW coef_blocks
, 
 108                               JDIMENSION start_row
, JDIMENSION start_col
, 
 109                               JDIMENSION num_blocks
)); 
 112 /* Entropy encoding */ 
 113 struct jpeg_entropy_encoder 
{ 
 114   JMETHOD(void, start_pass
, (j_compress_ptr cinfo
, boolean gather_statistics
)); 
 115   JMETHOD(boolean
, encode_mcu
, (j_compress_ptr cinfo
, JBLOCKROW 
*MCU_data
)); 
 116   JMETHOD(void, finish_pass
, (j_compress_ptr cinfo
)); 
 120 struct jpeg_marker_writer 
{ 
 121   JMETHOD(void, write_file_header
, (j_compress_ptr cinfo
)); 
 122   JMETHOD(void, write_frame_header
, (j_compress_ptr cinfo
)); 
 123   JMETHOD(void, write_scan_header
, (j_compress_ptr cinfo
)); 
 124   JMETHOD(void, write_file_trailer
, (j_compress_ptr cinfo
)); 
 125   JMETHOD(void, write_tables_only
, (j_compress_ptr cinfo
)); 
 126   /* These routines are exported to allow insertion of extra markers */ 
 127   /* Probably only COM and APPn markers should be written this way */ 
 128   JMETHOD(void, write_marker_header
, (j_compress_ptr cinfo
, int marker
, 
 129                                       unsigned int datalen
)); 
 130   JMETHOD(void, write_marker_byte
, (j_compress_ptr cinfo
, int val
)); 
 134 /* Declarations for decompression modules */ 
 136 /* Master control module */ 
 137 struct jpeg_decomp_master 
{ 
 138   JMETHOD(void, prepare_for_output_pass
, (j_decompress_ptr cinfo
)); 
 139   JMETHOD(void, finish_output_pass
, (j_decompress_ptr cinfo
)); 
 141   /* State variables made visible to other modules */ 
 142   boolean is_dummy_pass
;        /* True during 1st pass for 2-pass quant */ 
 145 /* Input control module */ 
 146 struct jpeg_input_controller 
{ 
 147   JMETHOD(int, consume_input
, (j_decompress_ptr cinfo
)); 
 148   JMETHOD(void, reset_input_controller
, (j_decompress_ptr cinfo
)); 
 149   JMETHOD(void, start_input_pass
, (j_decompress_ptr cinfo
)); 
 150   JMETHOD(void, finish_input_pass
, (j_decompress_ptr cinfo
)); 
 152   /* State variables made visible to other modules */ 
 153   boolean has_multiple_scans
;   /* True if file has multiple scans */ 
 154   boolean eoi_reached
;          /* True when EOI has been consumed */ 
 157 /* Main buffer control (downsampled-data buffer) */ 
 158 struct jpeg_d_main_controller 
{ 
 159   JMETHOD(void, start_pass
, (j_decompress_ptr cinfo
, J_BUF_MODE pass_mode
)); 
 160   JMETHOD(void, process_data
, (j_decompress_ptr cinfo
, 
 161                                JSAMPARRAY output_buf
, JDIMENSION 
*out_row_ctr
, 
 162                                JDIMENSION out_rows_avail
)); 
 165 /* Coefficient buffer control */ 
 166 struct jpeg_d_coef_controller 
{ 
 167   JMETHOD(void, start_input_pass
, (j_decompress_ptr cinfo
)); 
 168   JMETHOD(int, consume_data
, (j_decompress_ptr cinfo
)); 
 169   JMETHOD(void, start_output_pass
, (j_decompress_ptr cinfo
)); 
 170   JMETHOD(int, decompress_data
, (j_decompress_ptr cinfo
, 
 171                                  JSAMPIMAGE output_buf
)); 
 172   /* Pointer to array of coefficient virtual arrays, or NULL if none */ 
 173   jvirt_barray_ptr 
*coef_arrays
; 
 176 /* Decompression postprocessing (color quantization buffer control) */ 
 177 struct jpeg_d_post_controller 
{ 
 178   JMETHOD(void, start_pass
, (j_decompress_ptr cinfo
, J_BUF_MODE pass_mode
)); 
 179   JMETHOD(void, post_process_data
, (j_decompress_ptr cinfo
, 
 180                                     JSAMPIMAGE input_buf
, 
 181                                     JDIMENSION 
*in_row_group_ctr
, 
 182                                     JDIMENSION in_row_groups_avail
, 
 183                                     JSAMPARRAY output_buf
, 
 184                                     JDIMENSION 
*out_row_ctr
, 
 185                                     JDIMENSION out_rows_avail
)); 
 188 /* Marker reading & parsing */ 
 189 struct jpeg_marker_reader 
{ 
 190   JMETHOD(void, reset_marker_reader
, (j_decompress_ptr cinfo
)); 
 191   /* Read markers until SOS or EOI. 
 192    * Returns same codes as are defined for jpeg_consume_input: 
 193    * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. 
 195   JMETHOD(int, read_markers
, (j_decompress_ptr cinfo
)); 
 196   /* Read a restart marker --- exported for use by entropy decoder only */ 
 197   jpeg_marker_parser_method read_restart_marker
; 
 199   /* State of marker reader --- nominally internal, but applications 
 200    * supplying COM or APPn handlers might like to know the state. 
 202   boolean saw_SOI
;              /* found SOI? */ 
 203   boolean saw_SOF
;              /* found SOF? */ 
 204   int next_restart_num
;         /* next restart number expected (0-7) */ 
 205   unsigned int discarded_bytes
; /* # of bytes skipped looking for a marker */ 
 208 /* Entropy decoding */ 
 209 struct jpeg_entropy_decoder 
{ 
 210   JMETHOD(void, start_pass
, (j_decompress_ptr cinfo
)); 
 211   JMETHOD(boolean
, decode_mcu
, (j_decompress_ptr cinfo
, 
 212                                 JBLOCKROW 
*MCU_data
)); 
 214   /* This is here to share code between baseline and progressive decoders; */ 
 215   /* other modules probably should not use it */ 
 216   boolean insufficient_data
;    /* set TRUE after emitting warning */ 
 219 /* Inverse DCT (also performs dequantization) */ 
 220 typedef JMETHOD(void, inverse_DCT_method_ptr
, 
 221                 (j_decompress_ptr cinfo
, jpeg_component_info 
* compptr
, 
 223                  JSAMPARRAY output_buf
, JDIMENSION output_col
)); 
 225 struct jpeg_inverse_dct 
{ 
 226   JMETHOD(void, start_pass
, (j_decompress_ptr cinfo
)); 
 227   /* It is useful to allow each component to have a separate IDCT method. */ 
 228   inverse_DCT_method_ptr inverse_DCT
[MAX_COMPONENTS
]; 
 231 /* Upsampling (note that upsampler must also call color converter) */ 
 232 struct jpeg_upsampler 
{ 
 233   JMETHOD(void, start_pass
, (j_decompress_ptr cinfo
)); 
 234   JMETHOD(void, upsample
, (j_decompress_ptr cinfo
, 
 235                            JSAMPIMAGE input_buf
, 
 236                            JDIMENSION 
*in_row_group_ctr
, 
 237                            JDIMENSION in_row_groups_avail
, 
 238                            JSAMPARRAY output_buf
, 
 239                            JDIMENSION 
*out_row_ctr
, 
 240                            JDIMENSION out_rows_avail
)); 
 242   boolean need_context_rows
;    /* TRUE if need rows above & below */ 
 245 /* Colorspace conversion */ 
 246 struct jpeg_color_deconverter 
{ 
 247   JMETHOD(void, start_pass
, (j_decompress_ptr cinfo
)); 
 248   JMETHOD(void, color_convert
, (j_decompress_ptr cinfo
, 
 249                                 JSAMPIMAGE input_buf
, JDIMENSION input_row
, 
 250                                 JSAMPARRAY output_buf
, int num_rows
)); 
 253 /* Color quantization or color precision reduction */ 
 254 struct jpeg_color_quantizer 
{ 
 255   JMETHOD(void, start_pass
, (j_decompress_ptr cinfo
, boolean is_pre_scan
)); 
 256   JMETHOD(void, color_quantize
, (j_decompress_ptr cinfo
, 
 257                                  JSAMPARRAY input_buf
, JSAMPARRAY output_buf
, 
 259   JMETHOD(void, finish_pass
, (j_decompress_ptr cinfo
)); 
 260   JMETHOD(void, new_color_map
, (j_decompress_ptr cinfo
)); 
 264 /* Miscellaneous useful macros */ 
 267 #define MAX(a,b)        ((a) > (b) ? (a) : (b)) 
 269 #define MIN(a,b)        ((a) < (b) ? (a) : (b)) 
 272 /* We assume that right shift corresponds to signed division by 2 with 
 273  * rounding towards minus infinity.  This is correct for typical "arithmetic 
 274  * shift" instructions that shift in copies of the sign bit.  But some 
 275  * C compilers implement >> with an unsigned shift.  For these machines you 
 276  * must define RIGHT_SHIFT_IS_UNSIGNED. 
 277  * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. 
 278  * It is only applied with constant shift counts.  SHIFT_TEMPS must be 
 279  * included in the variables of any routine using RIGHT_SHIFT. 
 282 #ifdef RIGHT_SHIFT_IS_UNSIGNED 
 283 #define SHIFT_TEMPS     INT32 shift_temp; 
 284 #define RIGHT_SHIFT(x,shft)  \ 
 285         ((shift_temp = (x)) < 0 ? \ 
 286          (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ 
 287          (shift_temp >> (shft))) 
 290 #define RIGHT_SHIFT(x,shft)     ((x) >> (shft)) 
 294 /* Short forms of external names for systems with brain-damaged linkers. */ 
 296 #ifdef NEED_SHORT_EXTERNAL_NAMES 
 297 #define jinit_compress_master   jICompress 
 298 #define jinit_c_master_control  jICMaster 
 299 #define jinit_c_main_controller jICMainC 
 300 #define jinit_c_prep_controller jICPrepC 
 301 #define jinit_c_coef_controller jICCoefC 
 302 #define jinit_color_converter   jICColor 
 303 #define jinit_downsampler       jIDownsampler 
 304 #define jinit_forward_dct       jIFDCT 
 305 #define jinit_huff_encoder      jIHEncoder 
 306 #define jinit_phuff_encoder     jIPHEncoder 
 307 #define jinit_marker_writer     jIMWriter 
 308 #define jinit_master_decompress jIDMaster 
 309 #define jinit_d_main_controller jIDMainC 
 310 #define jinit_d_coef_controller jIDCoefC 
 311 #define jinit_d_post_controller jIDPostC 
 312 #define jinit_input_controller  jIInCtlr 
 313 #define jinit_marker_reader     jIMReader 
 314 #define jinit_huff_decoder      jIHDecoder 
 315 #define jinit_phuff_decoder     jIPHDecoder 
 316 #define jinit_inverse_dct       jIIDCT 
 317 #define jinit_upsampler         jIUpsampler 
 318 #define jinit_color_deconverter jIDColor 
 319 #define jinit_1pass_quantizer   jI1Quant 
 320 #define jinit_2pass_quantizer   jI2Quant 
 321 #define jinit_merged_upsampler  jIMUpsampler 
 322 #define jinit_memory_mgr        jIMemMgr 
 323 #define jdiv_round_up           jDivRound 
 324 #define jround_up               jRound 
 325 #define jcopy_sample_rows       jCopySamples 
 326 #define jcopy_block_row         jCopyBlocks 
 327 #define jzero_far               jZeroFar 
 328 #define jpeg_zigzag_order       jZIGTable 
 329 #define jpeg_natural_order      jZAGTable 
 330 #endif /* NEED_SHORT_EXTERNAL_NAMES */ 
 333 /* Compression module initialization routines */ 
 334 EXTERN(void) jinit_compress_master 
JPP((j_compress_ptr cinfo
)); 
 335 EXTERN(void) jinit_c_master_control 
JPP((j_compress_ptr cinfo
, 
 336                                          boolean transcode_only
)); 
 337 EXTERN(void) jinit_c_main_controller 
JPP((j_compress_ptr cinfo
, 
 338                                           boolean need_full_buffer
)); 
 339 EXTERN(void) jinit_c_prep_controller 
JPP((j_compress_ptr cinfo
, 
 340                                           boolean need_full_buffer
)); 
 341 EXTERN(void) jinit_c_coef_controller 
JPP((j_compress_ptr cinfo
, 
 342                                           boolean need_full_buffer
)); 
 343 EXTERN(void) jinit_color_converter 
JPP((j_compress_ptr cinfo
)); 
 344 EXTERN(void) jinit_downsampler 
JPP((j_compress_ptr cinfo
)); 
 345 EXTERN(void) jinit_forward_dct 
JPP((j_compress_ptr cinfo
)); 
 346 EXTERN(void) jinit_huff_encoder 
JPP((j_compress_ptr cinfo
)); 
 347 EXTERN(void) jinit_phuff_encoder 
JPP((j_compress_ptr cinfo
)); 
 348 EXTERN(void) jinit_marker_writer 
JPP((j_compress_ptr cinfo
)); 
 349 /* Decompression module initialization routines */ 
 350 EXTERN(void) jinit_master_decompress 
JPP((j_decompress_ptr cinfo
)); 
 351 EXTERN(void) jinit_d_main_controller 
JPP((j_decompress_ptr cinfo
, 
 352                                           boolean need_full_buffer
)); 
 353 EXTERN(void) jinit_d_coef_controller 
JPP((j_decompress_ptr cinfo
, 
 354                                           boolean need_full_buffer
)); 
 355 EXTERN(void) jinit_d_post_controller 
JPP((j_decompress_ptr cinfo
, 
 356                                           boolean need_full_buffer
)); 
 357 EXTERN(void) jinit_input_controller 
JPP((j_decompress_ptr cinfo
)); 
 358 EXTERN(void) jinit_marker_reader 
JPP((j_decompress_ptr cinfo
)); 
 359 EXTERN(void) jinit_huff_decoder 
JPP((j_decompress_ptr cinfo
)); 
 360 EXTERN(void) jinit_phuff_decoder 
JPP((j_decompress_ptr cinfo
)); 
 361 EXTERN(void) jinit_inverse_dct 
JPP((j_decompress_ptr cinfo
)); 
 362 EXTERN(void) jinit_upsampler 
JPP((j_decompress_ptr cinfo
)); 
 363 EXTERN(void) jinit_color_deconverter 
JPP((j_decompress_ptr cinfo
)); 
 364 EXTERN(void) jinit_1pass_quantizer 
JPP((j_decompress_ptr cinfo
)); 
 365 EXTERN(void) jinit_2pass_quantizer 
JPP((j_decompress_ptr cinfo
)); 
 366 EXTERN(void) jinit_merged_upsampler 
JPP((j_decompress_ptr cinfo
)); 
 367 /* Memory manager initialization */ 
 368 EXTERN(void) jinit_memory_mgr 
JPP((j_common_ptr cinfo
)); 
 370 /* Utility routines in jutils.c */ 
 371 EXTERN(long) jdiv_round_up 
JPP((long a
, long b
)); 
 372 EXTERN(long) jround_up 
JPP((long a
, long b
)); 
 373 EXTERN(void) jcopy_sample_rows 
JPP((JSAMPARRAY input_array
, int source_row
, 
 374                                     JSAMPARRAY output_array
, int dest_row
, 
 375                                     int num_rows
, JDIMENSION num_cols
)); 
 376 EXTERN(void) jcopy_block_row 
JPP((JBLOCKROW input_row
, JBLOCKROW output_row
, 
 377                                   JDIMENSION num_blocks
)); 
 378 EXTERN(void) jzero_far 
JPP((void FAR 
* target
, size_t bytestozero
)); 
 379 /* Constant tables in jutils.c */ 
 380 #if 0                           /* This table is not actually needed in v6a */ 
 381 extern const int jpeg_zigzag_order
[]; /* natural coef order to zigzag order */ 
 383 extern const int jpeg_natural_order
[]; /* zigzag coef order to natural order */ 
 385 /* Suppress undefined-structure complaints if necessary. */ 
 387 #ifdef INCOMPLETE_TYPES_BROKEN 
 388 #ifndef AM_MEMORY_MANAGER       /* only jmemmgr.c defines these */ 
 389 struct jvirt_sarray_control 
{ long dummy
; }; 
 390 struct jvirt_barray_control 
{ long dummy
; }; 
 392 #endif /* INCOMPLETE_TYPES_BROKEN */