Bug Summary

File:root/firefox-clang/media/libjpeg/src/jcparam.c
Warning:line 553, column 5
Value stored to 'scanptr' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -O2 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name jcparam.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libjpeg -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libjpeg -resource-dir /usr/lib/llvm-23/lib/clang/23 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D DEBUG=1 -D MOZ_WITH_SIMD=1 -D MOZ_HAS_MOZGLUE -D MOZILLA_INTERNAL_API -D IMPL_LIBXUL -D MOZ_SUPPORT_LEAKCHECKING -D STATIC_EXPORTABLE_JS_API -I /root/firefox-clang/media/libjpeg -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/media/libjpeg -I /root/firefox-clang/media/libjpeg -I /root/firefox-clang/media/libjpeg/src -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -internal-isystem /usr/lib/llvm-23/lib/clang/23/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wno-error=tautological-type-limit-compare -Wno-range-loop-analysis -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-unknown-warning-option -Wno-character-conversion -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fdiagnostics-absolute-paths -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -mllvm -dwarf-linkage-names=Abstract -faddrsig -fdwarf2-cfi-asm -o /tmp/scan-build-2026-09-01-224014-2642839-1 -x c /root/firefox-clang/media/libjpeg/src/jcparam.c
1/*
2 * jcparam.c
3 *
4 * This file was part of the Independent JPEG Group's software:
5 * Copyright (C) 1991-1998, Thomas G. Lane.
6 * Modified 2003-2008 by Guido Vollbeding.
7 * Lossless JPEG Modifications:
8 * Copyright (C) 1999, Ken Murchison.
9 * libjpeg-turbo Modifications:
10 * Copyright (C) 2009-2011, 2018, 2023-2024, D. R. Commander.
11 * For conditions of distribution and use, see the accompanying README.ijg
12 * file.
13 *
14 * This file contains optional default-setting code for the JPEG compressor.
15 * Applications do not have to use this file, but those that don't use it
16 * must know a lot more about the innards of the JPEG code.
17 */
18
19#define JPEG_INTERNALS
20#include "jinclude.h"
21#include "jpeglib.h"
22#include "jstdhuff.c"
23
24
25/*
26 * Quantization table setup routines
27 */
28
29GLOBAL(void)void
30jpeg_add_quant_table(j_compress_ptr cinfo, int which_tbl,
31 const unsigned int *basic_table, int scale_factor,
32 boolean force_baseline)
33/* Define a quantization table equal to the basic_table times
34 * a scale factor (given as a percentage).
35 * If force_baseline is TRUE, the computed quantization table entries
36 * are limited to 1..255 for JPEG baseline compatibility.
37 */
38{
39 JQUANT_TBL **qtblptr;
40 int i;
41 long temp;
42
43 /* Safety check to ensure start_compress not called yet. */
44 if (cinfo->global_state != CSTATE_START100)
45 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state)((cinfo)->err->msg_code = (JERR_BAD_STATE), (cinfo)->
err->msg_parm.i[0] = (cinfo->global_state), (*(cinfo)->
err->error_exit) ((j_common_ptr)(cinfo)))
;
46
47 if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS4)
48 ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl)((cinfo)->err->msg_code = (JERR_DQT_INDEX), (cinfo)->
err->msg_parm.i[0] = (which_tbl), (*(cinfo)->err->error_exit
) ((j_common_ptr)(cinfo)))
;
49
50 qtblptr = &cinfo->quant_tbl_ptrs[which_tbl];
51
52 if (*qtblptr == NULL((void*)0))
53 *qtblptr = jpeg_alloc_quant_table((j_common_ptr)cinfo);
54
55 for (i = 0; i < DCTSIZE264; i++) {
56 temp = ((long)basic_table[i] * scale_factor + 50L) / 100L;
57 /* limit the values to the valid range */
58 if (temp <= 0L) temp = 1L;
59 if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */
60 if (force_baseline && temp > 255L)
61 temp = 255L; /* limit to baseline range if requested */
62 (*qtblptr)->quantval[i] = (UINT16)temp;
63 }
64
65 /* Initialize sent_table FALSE so table will be written to JPEG file. */
66 (*qtblptr)->sent_table = FALSE0;
67}
68
69
70/* These are the sample quantization tables given in Annex K (Clause K.1) of
71 * Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994.
72 * The spec says that the values given produce "good" quality, and
73 * when divided by 2, "very good" quality.
74 */
75static const unsigned int std_luminance_quant_tbl[DCTSIZE264] = {
76 16, 11, 10, 16, 24, 40, 51, 61,
77 12, 12, 14, 19, 26, 58, 60, 55,
78 14, 13, 16, 24, 40, 57, 69, 56,
79 14, 17, 22, 29, 51, 87, 80, 62,
80 18, 22, 37, 56, 68, 109, 103, 77,
81 24, 35, 55, 64, 81, 104, 113, 92,
82 49, 64, 78, 87, 103, 121, 120, 101,
83 72, 92, 95, 98, 112, 100, 103, 99
84};
85static const unsigned int std_chrominance_quant_tbl[DCTSIZE264] = {
86 17, 18, 24, 47, 99, 99, 99, 99,
87 18, 21, 26, 66, 99, 99, 99, 99,
88 24, 26, 56, 99, 99, 99, 99, 99,
89 47, 66, 99, 99, 99, 99, 99, 99,
90 99, 99, 99, 99, 99, 99, 99, 99,
91 99, 99, 99, 99, 99, 99, 99, 99,
92 99, 99, 99, 99, 99, 99, 99, 99,
93 99, 99, 99, 99, 99, 99, 99, 99
94};
95
96
97#if JPEG_LIB_VERSION62 >= 70
98GLOBAL(void)void
99jpeg_default_qtables(j_compress_ptr cinfo, boolean force_baseline)
100/* Set or change the 'quality' (quantization) setting, using default tables
101 * and straight percentage-scaling quality scales.
102 * This entry point allows different scalings for luminance and chrominance.
103 */
104{
105 /* Set up two quantization tables using the specified scaling */
106 jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
107 cinfo->q_scale_factor[0], force_baseline);
108 jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
109 cinfo->q_scale_factor[1], force_baseline);
110}
111#endif
112
113
114GLOBAL(void)void
115jpeg_set_linear_quality(j_compress_ptr cinfo, int scale_factor,
116 boolean force_baseline)
117/* Set or change the 'quality' (quantization) setting, using default tables
118 * and a straight percentage-scaling quality scale. In most cases it's better
119 * to use jpeg_set_quality (below); this entry point is provided for
120 * applications that insist on a linear percentage scaling.
121 */
122{
123 /* Set up two quantization tables using the specified scaling */
124 jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
125 scale_factor, force_baseline);
126 jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
127 scale_factor, force_baseline);
128}
129
130
131GLOBAL(int)int
132jpeg_quality_scaling(int quality)
133/* Convert a user-specified quality rating to a percentage scaling factor
134 * for an underlying quantization table, using our recommended scaling curve.
135 * The input 'quality' factor should be 0 (terrible) to 100 (very good).
136 */
137{
138 /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */
139 if (quality <= 0) quality = 1;
140 if (quality > 100) quality = 100;
141
142 /* The basic table is used as-is (scaling 100) for a quality of 50.
143 * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
144 * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table
145 * to make all the table entries 1 (hence, minimum quantization loss).
146 * Qualities 1..50 are converted to scaling percentage 5000/Q.
147 */
148 if (quality < 50)
149 quality = 5000 / quality;
150 else
151 quality = 200 - quality * 2;
152
153 return quality;
154}
155
156
157GLOBAL(void)void
158jpeg_set_quality(j_compress_ptr cinfo, int quality, boolean force_baseline)
159/* Set or change the 'quality' (quantization) setting, using default tables.
160 * This is the standard quality-adjusting entry point for typical user
161 * interfaces; only those who want detailed control over quantization tables
162 * would use the preceding three routines directly.
163 */
164{
165 /* Convert user 0-100 rating to percentage scaling */
166 quality = jpeg_quality_scaling(quality);
167
168 /* Set up standard quality tables */
169 jpeg_set_linear_quality(cinfo, quality, force_baseline);
170}
171
172
173/*
174 * Default parameter setup for compression.
175 *
176 * Applications that don't choose to use this routine must do their
177 * own setup of all these parameters. Alternately, you can call this
178 * to establish defaults and then alter parameters selectively. This
179 * is the recommended approach since, if we add any new parameters,
180 * your code will still work (they'll be set to reasonable defaults).
181 */
182
183GLOBAL(void)void
184jpeg_set_defaults(j_compress_ptr cinfo)
185{
186 int i;
187
188 /* Safety check to ensure start_compress not called yet. */
189 if (cinfo->global_state != CSTATE_START100)
190 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state)((cinfo)->err->msg_code = (JERR_BAD_STATE), (cinfo)->
err->msg_parm.i[0] = (cinfo->global_state), (*(cinfo)->
err->error_exit) ((j_common_ptr)(cinfo)))
;
191
192 /* Allocate comp_info array large enough for maximum component count.
193 * Array is made permanent in case application wants to compress
194 * multiple images at same param settings.
195 */
196 if (cinfo->comp_info == NULL((void*)0))
197 cinfo->comp_info = (jpeg_component_info *)
198 (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_PERMANENT0,
199 MAX_COMPONENTS10 * sizeof(jpeg_component_info));
200
201 /* Initialize everything not dependent on the color space */
202
203#if JPEG_LIB_VERSION62 >= 70
204 cinfo->scale_num = 1; /* 1:1 scaling */
205 cinfo->scale_denom = 1;
206#endif
207 /* Set up two quantization tables using default quality of 75 */
208 jpeg_set_quality(cinfo, 75, TRUE1);
209 /* Set up two Huffman tables */
210 std_huff_tables((j_common_ptr)cinfo);
211
212 /* Initialize default arithmetic coding conditioning */
213 for (i = 0; i < NUM_ARITH_TBLS16; i++) {
214 cinfo->arith_dc_L[i] = 0;
215 cinfo->arith_dc_U[i] = 1;
216 cinfo->arith_ac_K[i] = 5;
217 }
218
219 /* Default is no multiple-scan output */
220 cinfo->scan_info = NULL((void*)0);
221 cinfo->num_scans = 0;
222
223 /* Default is lossy output */
224 cinfo->master->lossless = FALSE0;
225
226 /* Expect normal source image, not raw downsampled data */
227 cinfo->raw_data_in = FALSE0;
228
229 /* Use Huffman coding, not arithmetic coding, by default */
230 cinfo->arith_code = FALSE0;
231
232 /* By default, don't do extra passes to optimize entropy coding */
233 cinfo->optimize_coding = FALSE0;
234 /* The standard Huffman tables are only valid for 8-bit data precision.
235 * If the precision is higher, force optimization on so that usable
236 * tables will be computed. This test can be removed if default tables
237 * are supplied that are valid for the desired precision.
238 */
239 if (cinfo->data_precision == 12)
240 cinfo->optimize_coding = TRUE1;
241
242 /* By default, use the simpler non-cosited sampling alignment */
243 cinfo->CCIR601_sampling = FALSE0;
244
245#if JPEG_LIB_VERSION62 >= 70
246 /* By default, apply fancy downsampling */
247 cinfo->do_fancy_downsampling = TRUE1;
248#endif
249
250 /* No input smoothing */
251 cinfo->smoothing_factor = 0;
252
253 /* DCT algorithm preference */
254 cinfo->dct_method = JDCT_DEFAULTJDCT_ISLOW;
255
256 /* No restart markers */
257 cinfo->restart_interval = 0;
258 cinfo->restart_in_rows = 0;
259
260 /* Fill in default JFIF marker parameters. Note that whether the marker
261 * will actually be written is determined by jpeg_set_colorspace.
262 *
263 * By default, the library emits JFIF version code 1.01.
264 * An application that wants to emit JFIF 1.02 extension markers should set
265 * JFIF_minor_version to 2. We could probably get away with just defaulting
266 * to 1.02, but there may still be some decoders in use that will complain
267 * about that; saying 1.01 should minimize compatibility problems.
268 */
269 cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
270 cinfo->JFIF_minor_version = 1;
271 cinfo->density_unit = 0; /* Pixel size is unknown by default */
272 cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
273 cinfo->Y_density = 1;
274
275 /* Choose JPEG colorspace based on input space, set defaults accordingly */
276
277 jpeg_default_colorspace(cinfo);
278}
279
280
281/*
282 * Select an appropriate JPEG colorspace for in_color_space.
283 */
284
285GLOBAL(void)void
286jpeg_default_colorspace(j_compress_ptr cinfo)
287{
288 switch (cinfo->in_color_space) {
289 case JCS_GRAYSCALE:
290 jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
291 break;
292 case JCS_RGB:
293 case JCS_EXT_RGB:
294 case JCS_EXT_RGBX:
295 case JCS_EXT_BGR:
296 case JCS_EXT_BGRX:
297 case JCS_EXT_XBGR:
298 case JCS_EXT_XRGB:
299 case JCS_EXT_RGBA:
300 case JCS_EXT_BGRA:
301 case JCS_EXT_ABGR:
302 case JCS_EXT_ARGB:
303#ifdef C_LOSSLESS_SUPPORTED
304 if (cinfo->master->lossless)
305 jpeg_set_colorspace(cinfo, JCS_RGB);
306 else
307#endif
308 jpeg_set_colorspace(cinfo, JCS_YCbCr);
309 break;
310 case JCS_YCbCr:
311 jpeg_set_colorspace(cinfo, JCS_YCbCr);
312 break;
313 case JCS_CMYK:
314 jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */
315 break;
316 case JCS_YCCK:
317 jpeg_set_colorspace(cinfo, JCS_YCCK);
318 break;
319 case JCS_UNKNOWN:
320 jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
321 break;
322 default:
323 ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE)((cinfo)->err->msg_code = (JERR_BAD_IN_COLORSPACE), (*(
cinfo)->err->error_exit) ((j_common_ptr)(cinfo)))
;
324 }
325}
326
327
328/*
329 * Set the JPEG colorspace, and choose colorspace-dependent default values.
330 */
331
332GLOBAL(void)void
333jpeg_set_colorspace(j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
334{
335 jpeg_component_info *compptr;
336 int ci;
337
338#define SET_COMP(index, id, hsamp, vsamp, quant, dctbl, actbl)(compptr = &cinfo->comp_info[index], compptr->component_id
= (id), compptr->h_samp_factor = (hsamp), compptr->v_samp_factor
= (vsamp), compptr->quant_tbl_no = (quant), compptr->dc_tbl_no
= (dctbl), compptr->ac_tbl_no = (actbl) )
\
339 (compptr = &cinfo->comp_info[index], \
340 compptr->component_id = (id), \
341 compptr->h_samp_factor = (hsamp), \
342 compptr->v_samp_factor = (vsamp), \
343 compptr->quant_tbl_no = (quant), \
344 compptr->dc_tbl_no = (dctbl), \
345 compptr->ac_tbl_no = (actbl) )
346
347 /* Safety check to ensure start_compress not called yet. */
348 if (cinfo->global_state != CSTATE_START100)
349 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state)((cinfo)->err->msg_code = (JERR_BAD_STATE), (cinfo)->
err->msg_parm.i[0] = (cinfo->global_state), (*(cinfo)->
err->error_exit) ((j_common_ptr)(cinfo)))
;
350
351 /* For all colorspaces, we use Q and Huff tables 0 for luminance components,
352 * tables 1 for chrominance components.
353 */
354
355 cinfo->jpeg_color_space = colorspace;
356
357 cinfo->write_JFIF_header = FALSE0; /* No marker for non-JFIF colorspaces */
358 cinfo->write_Adobe_marker = FALSE0; /* write no Adobe marker by default */
359
360 switch (colorspace) {
361 case JCS_GRAYSCALE:
362 cinfo->write_JFIF_header = TRUE1; /* Write a JFIF marker */
363 cinfo->num_components = 1;
364 /* JFIF specifies component ID 1 */
365 SET_COMP(0, 1, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[0], compptr->component_id
= (1), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
366 break;
367 case JCS_RGB:
368 cinfo->write_Adobe_marker = TRUE1; /* write Adobe marker to flag RGB */
369 cinfo->num_components = 3;
370 SET_COMP(0, 0x52 /* 'R' */, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[0], compptr->component_id
= (0x52), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
371 SET_COMP(1, 0x47 /* 'G' */, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[1], compptr->component_id
= (0x47), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
372 SET_COMP(2, 0x42 /* 'B' */, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[2], compptr->component_id
= (0x42), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
373 break;
374 case JCS_YCbCr:
375 cinfo->write_JFIF_header = TRUE1; /* Write a JFIF marker */
376 cinfo->num_components = 3;
377 /* JFIF specifies component IDs 1,2,3 */
378 /* We default to 2x2 subsamples of chrominance */
379 SET_COMP(0, 1, 2, 2, 0, 0, 0)(compptr = &cinfo->comp_info[0], compptr->component_id
= (1), compptr->h_samp_factor = (2), compptr->v_samp_factor
= (2), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
380 SET_COMP(1, 2, 1, 1, 1, 1, 1)(compptr = &cinfo->comp_info[1], compptr->component_id
= (2), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (1), compptr->dc_tbl_no
= (1), compptr->ac_tbl_no = (1) )
;
381 SET_COMP(2, 3, 1, 1, 1, 1, 1)(compptr = &cinfo->comp_info[2], compptr->component_id
= (3), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (1), compptr->dc_tbl_no
= (1), compptr->ac_tbl_no = (1) )
;
382 break;
383 case JCS_CMYK:
384 cinfo->write_Adobe_marker = TRUE1; /* write Adobe marker to flag CMYK */
385 cinfo->num_components = 4;
386 SET_COMP(0, 0x43 /* 'C' */, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[0], compptr->component_id
= (0x43), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
387 SET_COMP(1, 0x4D /* 'M' */, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[1], compptr->component_id
= (0x4D), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
388 SET_COMP(2, 0x59 /* 'Y' */, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[2], compptr->component_id
= (0x59), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
389 SET_COMP(3, 0x4B /* 'K' */, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[3], compptr->component_id
= (0x4B), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
390 break;
391 case JCS_YCCK:
392 cinfo->write_Adobe_marker = TRUE1; /* write Adobe marker to flag YCCK */
393 cinfo->num_components = 4;
394 SET_COMP(0, 1, 2, 2, 0, 0, 0)(compptr = &cinfo->comp_info[0], compptr->component_id
= (1), compptr->h_samp_factor = (2), compptr->v_samp_factor
= (2), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
395 SET_COMP(1, 2, 1, 1, 1, 1, 1)(compptr = &cinfo->comp_info[1], compptr->component_id
= (2), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (1), compptr->dc_tbl_no
= (1), compptr->ac_tbl_no = (1) )
;
396 SET_COMP(2, 3, 1, 1, 1, 1, 1)(compptr = &cinfo->comp_info[2], compptr->component_id
= (3), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (1), compptr->dc_tbl_no
= (1), compptr->ac_tbl_no = (1) )
;
397 SET_COMP(3, 4, 2, 2, 0, 0, 0)(compptr = &cinfo->comp_info[3], compptr->component_id
= (4), compptr->h_samp_factor = (2), compptr->v_samp_factor
= (2), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
398 break;
399 case JCS_UNKNOWN:
400 cinfo->num_components = cinfo->input_components;
401 if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS10)
402 ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,((cinfo)->err->msg_code = (JERR_COMPONENT_COUNT), (cinfo
)->err->msg_parm.i[0] = (cinfo->num_components), (cinfo
)->err->msg_parm.i[1] = (10), (*(cinfo)->err->error_exit
) ((j_common_ptr)(cinfo)))
403 MAX_COMPONENTS)((cinfo)->err->msg_code = (JERR_COMPONENT_COUNT), (cinfo
)->err->msg_parm.i[0] = (cinfo->num_components), (cinfo
)->err->msg_parm.i[1] = (10), (*(cinfo)->err->error_exit
) ((j_common_ptr)(cinfo)))
;
404 for (ci = 0; ci < cinfo->num_components; ci++) {
405 SET_COMP(ci, ci, 1, 1, 0, 0, 0)(compptr = &cinfo->comp_info[ci], compptr->component_id
= (ci), compptr->h_samp_factor = (1), compptr->v_samp_factor
= (1), compptr->quant_tbl_no = (0), compptr->dc_tbl_no
= (0), compptr->ac_tbl_no = (0) )
;
406 }
407 break;
408 default:
409 ERREXIT(cinfo, JERR_BAD_J_COLORSPACE)((cinfo)->err->msg_code = (JERR_BAD_J_COLORSPACE), (*(cinfo
)->err->error_exit) ((j_common_ptr)(cinfo)))
;
410 }
411}
412
413
414#ifdef C_PROGRESSIVE_SUPPORTED
415
416LOCAL(jpeg_scan_info *)static jpeg_scan_info *
417fill_a_scan(jpeg_scan_info *scanptr, int ci, int Ss, int Se, int Ah, int Al)
418/* Support routine: generate one scan for specified component */
419{
420 scanptr->comps_in_scan = 1;
421 scanptr->component_index[0] = ci;
422 scanptr->Ss = Ss;
423 scanptr->Se = Se;
424 scanptr->Ah = Ah;
425 scanptr->Al = Al;
426 scanptr++;
427 return scanptr;
428}
429
430LOCAL(jpeg_scan_info *)static jpeg_scan_info *
431fill_scans(jpeg_scan_info *scanptr, int ncomps, int Ss, int Se, int Ah, int Al)
432/* Support routine: generate one scan for each component */
433{
434 int ci;
435
436 for (ci = 0; ci < ncomps; ci++) {
437 scanptr->comps_in_scan = 1;
438 scanptr->component_index[0] = ci;
439 scanptr->Ss = Ss;
440 scanptr->Se = Se;
441 scanptr->Ah = Ah;
442 scanptr->Al = Al;
443 scanptr++;
444 }
445 return scanptr;
446}
447
448LOCAL(jpeg_scan_info *)static jpeg_scan_info *
449fill_dc_scans(jpeg_scan_info *scanptr, int ncomps, int Ah, int Al)
450/* Support routine: generate interleaved DC scan if possible, else N scans */
451{
452 int ci;
453
454 if (ncomps <= MAX_COMPS_IN_SCAN4) {
455 /* Single interleaved DC scan */
456 scanptr->comps_in_scan = ncomps;
457 for (ci = 0; ci < ncomps; ci++)
458 scanptr->component_index[ci] = ci;
459 scanptr->Ss = scanptr->Se = 0;
460 scanptr->Ah = Ah;
461 scanptr->Al = Al;
462 scanptr++;
463 } else {
464 /* Noninterleaved DC scan for each component */
465 scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
466 }
467 return scanptr;
468}
469
470
471/*
472 * Create a recommended progressive-JPEG script.
473 * cinfo->num_components and cinfo->jpeg_color_space must be correct.
474 */
475
476GLOBAL(void)void
477jpeg_simple_progression(j_compress_ptr cinfo)
478{
479 int ncomps = cinfo->num_components;
480 int nscans;
481 jpeg_scan_info *scanptr;
482
483 /* Safety check to ensure start_compress not called yet. */
484 if (cinfo->global_state != CSTATE_START100)
485 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state)((cinfo)->err->msg_code = (JERR_BAD_STATE), (cinfo)->
err->msg_parm.i[0] = (cinfo->global_state), (*(cinfo)->
err->error_exit) ((j_common_ptr)(cinfo)))
;
486
487#ifdef C_LOSSLESS_SUPPORTED
488 if (cinfo->master->lossless) {
489 cinfo->master->lossless = FALSE0;
490 jpeg_default_colorspace(cinfo);
491 }
492#endif
493
494 /* Figure space needed for script. Calculation must match code below! */
495 if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
496 /* Custom script for YCbCr color images. */
497 nscans = 10;
498 } else {
499 /* All-purpose script for other color spaces. */
500 if (ncomps > MAX_COMPS_IN_SCAN4)
501 nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */
502 else
503 nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */
504 }
505
506 /* Allocate space for script.
507 * We need to put it in the permanent pool in case the application performs
508 * multiple compressions without changing the settings. To avoid a memory
509 * leak if jpeg_simple_progression is called repeatedly for the same JPEG
510 * object, we try to re-use previously allocated space, and we allocate
511 * enough space to handle YCbCr even if initially asked for grayscale.
512 */
513 if (cinfo->script_space == NULL((void*)0) || cinfo->script_space_size < nscans) {
514 cinfo->script_space_size = MAX(nscans, 10)((nscans) > (10) ? (nscans) : (10));
515 cinfo->script_space = (jpeg_scan_info *)
516 (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_PERMANENT0,
517 cinfo->script_space_size * sizeof(jpeg_scan_info));
518 }
519 scanptr = cinfo->script_space;
520 cinfo->scan_info = scanptr;
521 cinfo->num_scans = nscans;
522
523 if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
524 /* Custom script for YCbCr color images. */
525 /* Initial DC scan */
526 scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
527 /* Initial AC scan: get some luma data out in a hurry */
528 scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
529 /* Chroma data is too small to be worth expending many scans on */
530 scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
531 scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
532 /* Complete spectral selection for luma AC */
533 scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
534 /* Refine next bit of luma AC */
535 scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
536 /* Finish DC successive approximation */
537 scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
538 /* Finish AC successive approximation */
539 scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
540 scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
541 /* Luma bottom bit comes last since it's usually largest scan */
542 scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
543 } else {
544 /* All-purpose script for other color spaces. */
545 /* Successive approximation first pass */
546 scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
547 scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
548 scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
549 /* Successive approximation second pass */
550 scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
551 /* Successive approximation final pass */
552 scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
553 scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
Value stored to 'scanptr' is never read
554 }
555}
556
557#endif /* C_PROGRESSIVE_SUPPORTED */
558
559
560#ifdef C_LOSSLESS_SUPPORTED
561
562/*
563 * Enable lossless mode.
564 */
565
566GLOBAL(void)void
567jpeg_enable_lossless(j_compress_ptr cinfo, int predictor_selection_value,
568 int point_transform)
569{
570 /* Safety check to ensure start_compress not called yet. */
571 if (cinfo->global_state != CSTATE_START100)
572 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state)((cinfo)->err->msg_code = (JERR_BAD_STATE), (cinfo)->
err->msg_parm.i[0] = (cinfo->global_state), (*(cinfo)->
err->error_exit) ((j_common_ptr)(cinfo)))
;
573
574 cinfo->master->lossless = TRUE1;
575 cinfo->Ss = predictor_selection_value;
576 cinfo->Se = 0;
577 cinfo->Ah = 0;
578 cinfo->Al = point_transform;
579
580 /* The JPEG spec simply gives the range 0..15 for Al (Pt), but that seems
581 * wrong: the upper bound ought to depend on data precision. Perhaps they
582 * really meant 0..N-1 for N-bit precision, which is what we allow here.
583 * Values greater than or equal to the data precision will result in a blank
584 * image.
585 */
586 if (cinfo->Ss < 1 || cinfo->Ss > 7 ||
587 cinfo->Al < 0 || cinfo->Al >= cinfo->data_precision)
588 ERREXIT4(cinfo, JERR_BAD_PROGRESSION,((cinfo)->err->msg_code = (JERR_BAD_PROGRESSION), (cinfo
)->err->msg_parm.i[0] = (cinfo->Ss), (cinfo)->err
->msg_parm.i[1] = (cinfo->Se), (cinfo)->err->msg_parm
.i[2] = (cinfo->Ah), (cinfo)->err->msg_parm.i[3] = (
cinfo->Al), (*(cinfo)->err->error_exit) ((j_common_ptr
)(cinfo)))
589 cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al)((cinfo)->err->msg_code = (JERR_BAD_PROGRESSION), (cinfo
)->err->msg_parm.i[0] = (cinfo->Ss), (cinfo)->err
->msg_parm.i[1] = (cinfo->Se), (cinfo)->err->msg_parm
.i[2] = (cinfo->Ah), (cinfo)->err->msg_parm.i[3] = (
cinfo->Al), (*(cinfo)->err->error_exit) ((j_common_ptr
)(cinfo)))
;
590}
591
592#endif /* C_LOSSLESS_SUPPORTED */