Blame gtkmm-osx/jpeg-6b/structure.doc

darco 56a656
IJG JPEG LIBRARY:  SYSTEM ARCHITECTURE
darco 56a656
darco 56a656
Copyright (C) 1991-1995, Thomas G. Lane.
darco 56a656
This file is part of the Independent JPEG Group's software.
darco 56a656
For conditions of distribution and use, see the accompanying README file.
darco 56a656
darco 56a656
darco 56a656
This file provides an overview of the architecture of the IJG JPEG software;
darco 56a656
that is, the functions of the various modules in the system and the interfaces
darco 56a656
between modules.  For more precise details about any data structure or calling
darco 56a656
convention, see the include files and comments in the source code.
darco 56a656
darco 56a656
We assume that the reader is already somewhat familiar with the JPEG standard.
darco 56a656
The README file includes references for learning about JPEG.  The file
darco 56a656
libjpeg.doc describes the library from the viewpoint of an application
darco 56a656
programmer using the library; it's best to read that file before this one.
darco 56a656
Also, the file coderules.doc describes the coding style conventions we use.
darco 56a656
darco 56a656
In this document, JPEG-specific terminology follows the JPEG standard:
darco 56a656
  A "component" means a color channel, e.g., Red or Luminance.
darco 56a656
  A "sample" is a single component value (i.e., one number in the image data).
darco 56a656
  A "coefficient" is a frequency coefficient (a DCT transform output number).
darco 56a656
  A "block" is an 8x8 group of samples or coefficients.
darco 56a656
  An "MCU" (minimum coded unit) is an interleaved set of blocks of size
darco 56a656
	determined by the sampling factors, or a single block in a
darco 56a656
	noninterleaved scan.
darco 56a656
We do not use the terms "pixel" and "sample" interchangeably.  When we say
darco 56a656
pixel, we mean an element of the full-size image, while a sample is an element
darco 56a656
of the downsampled image.  Thus the number of samples may vary across
darco 56a656
components while the number of pixels does not.  (This terminology is not used
darco 56a656
rigorously throughout the code, but it is used in places where confusion would
darco 56a656
otherwise result.)
darco 56a656
darco 56a656
darco 56a656
*** System features ***
darco 56a656
darco 56a656
The IJG distribution contains two parts:
darco 56a656
  * A subroutine library for JPEG compression and decompression.
darco 56a656
  * cjpeg/djpeg, two sample applications that use the library to transform
darco 56a656
    JFIF JPEG files to and from several other image formats.
darco 56a656
cjpeg/djpeg are of no great intellectual complexity: they merely add a simple
darco 56a656
command-line user interface and I/O routines for several uncompressed image
darco 56a656
formats.  This document concentrates on the library itself.
darco 56a656
darco 56a656
We desire the library to be capable of supporting all JPEG baseline, extended
darco 56a656
sequential, and progressive DCT processes.  Hierarchical processes are not
darco 56a656
supported.
darco 56a656
darco 56a656
The library does not support the lossless (spatial) JPEG process.  Lossless
darco 56a656
JPEG shares little or no code with lossy JPEG, and would normally be used
darco 56a656
without the extensive pre- and post-processing provided by this library.
darco 56a656
We feel that lossless JPEG is better handled by a separate library.
darco 56a656
darco 56a656
Within these limits, any set of compression parameters allowed by the JPEG
darco 56a656
spec should be readable for decompression.  (We can be more restrictive about
darco 56a656
what formats we can generate.)  Although the system design allows for all
darco 56a656
parameter values, some uncommon settings are not yet implemented and may
darco 56a656
never be; nonintegral sampling ratios are the prime example.  Furthermore,
darco 56a656
we treat 8-bit vs. 12-bit data precision as a compile-time switch, not a
darco 56a656
run-time option, because most machines can store 8-bit pixels much more
darco 56a656
compactly than 12-bit.
darco 56a656
darco 56a656
For legal reasons, JPEG arithmetic coding is not currently supported, but
darco 56a656
extending the library to include it would be straightforward.
darco 56a656
darco 56a656
By itself, the library handles only interchange JPEG datastreams --- in
darco 56a656
particular the widely used JFIF file format.  The library can be used by
darco 56a656
surrounding code to process interchange or abbreviated JPEG datastreams that
darco 56a656
are embedded in more complex file formats.  (For example, libtiff uses this
darco 56a656
library to implement JPEG compression within the TIFF file format.)
darco 56a656
darco 56a656
The library includes a substantial amount of code that is not covered by the
darco 56a656
JPEG standard but is necessary for typical applications of JPEG.  These
darco 56a656
functions preprocess the image before JPEG compression or postprocess it after
darco 56a656
decompression.  They include colorspace conversion, downsampling/upsampling,
darco 56a656
and color quantization.  This code can be omitted if not needed.
darco 56a656
darco 56a656
A wide range of quality vs. speed tradeoffs are possible in JPEG processing,
darco 56a656
and even more so in decompression postprocessing.  The decompression library
darco 56a656
provides multiple implementations that cover most of the useful tradeoffs,
darco 56a656
ranging from very-high-quality down to fast-preview operation.  On the
darco 56a656
compression side we have generally not provided low-quality choices, since
darco 56a656
compression is normally less time-critical.  It should be understood that the
darco 56a656
low-quality modes may not meet the JPEG standard's accuracy requirements;
darco 56a656
nonetheless, they are useful for viewers.
darco 56a656
darco 56a656
darco 56a656
*** Portability issues ***
darco 56a656
darco 56a656
Portability is an essential requirement for the library.  The key portability
darco 56a656
issues that show up at the level of system architecture are:
darco 56a656
darco 56a656
1.  Memory usage.  We want the code to be able to run on PC-class machines
darco 56a656
with limited memory.  Images should therefore be processed sequentially (in
darco 56a656
strips), to avoid holding the whole image in memory at once.  Where a
darco 56a656
full-image buffer is necessary, we should be able to use either virtual memory
darco 56a656
or temporary files.
darco 56a656
darco 56a656
2.  Near/far pointer distinction.  To run efficiently on 80x86 machines, the
darco 56a656
code should distinguish "small" objects (kept in near data space) from
darco 56a656
"large" ones (kept in far data space).  This is an annoying restriction, but
darco 56a656
fortunately it does not impact code quality for less brain-damaged machines,
darco 56a656
and the source code clutter turns out to be minimal with sufficient use of
darco 56a656
pointer typedefs.
darco 56a656
darco 56a656
3. Data precision.  We assume that "char" is at least 8 bits, "short" and
darco 56a656
"int" at least 16, "long" at least 32.  The code will work fine with larger
darco 56a656
data sizes, although memory may be used inefficiently in some cases.  However,
darco 56a656
the JPEG compressed datastream must ultimately appear on external storage as a
darco 56a656
sequence of 8-bit bytes if it is to conform to the standard.  This may pose a
darco 56a656
problem on machines where char is wider than 8 bits.  The library represents
darco 56a656
compressed data as an array of values of typedef JOCTET.  If no data type
darco 56a656
exactly 8 bits wide is available, custom data source and data destination
darco 56a656
modules must be written to unpack and pack the chosen JOCTET datatype into
darco 56a656
8-bit external representation.
darco 56a656
darco 56a656
darco 56a656
*** System overview ***
darco 56a656
darco 56a656
The compressor and decompressor are each divided into two main sections:
darco 56a656
the JPEG compressor or decompressor proper, and the preprocessing or
darco 56a656
postprocessing functions.  The interface between these two sections is the
darco 56a656
image data that the official JPEG spec regards as its input or output: this
darco 56a656
data is in the colorspace to be used for compression, and it is downsampled
darco 56a656
to the sampling factors to be used.  The preprocessing and postprocessing
darco 56a656
steps are responsible for converting a normal image representation to or from
darco 56a656
this form.  (Those few applications that want to deal with YCbCr downsampled
darco 56a656
data can skip the preprocessing or postprocessing step.)
darco 56a656
darco 56a656
Looking more closely, the compressor library contains the following main
darco 56a656
elements:
darco 56a656
darco 56a656
  Preprocessing:
