4 * This file was part of the Independent JPEG Group's software:
5 * Copyright (C) 1991-1996, Thomas G. Lane.
6 * libjpeg-turbo Modifications:
7 * Copyright (C) 2010, D. R. Commander.
8 * For conditions of distribution and use, see the accompanying README file.
10 * This file contains routines to process some of cjpeg's more complicated
11 * command-line switches. Switches processed here are:
12 * -qtables file Read quantization tables from text file
13 * -scans file Read scan script from text file
14 * -quality N[,N,...] Set quality ratings
15 * -qslots N[,N,...] Set component quantization table selectors
16 * -sample HxV[,HxV,...] Set component sampling factors
19 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
20 #include <ctype.h> /* to declare isdigit(), isspace() */
24 text_getc (FILE * file)
25 /* Read next char, skipping over any comments (# to end of line) */
26 /* A comment/newline sequence is returned as a newline */
34 } while (ch != '\n' && ch != EOF);
41 read_text_integer (FILE * file, long * result, int * termchar)
42 /* Read an unsigned decimal integer from a file, store it in result */
43 /* Reads one trailing character after the integer; returns it in termchar */
48 /* Skip any leading whitespace, detect EOF */
55 } while (isspace(ch));
63 while ((ch = text_getc(file)) != EOF) {
75 #if JPEG_LIB_VERSION < 70
76 static int q_scale_factor[NUM_QUANT_TBLS] = {100, 100, 100, 100};
80 read_quant_tables (j_compress_ptr cinfo, char * filename, boolean force_baseline)
81 /* Read a set of quantization tables from the specified file.
82 * The file is plain ASCII text: decimal numbers with whitespace between.
83 * Comments preceded by '#' may be included in the file.
84 * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values.
85 * The tables are implicitly numbered 0,1,etc.
86 * NOTE: does not affect the qslots mapping, which will default to selecting
87 * table 0 for luminance (or primary) components, 1 for chrominance components.
88 * You must use -qslots if you want a different component->table mapping.
92 int tblno, i, termchar;
94 unsigned int table[DCTSIZE2];
96 if ((fp = fopen(filename, "r")) == NULL) {
97 fprintf(stderr, "Can't open table file %s\n", filename);
102 while (read_text_integer(fp, &val, &termchar)) { /* read 1st element of table */
103 if (tblno >= NUM_QUANT_TBLS) {
104 fprintf(stderr, "Too many tables in file %s\n", filename);
108 table[0] = (unsigned int) val;
109 for (i = 1; i < DCTSIZE2; i++) {
110 if (! read_text_integer(fp, &val, &termchar)) {
111 fprintf(stderr, "Invalid table data in file %s\n", filename);
115 table[i] = (unsigned int) val;
117 #if JPEG_LIB_VERSION >= 70
118 jpeg_add_quant_table(cinfo, tblno, table, cinfo->q_scale_factor[tblno],
121 jpeg_add_quant_table(cinfo, tblno, table, q_scale_factor[tblno],
127 if (termchar != EOF) {
128 fprintf(stderr, "Non-numeric data in file %s\n", filename);
138 #ifdef C_MULTISCAN_FILES_SUPPORTED
141 read_scan_integer (FILE * file, long * result, int * termchar)
142 /* Variant of read_text_integer that always looks for a non-space termchar;
143 * this simplifies parsing of punctuation in scan scripts.
148 if (! read_text_integer(file, result, termchar))
151 while (ch != EOF && isspace(ch))
152 ch = text_getc(file);
153 if (isdigit(ch)) { /* oops, put it back */
154 if (ungetc(ch, file) == EOF)
158 /* Any separators other than ';' and ':' are ignored;
159 * this allows user to insert commas, etc, if desired.
161 if (ch != EOF && ch != ';' && ch != ':')
170 read_scan_script (j_compress_ptr cinfo, char * filename)
171 /* Read a scan script from the specified text file.
172 * Each entry in the file defines one scan to be emitted.
173 * Entries are separated by semicolons ';'.
174 * An entry contains one to four component indexes,
175 * optionally followed by a colon ':' and four progressive-JPEG parameters.
176 * The component indexes denote which component(s) are to be transmitted
177 * in the current scan. The first component has index 0.
178 * Sequential JPEG is used if the progressive-JPEG parameters are omitted.
179 * The file is free format text: any whitespace may appear between numbers
180 * and the ':' and ';' punctuation marks. Also, other punctuation (such
181 * as commas or dashes) can be placed between numbers if desired.
182 * Comments preceded by '#' may be included in the file.
183 * Note: we do very little validity checking here;
184 * jcmaster.c will validate the script parameters.
188 int scanno, ncomps, termchar;
190 jpeg_scan_info * scanptr;
191 #define MAX_SCANS 100 /* quite arbitrary limit */
192 jpeg_scan_info scans[MAX_SCANS];
194 if ((fp = fopen(filename, "r")) == NULL) {
195 fprintf(stderr, "Can't open scan definition file %s\n", filename);
201 while (read_scan_integer(fp, &val, &termchar)) {
202 if (scanno >= MAX_SCANS) {
203 fprintf(stderr, "Too many scans defined in file %s\n", filename);
207 scanptr->component_index[0] = (int) val;
209 while (termchar == ' ') {
210 if (ncomps >= MAX_COMPS_IN_SCAN) {
211 fprintf(stderr, "Too many components in one scan in file %s\n",
216 if (! read_scan_integer(fp, &val, &termchar))
218 scanptr->component_index[ncomps] = (int) val;
221 scanptr->comps_in_scan = ncomps;
222 if (termchar == ':') {
223 if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
225 scanptr->Ss = (int) val;
226 if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
228 scanptr->Se = (int) val;
229 if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
231 scanptr->Ah = (int) val;
232 if (! read_scan_integer(fp, &val, &termchar))
234 scanptr->Al = (int) val;
236 /* set non-progressive parameters */
238 scanptr->Se = DCTSIZE2-1;
242 if (termchar != ';' && termchar != EOF) {
244 fprintf(stderr, "Invalid scan entry format in file %s\n", filename);
251 if (termchar != EOF) {
252 fprintf(stderr, "Non-numeric data in file %s\n", filename);
258 /* Stash completed scan list in cinfo structure.
259 * NOTE: for cjpeg's use, JPOOL_IMAGE is the right lifetime for this data,
260 * but if you want to compress multiple images you'd want JPOOL_PERMANENT.
262 scanptr = (jpeg_scan_info *)
263 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
264 scanno * SIZEOF(jpeg_scan_info));
265 MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info));
266 cinfo->scan_info = scanptr;
267 cinfo->num_scans = scanno;
274 #endif /* C_MULTISCAN_FILES_SUPPORTED */
277 #if JPEG_LIB_VERSION < 70
278 /* These are the sample quantization tables given in JPEG spec section K.1.
279 * The spec says that the values given produce "good" quality, and
280 * when divided by 2, "very good" quality.
282 static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
283 16, 11, 10, 16, 24, 40, 51, 61,
284 12, 12, 14, 19, 26, 58, 60, 55,
285 14, 13, 16, 24, 40, 57, 69, 56,
286 14, 17, 22, 29, 51, 87, 80, 62,
287 18, 22, 37, 56, 68, 109, 103, 77,
288 24, 35, 55, 64, 81, 104, 113, 92,
289 49, 64, 78, 87, 103, 121, 120, 101,
290 72, 92, 95, 98, 112, 100, 103, 99
292 static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
293 17, 18, 24, 47, 99, 99, 99, 99,
294 18, 21, 26, 66, 99, 99, 99, 99,
295 24, 26, 56, 99, 99, 99, 99, 99,
296 47, 66, 99, 99, 99, 99, 99, 99,
297 99, 99, 99, 99, 99, 99, 99, 99,
298 99, 99, 99, 99, 99, 99, 99, 99,
299 99, 99, 99, 99, 99, 99, 99, 99,
300 99, 99, 99, 99, 99, 99, 99, 99
305 jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline)
307 jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
308 q_scale_factor[0], force_baseline);
309 jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
310 q_scale_factor[1], force_baseline);
316 set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline)
317 /* Process a quality-ratings parameter string, of the form
319 * If there are more q-table slots than parameters, the last value is replicated.
322 int val = 75; /* default value */
326 for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {
328 ch = ','; /* if not set by sscanf, will be ',' */
329 if (sscanf(arg, "%d%c", &val, &ch) < 1)
331 if (ch != ',') /* syntax check */
333 /* Convert user 0-100 rating to percentage scaling */
334 #if JPEG_LIB_VERSION >= 70
335 cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val);
337 q_scale_factor[tblno] = jpeg_quality_scaling(val);
339 while (*arg && *arg++ != ',') /* advance to next segment of arg string */
342 /* reached end of parameter, set remaining factors to last value */
343 #if JPEG_LIB_VERSION >= 70
344 cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val);
346 q_scale_factor[tblno] = jpeg_quality_scaling(val);
350 jpeg_default_qtables(cinfo, force_baseline);
356 set_quant_slots (j_compress_ptr cinfo, char *arg)
357 /* Process a quantization-table-selectors parameter string, of the form
359 * If there are more components than parameters, the last value is replicated.
362 int val = 0; /* default table # */
366 for (ci = 0; ci < MAX_COMPONENTS; ci++) {
368 ch = ','; /* if not set by sscanf, will be ',' */
369 if (sscanf(arg, "%d%c", &val, &ch) < 1)
371 if (ch != ',') /* syntax check */
373 if (val < 0 || val >= NUM_QUANT_TBLS) {
374 fprintf(stderr, "JPEG quantization tables are numbered 0..%d\n",
378 cinfo->comp_info[ci].quant_tbl_no = val;
379 while (*arg && *arg++ != ',') /* advance to next segment of arg string */
382 /* reached end of parameter, set remaining components to last table */
383 cinfo->comp_info[ci].quant_tbl_no = val;
391 set_sample_factors (j_compress_ptr cinfo, char *arg)
392 /* Process a sample-factors parameter string, of the form
394 * If there are more components than parameters, "1x1" is assumed for the rest.
400 for (ci = 0; ci < MAX_COMPONENTS; ci++) {
402 ch2 = ','; /* if not set by sscanf, will be ',' */
403 if (sscanf(arg, "%d%c%d%c", &val1, &ch1, &val2, &ch2) < 3)
405 if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') /* syntax check */
407 if (val1 <= 0 || val1 > 4 || val2 <= 0 || val2 > 4) {
408 fprintf(stderr, "JPEG sampling factors must be 1..4\n");
411 cinfo->comp_info[ci].h_samp_factor = val1;
412 cinfo->comp_info[ci].v_samp_factor = val2;
413 while (*arg && *arg++ != ',') /* advance to next segment of arg string */
416 /* reached end of parameter, set remaining components to 1x1 sampling */
417 cinfo->comp_info[ci].h_samp_factor = 1;
418 cinfo->comp_info[ci].v_samp_factor = 1;