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 */