jp2codec.entropy.decoder
Class StdEntropyDecoder

java.lang.Object
  extended by jp2codec.wavelet.synthesis.MultiResImgDataAdapter
      extended by jp2codec.entropy.decoder.EntropyDecoder
          extended by jp2codec.entropy.decoder.StdEntropyDecoder
All Implemented Interfaces:
StdEntropyCoderOptions, CBlkQuantDataSrcDec, InvWTData, MultiResImgData

public class StdEntropyDecoder
extends EntropyDecoder
implements StdEntropyCoderOptions

This class implements the JPEG 2000 entropy decoder, which codes stripes in code-blocks. This entropy decoding engine decodes one code-block at a time. The code-block are rectangular, with dimensions which must be powers of 2. Each dimension has to be no smaller than 4 and no larger than 256. The product of the two dimensions (i.e. area of the code-block) may not exceed 4096. Context 0 of the MQ-coder is used as the uniform one (uniform, non-adaptive probability distribution). Context 1 is used for RLC coding. Contexts 2-10 are used for zero-coding (ZC), contexts 11-15 are used for sign-coding (SC) and contexts 16-18 are used for magnitude-refinement (MR).

This implementation also provides some timing features. They can be enabled by setting the 'DO_TIMING' constant of this class to true and recompiling. The timing uses the 'System.currentTimeMillis()' Java API call, which returns wall clock time, not the actual CPU time used. The timing results will be printed on the message output. Since the times reported are wall clock times and not CPU usage times they can not be added to find the total used time (i.e. some time might be counted in several places). When timing is disabled ('DO_TIMING' is false) there is no penalty if the compiler performs some basic optimizations. Even if not the penalty should be negligeable.


Field Summary
 
Fields inherited from class jp2codec.entropy.decoder.EntropyDecoder
src
 
Fields inherited from class jp2codec.wavelet.synthesis.MultiResImgDataAdapter
mressrc, tIdx
 
Fields inherited from interface jp2codec.entropy.StdEntropyCoderOptions
FIRST_BYPASS_PASS_IDX, MAX_CB_AREA, MAX_CB_DIM, MIN_CB_DIM, NUM_EMPTY_PASSES_IN_MS_BP, NUM_NON_BYPASS_MS_BP, NUM_PASSES, OPT_BYPASS, OPT_ER_TERM, OPT_REG_TERM, OPT_RESET_MQ, OPT_SEG_MARKERS, OPT_VERT_STR_CAUSAL, STRIPE_HEIGHT
 
Constructor Summary
StdEntropyDecoder(CodedCBlkDataSrcDec src, DecoderSpecs decSpec, boolean doer, boolean verber)
          Instantiates a new entropy decoder engine, with the specified source of data, nominal block width and height.
 
Method Summary
 DataBlk getCodeBlock(int c, int m, int n, SubbandSyn sb, DataBlk cblk)
          Returns the specified code-block in the current tile for the specified component, as a copy (see below).
 DataBlk getInternCodeBlock(int c, int m, int n, SubbandSyn sb, DataBlk cblk)
          Returns the specified code-block in the current tile for the specified component (as a reference or copy).
 Coord getNumCodeBlocks(SubbandSyn sb, int n, Coord co)
          Returns the number of code-blocks in a subband, along the horizontal and vertical dimensions.
 
Methods inherited from class jp2codec.entropy.decoder.EntropyDecoder
getPartitionULX, getPartitionULY, getSubbandTree
 
Methods inherited from class jp2codec.wavelet.synthesis.MultiResImgDataAdapter
getCompHeight, getCompImgHeight, getCompImgWidth, getCompSubsX, getCompSubsY, getCompWidth, getHeight, getImgHeight, getImgULX, getImgULY, getImgWidth, getNumComps, getNumTiles, getNumTiles, getTile, getTileIdx, getTileOff, getULX, getULY, getWidth, nextTile, setTile
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface jp2codec.wavelet.synthesis.MultiResImgData
getCompHeight, getCompImgHeight, getCompImgWidth, getCompSubsX, getCompSubsY, getCompWidth, getHeight, getImgHeight, getImgULX, getImgULY, getImgWidth, getNumComps, getNumTiles, getNumTiles, getTile, getTileIdx, getTileOff, getULX, getULY, getWidth, nextTile, setTile
 

Constructor Detail

StdEntropyDecoder

public StdEntropyDecoder(CodedCBlkDataSrcDec src,
                         DecoderSpecs decSpec,
                         boolean doer,
                         boolean verber)
Instantiates a new entropy decoder engine, with the specified source of data, nominal block width and height.

Parameters:
src - The source of data
decSpec - Decoder Specs
doer - If true error detection will be performed, if any error detection features have been enabled.
verber - This flag indicates if the entropy decoder should be verbose about bit stream errors that are detected and concealed.
Method Detail

getNumCodeBlocks

public Coord getNumCodeBlocks(SubbandSyn sb,
                              int n,
                              Coord co)
Returns the number of code-blocks in a subband, along the horizontal and vertical dimensions.

Specified by:
getNumCodeBlocks in interface CBlkQuantDataSrcDec
Parameters:
sb - The subband for which to return the number of blocks.
n - The component where the subband is.
co - If not null the values are returned in this object. If null a new object is allocated and returned.
Returns:
The number of code-blocks along the horizontal dimension in 'Coord.x' and the number of code-blocks along the vertical dimension in 'Coord.y'.

getCodeBlock

public DataBlk getCodeBlock(int c,
                            int m,
                            int n,
                            SubbandSyn sb,
                            DataBlk cblk)
Returns the specified code-block in the current tile for the specified component, as a copy (see below).

The returned code-block may be progressive, which is indicated by the 'progressive' variable of the returned 'DataBlk' object. If a code-block is progressive it means that in a later request to this method for the same code-block it is possible to retrieve data which is a better approximation, since meanwhile more data to decode for the code-block could have been received. If the code-block is not progressive then later calls to this method for the same code-block will return the exact same data values.

The data returned by this method is always a copy of the internal data of this object, if any, and 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 'DataBlk' class.

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

Specified by:
getCodeBlock in interface CBlkQuantDataSrcDec
Parameters:
c - The component for which to return the next code-block.
m - The vertical index of the code-block to return, in the specified subband.
n - The horizontal index of the code-block to return, in the specified subband.
sb - The subband in which the code-block to return is.
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:
DataBlk

getInternCodeBlock

public DataBlk getInternCodeBlock(int c,
                                  int m,
                                  int n,
                                  SubbandSyn sb,
                                  DataBlk cblk)
Returns the specified code-block in the current tile for the specified component (as a reference or copy).

The returned code-block may be progressive, which is indicated by the 'progressive' variable of the returned 'DataBlk' object. If a code-block is progressive it means that in a later request to this method for the same code-block it is possible to retrieve data which is a better approximation, since meanwhile more data to decode for the code-block could have been received. If the code-block is not progressive then later calls to this method for the same code-block will return the exact same data values.

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 'DataBlk' class.

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

Specified by:
getInternCodeBlock in interface CBlkQuantDataSrcDec
Parameters:
c - The component for which to return the next code-block.
m - The vertical index of the code-block to return, in the specified subband.
n - The horizontal index of the code-block to return, in the specified subband.
sb - The subband in which the code-block to return is.
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:
DataBlk