darco 56a656
    * Color space conversion (e.g., RGB to YCbCr).
darco 56a656
    * Edge expansion and downsampling.  Optionally, this step can do simple
darco 56a656
      smoothing --- this is often helpful for low-quality source data.
darco 56a656
  JPEG proper:
darco 56a656
    * MCU assembly, DCT, quantization.
darco 56a656
    * Entropy coding (sequential or progressive, Huffman or arithmetic).
darco 56a656
darco 56a656
In addition to these modules we need overall control, marker generation,
darco 56a656
and support code (memory management & error handling).  There is also a
darco 56a656
module responsible for physically writing the output data --- typically
darco 56a656
this is just an interface to fwrite(), but some applications may need to
darco 56a656
do something else with the data.
darco 56a656
darco 56a656
The decompressor library contains the following main elements:
darco 56a656
darco 56a656
  JPEG proper:
darco 56a656
    * Entropy decoding (sequential or progressive, Huffman or arithmetic).
darco 56a656
    * Dequantization, inverse DCT, MCU disassembly.
darco 56a656
  Postprocessing:
darco 56a656
    * Upsampling.  Optionally, this step may be able to do more general
darco 56a656
      rescaling of the image.
darco 56a656
    * Color space conversion (e.g., YCbCr to RGB).  This step may also
darco 56a656
      provide gamma adjustment [ currently it does not ].
darco 56a656
    * Optional color quantization (e.g., reduction to 256 colors).
darco 56a656
    * Optional color precision reduction (e.g., 24-bit to 15-bit color).
darco 56a656
      [This feature is not currently implemented.]
darco 56a656
darco 56a656
We also need overall control, marker parsing, and a data source module.
darco 56a656
The support code (memory management & error handling) can be shared with
darco 56a656
the compression half of the library.
darco 56a656
darco 56a656
There may be several implementations of each of these elements, particularly
darco 56a656
in the decompressor, where a wide range of speed/quality tradeoffs is very
darco 56a656
useful.  It must be understood that some of the best speedups involve
darco 56a656
merging adjacent steps in the pipeline.  For example, upsampling, color space
darco 56a656
conversion, and color quantization might all be done at once when using a
darco 56a656
low-quality ordered-dither technique.  The system architecture is designed to
darco 56a656
allow such merging where appropriate.
darco 56a656
darco 56a656
darco 56a656
Note: it is convenient to regard edge expansion (padding to block boundaries)
darco 56a656
as a preprocessing/postprocessing function, even though the JPEG spec includes
darco 56a656
it in compression/decompression.  We do this because downsampling/upsampling
darco 56a656
can be simplified a little if they work on padded data: it's not necessary to
darco 56a656
have special cases at the right and bottom edges.  Therefore the interface
darco 56a656
buffer is always an integral number of blocks wide and high, and we expect
darco 56a656
compression preprocessing to pad the source data properly.  Padding will occur
darco 56a656
only to the next block (8-sample) boundary.  In an interleaved-scan situation,
darco 56a656
additional dummy blocks may be used to fill out MCUs, but the MCU assembly and
darco 56a656
disassembly logic will create or discard these blocks internally.  (This is
darco 56a656
advantageous for speed reasons, since we avoid DCTing the dummy blocks.
darco 56a656
It also permits a small reduction in file size, because the compressor can
darco 56a656
choose dummy block contents so as to minimize their size in compressed form.
darco 56a656
Finally, it makes the interface buffer specification independent of whether
darco 56a656
the file is actually interleaved or not.)  Applications that wish to deal
darco 56a656
directly with the downsampled data must provide similar buffering and padding
darco 56a656
for odd-sized images.
darco 56a656
darco 56a656
darco 56a656
*** Poor man's object-oriented programming ***
darco 56a656
darco 56a656
It should be clear by now that we have a lot of quasi-independent processing
darco 56a656
steps, many of which have several possible behaviors.  To avoid cluttering the
darco 56a656
code with lots of switch statements, we use a simple form of object-style
darco 56a656
programming to separate out the different possibilities.
darco 56a656
darco 56a656
For example, two different color quantization algorithms could be implemented
darco 56a656
as two separate modules that present the same external interface; at runtime,
darco 56a656
the calling code will access the proper module indirectly through an "object".
darco 56a656
darco 56a656
We can get the limited features we need while staying within portable C.
darco 56a656
The basic tool is a function pointer.  An "object" is just a struct
darco 56a656
containing one or more function pointer fields, each of which corresponds to
darco 56a656
a method name in real object-oriented languages.  During initialization we
darco 56a656
fill in the function pointers with references to whichever module we have
darco 56a656
determined we need to use in this run.  Then invocation of the module is done
darco 56a656
by indirecting through a function pointer; on most machines this is no more
darco 56a656
expensive than a switch statement, which would be the only other way of
darco 56a656
making the required run-time choice.  The really significant benefit, of
darco 56a656
course, is keeping the source code clean and well structured.
darco 56a656
darco 56a656
We can also arrange to have private storage that varies between different
darco 56a656
implementations of the same kind of object.  We do this by making all the
darco 56a656
module-specific object structs be separately allocated entities, which will
darco 56a656
be accessed via pointers in the master compression or decompression struct.
darco 56a656
The "public" fields or methods for a given kind of object are specified by
darco 56a656
a commonly known struct.  But a module's initialization code can allocate
darco 56a656
a larger struct that contains the common struct as its first member, plus
darco 56a656
additional private fields.  With appropriate pointer casting, the module's
darco 56a656
internal functions can access these private fields.  (For a simple example,
darco 56a656
see jdatadst.c, which implements the external interface specified by struct
darco 56a656
jpeg_destination_mgr, but adds extra fields.)
darco 56a656
darco 56a656
(Of course this would all be a lot easier if we were using C++, but we are
darco 56a656
not yet prepared to assume that everyone has a C++ compiler.)
darco 56a656
darco 56a656
An important benefit of this scheme is that it is easy to provide multiple
darco 56a656
versions of any method, each tuned to a particular case.  While a lot of
darco 56a656
precalculation might be done to select an optimal implementation of a method,
darco 56a656
the cost per invocation is constant.  For example, the upsampling step might
darco 56a656
have a "generic" method, plus one or more "hardwired" methods for the most
darco 56a656
popular sampling factors; the hardwired methods would be faster because they'd
darco 56a656
use straight-line code instead of for-loops.  The cost to determine which
darco 56a656
method to use is paid only once, at startup, and the selection criteria are
darco 56a656
hidden from the callers of the method.
darco 56a656
darco 56a656
This plan differs a little bit from usual object-oriented structures, in that
darco 56a656
only one instance of each object class will exist during execution.  The
darco 56a656
reason for having the class structure is that on different runs we may create
darco 56a656
different instances (choose to execute different modules).  You can think of
darco 56a656
the term "method" as denoting the common interface presented by a particular
darco 56a656
set of interchangeable functions, and "object" as denoting a group of related
darco 56a656
methods, or the total shared interface behavior of a group of modules.
darco 56a656
darco 56a656
darco 56a656
*** Overall control structure ***
darco 56a656
darco 56a656
We previously mentioned the need for overall control logic in the compression
darco 56a656
and decompression libraries.  In IJG implementations prior to v5, overall
darco 56a656
control was mostly provided by "pipeline control" modules, which proved to be
darco 56a656
large, unwieldy, and hard to understand.  To improve the situation, the
darco 56a656
control logic has been subdivided into multiple modules.  The control modules
darco 56a656
consist of:
darco 56a656
darco 56a656
1. Master control for module selection and initialization.  This has two
darco 56a656
responsibilities:
darco 56a656
darco 56a656
   1A.  Startup initialization at the beginning of image processing.
