jpegint.h

Go to the documentation of this file.
00001 /*
00002  * jpegint.h
00003  *
00004  * Copyright (C) 1991-1997, Thomas G. Lane.
00005  * Modified 1997-2009 by Guido Vollbeding.
00006  * This file is part of the Independent JPEG Group's software.
00007  * For conditions of distribution and use, see the accompanying README file.
00008  *
00009  * This file provides common declarations for the various JPEG modules.
00010  * These declarations are considered internal to the JPEG library; most
00011  * applications using the library shouldn't need to include this file.
00012  */
00013 
00014 
00015 /* Declarations for both compression & decompression */
00016 
00017 typedef enum {                  /* Operating modes for buffer controllers */
00018         JBUF_PASS_THRU,         /* Plain stripwise operation */
00019         /* Remaining modes require a full-image buffer to have been created */
00020         JBUF_SAVE_SOURCE,       /* Run source subobject only, save output */
00021         JBUF_CRANK_DEST,        /* Run dest subobject only, using saved data */
00022         JBUF_SAVE_AND_PASS      /* Run both subobjects, save output */
00023 } J_BUF_MODE;
00024 
00025 /* Values of global_state field (jdapi.c has some dependencies on ordering!) */
00026 #define CSTATE_START    100     /* after create_compress */
00027 #define CSTATE_SCANNING 101     /* start_compress done, write_scanlines OK */
00028 #define CSTATE_RAW_OK   102     /* start_compress done, write_raw_data OK */
00029 #define CSTATE_WRCOEFS  103     /* jpeg_write_coefficients done */
00030 #define DSTATE_START    200     /* after create_decompress */
00031 #define DSTATE_INHEADER 201     /* reading header markers, no SOS yet */
00032 #define DSTATE_READY    202     /* found SOS, ready for start_decompress */
00033 #define DSTATE_PRELOAD  203     /* reading multiscan file in start_decompress*/
00034 #define DSTATE_PRESCAN  204     /* performing dummy pass for 2-pass quant */
00035 #define DSTATE_SCANNING 205     /* start_decompress done, read_scanlines OK */
00036 #define DSTATE_RAW_OK   206     /* start_decompress done, read_raw_data OK */
00037 #define DSTATE_BUFIMAGE 207     /* expecting jpeg_start_output */
00038 #define DSTATE_BUFPOST  208     /* looking for SOS/EOI in jpeg_finish_output */
00039 #define DSTATE_RDCOEFS  209     /* reading file in jpeg_read_coefficients */
00040 #define DSTATE_STOPPING 210     /* looking for EOI in jpeg_finish_decompress */
00041 
00042 
00043 /* Declarations for compression modules */
00044 
00045 /* Master control module */
00046 struct jpeg_comp_master {
00047   JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
00048   JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
00049   JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
00050 
00051   /* State variables made visible to other modules */
00052   boolean call_pass_startup;    /* True if pass_startup must be called */
00053   boolean is_last_pass;         /* True during last pass */
00054 };
00055 
00056 /* Main buffer control (downsampled-data buffer) */
00057 struct jpeg_c_main_controller {
00058   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
00059   JMETHOD(void, process_data, (j_compress_ptr cinfo,
00060                                JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
00061                                JDIMENSION in_rows_avail));
00062 };
00063 
00064 /* Compression preprocessing (downsampling input buffer control) */
00065 struct jpeg_c_prep_controller {
00066   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
00067   JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
00068                                    JSAMPARRAY input_buf,
00069                                    JDIMENSION *in_row_ctr,
00070                                    JDIMENSION in_rows_avail,
00071                                    JSAMPIMAGE output_buf,
00072                                    JDIMENSION *out_row_group_ctr,
00073                                    JDIMENSION out_row_groups_avail));
00074 };
00075 
00076 /* Coefficient buffer control */
00077 struct jpeg_c_coef_controller {
00078   JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
00079   JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
00080                                    JSAMPIMAGE input_buf));
00081 };
00082 
00083 /* Colorspace conversion */
00084 struct jpeg_color_converter {
00085   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
00086   JMETHOD(void, color_convert, (j_compress_ptr cinfo,
00087                                 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
00088                                 JDIMENSION output_row, int num_rows));
00089 };
00090 
00091 /* Downsampling */
00092 struct jpeg_downsampler {
00093   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
00094   JMETHOD(void, downsample, (j_compress_ptr cinfo,
00095                              JSAMPIMAGE input_buf, JDIMENSION in_row_index,
00096                              JSAMPIMAGE output_buf,
00097                              JDIMENSION out_row_group_index));
00098 
00099   boolean need_context_rows;    /* TRUE if need rows above & below */
00100 };
00101 
00102 /* Forward DCT (also controls coefficient quantization) */
00103 typedef JMETHOD(void, forward_DCT_ptr,
00104                 (j_compress_ptr cinfo, jpeg_component_info * compptr,
00105                  JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
00106                  JDIMENSION start_row, JDIMENSION start_col,
00107                  JDIMENSION num_blocks));
00108 
00109 struct jpeg_forward_dct {
00110   JMETHOD(void, start_pass, (j_compress_ptr cinfo));
00111   /* It is useful to allow each component to have a separate FDCT method. */
00112   forward_DCT_ptr forward_DCT[MAX_COMPONENTS];
00113 };
00114 
00115 /* Entropy encoding */
00116 struct jpeg_entropy_encoder {
00117   JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
00118   JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
00119   JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
00120 };
00121 
00122 /* Marker writing */
00123 struct jpeg_marker_writer {
00124   JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
00125   JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
00126   JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
00127   JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
00128   JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
00129   /* These routines are exported to allow insertion of extra markers */
00130   /* Probably only COM and APPn markers should be written this way */
00131   JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
00132                                       unsigned int datalen));
00133   JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
00134 };
00135 
00136 
00137 /* Declarations for decompression modules */
00138 
00139 /* Master control module */
00140 struct jpeg_decomp_master {
00141   JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
00142   JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
00143 
00144   /* State variables made visible to other modules */
00145   boolean is_dummy_pass;        /* True during 1st pass for 2-pass quant */
00146 };
00147 
00148 /* Input control module */
00149 struct jpeg_input_controller {
00150   JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
00151   JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
00152   JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
00153   JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
00154 
00155   /* State variables made visible to other modules */
00156   boolean has_multiple_scans;   /* True if file has multiple scans */
00157   boolean eoi_reached;          /* True when EOI has been consumed */
00158 };
00159 
00160 /* Main buffer control (downsampled-data buffer) */
00161 struct jpeg_d_main_controller {
00162   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
00163   JMETHOD(void, process_data, (j_decompress_ptr cinfo,
00164                                JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
00165                                JDIMENSION out_rows_avail));
00166 };
00167 
00168 /* Coefficient buffer control */
00169 struct jpeg_d_coef_controller {
00170   JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
00171   JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
00172   JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
00173   JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
00174                                  JSAMPIMAGE output_buf));
00175   /* Pointer to array of coefficient virtual arrays, or NULL if none */
00176   jvirt_barray_ptr *coef_arrays;
00177 };
00178 
00179 /* Decompression postprocessing (color quantization buffer control) */
00180 struct jpeg_d_post_controller {
00181   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
00182   JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
00183                                     JSAMPIMAGE input_buf,
00184                                     JDIMENSION *in_row_group_ctr,
00185                                     JDIMENSION in_row_groups_avail,
00186                                     JSAMPARRAY output_buf,
00187                                     JDIMENSION *out_row_ctr,
00188                                     JDIMENSION out_rows_avail));
00189 };
00190 
00191 /* Marker reading & parsing */
00192 struct jpeg_marker_reader {
00193   JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
00194   /* Read markers until SOS or EOI.
00195    * Returns same codes as are defined for jpeg_consume_input:
00196    * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
00197    */
00198   JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
00199   /* Read a restart marker --- exported for use by entropy decoder only */
00200   jpeg_marker_parser_method read_restart_marker;
00201 
00202   /* State of marker reader --- nominally internal, but applications
00203    * supplying COM or APPn handlers might like to know the state.
00204    */
00205   boolean saw_SOI;              /* found SOI? */
00206   boolean saw_SOF;              /* found SOF? */
00207   int next_restart_num;         /* next restart number expected (0-7) */
00208   unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
00209 };
00210 
00211 /* Entropy decoding */
00212 struct jpeg_entropy_decoder {
00213   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
00214   JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
00215                                 JBLOCKROW *MCU_data));
00216 };
00217 
00218 /* Inverse DCT (also performs dequantization) */
00219 typedef JMETHOD(void, inverse_DCT_method_ptr,
00220                 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
00221                  JCOEFPTR coef_block,
00222                  JSAMPARRAY output_buf, JDIMENSION output_col));
00223 
00224 struct jpeg_inverse_dct {
00225   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
00226   /* It is useful to allow each component to have a separate IDCT method. */
00227   inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
00228 };
00229 
00230 /* Upsampling (note that upsampler must also call color converter) */
00231 struct jpeg_upsampler {
00232   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
00233   JMETHOD(void, upsample, (j_decompress_ptr cinfo,
00234                            JSAMPIMAGE input_buf,
00235                            JDIMENSION *in_row_group_ctr,
00236                            JDIMENSION in_row_groups_avail,
00237                            JSAMPARRAY output_buf,
00238                            JDIMENSION *out_row_ctr,
00239                            JDIMENSION out_rows_avail));
00240 
00241   boolean need_context_rows;    /* TRUE if need rows above & below */
00242 };
00243 
00244 /* Colorspace conversion */
00245 struct jpeg_color_deconverter {
00246   JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
00247   JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
00248                                 JSAMPIMAGE input_buf, JDIMENSION input_row,
00249                                 JSAMPARRAY output_buf, int num_rows));
00250 };
00251 
00252 /* Color quantization or color precision reduction */
00253 struct jpeg_color_quantizer {
00254   JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
00255   JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
00256                                  JSAMPARRAY input_buf, JSAMPARRAY output_buf,
00257                                  int num_rows));
00258   JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
00259   JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
00260 };
00261 
00262 
00263 /* Miscellaneous useful macros */
00264 
00265 #undef MAX
00266 #define MAX(a,b)        ((a) > (b) ? (a) : (b))
00267 #undef MIN
00268 #define MIN(a,b)        ((a) < (b) ? (a) : (b))
00269 
00270 
00271 /* We assume that right shift corresponds to signed division by 2 with
00272  * rounding towards minus infinity.  This is correct for typical "arithmetic
00273  * shift" instructions that shift in copies of the sign bit.  But some
00274  * C compilers implement >> with an unsigned shift.  For these machines you
00275  * must define RIGHT_SHIFT_IS_UNSIGNED.
00276  * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
00277  * It is only applied with constant shift counts.  SHIFT_TEMPS must be
00278  * included in the variables of any routine using RIGHT_SHIFT.
00279  */
00280 
00281 #ifdef RIGHT_SHIFT_IS_UNSIGNED
00282 #define SHIFT_TEMPS     INT32 shift_temp;
00283 #define RIGHT_SHIFT(x,shft)  \
00284         ((shift_temp = (x)) < 0 ? \
00285          (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
00286          (shift_temp >> (shft)))
00287 #else
00288 #define SHIFT_TEMPS
00289 #define RIGHT_SHIFT(x,shft)     ((x) >> (shft))
00290 #endif
00291 
00292 
00293 /* Short forms of external names for systems with brain-damaged linkers. */
00294 
00295 #ifdef NEED_SHORT_EXTERNAL_NAMES
00296 #define jinit_compress_master   jICompress
00297 #define jinit_c_master_control  jICMaster
00298 #define jinit_c_main_controller jICMainC
00299 #define jinit_c_prep_controller jICPrepC
00300 #define jinit_c_coef_controller jICCoefC
00301 #define jinit_color_converter   jICColor
00302 #define jinit_downsampler       jIDownsampler
00303 #define jinit_forward_dct       jIFDCT
00304 #define jinit_huff_encoder      jIHEncoder
00305 #define jinit_arith_encoder     jIAEncoder
00306 #define jinit_marker_writer     jIMWriter
00307 #define jinit_master_decompress jIDMaster
00308 #define jinit_d_main_controller jIDMainC
00309 #define jinit_d_coef_controller jIDCoefC
00310 #define jinit_d_post_controller jIDPostC
00311 #define jinit_input_controller  jIInCtlr
00312 #define jinit_marker_reader     jIMReader
00313 #define jinit_huff_decoder      jIHDecoder
00314 #define jinit_arith_decoder     jIADecoder
00315 #define jinit_inverse_dct       jIIDCT
00316 #define jinit_upsampler         jIUpsampler
00317 #define jinit_color_deconverter jIDColor
00318 #define jinit_1pass_quantizer   jI1Quant
00319 #define jinit_2pass_quantizer   jI2Quant
00320 #define jinit_merged_upsampler  jIMUpsampler
00321 #define jinit_memory_mgr        jIMemMgr
00322 #define jdiv_round_up           jDivRound
00323 #define jround_up               jRound
00324 #define jcopy_sample_rows       jCopySamples
00325 #define jcopy_block_row         jCopyBlocks
00326 #define jzero_far               jZeroFar
00327 #define jpeg_zigzag_order       jZIGTable
00328 #define jpeg_natural_order      jZAGTable
00329 #define jpeg_natural_order7     jZAGTable7
00330 #define jpeg_natural_order6     jZAGTable6
00331 #define jpeg_natural_order5     jZAGTable5
00332 #define jpeg_natural_order4     jZAGTable4
00333 #define jpeg_natural_order3     jZAGTable3
00334 #define jpeg_natural_order2     jZAGTable2
00335 #define jpeg_aritab             jAriTab
00336 #endif /* NEED_SHORT_EXTERNAL_NAMES */
00337 
00338 
00339 /* Compression module initialization routines */
00340 EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
00341 EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
00342                                          boolean transcode_only));
00343 EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
00344                                           boolean need_full_buffer));
00345 EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
00346                                           boolean need_full_buffer));
00347 EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
00348                                           boolean need_full_buffer));
00349 EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
00350 EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
00351 EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
00352 EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
00353 EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo));
00354 EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
00355 /* Decompression module initialization routines */
00356 EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
00357 EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
00358                                           boolean need_full_buffer));
00359 EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
00360                                           boolean need_full_buffer));
00361 EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
00362                                           boolean need_full_buffer));
00363 EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
00364 EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
00365 EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
00366 EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo));
00367 EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
00368 EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
00369 EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
00370 EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
00371 EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
00372 EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
00373 /* Memory manager initialization */
00374 EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
00375 
00376 /* Utility routines in jutils.c */
00377 EXTERN(long) jdiv_round_up JPP((long a, long b));
00378 EXTERN(long) jround_up JPP((long a, long b));
00379 EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
00380                                     JSAMPARRAY output_array, int dest_row,
00381                                     int num_rows, JDIMENSION num_cols));
00382 EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
00383                                   JDIMENSION num_blocks));
00384 EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
00385 /* Constant tables in jutils.c */
00386 #if 0                           /* This table is not actually needed in v6a */
00387 extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
00388 #endif
00389 extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
00390 extern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */
00391 extern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */
00392 extern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */
00393 extern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */
00394 extern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */
00395 extern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */
00396 
00397 /* Arithmetic coding probability estimation tables in jaricom.c */
00398 extern const INT32 jpeg_aritab[];
00399 
00400 /* Suppress undefined-structure complaints if necessary. */
00401 
00402 #ifdef INCOMPLETE_TYPES_BROKEN
00403 #ifndef AM_MEMORY_MANAGER       /* only jmemmgr.c defines these */
00404 struct jvirt_sarray_control { long dummy; };
00405 struct jvirt_barray_control { long dummy; };
00406 #endif
00407 #endif /* INCOMPLETE_TYPES_BROKEN */

Generated on Tue Jul 5 14:13:29 2011 for ROOT_528-00b_version by  doxygen 1.5.1