886 lines
36 KiB
C
886 lines
36 KiB
C
/*
|
|
* jpegdata.h
|
|
*
|
|
* Copyright (C) 1991, 1992, Thomas G. Lane.
|
|
* This file is part of the Independent JPEG Group's software.
|
|
* For conditions of distribution and use, see the accompanying README file.
|
|
*
|
|
* This file defines shared data structures for the various JPEG modules.
|
|
*/
|
|
|
|
|
|
/*
|
|
* You might need to change some of the following declarations if you are
|
|
* using the JPEG software within a surrounding application program
|
|
* or porting it to an unusual system.
|
|
*/
|
|
|
|
|
|
/* If the source or destination of image data is not to be stdio streams,
|
|
* these types may need work. You can replace them with some kind of
|
|
* pointer or indicator that is useful to you, or just ignore 'em.
|
|
* Note that the user interface and the various jrdxxx/jwrxxx modules
|
|
* will also need work for non-stdio input/output.
|
|
*/
|
|
|
|
typedef FILE * JFILEREF; /* source or dest of JPEG-compressed data */
|
|
|
|
typedef FILE * IFILEREF; /* source or dest of non-JPEG image data */
|
|
|
|
|
|
/* These defines are used in all function definitions and extern declarations.
|
|
* You could modify them if you need to change function linkage conventions,
|
|
* as is shown below for use with C++. Another application would be to make
|
|
* all functions global for use with code profilers that require it.
|
|
* NOTE: the C++ test does the right thing if you are reading this include
|
|
* file in a C++ application to link to JPEG code that's been compiled with a
|
|
* regular C compiler. I'm not sure it works if you try to compile the JPEG
|
|
* code with C++.
|
|
*/
|
|
|
|
#define METHODDEF static /* a function called through method pointers */
|
|
#define LOCAL static /* a function used only in its module */
|
|
#define GLOBAL /* a function referenced thru EXTERNs */
|
|
#ifdef __cplusplus
|
|
#define EXTERN extern "C" /* a reference to a GLOBAL function */
|
|
#else
|
|
#define EXTERN extern /* a reference to a GLOBAL function */
|
|
#endif
|
|
|
|
|
|
/* Here is the pseudo-keyword for declaring pointers that must be "far"
|
|
* on 80x86 machines. Most of the specialized coding for 80x86 is handled
|
|
* by just saying "FAR *" where such a pointer is needed. In a few places
|
|
* explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
|
|
*/
|
|
|
|
#ifdef NEED_FAR_POINTERS
|
|
#define FAR far
|
|
#else
|
|
#define FAR
|
|
#endif
|
|
|
|
|
|
|
|
/* The remaining declarations are not system-dependent, we hope. */
|
|
|
|
|
|
/*
|
|
* NOTE: if you have an ancient, strict-K&R C compiler, it may choke on the
|
|
* similarly-named fields in compress_info_struct and decompress_info_struct.
|
|
* If this happens, you can get around it by rearranging the two structs so
|
|
* that the similarly-named fields appear first and in the same order in
|
|
* each struct. Since such compilers are now pretty rare, we haven't done
|
|
* this in the portable code, preferring to maintain a logical ordering.
|
|
*/
|
|
|
|
|
|
|
|
/* This macro is used to declare a "method", that is, a function pointer. */
|
|
/* We want to supply prototype parameters if the compiler can cope. */
|
|
/* Note that the arglist parameter must be parenthesized! */
|
|
|
|
#ifdef PROTO
|
|
#define METHOD(type,methodname,arglist) type (*methodname) arglist
|
|
#else
|
|
#define METHOD(type,methodname,arglist) type (*methodname) ()
|
|
#endif
|
|
|
|
/* Forward references to lists of method pointers */
|
|
typedef struct external_methods_struct * external_methods_ptr;
|
|
typedef struct compress_methods_struct * compress_methods_ptr;
|
|
typedef struct decompress_methods_struct * decompress_methods_ptr;
|
|
|
|
|
|
/* Data structures for images containing either samples or coefficients. */
|
|
/* Note that the topmost (leftmost) index is always color component. */
|
|
/* On 80x86 machines, the image arrays are too big for near pointers, */
|
|
/* but the pointer arrays can fit in near memory. */
|
|
|
|
typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */
|
|
typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */
|
|
typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
|
|
|
|
|
|
#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
|
|
#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
|
|
|
|
typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
|
|
typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */
|
|
typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */
|
|
typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */
|
|
|
|
typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */
|
|
|
|
|
|
/* The input and output data of the DCT transform subroutines are of
|
|
* the following type, which need not be the same as JCOEF.
|
|
* For example, on a machine with fast floating point, it might make sense
|
|
* to recode the DCT routines to use floating point; then DCTELEM would be
|
|
* 'float' or 'double'.
|
|
*/
|
|
|
|
typedef JCOEF DCTELEM;
|
|
typedef DCTELEM DCTBLOCK[DCTSIZE2];
|
|
|
|
|
|
/* Types for JPEG compression parameters and working tables. */
|
|
|
|
|
|
typedef enum { /* defines known color spaces */
|
|
CS_UNKNOWN, /* error/unspecified */
|
|
CS_GRAYSCALE, /* monochrome (only 1 component) */
|
|
CS_RGB, /* red/green/blue */
|
|
CS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
|
|
CS_YIQ, /* Y/I/Q */
|
|
CS_CMYK /* C/M/Y/K */
|
|
} COLOR_SPACE;
|
|
|
|
|
|
typedef struct { /* Basic info about one component */
|
|
/* These values are fixed over the whole image */
|
|
/* For compression, they must be supplied by the user interface; */
|
|
/* for decompression, they are read from the SOF marker. */
|
|
short component_id; /* identifier for this component (0..255) */
|
|
short component_index; /* its index in SOF or cinfo->comp_info[] */
|
|
short h_samp_factor; /* horizontal sampling factor (1..4) */
|
|
short v_samp_factor; /* vertical sampling factor (1..4) */
|
|
short quant_tbl_no; /* quantization table selector (0..3) */
|
|
/* These values may vary between scans */
|
|
/* For compression, they must be supplied by the user interface; */
|
|
/* for decompression, they are read from the SOS marker. */
|
|
short dc_tbl_no; /* DC entropy table selector (0..3) */
|
|
short ac_tbl_no; /* AC entropy table selector (0..3) */
|
|
/* These values are computed during compression or decompression startup */
|
|
long true_comp_width; /* component's image width in samples */
|
|
long true_comp_height; /* component's image height in samples */
|
|
/* the above are the logical dimensions of the subsampled image */
|
|
/* These values are computed before starting a scan of the component */
|
|
short MCU_width; /* number of blocks per MCU, horizontally */
|
|
short MCU_height; /* number of blocks per MCU, vertically */
|
|
short MCU_blocks; /* MCU_width * MCU_height */
|
|
long subsampled_width; /* image width in samples, after expansion */
|
|
long subsampled_height; /* image height in samples, after expansion */
|
|
/* the above are the true_comp_xxx values rounded up to multiples of */
|
|
/* the MCU dimensions; these are the working dimensions of the array */
|
|
/* as it is passed through the DCT or IDCT step. NOTE: these values */
|
|
/* differ depending on whether the component is interleaved or not!! */
|
|
} jpeg_component_info;
|
|
|
|
|
|
/* DCT coefficient quantization tables.
|
|
* For 8-bit precision, 'INT16' should be good enough for quantization values;
|
|
* for more precision, we go for the full 16 bits. 'INT16' provides a useful
|
|
* speedup on many machines (multiplication & division of JCOEFs by
|
|
* quantization values is a significant chunk of the runtime).
|
|
* Note: the values in a QUANT_TBL are always given in zigzag order.
|
|
*/
|
|
#ifdef EIGHT_BIT_SAMPLES
|
|
typedef INT16 QUANT_VAL; /* element of a quantization table */
|
|
#else
|
|
typedef UINT16 QUANT_VAL; /* element of a quantization table */
|
|
#endif
|
|
typedef QUANT_VAL QUANT_TBL[DCTSIZE2]; /* A quantization table */
|
|
typedef QUANT_VAL * QUANT_TBL_PTR; /* pointer to same */
|
|
|
|
|
|
typedef struct { /* A Huffman coding table */
|
|
/* These two fields directly represent the contents of a JPEG DHT marker */
|
|
UINT8 bits[17]; /* bits[k] = # of symbols with codes of */
|
|
/* length k bits; bits[0] is unused */
|
|
UINT8 huffval[256]; /* The symbols, in order of incr code length */
|
|
/* This field is used only during compression. It's initialized FALSE when
|
|
* the table is created, and set TRUE when it's been output to the file.
|
|
*/
|
|
boolean sent_table; /* TRUE when table has been output */
|
|
/* The remaining fields are computed from the above to allow more efficient
|
|
* coding and decoding. These fields should be considered private to the
|
|
* Huffman compression & decompression modules.
|
|
*/
|
|
/* encoding tables: */
|
|
UINT16 ehufco[256]; /* code for each symbol */
|
|
char ehufsi[256]; /* length of code for each symbol */
|
|
/* decoding tables: (element [0] of each array is unused) */
|
|
UINT16 mincode[17]; /* smallest code of length k */
|
|
INT32 maxcode[18]; /* largest code of length k (-1 if none) */
|
|
/* (maxcode[17] is a sentinel to ensure huff_DECODE terminates) */
|
|
short valptr[17]; /* huffval[] index of 1st symbol of length k */
|
|
} HUFF_TBL;
|
|
|
|
|
|
#define NUM_QUANT_TBLS 4 /* quantization tables are numbered 0..3 */
|
|
#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
|
|
#define NUM_ARITH_TBLS 16 /* arith-coding tables are numbered 0..15 */
|
|
#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */
|
|
#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */
|
|
#define MAX_BLOCKS_IN_MCU 10 /* JPEG limit on # of blocks in an MCU */
|
|
|
|
|
|
/* Working data for compression */
|
|
|
|
struct compress_info_struct {
|
|
/*
|
|
* All of these fields shall be established by the user interface before
|
|
* calling jpeg_compress, or by the input_init or c_ui_method_selection
|
|
* methods.
|
|
* Most parameters can be set to reasonable defaults by j_c_defaults.
|
|
* Note that the UI must supply the storage for the main methods struct,
|
|
* though it sets only a few of the methods there.
|
|
*/
|
|
compress_methods_ptr methods; /* Points to list of methods to use */
|
|
|
|
external_methods_ptr emethods; /* Points to list of methods to use */
|
|
|
|
IFILEREF input_file; /* tells input routines where to read image */
|
|
JFILEREF output_file; /* tells output routines where to write JPEG */
|
|
|
|
long image_width; /* input image width */
|
|
long image_height; /* input image height */
|
|
short input_components; /* # of color components in input image */
|
|
|
|
short data_precision; /* bits of precision in image data */
|
|
|
|
COLOR_SPACE in_color_space; /* colorspace of input file */
|
|
COLOR_SPACE jpeg_color_space; /* colorspace of JPEG file */
|
|
|
|
double input_gamma; /* image gamma of input file */
|
|
|
|
boolean write_JFIF_header; /* should a JFIF marker be written? */
|
|
/* These three values are not used by the JPEG code, only copied */
|
|
/* into the JFIF APP0 marker. density_unit can be 0 for unknown, */
|
|
/* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */
|
|
/* ratio is defined by X_density/Y_density even when density_unit=0. */
|
|
UINT8 density_unit; /* JFIF code for pixel size units */
|
|
UINT16 X_density; /* Horizontal pixel density */
|
|
UINT16 Y_density; /* Vertical pixel density */
|
|
|
|
short num_components; /* # of color components in JPEG image */
|
|
jpeg_component_info * comp_info;
|
|
/* comp_info[i] describes component that appears i'th in SOF */
|
|
|
|
QUANT_TBL_PTR quant_tbl_ptrs[NUM_QUANT_TBLS];
|
|
/* ptrs to coefficient quantization tables, or NULL if not defined */
|
|
|
|
HUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
|
|
HUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
|
|
/* ptrs to Huffman coding tables, or NULL if not defined */
|
|
|
|
UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arithmetic-coding tables */
|
|
UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arithmetic-coding tables */
|
|
UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arithmetic-coding tables */
|
|
|
|
boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
|
|
boolean interleave; /* TRUE=interleaved output, FALSE=not */
|
|
boolean optimize_coding; /* TRUE=optimize entropy encoding parms */
|
|
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
|
|
|
|
UINT16 restart_interval;/* MDUs per restart interval, or 0 for no restart */
|
|
|
|
/*
|
|
* These fields are computed during jpeg_compress startup
|
|
*/
|
|
short max_h_samp_factor; /* largest h_samp_factor */
|
|
short max_v_samp_factor; /* largest v_samp_factor */
|
|
|
|
/*
|
|
* These fields may be useful for progress monitoring
|
|
*/
|
|
|
|
int total_passes; /* number of passes expected */
|
|
int completed_passes; /* number of passes completed so far */
|
|
|
|
/*
|
|
* These fields are valid during any one scan
|
|
*/
|
|
short comps_in_scan; /* # of JPEG components output this time */
|
|
jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
|
|
/* *cur_comp_info[i] describes component that appears i'th in SOS */
|
|
|
|
long MCUs_per_row; /* # of MCUs across the image */
|
|
long MCU_rows_in_scan; /* # of MCU rows in the image */
|
|
|
|
short blocks_in_MCU; /* # of DCT blocks per MCU */
|
|
short MCU_membership[MAX_BLOCKS_IN_MCU];
|
|
/* MCU_membership[i] is index in cur_comp_info of component owning */
|
|
/* i'th block in an MCU */
|
|
|
|
/* these fields are private data for the entropy encoder */
|
|
JCOEF last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each comp */
|
|
JCOEF last_dc_diff[MAX_COMPS_IN_SCAN]; /* last DC diff for each comp */
|
|
UINT16 restarts_to_go; /* MDUs left in this restart interval */
|
|
short next_restart_num; /* # of next RSTn marker (0..7) */
|
|
};
|
|
|
|
typedef struct compress_info_struct * compress_info_ptr;
|
|
|
|
|
|
/* Working data for decompression */
|
|
|
|
struct decompress_info_struct {
|
|
/*
|
|
* These fields shall be established by the user interface before
|
|
* calling jpeg_decompress.
|
|
* Most parameters can be set to reasonable defaults by j_d_defaults.
|
|
* Note that the UI must supply the storage for the main methods struct,
|
|
* though it sets only a few of the methods there.
|
|
*/
|
|
decompress_methods_ptr methods; /* Points to list of methods to use */
|
|
|
|
external_methods_ptr emethods; /* Points to list of methods to use */
|
|
|
|
JFILEREF input_file; /* tells input routines where to read JPEG */
|
|
IFILEREF output_file; /* tells output routines where to write image */
|
|
|
|
/* these can be set at d_ui_method_selection time: */
|
|
|
|
COLOR_SPACE out_color_space; /* colorspace of output */
|
|
|
|
double output_gamma; /* image gamma wanted in output */
|
|
|
|
boolean quantize_colors; /* T if output is a colormapped format */
|
|
/* the following are ignored if not quantize_colors: */
|
|
boolean two_pass_quantize; /* use two-pass color quantization? */
|
|
boolean use_dithering; /* want color dithering? */
|
|
int desired_number_of_colors; /* max number of colors to use */
|
|
|
|
boolean do_block_smoothing; /* T = apply cross-block smoothing */
|
|
boolean do_pixel_smoothing; /* T = apply post-subsampling smoothing */
|
|
|
|
/*
|
|
* These fields are used for efficient buffering of data between read_jpeg_data
|
|
* and the entropy decoding object. By using a shared buffer, we avoid copying
|
|
* data and eliminate the need for an "unget" operation at the end of a scan.
|
|
* The actual source of the data is known only to read_jpeg_data; see the
|
|
* JGETC macro, below.
|
|
* Note: the user interface is expected to allocate the input_buffer and
|
|
* initialize bytes_in_buffer to 0. Also, for JFIF/raw-JPEG input, the UI
|
|
* actually supplies the read_jpeg_data method. This is all handled by
|
|
* j_d_defaults in a typical implementation.
|
|
*/
|
|
char * input_buffer; /* start of buffer (private to input code) */
|
|
char * next_input_byte; /* => next byte to read from buffer */
|
|
int bytes_in_buffer; /* # of bytes remaining in buffer */
|
|
|
|
/*
|
|
* These fields are set by read_file_header or read_scan_header
|
|
*/
|
|
long image_width; /* overall image width */
|
|
long image_height; /* overall image height */
|
|
|
|
short data_precision; /* bits of precision in image data */
|
|
|
|
COLOR_SPACE jpeg_color_space; /* colorspace of JPEG file */
|
|
|
|
/* These three values are not used by the JPEG code, merely copied */
|
|
/* from the JFIF APP0 marker (if any). */
|
|
UINT8 density_unit; /* JFIF code for pixel size units */
|
|
UINT16 X_density; /* Horizontal pixel density */
|
|
UINT16 Y_density; /* Vertical pixel density */
|
|
|
|
short num_components; /* # of color components in JPEG image */
|
|
jpeg_component_info * comp_info;
|
|
/* comp_info[i] describes component that appears i'th in SOF */
|
|
|
|
QUANT_TBL_PTR quant_tbl_ptrs[NUM_QUANT_TBLS];
|
|
/* ptrs to coefficient quantization tables, or NULL if not defined */
|
|
|
|
HUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
|
|
HUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
|
|
/* ptrs to Huffman coding tables, or NULL if not defined */
|
|
|
|
UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
|
|
UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
|
|
UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
|
|
|
|
boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
|
|
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
|
|
|
|
UINT16 restart_interval;/* MDUs per restart interval, or 0 for no restart */
|
|
|
|
/*
|
|
* These fields are computed during jpeg_decompress startup
|
|
*/
|
|
short max_h_samp_factor; /* largest h_samp_factor */
|
|
short max_v_samp_factor; /* largest v_samp_factor */
|
|
|
|
short color_out_comps; /* # of color components output by color_convert */
|
|
/* (need not match num_components) */
|
|
short final_out_comps; /* # of color components sent to put_pixel_rows */
|
|
/* (1 when quantizing colors, else same as color_out_comps) */
|
|
|
|
/*
|
|
* When quantizing colors, the color quantizer leaves a pointer to the output
|
|
* colormap in these fields. The colormap is valid from the time put_color_map
|
|
* is called (must be before any put_pixel_rows calls) until shutdown (more
|
|
* specifically, until free_all is called to release memory).
|
|
*/
|
|
int actual_number_of_colors; /* actual number of entries */
|
|
JSAMPARRAY colormap; /* NULL if not valid */
|
|
/* map has color_out_comps rows * actual_number_of_colors columns */
|
|
|
|
/*
|
|
* These fields may be useful for progress monitoring
|
|
*/
|
|
|
|
int total_passes; /* number of passes expected */
|
|
int completed_passes; /* number of passes completed so far */
|
|
|
|
/*
|
|
* These fields are valid during any one scan
|
|
*/
|
|
short comps_in_scan; /* # of JPEG components input this time */
|
|
jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
|
|
/* *cur_comp_info[i] describes component that appears i'th in SOS */
|
|
|
|
long MCUs_per_row; /* # of MCUs across the image */
|
|
long MCU_rows_in_scan; /* # of MCU rows in the image */
|
|
|
|
short blocks_in_MCU; /* # of DCT blocks per MCU */
|
|
short MCU_membership[MAX_BLOCKS_IN_MCU];
|
|
/* MCU_membership[i] is index in cur_comp_info of component owning */
|
|
/* i'th block in an MCU */
|
|
|
|
/* these fields are private data for the entropy encoder */
|
|
JCOEF last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each comp */
|
|
JCOEF last_dc_diff[MAX_COMPS_IN_SCAN]; /* last DC diff for each comp */
|
|
UINT16 restarts_to_go; /* MDUs left in this restart interval */
|
|
short next_restart_num; /* # of next RSTn marker (0..7) */
|
|
};
|
|
|
|
typedef struct decompress_info_struct * decompress_info_ptr;
|
|
|
|
|
|
/* Macros for reading data from the decompression input buffer */
|
|
|
|
#ifdef CHAR_IS_UNSIGNED
|
|
#define JGETC(cinfo) ( --(cinfo)->bytes_in_buffer < 0 ? \
|
|
(*(cinfo)->methods->read_jpeg_data) (cinfo) : \
|
|
(int) (*(cinfo)->next_input_byte++) )
|
|
#else
|
|
#define JGETC(cinfo) ( --(cinfo)->bytes_in_buffer < 0 ? \
|
|
(*(cinfo)->methods->read_jpeg_data) (cinfo) : \
|
|
(int) (*(cinfo)->next_input_byte++) & 0xFF )
|
|
#endif
|
|
|
|
#define JUNGETC(ch,cinfo) ((cinfo)->bytes_in_buffer++, \
|
|
*(--((cinfo)->next_input_byte)) = (ch))
|
|
|
|
#define MIN_UNGET 4 /* may always do at least 4 JUNGETCs */
|
|
|
|
|
|
/* A virtual image has a control block whose contents are private to the
|
|
* memory manager module (and may differ between managers). The rest of the
|
|
* code only refers to virtual images by these pointer types, and never
|
|
* dereferences the pointer.
|
|
*/
|
|
|
|
typedef struct big_sarray_control * big_sarray_ptr;
|
|
typedef struct big_barray_control * big_barray_ptr;
|
|
|
|
/* Although a real ANSI C compiler can deal perfectly well with pointers to
|
|
* unspecified structures (see "incomplete types" in the spec), a few pre-ANSI
|
|
* and pseudo-ANSI compilers get confused. To keep one of these bozos happy,
|
|
* add -DINCOMPLETE_TYPES_BROKEN to CFLAGS in your Makefile. Then we will
|
|
* pseudo-define the structs as containing a single "dummy" field.
|
|
* The memory managers #define AM_MEMORY_MANAGER before including this file,
|
|
* so that they can make their own definitions of the structs.
|
|
*/
|
|
|
|
#ifdef INCOMPLETE_TYPES_BROKEN
|
|
#ifndef AM_MEMORY_MANAGER
|
|
struct big_sarray_control { long dummy; };
|
|
struct big_barray_control { long dummy; };
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/* Method types that need typedefs */
|
|
|
|
typedef METHOD(void, MCU_output_method_ptr, (compress_info_ptr cinfo,
|
|
JBLOCK *MCU_data));
|
|
typedef METHOD(void, MCU_output_caller_ptr, (compress_info_ptr cinfo,
|
|
MCU_output_method_ptr output_method));
|
|
typedef METHOD(void, subsample_ptr, (compress_info_ptr cinfo,
|
|
int which_component,
|
|
long input_cols, int input_rows,
|
|
long output_cols, int output_rows,
|
|
JSAMPARRAY above,
|
|
JSAMPARRAY input_data,
|
|
JSAMPARRAY below,
|
|
JSAMPARRAY output_data));
|
|
typedef METHOD(void, unsubsample_ptr, (decompress_info_ptr cinfo,
|
|
int which_component,
|
|
long input_cols, int input_rows,
|
|
long output_cols, int output_rows,
|
|
JSAMPARRAY above,
|
|
JSAMPARRAY input_data,
|
|
JSAMPARRAY below,
|
|
JSAMPARRAY output_data));
|
|
typedef METHOD(void, quantize_method_ptr, (decompress_info_ptr cinfo,
|
|
int num_rows,
|
|
JSAMPIMAGE input_data,
|
|
JSAMPARRAY output_workspace));
|
|
typedef METHOD(void, quantize_caller_ptr, (decompress_info_ptr cinfo,
|
|
quantize_method_ptr quantize_method));
|
|
|
|
|
|
/* These structs contain function pointers for the various JPEG methods. */
|
|
|
|
/* Routines to be provided by the surrounding application, rather than the
|
|
* portable JPEG code proper. These are the same for compression and
|
|
* decompression.
|
|
*/
|
|
|
|
struct external_methods_struct {
|
|
/* User interface: error exit and trace message routines */
|
|
/* NOTE: the string msgtext parameters will eventually be replaced */
|
|
/* by an enumerated-type code so that non-English error messages */
|
|
/* can be substituted easily. This will not be done until all the */
|
|
/* code is in place, so that we know what messages are needed. */
|
|
METHOD(void, error_exit, (const char *msgtext));
|
|
METHOD(void, trace_message, (const char *msgtext));
|
|
|
|
/* Working data for error/trace facility */
|
|
/* See macros below for the usage of these variables */
|
|
int trace_level; /* level of detail of tracing messages */
|
|
/* Use level 0 for unsuppressable messages (nonfatal errors) */
|
|
/* Use levels 1, 2, 3 for successively more detailed trace options */
|
|
|
|
int message_parm[8]; /* store numeric parms for messages here */
|
|
|
|
/* Memory management */
|
|
/* NB: alloc routines never return NULL. They exit to */
|
|
/* error_exit if not successful. */
|
|
METHOD(void *, alloc_small, (size_t sizeofobject));
|
|
METHOD(void, free_small, (void *ptr));
|
|
METHOD(void FAR *, alloc_medium, (size_t sizeofobject));
|
|
METHOD(void, free_medium, (void FAR *ptr));
|
|
METHOD(JSAMPARRAY, alloc_small_sarray, (long samplesperrow,
|
|
long numrows));
|
|
METHOD(void, free_small_sarray, (JSAMPARRAY ptr));
|
|
METHOD(JBLOCKARRAY, alloc_small_barray, (long blocksperrow,
|
|
long numrows));
|
|
METHOD(void, free_small_barray, (JBLOCKARRAY ptr));
|
|
METHOD(big_sarray_ptr, request_big_sarray, (long samplesperrow,
|
|
long numrows,
|
|
long unitheight));
|
|
METHOD(big_barray_ptr, request_big_barray, (long blocksperrow,
|
|
long numrows,
|
|
long unitheight));
|
|
METHOD(void, alloc_big_arrays, (long extra_small_samples,
|
|
long extra_small_blocks,
|
|
long extra_medium_space));
|
|
METHOD(JSAMPARRAY, access_big_sarray, (big_sarray_ptr ptr,
|
|
long start_row,
|
|
boolean writable));
|
|
METHOD(JBLOCKARRAY, access_big_barray, (big_barray_ptr ptr,
|
|
long start_row,
|
|
boolean writable));
|
|
METHOD(void, free_big_sarray, (big_sarray_ptr ptr));
|
|
METHOD(void, free_big_barray, (big_barray_ptr ptr));
|
|
METHOD(void, free_all, (void));
|
|
|
|
long max_memory_to_use; /* maximum amount of memory to use */
|
|
};
|
|
|
|
/* Macros to simplify using the error and trace message stuff */
|
|
/* The first parameter is generally cinfo->emethods */
|
|
|
|
#define ERREXIT(emeth,msg) ((*(emeth)->error_exit) (msg))
|
|
#define ERREXIT1(emeth,msg,p1) ((emeth)->message_parm[0] = (p1), \
|
|
(*(emeth)->error_exit) (msg))
|
|
#define ERREXIT2(emeth,msg,p1,p2) ((emeth)->message_parm[0] = (p1), \
|
|
(emeth)->message_parm[1] = (p2), \
|
|
(*(emeth)->error_exit) (msg))
|
|
#define ERREXIT3(emeth,msg,p1,p2,p3) ((emeth)->message_parm[0] = (p1), \
|
|
(emeth)->message_parm[1] = (p2), \
|
|
(emeth)->message_parm[2] = (p3), \
|
|
(*(emeth)->error_exit) (msg))
|
|
#define ERREXIT4(emeth,msg,p1,p2,p3,p4) ((emeth)->message_parm[0] = (p1), \
|
|
(emeth)->message_parm[1] = (p2), \
|
|
(emeth)->message_parm[2] = (p3), \
|
|
(emeth)->message_parm[3] = (p4), \
|
|
(*(emeth)->error_exit) (msg))
|
|
|
|
#define MAKESTMT(stuff) do { stuff } while (0)
|
|
|
|
#define TRACEMS(emeth,lvl,msg) \
|
|
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
|
|
(*(emeth)->trace_message) (msg); } )
|
|
#define TRACEMS1(emeth,lvl,msg,p1) \
|
|
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
|
|
(emeth)->message_parm[0] = (p1); \
|
|
(*(emeth)->trace_message) (msg); } )
|
|
#define TRACEMS2(emeth,lvl,msg,p1,p2) \
|
|
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
|
|
(emeth)->message_parm[0] = (p1); \
|
|
(emeth)->message_parm[1] = (p2); \
|
|
(*(emeth)->trace_message) (msg); } )
|
|
#define TRACEMS3(emeth,lvl,msg,p1,p2,p3) \
|
|
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
|
|
int * _mp = (emeth)->message_parm; \
|
|
*_mp++ = (p1); *_mp++ = (p2); *_mp = (p3); \
|
|
(*(emeth)->trace_message) (msg); } )
|
|
#define TRACEMS4(emeth,lvl,msg,p1,p2,p3,p4) \
|
|
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
|
|
int * _mp = (emeth)->message_parm; \
|
|
*_mp++ = (p1); *_mp++ = (p2); *_mp++ = (p3); *_mp = (p4); \
|
|
(*(emeth)->trace_message) (msg); } )
|
|
#define TRACEMS8(emeth,lvl,msg,p1,p2,p3,p4,p5,p6,p7,p8) \
|
|
MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \
|
|
int * _mp = (emeth)->message_parm; \
|
|
*_mp++ = (p1); *_mp++ = (p2); *_mp++ = (p3); *_mp++ = (p4); \
|
|
*_mp++ = (p5); *_mp++ = (p6); *_mp++ = (p7); *_mp = (p8); \
|
|
(*(emeth)->trace_message) (msg); } )
|
|
|
|
|
|
/* Methods used during JPEG compression. */
|
|
|
|
struct compress_methods_struct {
|
|
/* Hook for user interface to get control after input_init */
|
|
METHOD(void, c_ui_method_selection, (compress_info_ptr cinfo));
|
|
/* Hook for user interface to do progress monitoring */
|
|
METHOD(void, progress_monitor, (compress_info_ptr cinfo,
|
|
long loopcounter, long looplimit));
|
|
/* Input image reading & conversion to standard form */
|
|
METHOD(void, input_init, (compress_info_ptr cinfo));
|
|
METHOD(void, get_input_row, (compress_info_ptr cinfo,
|
|
JSAMPARRAY pixel_row));
|
|
METHOD(void, input_term, (compress_info_ptr cinfo));
|
|
/* Color space and gamma conversion */
|
|
METHOD(void, colorin_init, (compress_info_ptr cinfo));
|
|
METHOD(void, get_sample_rows, (compress_info_ptr cinfo,
|
|
int rows_to_read,
|
|
JSAMPIMAGE image_data));
|
|
METHOD(void, colorin_term, (compress_info_ptr cinfo));
|
|
/* Expand picture data at edges */
|
|
METHOD(void, edge_expand, (compress_info_ptr cinfo,
|
|
long input_cols, int input_rows,
|
|
long output_cols, int output_rows,
|
|
JSAMPIMAGE image_data));
|
|
/* Subsample pixel values of a single component */
|
|
/* There can be a different subsample method for each component */
|
|
METHOD(void, subsample_init, (compress_info_ptr cinfo));
|
|
subsample_ptr subsample[MAX_COMPS_IN_SCAN];
|
|
METHOD(void, subsample_term, (compress_info_ptr cinfo));
|
|
/* Extract samples in MCU order, process & hand off to output_method */
|
|
/* The input is always exactly N MCU rows worth of data */
|
|
METHOD(void, extract_init, (compress_info_ptr cinfo));
|
|
METHOD(void, extract_MCUs, (compress_info_ptr cinfo,
|
|
JSAMPIMAGE image_data,
|
|
int num_mcu_rows,
|
|
MCU_output_method_ptr output_method));
|
|
METHOD(void, extract_term, (compress_info_ptr cinfo));
|
|
/* Entropy encoding parameter optimization */
|
|
METHOD(void, entropy_optimize, (compress_info_ptr cinfo,
|
|
MCU_output_caller_ptr source_method));
|
|
/* Entropy encoding */
|
|
METHOD(void, entropy_encoder_init, (compress_info_ptr cinfo));
|
|
METHOD(void, entropy_encode, (compress_info_ptr cinfo,
|
|
JBLOCK *MCU_data));
|
|
METHOD(void, entropy_encoder_term, (compress_info_ptr cinfo));
|
|
/* JPEG file header construction */
|
|
METHOD(void, write_file_header, (compress_info_ptr cinfo));
|
|
METHOD(void, write_scan_header, (compress_info_ptr cinfo));
|
|
METHOD(void, write_jpeg_data, (compress_info_ptr cinfo,
|
|
char *dataptr,
|
|
int datacount));
|
|
METHOD(void, write_scan_trailer, (compress_info_ptr cinfo));
|
|
METHOD(void, write_file_trailer, (compress_info_ptr cinfo));
|
|
/* Pipeline control */
|
|
METHOD(void, c_pipeline_controller, (compress_info_ptr cinfo));
|
|
METHOD(void, entropy_output, (compress_info_ptr cinfo,
|
|
char *dataptr,
|
|
int datacount));
|
|
/* Overall control */
|
|
METHOD(void, c_per_scan_method_selection, (compress_info_ptr cinfo));
|
|
};
|
|
|
|
/* Methods used during JPEG decompression. */
|
|
|
|
struct decompress_methods_struct {
|
|
/* Hook for user interface to get control after reading file header */
|
|
METHOD(void, d_ui_method_selection, (decompress_info_ptr cinfo));
|
|
/* Hook for user interface to do progress monitoring */
|
|
METHOD(void, progress_monitor, (decompress_info_ptr cinfo,
|
|
long loopcounter, long looplimit));
|
|
/* JPEG file scanning */
|
|
METHOD(void, read_file_header, (decompress_info_ptr cinfo));
|
|
METHOD(boolean, read_scan_header, (decompress_info_ptr cinfo));
|
|
METHOD(int, read_jpeg_data, (decompress_info_ptr cinfo));
|
|
METHOD(void, read_scan_trailer, (decompress_info_ptr cinfo));
|
|
METHOD(void, read_file_trailer, (decompress_info_ptr cinfo));
|
|
/* Entropy decoding */
|
|
METHOD(void, entropy_decoder_init, (decompress_info_ptr cinfo));
|
|
METHOD(void, entropy_decode, (decompress_info_ptr cinfo,
|
|
JBLOCK *MCU_data));
|
|
METHOD(void, entropy_decoder_term, (decompress_info_ptr cinfo));
|
|
/* MCU disassembly: fetch MCUs from entropy_decode, build coef array */
|
|
/* The reverse_DCT step is in the same module for symmetry reasons */
|
|
METHOD(void, disassemble_init, (decompress_info_ptr cinfo));
|
|
METHOD(void, disassemble_MCU, (decompress_info_ptr cinfo,
|
|
JBLOCKIMAGE image_data));
|
|
METHOD(void, reverse_DCT, (decompress_info_ptr cinfo,
|
|
JBLOCKIMAGE coeff_data,
|
|
JSAMPIMAGE output_data, int start_row));
|
|
METHOD(void, disassemble_term, (decompress_info_ptr cinfo));
|
|
/* Cross-block smoothing */
|
|
METHOD(void, smooth_coefficients, (decompress_info_ptr cinfo,
|
|
jpeg_component_info *compptr,
|
|
JBLOCKROW above,
|
|
JBLOCKROW currow,
|
|
JBLOCKROW below,
|
|
JBLOCKROW output));
|
|
/* Un-subsample pixel values of a single component */
|
|
/* There can be a different unsubsample method for each component */
|
|
METHOD(void, unsubsample_init, (decompress_info_ptr cinfo));
|
|
unsubsample_ptr unsubsample[MAX_COMPS_IN_SCAN];
|
|
METHOD(void, unsubsample_term, (decompress_info_ptr cinfo));
|
|
/* Color space and gamma conversion */
|
|
METHOD(void, colorout_init, (decompress_info_ptr cinfo));
|
|
METHOD(void, color_convert, (decompress_info_ptr cinfo,
|
|
int num_rows, long num_cols,
|
|
JSAMPIMAGE input_data,
|
|
JSAMPIMAGE output_data));
|
|
METHOD(void, colorout_term, (decompress_info_ptr cinfo));
|
|
/* Color quantization */
|
|
METHOD(void, color_quant_init, (decompress_info_ptr cinfo));
|
|
METHOD(void, color_quantize, (decompress_info_ptr cinfo,
|
|
int num_rows,
|
|
JSAMPIMAGE input_data,
|
|
JSAMPARRAY output_data));
|
|
METHOD(void, color_quant_prescan, (decompress_info_ptr cinfo,
|
|
int num_rows,
|
|
JSAMPIMAGE image_data,
|
|
JSAMPARRAY workspace));
|
|
METHOD(void, color_quant_doit, (decompress_info_ptr cinfo,
|
|
quantize_caller_ptr source_method));
|
|
METHOD(void, color_quant_term, (decompress_info_ptr cinfo));
|
|
/* Output image writing */
|
|
METHOD(void, output_init, (decompress_info_ptr cinfo));
|
|
METHOD(void, put_color_map, (decompress_info_ptr cinfo,
|
|
int num_colors, JSAMPARRAY colormap));
|
|
METHOD(void, put_pixel_rows, (decompress_info_ptr cinfo,
|
|
int num_rows,
|
|
JSAMPIMAGE pixel_data));
|
|
METHOD(void, output_term, (decompress_info_ptr cinfo));
|
|
/* Pipeline control */
|
|
METHOD(void, d_pipeline_controller, (decompress_info_ptr cinfo));
|
|
/* Overall control */
|
|
METHOD(void, d_per_scan_method_selection, (decompress_info_ptr cinfo));
|
|
};
|
|
|
|
|
|
/* External declarations for routines that aren't called via method ptrs. */
|
|
/* Note: use "j" as first char of names to minimize namespace pollution. */
|
|
/* The PP macro hides prototype parameters from compilers that can't cope. */
|
|
|
|
#ifdef PROTO
|
|
#define PP(arglist) arglist
|
|
#else
|
|
#define PP(arglist) ()
|
|
#endif
|
|
|
|
|
|
/* main entry for compression */
|
|
EXTERN void jpeg_compress PP((compress_info_ptr cinfo));
|
|
|
|
/* default parameter setup for compression */
|
|
EXTERN void j_c_defaults PP((compress_info_ptr cinfo, int quality,
|
|
boolean force_baseline));
|
|
EXTERN void j_monochrome_default PP((compress_info_ptr cinfo));
|
|
EXTERN void j_set_quality PP((compress_info_ptr cinfo, int quality,
|
|
boolean force_baseline));
|
|
|
|
/* main entry for decompression */
|
|
EXTERN void jpeg_decompress PP((decompress_info_ptr cinfo));
|
|
|
|
/* default parameter setup for decompression */
|
|
EXTERN void j_d_defaults PP((decompress_info_ptr cinfo,
|
|
boolean standard_buffering));
|
|
|
|
/* forward DCT */
|
|
EXTERN void j_fwd_dct PP((DCTBLOCK data));
|
|
/* inverse DCT */
|
|
EXTERN void j_rev_dct PP((DCTBLOCK data));
|
|
|
|
/* utility routines in jutils.c */
|
|
EXTERN long jround_up PP((long a, long b));
|
|
EXTERN void jcopy_sample_rows PP((JSAMPARRAY input_array, int source_row,
|
|
JSAMPARRAY output_array, int dest_row,
|
|
int num_rows, long num_cols));
|
|
EXTERN void jcopy_block_row PP((JBLOCKROW input_row, JBLOCKROW output_row,
|
|
long num_blocks));
|
|
EXTERN void jzero_far PP((void FAR * target, size_t bytestozero));
|
|
|
|
/* method selection routines for compression modules */
|
|
EXTERN void jselcpipeline PP((compress_info_ptr cinfo)); /* jcpipe.c */
|
|
EXTERN void jselchuffman PP((compress_info_ptr cinfo)); /* jchuff.c */
|
|
EXTERN void jselcarithmetic PP((compress_info_ptr cinfo)); /* jcarith.c */
|
|
EXTERN void jselexpand PP((compress_info_ptr cinfo)); /* jcexpand.c */
|
|
EXTERN void jselsubsample PP((compress_info_ptr cinfo)); /* jcsample.c */
|
|
EXTERN void jselcmcu PP((compress_info_ptr cinfo)); /* jcmcu.c */
|
|
EXTERN void jselccolor PP((compress_info_ptr cinfo)); /* jccolor.c */
|
|
/* The user interface should call one of these to select input format: */
|
|
EXTERN void jselrgif PP((compress_info_ptr cinfo)); /* jrdgif.c */
|
|
EXTERN void jselrppm PP((compress_info_ptr cinfo)); /* jrdppm.c */
|
|
EXTERN void jselrrle PP((compress_info_ptr cinfo)); /* jrdrle.c */
|
|
EXTERN void jselrtarga PP((compress_info_ptr cinfo)); /* jrdtarga.c */
|
|
/* and one of these to select output header format: */
|
|
EXTERN void jselwjfif PP((compress_info_ptr cinfo)); /* jwrjfif.c */
|
|
|
|
/* method selection routines for decompression modules */
|
|
EXTERN void jseldpipeline PP((decompress_info_ptr cinfo)); /* jdpipe.c */
|
|
EXTERN void jseldhuffman PP((decompress_info_ptr cinfo)); /* jdhuff.c */
|
|
EXTERN void jseldarithmetic PP((decompress_info_ptr cinfo)); /* jdarith.c */
|
|
EXTERN void jseldmcu PP((decompress_info_ptr cinfo)); /* jdmcu.c */
|
|
EXTERN void jselbsmooth PP((decompress_info_ptr cinfo)); /* jbsmooth.c */
|
|
EXTERN void jselunsubsample PP((decompress_info_ptr cinfo)); /* jdsample.c */
|
|
EXTERN void jseldcolor PP((decompress_info_ptr cinfo)); /* jdcolor.c */
|
|
EXTERN void jsel1quantize PP((decompress_info_ptr cinfo)); /* jquant1.c */
|
|
EXTERN void jsel2quantize PP((decompress_info_ptr cinfo)); /* jquant2.c */
|
|
/* The user interface should call one of these to select input format: */
|
|
EXTERN void jselrjfif PP((decompress_info_ptr cinfo)); /* jrdjfif.c */
|
|
/* and one of these to select output image format: */
|
|
EXTERN void jselwgif PP((decompress_info_ptr cinfo)); /* jwrgif.c */
|
|
EXTERN void jselwppm PP((decompress_info_ptr cinfo)); /* jwrppm.c */
|
|
EXTERN void jselwrle PP((decompress_info_ptr cinfo)); /* jwrrle.c */
|
|
EXTERN void jselwtarga PP((decompress_info_ptr cinfo)); /* jwrtarga.c */
|
|
|
|
/* method selection routines for system-dependent modules */
|
|
EXTERN void jselerror PP((external_methods_ptr emethods)); /* jerror.c */
|
|
EXTERN void jselmemmgr PP((external_methods_ptr emethods)); /* jmemmgr.c */
|
|
|
|
|
|
/* We assume that right shift corresponds to signed division by 2 with
|
|
* rounding towards minus infinity. This is correct for typical "arithmetic
|
|
* shift" instructions that shift in copies of the sign bit. But some
|
|
* C compilers implement >> with an unsigned shift. For these machines you
|
|
* must define RIGHT_SHIFT_IS_UNSIGNED.
|
|
* RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
|
|
* It is only applied with constant shift counts. SHIFT_TEMPS must be
|
|
* included in the variables of any routine using RIGHT_SHIFT.
|
|
*/
|
|
|
|
#ifdef RIGHT_SHIFT_IS_UNSIGNED
|
|
#define SHIFT_TEMPS INT32 shift_temp;
|
|
#define RIGHT_SHIFT(x,shft) \
|
|
((shift_temp = (x)) < 0 ? \
|
|
(shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
|
|
(shift_temp >> (shft)))
|
|
#else
|
|
#define SHIFT_TEMPS
|
|
#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
|
|
#endif
|
|
|
|
|
|
/* Miscellaneous useful macros */
|
|
|
|
#undef MAX
|
|
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
|
#undef MIN
|
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
|
|
|
|
|
#define RST0 0xD0 /* RST0 marker code */
|