darco 56a656
        The individual processing modules to be used in this run are selected
darco 56a656
        and given initialization calls.
darco 56a656
darco 56a656
   1B.  Per-pass control.  This determines how many passes will be performed
darco 56a656
        and calls each active processing module to configure itself
darco 56a656
        appropriately at the beginning of each pass.  End-of-pass processing,
darco 56a656
	where necessary, is also invoked from the master control module.
darco 56a656
darco 56a656
   Method selection is partially distributed, in that a particular processing
darco 56a656
   module may contain several possible implementations of a particular method,
darco 56a656
   which it will select among when given its initialization call.  The master
darco 56a656
   control code need only be concerned with decisions that affect more than
darco 56a656
   one module.
darco 56a656
 
darco 56a656
2. Data buffering control.  A separate control module exists for each
darco 56a656
   inter-processing-step data buffer.  This module is responsible for
darco 56a656
   invoking the processing steps that write or read that data buffer.
darco 56a656
darco 56a656
Each buffer controller sees the world as follows:
darco 56a656
darco 56a656
input data => processing step A => buffer => processing step B => output data
darco 56a656
                      |              |               |
darco 56a656
              ------------------ controller ------------------
darco 56a656
darco 56a656
The controller knows the dataflow requirements of steps A and B: how much data
darco 56a656
they want to accept in one chunk and how much they output in one chunk.  Its
darco 56a656
function is to manage its buffer and call A and B at the proper times.
darco 56a656
darco 56a656
A data buffer control module may itself be viewed as a processing step by a
darco 56a656
higher-level control module; thus the control modules form a binary tree with
darco 56a656
elementary processing steps at the leaves of the tree.
darco 56a656
darco 56a656
The control modules are objects.  A considerable amount of flexibility can
darco 56a656
be had by replacing implementations of a control module.  For example:
darco 56a656
* Merging of adjacent steps in the pipeline is done by replacing a control
darco 56a656
  module and its pair of processing-step modules with a single processing-
darco 56a656
  step module.  (Hence the possible merges are determined by the tree of
darco 56a656
  control modules.)
darco 56a656
* In some processing modes, a given interstep buffer need only be a "strip"
darco 56a656
  buffer large enough to accommodate the desired data chunk sizes.  In other
darco 56a656
  modes, a full-image buffer is needed and several passes are required.
darco 56a656
  The control module determines which kind of buffer is used and manipulates
darco 56a656
  virtual array buffers as needed.  One or both processing steps may be
darco 56a656
  unaware of the multi-pass behavior.
darco 56a656
darco 56a656
In theory, we might be able to make all of the data buffer controllers
darco 56a656
interchangeable and provide just one set of implementations for all.  In
darco 56a656
practice, each one contains considerable special-case processing for its
darco 56a656
particular job.  The buffer controller concept should be regarded as an
darco 56a656
overall system structuring principle, not as a complete description of the
darco 56a656
task performed by any one controller.
darco 56a656
darco 56a656
darco 56a656
*** Compression object structure ***
darco 56a656
darco 56a656
Here is a sketch of the logical structure of the JPEG compression library:
darco 56a656
darco 56a656
                                                 |-- Colorspace conversion
darco 56a656
                  |-- Preprocessing controller --|
darco 56a656
                  |                              |-- Downsampling
darco 56a656
Main controller --|
darco 56a656
                  |                            |-- Forward DCT, quantize
darco 56a656
                  |-- Coefficient controller --|
darco 56a656
                                               |-- Entropy encoding
darco 56a656
darco 56a656
This sketch also describes the flow of control (subroutine calls) during
darco 56a656
typical image data processing.  Each of the components shown in the diagram is
darco 56a656
an "object" which may have several different implementations available.  One
darco 56a656
or more source code files contain the actual implementation(s) of each object.
darco 56a656
darco 56a656
The objects shown above are:
darco 56a656
darco 56a656
* Main controller: buffer controller for the subsampled-data buffer, which
darco 56a656
  holds the preprocessed input data.  This controller invokes preprocessing to
darco 56a656
  fill the subsampled-data buffer, and JPEG compression to empty it.  There is
darco 56a656
  usually no need for a full-image buffer here; a strip buffer is adequate.
darco 56a656
darco 56a656
* Preprocessing controller: buffer controller for the downsampling input data
darco 56a656
  buffer, which lies between colorspace conversion and downsampling.  Note
darco 56a656
  that a unified conversion/downsampling module would probably replace this
darco 56a656
  controller entirely.
darco 56a656
darco 56a656
* Colorspace conversion: converts application image data into the desired
darco 56a656
  JPEG color space; also changes the data from pixel-interleaved layout to
darco 56a656
  separate component planes.  Processes one pixel row at a time.
darco 56a656
darco 56a656
* Downsampling: performs reduction of chroma components as required.
darco 56a656
  Optionally may perform pixel-level smoothing as well.  Processes a "row
darco 56a656
  group" at a time, where a row group is defined as Vmax pixel rows of each
darco 56a656
  component before downsampling, and Vk sample rows afterwards (remember Vk
darco 56a656
  differs across components).  Some downsampling or smoothing algorithms may
darco 56a656
  require context rows above and below the current row group; the
darco 56a656
  preprocessing controller is responsible for supplying these rows via proper
darco 56a656
  buffering.  The downsampler is responsible for edge expansion at the right
darco 56a656
  edge (i.e., extending each sample row to a multiple of 8 samples); but the
darco 56a656
  preprocessing controller is responsible for vertical edge expansion (i.e.,
darco 56a656
  duplicating the bottom sample row as needed to make a multiple of 8 rows).
darco 56a656
darco 56a656
* Coefficient controller: buffer controller for the DCT-coefficient data.
darco 56a656
  This controller handles MCU assembly, including insertion of dummy DCT
darco 56a656
  blocks when needed at the right or bottom edge.  When performing
