📄 changes_from_vm7_2.txt
字号:
CHANGES IN VM8.0 FROM VM7.2
============================
Changes to Bring Alignment with Part I FCD
------------------------------------------
* COD and COC marker segment parameters were reordered to harmonize the two
marker segments
* Component transform is now signaled with one value, either on or off.
The choice of ICT or RCT is signaled by the choice of 9-7 or 5-3 filters.
* The QCD and QCC exponent bits have been shifted to the MSBs for the 5-3
transform filter to be consistent with the 9-7 transform filter.
Image I/O
---------
Another implementation of multi-component I/O routines is now available.
These new I/O routines are triggered with the `-imcraw'/`-omcraw'
encoder/decoder options. This new implementation expects multi-components
in raw image format and supports a variety of component interleave styles.
This change was made to merely facilitate testing (and to avoid having to
split a 224 band image into 224 files...). Changes for this new I/O
implementation are marked with the C comments /* EKC mct begin */ and
/* EKC mct end */.
Note: This implementation is available only when compiled under Unix
systems.
Multi-Component Additions
-------------------------
* A stand-alone program is provided in the ekc_contrib/calc_klt directory to
generate the Karhunen-Loeve Transform (KLT) matrix of a set of PGX files
or a multi-component raw image file suitable for `-imcraw' encoder input.
The format of the output transform matrix is compatible with the encoder
command-line flag `-Mlin'.
* Likewise, a stand-alone program is provided in the ekc_contrib/calc_dct
directory to generate the Discrete Cosine Transform (DCT) matrix for an
arbitrary number of components. The format of the output transform matrix
is compatible with the command-line flag `-Mlin'.
* The component_mix.c and component_demix.c `-Mlin' routines were modified
to allow passage of arbitrarily large inverse linear matrices. These
routines were changed so that a large CME segment (i.e., greater than
maximum allowed, which is 65535 bytes) will be split into smaller CME
segments. The decompressor uses the `index' functionality to get the
multiple CME segments relevant to multi-component transforms.
General Level Shift
-------------------
The VM now allows for flexible level shifts in addition to the fixed level
shifts available for Part I. Up to a 16-bit integer offset may be specified
with the `-Fdc' encoder option. See the usage for this new option for more
details and also document WG1N1721. Note that the default offset is still
equal to that used by a Part I decoder.
General Scalar Quantization
---------------------------
The zero quantization bin-width can now be adjusted with the `-Qnz' encoder
option. This bin-width can be sized to 2*(1-nz)*stepsize, where nz is
provided through `-Qnz' and is passed to the decoder through the header.
Note that the default behavior is still that of Part I, i.e, nz = 0.
General Wavelet Decompositions
------------------------------
VM8.0 now allows non-uniformly sized subbands within a given resolution
level and also allows subbands to be split in just one direction
(horizontally or vertically). The changes required for this extra
functionality were rather vast, yet mostly confined to one of the following
general set of changes:
1. References to level->hp_descent were replaced with
level->max_hp_descent.
2. References to band->vert_hp_descent and band->horiz_hp_descent were
added where necessary.
3. Since not all subband indices in the range [level->min_band,
level->max_band] are now allowed, the field band->valid_band is used
inside "for" loops over bands to quickly "continue" when the current
band index points to an invalid band.
4. The transform objects were modified to decouple joint vertical and
horizontal wavelet processing. As a result, subbands may be formed
with a non-equal number of horizontal and vertical splits. To achieve
this capability, horizontal and vertical limit fields were added to the
hplx_analysis_stage_obj and hplx_synthesis_stage_obj structures. These
limits specify the number of splits in both directions for the eight
analysis and synthesis files which are part of the transform object.
Note that changes outside of this general set are flagged with "SAIC
General Decomp." comments
Signaling of the desired decomposition to the encoder is accomplished with
the new `-Fgen_decomp' command line argument. This argument accepts a
string of integers in the range 0 to 3. Sub-strings for individual
resolution levels are concatenated to form this string, with the first
sub-string addressing the highest resolution level and successive
sub-strings addressing progressively lower resolution levels. The last
resolution level sub-string defined controls any remaining levels.
Each level sub-string is a string of integers from 0 to 3. Value 0
indicates that the current subband should not be decomposed further. Value
1 indicates that the current subband should be split both horizontally and
vertically. Finally, values 2 and 3 respectively indicate that the current
subband should be split in just the horizontal direction (resulting in left
and right subbands) or just the vertical direction (resulting in top and
bottom subbands). Note that the maximum depth through the resulting tree
structure is controlled by the max_hp_descent values passed through the
existing '-Fdecomp' argument. Therefore, zeros are not needed when the
depth in the decomposition tree equals max_hp_descent. Figure 2 shows
several examples of the `-Fgen_decomp' and '-Fdecomp'. In that figure,
different resolution levels are shown with different colors (green, blue,
red), and the `-Fgen_decomp' usage matches colors of characters with
resolution levels.
Beyond the changes listed above, the syntax for signaling the general
wavelet decomposition obviously has to be transmitted through the bitstream.
The bitstream syntax for these general decomposition changes piggy-backs
upon the MARKER_COC_DECOMP syntax established for signaling
max_hp_descents at each wavelet level. That existing syntax outputs a list
of integers with values equal to 1, 2 or 3. Values of zero are currently
not allowed in that list. The syntax for general decompositions adds a
zero to the max_hp_descent MARKER_COC_DECOMP output to signal that a
general decomposition is used. The list as input to the encoder with the
`-Fgen_decomp' argument is then explicitly passed through the bitstream
using the two-bit form of MARKER_COC_DECOMP.
Finally, the `-Xwt_output' option exists in both the encoder and decoder
to allow visualization of the resulting wavelet transform. Note that
this option may be quite useful for debugging `-Fgen_decomp' arguments.
`-Fweights'/`-Fsteps'
---------------------
These options can now allow subbands to have frequency weights/step sizes of
zero. Inclusion of bits from such subbands will be avoided by using the
"quant_to_zero" logic integrated into VM7.2 for LRA.
POC/POD Changes
---------------
The definition of the POD marker has been changed and its name
changed to POC. The marker now contains a string of progression
changes where the volumes corresponding to the progressions are
explicitly identified, rather than the old method in which the
volumes represented limits on previous progressions and the new
progression applied until further limits were applied. The POC
marker may also appear in any tile-part header, so long as it
also appears in the first tile-part header of the relevant tile.
The decompressor has been modified to accept codestreams with any
valid POC placement and interpret the relevant progressions as
late as possible (this is part of the general philosophy of loading
as little of the codestream as is needed at any given point).
The compressor has been modified to produce the new POC format.
Further, since it is not possible to fully test the POC functionality
without explicitly generating tile-parts, the compressor has been
modified to include the functionality for generating tile-parts and
also for writing POC markers into tile-part headers. The `-Corder'
argument has exactly the same form as before and its parameters have
the same interpretation as they had before so that it is impossible
to supply a `-Corder' argument whose contents could cause the
generation of a non-compliant codestream. However, the program
internally converts to the more fragile POC marker form. By
default, all the POC information appears in a single marker up
front (either in the main header or a tile-part header, whichever
is calculated to be most efficient). There is a new argument,
`-Ctile_parts', which forces the compressor to create a single
tile-part for each new progression (this is not the only way to
use tile-part specific POC markers, but it makes the most sense).
Note carefully, that the argument affects only those tiles for
which a tile-specific `-Corder' argument has been supplied, having
at least two different progressions. Otherwise, the progression
information is placed in the main or first tile-part header.
To explore the functionality, try the following examples:
vm8_compress -i lenna.pgm -o out.bits -rate 1.0 -Clayers 0.125 0.25 \
-Cpp 64x64 32x32 16x16 -Corder L
vm8_expand -i out.bits -o out.pgm -trunc 0.125 [should be uniformly coarse]
vm8_expand -i out.bits -o out.pgm -trunc 0.25 [should be uniformly better]
vm8_compress -i lenna.pgm -o out.bits -rate 1.0 -Clayers 0.125 0.25 \
-Cpp 64x64 32x32 16x16 -Corder L 0 0 1 6 1 PC
vm8_expand -i out.bits -o out.pgm -trunc 0.125 [should be uniformly coarse]
vm8_expand -i out.bits -o out.pgm -trunc 0.25 [should get the first quarter
of the picture looking good]
vm8_compress -i lenna.pgm -o out.bits -rate 1.0 -Clayers 0.125 0.25 \
-Cpp 64x64 32x32 16x16 -Corder+0 L 0 0 1 6 1 PC
[Same as above, but with two tile-parts per tile, having the first layer
in the first tile-part and the second and third layers in the second.
Add the -Bresync argument and use "j2g_fiddle" to verify that there
are two tile-parts. Note, however, that "j2g_fiddle" cannot currently
be used to do any serious fiddling with codestreams which already have
multiple tile-parts.]
Bug Fixes
---------
* Non-heap memory for specifying "W9X7" or "W5X3" options for the `-Mtdt'
wavelet transform has been converted to heap memory. As a result,
side-effect bugs due to attempts to free non-heap memory are now avoided.
* Longer filename strings are now allocated for the create_filename()
routine in simple_image_writer.c to avoid array bounds problems for large
number of components.
* Syntax changes have been incorporated to allow compression of images with
more than 256 components.
* The accuracy of the 9-7 filter taps has been improved beyond the 5-th
decimal place.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -