1*dfc6aa5cSAndroid Build Coastguard WorkerUSING THE IJG JPEG LIBRARY 2*dfc6aa5cSAndroid Build Coastguard Worker 3*dfc6aa5cSAndroid Build Coastguard WorkerThis file was part of the Independent JPEG Group's software: 4*dfc6aa5cSAndroid Build Coastguard WorkerCopyright (C) 1994-2013, Thomas G. Lane, Guido Vollbeding. 5*dfc6aa5cSAndroid Build Coastguard Workerlibjpeg-turbo Modifications: 6*dfc6aa5cSAndroid Build Coastguard WorkerCopyright (C) 2010, 2014-2018, 2020, 2022, D. R. Commander. 7*dfc6aa5cSAndroid Build Coastguard WorkerCopyright (C) 2015, Google, Inc. 8*dfc6aa5cSAndroid Build Coastguard WorkerFor conditions of distribution and use, see the accompanying README.ijg file. 9*dfc6aa5cSAndroid Build Coastguard Worker 10*dfc6aa5cSAndroid Build Coastguard Worker 11*dfc6aa5cSAndroid Build Coastguard WorkerThis file describes how to use the IJG JPEG library within an application 12*dfc6aa5cSAndroid Build Coastguard Workerprogram. Read it if you want to write a program that uses the library. 13*dfc6aa5cSAndroid Build Coastguard Worker 14*dfc6aa5cSAndroid Build Coastguard WorkerThe file example.txt provides heavily commented skeleton code for calling the 15*dfc6aa5cSAndroid Build Coastguard WorkerJPEG library. Also see jpeglib.h (the include file to be used by application 16*dfc6aa5cSAndroid Build Coastguard Workerprograms) for full details about data structures and function parameter lists. 17*dfc6aa5cSAndroid Build Coastguard WorkerThe library source code, of course, is the ultimate reference. 18*dfc6aa5cSAndroid Build Coastguard Worker 19*dfc6aa5cSAndroid Build Coastguard WorkerNote that there have been *major* changes from the application interface 20*dfc6aa5cSAndroid Build Coastguard Workerpresented by IJG version 4 and earlier versions. The old design had several 21*dfc6aa5cSAndroid Build Coastguard Workerinherent limitations, and it had accumulated a lot of cruft as we added 22*dfc6aa5cSAndroid Build Coastguard Workerfeatures while trying to minimize application-interface changes. We have 23*dfc6aa5cSAndroid Build Coastguard Workersacrificed backward compatibility in the version 5 rewrite, but we think the 24*dfc6aa5cSAndroid Build Coastguard Workerimprovements justify this. 25*dfc6aa5cSAndroid Build Coastguard Worker 26*dfc6aa5cSAndroid Build Coastguard Worker 27*dfc6aa5cSAndroid Build Coastguard WorkerTABLE OF CONTENTS 28*dfc6aa5cSAndroid Build Coastguard Worker----------------- 29*dfc6aa5cSAndroid Build Coastguard Worker 30*dfc6aa5cSAndroid Build Coastguard WorkerOverview: 31*dfc6aa5cSAndroid Build Coastguard Worker Functions provided by the library 32*dfc6aa5cSAndroid Build Coastguard Worker Outline of typical usage 33*dfc6aa5cSAndroid Build Coastguard WorkerBasic library usage: 34*dfc6aa5cSAndroid Build Coastguard Worker Data formats 35*dfc6aa5cSAndroid Build Coastguard Worker Compression details 36*dfc6aa5cSAndroid Build Coastguard Worker Decompression details 37*dfc6aa5cSAndroid Build Coastguard Worker Partial image decompression 38*dfc6aa5cSAndroid Build Coastguard Worker Mechanics of usage: include files, linking, etc 39*dfc6aa5cSAndroid Build Coastguard WorkerAdvanced features: 40*dfc6aa5cSAndroid Build Coastguard Worker Compression parameter selection 41*dfc6aa5cSAndroid Build Coastguard Worker Decompression parameter selection 42*dfc6aa5cSAndroid Build Coastguard Worker Special color spaces 43*dfc6aa5cSAndroid Build Coastguard Worker Error handling 44*dfc6aa5cSAndroid Build Coastguard Worker Compressed data handling (source and destination managers) 45*dfc6aa5cSAndroid Build Coastguard Worker I/O suspension 46*dfc6aa5cSAndroid Build Coastguard Worker Progressive JPEG support 47*dfc6aa5cSAndroid Build Coastguard Worker Buffered-image mode 48*dfc6aa5cSAndroid Build Coastguard Worker Abbreviated datastreams and multiple images 49*dfc6aa5cSAndroid Build Coastguard Worker Special markers 50*dfc6aa5cSAndroid Build Coastguard Worker ICC profiles 51*dfc6aa5cSAndroid Build Coastguard Worker Raw (downsampled) image data 52*dfc6aa5cSAndroid Build Coastguard Worker Really raw data: DCT coefficients 53*dfc6aa5cSAndroid Build Coastguard Worker Progress monitoring 54*dfc6aa5cSAndroid Build Coastguard Worker Memory management 55*dfc6aa5cSAndroid Build Coastguard Worker Memory usage 56*dfc6aa5cSAndroid Build Coastguard Worker Library compile-time options 57*dfc6aa5cSAndroid Build Coastguard Worker Portability considerations 58*dfc6aa5cSAndroid Build Coastguard Worker 59*dfc6aa5cSAndroid Build Coastguard WorkerYou should read at least the overview and basic usage sections before trying 60*dfc6aa5cSAndroid Build Coastguard Workerto program with the library. The sections on advanced features can be read 61*dfc6aa5cSAndroid Build Coastguard Workerif and when you need them. 62*dfc6aa5cSAndroid Build Coastguard Worker 63*dfc6aa5cSAndroid Build Coastguard Worker 64*dfc6aa5cSAndroid Build Coastguard WorkerOVERVIEW 65*dfc6aa5cSAndroid Build Coastguard Worker======== 66*dfc6aa5cSAndroid Build Coastguard Worker 67*dfc6aa5cSAndroid Build Coastguard WorkerFunctions provided by the library 68*dfc6aa5cSAndroid Build Coastguard Worker--------------------------------- 69*dfc6aa5cSAndroid Build Coastguard Worker 70*dfc6aa5cSAndroid Build Coastguard WorkerThe IJG JPEG library provides C code to read and write JPEG-compressed image 71*dfc6aa5cSAndroid Build Coastguard Workerfiles. The surrounding application program receives or supplies image data a 72*dfc6aa5cSAndroid Build Coastguard Workerscanline at a time, using a straightforward uncompressed image format. All 73*dfc6aa5cSAndroid Build Coastguard Workerdetails of color conversion and other preprocessing/postprocessing can be 74*dfc6aa5cSAndroid Build Coastguard Workerhandled by the library. 75*dfc6aa5cSAndroid Build Coastguard Worker 76*dfc6aa5cSAndroid Build Coastguard WorkerThe library includes a substantial amount of code that is not covered by the 77*dfc6aa5cSAndroid Build Coastguard WorkerJPEG standard but is necessary for typical applications of JPEG. These 78*dfc6aa5cSAndroid Build Coastguard Workerfunctions preprocess the image before JPEG compression or postprocess it after 79*dfc6aa5cSAndroid Build Coastguard Workerdecompression. They include colorspace conversion, downsampling/upsampling, 80*dfc6aa5cSAndroid Build Coastguard Workerand color quantization. The application indirectly selects use of this code 81*dfc6aa5cSAndroid Build Coastguard Workerby specifying the format in which it wishes to supply or receive image data. 82*dfc6aa5cSAndroid Build Coastguard WorkerFor example, if colormapped output is requested, then the decompression 83*dfc6aa5cSAndroid Build Coastguard Workerlibrary automatically invokes color quantization. 84*dfc6aa5cSAndroid Build Coastguard Worker 85*dfc6aa5cSAndroid Build Coastguard WorkerA wide range of quality vs. speed tradeoffs are possible in JPEG processing, 86*dfc6aa5cSAndroid Build Coastguard Workerand even more so in decompression postprocessing. The decompression library 87*dfc6aa5cSAndroid Build Coastguard Workerprovides multiple implementations that cover most of the useful tradeoffs, 88*dfc6aa5cSAndroid Build Coastguard Workerranging from very-high-quality down to fast-preview operation. On the 89*dfc6aa5cSAndroid Build Coastguard Workercompression side we have generally not provided low-quality choices, since 90*dfc6aa5cSAndroid Build Coastguard Workercompression is normally less time-critical. It should be understood that the 91*dfc6aa5cSAndroid Build Coastguard Workerlow-quality modes may not meet the JPEG standard's accuracy requirements; 92*dfc6aa5cSAndroid Build Coastguard Workernonetheless, they are useful for viewers. 93*dfc6aa5cSAndroid Build Coastguard Worker 94*dfc6aa5cSAndroid Build Coastguard WorkerA word about functions *not* provided by the library. We handle a subset of 95*dfc6aa5cSAndroid Build Coastguard Workerthe ISO JPEG standard; most baseline, extended-sequential, and progressive 96*dfc6aa5cSAndroid Build Coastguard WorkerJPEG processes are supported. (Our subset includes all features now in common 97*dfc6aa5cSAndroid Build Coastguard Workeruse.) Unsupported ISO options include: 98*dfc6aa5cSAndroid Build Coastguard Worker * Hierarchical storage 99*dfc6aa5cSAndroid Build Coastguard Worker * Lossless JPEG 100*dfc6aa5cSAndroid Build Coastguard Worker * DNL marker 101*dfc6aa5cSAndroid Build Coastguard Worker * Nonintegral subsampling ratios 102*dfc6aa5cSAndroid Build Coastguard WorkerWe support both 8- and 12-bit data precision, but this is a compile-time 103*dfc6aa5cSAndroid Build Coastguard Workerchoice rather than a run-time choice; hence it is difficult to use both 104*dfc6aa5cSAndroid Build Coastguard Workerprecisions in a single application. 105*dfc6aa5cSAndroid Build Coastguard Worker 106*dfc6aa5cSAndroid Build Coastguard WorkerBy itself, the library handles only interchange JPEG datastreams --- in 107*dfc6aa5cSAndroid Build Coastguard Workerparticular the widely used JFIF file format. The library can be used by 108*dfc6aa5cSAndroid Build Coastguard Workersurrounding code to process interchange or abbreviated JPEG datastreams that 109*dfc6aa5cSAndroid Build Coastguard Workerare embedded in more complex file formats. (For example, this library is 110*dfc6aa5cSAndroid Build Coastguard Workerused by the free LIBTIFF library to support JPEG compression in TIFF.) 111*dfc6aa5cSAndroid Build Coastguard Worker 112*dfc6aa5cSAndroid Build Coastguard Worker 113*dfc6aa5cSAndroid Build Coastguard WorkerOutline of typical usage 114*dfc6aa5cSAndroid Build Coastguard Worker------------------------ 115*dfc6aa5cSAndroid Build Coastguard Worker 116*dfc6aa5cSAndroid Build Coastguard WorkerThe rough outline of a JPEG compression operation is: 117*dfc6aa5cSAndroid Build Coastguard Worker 118*dfc6aa5cSAndroid Build Coastguard Worker Allocate and initialize a JPEG compression object 119*dfc6aa5cSAndroid Build Coastguard Worker Specify the destination for the compressed data (eg, a file) 120*dfc6aa5cSAndroid Build Coastguard Worker Set parameters for compression, including image size & colorspace 121*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_compress(...); 122*dfc6aa5cSAndroid Build Coastguard Worker while (scan lines remain to be written) 123*dfc6aa5cSAndroid Build Coastguard Worker jpeg_write_scanlines(...); 124*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_compress(...); 125*dfc6aa5cSAndroid Build Coastguard Worker Release the JPEG compression object 126*dfc6aa5cSAndroid Build Coastguard Worker 127*dfc6aa5cSAndroid Build Coastguard WorkerA JPEG compression object holds parameters and working state for the JPEG 128*dfc6aa5cSAndroid Build Coastguard Workerlibrary. We make creation/destruction of the object separate from starting 129*dfc6aa5cSAndroid Build Coastguard Workeror finishing compression of an image; the same object can be re-used for a 130*dfc6aa5cSAndroid Build Coastguard Workerseries of image compression operations. This makes it easy to re-use the 131*dfc6aa5cSAndroid Build Coastguard Workersame parameter settings for a sequence of images. Re-use of a JPEG object 132*dfc6aa5cSAndroid Build Coastguard Workeralso has important implications for processing abbreviated JPEG datastreams, 133*dfc6aa5cSAndroid Build Coastguard Workeras discussed later. 134*dfc6aa5cSAndroid Build Coastguard Worker 135*dfc6aa5cSAndroid Build Coastguard WorkerThe image data to be compressed is supplied to jpeg_write_scanlines() from 136*dfc6aa5cSAndroid Build Coastguard Workerin-memory buffers. If the application is doing file-to-file compression, 137*dfc6aa5cSAndroid Build Coastguard Workerreading image data from the source file is the application's responsibility. 138*dfc6aa5cSAndroid Build Coastguard WorkerThe library emits compressed data by calling a "data destination manager", 139*dfc6aa5cSAndroid Build Coastguard Workerwhich typically will write the data into a file; but the application can 140*dfc6aa5cSAndroid Build Coastguard Workerprovide its own destination manager to do something else. 141*dfc6aa5cSAndroid Build Coastguard Worker 142*dfc6aa5cSAndroid Build Coastguard WorkerSimilarly, the rough outline of a JPEG decompression operation is: 143*dfc6aa5cSAndroid Build Coastguard Worker 144*dfc6aa5cSAndroid Build Coastguard Worker Allocate and initialize a JPEG decompression object 145*dfc6aa5cSAndroid Build Coastguard Worker Specify the source of the compressed data (eg, a file) 146*dfc6aa5cSAndroid Build Coastguard Worker Call jpeg_read_header() to obtain image info 147*dfc6aa5cSAndroid Build Coastguard Worker Set parameters for decompression 148*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_decompress(...); 149*dfc6aa5cSAndroid Build Coastguard Worker while (scan lines remain to be read) 150*dfc6aa5cSAndroid Build Coastguard Worker jpeg_read_scanlines(...); 151*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_decompress(...); 152*dfc6aa5cSAndroid Build Coastguard Worker Release the JPEG decompression object 153*dfc6aa5cSAndroid Build Coastguard Worker 154*dfc6aa5cSAndroid Build Coastguard WorkerThis is comparable to the compression outline except that reading the 155*dfc6aa5cSAndroid Build Coastguard Workerdatastream header is a separate step. This is helpful because information 156*dfc6aa5cSAndroid Build Coastguard Workerabout the image's size, colorspace, etc is available when the application 157*dfc6aa5cSAndroid Build Coastguard Workerselects decompression parameters. For example, the application can choose an 158*dfc6aa5cSAndroid Build Coastguard Workeroutput scaling ratio that will fit the image into the available screen size. 159*dfc6aa5cSAndroid Build Coastguard Worker 160*dfc6aa5cSAndroid Build Coastguard WorkerThe decompression library obtains compressed data by calling a data source 161*dfc6aa5cSAndroid Build Coastguard Workermanager, which typically will read the data from a file; but other behaviors 162*dfc6aa5cSAndroid Build Coastguard Workercan be obtained with a custom source manager. Decompressed data is delivered 163*dfc6aa5cSAndroid Build Coastguard Workerinto in-memory buffers passed to jpeg_read_scanlines(). 164*dfc6aa5cSAndroid Build Coastguard Worker 165*dfc6aa5cSAndroid Build Coastguard WorkerIt is possible to abort an incomplete compression or decompression operation 166*dfc6aa5cSAndroid Build Coastguard Workerby calling jpeg_abort(); or, if you do not need to retain the JPEG object, 167*dfc6aa5cSAndroid Build Coastguard Workersimply release it by calling jpeg_destroy(). 168*dfc6aa5cSAndroid Build Coastguard Worker 169*dfc6aa5cSAndroid Build Coastguard WorkerJPEG compression and decompression objects are two separate struct types. 170*dfc6aa5cSAndroid Build Coastguard WorkerHowever, they share some common fields, and certain routines such as 171*dfc6aa5cSAndroid Build Coastguard Workerjpeg_destroy() can work on either type of object. 172*dfc6aa5cSAndroid Build Coastguard Worker 173*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG library has no static variables: all state is in the compression 174*dfc6aa5cSAndroid Build Coastguard Workeror decompression object. Therefore it is possible to process multiple 175*dfc6aa5cSAndroid Build Coastguard Workercompression and decompression operations concurrently, using multiple JPEG 176*dfc6aa5cSAndroid Build Coastguard Workerobjects. 177*dfc6aa5cSAndroid Build Coastguard Worker 178*dfc6aa5cSAndroid Build Coastguard WorkerBoth compression and decompression can be done in an incremental memory-to- 179*dfc6aa5cSAndroid Build Coastguard Workermemory fashion, if suitable source/destination managers are used. See the 180*dfc6aa5cSAndroid Build Coastguard Workersection on "I/O suspension" for more details. 181*dfc6aa5cSAndroid Build Coastguard Worker 182*dfc6aa5cSAndroid Build Coastguard Worker 183*dfc6aa5cSAndroid Build Coastguard WorkerBASIC LIBRARY USAGE 184*dfc6aa5cSAndroid Build Coastguard Worker=================== 185*dfc6aa5cSAndroid Build Coastguard Worker 186*dfc6aa5cSAndroid Build Coastguard WorkerData formats 187*dfc6aa5cSAndroid Build Coastguard Worker------------ 188*dfc6aa5cSAndroid Build Coastguard Worker 189*dfc6aa5cSAndroid Build Coastguard WorkerBefore diving into procedural details, it is helpful to understand the 190*dfc6aa5cSAndroid Build Coastguard Workerimage data format that the JPEG library expects or returns. 191*dfc6aa5cSAndroid Build Coastguard Worker 192*dfc6aa5cSAndroid Build Coastguard WorkerThe standard input image format is a rectangular array of pixels, with each 193*dfc6aa5cSAndroid Build Coastguard Workerpixel having the same number of "component" or "sample" values (color 194*dfc6aa5cSAndroid Build Coastguard Workerchannels). You must specify how many components there are and the colorspace 195*dfc6aa5cSAndroid Build Coastguard Workerinterpretation of the components. Most applications will use RGB data 196*dfc6aa5cSAndroid Build Coastguard Worker(three components per pixel) or grayscale data (one component per pixel). 197*dfc6aa5cSAndroid Build Coastguard WorkerPLEASE NOTE THAT RGB DATA IS THREE SAMPLES PER PIXEL, GRAYSCALE ONLY ONE. 198*dfc6aa5cSAndroid Build Coastguard WorkerA remarkable number of people manage to miss this, only to find that their 199*dfc6aa5cSAndroid Build Coastguard Workerprograms don't work with grayscale JPEG files. 200*dfc6aa5cSAndroid Build Coastguard Worker 201*dfc6aa5cSAndroid Build Coastguard WorkerThere is no provision for colormapped input. JPEG files are always full-color 202*dfc6aa5cSAndroid Build Coastguard Workeror full grayscale (or sometimes another colorspace such as CMYK). You can 203*dfc6aa5cSAndroid Build Coastguard Workerfeed in a colormapped image by expanding it to full-color format. However 204*dfc6aa5cSAndroid Build Coastguard WorkerJPEG often doesn't work very well with source data that has been colormapped, 205*dfc6aa5cSAndroid Build Coastguard Workerbecause of dithering noise. This is discussed in more detail in the JPEG FAQ 206*dfc6aa5cSAndroid Build Coastguard Workerand the other references mentioned in the README.ijg file. 207*dfc6aa5cSAndroid Build Coastguard Worker 208*dfc6aa5cSAndroid Build Coastguard WorkerPixels are stored by scanlines, with each scanline running from left to 209*dfc6aa5cSAndroid Build Coastguard Workerright. The component values for each pixel are adjacent in the row; for 210*dfc6aa5cSAndroid Build Coastguard Workerexample, R,G,B,R,G,B,R,G,B,... for 24-bit RGB color. Each scanline is an 211*dfc6aa5cSAndroid Build Coastguard Workerarray of data type JSAMPLE --- which is typically "unsigned char", unless 212*dfc6aa5cSAndroid Build Coastguard Workeryou've changed jmorecfg.h. (You can also change the RGB pixel layout, say 213*dfc6aa5cSAndroid Build Coastguard Workerto B,G,R order, by modifying jmorecfg.h. But see the restrictions listed in 214*dfc6aa5cSAndroid Build Coastguard Workerthat file before doing so.) 215*dfc6aa5cSAndroid Build Coastguard Worker 216*dfc6aa5cSAndroid Build Coastguard WorkerA 2-D array of pixels is formed by making a list of pointers to the starts of 217*dfc6aa5cSAndroid Build Coastguard Workerscanlines; so the scanlines need not be physically adjacent in memory. Even 218*dfc6aa5cSAndroid Build Coastguard Workerif you process just one scanline at a time, you must make a one-element 219*dfc6aa5cSAndroid Build Coastguard Workerpointer array to conform to this structure. Pointers to JSAMPLE rows are of 220*dfc6aa5cSAndroid Build Coastguard Workertype JSAMPROW, and the pointer to the pointer array is of type JSAMPARRAY. 221*dfc6aa5cSAndroid Build Coastguard Worker 222*dfc6aa5cSAndroid Build Coastguard WorkerThe library accepts or supplies one or more complete scanlines per call. 223*dfc6aa5cSAndroid Build Coastguard WorkerIt is not possible to process part of a row at a time. Scanlines are always 224*dfc6aa5cSAndroid Build Coastguard Workerprocessed top-to-bottom. You can process an entire image in one call if you 225*dfc6aa5cSAndroid Build Coastguard Workerhave it all in memory, but usually it's simplest to process one scanline at 226*dfc6aa5cSAndroid Build Coastguard Workera time. 227*dfc6aa5cSAndroid Build Coastguard Worker 228*dfc6aa5cSAndroid Build Coastguard WorkerFor best results, source data values should have the precision specified by 229*dfc6aa5cSAndroid Build Coastguard WorkerBITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress 230*dfc6aa5cSAndroid Build Coastguard Workerdata that's only 6 bits/channel, you should left-justify each value in a 231*dfc6aa5cSAndroid Build Coastguard Workerbyte before passing it to the compressor. If you need to compress data 232*dfc6aa5cSAndroid Build Coastguard Workerthat has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12. 233*dfc6aa5cSAndroid Build Coastguard Worker(See "Library compile-time options", later.) 234*dfc6aa5cSAndroid Build Coastguard Worker 235*dfc6aa5cSAndroid Build Coastguard Worker 236*dfc6aa5cSAndroid Build Coastguard WorkerThe data format returned by the decompressor is the same in all details, 237*dfc6aa5cSAndroid Build Coastguard Workerexcept that colormapped output is supported. (Again, a JPEG file is never 238*dfc6aa5cSAndroid Build Coastguard Workercolormapped. But you can ask the decompressor to perform on-the-fly color 239*dfc6aa5cSAndroid Build Coastguard Workerquantization to deliver colormapped output.) If you request colormapped 240*dfc6aa5cSAndroid Build Coastguard Workeroutput then the returned data array contains a single JSAMPLE per pixel; 241*dfc6aa5cSAndroid Build Coastguard Workerits value is an index into a color map. The color map is represented as 242*dfc6aa5cSAndroid Build Coastguard Workera 2-D JSAMPARRAY in which each row holds the values of one color component, 243*dfc6aa5cSAndroid Build Coastguard Workerthat is, colormap[i][j] is the value of the i'th color component for pixel 244*dfc6aa5cSAndroid Build Coastguard Workervalue (map index) j. Note that since the colormap indexes are stored in 245*dfc6aa5cSAndroid Build Coastguard WorkerJSAMPLEs, the maximum number of colors is limited by the size of JSAMPLE 246*dfc6aa5cSAndroid Build Coastguard Worker(ie, at most 256 colors for an 8-bit JPEG library). 247*dfc6aa5cSAndroid Build Coastguard Worker 248*dfc6aa5cSAndroid Build Coastguard Worker 249*dfc6aa5cSAndroid Build Coastguard WorkerCompression details 250*dfc6aa5cSAndroid Build Coastguard Worker------------------- 251*dfc6aa5cSAndroid Build Coastguard Worker 252*dfc6aa5cSAndroid Build Coastguard WorkerHere we revisit the JPEG compression outline given in the overview. 253*dfc6aa5cSAndroid Build Coastguard Worker 254*dfc6aa5cSAndroid Build Coastguard Worker1. Allocate and initialize a JPEG compression object. 255*dfc6aa5cSAndroid Build Coastguard Worker 256*dfc6aa5cSAndroid Build Coastguard WorkerA JPEG compression object is a "struct jpeg_compress_struct". (It also has 257*dfc6aa5cSAndroid Build Coastguard Workera bunch of subsidiary structures which are allocated via malloc(), but the 258*dfc6aa5cSAndroid Build Coastguard Workerapplication doesn't control those directly.) This struct can be just a local 259*dfc6aa5cSAndroid Build Coastguard Workervariable in the calling routine, if a single routine is going to execute the 260*dfc6aa5cSAndroid Build Coastguard Workerwhole JPEG compression sequence. Otherwise it can be static or allocated 261*dfc6aa5cSAndroid Build Coastguard Workerfrom malloc(). 262*dfc6aa5cSAndroid Build Coastguard Worker 263*dfc6aa5cSAndroid Build Coastguard WorkerYou will also need a structure representing a JPEG error handler. The part 264*dfc6aa5cSAndroid Build Coastguard Workerof this that the library cares about is a "struct jpeg_error_mgr". If you 265*dfc6aa5cSAndroid Build Coastguard Workerare providing your own error handler, you'll typically want to embed the 266*dfc6aa5cSAndroid Build Coastguard Workerjpeg_error_mgr struct in a larger structure; this is discussed later under 267*dfc6aa5cSAndroid Build Coastguard Worker"Error handling". For now we'll assume you are just using the default error 268*dfc6aa5cSAndroid Build Coastguard Workerhandler. The default error handler will print JPEG error/warning messages 269*dfc6aa5cSAndroid Build Coastguard Workeron stderr, and it will call exit() if a fatal error occurs. 270*dfc6aa5cSAndroid Build Coastguard Worker 271*dfc6aa5cSAndroid Build Coastguard WorkerYou must initialize the error handler structure, store a pointer to it into 272*dfc6aa5cSAndroid Build Coastguard Workerthe JPEG object's "err" field, and then call jpeg_create_compress() to 273*dfc6aa5cSAndroid Build Coastguard Workerinitialize the rest of the JPEG object. 274*dfc6aa5cSAndroid Build Coastguard Worker 275*dfc6aa5cSAndroid Build Coastguard WorkerTypical code for this step, if you are using the default error handler, is 276*dfc6aa5cSAndroid Build Coastguard Worker 277*dfc6aa5cSAndroid Build Coastguard Worker struct jpeg_compress_struct cinfo; 278*dfc6aa5cSAndroid Build Coastguard Worker struct jpeg_error_mgr jerr; 279*dfc6aa5cSAndroid Build Coastguard Worker ... 280*dfc6aa5cSAndroid Build Coastguard Worker cinfo.err = jpeg_std_error(&jerr); 281*dfc6aa5cSAndroid Build Coastguard Worker jpeg_create_compress(&cinfo); 282*dfc6aa5cSAndroid Build Coastguard Worker 283*dfc6aa5cSAndroid Build Coastguard Workerjpeg_create_compress allocates a small amount of memory, so it could fail 284*dfc6aa5cSAndroid Build Coastguard Workerif you are out of memory. In that case it will exit via the error handler; 285*dfc6aa5cSAndroid Build Coastguard Workerthat's why the error handler must be initialized first. 286*dfc6aa5cSAndroid Build Coastguard Worker 287*dfc6aa5cSAndroid Build Coastguard Worker 288*dfc6aa5cSAndroid Build Coastguard Worker2. Specify the destination for the compressed data (eg, a file). 289*dfc6aa5cSAndroid Build Coastguard Worker 290*dfc6aa5cSAndroid Build Coastguard WorkerAs previously mentioned, the JPEG library delivers compressed data to a 291*dfc6aa5cSAndroid Build Coastguard Worker"data destination" module. The library includes one data destination 292*dfc6aa5cSAndroid Build Coastguard Workermodule which knows how to write to a stdio stream. You can use your own 293*dfc6aa5cSAndroid Build Coastguard Workerdestination module if you want to do something else, as discussed later. 294*dfc6aa5cSAndroid Build Coastguard Worker 295*dfc6aa5cSAndroid Build Coastguard WorkerIf you use the standard destination module, you must open the target stdio 296*dfc6aa5cSAndroid Build Coastguard Workerstream beforehand. Typical code for this step looks like: 297*dfc6aa5cSAndroid Build Coastguard Worker 298*dfc6aa5cSAndroid Build Coastguard Worker FILE *outfile; 299*dfc6aa5cSAndroid Build Coastguard Worker ... 300*dfc6aa5cSAndroid Build Coastguard Worker if ((outfile = fopen(filename, "wb")) == NULL) { 301*dfc6aa5cSAndroid Build Coastguard Worker fprintf(stderr, "can't open %s\n", filename); 302*dfc6aa5cSAndroid Build Coastguard Worker exit(1); 303*dfc6aa5cSAndroid Build Coastguard Worker } 304*dfc6aa5cSAndroid Build Coastguard Worker jpeg_stdio_dest(&cinfo, outfile); 305*dfc6aa5cSAndroid Build Coastguard Worker 306*dfc6aa5cSAndroid Build Coastguard Workerwhere the last line invokes the standard destination module. 307*dfc6aa5cSAndroid Build Coastguard Worker 308*dfc6aa5cSAndroid Build Coastguard WorkerWARNING: it is critical that the binary compressed data be delivered to the 309*dfc6aa5cSAndroid Build Coastguard Workeroutput file unchanged. On non-Unix systems the stdio library may perform 310*dfc6aa5cSAndroid Build Coastguard Workernewline translation or otherwise corrupt binary data. To suppress this 311*dfc6aa5cSAndroid Build Coastguard Workerbehavior, you may need to use a "b" option to fopen (as shown above), or use 312*dfc6aa5cSAndroid Build Coastguard Workersetmode() or another routine to put the stdio stream in binary mode. See 313*dfc6aa5cSAndroid Build Coastguard Workercjpeg.c and djpeg.c for code that has been found to work on many systems. 314*dfc6aa5cSAndroid Build Coastguard Worker 315*dfc6aa5cSAndroid Build Coastguard WorkerYou can select the data destination after setting other parameters (step 3), 316*dfc6aa5cSAndroid Build Coastguard Workerif that's more convenient. You may not change the destination between 317*dfc6aa5cSAndroid Build Coastguard Workercalling jpeg_start_compress() and jpeg_finish_compress(). 318*dfc6aa5cSAndroid Build Coastguard Worker 319*dfc6aa5cSAndroid Build Coastguard Worker 320*dfc6aa5cSAndroid Build Coastguard Worker3. Set parameters for compression, including image size & colorspace. 321*dfc6aa5cSAndroid Build Coastguard Worker 322*dfc6aa5cSAndroid Build Coastguard WorkerYou must supply information about the source image by setting the following 323*dfc6aa5cSAndroid Build Coastguard Workerfields in the JPEG object (cinfo structure): 324*dfc6aa5cSAndroid Build Coastguard Worker 325*dfc6aa5cSAndroid Build Coastguard Worker image_width Width of image, in pixels 326*dfc6aa5cSAndroid Build Coastguard Worker image_height Height of image, in pixels 327*dfc6aa5cSAndroid Build Coastguard Worker input_components Number of color channels (samples per pixel) 328*dfc6aa5cSAndroid Build Coastguard Worker in_color_space Color space of source image 329*dfc6aa5cSAndroid Build Coastguard Worker 330*dfc6aa5cSAndroid Build Coastguard WorkerThe image dimensions are, hopefully, obvious. JPEG supports image dimensions 331*dfc6aa5cSAndroid Build Coastguard Workerof 1 to 64K pixels in either direction. The input color space is typically 332*dfc6aa5cSAndroid Build Coastguard WorkerRGB or grayscale, and input_components is 3 or 1 accordingly. (See "Special 333*dfc6aa5cSAndroid Build Coastguard Workercolor spaces", later, for more info.) The in_color_space field must be 334*dfc6aa5cSAndroid Build Coastguard Workerassigned one of the J_COLOR_SPACE enum constants, typically JCS_RGB or 335*dfc6aa5cSAndroid Build Coastguard WorkerJCS_GRAYSCALE. 336*dfc6aa5cSAndroid Build Coastguard Worker 337*dfc6aa5cSAndroid Build Coastguard WorkerJPEG has a large number of compression parameters that determine how the 338*dfc6aa5cSAndroid Build Coastguard Workerimage is encoded. Most applications don't need or want to know about all 339*dfc6aa5cSAndroid Build Coastguard Workerthese parameters. You can set all the parameters to reasonable defaults by 340*dfc6aa5cSAndroid Build Coastguard Workercalling jpeg_set_defaults(); then, if there are particular values you want 341*dfc6aa5cSAndroid Build Coastguard Workerto change, you can do so after that. The "Compression parameter selection" 342*dfc6aa5cSAndroid Build Coastguard Workersection tells about all the parameters. 343*dfc6aa5cSAndroid Build Coastguard Worker 344*dfc6aa5cSAndroid Build Coastguard WorkerYou must set in_color_space correctly before calling jpeg_set_defaults(), 345*dfc6aa5cSAndroid Build Coastguard Workerbecause the defaults depend on the source image colorspace. However the 346*dfc6aa5cSAndroid Build Coastguard Workerother three source image parameters need not be valid until you call 347*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_compress(). There's no harm in calling jpeg_set_defaults() more 348*dfc6aa5cSAndroid Build Coastguard Workerthan once, if that happens to be convenient. 349*dfc6aa5cSAndroid Build Coastguard Worker 350*dfc6aa5cSAndroid Build Coastguard WorkerTypical code for a 24-bit RGB source image is 351*dfc6aa5cSAndroid Build Coastguard Worker 352*dfc6aa5cSAndroid Build Coastguard Worker cinfo.image_width = Width; /* image width and height, in pixels */ 353*dfc6aa5cSAndroid Build Coastguard Worker cinfo.image_height = Height; 354*dfc6aa5cSAndroid Build Coastguard Worker cinfo.input_components = 3; /* # of color components per pixel */ 355*dfc6aa5cSAndroid Build Coastguard Worker cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ 356*dfc6aa5cSAndroid Build Coastguard Worker 357*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_defaults(&cinfo); 358*dfc6aa5cSAndroid Build Coastguard Worker /* Make optional parameter settings here */ 359*dfc6aa5cSAndroid Build Coastguard Worker 360*dfc6aa5cSAndroid Build Coastguard Worker 361*dfc6aa5cSAndroid Build Coastguard Worker4. jpeg_start_compress(...); 362*dfc6aa5cSAndroid Build Coastguard Worker 363*dfc6aa5cSAndroid Build Coastguard WorkerAfter you have established the data destination and set all the necessary 364*dfc6aa5cSAndroid Build Coastguard Workersource image info and other parameters, call jpeg_start_compress() to begin 365*dfc6aa5cSAndroid Build Coastguard Workera compression cycle. This will initialize internal state, allocate working 366*dfc6aa5cSAndroid Build Coastguard Workerstorage, and emit the first few bytes of the JPEG datastream header. 367*dfc6aa5cSAndroid Build Coastguard Worker 368*dfc6aa5cSAndroid Build Coastguard WorkerTypical code: 369*dfc6aa5cSAndroid Build Coastguard Worker 370*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_compress(&cinfo, TRUE); 371*dfc6aa5cSAndroid Build Coastguard Worker 372*dfc6aa5cSAndroid Build Coastguard WorkerThe "TRUE" parameter ensures that a complete JPEG interchange datastream 373*dfc6aa5cSAndroid Build Coastguard Workerwill be written. This is appropriate in most cases. If you think you might 374*dfc6aa5cSAndroid Build Coastguard Workerwant to use an abbreviated datastream, read the section on abbreviated 375*dfc6aa5cSAndroid Build Coastguard Workerdatastreams, below. 376*dfc6aa5cSAndroid Build Coastguard Worker 377*dfc6aa5cSAndroid Build Coastguard WorkerOnce you have called jpeg_start_compress(), you may not alter any JPEG 378*dfc6aa5cSAndroid Build Coastguard Workerparameters or other fields of the JPEG object until you have completed 379*dfc6aa5cSAndroid Build Coastguard Workerthe compression cycle. 380*dfc6aa5cSAndroid Build Coastguard Worker 381*dfc6aa5cSAndroid Build Coastguard Worker 382*dfc6aa5cSAndroid Build Coastguard Worker5. while (scan lines remain to be written) 383*dfc6aa5cSAndroid Build Coastguard Worker jpeg_write_scanlines(...); 384*dfc6aa5cSAndroid Build Coastguard Worker 385*dfc6aa5cSAndroid Build Coastguard WorkerNow write all the required image data by calling jpeg_write_scanlines() 386*dfc6aa5cSAndroid Build Coastguard Workerone or more times. You can pass one or more scanlines in each call, up 387*dfc6aa5cSAndroid Build Coastguard Workerto the total image height. In most applications it is convenient to pass 388*dfc6aa5cSAndroid Build Coastguard Workerjust one or a few scanlines at a time. The expected format for the passed 389*dfc6aa5cSAndroid Build Coastguard Workerdata is discussed under "Data formats", above. 390*dfc6aa5cSAndroid Build Coastguard Worker 391*dfc6aa5cSAndroid Build Coastguard WorkerImage data should be written in top-to-bottom scanline order. 392*dfc6aa5cSAndroid Build Coastguard WorkerRec. ITU-T T.81 | ISO/IEC 10918-1 says, "Applications determine which edges of 393*dfc6aa5cSAndroid Build Coastguard Workera source image are defined as top, bottom, left, and right." However, if you 394*dfc6aa5cSAndroid Build Coastguard Workerwant your files to be compatible with everyone else's, then top-to-bottom order 395*dfc6aa5cSAndroid Build Coastguard Workermust be used. If the source data must be read in bottom-to-top order, then you 396*dfc6aa5cSAndroid Build Coastguard Workercan use the JPEG library's virtual array mechanism to invert the data 397*dfc6aa5cSAndroid Build Coastguard Workerefficiently. Examples of this can be found in the sample application cjpeg. 398*dfc6aa5cSAndroid Build Coastguard Worker 399*dfc6aa5cSAndroid Build Coastguard WorkerThe library maintains a count of the number of scanlines written so far 400*dfc6aa5cSAndroid Build Coastguard Workerin the next_scanline field of the JPEG object. Usually you can just use 401*dfc6aa5cSAndroid Build Coastguard Workerthis variable as the loop counter, so that the loop test looks like 402*dfc6aa5cSAndroid Build Coastguard Worker"while (cinfo.next_scanline < cinfo.image_height)". 403*dfc6aa5cSAndroid Build Coastguard Worker 404*dfc6aa5cSAndroid Build Coastguard WorkerCode for this step depends heavily on the way that you store the source data. 405*dfc6aa5cSAndroid Build Coastguard Workerexample.txt shows the following code for the case of a full-size 2-D source 406*dfc6aa5cSAndroid Build Coastguard Workerarray containing 3-byte RGB pixels: 407*dfc6aa5cSAndroid Build Coastguard Worker 408*dfc6aa5cSAndroid Build Coastguard Worker JSAMPROW row_pointer[1]; /* pointer to a single row */ 409*dfc6aa5cSAndroid Build Coastguard Worker int row_stride; /* physical row width in buffer */ 410*dfc6aa5cSAndroid Build Coastguard Worker 411*dfc6aa5cSAndroid Build Coastguard Worker row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ 412*dfc6aa5cSAndroid Build Coastguard Worker 413*dfc6aa5cSAndroid Build Coastguard Worker while (cinfo.next_scanline < cinfo.image_height) { 414*dfc6aa5cSAndroid Build Coastguard Worker row_pointer[0] = &image_buffer[cinfo.next_scanline * row_stride]; 415*dfc6aa5cSAndroid Build Coastguard Worker jpeg_write_scanlines(&cinfo, row_pointer, 1); 416*dfc6aa5cSAndroid Build Coastguard Worker } 417*dfc6aa5cSAndroid Build Coastguard Worker 418*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_scanlines() returns the number of scanlines actually written. 419*dfc6aa5cSAndroid Build Coastguard WorkerThis will normally be equal to the number passed in, so you can usually 420*dfc6aa5cSAndroid Build Coastguard Workerignore the return value. It is different in just two cases: 421*dfc6aa5cSAndroid Build Coastguard Worker * If you try to write more scanlines than the declared image height, 422*dfc6aa5cSAndroid Build Coastguard Worker the additional scanlines are ignored. 423*dfc6aa5cSAndroid Build Coastguard Worker * If you use a suspending data destination manager, output buffer overrun 424*dfc6aa5cSAndroid Build Coastguard Worker will cause the compressor to return before accepting all the passed lines. 425*dfc6aa5cSAndroid Build Coastguard Worker This feature is discussed under "I/O suspension", below. The normal 426*dfc6aa5cSAndroid Build Coastguard Worker stdio destination manager will NOT cause this to happen. 427*dfc6aa5cSAndroid Build Coastguard WorkerIn any case, the return value is the same as the change in the value of 428*dfc6aa5cSAndroid Build Coastguard Workernext_scanline. 429*dfc6aa5cSAndroid Build Coastguard Worker 430*dfc6aa5cSAndroid Build Coastguard Worker 431*dfc6aa5cSAndroid Build Coastguard Worker6. jpeg_finish_compress(...); 432*dfc6aa5cSAndroid Build Coastguard Worker 433*dfc6aa5cSAndroid Build Coastguard WorkerAfter all the image data has been written, call jpeg_finish_compress() to 434*dfc6aa5cSAndroid Build Coastguard Workercomplete the compression cycle. This step is ESSENTIAL to ensure that the 435*dfc6aa5cSAndroid Build Coastguard Workerlast bufferload of data is written to the data destination. 436*dfc6aa5cSAndroid Build Coastguard Workerjpeg_finish_compress() also releases working memory associated with the JPEG 437*dfc6aa5cSAndroid Build Coastguard Workerobject. 438*dfc6aa5cSAndroid Build Coastguard Worker 439*dfc6aa5cSAndroid Build Coastguard WorkerTypical code: 440*dfc6aa5cSAndroid Build Coastguard Worker 441*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_compress(&cinfo); 442*dfc6aa5cSAndroid Build Coastguard Worker 443*dfc6aa5cSAndroid Build Coastguard WorkerIf using the stdio destination manager, don't forget to close the output 444*dfc6aa5cSAndroid Build Coastguard Workerstdio stream (if necessary) afterwards. 445*dfc6aa5cSAndroid Build Coastguard Worker 446*dfc6aa5cSAndroid Build Coastguard WorkerIf you have requested a multi-pass operating mode, such as Huffman code 447*dfc6aa5cSAndroid Build Coastguard Workeroptimization, jpeg_finish_compress() will perform the additional passes using 448*dfc6aa5cSAndroid Build Coastguard Workerdata buffered by the first pass. In this case jpeg_finish_compress() may take 449*dfc6aa5cSAndroid Build Coastguard Workerquite a while to complete. With the default compression parameters, this will 450*dfc6aa5cSAndroid Build Coastguard Workernot happen. 451*dfc6aa5cSAndroid Build Coastguard Worker 452*dfc6aa5cSAndroid Build Coastguard WorkerIt is an error to call jpeg_finish_compress() before writing the necessary 453*dfc6aa5cSAndroid Build Coastguard Workertotal number of scanlines. If you wish to abort compression, call 454*dfc6aa5cSAndroid Build Coastguard Workerjpeg_abort() as discussed below. 455*dfc6aa5cSAndroid Build Coastguard Worker 456*dfc6aa5cSAndroid Build Coastguard WorkerAfter completing a compression cycle, you may dispose of the JPEG object 457*dfc6aa5cSAndroid Build Coastguard Workeras discussed next, or you may use it to compress another image. In that case 458*dfc6aa5cSAndroid Build Coastguard Workerreturn to step 2, 3, or 4 as appropriate. If you do not change the 459*dfc6aa5cSAndroid Build Coastguard Workerdestination manager, the new datastream will be written to the same target. 460*dfc6aa5cSAndroid Build Coastguard WorkerIf you do not change any JPEG parameters, the new datastream will be written 461*dfc6aa5cSAndroid Build Coastguard Workerwith the same parameters as before. Note that you can change the input image 462*dfc6aa5cSAndroid Build Coastguard Workerdimensions freely between cycles, but if you change the input colorspace, you 463*dfc6aa5cSAndroid Build Coastguard Workershould call jpeg_set_defaults() to adjust for the new colorspace; and then 464*dfc6aa5cSAndroid Build Coastguard Workeryou'll need to repeat all of step 3. 465*dfc6aa5cSAndroid Build Coastguard Worker 466*dfc6aa5cSAndroid Build Coastguard Worker 467*dfc6aa5cSAndroid Build Coastguard Worker7. Release the JPEG compression object. 468*dfc6aa5cSAndroid Build Coastguard Worker 469*dfc6aa5cSAndroid Build Coastguard WorkerWhen you are done with a JPEG compression object, destroy it by calling 470*dfc6aa5cSAndroid Build Coastguard Workerjpeg_destroy_compress(). This will free all subsidiary memory (regardless of 471*dfc6aa5cSAndroid Build Coastguard Workerthe previous state of the object). Or you can call jpeg_destroy(), which 472*dfc6aa5cSAndroid Build Coastguard Workerworks for either compression or decompression objects --- this may be more 473*dfc6aa5cSAndroid Build Coastguard Workerconvenient if you are sharing code between compression and decompression 474*dfc6aa5cSAndroid Build Coastguard Workercases. (Actually, these routines are equivalent except for the declared type 475*dfc6aa5cSAndroid Build Coastguard Workerof the passed pointer. To avoid gripes from ANSI C compilers, jpeg_destroy() 476*dfc6aa5cSAndroid Build Coastguard Workershould be passed a j_common_ptr.) 477*dfc6aa5cSAndroid Build Coastguard Worker 478*dfc6aa5cSAndroid Build Coastguard WorkerIf you allocated the jpeg_compress_struct structure from malloc(), freeing 479*dfc6aa5cSAndroid Build Coastguard Workerit is your responsibility --- jpeg_destroy() won't. Ditto for the error 480*dfc6aa5cSAndroid Build Coastguard Workerhandler structure. 481*dfc6aa5cSAndroid Build Coastguard Worker 482*dfc6aa5cSAndroid Build Coastguard WorkerTypical code: 483*dfc6aa5cSAndroid Build Coastguard Worker 484*dfc6aa5cSAndroid Build Coastguard Worker jpeg_destroy_compress(&cinfo); 485*dfc6aa5cSAndroid Build Coastguard Worker 486*dfc6aa5cSAndroid Build Coastguard Worker 487*dfc6aa5cSAndroid Build Coastguard Worker8. Aborting. 488*dfc6aa5cSAndroid Build Coastguard Worker 489*dfc6aa5cSAndroid Build Coastguard WorkerIf you decide to abort a compression cycle before finishing, you can clean up 490*dfc6aa5cSAndroid Build Coastguard Workerin either of two ways: 491*dfc6aa5cSAndroid Build Coastguard Worker 492*dfc6aa5cSAndroid Build Coastguard Worker* If you don't need the JPEG object any more, just call 493*dfc6aa5cSAndroid Build Coastguard Worker jpeg_destroy_compress() or jpeg_destroy() to release memory. This is 494*dfc6aa5cSAndroid Build Coastguard Worker legitimate at any point after calling jpeg_create_compress() --- in fact, 495*dfc6aa5cSAndroid Build Coastguard Worker it's safe even if jpeg_create_compress() fails. 496*dfc6aa5cSAndroid Build Coastguard Worker 497*dfc6aa5cSAndroid Build Coastguard Worker* If you want to re-use the JPEG object, call jpeg_abort_compress(), or call 498*dfc6aa5cSAndroid Build Coastguard Worker jpeg_abort() which works on both compression and decompression objects. 499*dfc6aa5cSAndroid Build Coastguard Worker This will return the object to an idle state, releasing any working memory. 500*dfc6aa5cSAndroid Build Coastguard Worker jpeg_abort() is allowed at any time after successful object creation. 501*dfc6aa5cSAndroid Build Coastguard Worker 502*dfc6aa5cSAndroid Build Coastguard WorkerNote that cleaning up the data destination, if required, is your 503*dfc6aa5cSAndroid Build Coastguard Workerresponsibility; neither of these routines will call term_destination(). 504*dfc6aa5cSAndroid Build Coastguard Worker(See "Compressed data handling", below, for more about that.) 505*dfc6aa5cSAndroid Build Coastguard Worker 506*dfc6aa5cSAndroid Build Coastguard Workerjpeg_destroy() and jpeg_abort() are the only safe calls to make on a JPEG 507*dfc6aa5cSAndroid Build Coastguard Workerobject that has reported an error by calling error_exit (see "Error handling" 508*dfc6aa5cSAndroid Build Coastguard Workerfor more info). The internal state of such an object is likely to be out of 509*dfc6aa5cSAndroid Build Coastguard Workerwhack. Either of these two routines will return the object to a known state. 510*dfc6aa5cSAndroid Build Coastguard Worker 511*dfc6aa5cSAndroid Build Coastguard Worker 512*dfc6aa5cSAndroid Build Coastguard WorkerDecompression details 513*dfc6aa5cSAndroid Build Coastguard Worker--------------------- 514*dfc6aa5cSAndroid Build Coastguard Worker 515*dfc6aa5cSAndroid Build Coastguard WorkerHere we revisit the JPEG decompression outline given in the overview. 516*dfc6aa5cSAndroid Build Coastguard Worker 517*dfc6aa5cSAndroid Build Coastguard Worker1. Allocate and initialize a JPEG decompression object. 518*dfc6aa5cSAndroid Build Coastguard Worker 519*dfc6aa5cSAndroid Build Coastguard WorkerThis is just like initialization for compression, as discussed above, 520*dfc6aa5cSAndroid Build Coastguard Workerexcept that the object is a "struct jpeg_decompress_struct" and you 521*dfc6aa5cSAndroid Build Coastguard Workercall jpeg_create_decompress(). Error handling is exactly the same. 522*dfc6aa5cSAndroid Build Coastguard Worker 523*dfc6aa5cSAndroid Build Coastguard WorkerTypical code: 524*dfc6aa5cSAndroid Build Coastguard Worker 525*dfc6aa5cSAndroid Build Coastguard Worker struct jpeg_decompress_struct cinfo; 526*dfc6aa5cSAndroid Build Coastguard Worker struct jpeg_error_mgr jerr; 527*dfc6aa5cSAndroid Build Coastguard Worker ... 528*dfc6aa5cSAndroid Build Coastguard Worker cinfo.err = jpeg_std_error(&jerr); 529*dfc6aa5cSAndroid Build Coastguard Worker jpeg_create_decompress(&cinfo); 530*dfc6aa5cSAndroid Build Coastguard Worker 531*dfc6aa5cSAndroid Build Coastguard Worker(Both here and in the IJG code, we usually use variable name "cinfo" for 532*dfc6aa5cSAndroid Build Coastguard Workerboth compression and decompression objects.) 533*dfc6aa5cSAndroid Build Coastguard Worker 534*dfc6aa5cSAndroid Build Coastguard Worker 535*dfc6aa5cSAndroid Build Coastguard Worker2. Specify the source of the compressed data (eg, a file). 536*dfc6aa5cSAndroid Build Coastguard Worker 537*dfc6aa5cSAndroid Build Coastguard WorkerAs previously mentioned, the JPEG library reads compressed data from a "data 538*dfc6aa5cSAndroid Build Coastguard Workersource" module. The library includes one data source module which knows how 539*dfc6aa5cSAndroid Build Coastguard Workerto read from a stdio stream. You can use your own source module if you want 540*dfc6aa5cSAndroid Build Coastguard Workerto do something else, as discussed later. 541*dfc6aa5cSAndroid Build Coastguard Worker 542*dfc6aa5cSAndroid Build Coastguard WorkerIf you use the standard source module, you must open the source stdio stream 543*dfc6aa5cSAndroid Build Coastguard Workerbeforehand. Typical code for this step looks like: 544*dfc6aa5cSAndroid Build Coastguard Worker 545*dfc6aa5cSAndroid Build Coastguard Worker FILE *infile; 546*dfc6aa5cSAndroid Build Coastguard Worker ... 547*dfc6aa5cSAndroid Build Coastguard Worker if ((infile = fopen(filename, "rb")) == NULL) { 548*dfc6aa5cSAndroid Build Coastguard Worker fprintf(stderr, "can't open %s\n", filename); 549*dfc6aa5cSAndroid Build Coastguard Worker exit(1); 550*dfc6aa5cSAndroid Build Coastguard Worker } 551*dfc6aa5cSAndroid Build Coastguard Worker jpeg_stdio_src(&cinfo, infile); 552*dfc6aa5cSAndroid Build Coastguard Worker 553*dfc6aa5cSAndroid Build Coastguard Workerwhere the last line invokes the standard source module. 554*dfc6aa5cSAndroid Build Coastguard Worker 555*dfc6aa5cSAndroid Build Coastguard WorkerWARNING: it is critical that the binary compressed data be read unchanged. 556*dfc6aa5cSAndroid Build Coastguard WorkerOn non-Unix systems the stdio library may perform newline translation or 557*dfc6aa5cSAndroid Build Coastguard Workerotherwise corrupt binary data. To suppress this behavior, you may need to use 558*dfc6aa5cSAndroid Build Coastguard Workera "b" option to fopen (as shown above), or use setmode() or another routine to 559*dfc6aa5cSAndroid Build Coastguard Workerput the stdio stream in binary mode. See cjpeg.c and djpeg.c for code that 560*dfc6aa5cSAndroid Build Coastguard Workerhas been found to work on many systems. 561*dfc6aa5cSAndroid Build Coastguard Worker 562*dfc6aa5cSAndroid Build Coastguard WorkerYou may not change the data source between calling jpeg_read_header() and 563*dfc6aa5cSAndroid Build Coastguard Workerjpeg_finish_decompress(). If you wish to read a series of JPEG images from 564*dfc6aa5cSAndroid Build Coastguard Workera single source file, you should repeat the jpeg_read_header() to 565*dfc6aa5cSAndroid Build Coastguard Workerjpeg_finish_decompress() sequence without reinitializing either the JPEG 566*dfc6aa5cSAndroid Build Coastguard Workerobject or the data source module; this prevents buffered input data from 567*dfc6aa5cSAndroid Build Coastguard Workerbeing discarded. 568*dfc6aa5cSAndroid Build Coastguard Worker 569*dfc6aa5cSAndroid Build Coastguard Worker 570*dfc6aa5cSAndroid Build Coastguard Worker3. Call jpeg_read_header() to obtain image info. 571*dfc6aa5cSAndroid Build Coastguard Worker 572*dfc6aa5cSAndroid Build Coastguard WorkerTypical code for this step is just 573*dfc6aa5cSAndroid Build Coastguard Worker 574*dfc6aa5cSAndroid Build Coastguard Worker jpeg_read_header(&cinfo, TRUE); 575*dfc6aa5cSAndroid Build Coastguard Worker 576*dfc6aa5cSAndroid Build Coastguard WorkerThis will read the source datastream header markers, up to the beginning 577*dfc6aa5cSAndroid Build Coastguard Workerof the compressed data proper. On return, the image dimensions and other 578*dfc6aa5cSAndroid Build Coastguard Workerinfo have been stored in the JPEG object. The application may wish to 579*dfc6aa5cSAndroid Build Coastguard Workerconsult this information before selecting decompression parameters. 580*dfc6aa5cSAndroid Build Coastguard Worker 581*dfc6aa5cSAndroid Build Coastguard WorkerMore complex code is necessary if 582*dfc6aa5cSAndroid Build Coastguard Worker * A suspending data source is used --- in that case jpeg_read_header() 583*dfc6aa5cSAndroid Build Coastguard Worker may return before it has read all the header data. See "I/O suspension", 584*dfc6aa5cSAndroid Build Coastguard Worker below. The normal stdio source manager will NOT cause this to happen. 585*dfc6aa5cSAndroid Build Coastguard Worker * Abbreviated JPEG files are to be processed --- see the section on 586*dfc6aa5cSAndroid Build Coastguard Worker abbreviated datastreams. Standard applications that deal only in 587*dfc6aa5cSAndroid Build Coastguard Worker interchange JPEG files need not be concerned with this case either. 588*dfc6aa5cSAndroid Build Coastguard Worker 589*dfc6aa5cSAndroid Build Coastguard WorkerIt is permissible to stop at this point if you just wanted to find out the 590*dfc6aa5cSAndroid Build Coastguard Workerimage dimensions and other header info for a JPEG file. In that case, 591*dfc6aa5cSAndroid Build Coastguard Workercall jpeg_destroy() when you are done with the JPEG object, or call 592*dfc6aa5cSAndroid Build Coastguard Workerjpeg_abort() to return it to an idle state before selecting a new data 593*dfc6aa5cSAndroid Build Coastguard Workersource and reading another header. 594*dfc6aa5cSAndroid Build Coastguard Worker 595*dfc6aa5cSAndroid Build Coastguard Worker 596*dfc6aa5cSAndroid Build Coastguard Worker4. Set parameters for decompression. 597*dfc6aa5cSAndroid Build Coastguard Worker 598*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_header() sets appropriate default decompression parameters based on 599*dfc6aa5cSAndroid Build Coastguard Workerthe properties of the image (in particular, its colorspace). However, you 600*dfc6aa5cSAndroid Build Coastguard Workermay well want to alter these defaults before beginning the decompression. 601*dfc6aa5cSAndroid Build Coastguard WorkerFor example, the default is to produce full color output from a color file. 602*dfc6aa5cSAndroid Build Coastguard WorkerIf you want colormapped output you must ask for it. Other options allow the 603*dfc6aa5cSAndroid Build Coastguard Workerreturned image to be scaled and allow various speed/quality tradeoffs to be 604*dfc6aa5cSAndroid Build Coastguard Workerselected. "Decompression parameter selection", below, gives details. 605*dfc6aa5cSAndroid Build Coastguard Worker 606*dfc6aa5cSAndroid Build Coastguard WorkerIf the defaults are appropriate, nothing need be done at this step. 607*dfc6aa5cSAndroid Build Coastguard Worker 608*dfc6aa5cSAndroid Build Coastguard WorkerNote that all default values are set by each call to jpeg_read_header(). 609*dfc6aa5cSAndroid Build Coastguard WorkerIf you reuse a decompression object, you cannot expect your parameter 610*dfc6aa5cSAndroid Build Coastguard Workersettings to be preserved across cycles, as you can for compression. 611*dfc6aa5cSAndroid Build Coastguard WorkerYou must set desired parameter values each time. 612*dfc6aa5cSAndroid Build Coastguard Worker 613*dfc6aa5cSAndroid Build Coastguard Worker 614*dfc6aa5cSAndroid Build Coastguard Worker5. jpeg_start_decompress(...); 615*dfc6aa5cSAndroid Build Coastguard Worker 616*dfc6aa5cSAndroid Build Coastguard WorkerOnce the parameter values are satisfactory, call jpeg_start_decompress() to 617*dfc6aa5cSAndroid Build Coastguard Workerbegin decompression. This will initialize internal state, allocate working 618*dfc6aa5cSAndroid Build Coastguard Workermemory, and prepare for returning data. 619*dfc6aa5cSAndroid Build Coastguard Worker 620*dfc6aa5cSAndroid Build Coastguard WorkerTypical code is just 621*dfc6aa5cSAndroid Build Coastguard Worker 622*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_decompress(&cinfo); 623*dfc6aa5cSAndroid Build Coastguard Worker 624*dfc6aa5cSAndroid Build Coastguard WorkerIf you have requested a multi-pass operating mode, such as 2-pass color 625*dfc6aa5cSAndroid Build Coastguard Workerquantization, jpeg_start_decompress() will do everything needed before data 626*dfc6aa5cSAndroid Build Coastguard Workeroutput can begin. In this case jpeg_start_decompress() may take quite a while 627*dfc6aa5cSAndroid Build Coastguard Workerto complete. With a single-scan (non progressive) JPEG file and default 628*dfc6aa5cSAndroid Build Coastguard Workerdecompression parameters, this will not happen; jpeg_start_decompress() will 629*dfc6aa5cSAndroid Build Coastguard Workerreturn quickly. 630*dfc6aa5cSAndroid Build Coastguard Worker 631*dfc6aa5cSAndroid Build Coastguard WorkerAfter this call, the final output image dimensions, including any requested 632*dfc6aa5cSAndroid Build Coastguard Workerscaling, are available in the JPEG object; so is the selected colormap, if 633*dfc6aa5cSAndroid Build Coastguard Workercolormapped output has been requested. Useful fields include 634*dfc6aa5cSAndroid Build Coastguard Worker 635*dfc6aa5cSAndroid Build Coastguard Worker output_width image width and height, as scaled 636*dfc6aa5cSAndroid Build Coastguard Worker output_height 637*dfc6aa5cSAndroid Build Coastguard Worker out_color_components # of color components in out_color_space 638*dfc6aa5cSAndroid Build Coastguard Worker output_components # of color components returned per pixel 639*dfc6aa5cSAndroid Build Coastguard Worker colormap the selected colormap, if any 640*dfc6aa5cSAndroid Build Coastguard Worker actual_number_of_colors number of entries in colormap 641*dfc6aa5cSAndroid Build Coastguard Worker 642*dfc6aa5cSAndroid Build Coastguard Workeroutput_components is 1 (a colormap index) when quantizing colors; otherwise it 643*dfc6aa5cSAndroid Build Coastguard Workerequals out_color_components. It is the number of JSAMPLE values that will be 644*dfc6aa5cSAndroid Build Coastguard Workeremitted per pixel in the output arrays. 645*dfc6aa5cSAndroid Build Coastguard Worker 646*dfc6aa5cSAndroid Build Coastguard WorkerTypically you will need to allocate data buffers to hold the incoming image. 647*dfc6aa5cSAndroid Build Coastguard WorkerYou will need output_width * output_components JSAMPLEs per scanline in your 648*dfc6aa5cSAndroid Build Coastguard Workeroutput buffer, and a total of output_height scanlines will be returned. 649*dfc6aa5cSAndroid Build Coastguard Worker 650*dfc6aa5cSAndroid Build Coastguard WorkerNote: if you are using the JPEG library's internal memory manager to allocate 651*dfc6aa5cSAndroid Build Coastguard Workerdata buffers (as djpeg does), then the manager's protocol requires that you 652*dfc6aa5cSAndroid Build Coastguard Workerrequest large buffers *before* calling jpeg_start_decompress(). This is a 653*dfc6aa5cSAndroid Build Coastguard Workerlittle tricky since the output_XXX fields are not normally valid then. You 654*dfc6aa5cSAndroid Build Coastguard Workercan make them valid by calling jpeg_calc_output_dimensions() after setting the 655*dfc6aa5cSAndroid Build Coastguard Workerrelevant parameters (scaling, output color space, and quantization flag). 656*dfc6aa5cSAndroid Build Coastguard Worker 657*dfc6aa5cSAndroid Build Coastguard Worker 658*dfc6aa5cSAndroid Build Coastguard Worker6. while (scan lines remain to be read) 659*dfc6aa5cSAndroid Build Coastguard Worker jpeg_read_scanlines(...); 660*dfc6aa5cSAndroid Build Coastguard Worker 661*dfc6aa5cSAndroid Build Coastguard WorkerNow you can read the decompressed image data by calling jpeg_read_scanlines() 662*dfc6aa5cSAndroid Build Coastguard Workerone or more times. At each call, you pass in the maximum number of scanlines 663*dfc6aa5cSAndroid Build Coastguard Workerto be read (ie, the height of your working buffer); jpeg_read_scanlines() 664*dfc6aa5cSAndroid Build Coastguard Workerwill return up to that many lines. The return value is the number of lines 665*dfc6aa5cSAndroid Build Coastguard Workeractually read. The format of the returned data is discussed under "Data 666*dfc6aa5cSAndroid Build Coastguard Workerformats", above. Don't forget that grayscale and color JPEGs will return 667*dfc6aa5cSAndroid Build Coastguard Workerdifferent data formats! 668*dfc6aa5cSAndroid Build Coastguard Worker 669*dfc6aa5cSAndroid Build Coastguard WorkerImage data is returned in top-to-bottom scanline order. If you must write 670*dfc6aa5cSAndroid Build Coastguard Workerout the image in bottom-to-top order, you can use the JPEG library's virtual 671*dfc6aa5cSAndroid Build Coastguard Workerarray mechanism to invert the data efficiently. Examples of this can be 672*dfc6aa5cSAndroid Build Coastguard Workerfound in the sample application djpeg. 673*dfc6aa5cSAndroid Build Coastguard Worker 674*dfc6aa5cSAndroid Build Coastguard WorkerThe library maintains a count of the number of scanlines returned so far 675*dfc6aa5cSAndroid Build Coastguard Workerin the output_scanline field of the JPEG object. Usually you can just use 676*dfc6aa5cSAndroid Build Coastguard Workerthis variable as the loop counter, so that the loop test looks like 677*dfc6aa5cSAndroid Build Coastguard Worker"while (cinfo.output_scanline < cinfo.output_height)". (Note that the test 678*dfc6aa5cSAndroid Build Coastguard Workershould NOT be against image_height, unless you never use scaling. The 679*dfc6aa5cSAndroid Build Coastguard Workerimage_height field is the height of the original unscaled image.) 680*dfc6aa5cSAndroid Build Coastguard WorkerThe return value always equals the change in the value of output_scanline. 681*dfc6aa5cSAndroid Build Coastguard Worker 682*dfc6aa5cSAndroid Build Coastguard WorkerIf you don't use a suspending data source, it is safe to assume that 683*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_scanlines() reads at least one scanline per call, until the 684*dfc6aa5cSAndroid Build Coastguard Workerbottom of the image has been reached. 685*dfc6aa5cSAndroid Build Coastguard Worker 686*dfc6aa5cSAndroid Build Coastguard WorkerIf you use a buffer larger than one scanline, it is NOT safe to assume that 687*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_scanlines() fills it. (The current implementation returns only a 688*dfc6aa5cSAndroid Build Coastguard Workerfew scanlines per call, no matter how large a buffer you pass.) So you must 689*dfc6aa5cSAndroid Build Coastguard Workeralways provide a loop that calls jpeg_read_scanlines() repeatedly until the 690*dfc6aa5cSAndroid Build Coastguard Workerwhole image has been read. 691*dfc6aa5cSAndroid Build Coastguard Worker 692*dfc6aa5cSAndroid Build Coastguard Worker 693*dfc6aa5cSAndroid Build Coastguard Worker7. jpeg_finish_decompress(...); 694*dfc6aa5cSAndroid Build Coastguard Worker 695*dfc6aa5cSAndroid Build Coastguard WorkerAfter all the image data has been read, call jpeg_finish_decompress() to 696*dfc6aa5cSAndroid Build Coastguard Workercomplete the decompression cycle. This causes working memory associated 697*dfc6aa5cSAndroid Build Coastguard Workerwith the JPEG object to be released. 698*dfc6aa5cSAndroid Build Coastguard Worker 699*dfc6aa5cSAndroid Build Coastguard WorkerTypical code: 700*dfc6aa5cSAndroid Build Coastguard Worker 701*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_decompress(&cinfo); 702*dfc6aa5cSAndroid Build Coastguard Worker 703*dfc6aa5cSAndroid Build Coastguard WorkerIf using the stdio source manager, don't forget to close the source stdio 704*dfc6aa5cSAndroid Build Coastguard Workerstream if necessary. 705*dfc6aa5cSAndroid Build Coastguard Worker 706*dfc6aa5cSAndroid Build Coastguard WorkerIt is an error to call jpeg_finish_decompress() before reading the correct 707*dfc6aa5cSAndroid Build Coastguard Workertotal number of scanlines. If you wish to abort decompression, call 708*dfc6aa5cSAndroid Build Coastguard Workerjpeg_abort() as discussed below. 709*dfc6aa5cSAndroid Build Coastguard Worker 710*dfc6aa5cSAndroid Build Coastguard WorkerAfter completing a decompression cycle, you may dispose of the JPEG object as 711*dfc6aa5cSAndroid Build Coastguard Workerdiscussed next, or you may use it to decompress another image. In that case 712*dfc6aa5cSAndroid Build Coastguard Workerreturn to step 2 or 3 as appropriate. If you do not change the source 713*dfc6aa5cSAndroid Build Coastguard Workermanager, the next image will be read from the same source. 714*dfc6aa5cSAndroid Build Coastguard Worker 715*dfc6aa5cSAndroid Build Coastguard Worker 716*dfc6aa5cSAndroid Build Coastguard Worker8. Release the JPEG decompression object. 717*dfc6aa5cSAndroid Build Coastguard Worker 718*dfc6aa5cSAndroid Build Coastguard WorkerWhen you are done with a JPEG decompression object, destroy it by calling 719*dfc6aa5cSAndroid Build Coastguard Workerjpeg_destroy_decompress() or jpeg_destroy(). The previous discussion of 720*dfc6aa5cSAndroid Build Coastguard Workerdestroying compression objects applies here too. 721*dfc6aa5cSAndroid Build Coastguard Worker 722*dfc6aa5cSAndroid Build Coastguard WorkerTypical code: 723*dfc6aa5cSAndroid Build Coastguard Worker 724*dfc6aa5cSAndroid Build Coastguard Worker jpeg_destroy_decompress(&cinfo); 725*dfc6aa5cSAndroid Build Coastguard Worker 726*dfc6aa5cSAndroid Build Coastguard Worker 727*dfc6aa5cSAndroid Build Coastguard Worker9. Aborting. 728*dfc6aa5cSAndroid Build Coastguard Worker 729*dfc6aa5cSAndroid Build Coastguard WorkerYou can abort a decompression cycle by calling jpeg_destroy_decompress() or 730*dfc6aa5cSAndroid Build Coastguard Workerjpeg_destroy() if you don't need the JPEG object any more, or 731*dfc6aa5cSAndroid Build Coastguard Workerjpeg_abort_decompress() or jpeg_abort() if you want to reuse the object. 732*dfc6aa5cSAndroid Build Coastguard WorkerThe previous discussion of aborting compression cycles applies here too. 733*dfc6aa5cSAndroid Build Coastguard Worker 734*dfc6aa5cSAndroid Build Coastguard Worker 735*dfc6aa5cSAndroid Build Coastguard WorkerPartial image decompression 736*dfc6aa5cSAndroid Build Coastguard Worker--------------------------- 737*dfc6aa5cSAndroid Build Coastguard Worker 738*dfc6aa5cSAndroid Build Coastguard WorkerPartial image decompression is convenient for performance-critical applications 739*dfc6aa5cSAndroid Build Coastguard Workerthat wish to view only a portion of a large JPEG image without decompressing 740*dfc6aa5cSAndroid Build Coastguard Workerthe whole thing. It it also useful in memory-constrained environments (such as 741*dfc6aa5cSAndroid Build Coastguard Workeron mobile devices.) This library provides the following functions to support 742*dfc6aa5cSAndroid Build Coastguard Workerpartial image decompression: 743*dfc6aa5cSAndroid Build Coastguard Worker 744*dfc6aa5cSAndroid Build Coastguard Worker1. Skipping rows when decompressing 745*dfc6aa5cSAndroid Build Coastguard Worker 746*dfc6aa5cSAndroid Build Coastguard Worker jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines); 747*dfc6aa5cSAndroid Build Coastguard Worker 748*dfc6aa5cSAndroid Build Coastguard WorkerThis function provides application programmers with the ability to skip over 749*dfc6aa5cSAndroid Build Coastguard Workermultiple rows in the JPEG image. 750*dfc6aa5cSAndroid Build Coastguard Worker 751*dfc6aa5cSAndroid Build Coastguard WorkerSuspending data sources are not supported by this function. Calling 752*dfc6aa5cSAndroid Build Coastguard Workerjpeg_skip_scanlines() with a suspending data source will result in undefined 753*dfc6aa5cSAndroid Build Coastguard Workerbehavior. Two-pass color quantization is also not supported by this function. 754*dfc6aa5cSAndroid Build Coastguard WorkerCalling jpeg_skip_scanlines() with two-pass color quantization enabled will 755*dfc6aa5cSAndroid Build Coastguard Workerresult in an error. 756*dfc6aa5cSAndroid Build Coastguard Worker 757*dfc6aa5cSAndroid Build Coastguard Workerjpeg_skip_scanlines() will not allow skipping past the bottom of the image. If 758*dfc6aa5cSAndroid Build Coastguard Workerthe value of num_lines is large enough to skip past the bottom of the image, 759*dfc6aa5cSAndroid Build Coastguard Workerthen the function will skip to the end of the image instead. 760*dfc6aa5cSAndroid Build Coastguard Worker 761*dfc6aa5cSAndroid Build Coastguard WorkerIf the value of num_lines is valid, then jpeg_skip_scanlines() will always 762*dfc6aa5cSAndroid Build Coastguard Workerskip all of the input rows requested. There is no need to inspect the return 763*dfc6aa5cSAndroid Build Coastguard Workervalue of the function in that case. 764*dfc6aa5cSAndroid Build Coastguard Worker 765*dfc6aa5cSAndroid Build Coastguard WorkerBest results will be achieved by calling jpeg_skip_scanlines() for large chunks 766*dfc6aa5cSAndroid Build Coastguard Workerof rows. The function should be viewed as a way to quickly jump to a 767*dfc6aa5cSAndroid Build Coastguard Workerparticular vertical offset in the JPEG image in order to decode a subset of the 768*dfc6aa5cSAndroid Build Coastguard Workerimage. Used in this manner, it will provide significant performance 769*dfc6aa5cSAndroid Build Coastguard Workerimprovements. 770*dfc6aa5cSAndroid Build Coastguard Worker 771*dfc6aa5cSAndroid Build Coastguard WorkerCalling jpeg_skip_scanlines() for small values of num_lines has several 772*dfc6aa5cSAndroid Build Coastguard Workerpotential drawbacks: 773*dfc6aa5cSAndroid Build Coastguard Worker 1) JPEG decompression occurs in blocks, so if jpeg_skip_scanlines() is 774*dfc6aa5cSAndroid Build Coastguard Worker called from the middle of a decompression block, then it is likely that 775*dfc6aa5cSAndroid Build Coastguard Worker much of the decompression work has already been done for the first 776*dfc6aa5cSAndroid Build Coastguard Worker couple of rows that need to be skipped. 777*dfc6aa5cSAndroid Build Coastguard Worker 2) When this function returns, it must leave the decompressor in a state 778*dfc6aa5cSAndroid Build Coastguard Worker such that it is ready to read the next line. This may involve 779*dfc6aa5cSAndroid Build Coastguard Worker decompressing a block that must be partially skipped. 780*dfc6aa5cSAndroid Build Coastguard WorkerThese issues are especially tricky for cases in which upsampling requires 781*dfc6aa5cSAndroid Build Coastguard Workercontext rows. In the worst case, jpeg_skip_scanlines() will perform similarly 782*dfc6aa5cSAndroid Build Coastguard Workerto jpeg_read_scanlines() (since it will actually call jpeg_read_scanlines().) 783*dfc6aa5cSAndroid Build Coastguard Worker 784*dfc6aa5cSAndroid Build Coastguard Worker2. Decompressing partial scanlines 785*dfc6aa5cSAndroid Build Coastguard Worker 786*dfc6aa5cSAndroid Build Coastguard Worker jpeg_crop_scanline (j_decompress_ptr cinfo, JDIMENSION *xoffset, 787*dfc6aa5cSAndroid Build Coastguard Worker JDIMENSION *width) 788*dfc6aa5cSAndroid Build Coastguard Worker 789*dfc6aa5cSAndroid Build Coastguard WorkerThis function provides application programmers with the ability to decompress 790*dfc6aa5cSAndroid Build Coastguard Workeronly a portion of each row in the JPEG image. It must be called after 791*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_decompress() and before any calls to jpeg_read_scanlines() or 792*dfc6aa5cSAndroid Build Coastguard Workerjpeg_skip_scanlines(). 793*dfc6aa5cSAndroid Build Coastguard Worker 794*dfc6aa5cSAndroid Build Coastguard WorkerIf xoffset and width do not form a valid subset of the image row, then this 795*dfc6aa5cSAndroid Build Coastguard Workerfunction will generate an error. Note that if the output image is scaled, then 796*dfc6aa5cSAndroid Build Coastguard Workerxoffset and width are relative to the scaled image dimensions. 797*dfc6aa5cSAndroid Build Coastguard Worker 798*dfc6aa5cSAndroid Build Coastguard Workerxoffset and width are passed by reference because xoffset must fall on an iMCU 799*dfc6aa5cSAndroid Build Coastguard Workerboundary. If it doesn't, then it will be moved left to the nearest iMCU 800*dfc6aa5cSAndroid Build Coastguard Workerboundary, and width will be increased accordingly. If the calling program does 801*dfc6aa5cSAndroid Build Coastguard Workernot like the adjusted values of xoffset and width, then it can call 802*dfc6aa5cSAndroid Build Coastguard Workerjpeg_crop_scanline() again with new values (for instance, if it wants to move 803*dfc6aa5cSAndroid Build Coastguard Workerxoffset to the nearest iMCU boundary to the right instead of to the left.) 804*dfc6aa5cSAndroid Build Coastguard Worker 805*dfc6aa5cSAndroid Build Coastguard WorkerAfter calling this function, cinfo->output_width will be set to the adjusted 806*dfc6aa5cSAndroid Build Coastguard Workerwidth. This value should be used when allocating an output buffer to pass to 807*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_scanlines(). 808*dfc6aa5cSAndroid Build Coastguard Worker 809*dfc6aa5cSAndroid Build Coastguard WorkerThe output image from a partial-width decompression will be identical to the 810*dfc6aa5cSAndroid Build Coastguard Workercorresponding image region from a full decode, with one exception: The "fancy" 811*dfc6aa5cSAndroid Build Coastguard Worker(smooth) h2v2 (4:2:0) and h2v1 (4:2:2) upsampling algorithms fill in the 812*dfc6aa5cSAndroid Build Coastguard Workermissing chroma components by averaging the chroma components from neighboring 813*dfc6aa5cSAndroid Build Coastguard Workerpixels, except on the right and left edges of the image (where there are no 814*dfc6aa5cSAndroid Build Coastguard Workerneighboring pixels.) When performing a partial-width decompression, these 815*dfc6aa5cSAndroid Build Coastguard Worker"fancy" upsampling algorithms may treat the left and right edges of the partial 816*dfc6aa5cSAndroid Build Coastguard Workerimage region as if they are the left and right edges of the image, meaning that 817*dfc6aa5cSAndroid Build Coastguard Workerthe upsampling algorithm may be simplified. The result is that the pixels on 818*dfc6aa5cSAndroid Build Coastguard Workerthe left or right edge of the partial image may not be exactly identical to the 819*dfc6aa5cSAndroid Build Coastguard Workercorresponding pixels in the original image. 820*dfc6aa5cSAndroid Build Coastguard Worker 821*dfc6aa5cSAndroid Build Coastguard Worker 822*dfc6aa5cSAndroid Build Coastguard WorkerMechanics of usage: include files, linking, etc 823*dfc6aa5cSAndroid Build Coastguard Worker----------------------------------------------- 824*dfc6aa5cSAndroid Build Coastguard Worker 825*dfc6aa5cSAndroid Build Coastguard WorkerApplications using the JPEG library should include the header file jpeglib.h 826*dfc6aa5cSAndroid Build Coastguard Workerto obtain declarations of data types and routines. Before including 827*dfc6aa5cSAndroid Build Coastguard Workerjpeglib.h, include system headers that define at least the typedefs FILE and 828*dfc6aa5cSAndroid Build Coastguard Workersize_t. On ANSI-conforming systems, including <stdio.h> is sufficient; on 829*dfc6aa5cSAndroid Build Coastguard Workerolder Unix systems, you may need <sys/types.h> to define size_t. 830*dfc6aa5cSAndroid Build Coastguard Worker 831*dfc6aa5cSAndroid Build Coastguard WorkerIf the application needs to refer to individual JPEG library error codes, also 832*dfc6aa5cSAndroid Build Coastguard Workerinclude jerror.h to define those symbols. 833*dfc6aa5cSAndroid Build Coastguard Worker 834*dfc6aa5cSAndroid Build Coastguard Workerjpeglib.h indirectly includes the files jconfig.h and jmorecfg.h. If you are 835*dfc6aa5cSAndroid Build Coastguard Workerinstalling the JPEG header files in a system directory, you will want to 836*dfc6aa5cSAndroid Build Coastguard Workerinstall all four files: jpeglib.h, jerror.h, jconfig.h, jmorecfg.h. 837*dfc6aa5cSAndroid Build Coastguard Worker 838*dfc6aa5cSAndroid Build Coastguard WorkerThe most convenient way to include the JPEG code into your executable program 839*dfc6aa5cSAndroid Build Coastguard Workeris to prepare a library file ("libjpeg.a", or a corresponding name on non-Unix 840*dfc6aa5cSAndroid Build Coastguard Workermachines) and reference it at your link step. If you use only half of the 841*dfc6aa5cSAndroid Build Coastguard Workerlibrary (only compression or only decompression), only that much code will be 842*dfc6aa5cSAndroid Build Coastguard Workerincluded from the library, unless your linker is hopelessly brain-damaged. 843*dfc6aa5cSAndroid Build Coastguard WorkerThe supplied build system builds libjpeg.a automatically. 844*dfc6aa5cSAndroid Build Coastguard Worker 845*dfc6aa5cSAndroid Build Coastguard WorkerIt may be worth pointing out that the core JPEG library does not actually 846*dfc6aa5cSAndroid Build Coastguard Workerrequire the stdio library: only the default source/destination managers and 847*dfc6aa5cSAndroid Build Coastguard Workererror handler need it. You can use the library in a stdio-less environment 848*dfc6aa5cSAndroid Build Coastguard Workerif you replace those modules and use jmemnobs.c (or another memory manager of 849*dfc6aa5cSAndroid Build Coastguard Workeryour own devising). More info about the minimum system library requirements 850*dfc6aa5cSAndroid Build Coastguard Workermay be found in jinclude.h. 851*dfc6aa5cSAndroid Build Coastguard Worker 852*dfc6aa5cSAndroid Build Coastguard Worker 853*dfc6aa5cSAndroid Build Coastguard WorkerADVANCED FEATURES 854*dfc6aa5cSAndroid Build Coastguard Worker================= 855*dfc6aa5cSAndroid Build Coastguard Worker 856*dfc6aa5cSAndroid Build Coastguard WorkerCompression parameter selection 857*dfc6aa5cSAndroid Build Coastguard Worker------------------------------- 858*dfc6aa5cSAndroid Build Coastguard Worker 859*dfc6aa5cSAndroid Build Coastguard WorkerThis section describes all the optional parameters you can set for JPEG 860*dfc6aa5cSAndroid Build Coastguard Workercompression, as well as the "helper" routines provided to assist in this 861*dfc6aa5cSAndroid Build Coastguard Workertask. Proper setting of some parameters requires detailed understanding 862*dfc6aa5cSAndroid Build Coastguard Workerof the JPEG standard; if you don't know what a parameter is for, it's best 863*dfc6aa5cSAndroid Build Coastguard Workernot to mess with it! See REFERENCES in the README.ijg file for pointers to 864*dfc6aa5cSAndroid Build Coastguard Workermore info about JPEG. 865*dfc6aa5cSAndroid Build Coastguard Worker 866*dfc6aa5cSAndroid Build Coastguard WorkerIt's a good idea to call jpeg_set_defaults() first, even if you plan to set 867*dfc6aa5cSAndroid Build Coastguard Workerall the parameters; that way your code is more likely to work with future JPEG 868*dfc6aa5cSAndroid Build Coastguard Workerlibraries that have additional parameters. For the same reason, we recommend 869*dfc6aa5cSAndroid Build Coastguard Workeryou use a helper routine where one is provided, in preference to twiddling 870*dfc6aa5cSAndroid Build Coastguard Workercinfo fields directly. 871*dfc6aa5cSAndroid Build Coastguard Worker 872*dfc6aa5cSAndroid Build Coastguard WorkerThe helper routines are: 873*dfc6aa5cSAndroid Build Coastguard Worker 874*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_defaults (j_compress_ptr cinfo) 875*dfc6aa5cSAndroid Build Coastguard Worker This routine sets all JPEG parameters to reasonable defaults, using 876*dfc6aa5cSAndroid Build Coastguard Worker only the input image's color space (field in_color_space, which must 877*dfc6aa5cSAndroid Build Coastguard Worker already be set in cinfo). Many applications will only need to use 878*dfc6aa5cSAndroid Build Coastguard Worker this routine and perhaps jpeg_set_quality(). 879*dfc6aa5cSAndroid Build Coastguard Worker 880*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) 881*dfc6aa5cSAndroid Build Coastguard Worker Sets the JPEG file's colorspace (field jpeg_color_space) as specified, 882*dfc6aa5cSAndroid Build Coastguard Worker and sets other color-space-dependent parameters appropriately. See 883*dfc6aa5cSAndroid Build Coastguard Worker "Special color spaces", below, before using this. A large number of 884*dfc6aa5cSAndroid Build Coastguard Worker parameters, including all per-component parameters, are set by this 885*dfc6aa5cSAndroid Build Coastguard Worker routine; if you want to twiddle individual parameters you should call 886*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_colorspace() before rather than after. 887*dfc6aa5cSAndroid Build Coastguard Worker 888*dfc6aa5cSAndroid Build Coastguard Workerjpeg_default_colorspace (j_compress_ptr cinfo) 889*dfc6aa5cSAndroid Build Coastguard Worker Selects an appropriate JPEG colorspace based on cinfo->in_color_space, 890*dfc6aa5cSAndroid Build Coastguard Worker and calls jpeg_set_colorspace(). This is actually a subroutine of 891*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_defaults(). It's broken out in case you want to change 892*dfc6aa5cSAndroid Build Coastguard Worker just the colorspace-dependent JPEG parameters. 893*dfc6aa5cSAndroid Build Coastguard Worker 894*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) 895*dfc6aa5cSAndroid Build Coastguard Worker Constructs JPEG quantization tables appropriate for the indicated 896*dfc6aa5cSAndroid Build Coastguard Worker quality setting. The quality value is expressed on the 0..100 scale 897*dfc6aa5cSAndroid Build Coastguard Worker recommended by IJG (cjpeg's "-quality" switch uses this routine). 898*dfc6aa5cSAndroid Build Coastguard Worker Note that the exact mapping from quality values to tables may change 899*dfc6aa5cSAndroid Build Coastguard Worker in future IJG releases as more is learned about DCT quantization. 900*dfc6aa5cSAndroid Build Coastguard Worker If the force_baseline parameter is TRUE, then the quantization table 901*dfc6aa5cSAndroid Build Coastguard Worker entries are constrained to the range 1..255 for full JPEG baseline 902*dfc6aa5cSAndroid Build Coastguard Worker compatibility. In the current implementation, this only makes a 903*dfc6aa5cSAndroid Build Coastguard Worker difference for quality settings below 25, and it effectively prevents 904*dfc6aa5cSAndroid Build Coastguard Worker very small/low quality files from being generated. The IJG decoder 905*dfc6aa5cSAndroid Build Coastguard Worker is capable of reading the non-baseline files generated at low quality 906*dfc6aa5cSAndroid Build Coastguard Worker settings when force_baseline is FALSE, but other decoders may not be. 907*dfc6aa5cSAndroid Build Coastguard Worker 908*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, 909*dfc6aa5cSAndroid Build Coastguard Worker boolean force_baseline) 910*dfc6aa5cSAndroid Build Coastguard Worker Same as jpeg_set_quality() except that the generated tables are the 911*dfc6aa5cSAndroid Build Coastguard Worker sample tables given in Annex K (Clause K.1) of 912*dfc6aa5cSAndroid Build Coastguard Worker Rec. ITU-T T.81 (1992) | ISO/IEC 10918-1:1994, multiplied by the 913*dfc6aa5cSAndroid Build Coastguard Worker specified scale factor (which is expressed as a percentage; thus 914*dfc6aa5cSAndroid Build Coastguard Worker scale_factor = 100 reproduces the spec's tables). Note that larger 915*dfc6aa5cSAndroid Build Coastguard Worker scale factors give lower quality. This entry point is useful for 916*dfc6aa5cSAndroid Build Coastguard Worker conforming to the Adobe PostScript DCT conventions, but we do not 917*dfc6aa5cSAndroid Build Coastguard Worker recommend linear scaling as a user-visible quality scale otherwise. 918*dfc6aa5cSAndroid Build Coastguard Worker force_baseline again constrains the computed table entries to 1..255. 919*dfc6aa5cSAndroid Build Coastguard Worker 920*dfc6aa5cSAndroid Build Coastguard Workerint jpeg_quality_scaling (int quality) 921*dfc6aa5cSAndroid Build Coastguard Worker Converts a value on the IJG-recommended quality scale to a linear 922*dfc6aa5cSAndroid Build Coastguard Worker scaling percentage. Note that this routine may change or go away 923*dfc6aa5cSAndroid Build Coastguard Worker in future releases --- IJG may choose to adopt a scaling method that 924*dfc6aa5cSAndroid Build Coastguard Worker can't be expressed as a simple scalar multiplier, in which case the 925*dfc6aa5cSAndroid Build Coastguard Worker premise of this routine collapses. Caveat user. 926*dfc6aa5cSAndroid Build Coastguard Worker 927*dfc6aa5cSAndroid Build Coastguard Workerjpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) 928*dfc6aa5cSAndroid Build Coastguard Worker [libjpeg v7+ API/ABI emulation only] 929*dfc6aa5cSAndroid Build Coastguard Worker Set default quantization tables with linear q_scale_factor[] values 930*dfc6aa5cSAndroid Build Coastguard Worker (see below). 931*dfc6aa5cSAndroid Build Coastguard Worker 932*dfc6aa5cSAndroid Build Coastguard Workerjpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, 933*dfc6aa5cSAndroid Build Coastguard Worker const unsigned int *basic_table, 934*dfc6aa5cSAndroid Build Coastguard Worker int scale_factor, boolean force_baseline) 935*dfc6aa5cSAndroid Build Coastguard Worker Allows an arbitrary quantization table to be created. which_tbl 936*dfc6aa5cSAndroid Build Coastguard Worker indicates which table slot to fill. basic_table points to an array 937*dfc6aa5cSAndroid Build Coastguard Worker of 64 unsigned ints given in normal array order. These values are 938*dfc6aa5cSAndroid Build Coastguard Worker multiplied by scale_factor/100 and then clamped to the range 1..65535 939*dfc6aa5cSAndroid Build Coastguard Worker (or to 1..255 if force_baseline is TRUE). 940*dfc6aa5cSAndroid Build Coastguard Worker CAUTION: prior to library version 6a, jpeg_add_quant_table expected 941*dfc6aa5cSAndroid Build Coastguard Worker the basic table to be given in JPEG zigzag order. If you need to 942*dfc6aa5cSAndroid Build Coastguard Worker write code that works with either older or newer versions of this 943*dfc6aa5cSAndroid Build Coastguard Worker routine, you must check the library version number. Something like 944*dfc6aa5cSAndroid Build Coastguard Worker "#if JPEG_LIB_VERSION >= 61" is the right test. 945*dfc6aa5cSAndroid Build Coastguard Worker 946*dfc6aa5cSAndroid Build Coastguard Workerjpeg_simple_progression (j_compress_ptr cinfo) 947*dfc6aa5cSAndroid Build Coastguard Worker Generates a default scan script for writing a progressive-JPEG file. 948*dfc6aa5cSAndroid Build Coastguard Worker This is the recommended method of creating a progressive file, 949*dfc6aa5cSAndroid Build Coastguard Worker unless you want to make a custom scan sequence. You must ensure that 950*dfc6aa5cSAndroid Build Coastguard Worker the JPEG color space is set correctly before calling this routine. 951*dfc6aa5cSAndroid Build Coastguard Worker 952*dfc6aa5cSAndroid Build Coastguard Worker 953*dfc6aa5cSAndroid Build Coastguard WorkerCompression parameters (cinfo fields) include: 954*dfc6aa5cSAndroid Build Coastguard Worker 955*dfc6aa5cSAndroid Build Coastguard Workerboolean arith_code 956*dfc6aa5cSAndroid Build Coastguard Worker If TRUE, use arithmetic coding. 957*dfc6aa5cSAndroid Build Coastguard Worker If FALSE, use Huffman coding. 958*dfc6aa5cSAndroid Build Coastguard Worker 959*dfc6aa5cSAndroid Build Coastguard WorkerJ_DCT_METHOD dct_method 960*dfc6aa5cSAndroid Build Coastguard Worker Selects the algorithm used for the DCT step. Choices are: 961*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW: accurate integer method 962*dfc6aa5cSAndroid Build Coastguard Worker JDCT_IFAST: less accurate integer method [legacy feature] 963*dfc6aa5cSAndroid Build Coastguard Worker JDCT_FLOAT: floating-point method [legacy feature] 964*dfc6aa5cSAndroid Build Coastguard Worker JDCT_DEFAULT: default method (normally JDCT_ISLOW) 965*dfc6aa5cSAndroid Build Coastguard Worker JDCT_FASTEST: fastest method (normally JDCT_IFAST) 966*dfc6aa5cSAndroid Build Coastguard Worker When the Independent JPEG Group's software was first released in 1991, 967*dfc6aa5cSAndroid Build Coastguard Worker the compression time for a 1-megapixel JPEG image on a mainstream PC 968*dfc6aa5cSAndroid Build Coastguard Worker was measured in minutes. Thus, JDCT_IFAST provided noticeable 969*dfc6aa5cSAndroid Build Coastguard Worker performance benefits. On modern CPUs running libjpeg-turbo, however, 970*dfc6aa5cSAndroid Build Coastguard Worker the compression time for a 1-megapixel JPEG image is measured in 971*dfc6aa5cSAndroid Build Coastguard Worker milliseconds, and thus the performance benefits of JDCT_IFAST are much 972*dfc6aa5cSAndroid Build Coastguard Worker less noticeable. On modern x86/x86-64 CPUs that support AVX2 973*dfc6aa5cSAndroid Build Coastguard Worker instructions, JDCT_IFAST and JDCT_ISLOW have similar performance. On 974*dfc6aa5cSAndroid Build Coastguard Worker other types of CPUs, JDCT_IFAST is generally about 5-15% faster than 975*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW. 976*dfc6aa5cSAndroid Build Coastguard Worker 977*dfc6aa5cSAndroid Build Coastguard Worker For quality levels of 90 and below, there should be little or no 978*dfc6aa5cSAndroid Build Coastguard Worker perceptible quality difference between the two algorithms. For quality 979*dfc6aa5cSAndroid Build Coastguard Worker levels above 90, however, the difference between JDCT_IFAST and 980*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW becomes more pronounced. With quality=97, for instance, 981*dfc6aa5cSAndroid Build Coastguard Worker JDCT_IFAST incurs generally about a 1-3 dB loss in PSNR relative to 982*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW, but this can be larger for some images. Do not use 983*dfc6aa5cSAndroid Build Coastguard Worker JDCT_IFAST with quality levels above 97. The algorithm often 984*dfc6aa5cSAndroid Build Coastguard Worker degenerates at quality=98 and above and can actually produce a more 985*dfc6aa5cSAndroid Build Coastguard Worker lossy image than if lower quality levels had been used. Also, in 986*dfc6aa5cSAndroid Build Coastguard Worker libjpeg-turbo, JDCT_IFAST is not fully accelerated for quality levels 987*dfc6aa5cSAndroid Build Coastguard Worker above 97, so it will be slower than JDCT_ISLOW. 988*dfc6aa5cSAndroid Build Coastguard Worker 989*dfc6aa5cSAndroid Build Coastguard Worker JDCT_FLOAT does not produce significantly more accurate results than 990*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW, and it is much slower. JDCT_FLOAT may also give different 991*dfc6aa5cSAndroid Build Coastguard Worker results on different machines due to varying roundoff behavior, whereas 992*dfc6aa5cSAndroid Build Coastguard Worker the integer methods should give the same results on all machines. 993*dfc6aa5cSAndroid Build Coastguard Worker 994*dfc6aa5cSAndroid Build Coastguard WorkerJ_COLOR_SPACE jpeg_color_space 995*dfc6aa5cSAndroid Build Coastguard Workerint num_components 996*dfc6aa5cSAndroid Build Coastguard Worker The JPEG color space and corresponding number of components; see 997*dfc6aa5cSAndroid Build Coastguard Worker "Special color spaces", below, for more info. We recommend using 998*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_color_space() if you want to change these. 999*dfc6aa5cSAndroid Build Coastguard Worker 1000*dfc6aa5cSAndroid Build Coastguard Workerboolean optimize_coding 1001*dfc6aa5cSAndroid Build Coastguard Worker TRUE causes the compressor to compute optimal Huffman coding tables 1002*dfc6aa5cSAndroid Build Coastguard Worker for the image. This requires an extra pass over the data and 1003*dfc6aa5cSAndroid Build Coastguard Worker therefore costs a good deal of space and time. The default is 1004*dfc6aa5cSAndroid Build Coastguard Worker FALSE, which tells the compressor to use the supplied or default 1005*dfc6aa5cSAndroid Build Coastguard Worker Huffman tables. In most cases optimal tables save only a few percent 1006*dfc6aa5cSAndroid Build Coastguard Worker of file size compared to the default tables. Note that when this is 1007*dfc6aa5cSAndroid Build Coastguard Worker TRUE, you need not supply Huffman tables at all, and any you do 1008*dfc6aa5cSAndroid Build Coastguard Worker supply will be overwritten. 1009*dfc6aa5cSAndroid Build Coastguard Worker 1010*dfc6aa5cSAndroid Build Coastguard Workerunsigned int restart_interval 1011*dfc6aa5cSAndroid Build Coastguard Workerint restart_in_rows 1012*dfc6aa5cSAndroid Build Coastguard Worker To emit restart markers in the JPEG file, set one of these nonzero. 1013*dfc6aa5cSAndroid Build Coastguard Worker Set restart_interval to specify the exact interval in MCU blocks. 1014*dfc6aa5cSAndroid Build Coastguard Worker Set restart_in_rows to specify the interval in MCU rows. (If 1015*dfc6aa5cSAndroid Build Coastguard Worker restart_in_rows is not 0, then restart_interval is set after the 1016*dfc6aa5cSAndroid Build Coastguard Worker image width in MCUs is computed.) Defaults are zero (no restarts). 1017*dfc6aa5cSAndroid Build Coastguard Worker One restart marker per MCU row is often a good choice. 1018*dfc6aa5cSAndroid Build Coastguard Worker NOTE: the overhead of restart markers is higher in grayscale JPEG 1019*dfc6aa5cSAndroid Build Coastguard Worker files than in color files, and MUCH higher in progressive JPEGs. 1020*dfc6aa5cSAndroid Build Coastguard Worker If you use restarts, you may want to use larger intervals in those 1021*dfc6aa5cSAndroid Build Coastguard Worker cases. 1022*dfc6aa5cSAndroid Build Coastguard Worker 1023*dfc6aa5cSAndroid Build Coastguard Workerconst jpeg_scan_info *scan_info 1024*dfc6aa5cSAndroid Build Coastguard Workerint num_scans 1025*dfc6aa5cSAndroid Build Coastguard Worker By default, scan_info is NULL; this causes the compressor to write a 1026*dfc6aa5cSAndroid Build Coastguard Worker single-scan sequential JPEG file. If not NULL, scan_info points to 1027*dfc6aa5cSAndroid Build Coastguard Worker an array of scan definition records of length num_scans. The 1028*dfc6aa5cSAndroid Build Coastguard Worker compressor will then write a JPEG file having one scan for each scan 1029*dfc6aa5cSAndroid Build Coastguard Worker definition record. This is used to generate noninterleaved or 1030*dfc6aa5cSAndroid Build Coastguard Worker progressive JPEG files. The library checks that the scan array 1031*dfc6aa5cSAndroid Build Coastguard Worker defines a valid JPEG scan sequence. (jpeg_simple_progression creates 1032*dfc6aa5cSAndroid Build Coastguard Worker a suitable scan definition array for progressive JPEG.) This is 1033*dfc6aa5cSAndroid Build Coastguard Worker discussed further under "Progressive JPEG support". 1034*dfc6aa5cSAndroid Build Coastguard Worker 1035*dfc6aa5cSAndroid Build Coastguard Workerint smoothing_factor 1036*dfc6aa5cSAndroid Build Coastguard Worker If non-zero, the input image is smoothed; the value should be 1 for 1037*dfc6aa5cSAndroid Build Coastguard Worker minimal smoothing to 100 for maximum smoothing. Consult jcsample.c 1038*dfc6aa5cSAndroid Build Coastguard Worker for details of the smoothing algorithm. The default is zero. 1039*dfc6aa5cSAndroid Build Coastguard Worker 1040*dfc6aa5cSAndroid Build Coastguard Workerboolean write_JFIF_header 1041*dfc6aa5cSAndroid Build Coastguard Worker If TRUE, a JFIF APP0 marker is emitted. jpeg_set_defaults() and 1042*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_colorspace() set this TRUE if a JFIF-legal JPEG color space 1043*dfc6aa5cSAndroid Build Coastguard Worker (ie, YCbCr or grayscale) is selected, otherwise FALSE. 1044*dfc6aa5cSAndroid Build Coastguard Worker 1045*dfc6aa5cSAndroid Build Coastguard WorkerUINT8 JFIF_major_version 1046*dfc6aa5cSAndroid Build Coastguard WorkerUINT8 JFIF_minor_version 1047*dfc6aa5cSAndroid Build Coastguard Worker The version number to be written into the JFIF marker. 1048*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_defaults() initializes the version to 1.01 (major=minor=1). 1049*dfc6aa5cSAndroid Build Coastguard Worker You should set it to 1.02 (major=1, minor=2) if you plan to write 1050*dfc6aa5cSAndroid Build Coastguard Worker any JFIF 1.02 extension markers. 1051*dfc6aa5cSAndroid Build Coastguard Worker 1052*dfc6aa5cSAndroid Build Coastguard WorkerUINT8 density_unit 1053*dfc6aa5cSAndroid Build Coastguard WorkerUINT16 X_density 1054*dfc6aa5cSAndroid Build Coastguard WorkerUINT16 Y_density 1055*dfc6aa5cSAndroid Build Coastguard Worker The resolution information to be written into the JFIF marker; 1056*dfc6aa5cSAndroid Build Coastguard Worker not used otherwise. density_unit may be 0 for unknown, 1057*dfc6aa5cSAndroid Build Coastguard Worker 1 for dots/inch, or 2 for dots/cm. The default values are 0,1,1 1058*dfc6aa5cSAndroid Build Coastguard Worker indicating square pixels of unknown size. 1059*dfc6aa5cSAndroid Build Coastguard Worker 1060*dfc6aa5cSAndroid Build Coastguard Workerboolean write_Adobe_marker 1061*dfc6aa5cSAndroid Build Coastguard Worker If TRUE, an Adobe APP14 marker is emitted. jpeg_set_defaults() and 1062*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_colorspace() set this TRUE if JPEG color space RGB, CMYK, 1063*dfc6aa5cSAndroid Build Coastguard Worker or YCCK is selected, otherwise FALSE. It is generally a bad idea 1064*dfc6aa5cSAndroid Build Coastguard Worker to set both write_JFIF_header and write_Adobe_marker. In fact, 1065*dfc6aa5cSAndroid Build Coastguard Worker you probably shouldn't change the default settings at all --- the 1066*dfc6aa5cSAndroid Build Coastguard Worker default behavior ensures that the JPEG file's color space can be 1067*dfc6aa5cSAndroid Build Coastguard Worker recognized by the decoder. 1068*dfc6aa5cSAndroid Build Coastguard Worker 1069*dfc6aa5cSAndroid Build Coastguard WorkerJQUANT_TBL *quant_tbl_ptrs[NUM_QUANT_TBLS] 1070*dfc6aa5cSAndroid Build Coastguard Worker Pointers to coefficient quantization tables, one per table slot, 1071*dfc6aa5cSAndroid Build Coastguard Worker or NULL if no table is defined for a slot. Usually these should 1072*dfc6aa5cSAndroid Build Coastguard Worker be set via one of the above helper routines; jpeg_add_quant_table() 1073*dfc6aa5cSAndroid Build Coastguard Worker is general enough to define any quantization table. The other 1074*dfc6aa5cSAndroid Build Coastguard Worker routines will set up table slot 0 for luminance quality and table 1075*dfc6aa5cSAndroid Build Coastguard Worker slot 1 for chrominance. 1076*dfc6aa5cSAndroid Build Coastguard Worker 1077*dfc6aa5cSAndroid Build Coastguard Workerint q_scale_factor[NUM_QUANT_TBLS] 1078*dfc6aa5cSAndroid Build Coastguard Worker [libjpeg v7+ API/ABI emulation only] 1079*dfc6aa5cSAndroid Build Coastguard Worker Linear quantization scaling factors (0-100, default 100) 1080*dfc6aa5cSAndroid Build Coastguard Worker for use with jpeg_default_qtables(). 1081*dfc6aa5cSAndroid Build Coastguard Worker See rdswitch.c and cjpeg.c for an example of usage. 1082*dfc6aa5cSAndroid Build Coastguard Worker Note that the q_scale_factor[] values use "linear" scales, so JPEG 1083*dfc6aa5cSAndroid Build Coastguard Worker quality levels chosen by the user must be converted to these scales 1084*dfc6aa5cSAndroid Build Coastguard Worker using jpeg_quality_scaling(). Here is an example that corresponds to 1085*dfc6aa5cSAndroid Build Coastguard Worker cjpeg -quality 90,70: 1086*dfc6aa5cSAndroid Build Coastguard Worker 1087*dfc6aa5cSAndroid Build Coastguard Worker jpeg_set_defaults(cinfo); 1088*dfc6aa5cSAndroid Build Coastguard Worker 1089*dfc6aa5cSAndroid Build Coastguard Worker /* Set luminance quality 90. */ 1090*dfc6aa5cSAndroid Build Coastguard Worker cinfo->q_scale_factor[0] = jpeg_quality_scaling(90); 1091*dfc6aa5cSAndroid Build Coastguard Worker /* Set chrominance quality 70. */ 1092*dfc6aa5cSAndroid Build Coastguard Worker cinfo->q_scale_factor[1] = jpeg_quality_scaling(70); 1093*dfc6aa5cSAndroid Build Coastguard Worker 1094*dfc6aa5cSAndroid Build Coastguard Worker jpeg_default_qtables(cinfo, force_baseline); 1095*dfc6aa5cSAndroid Build Coastguard Worker 1096*dfc6aa5cSAndroid Build Coastguard Worker CAUTION: Setting separate quality levels for chrominance and luminance 1097*dfc6aa5cSAndroid Build Coastguard Worker is mainly only useful if chrominance subsampling is disabled. 2x2 1098*dfc6aa5cSAndroid Build Coastguard Worker chrominance subsampling (AKA "4:2:0") is the default, but you can 1099*dfc6aa5cSAndroid Build Coastguard Worker explicitly disable subsampling as follows: 1100*dfc6aa5cSAndroid Build Coastguard Worker 1101*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[0].v_samp_factor = 1; 1102*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[0].h_samp_factor = 1; 1103*dfc6aa5cSAndroid Build Coastguard Worker 1104*dfc6aa5cSAndroid Build Coastguard WorkerJHUFF_TBL *dc_huff_tbl_ptrs[NUM_HUFF_TBLS] 1105*dfc6aa5cSAndroid Build Coastguard WorkerJHUFF_TBL *ac_huff_tbl_ptrs[NUM_HUFF_TBLS] 1106*dfc6aa5cSAndroid Build Coastguard Worker Pointers to Huffman coding tables, one per table slot, or NULL if 1107*dfc6aa5cSAndroid Build Coastguard Worker no table is defined for a slot. Slots 0 and 1 are filled with the 1108*dfc6aa5cSAndroid Build Coastguard Worker JPEG sample tables by jpeg_set_defaults(). If you need to allocate 1109*dfc6aa5cSAndroid Build Coastguard Worker more table structures, jpeg_alloc_huff_table() may be used. 1110*dfc6aa5cSAndroid Build Coastguard Worker Note that optimal Huffman tables can be computed for an image 1111*dfc6aa5cSAndroid Build Coastguard Worker by setting optimize_coding, as discussed above; there's seldom 1112*dfc6aa5cSAndroid Build Coastguard Worker any need to mess with providing your own Huffman tables. 1113*dfc6aa5cSAndroid Build Coastguard Worker 1114*dfc6aa5cSAndroid Build Coastguard Worker 1115*dfc6aa5cSAndroid Build Coastguard Worker[libjpeg v7+ API/ABI emulation only] 1116*dfc6aa5cSAndroid Build Coastguard WorkerThe actual dimensions of the JPEG image that will be written to the file are 1117*dfc6aa5cSAndroid Build Coastguard Workergiven by the following fields. These are computed from the input image 1118*dfc6aa5cSAndroid Build Coastguard Workerdimensions and the compression parameters by jpeg_start_compress(). You can 1119*dfc6aa5cSAndroid Build Coastguard Workeralso call jpeg_calc_jpeg_dimensions() to obtain the values that will result 1120*dfc6aa5cSAndroid Build Coastguard Workerfrom the current parameter settings. This can be useful if you are trying 1121*dfc6aa5cSAndroid Build Coastguard Workerto pick a scaling ratio that will get close to a desired target size. 1122*dfc6aa5cSAndroid Build Coastguard Worker 1123*dfc6aa5cSAndroid Build Coastguard WorkerJDIMENSION jpeg_width Actual dimensions of output image. 1124*dfc6aa5cSAndroid Build Coastguard WorkerJDIMENSION jpeg_height 1125*dfc6aa5cSAndroid Build Coastguard Worker 1126*dfc6aa5cSAndroid Build Coastguard Worker 1127*dfc6aa5cSAndroid Build Coastguard WorkerPer-component parameters are stored in the struct cinfo.comp_info[i] for 1128*dfc6aa5cSAndroid Build Coastguard Workercomponent number i. Note that components here refer to components of the 1129*dfc6aa5cSAndroid Build Coastguard WorkerJPEG color space, *not* the source image color space. A suitably large 1130*dfc6aa5cSAndroid Build Coastguard Workercomp_info[] array is allocated by jpeg_set_defaults(); if you choose not 1131*dfc6aa5cSAndroid Build Coastguard Workerto use that routine, it's up to you to allocate the array. 1132*dfc6aa5cSAndroid Build Coastguard Worker 1133*dfc6aa5cSAndroid Build Coastguard Workerint component_id 1134*dfc6aa5cSAndroid Build Coastguard Worker The one-byte identifier code to be recorded in the JPEG file for 1135*dfc6aa5cSAndroid Build Coastguard Worker this component. For the standard color spaces, we recommend you 1136*dfc6aa5cSAndroid Build Coastguard Worker leave the default values alone. 1137*dfc6aa5cSAndroid Build Coastguard Worker 1138*dfc6aa5cSAndroid Build Coastguard Workerint h_samp_factor 1139*dfc6aa5cSAndroid Build Coastguard Workerint v_samp_factor 1140*dfc6aa5cSAndroid Build Coastguard Worker Horizontal and vertical sampling factors for the component; must 1141*dfc6aa5cSAndroid Build Coastguard Worker be 1..4 according to the JPEG standard. Note that larger sampling 1142*dfc6aa5cSAndroid Build Coastguard Worker factors indicate a higher-resolution component; many people find 1143*dfc6aa5cSAndroid Build Coastguard Worker this behavior quite unintuitive. The default values are 2,2 for 1144*dfc6aa5cSAndroid Build Coastguard Worker luminance components and 1,1 for chrominance components, except 1145*dfc6aa5cSAndroid Build Coastguard Worker for grayscale where 1,1 is used. 1146*dfc6aa5cSAndroid Build Coastguard Worker 1147*dfc6aa5cSAndroid Build Coastguard Workerint quant_tbl_no 1148*dfc6aa5cSAndroid Build Coastguard Worker Quantization table number for component. The default value is 1149*dfc6aa5cSAndroid Build Coastguard Worker 0 for luminance components and 1 for chrominance components. 1150*dfc6aa5cSAndroid Build Coastguard Worker 1151*dfc6aa5cSAndroid Build Coastguard Workerint dc_tbl_no 1152*dfc6aa5cSAndroid Build Coastguard Workerint ac_tbl_no 1153*dfc6aa5cSAndroid Build Coastguard Worker DC and AC entropy coding table numbers. The default values are 1154*dfc6aa5cSAndroid Build Coastguard Worker 0 for luminance components and 1 for chrominance components. 1155*dfc6aa5cSAndroid Build Coastguard Worker 1156*dfc6aa5cSAndroid Build Coastguard Workerint component_index 1157*dfc6aa5cSAndroid Build Coastguard Worker Must equal the component's index in comp_info[]. (Beginning in 1158*dfc6aa5cSAndroid Build Coastguard Worker release v6, the compressor library will fill this in automatically; 1159*dfc6aa5cSAndroid Build Coastguard Worker you don't have to.) 1160*dfc6aa5cSAndroid Build Coastguard Worker 1161*dfc6aa5cSAndroid Build Coastguard Worker 1162*dfc6aa5cSAndroid Build Coastguard WorkerDecompression parameter selection 1163*dfc6aa5cSAndroid Build Coastguard Worker--------------------------------- 1164*dfc6aa5cSAndroid Build Coastguard Worker 1165*dfc6aa5cSAndroid Build Coastguard WorkerDecompression parameter selection is somewhat simpler than compression 1166*dfc6aa5cSAndroid Build Coastguard Workerparameter selection, since all of the JPEG internal parameters are 1167*dfc6aa5cSAndroid Build Coastguard Workerrecorded in the source file and need not be supplied by the application. 1168*dfc6aa5cSAndroid Build Coastguard Worker(Unless you are working with abbreviated files, in which case see 1169*dfc6aa5cSAndroid Build Coastguard Worker"Abbreviated datastreams", below.) Decompression parameters control 1170*dfc6aa5cSAndroid Build Coastguard Workerthe postprocessing done on the image to deliver it in a format suitable 1171*dfc6aa5cSAndroid Build Coastguard Workerfor the application's use. Many of the parameters control speed/quality 1172*dfc6aa5cSAndroid Build Coastguard Workertradeoffs, in which faster decompression may be obtained at the price of 1173*dfc6aa5cSAndroid Build Coastguard Workera poorer-quality image. The defaults select the highest quality (slowest) 1174*dfc6aa5cSAndroid Build Coastguard Workerprocessing. 1175*dfc6aa5cSAndroid Build Coastguard Worker 1176*dfc6aa5cSAndroid Build Coastguard WorkerThe following fields in the JPEG object are set by jpeg_read_header() and 1177*dfc6aa5cSAndroid Build Coastguard Workermay be useful to the application in choosing decompression parameters: 1178*dfc6aa5cSAndroid Build Coastguard Worker 1179*dfc6aa5cSAndroid Build Coastguard WorkerJDIMENSION image_width Width and height of image 1180*dfc6aa5cSAndroid Build Coastguard WorkerJDIMENSION image_height 1181*dfc6aa5cSAndroid Build Coastguard Workerint num_components Number of color components 1182*dfc6aa5cSAndroid Build Coastguard WorkerJ_COLOR_SPACE jpeg_color_space Colorspace of image 1183*dfc6aa5cSAndroid Build Coastguard Workerboolean saw_JFIF_marker TRUE if a JFIF APP0 marker was seen 1184*dfc6aa5cSAndroid Build Coastguard Worker UINT8 JFIF_major_version Version information from JFIF marker 1185*dfc6aa5cSAndroid Build Coastguard Worker UINT8 JFIF_minor_version 1186*dfc6aa5cSAndroid Build Coastguard Worker UINT8 density_unit Resolution data from JFIF marker 1187*dfc6aa5cSAndroid Build Coastguard Worker UINT16 X_density 1188*dfc6aa5cSAndroid Build Coastguard Worker UINT16 Y_density 1189*dfc6aa5cSAndroid Build Coastguard Workerboolean saw_Adobe_marker TRUE if an Adobe APP14 marker was seen 1190*dfc6aa5cSAndroid Build Coastguard Worker UINT8 Adobe_transform Color transform code from Adobe marker 1191*dfc6aa5cSAndroid Build Coastguard Worker 1192*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG color space, unfortunately, is something of a guess since the JPEG 1193*dfc6aa5cSAndroid Build Coastguard Workerstandard proper does not provide a way to record it. In practice most files 1194*dfc6aa5cSAndroid Build Coastguard Workeradhere to the JFIF or Adobe conventions, and the decoder will recognize these 1195*dfc6aa5cSAndroid Build Coastguard Workercorrectly. See "Special color spaces", below, for more info. 1196*dfc6aa5cSAndroid Build Coastguard Worker 1197*dfc6aa5cSAndroid Build Coastguard Worker 1198*dfc6aa5cSAndroid Build Coastguard WorkerThe decompression parameters that determine the basic properties of the 1199*dfc6aa5cSAndroid Build Coastguard Workerreturned image are: 1200*dfc6aa5cSAndroid Build Coastguard Worker 1201*dfc6aa5cSAndroid Build Coastguard WorkerJ_COLOR_SPACE out_color_space 1202*dfc6aa5cSAndroid Build Coastguard Worker Output color space. jpeg_read_header() sets an appropriate default 1203*dfc6aa5cSAndroid Build Coastguard Worker based on jpeg_color_space; typically it will be RGB or grayscale. 1204*dfc6aa5cSAndroid Build Coastguard Worker The application can change this field to request output in a different 1205*dfc6aa5cSAndroid Build Coastguard Worker colorspace. For example, set it to JCS_GRAYSCALE to get grayscale 1206*dfc6aa5cSAndroid Build Coastguard Worker output from a color file. (This is useful for previewing: grayscale 1207*dfc6aa5cSAndroid Build Coastguard Worker output is faster than full color since the color components need not 1208*dfc6aa5cSAndroid Build Coastguard Worker be processed.) Note that not all possible color space transforms are 1209*dfc6aa5cSAndroid Build Coastguard Worker currently implemented; you may need to extend jdcolor.c if you want an 1210*dfc6aa5cSAndroid Build Coastguard Worker unusual conversion. 1211*dfc6aa5cSAndroid Build Coastguard Worker 1212*dfc6aa5cSAndroid Build Coastguard Workerunsigned int scale_num, scale_denom 1213*dfc6aa5cSAndroid Build Coastguard Worker Scale the image by the fraction scale_num/scale_denom. Default is 1214*dfc6aa5cSAndroid Build Coastguard Worker 1/1, or no scaling. Currently, the only supported scaling ratios 1215*dfc6aa5cSAndroid Build Coastguard Worker are M/8 with all M from 1 to 16, or any reduced fraction thereof (such 1216*dfc6aa5cSAndroid Build Coastguard Worker as 1/2, 3/4, etc.) (The library design allows for arbitrary 1217*dfc6aa5cSAndroid Build Coastguard Worker scaling ratios but this is not likely to be implemented any time soon.) 1218*dfc6aa5cSAndroid Build Coastguard Worker Smaller scaling ratios permit significantly faster decoding since 1219*dfc6aa5cSAndroid Build Coastguard Worker fewer pixels need be processed and a simpler IDCT method can be used. 1220*dfc6aa5cSAndroid Build Coastguard Worker 1221*dfc6aa5cSAndroid Build Coastguard Workerboolean quantize_colors 1222*dfc6aa5cSAndroid Build Coastguard Worker If set TRUE, colormapped output will be delivered. Default is FALSE, 1223*dfc6aa5cSAndroid Build Coastguard Worker meaning that full-color output will be delivered. 1224*dfc6aa5cSAndroid Build Coastguard Worker 1225*dfc6aa5cSAndroid Build Coastguard WorkerThe next three parameters are relevant only if quantize_colors is TRUE. 1226*dfc6aa5cSAndroid Build Coastguard Worker 1227*dfc6aa5cSAndroid Build Coastguard Workerint desired_number_of_colors 1228*dfc6aa5cSAndroid Build Coastguard Worker Maximum number of colors to use in generating a library-supplied color 1229*dfc6aa5cSAndroid Build Coastguard Worker map (the actual number of colors is returned in a different field). 1230*dfc6aa5cSAndroid Build Coastguard Worker Default 256. Ignored when the application supplies its own color map. 1231*dfc6aa5cSAndroid Build Coastguard Worker 1232*dfc6aa5cSAndroid Build Coastguard Workerboolean two_pass_quantize 1233*dfc6aa5cSAndroid Build Coastguard Worker If TRUE, an extra pass over the image is made to select a custom color 1234*dfc6aa5cSAndroid Build Coastguard Worker map for the image. This usually looks a lot better than the one-size- 1235*dfc6aa5cSAndroid Build Coastguard Worker fits-all colormap that is used otherwise. Default is TRUE. Ignored 1236*dfc6aa5cSAndroid Build Coastguard Worker when the application supplies its own color map. 1237*dfc6aa5cSAndroid Build Coastguard Worker 1238*dfc6aa5cSAndroid Build Coastguard WorkerJ_DITHER_MODE dither_mode 1239*dfc6aa5cSAndroid Build Coastguard Worker Selects color dithering method. Supported values are: 1240*dfc6aa5cSAndroid Build Coastguard Worker JDITHER_NONE no dithering: fast, very low quality 1241*dfc6aa5cSAndroid Build Coastguard Worker JDITHER_ORDERED ordered dither: moderate speed and quality 1242*dfc6aa5cSAndroid Build Coastguard Worker JDITHER_FS Floyd-Steinberg dither: slow, high quality 1243*dfc6aa5cSAndroid Build Coastguard Worker Default is JDITHER_FS. (At present, ordered dither is implemented 1244*dfc6aa5cSAndroid Build Coastguard Worker only in the single-pass, standard-colormap case. If you ask for 1245*dfc6aa5cSAndroid Build Coastguard Worker ordered dither when two_pass_quantize is TRUE or when you supply 1246*dfc6aa5cSAndroid Build Coastguard Worker an external color map, you'll get F-S dithering.) 1247*dfc6aa5cSAndroid Build Coastguard Worker 1248*dfc6aa5cSAndroid Build Coastguard WorkerWhen quantize_colors is TRUE, the target color map is described by the next 1249*dfc6aa5cSAndroid Build Coastguard Workertwo fields. colormap is set to NULL by jpeg_read_header(). The application 1250*dfc6aa5cSAndroid Build Coastguard Workercan supply a color map by setting colormap non-NULL and setting 1251*dfc6aa5cSAndroid Build Coastguard Workeractual_number_of_colors to the map size. Otherwise, jpeg_start_decompress() 1252*dfc6aa5cSAndroid Build Coastguard Workerselects a suitable color map and sets these two fields itself. 1253*dfc6aa5cSAndroid Build Coastguard Worker[Implementation restriction: at present, an externally supplied colormap is 1254*dfc6aa5cSAndroid Build Coastguard Workeronly accepted for 3-component output color spaces.] 1255*dfc6aa5cSAndroid Build Coastguard Worker 1256*dfc6aa5cSAndroid Build Coastguard WorkerJSAMPARRAY colormap 1257*dfc6aa5cSAndroid Build Coastguard Worker The color map, represented as a 2-D pixel array of out_color_components 1258*dfc6aa5cSAndroid Build Coastguard Worker rows and actual_number_of_colors columns. Ignored if not quantizing. 1259*dfc6aa5cSAndroid Build Coastguard Worker CAUTION: if the JPEG library creates its own colormap, the storage 1260*dfc6aa5cSAndroid Build Coastguard Worker pointed to by this field is released by jpeg_finish_decompress(). 1261*dfc6aa5cSAndroid Build Coastguard Worker Copy the colormap somewhere else first, if you want to save it. 1262*dfc6aa5cSAndroid Build Coastguard Worker 1263*dfc6aa5cSAndroid Build Coastguard Workerint actual_number_of_colors 1264*dfc6aa5cSAndroid Build Coastguard Worker The number of colors in the color map. 1265*dfc6aa5cSAndroid Build Coastguard Worker 1266*dfc6aa5cSAndroid Build Coastguard WorkerAdditional decompression parameters that the application may set include: 1267*dfc6aa5cSAndroid Build Coastguard Worker 1268*dfc6aa5cSAndroid Build Coastguard WorkerJ_DCT_METHOD dct_method 1269*dfc6aa5cSAndroid Build Coastguard Worker Selects the algorithm used for the DCT step. Choices are: 1270*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW: accurate integer method 1271*dfc6aa5cSAndroid Build Coastguard Worker JDCT_IFAST: less accurate integer method [legacy feature] 1272*dfc6aa5cSAndroid Build Coastguard Worker JDCT_FLOAT: floating-point method [legacy feature] 1273*dfc6aa5cSAndroid Build Coastguard Worker JDCT_DEFAULT: default method (normally JDCT_ISLOW) 1274*dfc6aa5cSAndroid Build Coastguard Worker JDCT_FASTEST: fastest method (normally JDCT_IFAST) 1275*dfc6aa5cSAndroid Build Coastguard Worker When the Independent JPEG Group's software was first released in 1991, 1276*dfc6aa5cSAndroid Build Coastguard Worker the decompression time for a 1-megapixel JPEG image on a mainstream PC 1277*dfc6aa5cSAndroid Build Coastguard Worker was measured in minutes. Thus, JDCT_IFAST provided noticeable 1278*dfc6aa5cSAndroid Build Coastguard Worker performance benefits. On modern CPUs running libjpeg-turbo, however, 1279*dfc6aa5cSAndroid Build Coastguard Worker the decompression time for a 1-megapixel JPEG image is measured in 1280*dfc6aa5cSAndroid Build Coastguard Worker milliseconds, and thus the performance benefits of JDCT_IFAST are much 1281*dfc6aa5cSAndroid Build Coastguard Worker less noticeable. On modern x86/x86-64 CPUs that support AVX2 1282*dfc6aa5cSAndroid Build Coastguard Worker instructions, JDCT_IFAST and JDCT_ISLOW have similar performance. On 1283*dfc6aa5cSAndroid Build Coastguard Worker other types of CPUs, JDCT_IFAST is generally about 5-15% faster than 1284*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW. 1285*dfc6aa5cSAndroid Build Coastguard Worker 1286*dfc6aa5cSAndroid Build Coastguard Worker If the JPEG image was compressed using a quality level of 85 or below, 1287*dfc6aa5cSAndroid Build Coastguard Worker then there should be little or no perceptible quality difference 1288*dfc6aa5cSAndroid Build Coastguard Worker between the two algorithms. When decompressing images that were 1289*dfc6aa5cSAndroid Build Coastguard Worker compressed using quality levels above 85, however, the difference 1290*dfc6aa5cSAndroid Build Coastguard Worker between JDCT_IFAST and JDCT_ISLOW becomes more pronounced. With images 1291*dfc6aa5cSAndroid Build Coastguard Worker compressed using quality=97, for instance, JDCT_IFAST incurs generally 1292*dfc6aa5cSAndroid Build Coastguard Worker about a 4-6 dB loss in PSNR relative to JDCT_ISLOW, but this can be 1293*dfc6aa5cSAndroid Build Coastguard Worker larger for some images. If you can avoid it, do not use JDCT_IFAST 1294*dfc6aa5cSAndroid Build Coastguard Worker when decompressing images that were compressed using quality levels 1295*dfc6aa5cSAndroid Build Coastguard Worker above 97. The algorithm often degenerates for such images and can 1296*dfc6aa5cSAndroid Build Coastguard Worker actually produce a more lossy output image than if the JPEG image had 1297*dfc6aa5cSAndroid Build Coastguard Worker been compressed using lower quality levels. 1298*dfc6aa5cSAndroid Build Coastguard Worker 1299*dfc6aa5cSAndroid Build Coastguard Worker JDCT_FLOAT does not produce significantly more accurate results than 1300*dfc6aa5cSAndroid Build Coastguard Worker JDCT_ISLOW, and it is much slower. JDCT_FLOAT may also give different 1301*dfc6aa5cSAndroid Build Coastguard Worker results on different machines due to varying roundoff behavior, whereas 1302*dfc6aa5cSAndroid Build Coastguard Worker the integer methods should give the same results on all machines. 1303*dfc6aa5cSAndroid Build Coastguard Worker 1304*dfc6aa5cSAndroid Build Coastguard Workerboolean do_fancy_upsampling 1305*dfc6aa5cSAndroid Build Coastguard Worker If TRUE, do careful upsampling of chroma components. If FALSE, 1306*dfc6aa5cSAndroid Build Coastguard Worker a faster but sloppier method is used. Default is TRUE. The visual 1307*dfc6aa5cSAndroid Build Coastguard Worker impact of the sloppier method is often very small. 1308*dfc6aa5cSAndroid Build Coastguard Worker 1309*dfc6aa5cSAndroid Build Coastguard Workerboolean do_block_smoothing 1310*dfc6aa5cSAndroid Build Coastguard Worker If TRUE, interblock smoothing is applied in early stages of decoding 1311*dfc6aa5cSAndroid Build Coastguard Worker progressive JPEG files; if FALSE, not. Default is TRUE. Early 1312*dfc6aa5cSAndroid Build Coastguard Worker progression stages look "fuzzy" with smoothing, "blocky" without. 1313*dfc6aa5cSAndroid Build Coastguard Worker In any case, block smoothing ceases to be applied after the first few 1314*dfc6aa5cSAndroid Build Coastguard Worker AC coefficients are known to full accuracy, so it is relevant only 1315*dfc6aa5cSAndroid Build Coastguard Worker when using buffered-image mode for progressive images. 1316*dfc6aa5cSAndroid Build Coastguard Worker 1317*dfc6aa5cSAndroid Build Coastguard Workerboolean enable_1pass_quant 1318*dfc6aa5cSAndroid Build Coastguard Workerboolean enable_external_quant 1319*dfc6aa5cSAndroid Build Coastguard Workerboolean enable_2pass_quant 1320*dfc6aa5cSAndroid Build Coastguard Worker These are significant only in buffered-image mode, which is 1321*dfc6aa5cSAndroid Build Coastguard Worker described in its own section below. 1322*dfc6aa5cSAndroid Build Coastguard Worker 1323*dfc6aa5cSAndroid Build Coastguard Worker 1324*dfc6aa5cSAndroid Build Coastguard WorkerThe output image dimensions are given by the following fields. These are 1325*dfc6aa5cSAndroid Build Coastguard Workercomputed from the source image dimensions and the decompression parameters 1326*dfc6aa5cSAndroid Build Coastguard Workerby jpeg_start_decompress(). You can also call jpeg_calc_output_dimensions() 1327*dfc6aa5cSAndroid Build Coastguard Workerto obtain the values that will result from the current parameter settings. 1328*dfc6aa5cSAndroid Build Coastguard WorkerThis can be useful if you are trying to pick a scaling ratio that will get 1329*dfc6aa5cSAndroid Build Coastguard Workerclose to a desired target size. It's also important if you are using the 1330*dfc6aa5cSAndroid Build Coastguard WorkerJPEG library's memory manager to allocate output buffer space, because you 1331*dfc6aa5cSAndroid Build Coastguard Workerare supposed to request such buffers *before* jpeg_start_decompress(). 1332*dfc6aa5cSAndroid Build Coastguard Worker 1333*dfc6aa5cSAndroid Build Coastguard WorkerJDIMENSION output_width Actual dimensions of output image. 1334*dfc6aa5cSAndroid Build Coastguard WorkerJDIMENSION output_height 1335*dfc6aa5cSAndroid Build Coastguard Workerint out_color_components Number of color components in out_color_space. 1336*dfc6aa5cSAndroid Build Coastguard Workerint output_components Number of color components returned. 1337*dfc6aa5cSAndroid Build Coastguard Workerint rec_outbuf_height Recommended height of scanline buffer. 1338*dfc6aa5cSAndroid Build Coastguard Worker 1339*dfc6aa5cSAndroid Build Coastguard WorkerWhen quantizing colors, output_components is 1, indicating a single color map 1340*dfc6aa5cSAndroid Build Coastguard Workerindex per pixel. Otherwise it equals out_color_components. The output arrays 1341*dfc6aa5cSAndroid Build Coastguard Workerare required to be output_width * output_components JSAMPLEs wide. 1342*dfc6aa5cSAndroid Build Coastguard Worker 1343*dfc6aa5cSAndroid Build Coastguard Workerrec_outbuf_height is the recommended minimum height (in scanlines) of the 1344*dfc6aa5cSAndroid Build Coastguard Workerbuffer passed to jpeg_read_scanlines(). If the buffer is smaller, the 1345*dfc6aa5cSAndroid Build Coastguard Workerlibrary will still work, but time will be wasted due to unnecessary data 1346*dfc6aa5cSAndroid Build Coastguard Workercopying. In high-quality modes, rec_outbuf_height is always 1, but some 1347*dfc6aa5cSAndroid Build Coastguard Workerfaster, lower-quality modes set it to larger values (typically 2 to 4). 1348*dfc6aa5cSAndroid Build Coastguard WorkerIf you are going to ask for a high-speed processing mode, you may as well 1349*dfc6aa5cSAndroid Build Coastguard Workergo to the trouble of honoring rec_outbuf_height so as to avoid data copying. 1350*dfc6aa5cSAndroid Build Coastguard Worker(An output buffer larger than rec_outbuf_height lines is OK, but won't 1351*dfc6aa5cSAndroid Build Coastguard Workerprovide any material speed improvement over that height.) 1352*dfc6aa5cSAndroid Build Coastguard Worker 1353*dfc6aa5cSAndroid Build Coastguard Worker 1354*dfc6aa5cSAndroid Build Coastguard WorkerSpecial color spaces 1355*dfc6aa5cSAndroid Build Coastguard Worker-------------------- 1356*dfc6aa5cSAndroid Build Coastguard Worker 1357*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG standard itself is "color blind" and doesn't specify any particular 1358*dfc6aa5cSAndroid Build Coastguard Workercolor space. It is customary to convert color data to a luminance/chrominance 1359*dfc6aa5cSAndroid Build Coastguard Workercolor space before compressing, since this permits greater compression. The 1360*dfc6aa5cSAndroid Build Coastguard Workerexisting de-facto JPEG file format standards specify YCbCr or grayscale data 1361*dfc6aa5cSAndroid Build Coastguard Worker(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special 1362*dfc6aa5cSAndroid Build Coastguard Workerapplications such as multispectral images, other color spaces can be used, 1363*dfc6aa5cSAndroid Build Coastguard Workerbut it must be understood that such files will be unportable. 1364*dfc6aa5cSAndroid Build Coastguard Worker 1365*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG library can handle the most common colorspace conversions (namely 1366*dfc6aa5cSAndroid Build Coastguard WorkerRGB <=> YCbCr and CMYK <=> YCCK). It can also deal with data of an unknown 1367*dfc6aa5cSAndroid Build Coastguard Workercolor space, passing it through without conversion. If you deal extensively 1368*dfc6aa5cSAndroid Build Coastguard Workerwith an unusual color space, you can easily extend the library to understand 1369*dfc6aa5cSAndroid Build Coastguard Workeradditional color spaces and perform appropriate conversions. 1370*dfc6aa5cSAndroid Build Coastguard Worker 1371*dfc6aa5cSAndroid Build Coastguard WorkerFor compression, the source data's color space is specified by field 1372*dfc6aa5cSAndroid Build Coastguard Workerin_color_space. This is transformed to the JPEG file's color space given 1373*dfc6aa5cSAndroid Build Coastguard Workerby jpeg_color_space. jpeg_set_defaults() chooses a reasonable JPEG color 1374*dfc6aa5cSAndroid Build Coastguard Workerspace depending on in_color_space, but you can override this by calling 1375*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_colorspace(). Of course you must select a supported transformation. 1376*dfc6aa5cSAndroid Build Coastguard Workerjccolor.c currently supports the following transformations: 1377*dfc6aa5cSAndroid Build Coastguard Worker RGB => YCbCr 1378*dfc6aa5cSAndroid Build Coastguard Worker RGB => GRAYSCALE 1379*dfc6aa5cSAndroid Build Coastguard Worker YCbCr => GRAYSCALE 1380*dfc6aa5cSAndroid Build Coastguard Worker CMYK => YCCK 1381*dfc6aa5cSAndroid Build Coastguard Workerplus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB, 1382*dfc6aa5cSAndroid Build Coastguard WorkerYCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN. 1383*dfc6aa5cSAndroid Build Coastguard Worker 1384*dfc6aa5cSAndroid Build Coastguard WorkerThe de-facto file format standards (JFIF and Adobe) specify APPn markers that 1385*dfc6aa5cSAndroid Build Coastguard Workerindicate the color space of the JPEG file. It is important to ensure that 1386*dfc6aa5cSAndroid Build Coastguard Workerthese are written correctly, or omitted if the JPEG file's color space is not 1387*dfc6aa5cSAndroid Build Coastguard Workerone of the ones supported by the de-facto standards. jpeg_set_colorspace() 1388*dfc6aa5cSAndroid Build Coastguard Workerwill set the compression parameters to include or omit the APPn markers 1389*dfc6aa5cSAndroid Build Coastguard Workerproperly, so long as it is told the truth about the JPEG color space. 1390*dfc6aa5cSAndroid Build Coastguard WorkerFor example, if you are writing some random 3-component color space without 1391*dfc6aa5cSAndroid Build Coastguard Workerconversion, don't try to fake out the library by setting in_color_space and 1392*dfc6aa5cSAndroid Build Coastguard Workerjpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an 1393*dfc6aa5cSAndroid Build Coastguard WorkerAPPn marker of your own devising to identify the colorspace --- see "Special 1394*dfc6aa5cSAndroid Build Coastguard Workermarkers", below. 1395*dfc6aa5cSAndroid Build Coastguard Worker 1396*dfc6aa5cSAndroid Build Coastguard WorkerWhen told that the color space is UNKNOWN, the library will default to using 1397*dfc6aa5cSAndroid Build Coastguard Workerluminance-quality compression parameters for all color components. You may 1398*dfc6aa5cSAndroid Build Coastguard Workerwell want to change these parameters. See the source code for 1399*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_colorspace(), in jcparam.c, for details. 1400*dfc6aa5cSAndroid Build Coastguard Worker 1401*dfc6aa5cSAndroid Build Coastguard WorkerFor decompression, the JPEG file's color space is given in jpeg_color_space, 1402*dfc6aa5cSAndroid Build Coastguard Workerand this is transformed to the output color space out_color_space. 1403*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_header's setting of jpeg_color_space can be relied on if the file 1404*dfc6aa5cSAndroid Build Coastguard Workerconforms to JFIF or Adobe conventions, but otherwise it is no better than a 1405*dfc6aa5cSAndroid Build Coastguard Workerguess. If you know the JPEG file's color space for certain, you can override 1406*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also 1407*dfc6aa5cSAndroid Build Coastguard Workerselects a default output color space based on (its guess of) jpeg_color_space; 1408*dfc6aa5cSAndroid Build Coastguard Workerset out_color_space to override this. Again, you must select a supported 1409*dfc6aa5cSAndroid Build Coastguard Workertransformation. jdcolor.c currently supports 1410*dfc6aa5cSAndroid Build Coastguard Worker YCbCr => RGB 1411*dfc6aa5cSAndroid Build Coastguard Worker YCbCr => GRAYSCALE 1412*dfc6aa5cSAndroid Build Coastguard Worker RGB => GRAYSCALE 1413*dfc6aa5cSAndroid Build Coastguard Worker GRAYSCALE => RGB 1414*dfc6aa5cSAndroid Build Coastguard Worker YCCK => CMYK 1415*dfc6aa5cSAndroid Build Coastguard Workeras well as the null transforms. (Since GRAYSCALE=>RGB is provided, an 1416*dfc6aa5cSAndroid Build Coastguard Workerapplication can force grayscale JPEGs to look like color JPEGs if it only 1417*dfc6aa5cSAndroid Build Coastguard Workerwants to handle one case.) 1418*dfc6aa5cSAndroid Build Coastguard Worker 1419*dfc6aa5cSAndroid Build Coastguard WorkerThe two-pass color quantizer, jquant2.c, is specialized to handle RGB data 1420*dfc6aa5cSAndroid Build Coastguard Worker(it weights distances appropriately for RGB colors). You'll need to modify 1421*dfc6aa5cSAndroid Build Coastguard Workerthe code if you want to use it for non-RGB output color spaces. Note that 1422*dfc6aa5cSAndroid Build Coastguard Workerjquant2.c is used to map to an application-supplied colormap as well as for 1423*dfc6aa5cSAndroid Build Coastguard Workerthe normal two-pass colormap selection process. 1424*dfc6aa5cSAndroid Build Coastguard Worker 1425*dfc6aa5cSAndroid Build Coastguard WorkerCAUTION: it appears that Adobe Photoshop writes inverted data in CMYK JPEG 1426*dfc6aa5cSAndroid Build Coastguard Workerfiles: 0 represents 100% ink coverage, rather than 0% ink as you'd expect. 1427*dfc6aa5cSAndroid Build Coastguard WorkerThis is arguably a bug in Photoshop, but if you need to work with Photoshop 1428*dfc6aa5cSAndroid Build Coastguard WorkerCMYK files, you will have to deal with it in your application. We cannot 1429*dfc6aa5cSAndroid Build Coastguard Worker"fix" this in the library by inverting the data during the CMYK<=>YCCK 1430*dfc6aa5cSAndroid Build Coastguard Workertransform, because that would break other applications, notably Ghostscript. 1431*dfc6aa5cSAndroid Build Coastguard WorkerPhotoshop versions prior to 3.0 write EPS files containing JPEG-encoded CMYK 1432*dfc6aa5cSAndroid Build Coastguard Workerdata in the same inverted-YCCK representation used in bare JPEG files, but 1433*dfc6aa5cSAndroid Build Coastguard Workerthe surrounding PostScript code performs an inversion using the PS image 1434*dfc6aa5cSAndroid Build Coastguard Workeroperator. I am told that Photoshop 3.0 will write uninverted YCCK in 1435*dfc6aa5cSAndroid Build Coastguard WorkerEPS/JPEG files, and will omit the PS-level inversion. (But the data 1436*dfc6aa5cSAndroid Build Coastguard Workerpolarity used in bare JPEG files will not change in 3.0.) In either case, 1437*dfc6aa5cSAndroid Build Coastguard Workerthe JPEG library must not invert the data itself, or else Ghostscript would 1438*dfc6aa5cSAndroid Build Coastguard Workerread these EPS files incorrectly. 1439*dfc6aa5cSAndroid Build Coastguard Worker 1440*dfc6aa5cSAndroid Build Coastguard Worker 1441*dfc6aa5cSAndroid Build Coastguard WorkerError handling 1442*dfc6aa5cSAndroid Build Coastguard Worker-------------- 1443*dfc6aa5cSAndroid Build Coastguard Worker 1444*dfc6aa5cSAndroid Build Coastguard WorkerWhen the default error handler is used, any error detected inside the JPEG 1445*dfc6aa5cSAndroid Build Coastguard Workerroutines will cause a message to be printed on stderr, followed by exit(). 1446*dfc6aa5cSAndroid Build Coastguard WorkerYou can supply your own error handling routines to override this behavior 1447*dfc6aa5cSAndroid Build Coastguard Workerand to control the treatment of nonfatal warnings and trace/debug messages. 1448*dfc6aa5cSAndroid Build Coastguard WorkerThe file example.txt illustrates the most common case, which is to have the 1449*dfc6aa5cSAndroid Build Coastguard Workerapplication regain control after an error rather than exiting. 1450*dfc6aa5cSAndroid Build Coastguard Worker 1451*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG library never writes any message directly; it always goes through 1452*dfc6aa5cSAndroid Build Coastguard Workerthe error handling routines. Three classes of messages are recognized: 1453*dfc6aa5cSAndroid Build Coastguard Worker * Fatal errors: the library cannot continue. 1454*dfc6aa5cSAndroid Build Coastguard Worker * Warnings: the library can continue, but the data is corrupt, and a 1455*dfc6aa5cSAndroid Build Coastguard Worker damaged output image is likely to result. 1456*dfc6aa5cSAndroid Build Coastguard Worker * Trace/informational messages. These come with a trace level indicating 1457*dfc6aa5cSAndroid Build Coastguard Worker the importance of the message; you can control the verbosity of the 1458*dfc6aa5cSAndroid Build Coastguard Worker program by adjusting the maximum trace level that will be displayed. 1459*dfc6aa5cSAndroid Build Coastguard Worker 1460*dfc6aa5cSAndroid Build Coastguard WorkerYou may, if you wish, simply replace the entire JPEG error handling module 1461*dfc6aa5cSAndroid Build Coastguard Worker(jerror.c) with your own code. However, you can avoid code duplication by 1462*dfc6aa5cSAndroid Build Coastguard Workeronly replacing some of the routines depending on the behavior you need. 1463*dfc6aa5cSAndroid Build Coastguard WorkerThis is accomplished by calling jpeg_std_error() as usual, but then overriding 1464*dfc6aa5cSAndroid Build Coastguard Workersome of the method pointers in the jpeg_error_mgr struct, as illustrated by 1465*dfc6aa5cSAndroid Build Coastguard Workerexample.txt. 1466*dfc6aa5cSAndroid Build Coastguard Worker 1467*dfc6aa5cSAndroid Build Coastguard WorkerAll of the error handling routines will receive a pointer to the JPEG object 1468*dfc6aa5cSAndroid Build Coastguard Worker(a j_common_ptr which points to either a jpeg_compress_struct or a 1469*dfc6aa5cSAndroid Build Coastguard Workerjpeg_decompress_struct; if you need to tell which, test the is_decompressor 1470*dfc6aa5cSAndroid Build Coastguard Workerfield). This struct includes a pointer to the error manager struct in its 1471*dfc6aa5cSAndroid Build Coastguard Worker"err" field. Frequently, custom error handler routines will need to access 1472*dfc6aa5cSAndroid Build Coastguard Workeradditional data which is not known to the JPEG library or the standard error 1473*dfc6aa5cSAndroid Build Coastguard Workerhandler. The most convenient way to do this is to embed either the JPEG 1474*dfc6aa5cSAndroid Build Coastguard Workerobject or the jpeg_error_mgr struct in a larger structure that contains 1475*dfc6aa5cSAndroid Build Coastguard Workeradditional fields; then casting the passed pointer provides access to the 1476*dfc6aa5cSAndroid Build Coastguard Workeradditional fields. Again, see example.txt for one way to do it. (Beginning 1477*dfc6aa5cSAndroid Build Coastguard Workerwith IJG version 6b, there is also a void pointer "client_data" in each 1478*dfc6aa5cSAndroid Build Coastguard WorkerJPEG object, which the application can also use to find related data. 1479*dfc6aa5cSAndroid Build Coastguard WorkerThe library does not touch client_data at all.) 1480*dfc6aa5cSAndroid Build Coastguard Worker 1481*dfc6aa5cSAndroid Build Coastguard WorkerThe individual methods that you might wish to override are: 1482*dfc6aa5cSAndroid Build Coastguard Worker 1483*dfc6aa5cSAndroid Build Coastguard Workererror_exit (j_common_ptr cinfo) 1484*dfc6aa5cSAndroid Build Coastguard Worker Receives control for a fatal error. Information sufficient to 1485*dfc6aa5cSAndroid Build Coastguard Worker generate the error message has been stored in cinfo->err; call 1486*dfc6aa5cSAndroid Build Coastguard Worker output_message to display it. Control must NOT return to the caller; 1487*dfc6aa5cSAndroid Build Coastguard Worker generally this routine will exit() or longjmp() somewhere. 1488*dfc6aa5cSAndroid Build Coastguard Worker Typically you would override this routine to get rid of the exit() 1489*dfc6aa5cSAndroid Build Coastguard Worker default behavior. Note that if you continue processing, you should 1490*dfc6aa5cSAndroid Build Coastguard Worker clean up the JPEG object with jpeg_abort() or jpeg_destroy(). 1491*dfc6aa5cSAndroid Build Coastguard Worker 1492*dfc6aa5cSAndroid Build Coastguard Workeroutput_message (j_common_ptr cinfo) 1493*dfc6aa5cSAndroid Build Coastguard Worker Actual output of any JPEG message. Override this to send messages 1494*dfc6aa5cSAndroid Build Coastguard Worker somewhere other than stderr. Note that this method does not know 1495*dfc6aa5cSAndroid Build Coastguard Worker how to generate a message, only where to send it. 1496*dfc6aa5cSAndroid Build Coastguard Worker 1497*dfc6aa5cSAndroid Build Coastguard Workerformat_message (j_common_ptr cinfo, char *buffer) 1498*dfc6aa5cSAndroid Build Coastguard Worker Constructs a readable error message string based on the error info 1499*dfc6aa5cSAndroid Build Coastguard Worker stored in cinfo->err. This method is called by output_message. Few 1500*dfc6aa5cSAndroid Build Coastguard Worker applications should need to override this method. One possible 1501*dfc6aa5cSAndroid Build Coastguard Worker reason for doing so is to implement dynamic switching of error message 1502*dfc6aa5cSAndroid Build Coastguard Worker language. 1503*dfc6aa5cSAndroid Build Coastguard Worker 1504*dfc6aa5cSAndroid Build Coastguard Workeremit_message (j_common_ptr cinfo, int msg_level) 1505*dfc6aa5cSAndroid Build Coastguard Worker Decide whether or not to emit a warning or trace message; if so, 1506*dfc6aa5cSAndroid Build Coastguard Worker calls output_message. The main reason for overriding this method 1507*dfc6aa5cSAndroid Build Coastguard Worker would be to abort on warnings. msg_level is -1 for warnings, 1508*dfc6aa5cSAndroid Build Coastguard Worker 0 and up for trace messages. 1509*dfc6aa5cSAndroid Build Coastguard Worker 1510*dfc6aa5cSAndroid Build Coastguard WorkerOnly error_exit() and emit_message() are called from the rest of the JPEG 1511*dfc6aa5cSAndroid Build Coastguard Workerlibrary; the other two are internal to the error handler. 1512*dfc6aa5cSAndroid Build Coastguard Worker 1513*dfc6aa5cSAndroid Build Coastguard WorkerThe actual message texts are stored in an array of strings which is pointed to 1514*dfc6aa5cSAndroid Build Coastguard Workerby the field err->jpeg_message_table. The messages are numbered from 0 to 1515*dfc6aa5cSAndroid Build Coastguard Workererr->last_jpeg_message, and it is these code numbers that are used in the 1516*dfc6aa5cSAndroid Build Coastguard WorkerJPEG library code. You could replace the message texts (for instance, with 1517*dfc6aa5cSAndroid Build Coastguard Workermessages in French or German) by changing the message table pointer. See 1518*dfc6aa5cSAndroid Build Coastguard Workerjerror.h for the default texts. CAUTION: this table will almost certainly 1519*dfc6aa5cSAndroid Build Coastguard Workerchange or grow from one library version to the next. 1520*dfc6aa5cSAndroid Build Coastguard Worker 1521*dfc6aa5cSAndroid Build Coastguard WorkerIt may be useful for an application to add its own message texts that are 1522*dfc6aa5cSAndroid Build Coastguard Workerhandled by the same mechanism. The error handler supports a second "add-on" 1523*dfc6aa5cSAndroid Build Coastguard Workermessage table for this purpose. To define an addon table, set the pointer 1524*dfc6aa5cSAndroid Build Coastguard Workererr->addon_message_table and the message numbers err->first_addon_message and 1525*dfc6aa5cSAndroid Build Coastguard Workererr->last_addon_message. If you number the addon messages beginning at 1000 1526*dfc6aa5cSAndroid Build Coastguard Workeror so, you won't have to worry about conflicts with the library's built-in 1527*dfc6aa5cSAndroid Build Coastguard Workermessages. See the sample applications cjpeg/djpeg for an example of using 1528*dfc6aa5cSAndroid Build Coastguard Workeraddon messages (the addon messages are defined in cderror.h). 1529*dfc6aa5cSAndroid Build Coastguard Worker 1530*dfc6aa5cSAndroid Build Coastguard WorkerActual invocation of the error handler is done via macros defined in jerror.h: 1531*dfc6aa5cSAndroid Build Coastguard Worker ERREXITn(...) for fatal errors 1532*dfc6aa5cSAndroid Build Coastguard Worker WARNMSn(...) for corrupt-data warnings 1533*dfc6aa5cSAndroid Build Coastguard Worker TRACEMSn(...) for trace and informational messages. 1534*dfc6aa5cSAndroid Build Coastguard WorkerThese macros store the message code and any additional parameters into the 1535*dfc6aa5cSAndroid Build Coastguard Workererror handler struct, then invoke the error_exit() or emit_message() method. 1536*dfc6aa5cSAndroid Build Coastguard WorkerThe variants of each macro are for varying numbers of additional parameters. 1537*dfc6aa5cSAndroid Build Coastguard WorkerThe additional parameters are inserted into the generated message using 1538*dfc6aa5cSAndroid Build Coastguard Workerstandard printf() format codes. 1539*dfc6aa5cSAndroid Build Coastguard Worker 1540*dfc6aa5cSAndroid Build Coastguard WorkerSee jerror.h and jerror.c for further details. 1541*dfc6aa5cSAndroid Build Coastguard Worker 1542*dfc6aa5cSAndroid Build Coastguard Worker 1543*dfc6aa5cSAndroid Build Coastguard WorkerCompressed data handling (source and destination managers) 1544*dfc6aa5cSAndroid Build Coastguard Worker---------------------------------------------------------- 1545*dfc6aa5cSAndroid Build Coastguard Worker 1546*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG compression library sends its compressed data to a "destination 1547*dfc6aa5cSAndroid Build Coastguard Workermanager" module. The default destination manager just writes the data to a 1548*dfc6aa5cSAndroid Build Coastguard Workermemory buffer or to a stdio stream, but you can provide your own manager to 1549*dfc6aa5cSAndroid Build Coastguard Workerdo something else. Similarly, the decompression library calls a "source 1550*dfc6aa5cSAndroid Build Coastguard Workermanager" to obtain the compressed data; you can provide your own source 1551*dfc6aa5cSAndroid Build Coastguard Workermanager if you want the data to come from somewhere other than a memory 1552*dfc6aa5cSAndroid Build Coastguard Workerbuffer or a stdio stream. 1553*dfc6aa5cSAndroid Build Coastguard Worker 1554*dfc6aa5cSAndroid Build Coastguard WorkerIn both cases, compressed data is processed a bufferload at a time: the 1555*dfc6aa5cSAndroid Build Coastguard Workerdestination or source manager provides a work buffer, and the library invokes 1556*dfc6aa5cSAndroid Build Coastguard Workerthe manager only when the buffer is filled or emptied. (You could define a 1557*dfc6aa5cSAndroid Build Coastguard Workerone-character buffer to force the manager to be invoked for each byte, but 1558*dfc6aa5cSAndroid Build Coastguard Workerthat would be rather inefficient.) The buffer's size and location are 1559*dfc6aa5cSAndroid Build Coastguard Workercontrolled by the manager, not by the library. For example, the memory 1560*dfc6aa5cSAndroid Build Coastguard Workersource manager just makes the buffer pointer and length point to the original 1561*dfc6aa5cSAndroid Build Coastguard Workerdata in memory. In this case the buffer-reload procedure will be invoked 1562*dfc6aa5cSAndroid Build Coastguard Workeronly if the decompressor ran off the end of the datastream, which would 1563*dfc6aa5cSAndroid Build Coastguard Workerindicate an erroneous datastream. 1564*dfc6aa5cSAndroid Build Coastguard Worker 1565*dfc6aa5cSAndroid Build Coastguard WorkerThe work buffer is defined as an array of datatype JOCTET, which is generally 1566*dfc6aa5cSAndroid Build Coastguard Worker"char" or "unsigned char". On a machine where char is not exactly 8 bits 1567*dfc6aa5cSAndroid Build Coastguard Workerwide, you must define JOCTET as a wider data type and then modify the data 1568*dfc6aa5cSAndroid Build Coastguard Workersource and destination modules to transcribe the work arrays into 8-bit units 1569*dfc6aa5cSAndroid Build Coastguard Workeron external storage. 1570*dfc6aa5cSAndroid Build Coastguard Worker 1571*dfc6aa5cSAndroid Build Coastguard WorkerA data destination manager struct contains a pointer and count defining the 1572*dfc6aa5cSAndroid Build Coastguard Workernext byte to write in the work buffer and the remaining free space: 1573*dfc6aa5cSAndroid Build Coastguard Worker 1574*dfc6aa5cSAndroid Build Coastguard Worker JOCTET *next_output_byte; /* => next byte to write in buffer */ 1575*dfc6aa5cSAndroid Build Coastguard Worker size_t free_in_buffer; /* # of byte spaces remaining in buffer */ 1576*dfc6aa5cSAndroid Build Coastguard Worker 1577*dfc6aa5cSAndroid Build Coastguard WorkerThe library increments the pointer and decrements the count until the buffer 1578*dfc6aa5cSAndroid Build Coastguard Workeris filled. The manager's empty_output_buffer method must reset the pointer 1579*dfc6aa5cSAndroid Build Coastguard Workerand count. The manager is expected to remember the buffer's starting address 1580*dfc6aa5cSAndroid Build Coastguard Workerand total size in private fields not visible to the library. 1581*dfc6aa5cSAndroid Build Coastguard Worker 1582*dfc6aa5cSAndroid Build Coastguard WorkerA data destination manager provides three methods: 1583*dfc6aa5cSAndroid Build Coastguard Worker 1584*dfc6aa5cSAndroid Build Coastguard Workerinit_destination (j_compress_ptr cinfo) 1585*dfc6aa5cSAndroid Build Coastguard Worker Initialize destination. This is called by jpeg_start_compress() 1586*dfc6aa5cSAndroid Build Coastguard Worker before any data is actually written. It must initialize 1587*dfc6aa5cSAndroid Build Coastguard Worker next_output_byte and free_in_buffer. free_in_buffer must be 1588*dfc6aa5cSAndroid Build Coastguard Worker initialized to a positive value. 1589*dfc6aa5cSAndroid Build Coastguard Worker 1590*dfc6aa5cSAndroid Build Coastguard Workerempty_output_buffer (j_compress_ptr cinfo) 1591*dfc6aa5cSAndroid Build Coastguard Worker This is called whenever the buffer has filled (free_in_buffer 1592*dfc6aa5cSAndroid Build Coastguard Worker reaches zero). In typical applications, it should write out the 1593*dfc6aa5cSAndroid Build Coastguard Worker *entire* buffer (use the saved start address and buffer length; 1594*dfc6aa5cSAndroid Build Coastguard Worker ignore the current state of next_output_byte and free_in_buffer). 1595*dfc6aa5cSAndroid Build Coastguard Worker Then reset the pointer & count to the start of the buffer, and 1596*dfc6aa5cSAndroid Build Coastguard Worker return TRUE indicating that the buffer has been dumped. 1597*dfc6aa5cSAndroid Build Coastguard Worker free_in_buffer must be set to a positive value when TRUE is 1598*dfc6aa5cSAndroid Build Coastguard Worker returned. A FALSE return should only be used when I/O suspension is 1599*dfc6aa5cSAndroid Build Coastguard Worker desired (this operating mode is discussed in the next section). 1600*dfc6aa5cSAndroid Build Coastguard Worker 1601*dfc6aa5cSAndroid Build Coastguard Workerterm_destination (j_compress_ptr cinfo) 1602*dfc6aa5cSAndroid Build Coastguard Worker Terminate destination --- called by jpeg_finish_compress() after all 1603*dfc6aa5cSAndroid Build Coastguard Worker data has been written. In most applications, this must flush any 1604*dfc6aa5cSAndroid Build Coastguard Worker data remaining in the buffer. Use either next_output_byte or 1605*dfc6aa5cSAndroid Build Coastguard Worker free_in_buffer to determine how much data is in the buffer. 1606*dfc6aa5cSAndroid Build Coastguard Worker 1607*dfc6aa5cSAndroid Build Coastguard Workerterm_destination() is NOT called by jpeg_abort() or jpeg_destroy(). If you 1608*dfc6aa5cSAndroid Build Coastguard Workerwant the destination manager to be cleaned up during an abort, you must do it 1609*dfc6aa5cSAndroid Build Coastguard Workeryourself. 1610*dfc6aa5cSAndroid Build Coastguard Worker 1611*dfc6aa5cSAndroid Build Coastguard WorkerYou will also need code to create a jpeg_destination_mgr struct, fill in its 1612*dfc6aa5cSAndroid Build Coastguard Workermethod pointers, and insert a pointer to the struct into the "dest" field of 1613*dfc6aa5cSAndroid Build Coastguard Workerthe JPEG compression object. This can be done in-line in your setup code if 1614*dfc6aa5cSAndroid Build Coastguard Workeryou like, but it's probably cleaner to provide a separate routine similar to 1615*dfc6aa5cSAndroid Build Coastguard Workerthe jpeg_stdio_dest() or jpeg_mem_dest() routines of the supplied destination 1616*dfc6aa5cSAndroid Build Coastguard Workermanagers. 1617*dfc6aa5cSAndroid Build Coastguard Worker 1618*dfc6aa5cSAndroid Build Coastguard WorkerDecompression source managers follow a parallel design, but with some 1619*dfc6aa5cSAndroid Build Coastguard Workeradditional frammishes. The source manager struct contains a pointer and count 1620*dfc6aa5cSAndroid Build Coastguard Workerdefining the next byte to read from the work buffer and the number of bytes 1621*dfc6aa5cSAndroid Build Coastguard Workerremaining: 1622*dfc6aa5cSAndroid Build Coastguard Worker 1623*dfc6aa5cSAndroid Build Coastguard Worker const JOCTET *next_input_byte; /* => next byte to read from buffer */ 1624*dfc6aa5cSAndroid Build Coastguard Worker size_t bytes_in_buffer; /* # of bytes remaining in buffer */ 1625*dfc6aa5cSAndroid Build Coastguard Worker 1626*dfc6aa5cSAndroid Build Coastguard WorkerThe library increments the pointer and decrements the count until the buffer 1627*dfc6aa5cSAndroid Build Coastguard Workeris emptied. The manager's fill_input_buffer method must reset the pointer and 1628*dfc6aa5cSAndroid Build Coastguard Workercount. In most applications, the manager must remember the buffer's starting 1629*dfc6aa5cSAndroid Build Coastguard Workeraddress and total size in private fields not visible to the library. 1630*dfc6aa5cSAndroid Build Coastguard Worker 1631*dfc6aa5cSAndroid Build Coastguard WorkerA data source manager provides five methods: 1632*dfc6aa5cSAndroid Build Coastguard Worker 1633*dfc6aa5cSAndroid Build Coastguard Workerinit_source (j_decompress_ptr cinfo) 1634*dfc6aa5cSAndroid Build Coastguard Worker Initialize source. This is called by jpeg_read_header() before any 1635*dfc6aa5cSAndroid Build Coastguard Worker data is actually read. Unlike init_destination(), it may leave 1636*dfc6aa5cSAndroid Build Coastguard Worker bytes_in_buffer set to 0 (in which case a fill_input_buffer() call 1637*dfc6aa5cSAndroid Build Coastguard Worker will occur immediately). 1638*dfc6aa5cSAndroid Build Coastguard Worker 1639*dfc6aa5cSAndroid Build Coastguard Workerfill_input_buffer (j_decompress_ptr cinfo) 1640*dfc6aa5cSAndroid Build Coastguard Worker This is called whenever bytes_in_buffer has reached zero and more 1641*dfc6aa5cSAndroid Build Coastguard Worker data is wanted. In typical applications, it should read fresh data 1642*dfc6aa5cSAndroid Build Coastguard Worker into the buffer (ignoring the current state of next_input_byte and 1643*dfc6aa5cSAndroid Build Coastguard Worker bytes_in_buffer), reset the pointer & count to the start of the 1644*dfc6aa5cSAndroid Build Coastguard Worker buffer, and return TRUE indicating that the buffer has been reloaded. 1645*dfc6aa5cSAndroid Build Coastguard Worker It is not necessary to fill the buffer entirely, only to obtain at 1646*dfc6aa5cSAndroid Build Coastguard Worker least one more byte. bytes_in_buffer MUST be set to a positive value 1647*dfc6aa5cSAndroid Build Coastguard Worker if TRUE is returned. A FALSE return should only be used when I/O 1648*dfc6aa5cSAndroid Build Coastguard Worker suspension is desired (this mode is discussed in the next section). 1649*dfc6aa5cSAndroid Build Coastguard Worker 1650*dfc6aa5cSAndroid Build Coastguard Workerskip_input_data (j_decompress_ptr cinfo, long num_bytes) 1651*dfc6aa5cSAndroid Build Coastguard Worker Skip num_bytes worth of data. The buffer pointer and count should 1652*dfc6aa5cSAndroid Build Coastguard Worker be advanced over num_bytes input bytes, refilling the buffer as 1653*dfc6aa5cSAndroid Build Coastguard Worker needed. This is used to skip over a potentially large amount of 1654*dfc6aa5cSAndroid Build Coastguard Worker uninteresting data (such as an APPn marker). In some applications 1655*dfc6aa5cSAndroid Build Coastguard Worker it may be possible to optimize away the reading of the skipped data, 1656*dfc6aa5cSAndroid Build Coastguard Worker but it's not clear that being smart is worth much trouble; large 1657*dfc6aa5cSAndroid Build Coastguard Worker skips are uncommon. bytes_in_buffer may be zero on return. 1658*dfc6aa5cSAndroid Build Coastguard Worker A zero or negative skip count should be treated as a no-op. 1659*dfc6aa5cSAndroid Build Coastguard Worker 1660*dfc6aa5cSAndroid Build Coastguard Workerresync_to_restart (j_decompress_ptr cinfo, int desired) 1661*dfc6aa5cSAndroid Build Coastguard Worker This routine is called only when the decompressor has failed to find 1662*dfc6aa5cSAndroid Build Coastguard Worker a restart (RSTn) marker where one is expected. Its mission is to 1663*dfc6aa5cSAndroid Build Coastguard Worker find a suitable point for resuming decompression. For most 1664*dfc6aa5cSAndroid Build Coastguard Worker applications, we recommend that you just use the default resync 1665*dfc6aa5cSAndroid Build Coastguard Worker procedure, jpeg_resync_to_restart(). However, if you are able to back 1666*dfc6aa5cSAndroid Build Coastguard Worker up in the input data stream, or if you have a-priori knowledge about 1667*dfc6aa5cSAndroid Build Coastguard Worker the likely location of restart markers, you may be able to do better. 1668*dfc6aa5cSAndroid Build Coastguard Worker Read the read_restart_marker() and jpeg_resync_to_restart() routines 1669*dfc6aa5cSAndroid Build Coastguard Worker in jdmarker.c if you think you'd like to implement your own resync 1670*dfc6aa5cSAndroid Build Coastguard Worker procedure. 1671*dfc6aa5cSAndroid Build Coastguard Worker 1672*dfc6aa5cSAndroid Build Coastguard Workerterm_source (j_decompress_ptr cinfo) 1673*dfc6aa5cSAndroid Build Coastguard Worker Terminate source --- called by jpeg_finish_decompress() after all 1674*dfc6aa5cSAndroid Build Coastguard Worker data has been read. Often a no-op. 1675*dfc6aa5cSAndroid Build Coastguard Worker 1676*dfc6aa5cSAndroid Build Coastguard WorkerFor both fill_input_buffer() and skip_input_data(), there is no such thing 1677*dfc6aa5cSAndroid Build Coastguard Workeras an EOF return. If the end of the file has been reached, the routine has 1678*dfc6aa5cSAndroid Build Coastguard Workera choice of exiting via ERREXIT() or inserting fake data into the buffer. 1679*dfc6aa5cSAndroid Build Coastguard WorkerIn most cases, generating a warning message and inserting a fake EOI marker 1680*dfc6aa5cSAndroid Build Coastguard Workeris the best course of action --- this will allow the decompressor to output 1681*dfc6aa5cSAndroid Build Coastguard Workerhowever much of the image is there. In pathological cases, the decompressor 1682*dfc6aa5cSAndroid Build Coastguard Workermay swallow the EOI and again demand data ... just keep feeding it fake EOIs. 1683*dfc6aa5cSAndroid Build Coastguard Workerjdatasrc.c illustrates the recommended error recovery behavior. 1684*dfc6aa5cSAndroid Build Coastguard Worker 1685*dfc6aa5cSAndroid Build Coastguard Workerterm_source() is NOT called by jpeg_abort() or jpeg_destroy(). If you want 1686*dfc6aa5cSAndroid Build Coastguard Workerthe source manager to be cleaned up during an abort, you must do it yourself. 1687*dfc6aa5cSAndroid Build Coastguard Worker 1688*dfc6aa5cSAndroid Build Coastguard WorkerYou will also need code to create a jpeg_source_mgr struct, fill in its method 1689*dfc6aa5cSAndroid Build Coastguard Workerpointers, and insert a pointer to the struct into the "src" field of the JPEG 1690*dfc6aa5cSAndroid Build Coastguard Workerdecompression object. This can be done in-line in your setup code if you 1691*dfc6aa5cSAndroid Build Coastguard Workerlike, but it's probably cleaner to provide a separate routine similar to the 1692*dfc6aa5cSAndroid Build Coastguard Workerjpeg_stdio_src() or jpeg_mem_src() routines of the supplied source managers. 1693*dfc6aa5cSAndroid Build Coastguard Worker 1694*dfc6aa5cSAndroid Build Coastguard WorkerFor more information, consult the memory and stdio source and destination 1695*dfc6aa5cSAndroid Build Coastguard Workermanagers in jdatasrc.c and jdatadst.c. 1696*dfc6aa5cSAndroid Build Coastguard Worker 1697*dfc6aa5cSAndroid Build Coastguard Worker 1698*dfc6aa5cSAndroid Build Coastguard WorkerI/O suspension 1699*dfc6aa5cSAndroid Build Coastguard Worker-------------- 1700*dfc6aa5cSAndroid Build Coastguard Worker 1701*dfc6aa5cSAndroid Build Coastguard WorkerSome applications need to use the JPEG library as an incremental memory-to- 1702*dfc6aa5cSAndroid Build Coastguard Workermemory filter: when the compressed data buffer is filled or emptied, they want 1703*dfc6aa5cSAndroid Build Coastguard Workercontrol to return to the outer loop, rather than expecting that the buffer can 1704*dfc6aa5cSAndroid Build Coastguard Workerbe emptied or reloaded within the data source/destination manager subroutine. 1705*dfc6aa5cSAndroid Build Coastguard WorkerThe library supports this need by providing an "I/O suspension" mode, which we 1706*dfc6aa5cSAndroid Build Coastguard Workerdescribe in this section. 1707*dfc6aa5cSAndroid Build Coastguard Worker 1708*dfc6aa5cSAndroid Build Coastguard WorkerThe I/O suspension mode is not a panacea: nothing is guaranteed about the 1709*dfc6aa5cSAndroid Build Coastguard Workermaximum amount of time spent in any one call to the library, so it will not 1710*dfc6aa5cSAndroid Build Coastguard Workereliminate response-time problems in single-threaded applications. If you 1711*dfc6aa5cSAndroid Build Coastguard Workerneed guaranteed response time, we suggest you "bite the bullet" and implement 1712*dfc6aa5cSAndroid Build Coastguard Workera real multi-tasking capability. 1713*dfc6aa5cSAndroid Build Coastguard Worker 1714*dfc6aa5cSAndroid Build Coastguard WorkerTo use I/O suspension, cooperation is needed between the calling application 1715*dfc6aa5cSAndroid Build Coastguard Workerand the data source or destination manager; you will always need a custom 1716*dfc6aa5cSAndroid Build Coastguard Workersource/destination manager. (Please read the previous section if you haven't 1717*dfc6aa5cSAndroid Build Coastguard Workeralready.) The basic idea is that the empty_output_buffer() or 1718*dfc6aa5cSAndroid Build Coastguard Workerfill_input_buffer() routine is a no-op, merely returning FALSE to indicate 1719*dfc6aa5cSAndroid Build Coastguard Workerthat it has done nothing. Upon seeing this, the JPEG library suspends 1720*dfc6aa5cSAndroid Build Coastguard Workeroperation and returns to its caller. The surrounding application is 1721*dfc6aa5cSAndroid Build Coastguard Workerresponsible for emptying or refilling the work buffer before calling the 1722*dfc6aa5cSAndroid Build Coastguard WorkerJPEG library again. 1723*dfc6aa5cSAndroid Build Coastguard Worker 1724*dfc6aa5cSAndroid Build Coastguard WorkerCompression suspension: 1725*dfc6aa5cSAndroid Build Coastguard Worker 1726*dfc6aa5cSAndroid Build Coastguard WorkerFor compression suspension, use an empty_output_buffer() routine that returns 1727*dfc6aa5cSAndroid Build Coastguard WorkerFALSE; typically it will not do anything else. This will cause the 1728*dfc6aa5cSAndroid Build Coastguard Workercompressor to return to the caller of jpeg_write_scanlines(), with the return 1729*dfc6aa5cSAndroid Build Coastguard Workervalue indicating that not all the supplied scanlines have been accepted. 1730*dfc6aa5cSAndroid Build Coastguard WorkerThe application must make more room in the output buffer, adjust the output 1731*dfc6aa5cSAndroid Build Coastguard Workerbuffer pointer/count appropriately, and then call jpeg_write_scanlines() 1732*dfc6aa5cSAndroid Build Coastguard Workeragain, pointing to the first unconsumed scanline. 1733*dfc6aa5cSAndroid Build Coastguard Worker 1734*dfc6aa5cSAndroid Build Coastguard WorkerWhen forced to suspend, the compressor will backtrack to a convenient stopping 1735*dfc6aa5cSAndroid Build Coastguard Workerpoint (usually the start of the current MCU); it will regenerate some output 1736*dfc6aa5cSAndroid Build Coastguard Workerdata when restarted. Therefore, although empty_output_buffer() is only 1737*dfc6aa5cSAndroid Build Coastguard Workercalled when the buffer is filled, you should NOT write out the entire buffer 1738*dfc6aa5cSAndroid Build Coastguard Workerafter a suspension. Write only the data up to the current position of 1739*dfc6aa5cSAndroid Build Coastguard Workernext_output_byte/free_in_buffer. The data beyond that point will be 1740*dfc6aa5cSAndroid Build Coastguard Workerregenerated after resumption. 1741*dfc6aa5cSAndroid Build Coastguard Worker 1742*dfc6aa5cSAndroid Build Coastguard WorkerBecause of the backtracking behavior, a good-size output buffer is essential 1743*dfc6aa5cSAndroid Build Coastguard Workerfor efficiency; you don't want the compressor to suspend often. (In fact, an 1744*dfc6aa5cSAndroid Build Coastguard Workeroverly small buffer could lead to infinite looping, if a single MCU required 1745*dfc6aa5cSAndroid Build Coastguard Workermore data than would fit in the buffer.) We recommend a buffer of at least 1746*dfc6aa5cSAndroid Build Coastguard Workerseveral Kbytes. You may want to insert explicit code to ensure that you don't 1747*dfc6aa5cSAndroid Build Coastguard Workercall jpeg_write_scanlines() unless there is a reasonable amount of space in 1748*dfc6aa5cSAndroid Build Coastguard Workerthe output buffer; in other words, flush the buffer before trying to compress 1749*dfc6aa5cSAndroid Build Coastguard Workermore data. 1750*dfc6aa5cSAndroid Build Coastguard Worker 1751*dfc6aa5cSAndroid Build Coastguard WorkerThe compressor does not allow suspension while it is trying to write JPEG 1752*dfc6aa5cSAndroid Build Coastguard Workermarkers at the beginning and end of the file. This means that: 1753*dfc6aa5cSAndroid Build Coastguard Worker * At the beginning of a compression operation, there must be enough free 1754*dfc6aa5cSAndroid Build Coastguard Worker space in the output buffer to hold the header markers (typically 600 or 1755*dfc6aa5cSAndroid Build Coastguard Worker so bytes). The recommended buffer size is bigger than this anyway, so 1756*dfc6aa5cSAndroid Build Coastguard Worker this is not a problem as long as you start with an empty buffer. However, 1757*dfc6aa5cSAndroid Build Coastguard Worker this restriction might catch you if you insert large special markers, such 1758*dfc6aa5cSAndroid Build Coastguard Worker as a JFIF thumbnail image, without flushing the buffer afterwards. 1759*dfc6aa5cSAndroid Build Coastguard Worker * When you call jpeg_finish_compress(), there must be enough space in the 1760*dfc6aa5cSAndroid Build Coastguard Worker output buffer to emit any buffered data and the final EOI marker. In the 1761*dfc6aa5cSAndroid Build Coastguard Worker current implementation, half a dozen bytes should suffice for this, but 1762*dfc6aa5cSAndroid Build Coastguard Worker for safety's sake we recommend ensuring that at least 100 bytes are free 1763*dfc6aa5cSAndroid Build Coastguard Worker before calling jpeg_finish_compress(). 1764*dfc6aa5cSAndroid Build Coastguard Worker 1765*dfc6aa5cSAndroid Build Coastguard WorkerA more significant restriction is that jpeg_finish_compress() cannot suspend. 1766*dfc6aa5cSAndroid Build Coastguard WorkerThis means you cannot use suspension with multi-pass operating modes, namely 1767*dfc6aa5cSAndroid Build Coastguard WorkerHuffman code optimization and multiple-scan output. Those modes write the 1768*dfc6aa5cSAndroid Build Coastguard Workerwhole file during jpeg_finish_compress(), which will certainly result in 1769*dfc6aa5cSAndroid Build Coastguard Workerbuffer overrun. (Note that this restriction applies only to compression, 1770*dfc6aa5cSAndroid Build Coastguard Workernot decompression. The decompressor supports input suspension in all of its 1771*dfc6aa5cSAndroid Build Coastguard Workeroperating modes.) 1772*dfc6aa5cSAndroid Build Coastguard Worker 1773*dfc6aa5cSAndroid Build Coastguard WorkerDecompression suspension: 1774*dfc6aa5cSAndroid Build Coastguard Worker 1775*dfc6aa5cSAndroid Build Coastguard WorkerFor decompression suspension, use a fill_input_buffer() routine that simply 1776*dfc6aa5cSAndroid Build Coastguard Workerreturns FALSE (except perhaps during error recovery, as discussed below). 1777*dfc6aa5cSAndroid Build Coastguard WorkerThis will cause the decompressor to return to its caller with an indication 1778*dfc6aa5cSAndroid Build Coastguard Workerthat suspension has occurred. This can happen at four places: 1779*dfc6aa5cSAndroid Build Coastguard Worker * jpeg_read_header(): will return JPEG_SUSPENDED. 1780*dfc6aa5cSAndroid Build Coastguard Worker * jpeg_start_decompress(): will return FALSE, rather than its usual TRUE. 1781*dfc6aa5cSAndroid Build Coastguard Worker * jpeg_read_scanlines(): will return the number of scanlines already 1782*dfc6aa5cSAndroid Build Coastguard Worker completed (possibly 0). 1783*dfc6aa5cSAndroid Build Coastguard Worker * jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE. 1784*dfc6aa5cSAndroid Build Coastguard WorkerThe surrounding application must recognize these cases, load more data into 1785*dfc6aa5cSAndroid Build Coastguard Workerthe input buffer, and repeat the call. In the case of jpeg_read_scanlines(), 1786*dfc6aa5cSAndroid Build Coastguard Workerincrement the passed pointers past any scanlines successfully read. 1787*dfc6aa5cSAndroid Build Coastguard Worker 1788*dfc6aa5cSAndroid Build Coastguard WorkerJust as with compression, the decompressor will typically backtrack to a 1789*dfc6aa5cSAndroid Build Coastguard Workerconvenient restart point before suspending. When fill_input_buffer() is 1790*dfc6aa5cSAndroid Build Coastguard Workercalled, next_input_byte/bytes_in_buffer point to the current restart point, 1791*dfc6aa5cSAndroid Build Coastguard Workerwhich is where the decompressor will backtrack to if FALSE is returned. 1792*dfc6aa5cSAndroid Build Coastguard WorkerThe data beyond that position must NOT be discarded if you suspend; it needs 1793*dfc6aa5cSAndroid Build Coastguard Workerto be re-read upon resumption. In most implementations, you'll need to shift 1794*dfc6aa5cSAndroid Build Coastguard Workerthis data down to the start of your work buffer and then load more data after 1795*dfc6aa5cSAndroid Build Coastguard Workerit. Again, this behavior means that a several-Kbyte work buffer is essential 1796*dfc6aa5cSAndroid Build Coastguard Workerfor decent performance; furthermore, you should load a reasonable amount of 1797*dfc6aa5cSAndroid Build Coastguard Workernew data before resuming decompression. (If you loaded, say, only one new 1798*dfc6aa5cSAndroid Build Coastguard Workerbyte each time around, you could waste a LOT of cycles.) 1799*dfc6aa5cSAndroid Build Coastguard Worker 1800*dfc6aa5cSAndroid Build Coastguard WorkerThe skip_input_data() source manager routine requires special care in a 1801*dfc6aa5cSAndroid Build Coastguard Workersuspension scenario. This routine is NOT granted the ability to suspend the 1802*dfc6aa5cSAndroid Build Coastguard Workerdecompressor; it can decrement bytes_in_buffer to zero, but no more. If the 1803*dfc6aa5cSAndroid Build Coastguard Workerrequested skip distance exceeds the amount of data currently in the input 1804*dfc6aa5cSAndroid Build Coastguard Workerbuffer, then skip_input_data() must set bytes_in_buffer to zero and record the 1805*dfc6aa5cSAndroid Build Coastguard Workeradditional skip distance somewhere else. The decompressor will immediately 1806*dfc6aa5cSAndroid Build Coastguard Workercall fill_input_buffer(), which should return FALSE, which will cause a 1807*dfc6aa5cSAndroid Build Coastguard Workersuspension return. The surrounding application must then arrange to discard 1808*dfc6aa5cSAndroid Build Coastguard Workerthe recorded number of bytes before it resumes loading the input buffer. 1809*dfc6aa5cSAndroid Build Coastguard Worker(Yes, this design is rather baroque, but it avoids complexity in the far more 1810*dfc6aa5cSAndroid Build Coastguard Workercommon case where a non-suspending source manager is used.) 1811*dfc6aa5cSAndroid Build Coastguard Worker 1812*dfc6aa5cSAndroid Build Coastguard WorkerIf the input data has been exhausted, we recommend that you emit a warning 1813*dfc6aa5cSAndroid Build Coastguard Workerand insert dummy EOI markers just as a non-suspending data source manager 1814*dfc6aa5cSAndroid Build Coastguard Workerwould do. This can be handled either in the surrounding application logic or 1815*dfc6aa5cSAndroid Build Coastguard Workerwithin fill_input_buffer(); the latter is probably more efficient. If 1816*dfc6aa5cSAndroid Build Coastguard Workerfill_input_buffer() knows that no more data is available, it can set the 1817*dfc6aa5cSAndroid Build Coastguard Workerpointer/count to point to a dummy EOI marker and then return TRUE just as 1818*dfc6aa5cSAndroid Build Coastguard Workerthough it had read more data in a non-suspending situation. 1819*dfc6aa5cSAndroid Build Coastguard Worker 1820*dfc6aa5cSAndroid Build Coastguard WorkerThe decompressor does not attempt to suspend within standard JPEG markers; 1821*dfc6aa5cSAndroid Build Coastguard Workerinstead it will backtrack to the start of the marker and reprocess the whole 1822*dfc6aa5cSAndroid Build Coastguard Workermarker next time. Hence the input buffer must be large enough to hold the 1823*dfc6aa5cSAndroid Build Coastguard Workerlongest standard marker in the file. Standard JPEG markers should normally 1824*dfc6aa5cSAndroid Build Coastguard Workernot exceed a few hundred bytes each (DHT tables are typically the longest). 1825*dfc6aa5cSAndroid Build Coastguard WorkerWe recommend at least a 2K buffer for performance reasons, which is much 1826*dfc6aa5cSAndroid Build Coastguard Workerlarger than any correct marker is likely to be. For robustness against 1827*dfc6aa5cSAndroid Build Coastguard Workerdamaged marker length counts, you may wish to insert a test in your 1828*dfc6aa5cSAndroid Build Coastguard Workerapplication for the case that the input buffer is completely full and yet 1829*dfc6aa5cSAndroid Build Coastguard Workerthe decoder has suspended without consuming any data --- otherwise, if this 1830*dfc6aa5cSAndroid Build Coastguard Workersituation did occur, it would lead to an endless loop. (The library can't 1831*dfc6aa5cSAndroid Build Coastguard Workerprovide this test since it has no idea whether "the buffer is full", or 1832*dfc6aa5cSAndroid Build Coastguard Workereven whether there is a fixed-size input buffer.) 1833*dfc6aa5cSAndroid Build Coastguard Worker 1834*dfc6aa5cSAndroid Build Coastguard WorkerThe input buffer would need to be 64K to allow for arbitrary COM or APPn 1835*dfc6aa5cSAndroid Build Coastguard Workermarkers, but these are handled specially: they are either saved into allocated 1836*dfc6aa5cSAndroid Build Coastguard Workermemory, or skipped over by calling skip_input_data(). In the former case, 1837*dfc6aa5cSAndroid Build Coastguard Workersuspension is handled correctly, and in the latter case, the problem of 1838*dfc6aa5cSAndroid Build Coastguard Workerbuffer overrun is placed on skip_input_data's shoulders, as explained above. 1839*dfc6aa5cSAndroid Build Coastguard WorkerNote that if you provide your own marker handling routine for large markers, 1840*dfc6aa5cSAndroid Build Coastguard Workeryou should consider how to deal with buffer overflow. 1841*dfc6aa5cSAndroid Build Coastguard Worker 1842*dfc6aa5cSAndroid Build Coastguard WorkerMultiple-buffer management: 1843*dfc6aa5cSAndroid Build Coastguard Worker 1844*dfc6aa5cSAndroid Build Coastguard WorkerIn some applications it is desirable to store the compressed data in a linked 1845*dfc6aa5cSAndroid Build Coastguard Workerlist of buffer areas, so as to avoid data copying. This can be handled by 1846*dfc6aa5cSAndroid Build Coastguard Workerhaving empty_output_buffer() or fill_input_buffer() set the pointer and count 1847*dfc6aa5cSAndroid Build Coastguard Workerto reference the next available buffer; FALSE is returned only if no more 1848*dfc6aa5cSAndroid Build Coastguard Workerbuffers are available. Although seemingly straightforward, there is a 1849*dfc6aa5cSAndroid Build Coastguard Workerpitfall in this approach: the backtrack that occurs when FALSE is returned 1850*dfc6aa5cSAndroid Build Coastguard Workercould back up into an earlier buffer. For example, when fill_input_buffer() 1851*dfc6aa5cSAndroid Build Coastguard Workeris called, the current pointer & count indicate the backtrack restart point. 1852*dfc6aa5cSAndroid Build Coastguard WorkerSince fill_input_buffer() will set the pointer and count to refer to a new 1853*dfc6aa5cSAndroid Build Coastguard Workerbuffer, the restart position must be saved somewhere else. Suppose a second 1854*dfc6aa5cSAndroid Build Coastguard Workercall to fill_input_buffer() occurs in the same library call, and no 1855*dfc6aa5cSAndroid Build Coastguard Workeradditional input data is available, so fill_input_buffer must return FALSE. 1856*dfc6aa5cSAndroid Build Coastguard WorkerIf the JPEG library has not moved the pointer/count forward in the current 1857*dfc6aa5cSAndroid Build Coastguard Workerbuffer, then *the correct restart point is the saved position in the prior 1858*dfc6aa5cSAndroid Build Coastguard Workerbuffer*. Prior buffers may be discarded only after the library establishes 1859*dfc6aa5cSAndroid Build Coastguard Workera restart point within a later buffer. Similar remarks apply for output into 1860*dfc6aa5cSAndroid Build Coastguard Workera chain of buffers. 1861*dfc6aa5cSAndroid Build Coastguard Worker 1862*dfc6aa5cSAndroid Build Coastguard WorkerThe library will never attempt to backtrack over a skip_input_data() call, 1863*dfc6aa5cSAndroid Build Coastguard Workerso any skipped data can be permanently discarded. You still have to deal 1864*dfc6aa5cSAndroid Build Coastguard Workerwith the case of skipping not-yet-received data, however. 1865*dfc6aa5cSAndroid Build Coastguard Worker 1866*dfc6aa5cSAndroid Build Coastguard WorkerIt's much simpler to use only a single buffer; when fill_input_buffer() is 1867*dfc6aa5cSAndroid Build Coastguard Workercalled, move any unconsumed data (beyond the current pointer/count) down to 1868*dfc6aa5cSAndroid Build Coastguard Workerthe beginning of this buffer and then load new data into the remaining buffer 1869*dfc6aa5cSAndroid Build Coastguard Workerspace. This approach requires a little more data copying but is far easier 1870*dfc6aa5cSAndroid Build Coastguard Workerto get right. 1871*dfc6aa5cSAndroid Build Coastguard Worker 1872*dfc6aa5cSAndroid Build Coastguard Worker 1873*dfc6aa5cSAndroid Build Coastguard WorkerProgressive JPEG support 1874*dfc6aa5cSAndroid Build Coastguard Worker------------------------ 1875*dfc6aa5cSAndroid Build Coastguard Worker 1876*dfc6aa5cSAndroid Build Coastguard WorkerProgressive JPEG rearranges the stored data into a series of scans of 1877*dfc6aa5cSAndroid Build Coastguard Workerincreasing quality. In situations where a JPEG file is transmitted across a 1878*dfc6aa5cSAndroid Build Coastguard Workerslow communications link, a decoder can generate a low-quality image very 1879*dfc6aa5cSAndroid Build Coastguard Workerquickly from the first scan, then gradually improve the displayed quality as 1880*dfc6aa5cSAndroid Build Coastguard Workermore scans are received. The final image after all scans are complete is 1881*dfc6aa5cSAndroid Build Coastguard Workeridentical to that of a regular (sequential) JPEG file of the same quality 1882*dfc6aa5cSAndroid Build Coastguard Workersetting. Progressive JPEG files are often slightly smaller than equivalent 1883*dfc6aa5cSAndroid Build Coastguard Workersequential JPEG files, but the possibility of incremental display is the main 1884*dfc6aa5cSAndroid Build Coastguard Workerreason for using progressive JPEG. 1885*dfc6aa5cSAndroid Build Coastguard Worker 1886*dfc6aa5cSAndroid Build Coastguard WorkerThe IJG encoder library generates progressive JPEG files when given a 1887*dfc6aa5cSAndroid Build Coastguard Workersuitable "scan script" defining how to divide the data into scans. 1888*dfc6aa5cSAndroid Build Coastguard WorkerCreation of progressive JPEG files is otherwise transparent to the encoder. 1889*dfc6aa5cSAndroid Build Coastguard WorkerProgressive JPEG files can also be read transparently by the decoder library. 1890*dfc6aa5cSAndroid Build Coastguard WorkerIf the decoding application simply uses the library as defined above, it 1891*dfc6aa5cSAndroid Build Coastguard Workerwill receive a final decoded image without any indication that the file was 1892*dfc6aa5cSAndroid Build Coastguard Workerprogressive. Of course, this approach does not allow incremental display. 1893*dfc6aa5cSAndroid Build Coastguard WorkerTo perform incremental display, an application needs to use the decoder 1894*dfc6aa5cSAndroid Build Coastguard Workerlibrary's "buffered-image" mode, in which it receives a decoded image 1895*dfc6aa5cSAndroid Build Coastguard Workermultiple times. 1896*dfc6aa5cSAndroid Build Coastguard Worker 1897*dfc6aa5cSAndroid Build Coastguard WorkerEach displayed scan requires about as much work to decode as a full JPEG 1898*dfc6aa5cSAndroid Build Coastguard Workerimage of the same size, so the decoder must be fairly fast in relation to the 1899*dfc6aa5cSAndroid Build Coastguard Workerdata transmission rate in order to make incremental display useful. However, 1900*dfc6aa5cSAndroid Build Coastguard Workerit is possible to skip displaying the image and simply add the incoming bits 1901*dfc6aa5cSAndroid Build Coastguard Workerto the decoder's coefficient buffer. This is fast because only Huffman 1902*dfc6aa5cSAndroid Build Coastguard Workerdecoding need be done, not IDCT, upsampling, colorspace conversion, etc. 1903*dfc6aa5cSAndroid Build Coastguard WorkerThe IJG decoder library allows the application to switch dynamically between 1904*dfc6aa5cSAndroid Build Coastguard Workerdisplaying the image and simply absorbing the incoming bits. A properly 1905*dfc6aa5cSAndroid Build Coastguard Workercoded application can automatically adapt the number of display passes to 1906*dfc6aa5cSAndroid Build Coastguard Workersuit the time available as the image is received. Also, a final 1907*dfc6aa5cSAndroid Build Coastguard Workerhigher-quality display cycle can be performed from the buffered data after 1908*dfc6aa5cSAndroid Build Coastguard Workerthe end of the file is reached. 1909*dfc6aa5cSAndroid Build Coastguard Worker 1910*dfc6aa5cSAndroid Build Coastguard WorkerProgressive compression: 1911*dfc6aa5cSAndroid Build Coastguard Worker 1912*dfc6aa5cSAndroid Build Coastguard WorkerTo create a progressive JPEG file (or a multiple-scan sequential JPEG file), 1913*dfc6aa5cSAndroid Build Coastguard Workerset the scan_info cinfo field to point to an array of scan descriptors, and 1914*dfc6aa5cSAndroid Build Coastguard Workerperform compression as usual. Instead of constructing your own scan list, 1915*dfc6aa5cSAndroid Build Coastguard Workeryou can call the jpeg_simple_progression() helper routine to create a 1916*dfc6aa5cSAndroid Build Coastguard Workerrecommended progression sequence; this method should be used by all 1917*dfc6aa5cSAndroid Build Coastguard Workerapplications that don't want to get involved in the nitty-gritty of 1918*dfc6aa5cSAndroid Build Coastguard Workerprogressive scan sequence design. (If you want to provide user control of 1919*dfc6aa5cSAndroid Build Coastguard Workerscan sequences, you may wish to borrow the scan script reading code found 1920*dfc6aa5cSAndroid Build Coastguard Workerin rdswitch.c, so that you can read scan script files just like cjpeg's.) 1921*dfc6aa5cSAndroid Build Coastguard WorkerWhen scan_info is not NULL, the compression library will store DCT'd data 1922*dfc6aa5cSAndroid Build Coastguard Workerinto a buffer array as jpeg_write_scanlines() is called, and will emit all 1923*dfc6aa5cSAndroid Build Coastguard Workerthe requested scans during jpeg_finish_compress(). This implies that 1924*dfc6aa5cSAndroid Build Coastguard Workermultiple-scan output cannot be created with a suspending data destination 1925*dfc6aa5cSAndroid Build Coastguard Workermanager, since jpeg_finish_compress() does not support suspension. We 1926*dfc6aa5cSAndroid Build Coastguard Workershould also note that the compressor currently forces Huffman optimization 1927*dfc6aa5cSAndroid Build Coastguard Workermode when creating a progressive JPEG file, because the default Huffman 1928*dfc6aa5cSAndroid Build Coastguard Workertables are unsuitable for progressive files. 1929*dfc6aa5cSAndroid Build Coastguard Worker 1930*dfc6aa5cSAndroid Build Coastguard WorkerProgressive decompression: 1931*dfc6aa5cSAndroid Build Coastguard Worker 1932*dfc6aa5cSAndroid Build Coastguard WorkerWhen buffered-image mode is not used, the decoder library will read all of 1933*dfc6aa5cSAndroid Build Coastguard Workera multi-scan file during jpeg_start_decompress(), so that it can provide a 1934*dfc6aa5cSAndroid Build Coastguard Workerfinal decoded image. (Here "multi-scan" means either progressive or 1935*dfc6aa5cSAndroid Build Coastguard Workermulti-scan sequential.) This makes multi-scan files transparent to the 1936*dfc6aa5cSAndroid Build Coastguard Workerdecoding application. However, existing applications that used suspending 1937*dfc6aa5cSAndroid Build Coastguard Workerinput with version 5 of the IJG library will need to be modified to check 1938*dfc6aa5cSAndroid Build Coastguard Workerfor a suspension return from jpeg_start_decompress(). 1939*dfc6aa5cSAndroid Build Coastguard Worker 1940*dfc6aa5cSAndroid Build Coastguard WorkerTo perform incremental display, an application must use the library's 1941*dfc6aa5cSAndroid Build Coastguard Workerbuffered-image mode. This is described in the next section. 1942*dfc6aa5cSAndroid Build Coastguard Worker 1943*dfc6aa5cSAndroid Build Coastguard Worker 1944*dfc6aa5cSAndroid Build Coastguard WorkerBuffered-image mode 1945*dfc6aa5cSAndroid Build Coastguard Worker------------------- 1946*dfc6aa5cSAndroid Build Coastguard Worker 1947*dfc6aa5cSAndroid Build Coastguard WorkerIn buffered-image mode, the library stores the partially decoded image in a 1948*dfc6aa5cSAndroid Build Coastguard Workercoefficient buffer, from which it can be read out as many times as desired. 1949*dfc6aa5cSAndroid Build Coastguard WorkerThis mode is typically used for incremental display of progressive JPEG files, 1950*dfc6aa5cSAndroid Build Coastguard Workerbut it can be used with any JPEG file. Each scan of a progressive JPEG file 1951*dfc6aa5cSAndroid Build Coastguard Workeradds more data (more detail) to the buffered image. The application can 1952*dfc6aa5cSAndroid Build Coastguard Workerdisplay in lockstep with the source file (one display pass per input scan), 1953*dfc6aa5cSAndroid Build Coastguard Workeror it can allow input processing to outrun display processing. By making 1954*dfc6aa5cSAndroid Build Coastguard Workerinput and display processing run independently, it is possible for the 1955*dfc6aa5cSAndroid Build Coastguard Workerapplication to adapt progressive display to a wide range of data transmission 1956*dfc6aa5cSAndroid Build Coastguard Workerrates. 1957*dfc6aa5cSAndroid Build Coastguard Worker 1958*dfc6aa5cSAndroid Build Coastguard WorkerThe basic control flow for buffered-image decoding is 1959*dfc6aa5cSAndroid Build Coastguard Worker 1960*dfc6aa5cSAndroid Build Coastguard Worker jpeg_create_decompress() 1961*dfc6aa5cSAndroid Build Coastguard Worker set data source 1962*dfc6aa5cSAndroid Build Coastguard Worker jpeg_read_header() 1963*dfc6aa5cSAndroid Build Coastguard Worker set overall decompression parameters 1964*dfc6aa5cSAndroid Build Coastguard Worker cinfo.buffered_image = TRUE; /* select buffered-image mode */ 1965*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_decompress() 1966*dfc6aa5cSAndroid Build Coastguard Worker for (each output pass) { 1967*dfc6aa5cSAndroid Build Coastguard Worker adjust output decompression parameters if required 1968*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_output() /* start a new output pass */ 1969*dfc6aa5cSAndroid Build Coastguard Worker for (all scanlines in image) { 1970*dfc6aa5cSAndroid Build Coastguard Worker jpeg_read_scanlines() 1971*dfc6aa5cSAndroid Build Coastguard Worker display scanlines 1972*dfc6aa5cSAndroid Build Coastguard Worker } 1973*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_output() /* terminate output pass */ 1974*dfc6aa5cSAndroid Build Coastguard Worker } 1975*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_decompress() 1976*dfc6aa5cSAndroid Build Coastguard Worker jpeg_destroy_decompress() 1977*dfc6aa5cSAndroid Build Coastguard Worker 1978*dfc6aa5cSAndroid Build Coastguard WorkerThis differs from ordinary unbuffered decoding in that there is an additional 1979*dfc6aa5cSAndroid Build Coastguard Workerlevel of looping. The application can choose how many output passes to make 1980*dfc6aa5cSAndroid Build Coastguard Workerand how to display each pass. 1981*dfc6aa5cSAndroid Build Coastguard Worker 1982*dfc6aa5cSAndroid Build Coastguard WorkerThe simplest approach to displaying progressive images is to do one display 1983*dfc6aa5cSAndroid Build Coastguard Workerpass for each scan appearing in the input file. In this case the outer loop 1984*dfc6aa5cSAndroid Build Coastguard Workercondition is typically 1985*dfc6aa5cSAndroid Build Coastguard Worker while (!jpeg_input_complete(&cinfo)) 1986*dfc6aa5cSAndroid Build Coastguard Workerand the start-output call should read 1987*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_output(&cinfo, cinfo.input_scan_number); 1988*dfc6aa5cSAndroid Build Coastguard WorkerThe second parameter to jpeg_start_output() indicates which scan of the input 1989*dfc6aa5cSAndroid Build Coastguard Workerfile is to be displayed; the scans are numbered starting at 1 for this 1990*dfc6aa5cSAndroid Build Coastguard Workerpurpose. (You can use a loop counter starting at 1 if you like, but using 1991*dfc6aa5cSAndroid Build Coastguard Workerthe library's input scan counter is easier.) The library automatically reads 1992*dfc6aa5cSAndroid Build Coastguard Workerdata as necessary to complete each requested scan, and jpeg_finish_output() 1993*dfc6aa5cSAndroid Build Coastguard Workeradvances to the next scan or end-of-image marker (hence input_scan_number 1994*dfc6aa5cSAndroid Build Coastguard Workerwill be incremented by the time control arrives back at jpeg_start_output()). 1995*dfc6aa5cSAndroid Build Coastguard WorkerWith this technique, data is read from the input file only as needed, and 1996*dfc6aa5cSAndroid Build Coastguard Workerinput and output processing run in lockstep. 1997*dfc6aa5cSAndroid Build Coastguard Worker 1998*dfc6aa5cSAndroid Build Coastguard WorkerAfter reading the final scan and reaching the end of the input file, the 1999*dfc6aa5cSAndroid Build Coastguard Workerbuffered image remains available; it can be read additional times by 2000*dfc6aa5cSAndroid Build Coastguard Workerrepeating the jpeg_start_output()/jpeg_read_scanlines()/jpeg_finish_output() 2001*dfc6aa5cSAndroid Build Coastguard Workersequence. For example, a useful technique is to use fast one-pass color 2002*dfc6aa5cSAndroid Build Coastguard Workerquantization for display passes made while the image is arriving, followed by 2003*dfc6aa5cSAndroid Build Coastguard Workera final display pass using two-pass quantization for highest quality. This 2004*dfc6aa5cSAndroid Build Coastguard Workeris done by changing the library parameters before the final output pass. 2005*dfc6aa5cSAndroid Build Coastguard WorkerChanging parameters between passes is discussed in detail below. 2006*dfc6aa5cSAndroid Build Coastguard Worker 2007*dfc6aa5cSAndroid Build Coastguard WorkerIn general the last scan of a progressive file cannot be recognized as such 2008*dfc6aa5cSAndroid Build Coastguard Workeruntil after it is read, so a post-input display pass is the best approach if 2009*dfc6aa5cSAndroid Build Coastguard Workeryou want special processing in the final pass. 2010*dfc6aa5cSAndroid Build Coastguard Worker 2011*dfc6aa5cSAndroid Build Coastguard WorkerWhen done with the image, be sure to call jpeg_finish_decompress() to release 2012*dfc6aa5cSAndroid Build Coastguard Workerthe buffered image (or just use jpeg_destroy_decompress()). 2013*dfc6aa5cSAndroid Build Coastguard Worker 2014*dfc6aa5cSAndroid Build Coastguard WorkerIf input data arrives faster than it can be displayed, the application can 2015*dfc6aa5cSAndroid Build Coastguard Workercause the library to decode input data in advance of what's needed to produce 2016*dfc6aa5cSAndroid Build Coastguard Workeroutput. This is done by calling the routine jpeg_consume_input(). 2017*dfc6aa5cSAndroid Build Coastguard WorkerThe return value is one of the following: 2018*dfc6aa5cSAndroid Build Coastguard Worker JPEG_REACHED_SOS: reached an SOS marker (the start of a new scan) 2019*dfc6aa5cSAndroid Build Coastguard Worker JPEG_REACHED_EOI: reached the EOI marker (end of image) 2020*dfc6aa5cSAndroid Build Coastguard Worker JPEG_ROW_COMPLETED: completed reading one MCU row of compressed data 2021*dfc6aa5cSAndroid Build Coastguard Worker JPEG_SCAN_COMPLETED: completed reading last MCU row of current scan 2022*dfc6aa5cSAndroid Build Coastguard Worker JPEG_SUSPENDED: suspended before completing any of the above 2023*dfc6aa5cSAndroid Build Coastguard Worker(JPEG_SUSPENDED can occur only if a suspending data source is used.) This 2024*dfc6aa5cSAndroid Build Coastguard Workerroutine can be called at any time after initializing the JPEG object. It 2025*dfc6aa5cSAndroid Build Coastguard Workerreads some additional data and returns when one of the indicated significant 2026*dfc6aa5cSAndroid Build Coastguard Workerevents occurs. (If called after the EOI marker is reached, it will 2027*dfc6aa5cSAndroid Build Coastguard Workerimmediately return JPEG_REACHED_EOI without attempting to read more data.) 2028*dfc6aa5cSAndroid Build Coastguard Worker 2029*dfc6aa5cSAndroid Build Coastguard WorkerThe library's output processing will automatically call jpeg_consume_input() 2030*dfc6aa5cSAndroid Build Coastguard Workerwhenever the output processing overtakes the input; thus, simple lockstep 2031*dfc6aa5cSAndroid Build Coastguard Workerdisplay requires no direct calls to jpeg_consume_input(). But by adding 2032*dfc6aa5cSAndroid Build Coastguard Workercalls to jpeg_consume_input(), you can absorb data in advance of what is 2033*dfc6aa5cSAndroid Build Coastguard Workerbeing displayed. This has two benefits: 2034*dfc6aa5cSAndroid Build Coastguard Worker * You can limit buildup of unprocessed data in your input buffer. 2035*dfc6aa5cSAndroid Build Coastguard Worker * You can eliminate extra display passes by paying attention to the 2036*dfc6aa5cSAndroid Build Coastguard Worker state of the library's input processing. 2037*dfc6aa5cSAndroid Build Coastguard Worker 2038*dfc6aa5cSAndroid Build Coastguard WorkerThe first of these benefits only requires interspersing calls to 2039*dfc6aa5cSAndroid Build Coastguard Workerjpeg_consume_input() with your display operations and any other processing 2040*dfc6aa5cSAndroid Build Coastguard Workeryou may be doing. To avoid wasting cycles due to backtracking, it's best to 2041*dfc6aa5cSAndroid Build Coastguard Workercall jpeg_consume_input() only after a hundred or so new bytes have arrived. 2042*dfc6aa5cSAndroid Build Coastguard WorkerThis is discussed further under "I/O suspension", above. (Note: the JPEG 2043*dfc6aa5cSAndroid Build Coastguard Workerlibrary currently is not thread-safe. You must not call jpeg_consume_input() 2044*dfc6aa5cSAndroid Build Coastguard Workerfrom one thread of control if a different library routine is working on the 2045*dfc6aa5cSAndroid Build Coastguard Workersame JPEG object in another thread.) 2046*dfc6aa5cSAndroid Build Coastguard Worker 2047*dfc6aa5cSAndroid Build Coastguard WorkerWhen input arrives fast enough that more than one new scan is available 2048*dfc6aa5cSAndroid Build Coastguard Workerbefore you start a new output pass, you may as well skip the output pass 2049*dfc6aa5cSAndroid Build Coastguard Workercorresponding to the completed scan. This occurs for free if you pass 2050*dfc6aa5cSAndroid Build Coastguard Workercinfo.input_scan_number as the target scan number to jpeg_start_output(). 2051*dfc6aa5cSAndroid Build Coastguard WorkerThe input_scan_number field is simply the index of the scan currently being 2052*dfc6aa5cSAndroid Build Coastguard Workerconsumed by the input processor. You can ensure that this is up-to-date by 2053*dfc6aa5cSAndroid Build Coastguard Workeremptying the input buffer just before calling jpeg_start_output(): call 2054*dfc6aa5cSAndroid Build Coastguard Workerjpeg_consume_input() repeatedly until it returns JPEG_SUSPENDED or 2055*dfc6aa5cSAndroid Build Coastguard WorkerJPEG_REACHED_EOI. 2056*dfc6aa5cSAndroid Build Coastguard Worker 2057*dfc6aa5cSAndroid Build Coastguard WorkerThe target scan number passed to jpeg_start_output() is saved in the 2058*dfc6aa5cSAndroid Build Coastguard Workercinfo.output_scan_number field. The library's output processing calls 2059*dfc6aa5cSAndroid Build Coastguard Workerjpeg_consume_input() whenever the current input scan number and row within 2060*dfc6aa5cSAndroid Build Coastguard Workerthat scan is less than or equal to the current output scan number and row. 2061*dfc6aa5cSAndroid Build Coastguard WorkerThus, input processing can "get ahead" of the output processing but is not 2062*dfc6aa5cSAndroid Build Coastguard Workerallowed to "fall behind". You can achieve several different effects by 2063*dfc6aa5cSAndroid Build Coastguard Workermanipulating this interlock rule. For example, if you pass a target scan 2064*dfc6aa5cSAndroid Build Coastguard Workernumber greater than the current input scan number, the output processor will 2065*dfc6aa5cSAndroid Build Coastguard Workerwait until that scan starts to arrive before producing any output. (To avoid 2066*dfc6aa5cSAndroid Build Coastguard Workeran infinite loop, the target scan number is automatically reset to the last 2067*dfc6aa5cSAndroid Build Coastguard Workerscan number when the end of image is reached. Thus, if you specify a large 2068*dfc6aa5cSAndroid Build Coastguard Workertarget scan number, the library will just absorb the entire input file and 2069*dfc6aa5cSAndroid Build Coastguard Workerthen perform an output pass. This is effectively the same as what 2070*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_decompress() does when you don't select buffered-image mode.) 2071*dfc6aa5cSAndroid Build Coastguard WorkerWhen you pass a target scan number equal to the current input scan number, 2072*dfc6aa5cSAndroid Build Coastguard Workerthe image is displayed no faster than the current input scan arrives. The 2073*dfc6aa5cSAndroid Build Coastguard Workerfinal possibility is to pass a target scan number less than the current input 2074*dfc6aa5cSAndroid Build Coastguard Workerscan number; this disables the input/output interlock and causes the output 2075*dfc6aa5cSAndroid Build Coastguard Workerprocessor to simply display whatever it finds in the image buffer, without 2076*dfc6aa5cSAndroid Build Coastguard Workerwaiting for input. (However, the library will not accept a target scan 2077*dfc6aa5cSAndroid Build Coastguard Workernumber less than one, so you can't avoid waiting for the first scan.) 2078*dfc6aa5cSAndroid Build Coastguard Worker 2079*dfc6aa5cSAndroid Build Coastguard WorkerWhen data is arriving faster than the output display processing can advance 2080*dfc6aa5cSAndroid Build Coastguard Workerthrough the image, jpeg_consume_input() will store data into the buffered 2081*dfc6aa5cSAndroid Build Coastguard Workerimage beyond the point at which the output processing is reading data out 2082*dfc6aa5cSAndroid Build Coastguard Workeragain. If the input arrives fast enough, it may "wrap around" the buffer to 2083*dfc6aa5cSAndroid Build Coastguard Workerthe point where the input is more than one whole scan ahead of the output. 2084*dfc6aa5cSAndroid Build Coastguard WorkerIf the output processing simply proceeds through its display pass without 2085*dfc6aa5cSAndroid Build Coastguard Workerpaying attention to the input, the effect seen on-screen is that the lower 2086*dfc6aa5cSAndroid Build Coastguard Workerpart of the image is one or more scans better in quality than the upper part. 2087*dfc6aa5cSAndroid Build Coastguard WorkerThen, when the next output scan is started, you have a choice of what target 2088*dfc6aa5cSAndroid Build Coastguard Workerscan number to use. The recommended choice is to use the current input scan 2089*dfc6aa5cSAndroid Build Coastguard Workernumber at that time, which implies that you've skipped the output scans 2090*dfc6aa5cSAndroid Build Coastguard Workercorresponding to the input scans that were completed while you processed the 2091*dfc6aa5cSAndroid Build Coastguard Workerprevious output scan. In this way, the decoder automatically adapts its 2092*dfc6aa5cSAndroid Build Coastguard Workerspeed to the arriving data, by skipping output scans as necessary to keep up 2093*dfc6aa5cSAndroid Build Coastguard Workerwith the arriving data. 2094*dfc6aa5cSAndroid Build Coastguard Worker 2095*dfc6aa5cSAndroid Build Coastguard WorkerWhen using this strategy, you'll want to be sure that you perform a final 2096*dfc6aa5cSAndroid Build Coastguard Workeroutput pass after receiving all the data; otherwise your last display may not 2097*dfc6aa5cSAndroid Build Coastguard Workerbe full quality across the whole screen. So the right outer loop logic is 2098*dfc6aa5cSAndroid Build Coastguard Workersomething like this: 2099*dfc6aa5cSAndroid Build Coastguard Worker do { 2100*dfc6aa5cSAndroid Build Coastguard Worker absorb any waiting input by calling jpeg_consume_input() 2101*dfc6aa5cSAndroid Build Coastguard Worker final_pass = jpeg_input_complete(&cinfo); 2102*dfc6aa5cSAndroid Build Coastguard Worker adjust output decompression parameters if required 2103*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_output(&cinfo, cinfo.input_scan_number); 2104*dfc6aa5cSAndroid Build Coastguard Worker ... 2105*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_output() 2106*dfc6aa5cSAndroid Build Coastguard Worker } while (!final_pass); 2107*dfc6aa5cSAndroid Build Coastguard Workerrather than quitting as soon as jpeg_input_complete() returns TRUE. This 2108*dfc6aa5cSAndroid Build Coastguard Workerarrangement makes it simple to use higher-quality decoding parameters 2109*dfc6aa5cSAndroid Build Coastguard Workerfor the final pass. But if you don't want to use special parameters for 2110*dfc6aa5cSAndroid Build Coastguard Workerthe final pass, the right loop logic is like this: 2111*dfc6aa5cSAndroid Build Coastguard Worker for (;;) { 2112*dfc6aa5cSAndroid Build Coastguard Worker absorb any waiting input by calling jpeg_consume_input() 2113*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_output(&cinfo, cinfo.input_scan_number); 2114*dfc6aa5cSAndroid Build Coastguard Worker ... 2115*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_output() 2116*dfc6aa5cSAndroid Build Coastguard Worker if (jpeg_input_complete(&cinfo) && 2117*dfc6aa5cSAndroid Build Coastguard Worker cinfo.input_scan_number == cinfo.output_scan_number) 2118*dfc6aa5cSAndroid Build Coastguard Worker break; 2119*dfc6aa5cSAndroid Build Coastguard Worker } 2120*dfc6aa5cSAndroid Build Coastguard WorkerIn this case you don't need to know in advance whether an output pass is to 2121*dfc6aa5cSAndroid Build Coastguard Workerbe the last one, so it's not necessary to have reached EOF before starting 2122*dfc6aa5cSAndroid Build Coastguard Workerthe final output pass; rather, what you want to test is whether the output 2123*dfc6aa5cSAndroid Build Coastguard Workerpass was performed in sync with the final input scan. This form of the loop 2124*dfc6aa5cSAndroid Build Coastguard Workerwill avoid an extra output pass whenever the decoder is able (or nearly able) 2125*dfc6aa5cSAndroid Build Coastguard Workerto keep up with the incoming data. 2126*dfc6aa5cSAndroid Build Coastguard Worker 2127*dfc6aa5cSAndroid Build Coastguard WorkerWhen the data transmission speed is high, you might begin a display pass, 2128*dfc6aa5cSAndroid Build Coastguard Workerthen find that much or all of the file has arrived before you can complete 2129*dfc6aa5cSAndroid Build Coastguard Workerthe pass. (You can detect this by noting the JPEG_REACHED_EOI return code 2130*dfc6aa5cSAndroid Build Coastguard Workerfrom jpeg_consume_input(), or equivalently by testing jpeg_input_complete().) 2131*dfc6aa5cSAndroid Build Coastguard WorkerIn this situation you may wish to abort the current display pass and start a 2132*dfc6aa5cSAndroid Build Coastguard Workernew one using the newly arrived information. To do so, just call 2133*dfc6aa5cSAndroid Build Coastguard Workerjpeg_finish_output() and then start a new pass with jpeg_start_output(). 2134*dfc6aa5cSAndroid Build Coastguard Worker 2135*dfc6aa5cSAndroid Build Coastguard WorkerA variant strategy is to abort and restart display if more than one complete 2136*dfc6aa5cSAndroid Build Coastguard Workerscan arrives during an output pass; this can be detected by noting 2137*dfc6aa5cSAndroid Build Coastguard WorkerJPEG_REACHED_SOS returns and/or examining cinfo.input_scan_number. This 2138*dfc6aa5cSAndroid Build Coastguard Workeridea should be employed with caution, however, since the display process 2139*dfc6aa5cSAndroid Build Coastguard Workermight never get to the bottom of the image before being aborted, resulting 2140*dfc6aa5cSAndroid Build Coastguard Workerin the lower part of the screen being several passes worse than the upper. 2141*dfc6aa5cSAndroid Build Coastguard WorkerIn most cases it's probably best to abort an output pass only if the whole 2142*dfc6aa5cSAndroid Build Coastguard Workerfile has arrived and you want to begin the final output pass immediately. 2143*dfc6aa5cSAndroid Build Coastguard Worker 2144*dfc6aa5cSAndroid Build Coastguard WorkerWhen receiving data across a communication link, we recommend always using 2145*dfc6aa5cSAndroid Build Coastguard Workerthe current input scan number for the output target scan number; if a 2146*dfc6aa5cSAndroid Build Coastguard Workerhigher-quality final pass is to be done, it should be started (aborting any 2147*dfc6aa5cSAndroid Build Coastguard Workerincomplete output pass) as soon as the end of file is received. However, 2148*dfc6aa5cSAndroid Build Coastguard Workermany other strategies are possible. For example, the application can examine 2149*dfc6aa5cSAndroid Build Coastguard Workerthe parameters of the current input scan and decide whether to display it or 2150*dfc6aa5cSAndroid Build Coastguard Workernot. If the scan contains only chroma data, one might choose not to use it 2151*dfc6aa5cSAndroid Build Coastguard Workeras the target scan, expecting that the scan will be small and will arrive 2152*dfc6aa5cSAndroid Build Coastguard Workerquickly. To skip to the next scan, call jpeg_consume_input() until it 2153*dfc6aa5cSAndroid Build Coastguard Workerreturns JPEG_REACHED_SOS or JPEG_REACHED_EOI. Or just use the next higher 2154*dfc6aa5cSAndroid Build Coastguard Workernumber as the target scan for jpeg_start_output(); but that method doesn't 2155*dfc6aa5cSAndroid Build Coastguard Workerlet you inspect the next scan's parameters before deciding to display it. 2156*dfc6aa5cSAndroid Build Coastguard Worker 2157*dfc6aa5cSAndroid Build Coastguard Worker 2158*dfc6aa5cSAndroid Build Coastguard WorkerIn buffered-image mode, jpeg_start_decompress() never performs input and 2159*dfc6aa5cSAndroid Build Coastguard Workerthus never suspends. An application that uses input suspension with 2160*dfc6aa5cSAndroid Build Coastguard Workerbuffered-image mode must be prepared for suspension returns from these 2161*dfc6aa5cSAndroid Build Coastguard Workerroutines: 2162*dfc6aa5cSAndroid Build Coastguard Worker* jpeg_start_output() performs input only if you request 2-pass quantization 2163*dfc6aa5cSAndroid Build Coastguard Worker and the target scan isn't fully read yet. (This is discussed below.) 2164*dfc6aa5cSAndroid Build Coastguard Worker* jpeg_read_scanlines(), as always, returns the number of scanlines that it 2165*dfc6aa5cSAndroid Build Coastguard Worker was able to produce before suspending. 2166*dfc6aa5cSAndroid Build Coastguard Worker* jpeg_finish_output() will read any markers following the target scan, 2167*dfc6aa5cSAndroid Build Coastguard Worker up to the end of the file or the SOS marker that begins another scan. 2168*dfc6aa5cSAndroid Build Coastguard Worker (But it reads no input if jpeg_consume_input() has already reached the 2169*dfc6aa5cSAndroid Build Coastguard Worker end of the file or a SOS marker beyond the target output scan.) 2170*dfc6aa5cSAndroid Build Coastguard Worker* jpeg_finish_decompress() will read until the end of file, and thus can 2171*dfc6aa5cSAndroid Build Coastguard Worker suspend if the end hasn't already been reached (as can be tested by 2172*dfc6aa5cSAndroid Build Coastguard Worker calling jpeg_input_complete()). 2173*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_output(), jpeg_finish_output(), and jpeg_finish_decompress() 2174*dfc6aa5cSAndroid Build Coastguard Workerall return TRUE if they completed their tasks, FALSE if they had to suspend. 2175*dfc6aa5cSAndroid Build Coastguard WorkerIn the event of a FALSE return, the application must load more input data 2176*dfc6aa5cSAndroid Build Coastguard Workerand repeat the call. Applications that use non-suspending data sources need 2177*dfc6aa5cSAndroid Build Coastguard Workernot check the return values of these three routines. 2178*dfc6aa5cSAndroid Build Coastguard Worker 2179*dfc6aa5cSAndroid Build Coastguard Worker 2180*dfc6aa5cSAndroid Build Coastguard WorkerIt is possible to change decoding parameters between output passes in the 2181*dfc6aa5cSAndroid Build Coastguard Workerbuffered-image mode. The decoder library currently supports only very 2182*dfc6aa5cSAndroid Build Coastguard Workerlimited changes of parameters. ONLY THE FOLLOWING parameter changes are 2183*dfc6aa5cSAndroid Build Coastguard Workerallowed after jpeg_start_decompress() is called: 2184*dfc6aa5cSAndroid Build Coastguard Worker* dct_method can be changed before each call to jpeg_start_output(). 2185*dfc6aa5cSAndroid Build Coastguard Worker For example, one could use a fast DCT method for early scans, changing 2186*dfc6aa5cSAndroid Build Coastguard Worker to a higher quality method for the final scan. 2187*dfc6aa5cSAndroid Build Coastguard Worker* dither_mode can be changed before each call to jpeg_start_output(); 2188*dfc6aa5cSAndroid Build Coastguard Worker of course this has no impact if not using color quantization. Typically 2189*dfc6aa5cSAndroid Build Coastguard Worker one would use ordered dither for initial passes, then switch to 2190*dfc6aa5cSAndroid Build Coastguard Worker Floyd-Steinberg dither for the final pass. Caution: changing dither mode 2191*dfc6aa5cSAndroid Build Coastguard Worker can cause more memory to be allocated by the library. Although the amount 2192*dfc6aa5cSAndroid Build Coastguard Worker of memory involved is not large (a scanline or so), it may cause the 2193*dfc6aa5cSAndroid Build Coastguard Worker initial max_memory_to_use specification to be exceeded, which in the worst 2194*dfc6aa5cSAndroid Build Coastguard Worker case would result in an out-of-memory failure. 2195*dfc6aa5cSAndroid Build Coastguard Worker* do_block_smoothing can be changed before each call to jpeg_start_output(). 2196*dfc6aa5cSAndroid Build Coastguard Worker This setting is relevant only when decoding a progressive JPEG image. 2197*dfc6aa5cSAndroid Build Coastguard Worker During the first DC-only scan, block smoothing provides a very "fuzzy" look 2198*dfc6aa5cSAndroid Build Coastguard Worker instead of the very "blocky" look seen without it; which is better seems a 2199*dfc6aa5cSAndroid Build Coastguard Worker matter of personal taste. But block smoothing is nearly always a win 2200*dfc6aa5cSAndroid Build Coastguard Worker during later stages, especially when decoding a successive-approximation 2201*dfc6aa5cSAndroid Build Coastguard Worker image: smoothing helps to hide the slight blockiness that otherwise shows 2202*dfc6aa5cSAndroid Build Coastguard Worker up on smooth gradients until the lowest coefficient bits are sent. 2203*dfc6aa5cSAndroid Build Coastguard Worker* Color quantization mode can be changed under the rules described below. 2204*dfc6aa5cSAndroid Build Coastguard Worker You *cannot* change between full-color and quantized output (because that 2205*dfc6aa5cSAndroid Build Coastguard Worker would alter the required I/O buffer sizes), but you can change which 2206*dfc6aa5cSAndroid Build Coastguard Worker quantization method is used. 2207*dfc6aa5cSAndroid Build Coastguard Worker 2208*dfc6aa5cSAndroid Build Coastguard WorkerWhen generating color-quantized output, changing quantization method is a 2209*dfc6aa5cSAndroid Build Coastguard Workervery useful way of switching between high-speed and high-quality display. 2210*dfc6aa5cSAndroid Build Coastguard WorkerThe library allows you to change among its three quantization methods: 2211*dfc6aa5cSAndroid Build Coastguard Worker1. Single-pass quantization to a fixed color cube. 2212*dfc6aa5cSAndroid Build Coastguard Worker Selected by cinfo.two_pass_quantize = FALSE and cinfo.colormap = NULL. 2213*dfc6aa5cSAndroid Build Coastguard Worker2. Single-pass quantization to an application-supplied colormap. 2214*dfc6aa5cSAndroid Build Coastguard Worker Selected by setting cinfo.colormap to point to the colormap (the value of 2215*dfc6aa5cSAndroid Build Coastguard Worker two_pass_quantize is ignored); also set cinfo.actual_number_of_colors. 2216*dfc6aa5cSAndroid Build Coastguard Worker3. Two-pass quantization to a colormap chosen specifically for the image. 2217*dfc6aa5cSAndroid Build Coastguard Worker Selected by cinfo.two_pass_quantize = TRUE and cinfo.colormap = NULL. 2218*dfc6aa5cSAndroid Build Coastguard Worker (This is the default setting selected by jpeg_read_header, but it is 2219*dfc6aa5cSAndroid Build Coastguard Worker probably NOT what you want for the first pass of progressive display!) 2220*dfc6aa5cSAndroid Build Coastguard WorkerThese methods offer successively better quality and lesser speed. However, 2221*dfc6aa5cSAndroid Build Coastguard Workeronly the first method is available for quantizing in non-RGB color spaces. 2222*dfc6aa5cSAndroid Build Coastguard Worker 2223*dfc6aa5cSAndroid Build Coastguard WorkerIMPORTANT: because the different quantizer methods have very different 2224*dfc6aa5cSAndroid Build Coastguard Workerworking-storage requirements, the library requires you to indicate which 2225*dfc6aa5cSAndroid Build Coastguard Workerone(s) you intend to use before you call jpeg_start_decompress(). (If we did 2226*dfc6aa5cSAndroid Build Coastguard Workernot require this, the max_memory_to_use setting would be a complete fiction.) 2227*dfc6aa5cSAndroid Build Coastguard WorkerYou do this by setting one or more of these three cinfo fields to TRUE: 2228*dfc6aa5cSAndroid Build Coastguard Worker enable_1pass_quant Fixed color cube colormap 2229*dfc6aa5cSAndroid Build Coastguard Worker enable_external_quant Externally-supplied colormap 2230*dfc6aa5cSAndroid Build Coastguard Worker enable_2pass_quant Two-pass custom colormap 2231*dfc6aa5cSAndroid Build Coastguard WorkerAll three are initialized FALSE by jpeg_read_header(). But 2232*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_decompress() automatically sets TRUE the one selected by the 2233*dfc6aa5cSAndroid Build Coastguard Workercurrent two_pass_quantize and colormap settings, so you only need to set the 2234*dfc6aa5cSAndroid Build Coastguard Workerenable flags for any other quantization methods you plan to change to later. 2235*dfc6aa5cSAndroid Build Coastguard Worker 2236*dfc6aa5cSAndroid Build Coastguard WorkerAfter setting the enable flags correctly at jpeg_start_decompress() time, you 2237*dfc6aa5cSAndroid Build Coastguard Workercan change to any enabled quantization method by setting two_pass_quantize 2238*dfc6aa5cSAndroid Build Coastguard Workerand colormap properly just before calling jpeg_start_output(). The following 2239*dfc6aa5cSAndroid Build Coastguard Workerspecial rules apply: 2240*dfc6aa5cSAndroid Build Coastguard Worker1. You must explicitly set cinfo.colormap to NULL when switching to 1-pass 2241*dfc6aa5cSAndroid Build Coastguard Worker or 2-pass mode from a different mode, or when you want the 2-pass 2242*dfc6aa5cSAndroid Build Coastguard Worker quantizer to be re-run to generate a new colormap. 2243*dfc6aa5cSAndroid Build Coastguard Worker2. To switch to an external colormap, or to change to a different external 2244*dfc6aa5cSAndroid Build Coastguard Worker colormap than was used on the prior pass, you must call 2245*dfc6aa5cSAndroid Build Coastguard Worker jpeg_new_colormap() after setting cinfo.colormap. 2246*dfc6aa5cSAndroid Build Coastguard WorkerNOTE: if you want to use the same colormap as was used in the prior pass, 2247*dfc6aa5cSAndroid Build Coastguard Workeryou should not do either of these things. This will save some nontrivial 2248*dfc6aa5cSAndroid Build Coastguard Workerswitchover costs. 2249*dfc6aa5cSAndroid Build Coastguard Worker(These requirements exist because cinfo.colormap will always be non-NULL 2250*dfc6aa5cSAndroid Build Coastguard Workerafter completing a prior output pass, since both the 1-pass and 2-pass 2251*dfc6aa5cSAndroid Build Coastguard Workerquantizers set it to point to their output colormaps. Thus you have to 2252*dfc6aa5cSAndroid Build Coastguard Workerdo one of these two things to notify the library that something has changed. 2253*dfc6aa5cSAndroid Build Coastguard WorkerYup, it's a bit klugy, but it's necessary to do it this way for backwards 2254*dfc6aa5cSAndroid Build Coastguard Workercompatibility.) 2255*dfc6aa5cSAndroid Build Coastguard Worker 2256*dfc6aa5cSAndroid Build Coastguard WorkerNote that in buffered-image mode, the library generates any requested colormap 2257*dfc6aa5cSAndroid Build Coastguard Workerduring jpeg_start_output(), not during jpeg_start_decompress(). 2258*dfc6aa5cSAndroid Build Coastguard Worker 2259*dfc6aa5cSAndroid Build Coastguard WorkerWhen using two-pass quantization, jpeg_start_output() makes a pass over the 2260*dfc6aa5cSAndroid Build Coastguard Workerbuffered image to determine the optimum color map; it therefore may take a 2261*dfc6aa5cSAndroid Build Coastguard Workersignificant amount of time, whereas ordinarily it does little work. The 2262*dfc6aa5cSAndroid Build Coastguard Workerprogress monitor hook is called during this pass, if defined. It is also 2263*dfc6aa5cSAndroid Build Coastguard Workerimportant to realize that if the specified target scan number is greater than 2264*dfc6aa5cSAndroid Build Coastguard Workeror equal to the current input scan number, jpeg_start_output() will attempt 2265*dfc6aa5cSAndroid Build Coastguard Workerto consume input as it makes this pass. If you use a suspending data source, 2266*dfc6aa5cSAndroid Build Coastguard Workeryou need to check for a FALSE return from jpeg_start_output() under these 2267*dfc6aa5cSAndroid Build Coastguard Workerconditions. The combination of 2-pass quantization and a not-yet-fully-read 2268*dfc6aa5cSAndroid Build Coastguard Workertarget scan is the only case in which jpeg_start_output() will consume input. 2269*dfc6aa5cSAndroid Build Coastguard Worker 2270*dfc6aa5cSAndroid Build Coastguard Worker 2271*dfc6aa5cSAndroid Build Coastguard WorkerApplication authors who support buffered-image mode may be tempted to use it 2272*dfc6aa5cSAndroid Build Coastguard Workerfor all JPEG images, even single-scan ones. This will work, but it is 2273*dfc6aa5cSAndroid Build Coastguard Workerinefficient: there is no need to create an image-sized coefficient buffer for 2274*dfc6aa5cSAndroid Build Coastguard Workersingle-scan images. Requesting buffered-image mode for such an image wastes 2275*dfc6aa5cSAndroid Build Coastguard Workermemory. Worse, it can cost time on large images, since the buffered data has 2276*dfc6aa5cSAndroid Build Coastguard Workerto be swapped out or written to a temporary file. If you are concerned about 2277*dfc6aa5cSAndroid Build Coastguard Workermaximum performance on baseline JPEG files, you should use buffered-image 2278*dfc6aa5cSAndroid Build Coastguard Workermode only when the incoming file actually has multiple scans. This can be 2279*dfc6aa5cSAndroid Build Coastguard Workertested by calling jpeg_has_multiple_scans(), which will return a correct 2280*dfc6aa5cSAndroid Build Coastguard Workerresult at any time after jpeg_read_header() completes. 2281*dfc6aa5cSAndroid Build Coastguard Worker 2282*dfc6aa5cSAndroid Build Coastguard WorkerIt is also worth noting that when you use jpeg_consume_input() to let input 2283*dfc6aa5cSAndroid Build Coastguard Workerprocessing get ahead of output processing, the resulting pattern of access to 2284*dfc6aa5cSAndroid Build Coastguard Workerthe coefficient buffer is quite nonsequential. It's best to use the memory 2285*dfc6aa5cSAndroid Build Coastguard Workermanager jmemnobs.c if you can (ie, if you have enough real or virtual main 2286*dfc6aa5cSAndroid Build Coastguard Workermemory). If not, at least make sure that max_memory_to_use is set as high as 2287*dfc6aa5cSAndroid Build Coastguard Workerpossible. If the JPEG memory manager has to use a temporary file, you will 2288*dfc6aa5cSAndroid Build Coastguard Workerprobably see a lot of disk traffic and poor performance. (This could be 2289*dfc6aa5cSAndroid Build Coastguard Workerimproved with additional work on the memory manager, but we haven't gotten 2290*dfc6aa5cSAndroid Build Coastguard Workeraround to it yet.) 2291*dfc6aa5cSAndroid Build Coastguard Worker 2292*dfc6aa5cSAndroid Build Coastguard WorkerIn some applications it may be convenient to use jpeg_consume_input() for all 2293*dfc6aa5cSAndroid Build Coastguard Workerinput processing, including reading the initial markers; that is, you may 2294*dfc6aa5cSAndroid Build Coastguard Workerwish to call jpeg_consume_input() instead of jpeg_read_header() during 2295*dfc6aa5cSAndroid Build Coastguard Workerstartup. This works, but note that you must check for JPEG_REACHED_SOS and 2296*dfc6aa5cSAndroid Build Coastguard WorkerJPEG_REACHED_EOI return codes as the equivalent of jpeg_read_header's codes. 2297*dfc6aa5cSAndroid Build Coastguard WorkerOnce the first SOS marker has been reached, you must call 2298*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_decompress() before jpeg_consume_input() will consume more input; 2299*dfc6aa5cSAndroid Build Coastguard Workerit'll just keep returning JPEG_REACHED_SOS until you do. If you read a 2300*dfc6aa5cSAndroid Build Coastguard Workertables-only file this way, jpeg_consume_input() will return JPEG_REACHED_EOI 2301*dfc6aa5cSAndroid Build Coastguard Workerwithout ever returning JPEG_REACHED_SOS; be sure to check for this case. 2302*dfc6aa5cSAndroid Build Coastguard WorkerIf this happens, the decompressor will not read any more input until you call 2303*dfc6aa5cSAndroid Build Coastguard Workerjpeg_abort() to reset it. It is OK to call jpeg_consume_input() even when not 2304*dfc6aa5cSAndroid Build Coastguard Workerusing buffered-image mode, but in that case it's basically a no-op after the 2305*dfc6aa5cSAndroid Build Coastguard Workerinitial markers have been read: it will just return JPEG_SUSPENDED. 2306*dfc6aa5cSAndroid Build Coastguard Worker 2307*dfc6aa5cSAndroid Build Coastguard Worker 2308*dfc6aa5cSAndroid Build Coastguard WorkerAbbreviated datastreams and multiple images 2309*dfc6aa5cSAndroid Build Coastguard Worker------------------------------------------- 2310*dfc6aa5cSAndroid Build Coastguard Worker 2311*dfc6aa5cSAndroid Build Coastguard WorkerA JPEG compression or decompression object can be reused to process multiple 2312*dfc6aa5cSAndroid Build Coastguard Workerimages. This saves a small amount of time per image by eliminating the 2313*dfc6aa5cSAndroid Build Coastguard Worker"create" and "destroy" operations, but that isn't the real purpose of the 2314*dfc6aa5cSAndroid Build Coastguard Workerfeature. Rather, reuse of an object provides support for abbreviated JPEG 2315*dfc6aa5cSAndroid Build Coastguard Workerdatastreams. Object reuse can also simplify processing a series of images in 2316*dfc6aa5cSAndroid Build Coastguard Workera single input or output file. This section explains these features. 2317*dfc6aa5cSAndroid Build Coastguard Worker 2318*dfc6aa5cSAndroid Build Coastguard WorkerA JPEG file normally contains several hundred bytes worth of quantization 2319*dfc6aa5cSAndroid Build Coastguard Workerand Huffman tables. In a situation where many images will be stored or 2320*dfc6aa5cSAndroid Build Coastguard Workertransmitted with identical tables, this may represent an annoying overhead. 2321*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG standard therefore permits tables to be omitted. The standard 2322*dfc6aa5cSAndroid Build Coastguard Workerdefines three classes of JPEG datastreams: 2323*dfc6aa5cSAndroid Build Coastguard Worker * "Interchange" datastreams contain an image and all tables needed to decode 2324*dfc6aa5cSAndroid Build Coastguard Worker the image. These are the usual kind of JPEG file. 2325*dfc6aa5cSAndroid Build Coastguard Worker * "Abbreviated image" datastreams contain an image, but are missing some or 2326*dfc6aa5cSAndroid Build Coastguard Worker all of the tables needed to decode that image. 2327*dfc6aa5cSAndroid Build Coastguard Worker * "Abbreviated table specification" (henceforth "tables-only") datastreams 2328*dfc6aa5cSAndroid Build Coastguard Worker contain only table specifications. 2329*dfc6aa5cSAndroid Build Coastguard WorkerTo decode an abbreviated image, it is necessary to load the missing table(s) 2330*dfc6aa5cSAndroid Build Coastguard Workerinto the decoder beforehand. This can be accomplished by reading a separate 2331*dfc6aa5cSAndroid Build Coastguard Workertables-only file. A variant scheme uses a series of images in which the first 2332*dfc6aa5cSAndroid Build Coastguard Workerimage is an interchange (complete) datastream, while subsequent ones are 2333*dfc6aa5cSAndroid Build Coastguard Workerabbreviated and rely on the tables loaded by the first image. It is assumed 2334*dfc6aa5cSAndroid Build Coastguard Workerthat once the decoder has read a table, it will remember that table until a 2335*dfc6aa5cSAndroid Build Coastguard Workernew definition for the same table number is encountered. 2336*dfc6aa5cSAndroid Build Coastguard Worker 2337*dfc6aa5cSAndroid Build Coastguard WorkerIt is the application designer's responsibility to figure out how to associate 2338*dfc6aa5cSAndroid Build Coastguard Workerthe correct tables with an abbreviated image. While abbreviated datastreams 2339*dfc6aa5cSAndroid Build Coastguard Workercan be useful in a closed environment, their use is strongly discouraged in 2340*dfc6aa5cSAndroid Build Coastguard Workerany situation where data exchange with other applications might be needed. 2341*dfc6aa5cSAndroid Build Coastguard WorkerCaveat designer. 2342*dfc6aa5cSAndroid Build Coastguard Worker 2343*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG library provides support for reading and writing any combination of 2344*dfc6aa5cSAndroid Build Coastguard Workertables-only datastreams and abbreviated images. In both compression and 2345*dfc6aa5cSAndroid Build Coastguard Workerdecompression objects, a quantization or Huffman table will be retained for 2346*dfc6aa5cSAndroid Build Coastguard Workerthe lifetime of the object, unless it is overwritten by a new table definition. 2347*dfc6aa5cSAndroid Build Coastguard Worker 2348*dfc6aa5cSAndroid Build Coastguard Worker 2349*dfc6aa5cSAndroid Build Coastguard WorkerTo create abbreviated image datastreams, it is only necessary to tell the 2350*dfc6aa5cSAndroid Build Coastguard Workercompressor not to emit some or all of the tables it is using. Each 2351*dfc6aa5cSAndroid Build Coastguard Workerquantization and Huffman table struct contains a boolean field "sent_table", 2352*dfc6aa5cSAndroid Build Coastguard Workerwhich normally is initialized to FALSE. For each table used by the image, the 2353*dfc6aa5cSAndroid Build Coastguard Workerheader-writing process emits the table and sets sent_table = TRUE unless it is 2354*dfc6aa5cSAndroid Build Coastguard Workeralready TRUE. (In normal usage, this prevents outputting the same table 2355*dfc6aa5cSAndroid Build Coastguard Workerdefinition multiple times, as would otherwise occur because the chroma 2356*dfc6aa5cSAndroid Build Coastguard Workercomponents typically share tables.) Thus, setting this field to TRUE before 2357*dfc6aa5cSAndroid Build Coastguard Workercalling jpeg_start_compress() will prevent the table from being written at 2358*dfc6aa5cSAndroid Build Coastguard Workerall. 2359*dfc6aa5cSAndroid Build Coastguard Worker 2360*dfc6aa5cSAndroid Build Coastguard WorkerIf you want to create a "pure" abbreviated image file containing no tables, 2361*dfc6aa5cSAndroid Build Coastguard Workerjust call "jpeg_suppress_tables(&cinfo, TRUE)" after constructing all the 2362*dfc6aa5cSAndroid Build Coastguard Workertables. If you want to emit some but not all tables, you'll need to set the 2363*dfc6aa5cSAndroid Build Coastguard Workerindividual sent_table fields directly. 2364*dfc6aa5cSAndroid Build Coastguard Worker 2365*dfc6aa5cSAndroid Build Coastguard WorkerTo create an abbreviated image, you must also call jpeg_start_compress() 2366*dfc6aa5cSAndroid Build Coastguard Workerwith a second parameter of FALSE, not TRUE. Otherwise jpeg_start_compress() 2367*dfc6aa5cSAndroid Build Coastguard Workerwill force all the sent_table fields to FALSE. (This is a safety feature to 2368*dfc6aa5cSAndroid Build Coastguard Workerprevent abbreviated images from being created accidentally.) 2369*dfc6aa5cSAndroid Build Coastguard Worker 2370*dfc6aa5cSAndroid Build Coastguard WorkerTo create a tables-only file, perform the same parameter setup that you 2371*dfc6aa5cSAndroid Build Coastguard Workernormally would, but instead of calling jpeg_start_compress() and so on, call 2372*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_tables(&cinfo). This will write an abbreviated datastream 2373*dfc6aa5cSAndroid Build Coastguard Workercontaining only SOI, DQT and/or DHT markers, and EOI. All the quantization 2374*dfc6aa5cSAndroid Build Coastguard Workerand Huffman tables that are currently defined in the compression object will 2375*dfc6aa5cSAndroid Build Coastguard Workerbe emitted unless their sent_tables flag is already TRUE, and then all the 2376*dfc6aa5cSAndroid Build Coastguard Workersent_tables flags will be set TRUE. 2377*dfc6aa5cSAndroid Build Coastguard Worker 2378*dfc6aa5cSAndroid Build Coastguard WorkerA sure-fire way to create matching tables-only and abbreviated image files 2379*dfc6aa5cSAndroid Build Coastguard Workeris to proceed as follows: 2380*dfc6aa5cSAndroid Build Coastguard Worker 2381*dfc6aa5cSAndroid Build Coastguard Worker create JPEG compression object 2382*dfc6aa5cSAndroid Build Coastguard Worker set JPEG parameters 2383*dfc6aa5cSAndroid Build Coastguard Worker set destination to tables-only file 2384*dfc6aa5cSAndroid Build Coastguard Worker jpeg_write_tables(&cinfo); 2385*dfc6aa5cSAndroid Build Coastguard Worker set destination to image file 2386*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_compress(&cinfo, FALSE); 2387*dfc6aa5cSAndroid Build Coastguard Worker write data... 2388*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_compress(&cinfo); 2389*dfc6aa5cSAndroid Build Coastguard Worker 2390*dfc6aa5cSAndroid Build Coastguard WorkerSince the JPEG parameters are not altered between writing the table file and 2391*dfc6aa5cSAndroid Build Coastguard Workerthe abbreviated image file, the same tables are sure to be used. Of course, 2392*dfc6aa5cSAndroid Build Coastguard Workeryou can repeat the jpeg_start_compress() ... jpeg_finish_compress() sequence 2393*dfc6aa5cSAndroid Build Coastguard Workermany times to produce many abbreviated image files matching the table file. 2394*dfc6aa5cSAndroid Build Coastguard Worker 2395*dfc6aa5cSAndroid Build Coastguard WorkerYou cannot suppress output of the computed Huffman tables when Huffman 2396*dfc6aa5cSAndroid Build Coastguard Workeroptimization is selected. (If you could, there'd be no way to decode the 2397*dfc6aa5cSAndroid Build Coastguard Workerimage...) Generally, you don't want to set optimize_coding = TRUE when 2398*dfc6aa5cSAndroid Build Coastguard Workeryou are trying to produce abbreviated files. 2399*dfc6aa5cSAndroid Build Coastguard Worker 2400*dfc6aa5cSAndroid Build Coastguard WorkerIn some cases you might want to compress an image using tables which are 2401*dfc6aa5cSAndroid Build Coastguard Workernot stored in the application, but are defined in an interchange or 2402*dfc6aa5cSAndroid Build Coastguard Workertables-only file readable by the application. This can be done by setting up 2403*dfc6aa5cSAndroid Build Coastguard Workera JPEG decompression object to read the specification file, then copying the 2404*dfc6aa5cSAndroid Build Coastguard Workertables into your compression object. See jpeg_copy_critical_parameters() 2405*dfc6aa5cSAndroid Build Coastguard Workerfor an example of copying quantization tables. 2406*dfc6aa5cSAndroid Build Coastguard Worker 2407*dfc6aa5cSAndroid Build Coastguard Worker 2408*dfc6aa5cSAndroid Build Coastguard WorkerTo read abbreviated image files, you simply need to load the proper tables 2409*dfc6aa5cSAndroid Build Coastguard Workerinto the decompression object before trying to read the abbreviated image. 2410*dfc6aa5cSAndroid Build Coastguard WorkerIf the proper tables are stored in the application program, you can just 2411*dfc6aa5cSAndroid Build Coastguard Workerallocate the table structs and fill in their contents directly. For example, 2412*dfc6aa5cSAndroid Build Coastguard Workerto load a fixed quantization table into table slot "n": 2413*dfc6aa5cSAndroid Build Coastguard Worker 2414*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo.quant_tbl_ptrs[n] == NULL) 2415*dfc6aa5cSAndroid Build Coastguard Worker cinfo.quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) &cinfo); 2416*dfc6aa5cSAndroid Build Coastguard Worker quant_ptr = cinfo.quant_tbl_ptrs[n]; /* quant_ptr is JQUANT_TBL* */ 2417*dfc6aa5cSAndroid Build Coastguard Worker for (i = 0; i < 64; i++) { 2418*dfc6aa5cSAndroid Build Coastguard Worker /* Qtable[] is desired quantization table, in natural array order */ 2419*dfc6aa5cSAndroid Build Coastguard Worker quant_ptr->quantval[i] = Qtable[i]; 2420*dfc6aa5cSAndroid Build Coastguard Worker } 2421*dfc6aa5cSAndroid Build Coastguard Worker 2422*dfc6aa5cSAndroid Build Coastguard WorkerCode to load a fixed Huffman table is typically (for AC table "n"): 2423*dfc6aa5cSAndroid Build Coastguard Worker 2424*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo.ac_huff_tbl_ptrs[n] == NULL) 2425*dfc6aa5cSAndroid Build Coastguard Worker cinfo.ac_huff_tbl_ptrs[n] = jpeg_alloc_huff_table((j_common_ptr) &cinfo); 2426*dfc6aa5cSAndroid Build Coastguard Worker huff_ptr = cinfo.ac_huff_tbl_ptrs[n]; /* huff_ptr is JHUFF_TBL* */ 2427*dfc6aa5cSAndroid Build Coastguard Worker for (i = 1; i <= 16; i++) { 2428*dfc6aa5cSAndroid Build Coastguard Worker /* counts[i] is number of Huffman codes of length i bits, i=1..16 */ 2429*dfc6aa5cSAndroid Build Coastguard Worker huff_ptr->bits[i] = counts[i]; 2430*dfc6aa5cSAndroid Build Coastguard Worker } 2431*dfc6aa5cSAndroid Build Coastguard Worker for (i = 0; i < 256; i++) { 2432*dfc6aa5cSAndroid Build Coastguard Worker /* symbols[] is the list of Huffman symbols, in code-length order */ 2433*dfc6aa5cSAndroid Build Coastguard Worker huff_ptr->huffval[i] = symbols[i]; 2434*dfc6aa5cSAndroid Build Coastguard Worker } 2435*dfc6aa5cSAndroid Build Coastguard Worker 2436*dfc6aa5cSAndroid Build Coastguard Worker(Note that trying to set cinfo.quant_tbl_ptrs[n] to point directly at a 2437*dfc6aa5cSAndroid Build Coastguard Workerconstant JQUANT_TBL object is not safe. If the incoming file happened to 2438*dfc6aa5cSAndroid Build Coastguard Workercontain a quantization table definition, your master table would get 2439*dfc6aa5cSAndroid Build Coastguard Workeroverwritten! Instead allocate a working table copy and copy the master table 2440*dfc6aa5cSAndroid Build Coastguard Workerinto it, as illustrated above. Ditto for Huffman tables, of course.) 2441*dfc6aa5cSAndroid Build Coastguard Worker 2442*dfc6aa5cSAndroid Build Coastguard WorkerYou might want to read the tables from a tables-only file, rather than 2443*dfc6aa5cSAndroid Build Coastguard Workerhard-wiring them into your application. The jpeg_read_header() call is 2444*dfc6aa5cSAndroid Build Coastguard Workersufficient to read a tables-only file. You must pass a second parameter of 2445*dfc6aa5cSAndroid Build Coastguard WorkerFALSE to indicate that you do not require an image to be present. Thus, the 2446*dfc6aa5cSAndroid Build Coastguard Workertypical scenario is 2447*dfc6aa5cSAndroid Build Coastguard Worker 2448*dfc6aa5cSAndroid Build Coastguard Worker create JPEG decompression object 2449*dfc6aa5cSAndroid Build Coastguard Worker set source to tables-only file 2450*dfc6aa5cSAndroid Build Coastguard Worker jpeg_read_header(&cinfo, FALSE); 2451*dfc6aa5cSAndroid Build Coastguard Worker set source to abbreviated image file 2452*dfc6aa5cSAndroid Build Coastguard Worker jpeg_read_header(&cinfo, TRUE); 2453*dfc6aa5cSAndroid Build Coastguard Worker set decompression parameters 2454*dfc6aa5cSAndroid Build Coastguard Worker jpeg_start_decompress(&cinfo); 2455*dfc6aa5cSAndroid Build Coastguard Worker read data... 2456*dfc6aa5cSAndroid Build Coastguard Worker jpeg_finish_decompress(&cinfo); 2457*dfc6aa5cSAndroid Build Coastguard Worker 2458*dfc6aa5cSAndroid Build Coastguard WorkerIn some cases, you may want to read a file without knowing whether it contains 2459*dfc6aa5cSAndroid Build Coastguard Workeran image or just tables. In that case, pass FALSE and check the return value 2460*dfc6aa5cSAndroid Build Coastguard Workerfrom jpeg_read_header(): it will be JPEG_HEADER_OK if an image was found, 2461*dfc6aa5cSAndroid Build Coastguard WorkerJPEG_HEADER_TABLES_ONLY if only tables were found. (A third return value, 2462*dfc6aa5cSAndroid Build Coastguard WorkerJPEG_SUSPENDED, is possible when using a suspending data source manager.) 2463*dfc6aa5cSAndroid Build Coastguard WorkerNote that jpeg_read_header() will not complain if you read an abbreviated 2464*dfc6aa5cSAndroid Build Coastguard Workerimage for which you haven't loaded the missing tables; the missing-table check 2465*dfc6aa5cSAndroid Build Coastguard Workeroccurs later, in jpeg_start_decompress(). 2466*dfc6aa5cSAndroid Build Coastguard Worker 2467*dfc6aa5cSAndroid Build Coastguard Worker 2468*dfc6aa5cSAndroid Build Coastguard WorkerIt is possible to read a series of images from a single source file by 2469*dfc6aa5cSAndroid Build Coastguard Workerrepeating the jpeg_read_header() ... jpeg_finish_decompress() sequence, 2470*dfc6aa5cSAndroid Build Coastguard Workerwithout releasing/recreating the JPEG object or the data source module. 2471*dfc6aa5cSAndroid Build Coastguard Worker(If you did reinitialize, any partial bufferload left in the data source 2472*dfc6aa5cSAndroid Build Coastguard Workerbuffer at the end of one image would be discarded, causing you to lose the 2473*dfc6aa5cSAndroid Build Coastguard Workerstart of the next image.) When you use this method, stored tables are 2474*dfc6aa5cSAndroid Build Coastguard Workerautomatically carried forward, so some of the images can be abbreviated images 2475*dfc6aa5cSAndroid Build Coastguard Workerthat depend on tables from earlier images. 2476*dfc6aa5cSAndroid Build Coastguard Worker 2477*dfc6aa5cSAndroid Build Coastguard WorkerIf you intend to write a series of images into a single destination file, 2478*dfc6aa5cSAndroid Build Coastguard Workeryou might want to make a specialized data destination module that doesn't 2479*dfc6aa5cSAndroid Build Coastguard Workerflush the output buffer at term_destination() time. This would speed things 2480*dfc6aa5cSAndroid Build Coastguard Workerup by some trifling amount. Of course, you'd need to remember to flush the 2481*dfc6aa5cSAndroid Build Coastguard Workerbuffer after the last image. You can make the later images be abbreviated 2482*dfc6aa5cSAndroid Build Coastguard Workerones by passing FALSE to jpeg_start_compress(). 2483*dfc6aa5cSAndroid Build Coastguard Worker 2484*dfc6aa5cSAndroid Build Coastguard Worker 2485*dfc6aa5cSAndroid Build Coastguard WorkerSpecial markers 2486*dfc6aa5cSAndroid Build Coastguard Worker--------------- 2487*dfc6aa5cSAndroid Build Coastguard Worker 2488*dfc6aa5cSAndroid Build Coastguard WorkerSome applications may need to insert or extract special data in the JPEG 2489*dfc6aa5cSAndroid Build Coastguard Workerdatastream. The JPEG standard provides marker types "COM" (comment) and 2490*dfc6aa5cSAndroid Build Coastguard Worker"APP0" through "APP15" (application) to hold application-specific data. 2491*dfc6aa5cSAndroid Build Coastguard WorkerUnfortunately, the use of these markers is not specified by the standard. 2492*dfc6aa5cSAndroid Build Coastguard WorkerCOM markers are fairly widely used to hold user-supplied text. The JFIF file 2493*dfc6aa5cSAndroid Build Coastguard Workerformat spec uses APP0 markers with specified initial strings to hold certain 2494*dfc6aa5cSAndroid Build Coastguard Workerdata. Adobe applications use APP14 markers beginning with the string "Adobe" 2495*dfc6aa5cSAndroid Build Coastguard Workerfor miscellaneous data. Other APPn markers are rarely seen, but might 2496*dfc6aa5cSAndroid Build Coastguard Workercontain almost anything. 2497*dfc6aa5cSAndroid Build Coastguard Worker 2498*dfc6aa5cSAndroid Build Coastguard WorkerIf you wish to store user-supplied text, we recommend you use COM markers 2499*dfc6aa5cSAndroid Build Coastguard Workerand place readable 7-bit ASCII text in them. Newline conventions are not 2500*dfc6aa5cSAndroid Build Coastguard Workerstandardized --- expect to find LF (Unix style), CR/LF (DOS style), or CR 2501*dfc6aa5cSAndroid Build Coastguard Worker(Mac style). A robust COM reader should be able to cope with random binary 2502*dfc6aa5cSAndroid Build Coastguard Workergarbage, including nulls, since some applications generate COM markers 2503*dfc6aa5cSAndroid Build Coastguard Workercontaining non-ASCII junk. (But yours should not be one of them.) 2504*dfc6aa5cSAndroid Build Coastguard Worker 2505*dfc6aa5cSAndroid Build Coastguard WorkerFor program-supplied data, use an APPn marker, and be sure to begin it with an 2506*dfc6aa5cSAndroid Build Coastguard Workeridentifying string so that you can tell whether the marker is actually yours. 2507*dfc6aa5cSAndroid Build Coastguard WorkerIt's probably best to avoid using APP0 or APP14 for any private markers. 2508*dfc6aa5cSAndroid Build Coastguard Worker(NOTE: the upcoming SPIFF standard will use APP8 markers; we recommend you 2509*dfc6aa5cSAndroid Build Coastguard Workernot use APP8 markers for any private purposes, either.) 2510*dfc6aa5cSAndroid Build Coastguard Worker 2511*dfc6aa5cSAndroid Build Coastguard WorkerKeep in mind that at most 65533 bytes can be put into one marker, but you 2512*dfc6aa5cSAndroid Build Coastguard Workercan have as many markers as you like. 2513*dfc6aa5cSAndroid Build Coastguard Worker 2514*dfc6aa5cSAndroid Build Coastguard WorkerBy default, the IJG compression library will write a JFIF APP0 marker if the 2515*dfc6aa5cSAndroid Build Coastguard Workerselected JPEG colorspace is grayscale or YCbCr, or an Adobe APP14 marker if 2516*dfc6aa5cSAndroid Build Coastguard Workerthe selected colorspace is RGB, CMYK, or YCCK. You can disable this, but 2517*dfc6aa5cSAndroid Build Coastguard Workerwe don't recommend it. The decompression library will recognize JFIF and 2518*dfc6aa5cSAndroid Build Coastguard WorkerAdobe markers and will set the JPEG colorspace properly when one is found. 2519*dfc6aa5cSAndroid Build Coastguard Worker 2520*dfc6aa5cSAndroid Build Coastguard Worker 2521*dfc6aa5cSAndroid Build Coastguard WorkerYou can write special markers immediately following the datastream header by 2522*dfc6aa5cSAndroid Build Coastguard Workercalling jpeg_write_marker() after jpeg_start_compress() and before the first 2523*dfc6aa5cSAndroid Build Coastguard Workercall to jpeg_write_scanlines(). When you do this, the markers appear after 2524*dfc6aa5cSAndroid Build Coastguard Workerthe SOI and the JFIF APP0 and Adobe APP14 markers (if written), but before 2525*dfc6aa5cSAndroid Build Coastguard Workerall else. Specify the marker type parameter as "JPEG_COM" for COM or 2526*dfc6aa5cSAndroid Build Coastguard Worker"JPEG_APP0 + n" for APPn. (Actually, jpeg_write_marker will let you write 2527*dfc6aa5cSAndroid Build Coastguard Workerany marker type, but we don't recommend writing any other kinds of marker.) 2528*dfc6aa5cSAndroid Build Coastguard WorkerFor example, to write a user comment string pointed to by comment_text: 2529*dfc6aa5cSAndroid Build Coastguard Worker jpeg_write_marker(cinfo, JPEG_COM, comment_text, strlen(comment_text)); 2530*dfc6aa5cSAndroid Build Coastguard Worker 2531*dfc6aa5cSAndroid Build Coastguard WorkerIf it's not convenient to store all the marker data in memory at once, 2532*dfc6aa5cSAndroid Build Coastguard Workeryou can instead call jpeg_write_m_header() followed by multiple calls to 2533*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_m_byte(). If you do it this way, it's your responsibility to 2534*dfc6aa5cSAndroid Build Coastguard Workercall jpeg_write_m_byte() exactly the number of times given in the length 2535*dfc6aa5cSAndroid Build Coastguard Workerparameter to jpeg_write_m_header(). (This method lets you empty the 2536*dfc6aa5cSAndroid Build Coastguard Workeroutput buffer partway through a marker, which might be important when 2537*dfc6aa5cSAndroid Build Coastguard Workerusing a suspending data destination module. In any case, if you are using 2538*dfc6aa5cSAndroid Build Coastguard Workera suspending destination, you should flush its buffer after inserting 2539*dfc6aa5cSAndroid Build Coastguard Workerany special markers. See "I/O suspension".) 2540*dfc6aa5cSAndroid Build Coastguard Worker 2541*dfc6aa5cSAndroid Build Coastguard WorkerOr, if you prefer to synthesize the marker byte sequence yourself, 2542*dfc6aa5cSAndroid Build Coastguard Workeryou can just cram it straight into the data destination module. 2543*dfc6aa5cSAndroid Build Coastguard Worker 2544*dfc6aa5cSAndroid Build Coastguard WorkerIf you are writing JFIF 1.02 extension markers (thumbnail images), don't 2545*dfc6aa5cSAndroid Build Coastguard Workerforget to set cinfo.JFIF_minor_version = 2 so that the encoder will write the 2546*dfc6aa5cSAndroid Build Coastguard Workercorrect JFIF version number in the JFIF header marker. The library's default 2547*dfc6aa5cSAndroid Build Coastguard Workeris to write version 1.01, but that's wrong if you insert any 1.02 extension 2548*dfc6aa5cSAndroid Build Coastguard Workermarkers. (We could probably get away with just defaulting to 1.02, but there 2549*dfc6aa5cSAndroid Build Coastguard Workerused to be broken decoders that would complain about unknown minor version 2550*dfc6aa5cSAndroid Build Coastguard Workernumbers. To reduce compatibility risks it's safest not to write 1.02 unless 2551*dfc6aa5cSAndroid Build Coastguard Workeryou are actually using 1.02 extensions.) 2552*dfc6aa5cSAndroid Build Coastguard Worker 2553*dfc6aa5cSAndroid Build Coastguard Worker 2554*dfc6aa5cSAndroid Build Coastguard WorkerWhen reading, two methods of handling special markers are available: 2555*dfc6aa5cSAndroid Build Coastguard Worker1. You can ask the library to save the contents of COM and/or APPn markers 2556*dfc6aa5cSAndroid Build Coastguard Workerinto memory, and then examine them at your leisure afterwards. 2557*dfc6aa5cSAndroid Build Coastguard Worker2. You can supply your own routine to process COM and/or APPn markers 2558*dfc6aa5cSAndroid Build Coastguard Workeron-the-fly as they are read. 2559*dfc6aa5cSAndroid Build Coastguard WorkerThe first method is simpler to use, especially if you are using a suspending 2560*dfc6aa5cSAndroid Build Coastguard Workerdata source; writing a marker processor that copes with input suspension is 2561*dfc6aa5cSAndroid Build Coastguard Workernot easy (consider what happens if the marker is longer than your available 2562*dfc6aa5cSAndroid Build Coastguard Workerinput buffer). However, the second method conserves memory since the marker 2563*dfc6aa5cSAndroid Build Coastguard Workerdata need not be kept around after it's been processed. 2564*dfc6aa5cSAndroid Build Coastguard Worker 2565*dfc6aa5cSAndroid Build Coastguard WorkerFor either method, you'd normally set up marker handling after creating a 2566*dfc6aa5cSAndroid Build Coastguard Workerdecompression object and before calling jpeg_read_header(), because the 2567*dfc6aa5cSAndroid Build Coastguard Workermarkers of interest will typically be near the head of the file and so will 2568*dfc6aa5cSAndroid Build Coastguard Workerbe scanned by jpeg_read_header. Once you've established a marker handling 2569*dfc6aa5cSAndroid Build Coastguard Workermethod, it will be used for the life of that decompression object 2570*dfc6aa5cSAndroid Build Coastguard Worker(potentially many datastreams), unless you change it. Marker handling is 2571*dfc6aa5cSAndroid Build Coastguard Workerdetermined separately for COM markers and for each APPn marker code. 2572*dfc6aa5cSAndroid Build Coastguard Worker 2573*dfc6aa5cSAndroid Build Coastguard Worker 2574*dfc6aa5cSAndroid Build Coastguard WorkerTo save the contents of special markers in memory, call 2575*dfc6aa5cSAndroid Build Coastguard Worker jpeg_save_markers(cinfo, marker_code, length_limit) 2576*dfc6aa5cSAndroid Build Coastguard Workerwhere marker_code is the marker type to save, JPEG_COM or JPEG_APP0+n. 2577*dfc6aa5cSAndroid Build Coastguard Worker(To arrange to save all the special marker types, you need to call this 2578*dfc6aa5cSAndroid Build Coastguard Workerroutine 17 times, for COM and APP0-APP15.) If the incoming marker is longer 2579*dfc6aa5cSAndroid Build Coastguard Workerthan length_limit data bytes, only length_limit bytes will be saved; this 2580*dfc6aa5cSAndroid Build Coastguard Workerparameter allows you to avoid chewing up memory when you only need to see the 2581*dfc6aa5cSAndroid Build Coastguard Workerfirst few bytes of a potentially large marker. If you want to save all the 2582*dfc6aa5cSAndroid Build Coastguard Workerdata, set length_limit to 0xFFFF; that is enough since marker lengths are only 2583*dfc6aa5cSAndroid Build Coastguard Worker16 bits. As a special case, setting length_limit to 0 prevents that marker 2584*dfc6aa5cSAndroid Build Coastguard Workertype from being saved at all. (That is the default behavior, in fact.) 2585*dfc6aa5cSAndroid Build Coastguard Worker 2586*dfc6aa5cSAndroid Build Coastguard WorkerAfter jpeg_read_header() completes, you can examine the special markers by 2587*dfc6aa5cSAndroid Build Coastguard Workerfollowing the cinfo->marker_list pointer chain. All the special markers in 2588*dfc6aa5cSAndroid Build Coastguard Workerthe file appear in this list, in order of their occurrence in the file (but 2589*dfc6aa5cSAndroid Build Coastguard Workeromitting any markers of types you didn't ask for). Both the original data 2590*dfc6aa5cSAndroid Build Coastguard Workerlength and the saved data length are recorded for each list entry; the latter 2591*dfc6aa5cSAndroid Build Coastguard Workerwill not exceed length_limit for the particular marker type. Note that these 2592*dfc6aa5cSAndroid Build Coastguard Workerlengths exclude the marker length word, whereas the stored representation 2593*dfc6aa5cSAndroid Build Coastguard Workerwithin the JPEG file includes it. (Hence the maximum data length is really 2594*dfc6aa5cSAndroid Build Coastguard Workeronly 65533.) 2595*dfc6aa5cSAndroid Build Coastguard Worker 2596*dfc6aa5cSAndroid Build Coastguard WorkerIt is possible that additional special markers appear in the file beyond the 2597*dfc6aa5cSAndroid Build Coastguard WorkerSOS marker at which jpeg_read_header stops; if so, the marker list will be 2598*dfc6aa5cSAndroid Build Coastguard Workerextended during reading of the rest of the file. This is not expected to be 2599*dfc6aa5cSAndroid Build Coastguard Workercommon, however. If you are short on memory you may want to reset the length 2600*dfc6aa5cSAndroid Build Coastguard Workerlimit to zero for all marker types after finishing jpeg_read_header, to 2601*dfc6aa5cSAndroid Build Coastguard Workerensure that the max_memory_to_use setting cannot be exceeded due to addition 2602*dfc6aa5cSAndroid Build Coastguard Workerof later markers. 2603*dfc6aa5cSAndroid Build Coastguard Worker 2604*dfc6aa5cSAndroid Build Coastguard WorkerThe marker list remains stored until you call jpeg_finish_decompress or 2605*dfc6aa5cSAndroid Build Coastguard Workerjpeg_abort, at which point the memory is freed and the list is set to empty. 2606*dfc6aa5cSAndroid Build Coastguard Worker(jpeg_destroy also releases the storage, of course.) 2607*dfc6aa5cSAndroid Build Coastguard Worker 2608*dfc6aa5cSAndroid Build Coastguard WorkerNote that the library is internally interested in APP0 and APP14 markers; 2609*dfc6aa5cSAndroid Build Coastguard Workerif you try to set a small nonzero length limit on these types, the library 2610*dfc6aa5cSAndroid Build Coastguard Workerwill silently force the length up to the minimum it wants. (But you can set 2611*dfc6aa5cSAndroid Build Coastguard Workera zero length limit to prevent them from being saved at all.) Also, in a 2612*dfc6aa5cSAndroid Build Coastguard Worker16-bit environment, the maximum length limit may be constrained to less than 2613*dfc6aa5cSAndroid Build Coastguard Worker65533 by malloc() limitations. It is therefore best not to assume that the 2614*dfc6aa5cSAndroid Build Coastguard Workereffective length limit is exactly what you set it to be. 2615*dfc6aa5cSAndroid Build Coastguard Worker 2616*dfc6aa5cSAndroid Build Coastguard Worker 2617*dfc6aa5cSAndroid Build Coastguard WorkerIf you want to supply your own marker-reading routine, you do it by calling 2618*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_marker_processor(). A marker processor routine must have the 2619*dfc6aa5cSAndroid Build Coastguard Workersignature 2620*dfc6aa5cSAndroid Build Coastguard Worker boolean jpeg_marker_parser_method (j_decompress_ptr cinfo) 2621*dfc6aa5cSAndroid Build Coastguard WorkerAlthough the marker code is not explicitly passed, the routine can find it 2622*dfc6aa5cSAndroid Build Coastguard Workerin cinfo->unread_marker. At the time of call, the marker proper has been 2623*dfc6aa5cSAndroid Build Coastguard Workerread from the data source module. The processor routine is responsible for 2624*dfc6aa5cSAndroid Build Coastguard Workerreading the marker length word and the remaining parameter bytes, if any. 2625*dfc6aa5cSAndroid Build Coastguard WorkerReturn TRUE to indicate success. (FALSE should be returned only if you are 2626*dfc6aa5cSAndroid Build Coastguard Workerusing a suspending data source and it tells you to suspend. See the standard 2627*dfc6aa5cSAndroid Build Coastguard Workermarker processors in jdmarker.c for appropriate coding methods if you need to 2628*dfc6aa5cSAndroid Build Coastguard Workeruse a suspending data source.) 2629*dfc6aa5cSAndroid Build Coastguard Worker 2630*dfc6aa5cSAndroid Build Coastguard WorkerIf you override the default APP0 or APP14 processors, it is up to you to 2631*dfc6aa5cSAndroid Build Coastguard Workerrecognize JFIF and Adobe markers if you want colorspace recognition to occur 2632*dfc6aa5cSAndroid Build Coastguard Workerproperly. We recommend copying and extending the default processors if you 2633*dfc6aa5cSAndroid Build Coastguard Workerwant to do that. (A better idea is to save these marker types for later 2634*dfc6aa5cSAndroid Build Coastguard Workerexamination by calling jpeg_save_markers(); that method doesn't interfere 2635*dfc6aa5cSAndroid Build Coastguard Workerwith the library's own processing of these markers.) 2636*dfc6aa5cSAndroid Build Coastguard Worker 2637*dfc6aa5cSAndroid Build Coastguard Workerjpeg_set_marker_processor() and jpeg_save_markers() are mutually exclusive 2638*dfc6aa5cSAndroid Build Coastguard Worker--- if you call one it overrides any previous call to the other, for the 2639*dfc6aa5cSAndroid Build Coastguard Workerparticular marker type specified. 2640*dfc6aa5cSAndroid Build Coastguard Worker 2641*dfc6aa5cSAndroid Build Coastguard WorkerA simple example of an external COM processor can be found in djpeg.c. 2642*dfc6aa5cSAndroid Build Coastguard WorkerAlso, see jpegtran.c for an example of using jpeg_save_markers. 2643*dfc6aa5cSAndroid Build Coastguard Worker 2644*dfc6aa5cSAndroid Build Coastguard Worker 2645*dfc6aa5cSAndroid Build Coastguard WorkerICC profiles 2646*dfc6aa5cSAndroid Build Coastguard Worker------------ 2647*dfc6aa5cSAndroid Build Coastguard Worker 2648*dfc6aa5cSAndroid Build Coastguard WorkerTwo functions are provided for writing and reading International Color 2649*dfc6aa5cSAndroid Build Coastguard WorkerConsortium (ICC) device profiles embedded in JFIF JPEG image files: 2650*dfc6aa5cSAndroid Build Coastguard Worker 2651*dfc6aa5cSAndroid Build Coastguard Worker void jpeg_write_icc_profile (j_compress_ptr cinfo, 2652*dfc6aa5cSAndroid Build Coastguard Worker const JOCTET *icc_data_ptr, 2653*dfc6aa5cSAndroid Build Coastguard Worker unsigned int icc_data_len); 2654*dfc6aa5cSAndroid Build Coastguard Worker boolean jpeg_read_icc_profile (j_decompress_ptr cinfo, 2655*dfc6aa5cSAndroid Build Coastguard Worker JOCTET **icc_data_ptr, 2656*dfc6aa5cSAndroid Build Coastguard Worker unsigned int *icc_data_len); 2657*dfc6aa5cSAndroid Build Coastguard Worker 2658*dfc6aa5cSAndroid Build Coastguard WorkerThe ICC has defined a standard for including such data in JPEG "APP2" markers. 2659*dfc6aa5cSAndroid Build Coastguard WorkerThe aforementioned functions do not know anything about the internal structure 2660*dfc6aa5cSAndroid Build Coastguard Workerof the ICC profile data; they just know how to embed the profile data into a 2661*dfc6aa5cSAndroid Build Coastguard WorkerJPEG file while writing it, or to extract the profile data from a JPEG file 2662*dfc6aa5cSAndroid Build Coastguard Workerwhile reading it. 2663*dfc6aa5cSAndroid Build Coastguard Worker 2664*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_icc_profile() must be called after calling jpeg_start_compress() and 2665*dfc6aa5cSAndroid Build Coastguard Workerbefore the first call to jpeg_write_scanlines() or jpeg_write_raw_data(). This 2666*dfc6aa5cSAndroid Build Coastguard Workerordering ensures that the APP2 marker(s) will appear after the SOI and JFIF or 2667*dfc6aa5cSAndroid Build Coastguard WorkerAdobe markers, but before all other data. 2668*dfc6aa5cSAndroid Build Coastguard Worker 2669*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_icc_profile() returns TRUE if an ICC profile was found and FALSE 2670*dfc6aa5cSAndroid Build Coastguard Workerotherwise. If an ICC profile was found, then the function will allocate a 2671*dfc6aa5cSAndroid Build Coastguard Workermemory region containing the profile and will return a pointer to that memory 2672*dfc6aa5cSAndroid Build Coastguard Workerregion in *icc_data_ptr, as well as the length of the region in *icc_data_len. 2673*dfc6aa5cSAndroid Build Coastguard WorkerThis memory region is allocated by the library using malloc() and must be freed 2674*dfc6aa5cSAndroid Build Coastguard Workerby the caller using free() when the memory region is no longer needed. Callers 2675*dfc6aa5cSAndroid Build Coastguard Workerwishing to use jpeg_read_icc_profile() must call 2676*dfc6aa5cSAndroid Build Coastguard Worker 2677*dfc6aa5cSAndroid Build Coastguard Worker jpeg_save_markers(cinfo, JPEG_APP0 + 2, 0xFFFF); 2678*dfc6aa5cSAndroid Build Coastguard Worker 2679*dfc6aa5cSAndroid Build Coastguard Workerprior to calling jpeg_read_header(). jpeg_read_icc_profile() can be called at 2680*dfc6aa5cSAndroid Build Coastguard Workerany point between jpeg_read_header() and jpeg_finish_decompress(). 2681*dfc6aa5cSAndroid Build Coastguard Worker 2682*dfc6aa5cSAndroid Build Coastguard Worker 2683*dfc6aa5cSAndroid Build Coastguard WorkerRaw (downsampled) image data 2684*dfc6aa5cSAndroid Build Coastguard Worker---------------------------- 2685*dfc6aa5cSAndroid Build Coastguard Worker 2686*dfc6aa5cSAndroid Build Coastguard WorkerSome applications need to supply already-downsampled image data to the JPEG 2687*dfc6aa5cSAndroid Build Coastguard Workercompressor, or to receive raw downsampled data from the decompressor. The 2688*dfc6aa5cSAndroid Build Coastguard Workerlibrary supports this requirement by allowing the application to write or 2689*dfc6aa5cSAndroid Build Coastguard Workerread raw data, bypassing the normal preprocessing or postprocessing steps. 2690*dfc6aa5cSAndroid Build Coastguard WorkerThe interface is different from the standard one and is somewhat harder to 2691*dfc6aa5cSAndroid Build Coastguard Workeruse. If your interest is merely in bypassing color conversion, we recommend 2692*dfc6aa5cSAndroid Build Coastguard Workerthat you use the standard interface and simply set jpeg_color_space = 2693*dfc6aa5cSAndroid Build Coastguard Workerin_color_space (or jpeg_color_space = out_color_space for decompression). 2694*dfc6aa5cSAndroid Build Coastguard WorkerThe mechanism described in this section is necessary only to supply or 2695*dfc6aa5cSAndroid Build Coastguard Workerreceive downsampled image data, in which not all components have the same 2696*dfc6aa5cSAndroid Build Coastguard Workerdimensions. 2697*dfc6aa5cSAndroid Build Coastguard Worker 2698*dfc6aa5cSAndroid Build Coastguard Worker 2699*dfc6aa5cSAndroid Build Coastguard WorkerTo compress raw data, you must supply the data in the colorspace to be used 2700*dfc6aa5cSAndroid Build Coastguard Workerin the JPEG file (please read the earlier section on Special color spaces) 2701*dfc6aa5cSAndroid Build Coastguard Workerand downsampled to the sampling factors specified in the JPEG parameters. 2702*dfc6aa5cSAndroid Build Coastguard WorkerYou must supply the data in the format used internally by the JPEG library, 2703*dfc6aa5cSAndroid Build Coastguard Workernamely a JSAMPIMAGE array. This is an array of pointers to two-dimensional 2704*dfc6aa5cSAndroid Build Coastguard Workerarrays, each of type JSAMPARRAY. Each 2-D array holds the values for one 2705*dfc6aa5cSAndroid Build Coastguard Workercolor component. This structure is necessary since the components are of 2706*dfc6aa5cSAndroid Build Coastguard Workerdifferent sizes. If the image dimensions are not a multiple of the MCU size, 2707*dfc6aa5cSAndroid Build Coastguard Workeryou must also pad the data correctly (usually, this is done by replicating 2708*dfc6aa5cSAndroid Build Coastguard Workerthe last column and/or row). The data must be padded to a multiple of a DCT 2709*dfc6aa5cSAndroid Build Coastguard Workerblock in each component: that is, each downsampled row must contain a 2710*dfc6aa5cSAndroid Build Coastguard Workermultiple of 8 valid samples, and there must be a multiple of 8 sample rows 2711*dfc6aa5cSAndroid Build Coastguard Workerfor each component. (For applications such as conversion of digital TV 2712*dfc6aa5cSAndroid Build Coastguard Workerimages, the standard image size is usually a multiple of the DCT block size, 2713*dfc6aa5cSAndroid Build Coastguard Workerso that no padding need actually be done.) 2714*dfc6aa5cSAndroid Build Coastguard Worker 2715*dfc6aa5cSAndroid Build Coastguard WorkerThe procedure for compression of raw data is basically the same as normal 2716*dfc6aa5cSAndroid Build Coastguard Workercompression, except that you call jpeg_write_raw_data() in place of 2717*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_scanlines(). Before calling jpeg_start_compress(), you must do 2718*dfc6aa5cSAndroid Build Coastguard Workerthe following: 2719*dfc6aa5cSAndroid Build Coastguard Worker * Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().) 2720*dfc6aa5cSAndroid Build Coastguard Worker This notifies the library that you will be supplying raw data. 2721*dfc6aa5cSAndroid Build Coastguard Worker * Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace() 2722*dfc6aa5cSAndroid Build Coastguard Worker call is a good idea. Note that since color conversion is bypassed, 2723*dfc6aa5cSAndroid Build Coastguard Worker in_color_space is ignored, except that jpeg_set_defaults() uses it to 2724*dfc6aa5cSAndroid Build Coastguard Worker choose the default jpeg_color_space setting. 2725*dfc6aa5cSAndroid Build Coastguard Worker * Ensure the sampling factors, cinfo->comp_info[i].h_samp_factor and 2726*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[i].v_samp_factor, are correct. Since these indicate the 2727*dfc6aa5cSAndroid Build Coastguard Worker dimensions of the data you are supplying, it's wise to set them 2728*dfc6aa5cSAndroid Build Coastguard Worker explicitly, rather than assuming the library's defaults are what you want. 2729*dfc6aa5cSAndroid Build Coastguard Worker 2730*dfc6aa5cSAndroid Build Coastguard WorkerTo pass raw data to the library, call jpeg_write_raw_data() in place of 2731*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_scanlines(). The two routines work similarly except that 2732*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_raw_data takes a JSAMPIMAGE data array rather than JSAMPARRAY. 2733*dfc6aa5cSAndroid Build Coastguard WorkerThe scanlines count passed to and returned from jpeg_write_raw_data is 2734*dfc6aa5cSAndroid Build Coastguard Workermeasured in terms of the component with the largest v_samp_factor. 2735*dfc6aa5cSAndroid Build Coastguard Worker 2736*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_raw_data() processes one MCU row per call, which is to say 2737*dfc6aa5cSAndroid Build Coastguard Workerv_samp_factor*DCTSIZE sample rows of each component. The passed num_lines 2738*dfc6aa5cSAndroid Build Coastguard Workervalue must be at least max_v_samp_factor*DCTSIZE, and the return value will 2739*dfc6aa5cSAndroid Build Coastguard Workerbe exactly that amount (or possibly some multiple of that amount, in future 2740*dfc6aa5cSAndroid Build Coastguard Workerlibrary versions). This is true even on the last call at the bottom of the 2741*dfc6aa5cSAndroid Build Coastguard Workerimage; don't forget to pad your data as necessary. 2742*dfc6aa5cSAndroid Build Coastguard Worker 2743*dfc6aa5cSAndroid Build Coastguard WorkerThe required dimensions of the supplied data can be computed for each 2744*dfc6aa5cSAndroid Build Coastguard Workercomponent as 2745*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row 2746*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image 2747*dfc6aa5cSAndroid Build Coastguard Workerafter jpeg_start_compress() has initialized those fields. If the valid data 2748*dfc6aa5cSAndroid Build Coastguard Workeris smaller than this, it must be padded appropriately. For some sampling 2749*dfc6aa5cSAndroid Build Coastguard Workerfactors and image sizes, additional dummy DCT blocks are inserted to make 2750*dfc6aa5cSAndroid Build Coastguard Workerthe image a multiple of the MCU dimensions. The library creates such dummy 2751*dfc6aa5cSAndroid Build Coastguard Workerblocks itself; it does not read them from your supplied data. Therefore you 2752*dfc6aa5cSAndroid Build Coastguard Workerneed never pad by more than DCTSIZE samples. An example may help here. 2753*dfc6aa5cSAndroid Build Coastguard WorkerAssume 2h2v downsampling of YCbCr data, that is 2754*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[0].h_samp_factor = 2 for Y 2755*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[0].v_samp_factor = 2 2756*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[1].h_samp_factor = 1 for Cb 2757*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[1].v_samp_factor = 1 2758*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[2].h_samp_factor = 1 for Cr 2759*dfc6aa5cSAndroid Build Coastguard Worker cinfo->comp_info[2].v_samp_factor = 1 2760*dfc6aa5cSAndroid Build Coastguard Workerand suppose that the nominal image dimensions (cinfo->image_width and 2761*dfc6aa5cSAndroid Build Coastguard Workercinfo->image_height) are 101x101 pixels. Then jpeg_start_compress() will 2762*dfc6aa5cSAndroid Build Coastguard Workercompute downsampled_width = 101 and width_in_blocks = 13 for Y, 2763*dfc6aa5cSAndroid Build Coastguard Workerdownsampled_width = 51 and width_in_blocks = 7 for Cb and Cr (and the same 2764*dfc6aa5cSAndroid Build Coastguard Workerfor the height fields). You must pad the Y data to at least 13*8 = 104 2765*dfc6aa5cSAndroid Build Coastguard Workercolumns and rows, the Cb/Cr data to at least 7*8 = 56 columns and rows. The 2766*dfc6aa5cSAndroid Build Coastguard WorkerMCU height is max_v_samp_factor = 2 DCT rows so you must pass at least 16 2767*dfc6aa5cSAndroid Build Coastguard Workerscanlines on each call to jpeg_write_raw_data(), which is to say 16 actual 2768*dfc6aa5cSAndroid Build Coastguard Workersample rows of Y and 8 each of Cb and Cr. A total of 7 MCU rows are needed, 2769*dfc6aa5cSAndroid Build Coastguard Workerso you must pass a total of 7*16 = 112 "scanlines". The last DCT block row 2770*dfc6aa5cSAndroid Build Coastguard Workerof Y data is dummy, so it doesn't matter what you pass for it in the data 2771*dfc6aa5cSAndroid Build Coastguard Workerarrays, but the scanlines count must total up to 112 so that all of the Cb 2772*dfc6aa5cSAndroid Build Coastguard Workerand Cr data gets passed. 2773*dfc6aa5cSAndroid Build Coastguard Worker 2774*dfc6aa5cSAndroid Build Coastguard WorkerOutput suspension is supported with raw-data compression: if the data 2775*dfc6aa5cSAndroid Build Coastguard Workerdestination module suspends, jpeg_write_raw_data() will return 0. 2776*dfc6aa5cSAndroid Build Coastguard WorkerIn this case the same data rows must be passed again on the next call. 2777*dfc6aa5cSAndroid Build Coastguard Worker 2778*dfc6aa5cSAndroid Build Coastguard Worker 2779*dfc6aa5cSAndroid Build Coastguard WorkerDecompression with raw data output implies bypassing all postprocessing: 2780*dfc6aa5cSAndroid Build Coastguard Workeryou cannot ask for rescaling or color quantization, for instance. More 2781*dfc6aa5cSAndroid Build Coastguard Workerseriously, you must deal with the color space and sampling factors present in 2782*dfc6aa5cSAndroid Build Coastguard Workerthe incoming file. If your application only handles, say, 2h1v YCbCr data, 2783*dfc6aa5cSAndroid Build Coastguard Workeryou must check for and fail on other color spaces or other sampling factors. 2784*dfc6aa5cSAndroid Build Coastguard WorkerThe library will not convert to a different color space for you. 2785*dfc6aa5cSAndroid Build Coastguard Worker 2786*dfc6aa5cSAndroid Build Coastguard WorkerTo obtain raw data output, set cinfo->raw_data_out = TRUE before 2787*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to 2788*dfc6aa5cSAndroid Build Coastguard Workerverify that the color space and sampling factors are ones you can handle. 2789*dfc6aa5cSAndroid Build Coastguard WorkerThen call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The 2790*dfc6aa5cSAndroid Build Coastguard Workerdecompression process is otherwise the same as usual. 2791*dfc6aa5cSAndroid Build Coastguard Worker 2792*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_raw_data() returns one MCU row per call, and thus you must pass a 2793*dfc6aa5cSAndroid Build Coastguard Workerbuffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is 2794*dfc6aa5cSAndroid Build Coastguard Workerthe same as for raw-data compression). The buffer you pass must be large 2795*dfc6aa5cSAndroid Build Coastguard Workerenough to hold the actual data plus padding to DCT-block boundaries. As with 2796*dfc6aa5cSAndroid Build Coastguard Workercompression, any entirely dummy DCT blocks are not processed so you need not 2797*dfc6aa5cSAndroid Build Coastguard Workerallocate space for them, but the total scanline count includes them. The 2798*dfc6aa5cSAndroid Build Coastguard Workerabove example of computing buffer dimensions for raw-data compression is 2799*dfc6aa5cSAndroid Build Coastguard Workerequally valid for decompression. 2800*dfc6aa5cSAndroid Build Coastguard Worker 2801*dfc6aa5cSAndroid Build Coastguard WorkerInput suspension is supported with raw-data decompression: if the data source 2802*dfc6aa5cSAndroid Build Coastguard Workermodule suspends, jpeg_read_raw_data() will return 0. You can also use 2803*dfc6aa5cSAndroid Build Coastguard Workerbuffered-image mode to read raw data in multiple passes. 2804*dfc6aa5cSAndroid Build Coastguard Worker 2805*dfc6aa5cSAndroid Build Coastguard Worker 2806*dfc6aa5cSAndroid Build Coastguard WorkerReally raw data: DCT coefficients 2807*dfc6aa5cSAndroid Build Coastguard Worker--------------------------------- 2808*dfc6aa5cSAndroid Build Coastguard Worker 2809*dfc6aa5cSAndroid Build Coastguard WorkerIt is possible to read or write the contents of a JPEG file as raw DCT 2810*dfc6aa5cSAndroid Build Coastguard Workercoefficients. This facility is mainly intended for use in lossless 2811*dfc6aa5cSAndroid Build Coastguard Workertranscoding between different JPEG file formats. Other possible applications 2812*dfc6aa5cSAndroid Build Coastguard Workerinclude lossless cropping of a JPEG image, lossless reassembly of a 2813*dfc6aa5cSAndroid Build Coastguard Workermulti-strip or multi-tile TIFF/JPEG file into a single JPEG datastream, etc. 2814*dfc6aa5cSAndroid Build Coastguard Worker 2815*dfc6aa5cSAndroid Build Coastguard WorkerTo read the contents of a JPEG file as DCT coefficients, open the file and do 2816*dfc6aa5cSAndroid Build Coastguard Workerjpeg_read_header() as usual. But instead of calling jpeg_start_decompress() 2817*dfc6aa5cSAndroid Build Coastguard Workerand jpeg_read_scanlines(), call jpeg_read_coefficients(). This will read the 2818*dfc6aa5cSAndroid Build Coastguard Workerentire image into a set of virtual coefficient-block arrays, one array per 2819*dfc6aa5cSAndroid Build Coastguard Workercomponent. The return value is a pointer to an array of virtual-array 2820*dfc6aa5cSAndroid Build Coastguard Workerdescriptors. Each virtual array can be accessed directly using the JPEG 2821*dfc6aa5cSAndroid Build Coastguard Workermemory manager's access_virt_barray method (see Memory management, below, 2822*dfc6aa5cSAndroid Build Coastguard Workerand also read structure.txt's discussion of virtual array handling). Or, 2823*dfc6aa5cSAndroid Build Coastguard Workerfor simple transcoding to a different JPEG file format, the array list can 2824*dfc6aa5cSAndroid Build Coastguard Workerjust be handed directly to jpeg_write_coefficients(). 2825*dfc6aa5cSAndroid Build Coastguard Worker 2826*dfc6aa5cSAndroid Build Coastguard WorkerEach block in the block arrays contains quantized coefficient values in 2827*dfc6aa5cSAndroid Build Coastguard Workernormal array order (not JPEG zigzag order). The block arrays contain only 2828*dfc6aa5cSAndroid Build Coastguard WorkerDCT blocks containing real data; any entirely-dummy blocks added to fill out 2829*dfc6aa5cSAndroid Build Coastguard Workerinterleaved MCUs at the right or bottom edges of the image are discarded 2830*dfc6aa5cSAndroid Build Coastguard Workerduring reading and are not stored in the block arrays. (The size of each 2831*dfc6aa5cSAndroid Build Coastguard Workerblock array can be determined from the width_in_blocks and height_in_blocks 2832*dfc6aa5cSAndroid Build Coastguard Workerfields of the component's comp_info entry.) This is also the data format 2833*dfc6aa5cSAndroid Build Coastguard Workerexpected by jpeg_write_coefficients(). 2834*dfc6aa5cSAndroid Build Coastguard Worker 2835*dfc6aa5cSAndroid Build Coastguard WorkerWhen you are done using the virtual arrays, call jpeg_finish_decompress() 2836*dfc6aa5cSAndroid Build Coastguard Workerto release the array storage and return the decompression object to an idle 2837*dfc6aa5cSAndroid Build Coastguard Workerstate; or just call jpeg_destroy() if you don't need to reuse the object. 2838*dfc6aa5cSAndroid Build Coastguard Worker 2839*dfc6aa5cSAndroid Build Coastguard WorkerIf you use a suspending data source, jpeg_read_coefficients() will return 2840*dfc6aa5cSAndroid Build Coastguard WorkerNULL if it is forced to suspend; a non-NULL return value indicates successful 2841*dfc6aa5cSAndroid Build Coastguard Workercompletion. You need not test for a NULL return value when using a 2842*dfc6aa5cSAndroid Build Coastguard Workernon-suspending data source. 2843*dfc6aa5cSAndroid Build Coastguard Worker 2844*dfc6aa5cSAndroid Build Coastguard WorkerIt is also possible to call jpeg_read_coefficients() to obtain access to the 2845*dfc6aa5cSAndroid Build Coastguard Workerdecoder's coefficient arrays during a normal decode cycle in buffered-image 2846*dfc6aa5cSAndroid Build Coastguard Workermode. This frammish might be useful for progressively displaying an incoming 2847*dfc6aa5cSAndroid Build Coastguard Workerimage and then re-encoding it without loss. To do this, decode in buffered- 2848*dfc6aa5cSAndroid Build Coastguard Workerimage mode as discussed previously, then call jpeg_read_coefficients() after 2849*dfc6aa5cSAndroid Build Coastguard Workerthe last jpeg_finish_output() call. The arrays will be available for your use 2850*dfc6aa5cSAndroid Build Coastguard Workeruntil you call jpeg_finish_decompress(). 2851*dfc6aa5cSAndroid Build Coastguard Worker 2852*dfc6aa5cSAndroid Build Coastguard Worker 2853*dfc6aa5cSAndroid Build Coastguard WorkerTo write the contents of a JPEG file as DCT coefficients, you must provide 2854*dfc6aa5cSAndroid Build Coastguard Workerthe DCT coefficients stored in virtual block arrays. You can either pass 2855*dfc6aa5cSAndroid Build Coastguard Workerblock arrays read from an input JPEG file by jpeg_read_coefficients(), or 2856*dfc6aa5cSAndroid Build Coastguard Workerallocate virtual arrays from the JPEG compression object and fill them 2857*dfc6aa5cSAndroid Build Coastguard Workeryourself. In either case, jpeg_write_coefficients() is substituted for 2858*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_compress() and jpeg_write_scanlines(). Thus the sequence is 2859*dfc6aa5cSAndroid Build Coastguard Worker * Create compression object 2860*dfc6aa5cSAndroid Build Coastguard Worker * Set all compression parameters as necessary 2861*dfc6aa5cSAndroid Build Coastguard Worker * Request virtual arrays if needed 2862*dfc6aa5cSAndroid Build Coastguard Worker * jpeg_write_coefficients() 2863*dfc6aa5cSAndroid Build Coastguard Worker * jpeg_finish_compress() 2864*dfc6aa5cSAndroid Build Coastguard Worker * Destroy or re-use compression object 2865*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_coefficients() is passed a pointer to an array of virtual block 2866*dfc6aa5cSAndroid Build Coastguard Workerarray descriptors; the number of arrays is equal to cinfo.num_components. 2867*dfc6aa5cSAndroid Build Coastguard Worker 2868*dfc6aa5cSAndroid Build Coastguard WorkerThe virtual arrays need only have been requested, not realized, before 2869*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_coefficients() is called. A side-effect of 2870*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_coefficients() is to realize any virtual arrays that have been 2871*dfc6aa5cSAndroid Build Coastguard Workerrequested from the compression object's memory manager. Thus, when obtaining 2872*dfc6aa5cSAndroid Build Coastguard Workerthe virtual arrays from the compression object, you should fill the arrays 2873*dfc6aa5cSAndroid Build Coastguard Workerafter calling jpeg_write_coefficients(). The data is actually written out 2874*dfc6aa5cSAndroid Build Coastguard Workerwhen you call jpeg_finish_compress(); jpeg_write_coefficients() only writes 2875*dfc6aa5cSAndroid Build Coastguard Workerthe file header. 2876*dfc6aa5cSAndroid Build Coastguard Worker 2877*dfc6aa5cSAndroid Build Coastguard WorkerWhen writing raw DCT coefficients, it is crucial that the JPEG quantization 2878*dfc6aa5cSAndroid Build Coastguard Workertables and sampling factors match the way the data was encoded, or the 2879*dfc6aa5cSAndroid Build Coastguard Workerresulting file will be invalid. For transcoding from an existing JPEG file, 2880*dfc6aa5cSAndroid Build Coastguard Workerwe recommend using jpeg_copy_critical_parameters(). This routine initializes 2881*dfc6aa5cSAndroid Build Coastguard Workerall the compression parameters to default values (like jpeg_set_defaults()), 2882*dfc6aa5cSAndroid Build Coastguard Workerthen copies the critical information from a source decompression object. 2883*dfc6aa5cSAndroid Build Coastguard WorkerThe decompression object should have just been used to read the entire 2884*dfc6aa5cSAndroid Build Coastguard WorkerJPEG input file --- that is, it should be awaiting jpeg_finish_decompress(). 2885*dfc6aa5cSAndroid Build Coastguard Worker 2886*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_coefficients() marks all tables stored in the compression object 2887*dfc6aa5cSAndroid Build Coastguard Workeras needing to be written to the output file (thus, it acts like 2888*dfc6aa5cSAndroid Build Coastguard Workerjpeg_start_compress(cinfo, TRUE)). This is for safety's sake, to avoid 2889*dfc6aa5cSAndroid Build Coastguard Workeremitting abbreviated JPEG files by accident. If you really want to emit an 2890*dfc6aa5cSAndroid Build Coastguard Workerabbreviated JPEG file, call jpeg_suppress_tables(), or set the tables' 2891*dfc6aa5cSAndroid Build Coastguard Workerindividual sent_table flags, between calling jpeg_write_coefficients() and 2892*dfc6aa5cSAndroid Build Coastguard Workerjpeg_finish_compress(). 2893*dfc6aa5cSAndroid Build Coastguard Worker 2894*dfc6aa5cSAndroid Build Coastguard Worker 2895*dfc6aa5cSAndroid Build Coastguard WorkerProgress monitoring 2896*dfc6aa5cSAndroid Build Coastguard Worker------------------- 2897*dfc6aa5cSAndroid Build Coastguard Worker 2898*dfc6aa5cSAndroid Build Coastguard WorkerSome applications may need to regain control from the JPEG library every so 2899*dfc6aa5cSAndroid Build Coastguard Workeroften. The typical use of this feature is to produce a percent-done bar or 2900*dfc6aa5cSAndroid Build Coastguard Workerother progress display. (For a simple example, see cjpeg.c or djpeg.c.) 2901*dfc6aa5cSAndroid Build Coastguard WorkerAlthough you do get control back frequently during the data-transferring pass 2902*dfc6aa5cSAndroid Build Coastguard Worker(the jpeg_read_scanlines or jpeg_write_scanlines loop), any additional passes 2903*dfc6aa5cSAndroid Build Coastguard Workerwill occur inside jpeg_finish_compress or jpeg_start_decompress; those 2904*dfc6aa5cSAndroid Build Coastguard Workerroutines may take a long time to execute, and you don't get control back 2905*dfc6aa5cSAndroid Build Coastguard Workeruntil they are done. 2906*dfc6aa5cSAndroid Build Coastguard Worker 2907*dfc6aa5cSAndroid Build Coastguard WorkerYou can define a progress-monitor routine which will be called periodically 2908*dfc6aa5cSAndroid Build Coastguard Workerby the library. No guarantees are made about how often this call will occur, 2909*dfc6aa5cSAndroid Build Coastguard Workerso we don't recommend you use it for mouse tracking or anything like that. 2910*dfc6aa5cSAndroid Build Coastguard WorkerAt present, a call will occur once per MCU row, scanline, or sample row 2911*dfc6aa5cSAndroid Build Coastguard Workergroup, whichever unit is convenient for the current processing mode; so the 2912*dfc6aa5cSAndroid Build Coastguard Workerwider the image, the longer the time between calls. During the data 2913*dfc6aa5cSAndroid Build Coastguard Workertransferring pass, only one call occurs per call of jpeg_read_scanlines or 2914*dfc6aa5cSAndroid Build Coastguard Workerjpeg_write_scanlines, so don't pass a large number of scanlines at once if 2915*dfc6aa5cSAndroid Build Coastguard Workeryou want fine resolution in the progress count. (If you really need to use 2916*dfc6aa5cSAndroid Build Coastguard Workerthe callback mechanism for time-critical tasks like mouse tracking, you could 2917*dfc6aa5cSAndroid Build Coastguard Workerinsert additional calls inside some of the library's inner loops.) 2918*dfc6aa5cSAndroid Build Coastguard Worker 2919*dfc6aa5cSAndroid Build Coastguard WorkerTo establish a progress-monitor callback, create a struct jpeg_progress_mgr, 2920*dfc6aa5cSAndroid Build Coastguard Workerfill in its progress_monitor field with a pointer to your callback routine, 2921*dfc6aa5cSAndroid Build Coastguard Workerand set cinfo->progress to point to the struct. The callback will be called 2922*dfc6aa5cSAndroid Build Coastguard Workerwhenever cinfo->progress is non-NULL. (This pointer is set to NULL by 2923*dfc6aa5cSAndroid Build Coastguard Workerjpeg_create_compress or jpeg_create_decompress; the library will not change 2924*dfc6aa5cSAndroid Build Coastguard Workerit thereafter. So if you allocate dynamic storage for the progress struct, 2925*dfc6aa5cSAndroid Build Coastguard Workermake sure it will live as long as the JPEG object does. Allocating from the 2926*dfc6aa5cSAndroid Build Coastguard WorkerJPEG memory manager with lifetime JPOOL_PERMANENT will work nicely.) You 2927*dfc6aa5cSAndroid Build Coastguard Workercan use the same callback routine for both compression and decompression. 2928*dfc6aa5cSAndroid Build Coastguard Worker 2929*dfc6aa5cSAndroid Build Coastguard WorkerThe jpeg_progress_mgr struct contains four fields which are set by the library: 2930*dfc6aa5cSAndroid Build Coastguard Worker long pass_counter; /* work units completed in this pass */ 2931*dfc6aa5cSAndroid Build Coastguard Worker long pass_limit; /* total number of work units in this pass */ 2932*dfc6aa5cSAndroid Build Coastguard Worker int completed_passes; /* passes completed so far */ 2933*dfc6aa5cSAndroid Build Coastguard Worker int total_passes; /* total number of passes expected */ 2934*dfc6aa5cSAndroid Build Coastguard WorkerDuring any one pass, pass_counter increases from 0 up to (not including) 2935*dfc6aa5cSAndroid Build Coastguard Workerpass_limit; the step size is usually but not necessarily 1. The pass_limit 2936*dfc6aa5cSAndroid Build Coastguard Workervalue may change from one pass to another. The expected total number of 2937*dfc6aa5cSAndroid Build Coastguard Workerpasses is in total_passes, and the number of passes already completed is in 2938*dfc6aa5cSAndroid Build Coastguard Workercompleted_passes. Thus the fraction of work completed may be estimated as 2939*dfc6aa5cSAndroid Build Coastguard Worker completed_passes + (pass_counter/pass_limit) 2940*dfc6aa5cSAndroid Build Coastguard Worker -------------------------------------------- 2941*dfc6aa5cSAndroid Build Coastguard Worker total_passes 2942*dfc6aa5cSAndroid Build Coastguard Workerignoring the fact that the passes may not be equal amounts of work. 2943*dfc6aa5cSAndroid Build Coastguard Worker 2944*dfc6aa5cSAndroid Build Coastguard WorkerWhen decompressing, pass_limit can even change within a pass, because it 2945*dfc6aa5cSAndroid Build Coastguard Workerdepends on the number of scans in the JPEG file, which isn't always known in 2946*dfc6aa5cSAndroid Build Coastguard Workeradvance. The computed fraction-of-work-done may jump suddenly (if the library 2947*dfc6aa5cSAndroid Build Coastguard Workerdiscovers it has overestimated the number of scans) or even decrease (in the 2948*dfc6aa5cSAndroid Build Coastguard Workeropposite case). It is not wise to put great faith in the work estimate. 2949*dfc6aa5cSAndroid Build Coastguard Worker 2950*dfc6aa5cSAndroid Build Coastguard WorkerWhen using the decompressor's buffered-image mode, the progress monitor work 2951*dfc6aa5cSAndroid Build Coastguard Workerestimate is likely to be completely unhelpful, because the library has no way 2952*dfc6aa5cSAndroid Build Coastguard Workerto know how many output passes will be demanded of it. Currently, the library 2953*dfc6aa5cSAndroid Build Coastguard Workersets total_passes based on the assumption that there will be one more output 2954*dfc6aa5cSAndroid Build Coastguard Workerpass if the input file end hasn't yet been read (jpeg_input_complete() isn't 2955*dfc6aa5cSAndroid Build Coastguard WorkerTRUE), but no more output passes if the file end has been reached when the 2956*dfc6aa5cSAndroid Build Coastguard Workeroutput pass is started. This means that total_passes will rise as additional 2957*dfc6aa5cSAndroid Build Coastguard Workeroutput passes are requested. If you have a way of determining the input file 2958*dfc6aa5cSAndroid Build Coastguard Workersize, estimating progress based on the fraction of the file that's been read 2959*dfc6aa5cSAndroid Build Coastguard Workerwill probably be more useful than using the library's value. 2960*dfc6aa5cSAndroid Build Coastguard Worker 2961*dfc6aa5cSAndroid Build Coastguard Worker 2962*dfc6aa5cSAndroid Build Coastguard WorkerMemory management 2963*dfc6aa5cSAndroid Build Coastguard Worker----------------- 2964*dfc6aa5cSAndroid Build Coastguard Worker 2965*dfc6aa5cSAndroid Build Coastguard WorkerThis section covers some key facts about the JPEG library's built-in memory 2966*dfc6aa5cSAndroid Build Coastguard Workermanager. For more info, please read structure.txt's section about the memory 2967*dfc6aa5cSAndroid Build Coastguard Workermanager, and consult the source code if necessary. 2968*dfc6aa5cSAndroid Build Coastguard Worker 2969*dfc6aa5cSAndroid Build Coastguard WorkerAll memory and temporary file allocation within the library is done via the 2970*dfc6aa5cSAndroid Build Coastguard Workermemory manager. If necessary, you can replace the "back end" of the memory 2971*dfc6aa5cSAndroid Build Coastguard Workermanager to control allocation yourself (for example, if you don't want the 2972*dfc6aa5cSAndroid Build Coastguard Workerlibrary to use malloc() and free() for some reason). 2973*dfc6aa5cSAndroid Build Coastguard Worker 2974*dfc6aa5cSAndroid Build Coastguard WorkerSome data is allocated "permanently" and will not be freed until the JPEG 2975*dfc6aa5cSAndroid Build Coastguard Workerobject is destroyed. Most data is allocated "per image" and is freed by 2976*dfc6aa5cSAndroid Build Coastguard Workerjpeg_finish_compress, jpeg_finish_decompress, or jpeg_abort. You can call the 2977*dfc6aa5cSAndroid Build Coastguard Workermemory manager yourself to allocate structures that will automatically be 2978*dfc6aa5cSAndroid Build Coastguard Workerfreed at these times. Typical code for this is 2979*dfc6aa5cSAndroid Build Coastguard Worker ptr = (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, size); 2980*dfc6aa5cSAndroid Build Coastguard WorkerUse JPOOL_PERMANENT to get storage that lasts as long as the JPEG object. 2981*dfc6aa5cSAndroid Build Coastguard WorkerUse alloc_large instead of alloc_small for anything bigger than a few Kbytes. 2982*dfc6aa5cSAndroid Build Coastguard WorkerThere are also alloc_sarray and alloc_barray routines that automatically 2983*dfc6aa5cSAndroid Build Coastguard Workerbuild 2-D sample or block arrays. 2984*dfc6aa5cSAndroid Build Coastguard Worker 2985*dfc6aa5cSAndroid Build Coastguard WorkerThe library's minimum space requirements to process an image depend on the 2986*dfc6aa5cSAndroid Build Coastguard Workerimage's width, but not on its height, because the library ordinarily works 2987*dfc6aa5cSAndroid Build Coastguard Workerwith "strip" buffers that are as wide as the image but just a few rows high. 2988*dfc6aa5cSAndroid Build Coastguard WorkerSome operating modes (eg, two-pass color quantization) require full-image 2989*dfc6aa5cSAndroid Build Coastguard Workerbuffers. Such buffers are treated as "virtual arrays": only the current strip 2990*dfc6aa5cSAndroid Build Coastguard Workerneed be in memory, and the rest can be swapped out to a temporary file. 2991*dfc6aa5cSAndroid Build Coastguard Worker 2992*dfc6aa5cSAndroid Build Coastguard WorkerWhen using temporary files, the library will make the in-memory buffers for 2993*dfc6aa5cSAndroid Build Coastguard Workerits virtual arrays just big enough to stay within a "maximum memory" setting. 2994*dfc6aa5cSAndroid Build Coastguard WorkerYour application can set this limit by setting cinfo->mem->max_memory_to_use 2995*dfc6aa5cSAndroid Build Coastguard Workerafter creating the JPEG object. (Of course, there is still a minimum size for 2996*dfc6aa5cSAndroid Build Coastguard Workerthe buffers, so the max-memory setting is effective only if it is bigger than 2997*dfc6aa5cSAndroid Build Coastguard Workerthe minimum space needed.) If you allocate any large structures yourself, you 2998*dfc6aa5cSAndroid Build Coastguard Workermust allocate them before jpeg_start_compress() or jpeg_start_decompress() in 2999*dfc6aa5cSAndroid Build Coastguard Workerorder to have them counted against the max memory limit. Also keep in mind 3000*dfc6aa5cSAndroid Build Coastguard Workerthat space allocated with alloc_small() is ignored, on the assumption that 3001*dfc6aa5cSAndroid Build Coastguard Workerit's too small to be worth worrying about; so a reasonable safety margin 3002*dfc6aa5cSAndroid Build Coastguard Workershould be left when setting max_memory_to_use. 3003*dfc6aa5cSAndroid Build Coastguard Worker 3004*dfc6aa5cSAndroid Build Coastguard WorkerNOTE: Unless you develop your own memory manager back end, then temporary files 3005*dfc6aa5cSAndroid Build Coastguard Workerwill never be used. The back end provided in libjpeg-turbo (jmemnobs.c) simply 3006*dfc6aa5cSAndroid Build Coastguard Workermalloc()s and free()s virtual arrays, and an error occurs if the required 3007*dfc6aa5cSAndroid Build Coastguard Workermemory exceeds the limit specified in cinfo->mem->max_memory_to_use. 3008*dfc6aa5cSAndroid Build Coastguard Worker 3009*dfc6aa5cSAndroid Build Coastguard Worker 3010*dfc6aa5cSAndroid Build Coastguard WorkerMemory usage 3011*dfc6aa5cSAndroid Build Coastguard Worker------------ 3012*dfc6aa5cSAndroid Build Coastguard Worker 3013*dfc6aa5cSAndroid Build Coastguard WorkerWorking memory requirements while performing compression or decompression 3014*dfc6aa5cSAndroid Build Coastguard Workerdepend on image dimensions, image characteristics (such as colorspace and 3015*dfc6aa5cSAndroid Build Coastguard WorkerJPEG process), and operating mode (application-selected options). 3016*dfc6aa5cSAndroid Build Coastguard Worker 3017*dfc6aa5cSAndroid Build Coastguard WorkerAs of v6b, the decompressor requires: 3018*dfc6aa5cSAndroid Build Coastguard Worker 1. About 24K in more-or-less-fixed-size data. This varies a bit depending 3019*dfc6aa5cSAndroid Build Coastguard Worker on operating mode and image characteristics (particularly color vs. 3020*dfc6aa5cSAndroid Build Coastguard Worker grayscale), but it doesn't depend on image dimensions. 3021*dfc6aa5cSAndroid Build Coastguard Worker 2. Strip buffers (of size proportional to the image width) for IDCT and 3022*dfc6aa5cSAndroid Build Coastguard Worker upsampling results. The worst case for commonly used sampling factors 3023*dfc6aa5cSAndroid Build Coastguard Worker is about 34 bytes * width in pixels for a color image. A grayscale image 3024*dfc6aa5cSAndroid Build Coastguard Worker only needs about 8 bytes per pixel column. 3025*dfc6aa5cSAndroid Build Coastguard Worker 3. A full-image DCT coefficient buffer is needed to decode a multi-scan JPEG 3026*dfc6aa5cSAndroid Build Coastguard Worker file (including progressive JPEGs), or whenever you select buffered-image 3027*dfc6aa5cSAndroid Build Coastguard Worker mode. This takes 2 bytes/coefficient. At typical 2x2 sampling, that's 3028*dfc6aa5cSAndroid Build Coastguard Worker 3 bytes per pixel for a color image. Worst case (1x1 sampling) requires 3029*dfc6aa5cSAndroid Build Coastguard Worker 6 bytes/pixel. For grayscale, figure 2 bytes/pixel. 3030*dfc6aa5cSAndroid Build Coastguard Worker 4. To perform 2-pass color quantization, the decompressor also needs a 3031*dfc6aa5cSAndroid Build Coastguard Worker 128K color lookup table and a full-image pixel buffer (3 bytes/pixel). 3032*dfc6aa5cSAndroid Build Coastguard WorkerThis does not count any memory allocated by the application, such as a 3033*dfc6aa5cSAndroid Build Coastguard Workerbuffer to hold the final output image. 3034*dfc6aa5cSAndroid Build Coastguard Worker 3035*dfc6aa5cSAndroid Build Coastguard WorkerThe above figures are valid for 8-bit JPEG data precision and a machine with 3036*dfc6aa5cSAndroid Build Coastguard Worker32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and 3037*dfc6aa5cSAndroid Build Coastguard Workerquantization pixel buffer. The "fixed-size" data will be somewhat smaller 3038*dfc6aa5cSAndroid Build Coastguard Workerwith 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual 3039*dfc6aa5cSAndroid Build Coastguard Workercolor spaces will require different amounts of space. 3040*dfc6aa5cSAndroid Build Coastguard Worker 3041*dfc6aa5cSAndroid Build Coastguard WorkerThe full-image coefficient and pixel buffers, if needed at all, do not 3042*dfc6aa5cSAndroid Build Coastguard Workerhave to be fully RAM resident; you can have the library use temporary 3043*dfc6aa5cSAndroid Build Coastguard Workerfiles instead when the total memory usage would exceed a limit you set. 3044*dfc6aa5cSAndroid Build Coastguard Worker(But if your OS supports virtual memory, it's probably better to just use 3045*dfc6aa5cSAndroid Build Coastguard Workerjmemnobs and let the OS do the swapping.) 3046*dfc6aa5cSAndroid Build Coastguard Worker 3047*dfc6aa5cSAndroid Build Coastguard WorkerThe compressor's memory requirements are similar, except that it has no need 3048*dfc6aa5cSAndroid Build Coastguard Workerfor color quantization. Also, it needs a full-image DCT coefficient buffer 3049*dfc6aa5cSAndroid Build Coastguard Workerif Huffman-table optimization is asked for, even if progressive mode is not 3050*dfc6aa5cSAndroid Build Coastguard Workerrequested. 3051*dfc6aa5cSAndroid Build Coastguard Worker 3052*dfc6aa5cSAndroid Build Coastguard WorkerIf you need more detailed information about memory usage in a particular 3053*dfc6aa5cSAndroid Build Coastguard Workersituation, you can enable the MEM_STATS code in jmemmgr.c. 3054*dfc6aa5cSAndroid Build Coastguard Worker 3055*dfc6aa5cSAndroid Build Coastguard Worker 3056*dfc6aa5cSAndroid Build Coastguard WorkerLibrary compile-time options 3057*dfc6aa5cSAndroid Build Coastguard Worker---------------------------- 3058*dfc6aa5cSAndroid Build Coastguard Worker 3059*dfc6aa5cSAndroid Build Coastguard WorkerA number of compile-time options are available by modifying jmorecfg.h. 3060*dfc6aa5cSAndroid Build Coastguard Worker 3061*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG standard provides for both the baseline 8-bit DCT process and 3062*dfc6aa5cSAndroid Build Coastguard Workera 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define 3063*dfc6aa5cSAndroid Build Coastguard WorkerBITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be 3064*dfc6aa5cSAndroid Build Coastguard Workerlarger than a char, so it affects the surrounding application's image data. 3065*dfc6aa5cSAndroid Build Coastguard WorkerThe sample applications cjpeg and djpeg can support 12-bit mode only for PPM 3066*dfc6aa5cSAndroid Build Coastguard Workerand GIF file formats; you must disable the other file formats to compile a 3067*dfc6aa5cSAndroid Build Coastguard Worker12-bit cjpeg or djpeg. At present, a 12-bit library can handle *only* 12-bit 3068*dfc6aa5cSAndroid Build Coastguard Workerimages, not both precisions. 3069*dfc6aa5cSAndroid Build Coastguard Worker 3070*dfc6aa5cSAndroid Build Coastguard WorkerNote that a 12-bit library always compresses in Huffman optimization mode, 3071*dfc6aa5cSAndroid Build Coastguard Workerin order to generate valid Huffman tables. This is necessary because our 3072*dfc6aa5cSAndroid Build Coastguard Workerdefault Huffman tables only cover 8-bit data. If you need to output 12-bit 3073*dfc6aa5cSAndroid Build Coastguard Workerfiles in one pass, you'll have to supply suitable default Huffman tables. 3074*dfc6aa5cSAndroid Build Coastguard WorkerYou may also want to supply your own DCT quantization tables; the existing 3075*dfc6aa5cSAndroid Build Coastguard Workerquality-scaling code has been developed for 8-bit use, and probably doesn't 3076*dfc6aa5cSAndroid Build Coastguard Workergenerate especially good tables for 12-bit. 3077*dfc6aa5cSAndroid Build Coastguard Worker 3078*dfc6aa5cSAndroid Build Coastguard WorkerThe maximum number of components (color channels) in the image is determined 3079*dfc6aa5cSAndroid Build Coastguard Workerby MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we 3080*dfc6aa5cSAndroid Build Coastguard Workerexpect that few applications will need more than four or so. 3081*dfc6aa5cSAndroid Build Coastguard Worker 3082*dfc6aa5cSAndroid Build Coastguard WorkerOn machines with unusual data type sizes, you may be able to improve 3083*dfc6aa5cSAndroid Build Coastguard Workerperformance or reduce memory space by tweaking the various typedefs in 3084*dfc6aa5cSAndroid Build Coastguard Workerjmorecfg.h. In particular, on some RISC CPUs, access to arrays of "short"s 3085*dfc6aa5cSAndroid Build Coastguard Workeris quite slow; consider trading memory for speed by making JCOEF, INT16, and 3086*dfc6aa5cSAndroid Build Coastguard WorkerUINT16 be "int" or "unsigned int". UINT8 is also a candidate to become int. 3087*dfc6aa5cSAndroid Build Coastguard WorkerYou probably don't want to make JSAMPLE be int unless you have lots of memory 3088*dfc6aa5cSAndroid Build Coastguard Workerto burn. 3089*dfc6aa5cSAndroid Build Coastguard Worker 3090*dfc6aa5cSAndroid Build Coastguard WorkerYou can reduce the size of the library by compiling out various optional 3091*dfc6aa5cSAndroid Build Coastguard Workerfunctions. To do this, undefine xxx_SUPPORTED symbols as necessary. 3092*dfc6aa5cSAndroid Build Coastguard Worker 3093*dfc6aa5cSAndroid Build Coastguard WorkerYou can also save a few K by not having text error messages in the library; 3094*dfc6aa5cSAndroid Build Coastguard Workerthe standard error message table occupies about 5Kb. This is particularly 3095*dfc6aa5cSAndroid Build Coastguard Workerreasonable for embedded applications where there's no good way to display 3096*dfc6aa5cSAndroid Build Coastguard Workera message anyway. To do this, remove the creation of the message table 3097*dfc6aa5cSAndroid Build Coastguard Worker(jpeg_std_message_table[]) from jerror.c, and alter format_message to do 3098*dfc6aa5cSAndroid Build Coastguard Workersomething reasonable without it. You could output the numeric value of the 3099*dfc6aa5cSAndroid Build Coastguard Workermessage code number, for example. If you do this, you can also save a couple 3100*dfc6aa5cSAndroid Build Coastguard Workermore K by modifying the TRACEMSn() macros in jerror.h to expand to nothing; 3101*dfc6aa5cSAndroid Build Coastguard Workeryou don't need trace capability anyway, right? 3102*dfc6aa5cSAndroid Build Coastguard Worker 3103*dfc6aa5cSAndroid Build Coastguard Worker 3104*dfc6aa5cSAndroid Build Coastguard WorkerPortability considerations 3105*dfc6aa5cSAndroid Build Coastguard Worker-------------------------- 3106*dfc6aa5cSAndroid Build Coastguard Worker 3107*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG library has been written to be extremely portable; the sample 3108*dfc6aa5cSAndroid Build Coastguard Workerapplications cjpeg and djpeg are slightly less so. This section summarizes 3109*dfc6aa5cSAndroid Build Coastguard Workerthe design goals in this area. (If you encounter any bugs that cause the 3110*dfc6aa5cSAndroid Build Coastguard Workerlibrary to be less portable than is claimed here, we'd appreciate hearing 3111*dfc6aa5cSAndroid Build Coastguard Workerabout them.) 3112*dfc6aa5cSAndroid Build Coastguard Worker 3113*dfc6aa5cSAndroid Build Coastguard WorkerThe code works fine on ANSI C and C++ compilers, using any of the popular 3114*dfc6aa5cSAndroid Build Coastguard Workersystem include file setups, and some not-so-popular ones too. 3115*dfc6aa5cSAndroid Build Coastguard Worker 3116*dfc6aa5cSAndroid Build Coastguard WorkerThe code is not dependent on the exact sizes of the C data types. As 3117*dfc6aa5cSAndroid Build Coastguard Workerdistributed, we make the assumptions that 3118*dfc6aa5cSAndroid Build Coastguard Worker char is at least 8 bits wide 3119*dfc6aa5cSAndroid Build Coastguard Worker short is at least 16 bits wide 3120*dfc6aa5cSAndroid Build Coastguard Worker int is at least 16 bits wide 3121*dfc6aa5cSAndroid Build Coastguard Worker long is at least 32 bits wide 3122*dfc6aa5cSAndroid Build Coastguard Worker(These are the minimum requirements of the ANSI C standard.) Wider types will 3123*dfc6aa5cSAndroid Build Coastguard Workerwork fine, although memory may be used inefficiently if char is much larger 3124*dfc6aa5cSAndroid Build Coastguard Workerthan 8 bits or short is much bigger than 16 bits. The code should work 3125*dfc6aa5cSAndroid Build Coastguard Workerequally well with 16- or 32-bit ints. 3126*dfc6aa5cSAndroid Build Coastguard Worker 3127*dfc6aa5cSAndroid Build Coastguard WorkerIn a system where these assumptions are not met, you may be able to make the 3128*dfc6aa5cSAndroid Build Coastguard Workercode work by modifying the typedefs in jmorecfg.h. However, you will probably 3129*dfc6aa5cSAndroid Build Coastguard Workerhave difficulty if int is less than 16 bits wide, since references to plain 3130*dfc6aa5cSAndroid Build Coastguard Workerint abound in the code. 3131*dfc6aa5cSAndroid Build Coastguard Worker 3132*dfc6aa5cSAndroid Build Coastguard Workerchar can be either signed or unsigned, although the code runs faster if an 3133*dfc6aa5cSAndroid Build Coastguard Workerunsigned char type is available. If char is wider than 8 bits, you will need 3134*dfc6aa5cSAndroid Build Coastguard Workerto redefine JOCTET and/or provide custom data source/destination managers so 3135*dfc6aa5cSAndroid Build Coastguard Workerthat JOCTET represents exactly 8 bits of data on external storage. 3136*dfc6aa5cSAndroid Build Coastguard Worker 3137*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG library proper does not assume ASCII representation of characters. 3138*dfc6aa5cSAndroid Build Coastguard WorkerBut some of the image file I/O modules in cjpeg/djpeg do have ASCII 3139*dfc6aa5cSAndroid Build Coastguard Workerdependencies in file-header manipulation; so does cjpeg's select_file_type() 3140*dfc6aa5cSAndroid Build Coastguard Workerroutine. 3141*dfc6aa5cSAndroid Build Coastguard Worker 3142*dfc6aa5cSAndroid Build Coastguard WorkerThe JPEG library does not rely heavily on the C library. In particular, C 3143*dfc6aa5cSAndroid Build Coastguard Workerstdio is used only by the data source/destination modules and the error 3144*dfc6aa5cSAndroid Build Coastguard Workerhandler, all of which are application-replaceable. (cjpeg/djpeg are more 3145*dfc6aa5cSAndroid Build Coastguard Workerheavily dependent on stdio.) malloc and free are called only from the memory 3146*dfc6aa5cSAndroid Build Coastguard Workermanager "back end" module, so you can use a different memory allocator by 3147*dfc6aa5cSAndroid Build Coastguard Workerreplacing that one file. 3148*dfc6aa5cSAndroid Build Coastguard Worker 3149*dfc6aa5cSAndroid Build Coastguard WorkerMore info about porting the code may be gleaned by reading jconfig.txt, 3150*dfc6aa5cSAndroid Build Coastguard Workerjmorecfg.h, and jinclude.h. 3151