darco 56a656
  Huffman-code optimization or emitting a multiscan JPEG file, this
darco 56a656
  controller is responsible for buffering the full image.  The equivalent of
darco 56a656
  one fully interleaved MCU row of subsampled data is processed per call,
darco 56a656
  even when the JPEG file is noninterleaved.
darco 56a656
darco 56a656
* Forward DCT and quantization: Perform DCT, quantize, and emit coefficients.
darco 56a656
  Works on one or more DCT blocks at a time.  (Note: the coefficients are now
darco 56a656
  emitted in normal array order, which the entropy encoder is expected to
darco 56a656
  convert to zigzag order as necessary.  Prior versions of the IJG code did
darco 56a656
  the conversion to zigzag order within the quantization step.)
darco 56a656
darco 56a656
* Entropy encoding: Perform Huffman or arithmetic entropy coding and emit the
darco 56a656
  coded data to the data destination module.  Works on one MCU per call.
darco 56a656
  For progressive JPEG, the same DCT blocks are fed to the entropy coder
darco 56a656
  during each pass, and the coder must emit the appropriate subset of
darco 56a656
  coefficients.
darco 56a656
darco 56a656
In addition to the above objects, the compression library includes these
darco 56a656
objects:
darco 56a656
darco 56a656
* Master control: determines the number of passes required, controls overall
darco 56a656
  and per-pass initialization of the other modules.
darco 56a656
darco 56a656
* Marker writing: generates JPEG markers (except for RSTn, which is emitted
darco 56a656
  by the entropy encoder when needed).
darco 56a656
darco 56a656
* Data destination manager: writes the output JPEG datastream to its final
darco 56a656
  destination (e.g., a file).  The destination manager supplied with the
darco 56a656
  library knows how to write to a stdio stream; for other behaviors, the
darco 56a656
  surrounding application may provide its own destination manager.
darco 56a656
darco 56a656
* Memory manager: allocates and releases memory, controls virtual arrays
darco 56a656
  (with backing store management, where required).
darco 56a656
darco 56a656
* Error handler: performs formatting and output of error and trace messages;
darco 56a656
  determines handling of nonfatal errors.  The surrounding application may
darco 56a656
  override some or all of this object's methods to change error handling.
darco 56a656
darco 56a656
* Progress monitor: supports output of "percent-done" progress reports.
darco 56a656
  This object represents an optional callback to the surrounding application:
darco 56a656
  if wanted, it must be supplied by the application.
darco 56a656
darco 56a656
The error handler, destination manager, and progress monitor objects are
darco 56a656
defined as separate objects in order to simplify application-specific
darco 56a656
customization of the JPEG library.  A surrounding application may override
darco 56a656
individual methods or supply its own all-new implementation of one of these
darco 56a656
objects.  The object interfaces for these objects are therefore treated as
darco 56a656
part of the application interface of the library, whereas the other objects
darco 56a656
are internal to the library.
darco 56a656
darco 56a656
The error handler and memory manager are shared by JPEG compression and
darco 56a656
decompression; the progress monitor, if used, may be shared as well.
darco 56a656
darco 56a656
darco 56a656
*** Decompression object structure ***
darco 56a656
darco 56a656
Here is a sketch of the logical structure of the JPEG decompression library:
darco 56a656
darco 56a656
                                               |-- Entropy decoding
darco 56a656
                  |-- Coefficient controller --|
darco 56a656
                  |                            |-- Dequantize, Inverse DCT
darco 56a656
Main controller --|
darco 56a656
                  |                               |-- Upsampling
darco 56a656
                  |-- Postprocessing controller --|   |-- Colorspace conversion
darco 56a656
                                                  |-- Color quantization
darco 56a656
                                                  |-- Color precision reduction
darco 56a656
darco 56a656
As before, this diagram also represents typical control flow.  The objects
darco 56a656
shown are:
darco 56a656
darco 56a656
* Main controller: buffer controller for the subsampled-data buffer, which
darco 56a656
  holds the output of JPEG decompression proper.  This controller's primary
darco 56a656
  task is to feed the postprocessing procedure.  Some upsampling algorithms
darco 56a656
  may require context rows above and below the current row group; when this
darco 56a656
  is true, the main controller is responsible for managing its buffer so as
darco 56a656
  to make context rows available.  In the current design, the main buffer is
darco 56a656
  always a strip buffer; a full-image buffer is never required.
darco 56a656
darco 56a656
* Coefficient controller: buffer controller for the DCT-coefficient data.
darco 56a656
  This controller handles MCU disassembly, including deletion of any dummy
darco 56a656
  DCT blocks at the right or bottom edge.  When reading a multiscan JPEG
darco 56a656
  file, this controller is responsible for buffering the full image.
darco 56a656
  (Buffering DCT coefficients, rather than samples, is necessary to support
darco 56a656
  progressive JPEG.)  The equivalent of one fully interleaved MCU row of
darco 56a656
  subsampled data is processed per call, even when the source JPEG file is
darco 56a656
  noninterleaved.
darco 56a656
darco 56a656
* Entropy decoding: Read coded data from the data source module and perform
darco 56a656
  Huffman or arithmetic entropy decoding.  Works on one MCU per call.
darco 56a656
  For progressive JPEG decoding, the coefficient controller supplies the prior
darco 56a656
  coefficients of each MCU (initially all zeroes), which the entropy decoder
darco 56a656
  modifies in each scan.
darco 56a656
darco 56a656
* Dequantization and inverse DCT: like it says.  Note that the coefficients
darco 56a656
  buffered by the coefficient controller have NOT been dequantized; we
darco 56a656
  merge dequantization and inverse DCT into a single step for speed reasons.
darco 56a656
  When scaled-down output is asked for, simplified DCT algorithms may be used
darco 56a656
  that emit only 1x1, 2x2, or 4x4 samples per DCT block, not the full 8x8.
darco 56a656
  Works on one DCT block at a time.
darco 56a656
darco 56a656
* Postprocessing controller: buffer controller for the color quantization
darco 56a656
  input buffer, when quantization is in use.  (Without quantization, this
darco 56a656
  controller just calls the upsampler.)  For two-pass quantization, this
darco 56a656
  controller is responsible for buffering the full-image data.
darco 56a656
darco 56a656
* Upsampling: restores chroma components to full size.  (May support more
darco 56a656
  general output rescaling, too.  Note that if undersized DCT outputs have
darco 56a656
  been emitted by the DCT module, this module must adjust so that properly
darco 56a656
  sized outputs are created.)  Works on one row group at a time.  This module
darco 56a656
  also calls the color conversion module, so its top level is effectively a
darco 56a656
  buffer controller for the upsampling->color conversion buffer.  However, in
darco 56a656
  all but the highest-quality operating modes, upsampling and color
darco 56a656
  conversion are likely to be merged into a single step.
darco 56a656
darco 56a656
* Colorspace conversion: convert from JPEG color space to output color space,
darco 56a656
  and change data layout from separate component planes to pixel-interleaved.
darco 56a656
  Works on one pixel row at a time.
darco 56a656
darco 56a656
* Color quantization: reduce the data to colormapped form, using either an
darco 56a656
  externally specified colormap or an internally generated one.  This module
darco 56a656
  is not used for full-color output.  Works on one pixel row at a time; may
