==============================================================================

                                  Q C C P A C K

                            Version 0.63, 04-jul-2021

                    Copyright (C) 1997-2021  James E. Fowler

------------------------------------------------------------------------------

Version 0.63


------------------------------------------------------------------------------

Version 0.62

  SPIHT and SPECK modules were merged into the main distribution.
  
------------------------------------------------------------------------------

Version 0.61

  Minor changes.

------------------------------------------------------------------------------

Version 0.60

  Minor changes.

------------------------------------------------------------------------------

Version 0.59

  Minor changes.

------------------------------------------------------------------------------

Version 0.58

  Added reversible KLT, KLT+3D-TCE coder for three-dimensional data,
  lossless 3D-TCE coder for three-dimensional data, and lossless
  KLT+3D-TCE coder for three-dimensional data. 

------------------------------------------------------------------------------

Version 0.57

  Added timer routines, vector angle measures.

------------------------------------------------------------------------------

Version 0.56

  Add the DCT-TCE image coder.

------------------------------------------------------------------------------

Version 0.55:

  Added libQccPackHYP standard module, including spectral PCA for
  hyperspectral imagery.

------------------------------------------------------------------------------

Version 0.54:

  Several minor bugs have been fixed.

------------------------------------------------------------------------------

Version 0.53:

  Added integer-valued wavelet transforms.

------------------------------------------------------------------------------

Version 0.52:

  Several minor bugs have been fixed.

------------------------------------------------------------------------------

Version 0.51:

  Man-page documentation has been completed for the image processing and
  manipulation routines in QccPackIMG.

  RGB to YUV color-space conversion has been corrected; previously
  U and V chrominance values were not scaled in accordance with the
  official PAL specification.

------------------------------------------------------------------------------

Version 0.50:

  Added motion estimation and compensation using regular triangle meshes.

  Added the 3D-WDR coder for three-dimensional data.

  Several minor bugs have been fixed.

------------------------------------------------------------------------------

Version 0.49:

  Added the spatial-block video coder and exponential-Golomb entropy coding.

------------------------------------------------------------------------------

Version 0.48:

  An extensive body of code has been added to the QccPackVID module to
  provide routines for motion estimation and motion compensation. These
  routines provide subpixel-accurate motion-estimation accuracy down to
  one-eighth pixel, while both bilinear interpolation and arbitrary
  interpolation filtering are supported for the creation of subpixel-accurate
  reference frames.

  Support for the calculation and checking of CRC codes has been added to
  the QccPackECC module. Additionally, routines for trellis codes and
  Viterbi decoding have been added to this module as well. All of these
  additions are undocumented at this point in time, but hopefully will have
  man pages in the near future.

  The QccFifo structure has been added to provide memory-based fifo
  capabilities.

------------------------------------------------------------------------------

Version 0.47:

  The TCE algorithm (Tian and Hemami 2004) for image coding has been added.

  Golomb coding, a lossless entropy coder, has been added.

  The 3D-BISK coder (Rucker and Fowler 2004) for three-dimensional data
  with arbitrary shape has been added.

  The RWMH video-coding algorithm (Cui, Wang, Fowler 2003) has been added.

  Several minor bugs have been fixed.

------------------------------------------------------------------------------

Version 0.46:

  The standard module QccPackVID has been added to the main distribution. The
  intention is that this module will contain some recent video-coding
  algorithms, focusing specifically on wavelet-based techniques. At this
  time, though, the RDWT-block algorithm (Park and Kim 2000) is the only
  method currently implemented.

------------------------------------------------------------------------------

Version 0.45:

  The 3D tarp coder (Wang, Rucker, Fowler 2003) for three-dimensional data
  has been added, and a few minor bugs have been fixed.

------------------------------------------------------------------------------

Version 0.44:

  A number of new routines and data structures have been added for handling
  compression of three-dimensional data. Specifically, a QccVolume data
  type generalizes QccMatrix to 3D, and QccIMGImageCube generalizes
  QccIMGImageComponent to 3D volumetric images. Additionally, 3D wavelet
  transforms for both dyadic and wavelet-packet decompositions have been
  added, as well as a QccWAVSubbandPyramid3D subband-pyramid structure.

------------------------------------------------------------------------------

Version 0.43:

  The BISK (Fowler 2003) image coder has been added, and a few minor bugs
  have been fixed.

------------------------------------------------------------------------------

