jj2000.j2k.quantization.quantizer
Class StdQuantizer

java.lang.Object
  |
  +--jj2000.j2k.image.ImgDataAdapter
        |
        +--jj2000.j2k.quantization.quantizer.Quantizer
              |
              +--jj2000.j2k.quantization.quantizer.StdQuantizer
All Implemented Interfaces:
CBlkQuantDataSrcEnc, ForwWTDataProps, ImgData

public class StdQuantizer
extends Quantizer

This class implements scalar quantization of integer or floating-point valued source data. The source data is the wavelet transformed image data and the output is the quantized wavelet coefficients represented in sign-magnitude (see below).

Sign magnitude representation is used (instead of two's complement) for the output data. The most significant bit is used for the sign (0 if positive, 1 if negative). Then the magnitude of the quantized coefficient is stored in the next M most significat bits. The rest of the bits (least significant bits) can contain a fractional value of the quantized coefficient. This fractional value is not to be coded by the entropy coder. However, it can be used to compute rate-distortion measures with greater precision.

The value of M is determined for each subband as the sum of the number of guard bits G and the nominal range of quantized wavelet coefficients in the corresponding subband (Rq), minus 1:

M = G + Rq -1

The value of G should be the same for all subbands. The value of Rq depends on the quantization step size, the nominal range of the component before the wavelet transform and the analysis gain of the subband (see Subband).

The blocks of data that are requested should not cross subband boundaries.

See Also:
Subband, Quantizer

Field Summary
private  GuardBitsSpec gbs
          The guard bits specifications
private  CBlkWTDataFloat infblk
          The 'CBlkWTDataFloat' object used to request data, used when quantizing floating-point data.
private static double log2
          Natural log of 2, used as a convenience variable
private  QuantStepSizeSpec qsss
          The quantization step size specifications
static int QSTEP_EXPONENT_BITS
          The number of exponent bits for the quantization steps
static int QSTEP_MANTISSA_BITS
          The number of mantissa bits for the quantization steps
static int QSTEP_MAX_EXPONENT
          The maximum value of the exponent for the quantization steps
static int QSTEP_MAX_MANTISSA
          The maximum value of the mantissa for the quantization steps
private  QuantTypeSpec qts
          The quantization type specifications
 
Fields inherited from class jj2000.j2k.quantization.quantizer.Quantizer
OPT_PREFIX, src
 
Fields inherited from class jj2000.j2k.image.ImgDataAdapter
imgdatasrc, tIdx
 
Constructor Summary
StdQuantizer(CBlkWTDataSrc src, EncoderSpecs encSpec)
          Initializes the source of wavelet transform coefficients.
 
Method Summary
protected  void calcSbParams(SubbandAn sb, int c)
          Calculates the parameters of the SubbandAn objects that depend on the Quantizer.
private static float convertFromExpMantissa(int ems)
          Converts the exponent-mantissa representation to its floating-point value.
static int convertToExpMantissa(float step)
          Converts the floating point value to its exponent-mantissa representation.
 int getMaxMagBits(int c)
          Returns the maximum number of magnitude bits in any subband of the current tile.
private  int getMaxMagBitsDerived(Subband sb, int t, int c)
          Returns the maximum number of magnitude bits in any subband in the given tile-component if derived quantization is used
private  int getMaxMagBitsExpounded(Subband sb, int t, int c)
          Returns the maximum number of magnitude bits in any subband in the given tile-component if expounded quantization is used
private  int getMaxMagBitsRev(Subband sb, int c)
          Returns the maximum number of magnitude bits in any subband of the current tile if reversible quantization is used
 CBlkWTData getNextCodeBlock(int c, CBlkWTData cblk)
          Returns the next code-block in the current tile for the specified component, as a copy (see below).
 CBlkWTData getNextInternCodeBlock(int c, CBlkWTData cblk)
          Returns the next code-block in the current tile for the specified component.
 int getNumGuardBits(int t, int c)
          Returns the number of guard bits used by this quantizer in the given tile-component.
 QuantTypeSpec getQuantTypeSpec()
          Returns the quantization type spec object associated to the quantizer.
 boolean isDerived(int t, int c)
          Returns true if given tile-component uses derived quantization step sizes.
 boolean isReversible(int t, int c)
          Returns true if the quantized data is reversible, for the specified tile-component.
 
Methods inherited from class jj2000.j2k.quantization.quantizer.Quantizer
createInstance, getAnSubbandTree, getCbULX, getCbULY, getParameterInfo
 
Methods inherited from class jj2000.j2k.image.ImgDataAdapter
getCompImgHeight, getCompImgWidth, getCompSubsX, getCompSubsY, getCompULX, getCompULY, getImgHeight, getImgULX, getImgULY, getImgWidth, getNomRangeBits, getNomTileHeight, getNomTileWidth, getNumComps, getNumTiles, getNumTiles, getTile, getTileCompHeight, getTileCompWidth, getTileHeight, getTileIdx, getTilePartULX, getTilePartULY, getTileWidth, nextTile, setTile
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface jj2000.j2k.image.ImgData
getCompImgHeight, getCompImgWidth, getCompSubsX, getCompSubsY, getCompULX, getCompULY, getImgHeight, getImgULX, getImgULY, getImgWidth, getNomRangeBits, getNomTileHeight, getNomTileWidth, getNumComps, getNumTiles, getNumTiles, getTile, getTileCompHeight, getTileCompWidth, getTileHeight, getTileIdx, getTilePartULX, getTilePartULY, getTileWidth, nextTile, setTile
 

Field Detail

QSTEP_MANTISSA_BITS

public static final int QSTEP_MANTISSA_BITS
The number of mantissa bits for the quantization steps

See Also:
Constant Field Values

QSTEP_EXPONENT_BITS

public static final int QSTEP_EXPONENT_BITS
The number of exponent bits for the quantization steps

See Also:
Constant Field Values

QSTEP_MAX_MANTISSA

public static final int QSTEP_MAX_MANTISSA
The maximum value of the mantissa for the quantization steps

See Also:
Constant Field Values

QSTEP_MAX_EXPONENT

public static final int QSTEP_MAX_EXPONENT
The maximum value of the exponent for the quantization steps

See Also:
Constant Field Values

log2

private static double log2
Natural log of 2, used as a convenience variable


qts

private QuantTypeSpec qts
The quantization type specifications


qsss

private QuantStepSizeSpec qsss
The quantization step size specifications


gbs

private GuardBitsSpec gbs
The guard bits specifications


infblk

private CBlkWTDataFloat infblk
The 'CBlkWTDataFloat' object used to request data, used when quantizing floating-point data.

Constructor Detail

StdQuantizer

public StdQuantizer(CBlkWTDataSrc src,
                    EncoderSpecs encSpec)
Initializes the source of wavelet transform coefficients. The constructor takes information on whether the quantizer is in reversible, derived or expounded mode. If the quantizer is reversible the value of 'derived' is ignored. If the source data is not integer (int) then the quantizer can not be reversible.

After initializing member attributes, getAnSubbandTree is called for all components setting the 'stepWMSE' for all subbands in the current tile.

Parameters:
src - The source of wavelet transform coefficients.
encSpec - The encoder specifications
Method Detail

getQuantTypeSpec

public QuantTypeSpec getQuantTypeSpec()
Returns the quantization type spec object associated to the quantizer.

Returns:
The quantization type spec

getNumGuardBits

public int getNumGuardBits(int t,
                           int c)
Returns the number of guard bits used by this quantizer in the given tile-component.

Specified by:
getNumGuardBits in class Quantizer
Parameters:
t - Tile index
c - Component index
Returns:
The number of guard bits

isReversible

public boolean isReversible(int t,
                            int c)
Returns true if the quantized data is reversible, for the specified tile-component. For the quantized data to be reversible it is necessary and sufficient that the quantization is reversible.

Parameters:
t - The tile to test for reversibility
c - The component to test for reversibility
Returns:
True if the quantized data is reversible, false if not.

isDerived

public boolean isDerived(int t,
                         int c)
Returns true if given tile-component uses derived quantization step sizes.

Specified by:
isDerived in class Quantizer
Parameters:
t - Tile index
c - Component index
Returns:
True if derived

getNextCodeBlock

public CBlkWTData getNextCodeBlock(int c,
                                   CBlkWTData cblk)
Returns the next code-block in the current tile for the specified component, as a copy (see below). The order in which code-blocks are returned is not specified. However each code-block is returned only once and all code-blocks will be returned if the method is called 'N' times, where 'N' is the number of code-blocks in the tile. After all the code-blocks have been returned for the current tile calls to this method will return 'null'.

When changing the current tile (through 'setTile()' or 'nextTile()') this method will always return the first code-block, as if this method was never called before for the new current tile.

The data returned by this method is always a copy of the data. Therfore it can be modified "in place" without any problems after being returned. The 'offset' of the returned data is 0, and the 'scanw' is the same as the code-block width. See the 'CBlkWTData' class.

The 'ulx' and 'uly' members of the returned 'CBlkWTData' object contain the coordinates of the top-left corner of the block, with respect to the tile, not the subband.

Parameters:
c - The component for which to return the next code-block.
cblk - If non-null this object will be used to return the new code-block. If null a new one will be allocated and returned. If the "data" array of the object is non-null it will be reused, if possible, to return the data.
Returns:
The next code-block in the current tile for component 'n', or null if all code-blocks for the current tile have been returned.
See Also:
CBlkWTData

getNextInternCodeBlock

public final CBlkWTData getNextInternCodeBlock(int c,
                                               CBlkWTData cblk)
Returns the next code-block in the current tile for the specified component. The order in which code-blocks are returned is not specified. However each code-block is returned only once and all code-blocks will be returned if the method is called 'N' times, where 'N' is the number of code-blocks in the tile. After all the code-blocks have been returned for the current tile calls to this method will return 'null'.

When changing the current tile (through 'setTile()' or 'nextTile()') this method will always return the first code-block, as if this method was never called before for the new current tile.

The data returned by this method can be the data in the internal buffer of this object, if any, and thus can not be modified by the caller. The 'offset' and 'scanw' of the returned data can be arbitrary. See the 'CBlkWTData' class.

The 'ulx' and 'uly' members of the returned 'CBlkWTData' object contain the coordinates of the top-left corner of the block, with respect to the tile, not the subband.

Parameters:
c - The component for which to return the next code-block.
cblk - If non-null this object will be used to return the new code-block. If null a new one will be allocated and returned. If the "data" array of the object is non-null it will be reused, if possible, to return the data.
Returns:
The next code-block in the current tile for component 'n', or null if all code-blocks for the current tile have been returned.
See Also:
CBlkWTData

calcSbParams

protected void calcSbParams(SubbandAn sb,
                            int c)
Calculates the parameters of the SubbandAn objects that depend on the Quantizer. The 'stepWMSE' field is calculated for each subband which is a leaf in the tree rooted at 'sb', for the specified component. The subband tree 'sb' must be the one for the component 'n'.

Specified by:
calcSbParams in class Quantizer
Parameters:
sb - The root of the subband tree.
c - The component index
See Also:
SubbandAn.stepWMSE

convertToExpMantissa

public static int convertToExpMantissa(float step)
Converts the floating point value to its exponent-mantissa representation. The mantissa occupies the 11 least significant bits (bits 10-0), and the exponent the previous 5 bits (bits 15-11).

Parameters:
step - The quantization step, normalized to a dynamic range of 1.
Returns:
The exponent mantissa representation of the step.

convertFromExpMantissa

private static float convertFromExpMantissa(int ems)
Converts the exponent-mantissa representation to its floating-point value. The mantissa occupies the 11 least significant bits (bits 10-0), and the exponent the previous 5 bits (bits 15-11).

Parameters:
ems - The exponent-mantissa representation of the step.
Returns:
The floating point representation of the step, normalized to a dynamic range of 1.

getMaxMagBits

public int getMaxMagBits(int c)
Returns the maximum number of magnitude bits in any subband of the current tile.

Specified by:
getMaxMagBits in class Quantizer
Parameters:
c - the component number
Returns:
The maximum number of magnitude bits in all subbands of the current tile.

getMaxMagBitsRev

private int getMaxMagBitsRev(Subband sb,
                             int c)
Returns the maximum number of magnitude bits in any subband of the current tile if reversible quantization is used

Parameters:
sb - The root of the subband tree of the current tile
c - the component number
Returns:
The highest number of magnitude bit-planes

getMaxMagBitsDerived

private int getMaxMagBitsDerived(Subband sb,
                                 int t,
                                 int c)
Returns the maximum number of magnitude bits in any subband in the given tile-component if derived quantization is used

Parameters:
sb - The root of the subband tree of the tile-component
t - Tile index
c - Component index
Returns:
The highest number of magnitude bit-planes

getMaxMagBitsExpounded

private int getMaxMagBitsExpounded(Subband sb,
                                   int t,
                                   int c)
Returns the maximum number of magnitude bits in any subband in the given tile-component if expounded quantization is used

Parameters:
sb - The root of the subband tree of the tile-component
t - Tile index
c - Component index
Returns:
The highest number of magnitude bit-planes