darco 56a656
  require two passes to generate a color map.  Note that the output will
darco 56a656
  always be a single component representing colormap indexes.  In the current
darco 56a656
  design, the output values are JSAMPLEs, so an 8-bit compilation cannot
darco 56a656
  quantize to more than 256 colors.  This is unlikely to be a problem in
darco 56a656
  practice.
darco 56a656
darco 56a656
* Color reduction: this module handles color precision reduction, e.g.,
darco 56a656
  generating 15-bit color (5 bits/primary) from JPEG's 24-bit output.
darco 56a656
  Not quite clear yet how this should be handled... should we merge it with
darco 56a656
  colorspace conversion???
darco 56a656
darco 56a656
Note that some high-speed operating modes might condense the entire
darco 56a656
postprocessing sequence to a single module (upsample, color convert, and
darco 56a656
quantize in one step).
darco 56a656
darco 56a656
In addition to the above objects, the decompression library includes these
darco 56a656
objects:
darco 56a656
darco 56a656
* Master control: determines the number of passes required, controls overall
darco 56a656
  and per-pass initialization of the other modules.  This is subdivided into
darco 56a656
  input and output control: jdinput.c controls only input-side processing,
darco 56a656
  while jdmaster.c handles overall initialization and output-side control.
darco 56a656
darco 56a656
* Marker reading: decodes JPEG markers (except for RSTn).
darco 56a656
darco 56a656
* Data source manager: supplies the input JPEG datastream.  The source
darco 56a656
  manager supplied with the library knows how to read from a stdio stream;
darco 56a656
  for other behaviors, the surrounding application may provide its own source
darco 56a656
  manager.
darco 56a656
darco 56a656
* Memory manager: same as for compression library.
darco 56a656
darco 56a656
* Error handler: same as for compression library.
darco 56a656
darco 56a656
* Progress monitor: same as for compression library.
darco 56a656
darco 56a656
As with compression, the data source manager, error handler, and progress
darco 56a656
monitor are candidates for replacement by a surrounding application.
darco 56a656
darco 56a656
darco 56a656
*** Decompression input and output separation ***
darco 56a656
darco 56a656
To support efficient incremental display of progressive JPEG files, the
darco 56a656
decompressor is divided into two sections that can run independently:
darco 56a656
darco 56a656
1. Data input includes marker parsing, entropy decoding, and input into the
darco 56a656
   coefficient controller's DCT coefficient buffer.  Note that this
darco 56a656
   processing is relatively cheap and fast.
darco 56a656
darco 56a656
2. Data output reads from the DCT coefficient buffer and performs the IDCT
darco 56a656
   and all postprocessing steps.
darco 56a656
darco 56a656
For a progressive JPEG file, the data input processing is allowed to get
darco 56a656
arbitrarily far ahead of the data output processing.  (This occurs only
darco 56a656
if the application calls jpeg_consume_input(); otherwise input and output
darco 56a656
run in lockstep, since the input section is called only when the output
darco 56a656
section needs more data.)  In this way the application can avoid making
darco 56a656
extra display passes when data is arriving faster than the display pass
darco 56a656
can run.  Furthermore, it is possible to abort an output pass without
darco 56a656
losing anything, since the coefficient buffer is read-only as far as the
darco 56a656
output section is concerned.  See libjpeg.doc for more detail.
darco 56a656
darco 56a656
A full-image coefficient array is only created if the JPEG file has multiple
darco 56a656
scans (or if the application specifies buffered-image mode anyway).  When
darco 56a656
reading a single-scan file, the coefficient controller normally creates only
darco 56a656
a one-MCU buffer, so input and output processing must run in lockstep in this
darco 56a656
case.  jpeg_consume_input() is effectively a no-op in this situation.
darco 56a656
darco 56a656
The main impact of dividing the decompressor in this fashion is that we must
darco 56a656
be very careful with shared variables in the cinfo data structure.  Each
darco 56a656
variable that can change during the course of decompression must be
darco 56a656
classified as belonging to data input or data output, and each section must
darco 56a656
look only at its own variables.  For example, the data output section may not
darco 56a656
depend on any of the variables that describe the current scan in the JPEG
darco 56a656
file, because these may change as the data input section advances into a new
darco 56a656
scan.
darco 56a656
darco 56a656
The progress monitor is (somewhat arbitrarily) defined to treat input of the
darco 56a656
file as one pass when buffered-image mode is not used, and to ignore data
darco 56a656
input work completely when buffered-image mode is used.  Note that the
darco 56a656
library has no reliable way to predict the number of passes when dealing
darco 56a656
with a progressive JPEG file, nor can it predict the number of output passes
darco 56a656
in buffered-image mode.  So the work estimate is inherently bogus anyway.
darco 56a656
darco 56a656
No comparable division is currently made in the compression library, because
darco 56a656
there isn't any real need for it.
darco 56a656
darco 56a656
darco 56a656
*** Data formats ***
darco 56a656
darco 56a656
Arrays of pixel sample values use the following data structure:
darco 56a656
darco 56a656
    typedef something JSAMPLE;		a pixel component value, 0..MAXJSAMPLE
darco 56a656
    typedef JSAMPLE *JSAMPROW;		ptr to a row of samples
darco 56a656
    typedef JSAMPROW *JSAMPARRAY;	ptr to a list of rows
darco 56a656
    typedef JSAMPARRAY *JSAMPIMAGE;	ptr to a list of color-component arrays
darco 56a656
darco 56a656
The basic element type JSAMPLE will typically be one of unsigned char,
darco 56a656
(signed) char, or short.  Short will be used if samples wider than 8 bits are
darco 56a656
to be supported (this is a compile-time option).  Otherwise, unsigned char is
darco 56a656
used if possible.  If the compiler only supports signed chars, then it is
darco 56a656
necessary to mask off the value when reading.  Thus, all reads of JSAMPLE
darco 56a656
values must be coded as "GETJSAMPLE(value)", where the macro will be defined
darco 56a656
as "((value) & 0xFF)" on signed-char machines and "((int) (value))" elsewhere.
darco 56a656
darco 56a656
With these conventions, JSAMPLE values can be assumed to be >= 0.  This helps
darco 56a656
simplify correct rounding during downsampling, etc.  The JPEG standard's
darco 56a656
specification that sample values run from -128..127 is accommodated by
darco 56a656
subtracting 128 just as the sample value is copied into the source array for
darco 56a656
the DCT step (this will be an array of signed ints).  Similarly, during
darco 56a656
decompression the output of the IDCT step will be immediately shifted back to
darco 56a656
0..255.  (NB: different values are required when 12-bit samples are in use.
darco 56a656
The code is written in terms of MAXJSAMPLE and CENTERJSAMPLE, which will be
darco 56a656
defined as 255 and 128 respectively in an 8-bit implementation, and as 4095
darco 56a656
and 2048 in a 12-bit implementation.)
darco 56a656
darco 56a656
We use a pointer per row, rather than a two-dimensional JSAMPLE array.  This
darco 56a656
choice costs only a small amount of memory and has several benefits:
darco 56a656
* Code using the data structure doesn't need to know the allocated width of
darco 56a656
  the rows.  This simplifies edge expansion/compression, since we can work
darco 56a656
  in an array that's wider than the logical picture width.