Version 0.42:

  A substantial change has been made to the interface of all DWT routines
  (QccWAVWaveletLWT(), QccWAVWaveletInverseLWT(),
  QccWAVWaveletLWT2D(), QccWAVWaveletInverseLWT2D(),
  QccWAVWaveletDWTSubbandLength(), QccWAVWaveletDWT1D(),
  QccWAVWaveletInverseDWT1D(), QccWAVWaveletDWT2D(), and
  QccWAVWaveletInverseDWT2D()). These routines implement critically sampled
  DWTs which can be performed using either even- or odd-phase subsampling at
  each scale of decomposition. The usual method, and the approach previously
  taken in QccPack, is to assume even-phase subsampling for each decomposition.
  The interfaces for these routines have been augmented with a
  subsample_pattern parameter (or, in the case of 2D transforms,
  subsample_pattern_row and subsample_pattern_col parameters) that allow the
  selection of even- or odd-phase subsampling at each scale of decomposition;
  see QccWAVWaveletDWT1D(3) for how the subsampling-pattern value is specified.
  Using subsample_pattern = 0 specifies that even-phase subsampling is to be
  used for all decompositions, corresponding to the previous operation.
  Unfortunately, the addition of the subsample_pattern parameter to the
  interface to these routines breaks all existing code using these routines ---
  the fix is to add the appropriate subsample_pattern parameter with value 0 to
  existing calls to these routines. The advantages of the addition of this
  parameter is that now the critically sampled DWTs have enhanced
  interoperability with the overcomplete RDWT. Specifically, an RDWT can be
  decomposed via QccWAVWaveletRedundantDWT1DSubsample(3) into its constituent
  critically sampled DWTs which may then be independently inverted using
  QccWAVWaveletInverseDWT1D(3).

  In another change that is not backward-compatible,
  QccWAVSubbandPyramidSubbandResolution() has been renamed
  QccWAVSubbandPyramidSubbandSize(), which should more accurately reflect
  the true operation of the function, since resolution is somewhat of
  an ambiguous term when it comes to wavelet decompositions.

  Fixed-point arithmetic has replaced floating-point arithmetic in tarp.c,
  permitting much improved execution speed without any noticeable loss
  of rate-distortion performance.

  QccIMGImageRead() and QccIMGWrite() have been modified to attempt to
  automatically determine the input/output image filetype, including
  ICP-format images.

------------------------------------------------------------------------------

Version 0.41:

  The tarp-filter (Simard, Steinkraus, & Malvar, 2002) image coder
  has been added.

  QccENTArithmeticModel has been modified to support both adaptive as well
  as nonadaptive arithmetic coding, whereas, previously, only adaptive models
  were supported. With a nonadaptive coder, one can explicitly change the
  symbol probabilities with a call to the new
  QccENTArithmeticSetModelProbabilities(3) function. By default, a model is
  created as an adaptive model, so existing code will be unaffected by this
  change.

  In the wavelet-transform routines, the parameter start_odd has been  
  replaced by the more general parameter, signal_origin. This change has to 
  do with the phase of the the DWT. In a single-scale decomposition, there 
  are two phases, even and odd; these refer to the phase of the subsampling 
  with respect to the zero index of the signal. If the signal is assumed to 
  start at some other index (as is often the case when considering 
  shape-adaptive transforms), then the phase of the origin must be taken 
  into account to determine the proper subsampling pattern. For each 
  additional scale of decomposition increases the number of possible 
  subsampling patterns by a factor of two (i.e., even or odd at each scale). 
  The old parameter, start_odd, allowed one to select between only two of the 
  possible subsampling patterns. By specifying the origin of the signal, the 
  phase of the origin can be determined, permitting all possible subsampling 
  patterns to be achieved. In most cases, the origin is zero, and this is 
  backward compatible with the start_odd = 0 specification used before. 
  Consequently, most existing code should be unaffected by this change.

------------------------------------------------------------------------------

Version 0.40:

  Subsampling of redundant DWTs can now produce any one of the multitude
  of sets of coefficients that are equivalent to some critically sampled
  DWT. That is, a subsample_pattern parameter has been added to both
  QccWAVWaveletRedundantDWT1DSubsample() (1D subsampling) and
  QccWAVWaveletRedundantDWT2DSubsample() (2D subsampling). In both of
  these routines, subsample_pattern = 0 will reproduce the prior
  functionality of the routine.

  A number of bug fixes relevant to Cygwin support have been made.

  Adaptive Golomb coding, a simple entropy-coding technique, has been
  added.

  The Wavelet Difference Reduction (WDR) (Tian & Wells, 1998) image coder
  has been added.

------------------------------------------------------------------------------

