4 * Copyright (C) 1991-1997, Thomas G. Lane.
5 * Modified 2003-2017 by Guido Vollbeding.
6 * This file is part of the Independent JPEG Group's software.
7 * For conditions of distribution and use, see the accompanying README file.
9 * This file contains initialization logic for the JPEG compressor.
10 * This routine is in charge of selecting the modules to be executed and
11 * making an initialization call to each one.
13 * Logically, this code belongs in jcmaster.c. It's split out because
14 * linking this routine implies linking the entire compression library.
15 * For a transcoding-only application, we want to be able to use jcmaster.c
16 * without linking in the whole library.
19 #define JPEG_INTERNALS
25 * Compute JPEG image dimensions and related values.
26 * NOTE: this is exported for possible use by application.
27 * Hence it mustn't do anything that can't be done twice.
31 jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo
)
32 /* Do computations that are needed before master selection phase */
34 /* Sanity check on input image dimensions to prevent overflow in
35 * following calculations.
36 * We do check jpeg_width and jpeg_height in initial_setup in jcmaster.c,
37 * but image_width and image_height can come from arbitrary data,
38 * and we need some space for multiplication by block_size.
40 if (((long) cinfo
->image_width
>> 24) || ((long) cinfo
->image_height
>> 24))
41 ERREXIT1(cinfo
, JERR_IMAGE_TOO_BIG
, (unsigned int) JPEG_MAX_DIMENSION
);
43 #ifdef DCT_SCALING_SUPPORTED
45 /* Compute actual JPEG image dimensions and DCT scaling choices. */
46 if (cinfo
->scale_num
>= cinfo
->scale_denom
* cinfo
->block_size
) {
47 /* Provide block_size/1 scaling */
48 cinfo
->jpeg_width
= cinfo
->image_width
* cinfo
->block_size
;
49 cinfo
->jpeg_height
= cinfo
->image_height
* cinfo
->block_size
;
50 cinfo
->min_DCT_h_scaled_size
= 1;
51 cinfo
->min_DCT_v_scaled_size
= 1;
52 } else if (cinfo
->scale_num
* 2 >= cinfo
->scale_denom
* cinfo
->block_size
) {
53 /* Provide block_size/2 scaling */
54 cinfo
->jpeg_width
= (JDIMENSION
)
55 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 2L);
56 cinfo
->jpeg_height
= (JDIMENSION
)
57 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 2L);
58 cinfo
->min_DCT_h_scaled_size
= 2;
59 cinfo
->min_DCT_v_scaled_size
= 2;
60 } else if (cinfo
->scale_num
* 3 >= cinfo
->scale_denom
* cinfo
->block_size
) {
61 /* Provide block_size/3 scaling */
62 cinfo
->jpeg_width
= (JDIMENSION
)
63 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 3L);
64 cinfo
->jpeg_height
= (JDIMENSION
)
65 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 3L);
66 cinfo
->min_DCT_h_scaled_size
= 3;
67 cinfo
->min_DCT_v_scaled_size
= 3;
68 } else if (cinfo
->scale_num
* 4 >= cinfo
->scale_denom
* cinfo
->block_size
) {
69 /* Provide block_size/4 scaling */
70 cinfo
->jpeg_width
= (JDIMENSION
)
71 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 4L);
72 cinfo
->jpeg_height
= (JDIMENSION
)
73 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 4L);
74 cinfo
->min_DCT_h_scaled_size
= 4;
75 cinfo
->min_DCT_v_scaled_size
= 4;
76 } else if (cinfo
->scale_num
* 5 >= cinfo
->scale_denom
* cinfo
->block_size
) {
77 /* Provide block_size/5 scaling */
78 cinfo
->jpeg_width
= (JDIMENSION
)
79 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 5L);
80 cinfo
->jpeg_height
= (JDIMENSION
)
81 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 5L);
82 cinfo
->min_DCT_h_scaled_size
= 5;
83 cinfo
->min_DCT_v_scaled_size
= 5;
84 } else if (cinfo
->scale_num
* 6 >= cinfo
->scale_denom
* cinfo
->block_size
) {
85 /* Provide block_size/6 scaling */
86 cinfo
->jpeg_width
= (JDIMENSION
)
87 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 6L);
88 cinfo
->jpeg_height
= (JDIMENSION
)
89 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 6L);
90 cinfo
->min_DCT_h_scaled_size
= 6;
91 cinfo
->min_DCT_v_scaled_size
= 6;
92 } else if (cinfo
->scale_num
* 7 >= cinfo
->scale_denom
* cinfo
->block_size
) {
93 /* Provide block_size/7 scaling */
94 cinfo
->jpeg_width
= (JDIMENSION
)
95 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 7L);
96 cinfo
->jpeg_height
= (JDIMENSION
)
97 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 7L);
98 cinfo
->min_DCT_h_scaled_size
= 7;
99 cinfo
->min_DCT_v_scaled_size
= 7;
100 } else if (cinfo
->scale_num
* 8 >= cinfo
->scale_denom
* cinfo
->block_size
) {
101 /* Provide block_size/8 scaling */
102 cinfo
->jpeg_width
= (JDIMENSION
)
103 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 8L);
104 cinfo
->jpeg_height
= (JDIMENSION
)
105 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 8L);
106 cinfo
->min_DCT_h_scaled_size
= 8;
107 cinfo
->min_DCT_v_scaled_size
= 8;
108 } else if (cinfo
->scale_num
* 9 >= cinfo
->scale_denom
* cinfo
->block_size
) {
109 /* Provide block_size/9 scaling */
110 cinfo
->jpeg_width
= (JDIMENSION
)
111 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 9L);
112 cinfo
->jpeg_height
= (JDIMENSION
)
113 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 9L);
114 cinfo
->min_DCT_h_scaled_size
= 9;
115 cinfo
->min_DCT_v_scaled_size
= 9;
116 } else if (cinfo
->scale_num
* 10 >= cinfo
->scale_denom
* cinfo
->block_size
) {
117 /* Provide block_size/10 scaling */
118 cinfo
->jpeg_width
= (JDIMENSION
)
119 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 10L);
120 cinfo
->jpeg_height
= (JDIMENSION
)
121 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 10L);
122 cinfo
->min_DCT_h_scaled_size
= 10;
123 cinfo
->min_DCT_v_scaled_size
= 10;
124 } else if (cinfo
->scale_num
* 11 >= cinfo
->scale_denom
* cinfo
->block_size
) {
125 /* Provide block_size/11 scaling */
126 cinfo
->jpeg_width
= (JDIMENSION
)
127 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 11L);
128 cinfo
->jpeg_height
= (JDIMENSION
)
129 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 11L);
130 cinfo
->min_DCT_h_scaled_size
= 11;
131 cinfo
->min_DCT_v_scaled_size
= 11;
132 } else if (cinfo
->scale_num
* 12 >= cinfo
->scale_denom
* cinfo
->block_size
) {
133 /* Provide block_size/12 scaling */
134 cinfo
->jpeg_width
= (JDIMENSION
)
135 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 12L);
136 cinfo
->jpeg_height
= (JDIMENSION
)
137 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 12L);
138 cinfo
->min_DCT_h_scaled_size
= 12;
139 cinfo
->min_DCT_v_scaled_size
= 12;
140 } else if (cinfo
->scale_num
* 13 >= cinfo
->scale_denom
* cinfo
->block_size
) {
141 /* Provide block_size/13 scaling */
142 cinfo
->jpeg_width
= (JDIMENSION
)
143 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 13L);
144 cinfo
->jpeg_height
= (JDIMENSION
)
145 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 13L);
146 cinfo
->min_DCT_h_scaled_size
= 13;
147 cinfo
->min_DCT_v_scaled_size
= 13;
148 } else if (cinfo
->scale_num
* 14 >= cinfo
->scale_denom
* cinfo
->block_size
) {
149 /* Provide block_size/14 scaling */
150 cinfo
->jpeg_width
= (JDIMENSION
)
151 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 14L);
152 cinfo
->jpeg_height
= (JDIMENSION
)
153 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 14L);
154 cinfo
->min_DCT_h_scaled_size
= 14;
155 cinfo
->min_DCT_v_scaled_size
= 14;
156 } else if (cinfo
->scale_num
* 15 >= cinfo
->scale_denom
* cinfo
->block_size
) {
157 /* Provide block_size/15 scaling */
158 cinfo
->jpeg_width
= (JDIMENSION
)
159 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 15L);
160 cinfo
->jpeg_height
= (JDIMENSION
)
161 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 15L);
162 cinfo
->min_DCT_h_scaled_size
= 15;
163 cinfo
->min_DCT_v_scaled_size
= 15;
165 /* Provide block_size/16 scaling */
166 cinfo
->jpeg_width
= (JDIMENSION
)
167 jdiv_round_up((long) cinfo
->image_width
* cinfo
->block_size
, 16L);
168 cinfo
->jpeg_height
= (JDIMENSION
)
169 jdiv_round_up((long) cinfo
->image_height
* cinfo
->block_size
, 16L);
170 cinfo
->min_DCT_h_scaled_size
= 16;
171 cinfo
->min_DCT_v_scaled_size
= 16;
174 #else /* !DCT_SCALING_SUPPORTED */
176 /* Hardwire it to "no scaling" */
177 cinfo
->jpeg_width
= cinfo
->image_width
;
178 cinfo
->jpeg_height
= cinfo
->image_height
;
179 cinfo
->min_DCT_h_scaled_size
= DCTSIZE
;
180 cinfo
->min_DCT_v_scaled_size
= DCTSIZE
;
182 #endif /* DCT_SCALING_SUPPORTED */
187 * Master selection of compression modules.
188 * This is done once at the start of processing an image. We determine
189 * which modules will be used and give them appropriate initialization calls.
193 jinit_compress_master (j_compress_ptr cinfo
)
196 JDIMENSION jd_samplesperrow
;
198 /* For now, precision must match compiled-in value... */
199 if (cinfo
->data_precision
!= BITS_IN_JSAMPLE
)
200 ERREXIT1(cinfo
, JERR_BAD_PRECISION
, cinfo
->data_precision
);
202 /* Sanity check on input image dimensions */
203 if (cinfo
->image_height
<= 0 || cinfo
->image_width
<= 0 ||
204 cinfo
->input_components
<= 0)
205 ERREXIT(cinfo
, JERR_EMPTY_IMAGE
);
207 /* Width of an input scanline must be representable as JDIMENSION. */
208 samplesperrow
= (long) cinfo
->image_width
* (long) cinfo
->input_components
;
209 jd_samplesperrow
= (JDIMENSION
) samplesperrow
;
210 if ((long) jd_samplesperrow
!= samplesperrow
)
211 ERREXIT(cinfo
, JERR_WIDTH_OVERFLOW
);
213 /* Compute JPEG image dimensions and related values. */
214 jpeg_calc_jpeg_dimensions(cinfo
);
216 /* Initialize master control (includes parameter checking/processing) */
217 jinit_c_master_control(cinfo
, FALSE
/* full compression */);
220 if (! cinfo
->raw_data_in
) {
221 jinit_color_converter(cinfo
);
222 jinit_downsampler(cinfo
);
223 jinit_c_prep_controller(cinfo
, FALSE
/* never need full buffer here */);
226 jinit_forward_dct(cinfo
);
227 /* Entropy encoding: either Huffman or arithmetic coding. */
228 if (cinfo
->arith_code
)
229 jinit_arith_encoder(cinfo
);
231 jinit_huff_encoder(cinfo
);
234 /* Need a full-image coefficient buffer in any multi-pass mode. */
235 jinit_c_coef_controller(cinfo
,
236 (boolean
) (cinfo
->num_scans
> 1 || cinfo
->optimize_coding
));
237 jinit_c_main_controller(cinfo
, FALSE
/* never need full buffer here */);
239 jinit_marker_writer(cinfo
);
241 /* We can now tell the memory manager to allocate virtual arrays. */
242 (*cinfo
->mem
->realize_virt_arrays
) ((j_common_ptr
) cinfo
);
244 /* Write the datastream header (SOI) immediately.
245 * Frame and scan headers are postponed till later.
246 * This lets application insert special markers after the SOI.
248 (*cinfo
->marker
->write_file_header
) (cinfo
);