darco 56a656
* Indexing doesn't require multiplication; this is a performance win on many
darco 56a656
  machines.
darco 56a656
* Arrays with more than 64K total elements can be supported even on machines
darco 56a656
  where malloc() cannot allocate chunks larger than 64K.
darco 56a656
* The rows forming a component array may be allocated at different times
darco 56a656
  without extra copying.  This trick allows some speedups in smoothing steps
darco 56a656
  that need access to the previous and next rows.
darco 56a656
darco 56a656
Note that each color component is stored in a separate array; we don't use the
darco 56a656
traditional layout in which the components of a pixel are stored together.
darco 56a656
This simplifies coding of modules that work on each component independently,
darco 56a656
because they don't need to know how many components there are.  Furthermore,
darco 56a656
we can read or write each component to a temporary file independently, which
darco 56a656
is helpful when dealing with noninterleaved JPEG files.
darco 56a656
darco 56a656
In general, a specific sample value is accessed by code such as
darco 56a656
	GETJSAMPLE(image[colorcomponent][row][col])
darco 56a656
where col is measured from the image left edge, but row is measured from the
darco 56a656
first sample row currently in memory.  Either of the first two indexings can
darco 56a656
be precomputed by copying the relevant pointer.
darco 56a656
darco 56a656
darco 56a656
Since most image-processing applications prefer to work on images in which
darco 56a656
the components of a pixel are stored together, the data passed to or from the
darco 56a656
surrounding application uses the traditional convention: a single pixel is
darco 56a656
represented by N consecutive JSAMPLE values, and an image row is an array of
darco 56a656
(# of color components)*(image width) JSAMPLEs.  One or more rows of data can
darco 56a656
be represented by a pointer of type JSAMPARRAY in this scheme.  This scheme is
darco 56a656
converted to component-wise storage inside the JPEG library.  (Applications
darco 56a656
that want to skip JPEG preprocessing or postprocessing will have to contend
darco 56a656
with component-wise storage.)
darco 56a656
darco 56a656
darco 56a656
Arrays of DCT-coefficient values use the following data structure:
darco 56a656
darco 56a656
    typedef short JCOEF;		a 16-bit signed integer
darco 56a656
    typedef JCOEF JBLOCK[DCTSIZE2];	an 8x8 block of coefficients
darco 56a656
    typedef JBLOCK *JBLOCKROW;		ptr to one horizontal row of 8x8 blocks
darco 56a656
    typedef JBLOCKROW *JBLOCKARRAY;	ptr to a list of such rows
darco 56a656
    typedef JBLOCKARRAY *JBLOCKIMAGE;	ptr to a list of color component arrays
darco 56a656
darco 56a656
The underlying type is at least a 16-bit signed integer; while "short" is big
darco 56a656
enough on all machines of interest, on some machines it is preferable to use
darco 56a656
"int" for speed reasons, despite the storage cost.  Coefficients are grouped
darco 56a656
into 8x8 blocks (but we always use #defines DCTSIZE and DCTSIZE2 rather than
darco 56a656
"8" and "64").
darco 56a656
darco 56a656
The contents of a coefficient block may be in either "natural" or zigzagged
darco 56a656
order, and may be true values or divided by the quantization coefficients,
darco 56a656
depending on where the block is in the processing pipeline.  In the current
darco 56a656
library, coefficient blocks are kept in natural order everywhere; the entropy
darco 56a656
codecs zigzag or dezigzag the data as it is written or read.  The blocks
darco 56a656
contain quantized coefficients everywhere outside the DCT/IDCT subsystems.
darco 56a656
(This latter decision may need to be revisited to support variable
darco 56a656
quantization a la JPEG Part 3.)
darco 56a656
darco 56a656
Notice that the allocation unit is now a row of 8x8 blocks, corresponding to
darco 56a656
eight rows of samples.  Otherwise the structure is much the same as for
darco 56a656
samples, and for the same reasons.
darco 56a656
darco 56a656
On machines where malloc() can't handle a request bigger than 64Kb, this data
darco 56a656
structure limits us to rows of less than 512 JBLOCKs, or a picture width of
darco 56a656
4000+ pixels.  This seems an acceptable restriction.
darco 56a656
darco 56a656
darco 56a656
On 80x86 machines, the bottom-level pointer types (JSAMPROW and JBLOCKROW)
darco 56a656
must be declared as "far" pointers, but the upper levels can be "near"
darco 56a656
(implying that the pointer lists are allocated in the DS segment).
darco 56a656
We use a #define symbol FAR, which expands to the "far" keyword when
darco 56a656
compiling on 80x86 machines and to nothing elsewhere.
darco 56a656
darco 56a656
darco 56a656
*** Suspendable processing ***
darco 56a656
darco 56a656
In some applications it is desirable to use the JPEG library as an
darco 56a656
incremental, memory-to-memory filter.  In this situation the data source or
darco 56a656
destination may be a limited-size buffer, and we can't rely on being able to
darco 56a656
empty or refill the buffer at arbitrary times.  Instead the application would
darco 56a656
like to have control return from the library at buffer overflow/underrun, and
darco 56a656
then resume compression or decompression at a later time.
darco 56a656
darco 56a656
This scenario is supported for simple cases.  (For anything more complex, we
darco 56a656
recommend that the application "bite the bullet" and develop real multitasking
darco 56a656
capability.)  The libjpeg.doc file goes into more detail about the usage and
darco 56a656
limitations of this capability; here we address the implications for library
darco 56a656
structure.
darco 56a656
darco 56a656
The essence of the problem is that the entropy codec (coder or decoder) must
darco 56a656
be prepared to stop at arbitrary times.  In turn, the controllers that call
darco 56a656
the entropy codec must be able to stop before having produced or consumed all
darco 56a656
the data that they normally would handle in one call.  That part is reasonably
darco 56a656
straightforward: we make the controller call interfaces include "progress
darco 56a656
counters" which indicate the number of data chunks successfully processed, and
darco 56a656
we require callers to test the counter rather than just assume all of the data
darco 56a656
was processed.
darco 56a656
darco 56a656
Rather than trying to restart at an arbitrary point, the current Huffman
darco 56a656
codecs are designed to restart at the beginning of the current MCU after a
darco 56a656
suspension due to buffer overflow/underrun.  At the start of each call, the
darco 56a656
codec's internal state is loaded from permanent storage (in the JPEG object
darco 56a656
structures) into local variables.  On successful completion of the MCU, the
darco 56a656
permanent state is updated.  (This copying is not very expensive, and may even
darco 56a656
lead to *improved* performance if the local variables can be registerized.)
darco 56a656
If a suspension occurs, the codec simply returns without updating the state,
darco 56a656
thus effectively reverting to the start of the MCU.  Note that this implies
darco 56a656
leaving some data unprocessed in the source/destination buffer (ie, the
darco 56a656
compressed partial MCU).  The data source/destination module interfaces are
darco 56a656
specified so as to make this possible.  This also implies that the data buffer
darco 56a656
must be large enough to hold a worst-case compressed MCU; a couple thousand
darco 56a656
bytes should be enough.
darco 56a656
darco 56a656
In a successive-approximation AC refinement scan, the progressive Huffman
darco 56a656
decoder has to be able to undo assignments of newly nonzero coefficients if it
darco 56a656
suspends before the MCU is complete, since decoding requires distinguishing
darco 56a656
previously-zero and previously-nonzero coefficients.  This is a bit tedious
darco 56a656
but probably won't have much effect on performance.  Other variants of Huffman
darco 56a656
decoding need not worry about this, since they will just store the same values
darco 56a656
again if forced to repeat the MCU.
darco 56a656
darco 56a656
This approach would probably not work for an arithmetic codec, since its
darco 56a656
modifiable state is quite large and couldn't be copied cheaply.  Instead it
darco 56a656
would have to suspend and resume exactly at the point of the buffer end.
darco 56a656
darco 56a656
The JPEG marker reader is designed to cope with suspension at an arbitrary
darco 56a656
point.  It does so by backing up to the start of the marker parameter segment,
darco 56a656
so the data buffer must be big enough to hold the largest marker of interest.
darco 56a656
Again, a couple KB should be adequate.  (A special "skip" convention is used
darco 56a656
to bypass COM and APPn markers, so these can be larger than the buffer size
darco 56a656
without causing problems; otherwise a 64K buffer would be needed in the worst
darco 56a656
case.)
darco 56a656
darco 56a656
The JPEG marker writer currently does *not* cope with suspension.  I feel that
darco 56a656
this is not necessary; it is much easier simply to require the application to
darco 56a656
ensure there is enough buffer space before starting.  (An empty 2K buffer is
darco 56a656
more than sufficient for the header markers; and ensuring there are a dozen or
darco 56a656
two bytes available before calling jpeg_finish_compress() will suffice for the
darco 56a656
trailer.)  This would not work for writing multi-scan JPEG files, but
darco 56a656
we simply do not intend to support that capability with suspension.
darco 56a656
darco 56a656
darco 56a656
*** Memory manager services ***
darco 56a656
darco 56a656
The JPEG library's memory manager controls allocation and deallocation of
darco 56a656
memory, and it manages large "virtual" data arrays on machines where the
darco 56a656
operating system does not provide virtual memory.  Note that the same
darco 56a656
memory manager serves both compression and decompression operations.
darco 56a656
darco 56a656
In all cases, allocated objects are tied to a particular compression or
darco 56a656
decompression master record, and they will be released when that master
darco 56a656
record is destroyed.
darco 56a656
darco 56a656
The memory manager does not provide explicit deallocation of objects.
darco 56a656
Instead, objects are created in "pools" of free storage, and a whole pool
darco 56a656
can be freed at once.  This approach helps prevent storage-leak bugs, and
darco 56a656
it speeds up operations whenever malloc/free are slow (as they often are).
darco 56a656
The pools can be regarded as lifetime identifiers for objects.  Two
darco 56a656
pools/lifetimes are defined:
darco 56a656
  * JPOOL_PERMANENT	lasts until master record is destroyed
