blob: 30d5828bf3036fea063ec0973bb3a5c016a9ceb6 [file] [log] [blame]
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +00001IJG JPEG LIBRARY: SYSTEM ARCHITECTURE
2
3Copyright (C) 1991-1994, Thomas G. Lane.
4This file is part of the Independent JPEG Group's software.
5For conditions of distribution and use, see the accompanying README file.
6
7
8This file provides an overview of the architecture of the IJG JPEG software;
9that is, the functions of the various modules in the system and the interfaces
10between modules. For more precise details about any data structure or calling
11convention, see the include files and comments in the source code.
12
13We assume that the reader is already somewhat familiar with the JPEG standard.
14The README file includes references for learning about JPEG. The file
15libjpeg.doc describes the library from the viewpoint of an application
16programmer using the library; it's best to read that file before this one.
17Also, the file coderules.doc describes the coding style conventions we use.
18
19In this document, JPEG-specific terminology follows the JPEG standard:
20 A "component" means a color channel, e.g., Red or Luminance.
21 A "sample" is a single component value (i.e., one number in the image data).
22 A "coefficient" is a frequency coefficient (a DCT transform output number).
23 A "block" is an 8x8 group of samples or coefficients.
24 An "MCU" (minimum coded unit) is an interleaved set of blocks of size
25 determined by the sampling factors, or a single block in a
26 noninterleaved scan.
27We do not use the terms "pixel" and "sample" interchangeably. When we say
28pixel, we mean an element of the full-size image, while a sample is an element
29of the downsampled image. Thus the number of samples may vary across
30components while the number of pixels does not. (This terminology is not used
31rigorously throughout the code, but it is used in places where confusion would
32otherwise result.)
33
34
35*** System features ***
36
37The IJG distribution contains two parts:
38 * A subroutine library for JPEG compression and decompression.
39 * cjpeg/djpeg, two simple applications that use the library to transform
40 JFIF JPEG files to and from several other image formats.
41cjpeg/djpeg are of no great intellectual complexity: they merely add a simple
42command-line user interface and I/O routines for several uncompressed image
43formats. This document concentrates on the library itself.
44
45We desire the library to be capable of supporting all JPEG baseline and
46extended sequential DCT processes. Progressive processes are also allowed
47for in the system architecture, although they are not likely to be
48implemented very soon. Hierarchical processes are not supported.
49
50The library does not support the lossless (spatial) JPEG process. Lossless
51JPEG shares little or no code with lossy JPEG, and would normally be used
52without the extensive pre- and post-processing provided by this library.
53We feel that lossless JPEG is better handled by a separate library.
54
55Within these limits, any set of compression parameters allowed by the JPEG
56spec should be readable for decompression. (We can be more restrictive about
57what formats we can generate.) Although the system design allows for all
58parameter values, some uncommon settings are not yet implemented and may
59never be; nonintegral sampling ratios are the prime example. Furthermore,
60we treat 8-bit vs. 12-bit data precision as a compile-time switch, not a
61run-time option, because most machines can store 8-bit pixels much more
62compactly than 12-bit.
63
64For legal reasons, JPEG arithmetic coding is not currently supported, but
65extending the library to include it would be straightforward.
66
67By itself, the library handles only interchange JPEG datastreams --- in
68particular the widely used JFIF file format. The library can be used by
69surrounding code to process interchange or abbreviated JPEG datastreams that
70are embedded in more complex file formats. (For example, we anticipate that
71Sam Leffler's TIFF library will use this code to support the revised TIFF
72JPEG format.)
73
74The library includes a substantial amount of code that is not covered by the
75JPEG standard but is necessary for typical applications of JPEG. These
76functions preprocess the image before JPEG compression or postprocess it after
77decompression. They include colorspace conversion, downsampling/upsampling,
78and color quantization. This code can be omitted if not needed.
79
80A wide range of quality vs. speed tradeoffs are possible in JPEG processing,
81and even more so in decompression postprocessing. The decompression library
82provides multiple implementations that cover most of the useful tradeoffs,
83ranging from very-high-quality down to fast-preview operation. On the
84compression side we have generally not provided low-quality choices, since
85compression is normally less time-critical. It should be understood that the
86low-quality modes may not meet the JPEG standard's accuracy requirements;
87nonetheless, they are useful for viewers.
88
89
90*** Portability issues ***
91
92Portability is an essential requirement for the library. The key portability
93issues that show up at the level of system architecture are:
94
951. Memory usage. We want the code to be able to run on PC-class machines
96with limited memory. Images should therefore be processed sequentially (in
97strips), to avoid holding the whole image in memory at once. Where a
98full-image buffer is necessary, we should be able to use either virtual memory
99or temporary files.
100
1012. Near/far pointer distinction. To run efficiently on 80x86 machines, the
102code should distinguish "small" objects (kept in near data space) from
103"large" ones (kept in far data space). This is an annoying restriction, but
104fortunately it does not impact code quality for less brain-damaged machines,
105and the source code clutter turns out to be minimal with sufficient use of
106pointer typedefs.
107
1083. Data precision. We assume that "char" is at least 8 bits, "short" and
109"int" at least 16, "long" at least 32. The code will work fine with larger
110data sizes, although memory may be used inefficiently in some cases. However,
111the JPEG compressed datastream must ultimately appear on external storage as a
112sequence of 8-bit bytes if it is to conform to the standard. This may pose a
113problem on machines where char is wider than 8 bits. The library represents
114compressed data as an array of values of typedef JOCTET. If no data type
115exactly 8 bits wide is available, custom data source and data destination
116modules must be written to unpack and pack the chosen JOCTET datatype into
1178-bit external representation.
118
119
120*** System overview ***
121
122The compressor and decompressor are each divided into two main sections:
123the JPEG compressor or decompressor proper, and the preprocessing or
124postprocessing functions. The interface between these two sections is the
125image data that the official JPEG spec regards as its input or output: this
126data is in the colorspace to be used for compression, and it is downsampled
127to the sampling factors to be used. The preprocessing and postprocessing
128steps are responsible for converting a normal image representation to or from
129this form. (Those few applications that want to deal with YCbCr downsampled
130data can skip the preprocessing or postprocessing step.)
131
132Looking more closely, the compressor library contains the following main
133elements:
134
135 Preprocessing:
136 * Color space conversion (e.g., RGB to YCbCr). This step may also
137 provide gamma adjustment.
138 * Edge expansion and downsampling. Optionally, this step can do simple
139 smoothing --- this is often helpful for low-quality source data.
140 JPEG proper:
141 * MCU assembly, DCT, quantization.
142 * Entropy coding (Huffman or arithmetic).
143
144In addition to these modules we need overall control, marker generation,
145and support code (memory management & error handling). There is also a
146module responsible for physically writing the output data --- typically
147this is just an interface to fwrite(), but some applications may need to
148do something else with the data.
149
150The decompressor library contains the following main elements:
151
152 JPEG proper:
153 * Entropy decoding (Huffman or arithmetic).
154 * Dequantization, inverse DCT, MCU disassembly.
155 Postprocessing:
156 * Upsampling. Optionally, this step may be able to do more general
157 rescaling of the image.
158 * Color space conversion (e.g., YCbCr to RGB). This step may also
159 provide gamma adjustment.
160 * Optional color quantization (e.g., reduction to 256 colors).
161 * Optional color precision reduction (e.g., 24-bit to 15-bit color).
162 [Not implemented in v5.]
163
164We also need overall control, marker parsing, and a data source module.
165The support code (memory management & error handling) can be shared with
166the compression half of the library.
167
168There may be several implementations of each of these elements, particularly
169in the decompressor, where a wide range of speed/quality tradeoffs is very
170useful. It must be understood that some of the best speedups involve
171merging adjacent steps in the pipeline. For example, upsampling, color space
172conversion, and color quantization might all be done at once when using a
173low-quality ordered-dither technique. The system architecture is designed to
174allow such merging where appropriate.
175
176
177Note: it is convenient to regard edge expansion (padding to block boundaries)
178as a preprocessing/postprocessing function, even though the JPEG spec includes
179it in compression/decompression. We do this because downsampling/upsampling
180can be simplified a little if they work on padded data: it's not necessary to
181have special cases at the right and bottom edges. Therefore the interface
182buffer is always an integral number of blocks wide and high, and we expect
183compression preprocessing to pad the source data properly. Padding will occur
184only to the next block (8-sample) boundary. In an interleaved-scan situation,
185additional dummy blocks may be used to fill out MCUs, but the MCU assembly and
186disassembly logic will create or discard these blocks internally. (This is
187advantageous for speed reasons, since we avoid DCTing the dummy blocks.
188It also permits a small reduction in file size, because the compressor can
189choose dummy block contents so as to minimize their size in compressed form.)
190Applications that wish to deal directly with the downsampled data must provide
191similar buffering and padding for odd-sized images.
192
193
194*** Poor man's object-oriented programming ***
195
196It should be clear by now that we have a lot of quasi-independent processing
197steps, many of which have several possible behaviors. To avoid cluttering the
198code with lots of switch statements, we use a simple form of object-style
199programming to separate out the different possibilities.
200
201For example, two different color quantization algorithms could be implemented
202as two separate modules that present the same external interface; at runtime,
203the calling code will access the proper module indirectly through an "object".
204
205We can get the limited features we need while staying within portable C.
206The basic tool is a function pointer. An "object" is just a struct
207containing one or more function pointer fields, each of which corresponds to
208a method name in real object-oriented languages. During initialization we
209fill in the function pointers with references to whichever module we have
210determined we need to use in this run. Then invocation of the module is done
211by indirecting through a function pointer; on most machines this is no more
212expensive than a switch statement, which would be the only other way of
213making the required run-time choice. The really significant benefit, of
214course, is keeping the source code clean and well structured.
215
216We can also arrange to have private storage that varies between different
217implementations of the same kind of object. We do this by making all the
218module-specific object structs be separately allocated entities, which will
219be accessed via pointers in the master compression or decompression struct.
220The "public" fields or methods for a given kind of object are specified by
221a commonly known struct. But a module's initialization code can allocate
222a larger struct that contains the common struct as its first member, plus
223additional private fields. With appropriate pointer casting, the module's
224internal functions can access these private fields. (For a simple example,
225see jdatadst.c, which implements the external interface specified by struct
226jpeg_destination_mgr, but adds extra fields.)
227
228(Of course this would all be a lot easier if we were using C++, but we are
229not yet prepared to assume that everyone has a C++ compiler.)
230
231An important benefit of this scheme is that it is easy to provide multiple
232versions of any method, each tuned to a particular case. While a lot of
233precalculation might be done to select an optimal implementation of a method,
234the cost per invocation is constant. For example, the upsampling step might
235have a "generic" method, plus one or more "hardwired" methods for the most
236popular sampling factors; the hardwired methods would be faster because they'd
237use straight-line code instead of for-loops. The cost to determine which
238method to use is paid only once, at startup, and the selection criteria are
239hidden from the callers of the method.
240
241This plan differs a little bit from usual object-oriented structures, in that
242only one instance of each object class will exist during execution. The
243reason for having the class structure is that on different runs we may create
244different instances (choose to execute different modules). You can think of
245the term "method" as denoting the common interface presented by a particular
246set of interchangeable functions, and "object" as denoting a group of related
247methods, or the total shared interface behavior of a group of modules.
248
249
250*** Overall control structure ***
251
252We previously mentioned the need for overall control logic in the compression
253and decompression libraries. In IJG implementations prior to v5, overall
254control was mostly provided by "pipeline control" modules, which proved to be
255large, unwieldy, and hard to understand. To improve the situation, the
256control logic has been subdivided into multiple modules. The control modules
257consist of:
258
2591. Master control for module selection and initialization. This has two
260responsibilities:
261
262 1A. Startup initialization at the beginning of image processing.
263 The individual processing modules to be used in this run are selected
264 and given initialization calls.
265
266 1B. Per-pass control. This determines how many passes will be performed
267 and calls each active processing module to configure itself
268 appropriately at the beginning of each pass. End-of-pass processing,
269 where necessary, is also invoked from the master control module.
270
271 Method selection is partially distributed, in that a particular processing
272 module may contain several possible implementations of a particular method,
273 which it will select among when given its initialization call. The master
274 control code need only be concerned with decisions that affect more than
275 one module.
276
2772. Data buffering control. A separate control module exists for each
278 inter-processing-step data buffer. This module is responsible for
279 invoking the processing steps that write or read that data buffer.
280
281Each buffer controller sees the world as follows:
282
283input data => processing step A => buffer => processing step B => output data
284 | | |
285 ------------------ controller ------------------
286
287The controller knows the dataflow requirements of steps A and B: how much data
288they want to accept in one chunk and how much they output in one chunk. Its
289function is to manage its buffer and call A and B at the proper times.
290
291A data buffer control module may itself be viewed as a processing step by a
292higher-level control module; thus the control modules form a binary tree with
293elementary processing steps at the leaves of the tree.
294
295The control modules are objects. A considerable amount of flexibility can
296be had by replacing implementations of a control module. For example:
297* Merging of adjacent steps in the pipeline is done by replacing a control
298 module and its pair of processing-step modules with a single processing-
299 step module. (Hence the possible merges are determined by the tree of
300 control modules.)
301* In some processing modes, a given interstep buffer need only be a "strip"
302 buffer large enough to accommodate the desired data chunk sizes. In other
303 modes, a full-image buffer is needed and several passes are required.
304 The control module determines which kind of buffer is used and manipulates
305 virtual array buffers as needed. One or both processing steps may be
306 unaware of the multi-pass behavior.
307
308In theory, we might be able to make all of the data buffer controllers
309interchangeable and provide just one set of implementations for all. In
310practice, each one contains considerable special-case processing for its
311particular job. The buffer controller concept should be regarded as an
312overall system structuring principle, not as a complete description of the
313task performed by any one controller.
314
315
316*** Compression object structure ***
317
318Here is a sketch of the logical structure of the JPEG compression library:
319
320 |-- Colorspace conversion
321 |-- Preprocessing controller --|
322 | |-- Downsampling
323Main controller --|
324 | |-- Forward DCT, quantize
325 |-- Coefficient controller --|
326 |-- Entropy encoding
327
328This sketch also describes the flow of control (subroutine calls) during
329typical image data processing. Each of the components shown in the diagram is
330an "object" which may have several different implementations available. One
331or more source code files contain the actual implementation(s) of each object.
332
333The objects shown above are:
334
335* Main controller: buffer controller for the subsampled-data buffer, which
336 holds the preprocessed input data. This controller invokes preprocessing to
337 fill the subsampled-data buffer, and JPEG compression to empty it. There is
338 usually no need for a full-image buffer here; a strip buffer is adequate.
339
340* Preprocessing controller: buffer controller for the downsampling input data
341 buffer, which lies between colorspace conversion and downsampling. Note
342 that a unified conversion/downsampling module would probably replace this
343 controller entirely.
344
345* Colorspace conversion: converts application image data into the desired
346 JPEG color space; also changes the data from pixel-interleaved layout to
347 separate component planes. Processes one pixel row at a time.
348
349* Downsampling: performs reduction of chroma components as required.
350 Optionally may perform pixel-level smoothing as well. Processes a "row
351 group" at a time, where a row group is defined as Vmax pixel rows of each
352 component before downsampling, and Vk sample rows afterwards (remember Vk
353 differs across components). Some downsampling or smoothing algorithms may
354 require context rows above and below the current row group; the
355 preprocessing controller is responsible for supplying these rows via proper
356 buffering. The downsampler is responsible for edge expansion at the right
357 edge (i.e., extending each sample row to a multiple of 8 samples); but the
358 preprocessing controller is responsible for vertical edge expansion (i.e.,
359 duplicating the bottom sample row as needed to make a multiple of 8 rows).
360
361* Coefficient controller: buffer controller for the DCT-coefficient data.
362 This controller handles MCU assembly, including insertion of dummy DCT
363 blocks when needed at the right or bottom edge. When performing
364 Huffman-code optimization or emitting a multiscan JPEG file, this
365 controller is responsible for buffering the full image.
366
367* Forward DCT and quantization: Perform DCT, quantize, and emit coefficients
368 in zigzag block order. Works on one or more DCT blocks at a time.
369
370* Entropy encoding: Perform Huffman or arithmetic entropy coding and emit the
371 coded data to the data destination module. Works on one MCU per call.
372
373In addition to the above objects, the compression library includes these
374objects:
375
376* Master control: determines the number of passes required, controls overall
377 and per-pass initialization of the other modules.
378
379* Marker writing: generates JPEG markers (except for RSTn, which is emitted
380 by the entropy encoder when needed).
381
382* Data destination manager: writes the output JPEG datastream to its final
383 destination (e.g., a file). The destination manager supplied with the
384 library knows how to write to a stdio stream; for other behaviors, the
385 surrounding application may provide its own destination manager.
386
387* Memory manager: allocates and releases memory, controls virtual arrays
388 (with backing store management, where required).
389
390* Error handler: performs formatting and output of error and trace messages;
391 determines handling of nonfatal errors. The surrounding application may
392 override some or all of this object's methods to change error handling.
393
394* Progress monitor: supports output of "percent-done" progress reports.
395 This object represents an optional callback to the surrounding application:
396 if wanted, it must be supplied by the application.
397
398The error handler, destination manager, and progress monitor objects are
399defined as separate objects in order to simplify application-specific
400customization of the JPEG library. A surrounding application may override
401individual methods or supply its own all-new implementation of one of these
402objects. The object interfaces for these objects are therefore treated as
403part of the application interface of the library, whereas the other objects
404are internal to the library.
405
406The error handler and memory manager are shared by JPEG compression and
407decompression; the progress monitor, if used, may be shared as well.
408
409
410*** Decompression object structure ***
411
412Here is a sketch of the logical structure of the JPEG decompression library:
413
414 |-- Entropy decoding
415 |-- Coefficient controller --|
416 | |-- Dequantize, Inverse DCT
417Main controller --|
418 | |-- Upsampling
419 |-- Postprocessing controller --| |-- Colorspace conversion
420 |-- Color quantization
421 |-- Color precision reduction
422
423As before, this diagram also represents typical control flow. The objects
424shown are:
425
426* Main controller: buffer controller for the subsampled-data buffer, which
427 holds the output of JPEG decompression proper. This controller's primary
428 task is to feed the postprocessing procedure. Some upsampling algorithms
429 may require context rows above and below the current row group; when this
430 is true, the main controller is responsible for managing its buffer so as
431 to make context rows available. In the current design, the main buffer is
432 always a strip buffer; a full-image buffer is never required.
433
434* Coefficient controller: buffer controller for the DCT-coefficient data.
435 This controller handles MCU disassembly, including deletion of any dummy
436 DCT blocks at the right or bottom edge. When reading a multiscan JPEG
437 file, this controller is responsible for buffering the full image.
438 (Buffering DCT coefficients, rather than samples, is necessary to support
439 progressive JPEG.) The equivalent of one fully interleaved MCU row of
440 subsampled data is processed per call, even when the source JPEG file is
441 noninterleaved.
442
443* Entropy decoding: Read coded data from the data source module and perform
444 Huffman or arithmetic entropy decoding. Works on one MCU per call.
445
446* Dequantization and inverse DCT: like it says. Note that the coefficients
447 buffered by the coefficient controller have NOT been dequantized; we
448 merge dequantization and inverse DCT into a single step for speed reasons.
449 When scaled-down output is asked for, simplified DCT algorithms may be used
450 that emit only 1x1, 2x2, or 4x4 samples per DCT block, not the full 8x8.
451 Works on one DCT block at a time.
452
453* Postprocessing controller: buffer controller for the color quantization
454 input buffer, when quantization is in use. (Without quantization, this
455 controller just calls the upsampler.) For two-pass quantization, this
456 controller is responsible for buffering the full-image data.
457
458* Upsampling: restores chroma components to full size. (May support more
459 general output rescaling, too. Note that if undersized DCT outputs have
460 been emitted by the DCT module, this module must adjust so that properly
461 sized outputs are created.) Works on one row group at a time. This module
462 also calls the color conversion module, so its top level is effectively a
463 buffer controller for the upsampling->color conversion buffer. However, in
464 all but the highest-quality operating modes, upsampling and color
465 conversion are likely to be merged into a single step.
466
467* Colorspace conversion: convert from JPEG color space to output color space,
468 and change data layout from separate component planes to pixel-interleaved.
469 Works on one pixel row at a time.
470
471* Color quantization: reduce the data to colormapped form, using either an
472 externally specified colormap or an internally generated one. This module
473 is not used for full-color output. Works on one pixel row at a time; may
474 require two passes to generate a color map. Note that the output will
475 always be a single component representing colormap indexes. In the current
476 design, the output values are JSAMPLEs, so an 8-bit compilation cannot
477 quantize to more than 256 colors. This is unlikely to be a problem in
478 practice.
479
480* Color reduction: this module handles color precision reduction, e.g.,
481 generating 15-bit color (5 bits/primary) from JPEG's 24-bit output.
482 Not quite clear yet how this should be handled... should we merge it with
483 colorspace conversion???
484
485Note that some high-speed operating modes might condense the entire
486postprocessing sequence to a single module (upsample, color convert, and
487quantize in one step).
488
489In addition to the above objects, the decompression library includes these
490objects:
491
492* Master control: determines the number of passes required, controls overall
493 and per-pass initialization of the other modules.
494
495* Marker reading: decodes JPEG markers (except for RSTn).
496
497* Data source manager: supplies the input JPEG datastream. The source
498 manager supplied with the library knows how to read from a stdio stream;
499 for other behaviors, the surrounding application may provide its own source
500 manager.
501
502* Memory manager: same as for compression library.
503
504* Error handler: same as for compression library.
505
506* Progress monitor: same as for compression library.
507
508As with compression, the data source manager, error handler, and progress
509monitor are candidates for replacement by a surrounding application.
510
511
512*** Data formats ***
513
514Arrays of pixel sample values use the following data structure:
515
516 typedef something JSAMPLE; a pixel component value, 0..MAXJSAMPLE
517 typedef JSAMPLE *JSAMPROW; ptr to a row of samples
518 typedef JSAMPROW *JSAMPARRAY; ptr to a list of rows
519 typedef JSAMPARRAY *JSAMPIMAGE; ptr to a list of color-component arrays
520
521The basic element type JSAMPLE will typically be one of unsigned char,
522(signed) char, or short. Short will be used if samples wider than 8 bits are
523to be supported (this is a compile-time option). Otherwise, unsigned char is
524used if possible. If the compiler only supports signed chars, then it is
525necessary to mask off the value when reading. Thus, all reads of JSAMPLE
526values must be coded as "GETJSAMPLE(value)", where the macro will be defined
527as "((value) & 0xFF)" on signed-char machines and "((int) (value))" elsewhere.
528
529With these conventions, JSAMPLE values can be assumed to be >= 0. This helps
530simplify correct rounding during downsampling, etc. The JPEG standard's
531specification that sample values run from -128..127 is accommodated by
532subtracting 128 just as the sample value is copied into the source array for
533the DCT step (this will be an array of signed ints). Similarly, during
534decompression the output of the IDCT step will be immediately shifted back to
5350..255. (NB: different values are required when 12-bit samples are in use.
536The code is written in terms of MAXJSAMPLE and CENTERJSAMPLE, which will be
537defined as 255 and 128 respectively in an 8-bit implementation, and as 4095
538and 2048 in a 12-bit implementation.)
539
540We use a pointer per row, rather than a two-dimensional JSAMPLE array. This
541choice costs only a small amount of memory and has several benefits:
542* Code using the data structure doesn't need to know the allocated width of
543 the rows. This simplifies edge expansion/compression, since we can work
544 in an array that's wider than the logical picture width.
545* Indexing doesn't require multiplication; this is a performance win on many
546 machines.
547* Arrays with more than 64K total elements can be supported even on machines
548 where malloc() cannot allocate chunks larger than 64K.
549* The rows forming a component array may be allocated at different times
550 without extra copying. This trick allows some speedups in smoothing steps
551 that need access to the previous and next rows.
552
553Note that each color component is stored in a separate array; we don't use the
554traditional layout in which the components of a pixel are stored together.
555This simplifies coding of modules that work on each component independently,
556because they don't need to know how many components there are. Furthermore,
557we can read or write each component to a temporary file independently, which
558is helpful when dealing with noninterleaved JPEG files.
559
560In general, a specific sample value is accessed by code such as
561 GETJSAMPLE(image[colorcomponent][row][col])
562where col is measured from the image left edge, but row is measured from the
563first sample row currently in memory. Either of the first two indexings can
564be precomputed by copying the relevant pointer.
565
566
567Since most image-processing applications prefer to work on images in which
568the components of a pixel are stored together, the data passed to or from the
569surrounding application uses the traditional convention: a single pixel is
570represented by N consecutive JSAMPLE values, and an image row is an array of
571(# of color components)*(image width) JSAMPLEs. One or more rows of data can
572be represented by a pointer of type JSAMPARRAY in this scheme. This scheme is
573converted to component-wise storage inside the JPEG library. (Applications
574that want to skip JPEG preprocessing or postprocessing will have to contend
575with component-wise storage.)
576
577
578Arrays of DCT-coefficient values use the following data structure:
579
580 typedef short JCOEF; a 16-bit signed integer
581 typedef JCOEF JBLOCK[DCTSIZE2]; an 8x8 block of coefficients
582 typedef JBLOCK *JBLOCKROW; ptr to one horizontal row of 8x8 blocks
583 typedef JBLOCKROW *JBLOCKARRAY; ptr to a list of such rows
584 typedef JBLOCKARRAY *JBLOCKIMAGE; ptr to a list of color component arrays
585
586The underlying type is at least a 16-bit signed integer; while "short" is big
587enough on all machines of interest, on some machines it is preferable to use
588"int" for speed reasons, despite the storage cost. Coefficients are grouped
589into 8x8 blocks (but we always use #defines DCTSIZE and DCTSIZE2 rather than
590"8" and "64"). The contents of a block may be either in "natural" or
591zigzagged order, and may be true values or divided by the quantization
592coefficients, depending on where the block is in the processing pipeline.
593
594Notice that the allocation unit is now a row of 8x8 blocks, corresponding to
595eight rows of samples. Otherwise the structure is much the same as for
596samples, and for the same reasons.
597
598On machines where malloc() can't handle a request bigger than 64Kb, this data
599structure limits us to rows of less than 512 JBLOCKs, or a picture width of
6004000+ pixels. This seems an acceptable restriction.
601
602
603On 80x86 machines, the bottom-level pointer types (JSAMPROW and JBLOCKROW)
604must be declared as "far" pointers, but the upper levels can be "near"
605(implying that the pointer lists are allocated in the DS segment).
606We use a #define symbol FAR, which expands to the "far" keyword when
607compiling on 80x86 machines and to nothing elsewhere.
608
609
610*** Suspendable processing ***
611
612In some applications it is desirable to use the JPEG library as an
613incremental, memory-to-memory filter. In this situation the data source or
614destination may be a limited-size buffer, and we can't rely on being able to
615empty or refill the buffer at arbitrary times. Instead the application would
616like to have control return from the library at buffer overflow/underrun, and
617then resume compression or decompression at a later time.
618
619This scenario is supported for simple cases, namely, single-pass processing
620of single-scan JPEG files. (For anything more complex, we recommend that the
621application "bite the bullet" and develop real multitasking capability.) The
622libjpeg.doc file goes into more detail about the usage and limitations of
623this capability; here we address the implications for library structure.
624
625The essence of the problem is that the entropy codec (coder or decoder) must
626be prepared to stop at arbitrary times. In turn, the controllers that call
627the entropy codec must be able to stop before having produced or consumed all
628the data that they normally would handle in one call. That part is reasonably
629straightforward: we make the controller call interfaces include "progress
630counters" which indicate the number of data chunks successfully processed, and
631we require callers to test the counter rather than just assume all of the data
632was processed.
633
634Rather than trying to restart at an arbitrary point, the current Huffman
635codecs are designed to restart at the beginning of the current MCU after a
636suspension due to buffer overflow/underrun. At the start of each call, the
637codec's internal state is loaded from permanent storage (in the JPEG object
638structures) into local variables. On successful completion of the MCU, the
639permanent state is updated. (This copying is not very expensive, and may even
640lead to *improved* performance if the local variables can be registerized.)
641If a suspension occurs, the codec simply returns without updating the state,
642thus effectively reverting to the start of the MCU. Note that this implies
643leaving some data unprocessed in the source/destination buffer (ie, the
644compressed partial MCU). The data source/destination module interfaces are
645specified so as to make this possible. This also implies that the data buffer
646must be large enough to hold a worst-case compressed MCU; a couple thousand
647bytes should be enough.
648
649This design would probably not work for an arithmetic codec, since its
650modifiable state is quite large and couldn't be copied cheaply. Instead it
651would have to suspend and resume exactly at the point of the buffer end.
652Also, a progressive JPEG decoder would have some problems with having already
653updated the output DCT coefficient buffer, since progressive decoding depends
654on the prior state of the coefficient buffer. This case might also have to be
655handled by exact restart. Currently I expect that IJG will just not support
656suspendable operation in these cases (when and if we implement them at all).
657
658The JPEG marker reader is designed to cope with suspension at an arbitrary
659point. It does so by backing up to the start of the marker parameter segment,
660so the data buffer must be big enough to hold the largest marker of interest.
661Again, a couple KB should be adequate. (A special "skip" convention is used
662to bypass COM and APPn markers, so these can be larger than the buffer size
663without causing problems; otherwise a 64K buffer would be needed in the worst
664case.)
665
666The JPEG marker writer currently does *not* cope with suspension. I feel that
667this is not necessary; it is much easier simply to require the application to
668ensure there is enough buffer space before starting. (An empty 2K buffer is
669more than sufficient for the header markers; and ensuring there are a dozen or
670two bytes available before calling jpeg_finish_compress() will suffice for the
671trailer.) Again, this would not work for writing multi-scan JPEG files, but
672we simply do not intend to support that capability with suspension.
673
674
675*** Memory manager services ***
676
677The JPEG library's memory manager controls allocation and deallocation of
678memory, and it manages large "virtual" data arrays on machines where the
679operating system does not provide virtual memory. Note that the same
680memory manager serves both compression and decompression operations.
681
682In all cases, allocated objects are tied to a particular compression or
683decompression master record, and they will be released when that master
684record is destroyed.
685
686The memory manager does not provide explicit deallocation of objects.
687Instead, objects are created in "pools" of free storage, and a whole pool
688can be freed at once. This approach helps prevent storage-leak bugs, and
689it speeds up operations whenever malloc/free are slow (as they often are).
690The pools can be regarded as lifetime identifiers for objects. Two
691pools/lifetimes are defined:
692 * JPOOL_PERMANENT lasts until master record is destroyed
693 * JPOOL_IMAGE lasts until done with image (JPEG datastream)
694Permanent lifetime is used for parameters and tables that should be carried
695across from one datastream to another; this includes all application-visible
696parameters. Image lifetime is used for everything else. (A third lifetime,
697JPOOL_PASS = one processing pass, was originally planned. However it was
698dropped as not being worthwhile. The actual usage patterns are such that the
699peak memory usage would be about the same anyway; and having per-pass storage
700substantially complicates the virtual memory allocation rules --- see below.)
701
702The memory manager deals with three kinds of object:
7031. "Small" objects. Typically these require no more than 10K-20K total.
7042. "Large" objects. These may require tens to hundreds of K depending on
705 image size. Semantically they behave the same as small objects, but we
706 distinguish them for two reasons:
707 * On MS-DOS machines, large objects are referenced by FAR pointers,
708 small objects by NEAR pointers.
709 * Pool allocation heuristics may differ for large and small objects.
710 Note that individual "large" objects cannot exceed the size allowed by
711 type size_t, which may be 64K or less on some machines.
7123. "Virtual" objects. These are large 2-D arrays of JSAMPLEs or JBLOCKs
713 (typically large enough for the entire image being processed). The
714 memory manager provides stripwise access to these arrays. On machines
715 without virtual memory, the rest of the array may be swapped out to a
716 temporary file.
717
718(Note: JSAMPARRAY and JBLOCKARRAY data structures are a combination of large
719objects for the data proper and small objects for the row pointers. For
720convenience and speed, the memory manager provides single routines to create
721these structures. Similarly, virtual arrays include a small control block
722and a JSAMPARRAY or JBLOCKARRAY working buffer, all created with one call.)
723
724In the present implementation, virtual arrays are only permitted to have image
725lifespan. (Permanent lifespan would not be reasonable, and pass lifespan is
726not very useful since a virtual array's raison d'etre is to store data for
727multiple passes through the image.) We also expect that only "small" objects
728will be given permanent lifespan, though this restriction is not required by
729the memory manager.
730
731In a non-virtual-memory machine, some performance benefit can be gained by
732making the in-memory buffers for virtual arrays be as large as possible.
733(For small images, the buffers might fit entirely in memory, so blind
734swapping would be very wasteful.) The memory manager will adjust the height
735of the buffers to fit within a prespecified maximum memory usage. In order
736to do this in a reasonably optimal fashion, the manager needs to allocate all
737of the virtual arrays at once. Therefore, there isn't a one-step allocation
738routine for virtual arrays; instead, there is a "request" routine that simply
739allocates the control block, and a "realize" routine (called just once) that
740determines space allocation and creates all of the actual buffers. The
741realize routine must allow for space occupied by non-virtual large objects.
742(We don't bother to factor in the space needed for small objects, on the
743grounds that it isn't worth the trouble.)
744
745To support all this, we establish the following protocol for doing business
746with the memory manager:
747 1. Modules must request virtual arrays (which may have only image lifespan)
748 during the global selection phase, i.e., in their jinit_xxx routines.
749 2. All "large" objects (including JSAMPARRAYs and JBLOCKARRAYs) must also be
750 allocated at global selection time.
751 3. realize_virt_arrays will be called at the completion of global selection.
752 The above conventions ensure that sufficient information is available
753 for it to choose a good size for virtual array buffers.
754Small objects of any lifespan may be allocated at any time. We expect that
755the total space used for small objects will be small enough to be negligible
756in the realize_virt_arrays computation.
757
758In a virtual-memory machine, we simply pretend that the available space is
759infinite, thus causing realize_virt_arrays to decide that it can allocate all
760the virtual arrays as full-size in-memory buffers. The overhead of the
761virtual-array access protocol is very small when no swapping occurs.
762
763
764*** Memory manager internal structure ***
765
766To isolate system dependencies as much as possible, we have broken the
767memory manager into two parts. There is a reasonably system-independent
768"front end" (jmemmgr.c) and a "back end" that contains only the code
769likely to change across systems. All of the memory management methods
770outlined above are implemented by the front end. The back end provides
771the following routines for use by the front end (none of these routines
772are known to the rest of the JPEG code):
773
774jpeg_mem_init, jpeg_mem_term system-dependent initialization/shutdown
775
776jpeg_get_small, jpeg_free_small interface to malloc and free library routines
777 (or their equivalents)
778
779jpeg_get_large, jpeg_free_large interface to FAR malloc/free in MSDOS machines;
780 else usually the same as
781 jpeg_get_small/jpeg_free_small
782
783jpeg_mem_available estimate available memory
784
785jpeg_open_backing_store create a backing-store object
786
787read_backing_store, manipulate a backing-store object
788write_backing_store,
789close_backing_store
790
791On some systems there will be more than one type of backing-store object
792(specifically, in MS-DOS a backing store file might be an area of extended
793memory as well as a disk file). jpeg_open_backing_store is responsible for
794choosing how to implement a given object. The read/write/close routines
795are method pointers in the structure that describes a given object; this
796lets them be different for different object types.
797
798It may be necessary to ensure that backing store objects are explicitly
799released upon abnormal program termination. For example, MS-DOS won't free
800extended memory by itself. To support this, we will expect the main program
801or surrounding application to arrange to call self_destruct (typically via
802jpeg_destroy) upon abnormal termination. This may require a SIGINT signal
803handler or equivalent. We don't want to have the back end module install its
804own signal handler, because that would pre-empt the surrounding application's
805ability to control signal handling.
806
807The IJG distribution includes several memory manager back end implementations.
808Usually the same back end should be suitable for all applications on a given
809system, but it is possible for an application to supply its own back end at
810need.
811
812
813*** Implications of DNL marker ***
814
815Some JPEG files may use a DNL marker to postpone definition of the image
816height (this would be useful for a fax-like scanner's output, for instance).
817In these files the SOF marker claims the image height is 0, and you only
818find out the true image height at the end of the first scan.
819
820We could read these files as follows:
8211. Upon seeing zero image height, replace it by 65535 (the maximum allowed).
8222. When the DNL is found, update the image height in the global image
823 descriptor.
824This implies that control modules must avoid making copies of the image
825height, and must re-test for termination after each MCU row. This would
826be easy enough to do.
827
828In cases where image-size data structures are allocated, this approach will
829result in very inefficient use of virtual memory or much-larger-than-necessary
830temporary files. This seems acceptable for something that probably won't be a
831mainstream usage. People might have to forgo use of memory-hogging options
832(such as two-pass color quantization or noninterleaved JPEG files) if they
833want efficient conversion of such files. (One could improve efficiency by
834demanding a user-supplied upper bound for the height, less than 65536; in most
835cases it could be much less.)
836
837The standard also permits the SOF marker to overestimate the image height,
838with a DNL to give the true, smaller height at the end of the first scan.
839This would solve the space problems if the overestimate wasn't too great.
840However, it implies that you don't even know whether DNL will be used.
841
842This leads to a couple of very serious objections:
8431. Testing for a DNL marker must occur in the inner loop of the decompressor's
844 Huffman decoder; this implies a speed penalty whether the feature is used
845 or not.
8462. There is no way to hide the last-minute change in image height from an
847 application using the decoder. Thus *every* application using the IJG
848 library would suffer a complexity penalty whether it cared about DNL or
849 not.
850We currently do not support DNL because of these problems.
851
852A different approach is to insist that DNL-using files be preprocessed by a
853separate program that reads ahead to the DNL, then goes back and fixes the SOF
854marker. This is a much simpler solution and is probably far more efficient.
855Even if one wants piped input, buffering the first scan of the JPEG file needs
856a lot smaller temp file than is implied by the maximum-height method. For
857this approach we'd simply treat DNL as a no-op in the decompressor (at most,
858check that it matches the SOF image height).
859
860We will not worry about making the compressor capable of outputting DNL.
861Something similar to the first scheme above could be applied if anyone ever
862wants to make that work.