1/*
2 * jpegint.h
3 *
4 * This file was part of the Independent JPEG Group's software:
5 * Copyright (C) 1991-1997, Thomas G. Lane.
6 * Modified 1997-2009 by Guido Vollbeding.
7 * libjpeg-turbo Modifications:
8 * Copyright (C) 2015-2016, D. R. Commander.
9 * Copyright (C) 2015, Google, Inc.
10 * For conditions of distribution and use, see the accompanying README.ijg
11 * file.
12 *
13 * This file provides common declarations for the various JPEG modules.
14 * These declarations are considered internal to the JPEG library; most
15 * applications using the library shouldn't need to include this file.
16 */
17
18
19/* Declarations for both compression & decompression */
20
21typedef enum { /* Operating modes for buffer controllers */
22 JBUF_PASS_THRU, /* Plain stripwise operation */
23 /* Remaining modes require a full-image buffer to have been created */
24 JBUF_SAVE_SOURCE, /* Run source subobject only, save output */
25 JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */
26 JBUF_SAVE_AND_PASS /* Run both subobjects, save output */
27} J_BUF_MODE;
28
29/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
30#define CSTATE_START 100 /* after create_compress */
31#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */
32#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */
33#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */
34#define DSTATE_START 200 /* after create_decompress */
35#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */
36#define DSTATE_READY 202 /* found SOS, ready for start_decompress */
37#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/
38#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */
39#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */
40#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */
41#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */
42#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */
43#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */
44#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */
45
46
47/* JLONG must hold at least signed 32-bit values. */
48typedef long JLONG;
49
50
51/*
52 * Left shift macro that handles a negative operand without causing any
53 * sanitizer warnings
54 */
55
56#define LEFT_SHIFT(a, b) ((JLONG)((unsigned long)(a) << (b)))
57
58
59/* Declarations for compression modules */
60
61/* Master control module */
62struct jpeg_comp_master {
63 void (*prepare_for_pass) (j_compress_ptr cinfo);
64 void (*pass_startup) (j_compress_ptr cinfo);
65 void (*finish_pass) (j_compress_ptr cinfo);
66
67 /* State variables made visible to other modules */
68 boolean call_pass_startup; /* True if pass_startup must be called */
69 boolean is_last_pass; /* True during last pass */
70};
71
72/* Main buffer control (downsampled-data buffer) */
73struct jpeg_c_main_controller {
74 void (*start_pass) (j_compress_ptr cinfo, J_BUF_MODE pass_mode);
75 void (*process_data) (j_compress_ptr cinfo, JSAMPARRAY input_buf,
76 JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail);
77};
78
79/* Compression preprocessing (downsampling input buffer control) */
80struct jpeg_c_prep_controller {
81 void (*start_pass) (j_compress_ptr cinfo, J_BUF_MODE pass_mode);
82 void (*pre_process_data) (j_compress_ptr cinfo, JSAMPARRAY input_buf,
83 JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail,
84 JSAMPIMAGE output_buf,
85 JDIMENSION *out_row_group_ctr,
86 JDIMENSION out_row_groups_avail);
87};
88
89/* Coefficient buffer control */
90struct jpeg_c_coef_controller {
91 void (*start_pass) (j_compress_ptr cinfo, J_BUF_MODE pass_mode);
92 boolean (*compress_data) (j_compress_ptr cinfo, JSAMPIMAGE input_buf);
93};
94
95/* Colorspace conversion */
96struct jpeg_color_converter {
97 void (*start_pass) (j_compress_ptr cinfo);
98 void (*color_convert) (j_compress_ptr cinfo, JSAMPARRAY input_buf,
99 JSAMPIMAGE output_buf, JDIMENSION output_row,
100 int num_rows);
101};
102
103/* Downsampling */
104struct jpeg_downsampler {
105 void (*start_pass) (j_compress_ptr cinfo);
106 void (*downsample) (j_compress_ptr cinfo, JSAMPIMAGE input_buf,
107 JDIMENSION in_row_index, JSAMPIMAGE output_buf,
108 JDIMENSION out_row_group_index);
109
110 boolean need_context_rows; /* TRUE if need rows above & below */
111};
112
113/* Forward DCT (also controls coefficient quantization) */
114struct jpeg_forward_dct {
115 void (*start_pass) (j_compress_ptr cinfo);
116 /* perhaps this should be an array??? */
117 void (*forward_DCT) (j_compress_ptr cinfo, jpeg_component_info *compptr,
118 JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
119 JDIMENSION start_row, JDIMENSION start_col,
120 JDIMENSION num_blocks);
121};
122
123/* Entropy encoding */
124struct jpeg_entropy_encoder {
125 void (*start_pass) (j_compress_ptr cinfo, boolean gather_statistics);
126 boolean (*encode_mcu) (j_compress_ptr cinfo, JBLOCKROW *MCU_data);
127 void (*finish_pass) (j_compress_ptr cinfo);
128};
129
130/* Marker writing */
131struct jpeg_marker_writer {
132 void (*write_file_header) (j_compress_ptr cinfo);
133 void (*write_frame_header) (j_compress_ptr cinfo);
134 void (*write_scan_header) (j_compress_ptr cinfo);
135 void (*write_file_trailer) (j_compress_ptr cinfo);
136 void (*write_tables_only) (j_compress_ptr cinfo);
137 /* These routines are exported to allow insertion of extra markers */
138 /* Probably only COM and APPn markers should be written this way */
139 void (*write_marker_header) (j_compress_ptr cinfo, int marker,
140 unsigned int datalen);
141 void (*write_marker_byte) (j_compress_ptr cinfo, int val);
142};
143
144
145/* Declarations for decompression modules */
146
147/* Master control module */
148struct jpeg_decomp_master {
149 void (*prepare_for_output_pass) (j_decompress_ptr cinfo);
150 void (*finish_output_pass) (j_decompress_ptr cinfo);
151
152 /* State variables made visible to other modules */
153 boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */
154
155 /* Partial decompression variables */
156 JDIMENSION first_iMCU_col;
157 JDIMENSION last_iMCU_col;
158 JDIMENSION first_MCU_col[MAX_COMPONENTS];
159 JDIMENSION last_MCU_col[MAX_COMPONENTS];
160 boolean jinit_upsampler_no_alloc;
161};
162
163/* Input control module */
164struct jpeg_input_controller {
165 int (*consume_input) (j_decompress_ptr cinfo);
166 void (*reset_input_controller) (j_decompress_ptr cinfo);
167 void (*start_input_pass) (j_decompress_ptr cinfo);
168 void (*finish_input_pass) (j_decompress_ptr cinfo);
169
170 /* State variables made visible to other modules */
171 boolean has_multiple_scans; /* True if file has multiple scans */
172 boolean eoi_reached; /* True when EOI has been consumed */
173};
174
175/* Main buffer control (downsampled-data buffer) */
176struct jpeg_d_main_controller {
177 void (*start_pass) (j_decompress_ptr cinfo, J_BUF_MODE pass_mode);
178 void (*process_data) (j_decompress_ptr cinfo, JSAMPARRAY output_buf,
179 JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail);
180};
181
182/* Coefficient buffer control */
183struct jpeg_d_coef_controller {
184 void (*start_input_pass) (j_decompress_ptr cinfo);
185 int (*consume_data) (j_decompress_ptr cinfo);
186 void (*start_output_pass) (j_decompress_ptr cinfo);
187 int (*decompress_data) (j_decompress_ptr cinfo, JSAMPIMAGE output_buf);
188 /* Pointer to array of coefficient virtual arrays, or NULL if none */
189 jvirt_barray_ptr *coef_arrays;
190};
191
192/* Decompression postprocessing (color quantization buffer control) */
193struct jpeg_d_post_controller {
194 void (*start_pass) (j_decompress_ptr cinfo, J_BUF_MODE pass_mode);
195 void (*post_process_data) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
196 JDIMENSION *in_row_group_ctr,
197 JDIMENSION in_row_groups_avail,
198 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
199 JDIMENSION out_rows_avail);
200};
201
202/* Marker reading & parsing */
203struct jpeg_marker_reader {
204 void (*reset_marker_reader) (j_decompress_ptr cinfo);
205 /* Read markers until SOS or EOI.
206 * Returns same codes as are defined for jpeg_consume_input:
207 * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
208 */
209 int (*read_markers) (j_decompress_ptr cinfo);
210 /* Read a restart marker --- exported for use by entropy decoder only */
211 jpeg_marker_parser_method read_restart_marker;
212
213 /* State of marker reader --- nominally internal, but applications
214 * supplying COM or APPn handlers might like to know the state.
215 */
216 boolean saw_SOI; /* found SOI? */
217 boolean saw_SOF; /* found SOF? */
218 int next_restart_num; /* next restart number expected (0-7) */
219 unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
220};
221
222/* Entropy decoding */
223struct jpeg_entropy_decoder {
224 void (*start_pass) (j_decompress_ptr cinfo);
225 boolean (*decode_mcu) (j_decompress_ptr cinfo, JBLOCKROW *MCU_data);
226
227 /* This is here to share code between baseline and progressive decoders; */
228 /* other modules probably should not use it */
229 boolean insufficient_data; /* set TRUE after emitting warning */
230};
231
232/* Inverse DCT (also performs dequantization) */
233typedef void (*inverse_DCT_method_ptr) (j_decompress_ptr cinfo,
234 jpeg_component_info *compptr,
235 JCOEFPTR coef_block,
236 JSAMPARRAY output_buf,
237 JDIMENSION output_col);
238
239struct jpeg_inverse_dct {
240 void (*start_pass) (j_decompress_ptr cinfo);
241 /* It is useful to allow each component to have a separate IDCT method. */
242 inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
243};
244
245/* Upsampling (note that upsampler must also call color converter) */
246struct jpeg_upsampler {
247 void (*start_pass) (j_decompress_ptr cinfo);
248 void (*upsample) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
249 JDIMENSION *in_row_group_ctr,
250 JDIMENSION in_row_groups_avail, JSAMPARRAY output_buf,
251 JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail);
252
253 boolean need_context_rows; /* TRUE if need rows above & below */
254};
255
256/* Colorspace conversion */
257struct jpeg_color_deconverter {
258 void (*start_pass) (j_decompress_ptr cinfo);
259 void (*color_convert) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
260 JDIMENSION input_row, JSAMPARRAY output_buf,
261 int num_rows);
262};
263
264/* Color quantization or color precision reduction */
265struct jpeg_color_quantizer {
266 void (*start_pass) (j_decompress_ptr cinfo, boolean is_pre_scan);
267 void (*color_quantize) (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
268 JSAMPARRAY output_buf, int num_rows);
269 void (*finish_pass) (j_decompress_ptr cinfo);
270 void (*new_color_map) (j_decompress_ptr cinfo);
271};
272
273
274/* Miscellaneous useful macros */
275
276#undef MAX
277#define MAX(a, b) ((a) > (b) ? (a) : (b))
278#undef MIN
279#define MIN(a, b) ((a) < (b) ? (a) : (b))
280
281
282/* We assume that right shift corresponds to signed division by 2 with
283 * rounding towards minus infinity. This is correct for typical "arithmetic
284 * shift" instructions that shift in copies of the sign bit. But some
285 * C compilers implement >> with an unsigned shift. For these machines you
286 * must define RIGHT_SHIFT_IS_UNSIGNED.
287 * RIGHT_SHIFT provides a proper signed right shift of a JLONG quantity.
288 * It is only applied with constant shift counts. SHIFT_TEMPS must be
289 * included in the variables of any routine using RIGHT_SHIFT.
290 */
291
292#ifdef RIGHT_SHIFT_IS_UNSIGNED
293#define SHIFT_TEMPS JLONG shift_temp;
294#define RIGHT_SHIFT(x, shft) \
295 ((shift_temp = (x)) < 0 ? \
296 (shift_temp >> (shft)) | ((~((JLONG)0)) << (32 - (shft))) : \
297 (shift_temp >> (shft)))
298#else
299#define SHIFT_TEMPS
300#define RIGHT_SHIFT(x, shft) ((x) >> (shft))
301#endif
302
303
304/* Compression module initialization routines */
305EXTERN(void) jinit_compress_master(j_compress_ptr cinfo);
306EXTERN(void) jinit_c_master_control(j_compress_ptr cinfo,
307 boolean transcode_only);
308EXTERN(void) jinit_c_main_controller(j_compress_ptr cinfo,
309 boolean need_full_buffer);
310EXTERN(void) jinit_c_prep_controller(j_compress_ptr cinfo,
311 boolean need_full_buffer);
312EXTERN(void) jinit_c_coef_controller(j_compress_ptr cinfo,
313 boolean need_full_buffer);
314EXTERN(void) jinit_color_converter(j_compress_ptr cinfo);
315EXTERN(void) jinit_downsampler(j_compress_ptr cinfo);
316EXTERN(void) jinit_forward_dct(j_compress_ptr cinfo);
317EXTERN(void) jinit_huff_encoder(j_compress_ptr cinfo);
318EXTERN(void) jinit_phuff_encoder(j_compress_ptr cinfo);
319EXTERN(void) jinit_arith_encoder(j_compress_ptr cinfo);
320EXTERN(void) jinit_marker_writer(j_compress_ptr cinfo);
321/* Decompression module initialization routines */
322EXTERN(void) jinit_master_decompress(j_decompress_ptr cinfo);
323EXTERN(void) jinit_d_main_controller(j_decompress_ptr cinfo,
324 boolean need_full_buffer);
325EXTERN(void) jinit_d_coef_controller(j_decompress_ptr cinfo,
326 boolean need_full_buffer);
327EXTERN(void) jinit_d_post_controller(j_decompress_ptr cinfo,
328 boolean need_full_buffer);
329EXTERN(void) jinit_input_controller(j_decompress_ptr cinfo);
330EXTERN(void) jinit_marker_reader(j_decompress_ptr cinfo);
331EXTERN(void) jinit_huff_decoder(j_decompress_ptr cinfo);
332EXTERN(void) jinit_phuff_decoder(j_decompress_ptr cinfo);
333EXTERN(void) jinit_arith_decoder(j_decompress_ptr cinfo);
334EXTERN(void) jinit_inverse_dct(j_decompress_ptr cinfo);
335EXTERN(void) jinit_upsampler(j_decompress_ptr cinfo);
336EXTERN(void) jinit_color_deconverter(j_decompress_ptr cinfo);
337EXTERN(void) jinit_1pass_quantizer(j_decompress_ptr cinfo);
338EXTERN(void) jinit_2pass_quantizer(j_decompress_ptr cinfo);
339EXTERN(void) jinit_merged_upsampler(j_decompress_ptr cinfo);
340/* Memory manager initialization */
341EXTERN(void) jinit_memory_mgr(j_common_ptr cinfo);
342
343/* Utility routines in jutils.c */
344EXTERN(long) jdiv_round_up(long a, long b);
345EXTERN(long) jround_up(long a, long b);
346EXTERN(void) jcopy_sample_rows(JSAMPARRAY input_array, int source_row,
347 JSAMPARRAY output_array, int dest_row,
348 int num_rows, JDIMENSION num_cols);
349EXTERN(void) jcopy_block_row(JBLOCKROW input_row, JBLOCKROW output_row,
350 JDIMENSION num_blocks);
351EXTERN(void) jzero_far(void *target, size_t bytestozero);
352/* Constant tables in jutils.c */
353#if 0 /* This table is not actually needed in v6a */
354extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
355#endif
356extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
357
358/* Arithmetic coding probability estimation tables in jaricom.c */
359extern const JLONG jpeg_aritab[];
360
361/* Suppress undefined-structure complaints if necessary. */
362
363#ifdef INCOMPLETE_TYPES_BROKEN
364#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */
365struct jvirt_sarray_control { long dummy; };
366struct jvirt_barray_control { long dummy; };
367#endif
368#endif /* INCOMPLETE_TYPES_BROKEN */
369