darco 56a656
  * JPOOL_IMAGE		lasts until done with image (JPEG datastream)
darco 56a656
Permanent lifetime is used for parameters and tables that should be carried
darco 56a656
across from one datastream to another; this includes all application-visible
darco 56a656
parameters.  Image lifetime is used for everything else.  (A third lifetime,
darco 56a656
JPOOL_PASS = one processing pass, was originally planned.  However it was
darco 56a656
dropped as not being worthwhile.  The actual usage patterns are such that the
darco 56a656
peak memory usage would be about the same anyway; and having per-pass storage
darco 56a656
substantially complicates the virtual memory allocation rules --- see below.)
darco 56a656
darco 56a656
The memory manager deals with three kinds of object:
darco 56a656
1. "Small" objects.  Typically these require no more than 10K-20K total.
darco 56a656
2. "Large" objects.  These may require tens to hundreds of K depending on
darco 56a656
   image size.  Semantically they behave the same as small objects, but we
darco 56a656
   distinguish them for two reasons:
darco 56a656
     * On MS-DOS machines, large objects are referenced by FAR pointers,
darco 56a656
       small objects by NEAR pointers.
darco 56a656
     * Pool allocation heuristics may differ for large and small objects.
darco 56a656
   Note that individual "large" objects cannot exceed the size allowed by
darco 56a656
   type size_t, which may be 64K or less on some machines.
darco 56a656
3. "Virtual" objects.  These are large 2-D arrays of JSAMPLEs or JBLOCKs
darco 56a656
   (typically large enough for the entire image being processed).  The
darco 56a656
   memory manager provides stripwise access to these arrays.  On machines
darco 56a656
   without virtual memory, the rest of the array may be swapped out to a
darco 56a656
   temporary file.