Version 0.39:

  QccPack now officially supports installation on Microsoft Windows
  platforms through use of the Cygwin UNIX emulation environment. The README
  file now has detailed information pertaining to Cygwin-based installation.

------------------------------------------------------------------------------

Version 0.38:

  Minor bug fixes.

------------------------------------------------------------------------------

Version 0.37:

  Minor changes to Solaris build configuration (allows using gcc).

------------------------------------------------------------------------------

Version 0.36:

  Added hue, saturation, value (HSV) color conversion, an example
  Reed-Solomon encoding program, and a variety of bug fixes.

------------------------------------------------------------------------------

Version 0.35:

  Corrected several bugs, most notably in QccWAVWaveletInverseRedundantDWT2D().
  The previous version of this routine did not have a correct
  implementation. Additionally, several memory leaks and other various
  bugs have been corrected.

------------------------------------------------------------------------------

Version 0.34:

  1D and 2D redundant discrete wavelet transforms (RDWTs) have been added.
  The RDWT is an implementation of a overcomplete, or over-sampled, wavelet
  expansion, as opposed to the usual critically sampled DWT. Commonly
  implemented via the "algorithme a trous" as described by Dutilleux,
  we use the "alternative" implementation due to Shensa. Although it is
  unlikely that a RDWT could be useful directly in compression applications
  due to its oversampled representation, the RDWT is commonly used
  in feature detection and similar operations that could be useful
  in guiding compression tasks.

  Arguments start_odd_row and start_odd_col have been added to 
  QccWAVWaveletAnalysis2D(), QccWAVWaveletSynthesis2D(), QccWAVWaveletDWT2D(),
  QccWAVWaveletInverseDWT2D(), and similar fields have been added also to
  the QccWAVSubbandPyramid structure. These values generalize the start_odd
  values passed to QccWAVWaveletDWT1D() and like functions. In order to
  achieve functionality identical to that of previous versions of QccPack,
  simply set start_odd_row and start_odd_col to zero.

------------------------------------------------------------------------------

Version 0.33:

  Mostly minor bug fixes.

------------------------------------------------------------------------------

Version 0.32:

  Mostly minor bug fixes.

------------------------------------------------------------------------------

Version 0.31:

  QccPack now optionally supports use in multithreaded applications.
  Currently, QccPack does not make use of threads internally; however,
  if thread support is enabled when compiling the library, an
  application program can invoke QccPack functions within multiple
  threads simultaneously. In order to use QccPack in a multithreaded
  application, it is necessary to compile QccPack with thread support
  enabled and link against the pthreads library. If the multithreaded
  capability is not desired, then there is no dependence on pthreads.

------------------------------------------------------------------------------

Version 0.30:

  Mostly minor bug fixes.

------------------------------------------------------------------------------

Version 0.29:

  Man-page documentation has been completed for the arithmetic-coding
  routines in QccPackENT. Additionally, several QccPack.config files
  tailored specifically to various operating systems have been added.
  Hopefully, these system-specific configuration files will facilitate
  the building of QccPack on the more popular operating systems by
  setting up various compiler settings in a most likely correct
  manner. This should enable building with shared libraries on these
  systems, the most common difficulty faced by many users.

------------------------------------------------------------------------------

Version 0.28:

  A shape-adaptive DWT (SA-DWT) has been added. In short, SA-DWT capability
  permits the transformation of arbitrarily shaped regions in images.
  In QccPack, these regions are indicated by a transparency mask; SA-DWT
  transforms only non-transparent regions in the image, applying
  appropriate extension at the boundaries of the regions. In related
  changes, the lifting code for the CohenDaubechiesFeauveau.9-7.lft
  wavelet has been modified to allow starting on odd-indexed samples and
  odd-length sequences. Additionally, the filter-bank implementation code
  was similarly modified. The net result is that the
  CohenDaubechiesFeauveau.9-7.lft wavelet, as well as any biorthogonal
  filter-bank wavelet, can be used in the SA-DWT (in previous versions,
  only the CohenDaubechiesFeauveau.5-3.lft would have worked). A final
  implication of the addition of the SA-DWT is that, for any
  biorthogonal wavelet, the size of the image is no longer required
  to be an integer multiple of a power of two, even for the usual
  (i.e., rectangularly shaped) dyadic DWT. We note that SA-DWTs have been
  recently included in Version 2 of the MPEG-4 standard, wherein they are
  used for texture coding of arbitrarily shaped still objects. The SA-DWT
  implementation differs slightly from that of the MPEG-4 standard;
  see QccWAVWaveletShapeAdaptiveDWT1D(3) for details.

------------------------------------------------------------------------------

