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/*
48 * Left shift macro that handles a negative operand without causing any
49 * sanitizer warnings
50 */
51
52#ifdef __INT32_IS_ACTUALLY_LONG
53#define LEFT_SHIFT(a, b) ((INT32)((unsigned long)(a) << (b)))
54#else
55#define LEFT_SHIFT(a, b) ((INT32)((unsigned int)(a) << (b)))
56#endif
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_COMPS_IN_SCAN];
159  JDIMENSION last_MCU_col[MAX_COMPS_IN_SCAN];
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 an INT32 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     INT32 shift_temp;
294#define RIGHT_SHIFT(x,shft)  \
295        ((shift_temp = (x)) < 0 ? \
296         (shift_temp >> (shft)) | ((~((INT32) 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 INT32 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