ChangeLog.md: Document TurboJPEG 3 API overhaul
This commit is contained in:
138
ChangeLog.md
138
ChangeLog.md
@@ -11,19 +11,102 @@ tables.
|
|||||||
2. All deprecated fields, constructors, and methods in the TurboJPEG Java API
|
2. All deprecated fields, constructors, and methods in the TurboJPEG Java API
|
||||||
have been removed.
|
have been removed.
|
||||||
|
|
||||||
3. Added support for 8-bit, 12-bit, and 16-bit lossless JPEG images. A new
|
3. Arithmetic entropy coding is now supported with 12-bit-per-component JPEG
|
||||||
libjpeg API function (`jpeg_enable_lossless()`), TurboJPEG API flag
|
images.
|
||||||
(`TJFLAG_LOSSLESS` in the C API and `TJ.FLAG_LOSSLESS` in the Java API), and
|
|
||||||
cjpeg/TJBench command-line argument (`-lossless`) can be used to create a
|
4. Overhauled the TurboJPEG API to address long-standing limitations and to
|
||||||
lossless JPEG image. (Decompression of lossless JPEG images is handled
|
make the API more extensible and intuitive:
|
||||||
automatically.) Note that the TurboJPEG API and TJBench can currently only be
|
|
||||||
used to create and decompress 8-bit lossless JPEG images. Refer to
|
- All C function names are now prefixed with `tj3`, and all version
|
||||||
|
suffixes have been removed from the function names. Future API overhauls will
|
||||||
|
increment the prefix to `tj4`, etc., thus retaining backward API/ABI
|
||||||
|
compatibility without versioning each individual function.
|
||||||
|
- Stateless boolean flags have been replaced with stateful integer API
|
||||||
|
parameters, the values of which persist between function calls. New
|
||||||
|
functions/methods (`tj3Set()`/`TJCompressor.set()`/`TJDecompressor.set()` and
|
||||||
|
`tj3Get()`/`TJCompressor.get()`/`TJDecompressor.get()`) can be used to set and
|
||||||
|
query the value of a particular API parameter.
|
||||||
|
- The JPEG quality and subsampling are now implemented using API
|
||||||
|
parameters rather than stateless function arguments (C) or dedicated set/get
|
||||||
|
methods (Java.)
|
||||||
|
- `tj3DecompressHeader()` now stores all relevant information about the
|
||||||
|
JPEG image, including the width, height, subsampling type, entropy coding
|
||||||
|
algorithm, etc., in API parameters rather than returning that information
|
||||||
|
through pointer arguments.
|
||||||
|
- `TJFLAG_LIMITSCANS`/`TJ.FLAG_LIMITSCANS` has been reimplemented as an
|
||||||
|
API parameter (`TJPARAM_SCANLIMIT`/`TJ.PARAM_SCANLIMIT`) that allows the number
|
||||||
|
of scans to be specified.
|
||||||
|
- Optimized baseline entropy coding (the computation of optimal Huffman
|
||||||
|
tables, as opposed to using the default Huffman tables) can now be specified,
|
||||||
|
using a new API parameter (`TJPARAM_OPTIMIZE`/`TJ.PARAM_OPTIMIZE`), a new
|
||||||
|
transform option (`TJXOPT_OPTIMIZE`/`TJTransform.OPT_OPTIMIZE`), and a new
|
||||||
|
TJBench option (`-optimize`.)
|
||||||
|
- Arithmetic entropy coding can now be specified or queried, using a new
|
||||||
|
API parameter (`TJPARAM_ARITHMETIC`/`TJ.PARAM_ARITHMETIC`), a new transform
|
||||||
|
option (`TJXOPT_ARITHMETIC`/`TJTransform.OPT_ARITHMETIC`), and a new TJBench
|
||||||
|
option (`-arithmetic`.)
|
||||||
|
- The restart marker interval can now be specified, using new API
|
||||||
|
parameters (`TJPARAM_RESTARTROWS`/`TJ.PARAM_RESTARTROWS` and
|
||||||
|
`TJPARAM_RESTARTBLOCKS`/`TJ.PARAM_RESTARTBLOCKS`) and a new TJBench option
|
||||||
|
(`-restart`.)
|
||||||
|
- Pixel density can now be specified or queried, using new API parameters
|
||||||
|
(`TJPARAM_XDENSITY`/`TJ.PARAM_XDENSITY`,
|
||||||
|
`TJPARAM_YDENSITY`/`TJ.PARAM_YDENSITY`, and
|
||||||
|
`TJPARAM_DENSITYUNITS`/`TJ.PARAM_DENSITYUNITS`.)
|
||||||
|
- The accurate DCT/IDCT algorithms are now the default for both
|
||||||
|
compression and decompression, since the "fast" algorithms are considered to be
|
||||||
|
a legacy feature. (The "fast" algorithms do not pass the ISO compliance tests,
|
||||||
|
and those algorithms are not any faster than the accurate algorithms on modern
|
||||||
|
x86 CPUs.)
|
||||||
|
- All C initialization functions have been combined into a single function
|
||||||
|
(`tj3Init()`) that accepts an integer argument specifying the subsystems to
|
||||||
|
initialize.
|
||||||
|
- All C functions now use the `const` keyword for pointer arguments that
|
||||||
|
point to unmodified buffers (and for both dimensions of pointer arguments that
|
||||||
|
point to sets of unmodified buffers.)
|
||||||
|
- All C functions now use `size_t` rather than `unsigned long` to
|
||||||
|
represent buffer sizes, for compatibility with `malloc()` and to avoid
|
||||||
|
disparities in the size of `unsigned long` between LP64 (Un*x) and LLP64
|
||||||
|
(Windows) operating systems.
|
||||||
|
- All C buffer size functions now return 0 if an error occurs, rather than
|
||||||
|
trying to awkwardly return -1 in an unsigned data type (which could easily be
|
||||||
|
misinterpreted as a very large value.)
|
||||||
|
- Decompression scaling is now enabled explicitly, using a new
|
||||||
|
function/method (`tj3SetScalingFactor()`/`TJDecompressor.setScalingFactor()`),
|
||||||
|
rather than implicitly using awkward "desired width"/"desired height"
|
||||||
|
arguments.
|
||||||
|
- Partial image decompression has been implemented, using a new
|
||||||
|
function/method (`tj3SetCroppingRegion()`/`TJDecompressor.setCroppingRegion()`)
|
||||||
|
and a new TJBench option (`-crop`.)
|
||||||
|
- The JPEG colorspace can now be specified explicitly when compressing,
|
||||||
|
using a new API parameter (`TJPARAM_COLORSPACE`/`TJ.PARAM_COLORSPACE`.) This
|
||||||
|
allows JPEG images with the RGB and CMYK colorspaces to be created.
|
||||||
|
- TJBench no longer generates error/difference images, since identical
|
||||||
|
functionality is already available in ImageMagick.
|
||||||
|
- JPEG images with unknown subsampling configurations can now be
|
||||||
|
fully decompressed into packed-pixel images or losslessly transformed (with the
|
||||||
|
exception of lossless cropping.) They cannot currently be partially
|
||||||
|
decompressed or decompressed into planar YUV images.
|
||||||
|
- `tj3Destroy()` now silently accepts a NULL handle.
|
||||||
|
- `tj3Alloc()` and `tj3Free()` now return/accept void pointers, as
|
||||||
|
`malloc()` and `free()` do.
|
||||||
|
- The C image I/O functions now accept a TurboJPEG instance handle, which
|
||||||
|
is used to transmit/receive API parameter values and to receive error
|
||||||
|
information.
|
||||||
|
|
||||||
|
5. Added support for 8-bit-per-component, 12-bit-per-component, and
|
||||||
|
16-bit-per-component lossless JPEG images. A new libjpeg API function
|
||||||
|
(`jpeg_enable_lossless()`), TurboJPEG API parameters
|
||||||
|
(`TJPARAM_LOSSLESS`/`TJ.PARAM_LOSSLESS`,
|
||||||
|
`TJPARAM_LOSSLESSPSV`/`TJ.PARAM_LOSSLESSPSV`, and
|
||||||
|
`TJPARAM_LOSSLESSPT`/`TJ.PARAM_LOSSLESSPT`), and a cjpeg/TJBench option
|
||||||
|
(`-lossless`) can be used to create a lossless JPEG image. (Decompression of
|
||||||
|
lossless JPEG images is handled automatically.) Refer to
|
||||||
[libjpeg.txt](libjpeg.txt), [usage.txt](usage.txt), and the TurboJPEG API
|
[libjpeg.txt](libjpeg.txt), [usage.txt](usage.txt), and the TurboJPEG API
|
||||||
documentation for more details.
|
documentation for more details.
|
||||||
|
|
||||||
4. 12-bit-per-component (lossy and lossless) and 16-bit-per-component
|
6. Added support for 12-bit-per-component (lossy and lossless) and
|
||||||
(lossless) JPEG support is now included in the libjpeg API library, cjpeg,
|
16-bit-per-component (lossless) JPEG images to the libjpeg and TurboJPEG APIs:
|
||||||
djpeg, and jpegtran:
|
|
||||||
|
|
||||||
- The existing `data_precision` field in `jpeg_compress_struct` and
|
- The existing `data_precision` field in `jpeg_compress_struct` and
|
||||||
`jpeg_decompress_struct` has been repurposed to enable the creation of
|
`jpeg_decompress_struct` has been repurposed to enable the creation of
|
||||||
@@ -35,27 +118,20 @@ decompressed.
|
|||||||
12-bit-per-component versions of `jpeg_write_raw_data()`,
|
12-bit-per-component versions of `jpeg_write_raw_data()`,
|
||||||
`jpeg_skip_scanlines()`, `jpeg_crop_scanline()`, and `jpeg_read_raw_data()`,
|
`jpeg_skip_scanlines()`, `jpeg_crop_scanline()`, and `jpeg_read_raw_data()`,
|
||||||
provide interfaces for compressing from/decompressing to 12-bit-per-component
|
provide interfaces for compressing from/decompressing to 12-bit-per-component
|
||||||
and 16-bit-per-component uncompressed image buffers.
|
and 16-bit-per-component packed-pixel and planar YUV image buffers.
|
||||||
- A new cjpeg command-line argument (`-precision`) can be used to create
|
- New 12-bit-per-component and 16-bit-per-component compression,
|
||||||
a 12-bit-per-component or 16-bit-per-component JPEG image. (djpeg and jpegtran
|
decompression, and image I/O functions/methods have been added to the TurboJPEG
|
||||||
handle 12-bit-per-component and 16-bit-per-component JPEG images
|
API, and a new API parameter (`TJPARAM_PRECISION`/`TJ.PARAM_PRECISION`) can be
|
||||||
automatically.)
|
used to query the data precision of a JPEG image. (YUV functions are currently
|
||||||
|
limited to 8-bit data precision but can be expanded to accommodate 12-bit data
|
||||||
|
precision in the future, if such is deemed beneficial.)
|
||||||
|
- A new cjpeg and TJBench command-line argument (`-precision`) can be used
|
||||||
|
to create a 12-bit-per-component or 16-bit-per-component JPEG image.
|
||||||
|
(Decompression and transformation of 12-bit-per-component and
|
||||||
|
16-bit-per-component JPEG images is handled automatically.)
|
||||||
|
|
||||||
Refer to [libjpeg.txt](libjpeg.txt) and [usage.txt](usage.txt) for more
|
Refer to [libjpeg.txt](libjpeg.txt), [usage.txt](usage.txt), and the
|
||||||
details.
|
TurboJPEG API documentation for more details.
|
||||||
|
|
||||||
5. Introduced a new flag in the TurboJPEG C and Java APIs (`TJFLAG_ARITHMETIC`
|
|
||||||
and `TJ.FLAG_ARITHMETIC`, respectively) that causes the library to use
|
|
||||||
arithmetic entropy coding in JPEG images generated by compression and transform
|
|
||||||
operations. Additionally, a new transform option (`TJXOPT_ARITHMETIC` in the C
|
|
||||||
API and `TJTransform.OPT_ARITHMETIC` in the Java API) has been introduced,
|
|
||||||
allowing arithmetic entropy coding to be enabled for selected transforms in a
|
|
||||||
multi-transform operation.
|
|
||||||
|
|
||||||
6. Added a new TurboJPEG C API function (`tjDecompressHeader4()`) and Java API
|
|
||||||
method (`TJDecompressor.getFlags()`) that allow calling programs to determine
|
|
||||||
whether the JPEG image being decompressed uses progressive and/or arithmetic
|
|
||||||
entropy coding or is a lossless JPEG image.
|
|
||||||
|
|
||||||
|
|
||||||
2.1.5
|
2.1.5
|
||||||
@@ -1479,7 +1555,7 @@ features (such as the colorspace extensions), but in general, it performs no
|
|||||||
faster than libjpeg v6b.
|
faster than libjpeg v6b.
|
||||||
|
|
||||||
14. Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
|
14. Added ARM 64-bit SIMD acceleration for the YCC-to-RGB color conversion
|
||||||
and IDCT algorithms (both are used during JPEG decompression.) For unknown
|
and IDCT algorithms (both are used during JPEG decompression.) For
|
||||||
reasons (probably related to clang), this code cannot currently be compiled for
|
reasons (probably related to clang), this code cannot currently be compiled for
|
||||||
iOS.
|
iOS.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user