Version 0.27:

  When inputting and outputting binary data using the QccBitBuffer
  structure, the order of the bits stored for a byte of data has
  been reversed. That is, QccBitBufferPutChar() and QccBitBufferGetChar()
  now output/input bits in the same order as would be done if one
  were to write/read whole byte-aligned characters via fputc() or fgetc().
  In this sense, if a QccBitBuffer structure is used to output
  byte-aligned data bit-by-bit, you'd get the same thing as if you
  output the data byte-by-byte using fputc(). The unfortunate consequence
  of this change is that bitstreams are not backward compatible. That is,
  bitstreams generated via Version 0.27 of QccPack will not be readable
  by earlier versions, *nor* will bitstreams generated by earlier versions
  be readable by QccPack Version 0.27. This will affect mainly code
  using arithmetic coding or Huffman coding, such as srencode, sfqencode,
  and the routines of the QccPackSPIHT module. We are sorry for any
  inconvenience resulting from this change, but it appeared to be in the
  best long-term interest of the QccPack project to make the
  QccBitBuffer bit ordering more sane.

------------------------------------------------------------------------------

Version 0.26:

  With this release, Huffman coding makes its debut in QccPack.  Huffman
  coding routines, complete with encoding, decoding, and Huffman code table
  design have been added, based upon the implementations suggested in
  the Annexes of the JPEG standard.

------------------------------------------------------------------------------

Version 0.25:

  The interfaces to QccENTArithmeticEncodeStart() and
  QccENTArithmeticDecodeStart() have been changed.  Now, one can specify a
  target number of bits to be output/input by the arithmetic coder/decoder.
  That is, QccENTArithmeticEncode() will now return a value of 2 when the
  number of bits output meets (or exceeds) the value of target_num_bits
  set when QccENTArithmeticEncodeStart() was first called. To disable this
  check, pass QCCENT_ANYNUMBITS as target_num_bits to
  QccENTArithmeticEncodeStart().  A similar effect is available for decoding,
  with QccENTArithmeticDecode() returning an error code if the end of
  the file is reached, or the number of bits read meets (or exceeds)
  the value of target_num_bits set during the call to
  QccENTArithmeticDecodeStart().  These changes necessitate a small change
  to existing code -- add a value for target_num_bits to all calls to
  QccENTArithmeticEncodeStart() and QccENTArithmeticDecodeStart(), using the
  value QCCENT_ANYNUMBITS to preserve previous functionality.
  
  A related change adds QccENTArithmeticEncodeFlush(), which forces the
  arithmetic coder to flush its state and output subsequent bits on the
  next byte boundary, and QccENTArithmeticDecodeRestart(), which forces
  the arithmetic decoder restart its state and read the next bits from
  the next byte boundary.  Using these functions, multiple independent
  arithmetic codings can be written to and read from the same bitstream;
  i.e., using just one QccBitBufferStart() and QccBitBufferEnd() pair.
  More detailed documentation of this behavior will be available once
  man pages for the libQccPackENT section of the code get written
  (hopefully soon!).

------------------------------------------------------------------------------

Version 0.24:

  Documentation has been added for the QccWAVZerotree data structure and the
  ZT file format.

------------------------------------------------------------------------------

Version 0.23:

  Minor build changes which should be transparent to users and developers.

------------------------------------------------------------------------------

Version 0.22:

  Minor build changes which should be transparent to users and developers.

------------------------------------------------------------------------------

Version 0.21:

  The only change made in this version is that the SPIHT code has been
  removed from the "main" QccPack distribution and placed in a separate,
  optional module that must be downloaded separately.  This change arose 
  from concerns that QccPack was not "purely" GPL/LGPL, in its entirety,
  due to the special non-GPL licensing accompanying the SPIHT code.
  With SPIHT now in the QccPackSPIHT module, the main QccPack distribution
  is now completely GPL/LGPL with the module being covered by the special
  SPIHT license as before.  We hope that the downloading a separate
  module-distribution file and the corresponding minor additional
  configuration step needed to build QccPack with SPIHT support will not
  unduly burden users of the QccPack SPIHT implementation.  We hope
  that other algorithms which may similarly require non-GPL licensing, or
  otherwise best be kept separated from the main QccPack distribution, may
  be accommodated as additional modules in the future.

------------------------------------------------------------------------------

Version 0.20:

  The first argument to QccInit() has been changed from a pointer-to-int to
  int.  That is, the prototype of QccInit is now
      void QccInit(int argc, char *argv[]);
  This reflects the current situation that argc is not changed by QccInit()
  (in the past argc could have been changed during a call to an initialization
  routine of the NetPBM libraries.  However, QccPack does not currently use
  NetPBM, so argc will not be changed).