darco 56a656
darco 56a656
(Note: JSAMPARRAY and JBLOCKARRAY data structures are a combination of large
darco 56a656
objects for the data proper and small objects for the row pointers.  For
darco 56a656
convenience and speed, the memory manager provides single routines to create
darco 56a656
these structures.  Similarly, virtual arrays include a small control block
darco 56a656
and a JSAMPARRAY or JBLOCKARRAY working buffer, all created with one call.)
darco 56a656
darco 56a656
In the present implementation, virtual arrays are only permitted to have image
darco 56a656
lifespan.  (Permanent lifespan would not be reasonable, and pass lifespan is
darco 56a656
not very useful since a virtual array's raison d'etre is to store data for
darco 56a656
multiple passes through the image.)  We also expect that only "small" objects
darco 56a656
will be given permanent lifespan, though this restriction is not required by
darco 56a656
the memory manager.
darco 56a656
darco 56a656
In a non-virtual-memory machine, some performance benefit can be gained by
darco 56a656
making the in-memory buffers for virtual arrays be as large as possible.
darco 56a656
(For small images, the buffers might fit entirely in memory, so blind
darco 56a656
swapping would be very wasteful.)  The memory manager will adjust the height
darco 56a656
of the buffers to fit within a prespecified maximum memory usage.  In order
darco 56a656
to do this in a reasonably optimal fashion, the manager needs to allocate all
darco 56a656
of the virtual arrays at once.  Therefore, there isn't a one-step allocation
darco 56a656
routine for virtual arrays; instead, there is a "request" routine that simply
darco 56a656
allocates the control block, and a "realize" routine (called just once) that
darco 56a656
determines space allocation and creates all of the actual buffers.  The
darco 56a656
realize routine must allow for space occupied by non-virtual large objects.
darco 56a656
(We don't bother to factor in the space needed for small objects, on the
darco 56a656
grounds that it isn't worth the trouble.)
darco 56a656
darco 56a656
To support all this, we establish the following protocol for doing business
darco 56a656
with the memory manager:
darco 56a656
  1. Modules must request virtual arrays (which may have only image lifespan)
darco 56a656
     during the initial setup phase, i.e., in their jinit_xxx routines.
darco 56a656
  2. All "large" objects (including JSAMPARRAYs and JBLOCKARRAYs) must also be
darco 56a656
     allocated during initial setup.
darco 56a656
  3. realize_virt_arrays will be called at the completion of initial setup.
darco 56a656
     The above conventions ensure that sufficient information is available
darco 56a656
     for it to choose a good size for virtual array buffers.
darco 56a656
Small objects of any lifespan may be allocated at any time.  We expect that
darco 56a656
the total space used for small objects will be small enough to be negligible
darco 56a656
in the realize_virt_arrays computation.
darco 56a656
darco 56a656
In a virtual-memory machine, we simply pretend that the available space is
darco 56a656
infinite, thus causing realize_virt_arrays to decide that it can allocate all
darco 56a656
the virtual arrays as full-size in-memory buffers.  The overhead of the
darco 56a656
virtual-array access protocol is very small when no swapping occurs.
darco 56a656
darco 56a656
A virtual array can be specified to be "pre-zeroed"; when this flag is set,
darco 56a656
never-yet-written sections of the array are set to zero before being made
darco 56a656
available to the caller.  If this flag is not set, never-written sections
darco 56a656
of the array contain garbage.  (This feature exists primarily because the
darco 56a656
equivalent logic would otherwise be needed in jdcoefct.c for progressive
darco 56a656
JPEG mode; we may as well make it available for possible other uses.)
darco 56a656
darco 56a656
The first write pass on a virtual array is required to occur in top-to-bottom
darco 56a656
order; read passes, as well as any write passes after the first one, may
darco 56a656
access the array in any order.  This restriction exists partly to simplify
darco 56a656
the virtual array control logic, and partly because some file systems may not
darco 56a656
support seeking beyond the current end-of-file in a temporary file.  The main
darco 56a656
implication of this restriction is that rearrangement of rows (such as
darco 56a656
converting top-to-bottom data order to bottom-to-top) must be handled while
darco 56a656
reading data out of the virtual array, not while putting it in.
darco 56a656
darco 56a656
darco 56a656
*** Memory manager internal structure ***
darco 56a656
darco 56a656
To isolate system dependencies as much as possible, we have broken the
darco 56a656
memory manager into two parts.  There is a reasonably system-independent
darco 56a656
"front end" (jmemmgr.c) and a "back end" that contains only the code
darco 56a656
likely to change across systems.  All of the memory management methods
darco 56a656
outlined above are implemented by the front end.  The back end provides
darco 56a656
the following routines for use by the front end (none of these routines
darco 56a656
are known to the rest of the JPEG code):
darco 56a656
darco 56a656
jpeg_mem_init, jpeg_mem_term	system-dependent initialization/shutdown
darco 56a656
darco 56a656
jpeg_get_small, jpeg_free_small	interface to malloc and free library routines
darco 56a656
				(or their equivalents)
darco 56a656
darco 56a656
jpeg_get_large, jpeg_free_large	interface to FAR malloc/free in MSDOS machines;
darco 56a656
				else usually the same as
darco 56a656
				jpeg_get_small/jpeg_free_small
darco 56a656
darco 56a656
jpeg_mem_available		estimate available memory
darco 56a656
darco 56a656
jpeg_open_backing_store		create a backing-store object
darco 56a656
darco 56a656
read_backing_store,		manipulate a backing-store object
darco 56a656
write_backing_store,
darco 56a656
close_backing_store
darco 56a656
darco 56a656
On some systems there will be more than one type of backing-store object
darco 56a656
(specifically, in MS-DOS a backing store file might be an area of extended
darco 56a656
memory as well as a disk file).  jpeg_open_backing_store is responsible for
darco 56a656
choosing how to implement a given object.  The read/write/close routines
darco 56a656
are method pointers in the structure that describes a given object; this
darco 56a656
lets them be different for different object types.
darco 56a656
darco 56a656
It may be necessary to ensure that backing store objects are explicitly
darco 56a656
released upon abnormal program termination.  For example, MS-DOS won't free
darco 56a656
extended memory by itself.  To support this, we will expect the main program
darco 56a656
or surrounding application to arrange to call self_destruct (typically via
darco 56a656
jpeg_destroy) upon abnormal termination.  This may require a SIGINT signal
darco 56a656
handler or equivalent.  We don't want to have the back end module install its
darco 56a656
own signal handler, because that would pre-empt the surrounding application's
darco 56a656
ability to control signal handling.
darco 56a656
darco 56a656
The IJG distribution includes several memory manager back end implementations.
darco 56a656
Usually the same back end should be suitable for all applications on a given
darco 56a656
system, but it is possible for an application to supply its own back end at
darco 56a656
need.
darco 56a656
darco 56a656
darco 56a656
*** Implications of DNL marker ***
darco 56a656
darco 56a656
Some JPEG files may use a DNL marker to postpone definition of the image
darco 56a656
height (this would be useful for a fax-like scanner's output, for instance).
darco 56a656
In these files the SOF marker claims the image height is 0, and you only
darco 56a656
find out the true image height at the end of the first scan.
darco 56a656
darco 56a656
We could read these files as follows:
darco 56a656
1. Upon seeing zero image height, replace it by 65535 (the maximum allowed).
darco 56a656
2. When the DNL is found, update the image height in the global image
darco 56a656
   descriptor.
darco 56a656
This implies that control modules must avoid making copies of the image
darco 56a656
height, and must re-test for termination after each MCU row.  This would
darco 56a656
be easy enough to do.
darco 56a656
darco 56a656
In cases where image-size data structures are allocated, this approach will
darco 56a656
result in very inefficient use of virtual memory or much-larger-than-necessary
darco 56a656
temporary files.  This seems acceptable for something that probably won't be a
darco 56a656
mainstream usage.  People might have to forgo use of memory-hogging options
darco 56a656
(such as two-pass color quantization or noninterleaved JPEG files) if they
darco 56a656
want efficient conversion of such files.  (One could improve efficiency by
darco 56a656
demanding a user-supplied upper bound for the height, less than 65536; in most
darco 56a656
cases it could be much less.)
darco 56a656
darco 56a656
The standard also permits the SOF marker to overestimate the image height,
darco 56a656
with a DNL to give the true, smaller height at the end of the first scan.
darco 56a656
This would solve the space problems if the overestimate wasn't too great.
darco 56a656
However, it implies that you don't even know whether DNL will be used.
darco 56a656
darco 56a656
This leads to a couple of very serious objections:
darco 56a656
1. Testing for a DNL marker must occur in the inner loop of the decompressor's
darco 56a656
   Huffman decoder; this implies a speed penalty whether the feature is used
darco 56a656
   or not.
darco 56a656
2. There is no way to hide the last-minute change in image height from an
darco 56a656
   application using the decoder.  Thus *every* application using the IJG
darco 56a656
   library would suffer a complexity penalty whether it cared about DNL or
darco 56a656
   not.
darco 56a656
We currently do not support DNL because of these problems.
darco 56a656
darco 56a656
A different approach is to insist that DNL-using files be preprocessed by a
darco 56a656
separate program that reads ahead to the DNL, then goes back and fixes the SOF
darco 56a656
marker.  This is a much simpler solution and is probably far more efficient.
darco 56a656
Even if one wants piped input, buffering the first scan of the JPEG file needs
darco 56a656
a lot smaller temp file than is implied by the maximum-height method.  For
darco 56a656
this approach we'd simply treat DNL as a no-op in the decompressor (at most,
darco 56a656
check that it matches the SOF image height).
darco 56a656
darco 56a656
We will not worry about making the compressor capable of outputting DNL.
darco 56a656
Something similar to the first scheme above could be applied if anyone ever
darco 56a656
wants to make that work.