170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jpegtran.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1995-1997, Thomas G. Lane. 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software. 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file. 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains a command-line user interface for JPEG transcoding. 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * It is very similar to cjpeg.c, but provides lossless transcoding between 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * different JPEG file formats. It also provides some lossless and sort-of- 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * lossless transformations of JPEG data. 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "transupp.h" /* Support routines for jpegtran */ 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jversion.h" /* for version message */ 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef __MWERKS__ 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <SIOUX.h> /* Metrowerks needs this */ 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <console.h> /* ... and this */ 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef THINK_C 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <console.h> /* Think declares it here */ 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Argument-parsing code. 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The switch parser is designed to be useful with DOS-style command line 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * syntax, ie, intermixed switches and file names, where only the switches 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to the left of a given file name affect processing of that file. 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The main program in this file doesn't actually use this capability... 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic const char * progname; /* program name for error messages */ 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic char * outfilename; /* for -outfile switch */ 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic JCOPY_OPTION copyoption; /* -copy switch */ 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestatic jpeg_transform_info transformoption; /* image transformation options */ 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineusage (void) 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* complain about bad command line */ 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "usage: %s [switches] ", progname); 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef TWO_FILE_COMMANDLINE 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "inputfile outputfile\n"); 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "[inputfile]\n"); 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Switches (names may be abbreviated):\n"); 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -copy none Copy no extra markers from source file\n"); 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -copy comments Copy only comment markers (default)\n"); 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -copy all Copy all extra markers\n"); 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ENTROPY_OPT_SUPPORTED 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_PROGRESSIVE_SUPPORTED 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -progressive Create progressive JPEG file\n"); 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if TRANSFORMS_SUPPORTED 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Switches for modifying the image:\n"); 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n"); 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n"); 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n"); 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -transpose Transpose image\n"); 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -transverse Transverse transpose image\n"); 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -trim Drop non-transformable edge blocks\n"); 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* TRANSFORMS_SUPPORTED */ 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Switches for advanced users:\n"); 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -outfile name Specify name for output file\n"); 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -verbose or -debug Emit debug output\n"); 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Switches for wizards:\n"); 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_ARITH_CODING_SUPPORTED 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -arithmetic Use arithmetic coding\n"); 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_MULTISCAN_FILES_SUPPORTED 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineselect_transform (JXFORM_CODE transform) 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Silly little routine to detect multiple transform options, 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * which we can't handle. 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if TRANSFORMS_SUPPORTED 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (transformoption.transform == JXFORM_NONE || 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transformoption.transform == transform) { 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transformoption.transform = transform; 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: can only do one image transformation at a time\n", 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: sorry, image transformation was not compiled\n", 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(int) 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineparse_switches (j_compress_ptr cinfo, int argc, char **argv, 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int last_file_arg_seen, boolean for_real) 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Parse optional switches. 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Returns argv[] index of first file-name argument (== argc if none). 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Any file names with indexes <= last_file_arg_seen are ignored; 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * they have presumably been processed in a previous iteration. 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (Pass 0 for last_file_arg_seen on the first or only iteration.) 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * for_real is FALSE on the first (dummy) pass; we may skip any expensive 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * processing. 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int argn; 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char * arg; 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine boolean simple_progressive; 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char * scansarg = NULL; /* saves -scans parm if any */ 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set up default JPEG parameters. */ 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine simple_progressive = FALSE; 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outfilename = NULL; 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine copyoption = JCOPYOPT_DEFAULT; 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transformoption.transform = JXFORM_NONE; 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transformoption.trim = FALSE; 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transformoption.force_grayscale = FALSE; 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->err->trace_level = 0; 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Scan command line options, adjust parameters */ 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (argn = 1; argn < argc; argn++) { 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine arg = argv[argn]; 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (*arg != '-') { 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Not a switch, must be a file name argument */ 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (argn <= last_file_arg_seen) { 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outfilename = NULL; /* -outfile applies to just one input file */ 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; /* ignore this name if previously processed */ 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; /* else done parsing switches */ 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine arg++; /* advance past switch marker character */ 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (keymatch(arg, "arithmetic", 1)) { 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Use arithmetic coding. */ 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_ARITH_CODING_SUPPORTED 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->arith_code = TRUE; 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "copy", 1)) { 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Select which extra markers to copy. */ 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++argn >= argc) /* advance to next argument */ 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (keymatch(argv[argn], "none", 1)) { 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine copyoption = JCOPYOPT_NONE; 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(argv[argn], "comments", 1)) { 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine copyoption = JCOPYOPT_COMMENTS; 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(argv[argn], "all", 1)) { 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine copyoption = JCOPYOPT_ALL; 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Enable debug printouts. */ 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* On first -d, print version identification */ 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static boolean printed_version = FALSE; 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! printed_version) { 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Independent JPEG Group's JPEGTRAN, version %s\n%s\n", 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JVERSION, JCOPYRIGHT); 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine printed_version = TRUE; 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->err->trace_level++; 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "flip", 1)) { 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Mirror left-right or top-bottom. */ 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++argn >= argc) /* advance to next argument */ 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (keymatch(argv[argn], "horizontal", 1)) 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_FLIP_H); 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else if (keymatch(argv[argn], "vertical", 1)) 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_FLIP_V); 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "grayscale", 1) || keymatch(arg, "greyscale",1)) { 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Force to grayscale. */ 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if TRANSFORMS_SUPPORTED 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transformoption.force_grayscale = TRUE; 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_NONE); /* force an error */ 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "maxmemory", 3)) { 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Maximum memory in Kb (or Mb with 'm'). */ 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine long lval; 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char ch = 'x'; 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++argn >= argc) /* advance to next argument */ 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch == 'm' || ch == 'M') 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine lval *= 1000L; 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->mem->max_memory_to_use = lval * 1000L; 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Enable entropy parm optimization. */ 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ENTROPY_OPT_SUPPORTED 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->optimize_coding = TRUE; 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "outfile", 4)) { 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set output file name. */ 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++argn >= argc) /* advance to next argument */ 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outfilename = argv[argn]; /* save it away for later use */ 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "progressive", 1)) { 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Select simple progressive mode. */ 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_PROGRESSIVE_SUPPORTED 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine simple_progressive = TRUE; 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We must postpone execution until num_components is known. */ 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: sorry, progressive output was not compiled\n", 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "restart", 1)) { 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Restart interval in MCU rows (or in MCUs with 'b'). */ 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine long lval; 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char ch = 'x'; 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++argn >= argc) /* advance to next argument */ 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (lval < 0 || lval > 65535L) 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch == 'b' || ch == 'B') { 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->restart_interval = (unsigned int) lval; 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->restart_in_rows = (int) lval; 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* restart_interval will be computed during startup */ 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "rotate", 2)) { 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Rotate 90, 180, or 270 degrees (measured clockwise). */ 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++argn >= argc) /* advance to next argument */ 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (keymatch(argv[argn], "90", 2)) 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_ROT_90); 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else if (keymatch(argv[argn], "180", 3)) 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_ROT_180); 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else if (keymatch(argv[argn], "270", 3)) 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_ROT_270); 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "scans", 1)) { 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set scan script. */ 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_MULTISCAN_FILES_SUPPORTED 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++argn >= argc) /* advance to next argument */ 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scansarg = argv[argn]; 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We must postpone reading the file in case -progressive appears. */ 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "transpose", 1)) { 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Transpose (across UL-to-LR axis). */ 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_TRANSPOSE); 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "transverse", 6)) { 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Transverse transpose (across UR-to-LL axis). */ 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine select_transform(JXFORM_TRANSVERSE); 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (keymatch(arg, "trim", 3)) { 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Trim off any partial edge MCUs that the transform can't handle. */ 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine transformoption.trim = TRUE; 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); /* bogus switch */ 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Post-switch-scanning cleanup */ 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (for_real) { 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_PROGRESSIVE_SUPPORTED 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (simple_progressive) /* process -progressive; -scans can override */ 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_simple_progression(cinfo); 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_MULTISCAN_FILES_SUPPORTED 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (scansarg != NULL) /* process -scans if it was present */ 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_scan_script(cinfo, scansarg)) 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return argn; /* return index of next arg (file name) */ 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The main program. 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineint 33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinemain (int argc, char **argv) 33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct jpeg_decompress_struct srcinfo; 33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct jpeg_compress_struct dstinfo; 33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct jpeg_error_mgr jsrcerr, jdsterr; 33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef PROGRESS_REPORT 34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct cdjpeg_progress_mgr progress; 34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jvirt_barray_ptr * src_coef_arrays; 34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jvirt_barray_ptr * dst_coef_arrays; 34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int file_index; 34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FILE * input_file; 34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FILE * output_file; 34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* On Mac, fetch a command line. */ 34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef USE_CCOMMAND 35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine argc = ccommand(&argv); 35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname = argv[0]; 35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (progname == NULL || progname[0] == 0) 35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname = "jpegtran"; /* in case C library doesn't provide it */ 35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize the JPEG decompression object with default error handling. */ 35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine srcinfo.err = jpeg_std_error(&jsrcerr); 35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_create_decompress(&srcinfo); 36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize the JPEG compression object with default error handling. */ 36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine dstinfo.err = jpeg_std_error(&jdsterr); 36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_create_compress(&dstinfo); 36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Now safe to enable signal catcher. 36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note: we assume only the decompression object will have virtual arrays. 36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef NEED_SIGNAL_CATCHER 36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine enable_signal_catcher((j_common_ptr) &srcinfo); 36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Scan command line to find file names. 37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * It is convenient to use just one switch-parsing routine, but the switch 37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * values read here are mostly ignored; we will rescan the switches after 37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * opening the input file. Also note that most of the switches affect the 37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * destination JPEG object, so we parse into that and then copy over what 37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * needs to affects the source too. 37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine file_index = parse_switches(&dstinfo, argc, argv, 0, FALSE); 38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jsrcerr.trace_level = jdsterr.trace_level; 38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use; 38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef TWO_FILE_COMMANDLINE 38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Must have either -outfile switch or explicit output file name */ 38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (outfilename == NULL) { 38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (file_index != argc-2) { 38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: must name one input and one output file\n", 38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outfilename = argv[file_index+1]; 39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (file_index != argc-1) { 39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: must name one input and one output file\n", 39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progname); 39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Unix style: expect zero or one file name */ 40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (file_index < argc-1) { 40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: only one input file\n", progname); 40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine usage(); 40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* TWO_FILE_COMMANDLINE */ 40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Open the input file. */ 40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (file_index < argc) { 40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) { 41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]); 41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* default input file is stdin */ 41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine input_file = read_stdin(); 41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Open the output file. */ 41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (outfilename != NULL) { 42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) { 42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "%s: can't open %s\n", progname, outfilename); 42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(EXIT_FAILURE); 42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* default output file is stdout */ 42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_file = write_stdout(); 42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef PROGRESS_REPORT 43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_progress_monitor((j_common_ptr) &dstinfo, &progress); 43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Specify data source for decompression */ 43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_stdio_src(&srcinfo, input_file); 43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Enable saving of extra markers that we want to copy */ 43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jcopy_markers_setup(&srcinfo, copyoption); 43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Read file header */ 44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (void) jpeg_read_header(&srcinfo, TRUE); 44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Any space needed by a transform option must be requested before 44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jpeg_read_coefficients so that memory allocation will be done right. 44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if TRANSFORMS_SUPPORTED 44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jtransform_request_workspace(&srcinfo, &transformoption); 44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Read source file as DCT coefficients */ 45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine src_coef_arrays = jpeg_read_coefficients(&srcinfo); 45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Initialize destination compression parameters from source values */ 45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_copy_critical_parameters(&srcinfo, &dstinfo); 45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Adjust destination parameters if required by transform options; 45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * also find out which set of coefficient arrays will hold the output. 45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if TRANSFORMS_SUPPORTED 45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine dst_coef_arrays = jtransform_adjust_parameters(&srcinfo, &dstinfo, 46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine src_coef_arrays, 46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine &transformoption); 46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine dst_coef_arrays = src_coef_arrays; 46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Adjust default compression parameters by re-parsing the options */ 46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE); 46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Specify data destination for compression */ 47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_stdio_dest(&dstinfo, output_file); 47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Start compressor (note no image data is actually written here) */ 47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_write_coefficients(&dstinfo, dst_coef_arrays); 47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Copy to the output file any extra markers that we want to preserve */ 47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jcopy_markers_execute(&srcinfo, &dstinfo, copyoption); 47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Execute image transformation, if any */ 47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if TRANSFORMS_SUPPORTED 48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jtransform_execute_transformation(&srcinfo, &dstinfo, 48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine src_coef_arrays, 48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine &transformoption); 48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Finish compression and release memory */ 48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_finish_compress(&dstinfo); 48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_destroy_compress(&dstinfo); 48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (void) jpeg_finish_decompress(&srcinfo); 48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_destroy_decompress(&srcinfo); 49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Close files, if we opened them */ 49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (input_file != stdin) 49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(input_file); 49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (output_file != stdout) 49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(output_file); 49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef PROGRESS_REPORT 49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine end_progress_monitor((j_common_ptr) &dstinfo); 49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* All done. */ 50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine exit(jsrcerr.num_warnings + jdsterr.num_warnings ?EXIT_WARNING:EXIT_SUCCESS); 50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 0; /* suppress no-return-value warnings */ 50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 505