------------------------------------------------------------------------------

Version 0.19:

  Small changes to the QccPack code have been made so that compilation with
  'gcc -Wall' produces no warning messages.  These changes have been, in the
  most part, very minor.  The only exception is that the function QccExit()
  has now been made into a macro (this is so that gcc would see an explicit
  'exit' from the main() routine and not complain about its absence).  Thus,
  in non-QccPack programs invoking QccExit, a change from "QccExit();" to
  "QccExit;" will be most likely be necessary.  Note that the -Wall switch
  has now been added to the CFLAGS declaration in QccPack.config and we
  recommend using this declaration to build QccPack.

  The behavior of several "copy" routines has been changed, namely,
  QccIMGImageComponentCopy(), QccFilterCopy(),
  QccDatasetCopy(), and QccWAVVectorFilterCopy().  This routines will now
  automatically allocate space if the data structure has a NULL pointer
  for its data array.  If non-NULL, the space of sufficient size is assumed
  to be allocated prior to calling the routine (this was the previous
  behavior).

------------------------------------------------------------------------------

Version 0.18:

  Fixes a couple of bugs; no new features added
  
------------------------------------------------------------------------------

Version 0.17:

  The first "official" release of the SPIHT algorithm for wavelet-based image
  coding has been added.  The SPIHT algorithm has been made available by
  the gracious permission of PrimaComp, Inc., the exclusive holders of patent
  rights to the SPIHT algorithm.  The SPIHT implementation here is licensed
  only for academic or non-commercial research activities and thus covered
  under licensing terms different from the rest of QccPack, which is
  covered under GPL/LGPL.  See the file LICENSE-SPIHT for details on the
  SPIHT license.

------------------------------------------------------------------------------

Version 0.16:

  A preliminary implementation of the SPIHT algorithm for wavelet-based image
  coding has been added.  Documentation to follow in a subsequent release.

------------------------------------------------------------------------------

Version 0.15:

  Fixes a couple of bugs; no new features added

------------------------------------------------------------------------------

Version 0.14:

  QccVQVectorQuantization() and QccVQEntropyConstrained() now have a
  distortion_measure function as an optional argument to allow users to use
  distortion measures other than squared error (which is now the default for
  these routines).  Of course, VQ training via the Lloyd algorithm must make
  use of an appropriate "centroid" calculation routine (the centroid being
  theoretically valid only for the squared-error distortion measure).
  QccVQGeneralizedLloydTraining() now has an optional centroid_calculation
  function argument for such user-defined centroid calculations.
  
  Multistage VQ (MSVQ, also known as residual VQ or RVQ) has been added,
  along with an associated QccVQMultiStageCodebook data type.
  
  Some changes have been made to the lifting wavelet code. The biorthogonal
  CohenDaubechiesFeauveau.5-3.lft lifting scheme (i.e., linear lifting), and
  its associated filter-bank implementation, have been added.
  In addition, DWT via lifting adds support for odd-length sequences and
  sequences that start with an odd, rather than even, sample.  Currently,
  this odd-length and/or odd-start operation is supported only for the
  CohenDaubechiesFeauveau.5-3.lft lifting scheme, but may be extended to
  other lifting wavelets in the future.

------------------------------------------------------------------------------

Version 0.13:

  QccPack no longer relies on NetPBM libraries to read/write PBM/PGM/PPM
  files.  Since compiling the NetPBM package was often a pain (at best),
  removing dependence on these libraries makes installing QccPack much easier
  on systems that don't already have NetPBM installed.  PBM/PGM/PPM 
  reading/writing routines are now built-in to QccPack.

  QccInit() is now to be called as the *first* command in main() of all
  programs that use the QccPack library routines.  This is different from
  past versions of QccPack in which QccInit() was called after
  QccParseParameters().

------------------------------------------------------------------------------

Version 0.12:

  The libQccPackWAV library routines and utilities, at long last, have been
  completely overhauled.  Before, only filter-bank implementations of
  biorthogonal wavelets were allowed.  With this latest release,
  orthonormal wavelets are now permitted.  In addition, lifting
  implementations (which are quite a bit faster than their filter-bank
  counterparts) have been hardcoded into the library for a couple of the
  more popular wavelets.  The FIL file format no longer exists, having
  been replaced by the FBK format.  Unfortunately, very little of the
  update code retains backward compatibility with previous versions -- alas,
  such is the price of progress.

==============================================================================