19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cjpeg.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1991-1998, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains a command-line user interface for the JPEG compressor. 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * It should work on any system with Unix- or MS-DOS-style command lines. 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Two different command line styles are permitted, depending on the 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * compile-time switch TWO_FILE_COMMANDLINE: 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cjpeg [options] inputfile outputfile 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cjpeg [options] [inputfile] 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In the second style, output is always to standard output, which you'd 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * normally redirect to a file or pipe to some other program. Input is 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * either from a named file or from standard input (typically redirected). 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The second style is convenient on Unix but is unhelpful on systems that 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * don't support pipes. Also, you MUST use the first style if your system 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * doesn't do binary I/O to stdin/stdout. 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * To simplify script writing, the "-outfile" switch is provided. The syntax 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cjpeg [options] -outfile outputfile inputfile 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * works regardless of which command line style is used. 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jversion.h" /* for version message */ 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef __MWERKS__ 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <SIOUX.h> /* Metrowerks needs this */ 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <console.h> /* ... and this */ 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef THINK_C 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <console.h> /* Think declares it here */ 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Create the add-on message string table. */ 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JMESSAGE(code,string) string , 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic const char * const cdjpeg_message_table[] = { 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cderror.h" 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project NULL 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}; 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine determines what format the input file is, 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and selects the appropriate input-reading module. 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * To determine which family of input formats the file belongs to, 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * we may look only at the first byte of the file, since C does not 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * guarantee that more than one character can be pushed back with ungetc. 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Looking at additional bytes would require one of these approaches: 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1) assume we can fseek() the input file (fails for piped input); 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 2) assume we can push back more than one character (works in 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * some C implementations, but unportable); 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 3) provide our own buffering (breaks input readers that want to use 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * stdio directly, such as the RLE library); 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * or 4) don't put back the data, and modify the input_init methods to assume 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * they start reading after the start of file (also breaks RLE library). 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * #1 is attractive for MS-DOS but is untenable on Unix. 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The most portable solution for file types that can't be identified by their 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * first byte is to make the user tell us what they are. This is also the 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * only approach for "raw" file types that contain only arbitrary values. 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We presently apply this method for Targa files. Most of the time Targa 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * files start with 0x00, so we recognize that case. Potentially, however, 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * a Targa file could start with any byte value (byte 0 is the length of the 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * seldom-used ID field), so we provide a switch to force Targa input mode. 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic boolean is_targa; /* records user -targa switch */ 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(cjpeg_source_ptr) 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectselect_file_type (j_compress_ptr cinfo, FILE * infile) 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int c; 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (is_targa) { 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef TARGA_SUPPORTED 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return jinit_read_targa(cinfo); 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_TGA_NOTCOMP); 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((c = getc(infile)) == EOF) 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_INPUT_EMPTY); 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ungetc(c, infile) == EOF) 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_UNGETC_FAILED); 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (c) { 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef BMP_SUPPORTED 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 'B': 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return jinit_read_bmp(cinfo); 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef GIF_SUPPORTED 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 'G': 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return jinit_read_gif(cinfo); 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef PPM_SUPPORTED 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 'P': 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return jinit_read_ppm(cinfo); 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef RLE_SUPPORTED 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 'R': 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return jinit_read_rle(cinfo); 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef TARGA_SUPPORTED 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 0x00: 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return jinit_read_targa(cinfo); 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_UNKNOWN_FORMAT); 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return NULL; /* suppress compiler warnings */ 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Argument-parsing code. 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The switch parser is designed to be useful with DOS-style command line 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * syntax, ie, intermixed switches and file names, where only the switches 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to the left of a given file name affect processing of that file. 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The main program in this file doesn't actually use this capability... 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic const char * progname; /* program name for error messages */ 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic char * outfilename; /* for -outfile switch */ 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectusage (void) 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* complain about bad command line */ 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "usage: %s [switches] ", progname); 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef TWO_FILE_COMMANDLINE 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "inputfile outputfile\n"); 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "[inputfile]\n"); 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Switches (names may be abbreviated):\n"); 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -quality N Compression quality (0..100; 5-95 is useful range)\n"); 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_PROGRESSIVE_SUPPORTED 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -progressive Create progressive JPEG file\n"); 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef TARGA_SUPPORTED 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n"); 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Switches for advanced users:\n"); 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef DCT_ISLOW_SUPPORTED 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -dct int Use integer DCT method%s\n", 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef DCT_IFAST_SUPPORTED 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n", 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDCT_DEFAULT == JDCT_IFAST ? " (default)" : "")); 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef DCT_FLOAT_SUPPORTED 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -dct float Use floating-point DCT method%s\n", 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : "")); 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef INPUT_SMOOTHING_SUPPORTED 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n"); 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -outfile name Specify name for output file\n"); 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -verbose or -debug Emit debug output\n"); 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Switches for wizards:\n"); 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_ARITH_CODING_SUPPORTED 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -arithmetic Use arithmetic coding\n"); 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -baseline Force baseline quantization tables\n"); 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -qtables file Use quantization tables given in file\n"); 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -qslots N[,...] Set component quantization tables\n"); 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n"); 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_MULTISCAN_FILES_SUPPORTED 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(int) 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectparse_switches (j_compress_ptr cinfo, int argc, char **argv, 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int last_file_arg_seen, boolean for_real) 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Parse optional switches. 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Returns argv[] index of first file-name argument (== argc if none). 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Any file names with indexes <= last_file_arg_seen are ignored; 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * they have presumably been processed in a previous iteration. 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (Pass 0 for last_file_arg_seen on the first or only iteration.) 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * for_real is FALSE on the first (dummy) pass; we may skip any expensive 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * processing. 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int argn; 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char * arg; 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int quality; /* -quality parameter */ 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int q_scale_factor; /* scaling percentage for -qtables */ 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project boolean force_baseline; 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project boolean simple_progressive; 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char * qtablefile = NULL; /* saves -qtables filename if any */ 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char * qslotsarg = NULL; /* saves -qslots parm if any */ 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char * samplearg = NULL; /* saves -sample parm if any */ 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char * scansarg = NULL; /* saves -scans parm if any */ 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set up default JPEG parameters. */ 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Note that default -quality level need not, and does not, 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * match the default scaling for an explicit -qtables argument. 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project quality = 75; /* default -quality value */ 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project q_scale_factor = 100; /* default to no scaling for -qtables */ 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project force_baseline = FALSE; /* by default, allow 16-bit quantizers */ 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project simple_progressive = FALSE; 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project is_targa = FALSE; 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outfilename = NULL; 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->err->trace_level = 0; 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Scan command line options, adjust parameters */ 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (argn = 1; argn < argc; argn++) { 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project arg = argv[argn]; 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (*arg != '-') { 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Not a switch, must be a file name argument */ 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (argn <= last_file_arg_seen) { 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outfilename = NULL; /* -outfile applies to just one input file */ 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project continue; /* ignore this name if previously processed */ 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; /* else done parsing switches */ 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project arg++; /* advance past switch marker character */ 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (keymatch(arg, "arithmetic", 1)) { 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Use arithmetic coding. */ 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_ARITH_CODING_SUPPORTED 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->arith_code = TRUE; 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname); 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "baseline", 1)) { 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Force baseline-compatible output (8-bit quantizer values). */ 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project force_baseline = TRUE; 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "dct", 2)) { 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Select DCT algorithm. */ 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (keymatch(argv[argn], "int", 1)) { 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->dct_method = JDCT_ISLOW; 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(argv[argn], "fast", 2)) { 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->dct_method = JDCT_IFAST; 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(argv[argn], "float", 2)) { 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->dct_method = JDCT_FLOAT; 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Enable debug printouts. */ 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* On first -d, print version identification */ 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project static boolean printed_version = FALSE; 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! printed_version) { 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Independent JPEG Group's CJPEG, version %s\n%s\n", 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JVERSION, JCOPYRIGHT); 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project printed_version = TRUE; 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->err->trace_level++; 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) { 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Force a monochrome JPEG file to be generated. */ 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "maxmemory", 3)) { 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Maximum memory in Kb (or Mb with 'm'). */ 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long lval; 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char ch = 'x'; 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ch == 'm' || ch == 'M') 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project lval *= 1000L; 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->mem->max_memory_to_use = lval * 1000L; 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Enable entropy parm optimization. */ 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->optimize_coding = TRUE; 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname); 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "outfile", 4)) { 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set output file name. */ 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outfilename = argv[argn]; /* save it away for later use */ 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "progressive", 1)) { 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Select simple progressive mode. */ 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_PROGRESSIVE_SUPPORTED 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project simple_progressive = TRUE; 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We must postpone execution until num_components is known. */ 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: sorry, progressive output was not compiled\n", 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname); 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "quality", 1)) { 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Quality factor (quantization table scaling factor). */ 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sscanf(argv[argn], "%d", &quality) != 1) 3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Change scale factor in case -qtables is present. */ 3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project q_scale_factor = jpeg_quality_scaling(quality); 3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "qslots", 2)) { 3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Quantization table slot numbers. */ 3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project qslotsarg = argv[argn]; 3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Must delay setting qslots until after we have processed any 3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * colorspace-determining switches, since jpeg_set_colorspace sets 3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * default quant table numbers. 3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "qtables", 2)) { 3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Quantization tables fetched from file. */ 3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project qtablefile = argv[argn]; 3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We postpone actually reading the file in case -quality comes later. */ 3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "restart", 1)) { 3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Restart interval in MCU rows (or in MCUs with 'b'). */ 3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long lval; 3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char ch = 'x'; 3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) 3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (lval < 0 || lval > 65535L) 3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ch == 'b' || ch == 'B') { 3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->restart_interval = (unsigned int) lval; 3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ 3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->restart_in_rows = (int) lval; 3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* restart_interval will be computed during startup */ 3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "sample", 2)) { 3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set sampling factors. */ 3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project samplearg = argv[argn]; 3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Must delay setting sample factors until after we have processed any 3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * colorspace-determining switches, since jpeg_set_colorspace sets 3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * default sampling factors. 3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "scans", 2)) { 3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set scan script. */ 3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_MULTISCAN_FILES_SUPPORTED 3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scansarg = argv[argn]; 3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We must postpone reading the file in case -progressive appears. */ 3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", 3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname); 3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "smooth", 2)) { 3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set input smoothing factor. */ 4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int val; 4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (++argn >= argc) /* advance to next argument */ 4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sscanf(argv[argn], "%d", &val) != 1) 4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (val < 0 || val > 100) 4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->smoothing_factor = val; 4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (keymatch(arg, "targa", 1)) { 4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Input file is Targa format. */ 4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project is_targa = TRUE; 4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); /* bogus switch */ 4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Post-switch-scanning cleanup */ 4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (for_real) { 4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set quantization tables for selected quality. */ 4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Some or all may be overridden if -qtables is present. */ 4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_set_quality(cinfo, quality, force_baseline); 4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (qtablefile != NULL) /* process -qtables if it was present */ 4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_quant_tables(cinfo, qtablefile, 4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project q_scale_factor, force_baseline)) 4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (qslotsarg != NULL) /* process -qslots if it was present */ 4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! set_quant_slots(cinfo, qslotsarg)) 4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (samplearg != NULL) /* process -sample if it was present */ 4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! set_sample_factors(cinfo, samplearg)) 4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_PROGRESSIVE_SUPPORTED 4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (simple_progressive) /* process -progressive; -scans can override */ 4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_simple_progression(cinfo); 4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_MULTISCAN_FILES_SUPPORTED 4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (scansarg != NULL) /* process -scans if it was present */ 4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_scan_script(cinfo, scansarg)) 4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return argn; /* return index of next arg (file name) */ 4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The main program. 4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectint 4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectmain (int argc, char **argv) 4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_compress_struct cinfo; 4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_error_mgr jerr; 4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef PROGRESS_REPORT 4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct cdjpeg_progress_mgr progress; 4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int file_index; 4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cjpeg_source_ptr src_mgr; 4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * input_file; 4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * output_file; 4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION num_scanlines; 4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* On Mac, fetch a command line. */ 4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef USE_CCOMMAND 4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project argc = ccommand(&argv); 4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname = argv[0]; 4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (progname == NULL || progname[0] == 0) 4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname = "cjpeg"; /* in case C library doesn't provide it */ 4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Initialize the JPEG compression object with default error handling. */ 4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.err = jpeg_std_error(&jerr); 4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_create_compress(&cinfo); 4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Add some application-specific error messages (from cderror.h) */ 4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jerr.addon_message_table = cdjpeg_message_table; 4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jerr.first_addon_message = JMSG_FIRSTADDONCODE; 4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jerr.last_addon_message = JMSG_LASTADDONCODE; 4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Now safe to enable signal catcher. */ 4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef NEED_SIGNAL_CATCHER 4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project enable_signal_catcher((j_common_ptr) &cinfo); 4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Initialize JPEG parameters. 4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Much of this may be overridden later. 4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In particular, we don't yet know the input file's color space, 4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * but we need to provide some value for jpeg_set_defaults() to work. 5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 5019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo.in_color_space = JCS_RGB; /* arbitrary guess */ 5039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_set_defaults(&cinfo); 5049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Scan command line to find file names. 5069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * It is convenient to use just one switch-parsing routine, but the switch 5079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * values read here are ignored; we will rescan the switches after opening 5089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the input file. 5099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 5109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project file_index = parse_switches(&cinfo, argc, argv, 0, FALSE); 5129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef TWO_FILE_COMMANDLINE 5149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Must have either -outfile switch or explicit output file name */ 5159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (outfilename == NULL) { 5169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (file_index != argc-2) { 5179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: must name one input and one output file\n", 5189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname); 5199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 5209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outfilename = argv[file_index+1]; 5229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 5239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (file_index != argc-1) { 5249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: must name one input and one output file\n", 5259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progname); 5269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 5279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 5309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Unix style: expect zero or one file name */ 5319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (file_index < argc-1) { 5329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: only one input file\n", progname); 5339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project usage(); 5349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* TWO_FILE_COMMANDLINE */ 5369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Open the input file. */ 5389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (file_index < argc) { 5399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) { 5409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]); 5419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 5429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 5449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* default input file is stdin */ 5459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project input_file = read_stdin(); 5469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Open the output file. */ 5499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (outfilename != NULL) { 5509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { 5519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "%s: can't open %s\n", progname, outfilename); 5529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 5539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 5559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* default output file is stdout */ 5569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project output_file = write_stdout(); 5579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef PROGRESS_REPORT 5609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project start_progress_monitor((j_common_ptr) &cinfo, &progress); 5619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 5629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Figure out the input file format, and set up to read it. */ 5649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_mgr = select_file_type(&cinfo, input_file); 5659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project src_mgr->input_file = input_file; 5669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Read the input file header to obtain file size & colorspace. */ 5689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*src_mgr->start_input) (&cinfo, src_mgr); 5699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Now that we know input colorspace, fix colorspace-dependent defaults */ 5719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_default_colorspace(&cinfo); 5729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Adjust default compression parameters by re-parsing the options */ 5749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project file_index = parse_switches(&cinfo, argc, argv, 0, TRUE); 5759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Specify data destination for compression */ 5779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_stdio_dest(&cinfo, output_file); 5789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Start compressor */ 5809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_start_compress(&cinfo, TRUE); 5819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Process data */ 5839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (cinfo.next_scanline < cinfo.image_height) { 5849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr); 5859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines); 5869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 5879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Finish compression and release memory */ 5899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*src_mgr->finish_input) (&cinfo, src_mgr); 5909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_finish_compress(&cinfo); 5919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_destroy_compress(&cinfo); 5929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Close files, if we opened them */ 5949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (input_file != stdin) 5959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(input_file); 5969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (output_file != stdout) 5979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(output_file); 5989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 5999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef PROGRESS_REPORT 6009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project end_progress_monitor((j_common_ptr) &cinfo); 6019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 6029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 6039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* All done. */ 6049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS); 6059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return 0; /* suppress no-return-value warnings */ 6069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 607