public class StdEntropyCoder extends EntropyCoder implements StdEntropyCoderOptions
The number of threads used by this entropy coder is specified by the "jj2000.j2k.entropy.encoder.StdEntropyCoder.nthreads" Java system property. If set to "0" the single threaded implementation is used. If set to 'n' ('n' larger than 0) then 'n' extra threads are started by this class which are used to encode the code-blocks in parallel (i.e. ideally 'n' code-blocks will be encoded in parallel at a time). On multiprocessor machines under a "native threads" Java Virtual Machine implementation each one of these threads can run on a separate processor speeding up the encoding time. By default the single-threaded implementation is used. The multi-threaded implementation currently assumes that the vast majority of consecutive calls to 'getNextCodeBlock()' will be done on the same component. If this is not the case, the speed-up that can be expected on multiprocessor machines might be significantly decreased.
The code-blocks 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 buffers the symbols and calls the MQ coder only once per stripe and per coding pass, to reduce the method call overhead.
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.
The source module must implement the CBlkQuantDataSrcEnc interface and code-block's data is received in a CBlkWTData instance. This modules sends code-block's information in a CBlkRateDistStats instance.
CBlkQuantDataSrcEnc
,
CBlkWTData
,
CBlkRateDistStats
Modifier and Type | Field and Description |
---|---|
StringSpec |
bms
By-pass mode specifications
|
StringSpec |
css
Causal stripes specifications
|
static java.lang.String |
DEF_THREADS_NUM
The default value for the property in THREADS_PROP_NAME: 0
|
StringSpec |
lcs
The length calculation specifications
|
StringSpec |
mqrs
MQ reset specifications
|
StringSpec |
rts
Regular termination specifications
|
StringSpec |
sss
Error resilience segment symbol use specifications
|
static int |
THREADS_PRIORITY_INC
The increase in priority for the compressor threads, currently 3.
|
static java.lang.String |
THREADS_PROP_NAME
The Java system property name for the number of threads to use:
jj2000.j2k.entropy.encoder.StdEntropyCoder.nthreads
|
StringSpec |
tts
The termination type specifications
|
OPT_PREFIX, src
imgdatasrc, tIdx
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_PRED_TERM, OPT_RESET_MQ, OPT_SEG_SYMBOLS, OPT_TERM_PASS, OPT_VERT_STR_CAUSAL, STRIPE_HEIGHT
Constructor and Description |
---|
StdEntropyCoder(CBlkQuantDataSrcEnc src,
CBlkSizeSpec cblks,
PrecinctSizeSpec pss,
StringSpec bms,
StringSpec mqrs,
StringSpec rts,
StringSpec css,
StringSpec sss,
StringSpec lcs,
StringSpec tts)
Instantiates a new entropy coder engine, with the specified source of
data, nominal block width and height.
|
Modifier and Type | Method and Description |
---|---|
void |
finalize()
Prints the timing information, if collected, and calls 'finalize' on
the super class.
|
int |
getCBlkHeight(int t,
int c)
Returns the code-block height for the specified tile and component.
|
int |
getCBlkWidth(int t,
int c)
Returns the code-block width for the specified tile and component.
|
CBlkRateDistStats |
getNextCodeBlock(int c,
CBlkRateDistStats ccb)
Returns the next coded code-block in the current tile for the specified
component, as a copy (see below).
|
int |
getPPX(int t,
int c,
int rl)
Returns the precinct partition width for the specified
component, tile and resolution level.
|
int |
getPPY(int t,
int c,
int rl)
Returns the precinct partition height for the specified
component, tile and resolution level.
|
void |
initTileComp(int nt,
int nc)
Load options, length calculation type and termination type for
each tile-component.
|
void |
nextTile()
Advances to the next tile, in standard scan-line order (by rows
then columns).
|
boolean |
precinctPartitionUsed(int c,
int t)
Returns true if precinct partition is used for the specified
component and tile, returns false otherwise.
|
void |
setTile(int x,
int y)
Changes the current tile, given the new indexes.
|
createInstance, getAnSubbandTree, getCbULX, getCbULY, getParameterInfo, isReversible
getCompImgHeight, getCompImgWidth, getCompSubsX, getCompSubsY, getCompULX, getCompULY, getImgHeight, getImgULX, getImgULY, getImgWidth, getNomRangeBits, getNomTileHeight, getNomTileWidth, getNumComps, getNumTiles, getNumTiles, getTile, getTileCompHeight, getTileCompWidth, getTileHeight, getTileIdx, getTilePartULX, getTilePartULY, getTileWidth
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getCompImgHeight, getCompImgWidth, getCompSubsX, getCompSubsY, getCompULX, getCompULY, getImgHeight, getImgULX, getImgULY, getImgWidth, getNomRangeBits, getNomTileHeight, getNomTileWidth, getNumComps, getNumTiles, getNumTiles, getTile, getTileCompHeight, getTileCompWidth, getTileHeight, getTileIdx, getTilePartULX, getTilePartULY, getTileWidth
public static final java.lang.String THREADS_PROP_NAME
public static final java.lang.String DEF_THREADS_NUM
public static final int THREADS_PRIORITY_INC
public StringSpec bms
public StringSpec mqrs
public StringSpec rts
public StringSpec css
public StringSpec sss
public StringSpec lcs
public StringSpec tts
public StdEntropyCoder(CBlkQuantDataSrcEnc src, CBlkSizeSpec cblks, PrecinctSizeSpec pss, StringSpec bms, StringSpec mqrs, StringSpec rts, StringSpec css, StringSpec sss, StringSpec lcs, StringSpec tts)
If the 'OPT_PRED_TERM' option is given then the MQ termination must be 'TERM_PRED_ER' or an exception is thrown.
src
- The source of datacbks
- Code-block size specificationspss
- Precinct partition specificationsbms
- By-pass mode specificationsmqrs
- MQ-reset specificationsrts
- Regular termination specificationscss
- Causal stripes specificationssss
- Error resolution segment symbol use specificationslcs
- Length computation specificationstts
- Termination type specificationsMQCoder
public void finalize() throws java.lang.Throwable
finalize
in class java.lang.Object
java.lang.Throwable
public int getCBlkWidth(int t, int c)
getCBlkWidth
in class EntropyCoder
t
- The tile indexc
- the component indexpublic int getCBlkHeight(int t, int c)
getCBlkHeight
in class EntropyCoder
t
- The tile indexc
- The component indexpublic CBlkRateDistStats getNextCodeBlock(int c, CBlkRateDistStats ccb)
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 internal data of this object, if any, and it can be modified "in place" without any problems after being returned.
getNextCodeBlock
in interface CodedCBlkDataSrcEnc
c
- The component for which to return the next code-block.ccb
- If non-null this object might be used in returning the coded
code-block in this or any subsequent call to this method. If null a new
one is created and returned. If the 'data' array of 'cbb' is not null
it may be reused to return the compressed data.CBlkRateDistStats
public void setTile(int x, int y)
This default implementation just changes the tile in the source.
setTile
in interface ImgData
setTile
in class ImgDataAdapter
x
- The horizontal index of the tile.y
- The vertical index of the new tile.public void nextTile()
This default implementation just advances to the next tile in the source.
nextTile
in interface ImgData
nextTile
in class ImgDataAdapter
public void initTileComp(int nt, int nc)
nt
- The number of tilesnc
- The number of componentspublic int getPPX(int t, int c, int rl)
getPPX
in interface CodedCBlkDataSrcEnc
t
- the tile indexc
- the componentrl
- the resolution levelpublic int getPPY(int t, int c, int rl)
getPPY
in interface CodedCBlkDataSrcEnc
t
- the tile indexc
- the componentrl
- the resolution levelpublic boolean precinctPartitionUsed(int c, int t)
precinctPartitionUsed
in interface CodedCBlkDataSrcEnc
c
- The componentt
- The tileCopyright © 2014 Open Microscopy Environment