Class MQDecoder
- java.lang.Object
-
- jj2000.j2k.entropy.decoder.MQDecoder
-
public class MQDecoder extends Object
This class implements the MQ arithmetic decoder. It is implemented using the software conventions decoder for better performance (i.e. execution time performance). The initial states for each context of the MQ-coder are specified in the constructor.
-
-
Constructor Summary
Constructors Constructor Description MQDecoder(ByteInputBuffer iStream, int nrOfContexts, int[] initStates)
Instantiates a new MQ-decoder, with the specified number of contexts and initial states.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
checkPredTerm()
Checks for past errors in the decoding process using the predictable error resilient termination.int
decodeSymbol(int context)
Arithmetically decodes one symbol from the bit stream with the given context and returns its decoded value.void
decodeSymbols(int[] bits, int[] cX, int n)
This function performs the arithmetic decoding.boolean
fastDecodeSymbols(int[] bits, int ctxt, int n)
Decodes 'n' symbols from the bit stream using the same context 'ctxt'.ByteInputBuffer
getByteInputBuffer()
Returns the underlying 'ByteInputBuffer' from where the MQ coded input bytes are read.int
getNumCtxts()
Returns the number of contexts in the arithmetic coder.void
nextSegment(byte[] buf, int off, int len)
Resets the MQ decoder to start a new segment.void
resetCtxt(int c)
Resets a context to the original probability distribution.void
resetCtxts()
Resets a context to the original probability distribution.
-
-
-
Constructor Detail
-
MQDecoder
public MQDecoder(ByteInputBuffer iStream, int nrOfContexts, int[] initStates)
Instantiates a new MQ-decoder, with the specified number of contexts and initial states. The compressed bytestream is read from the 'iStream' object.- Parameters:
iStream
- the stream that contains the coded bitsnrOfContexts
- The number of contexts usedinitStates
- The initial state for each context. A reference is kept to this array to reinitialize the contexts whenever 'reset()' or 'resetCtxts()' is called.
-
-
Method Detail
-
fastDecodeSymbols
public final boolean fastDecodeSymbols(int[] bits, int ctxt, int n)
Decodes 'n' symbols from the bit stream using the same context 'ctxt'. If possible the MQ-coder speedup mode will be used to speed up decoding. The speedup mode is used if Q (the LPS probability for 'ctxt' is low enough) and the A and C registers permit decoding several MPS symbols without renormalization.Speedup mode should be used when decoding long runs of MPS with high probability with the same context.
This methiod will return the decoded symbols differently if speedup mode was used or not. If true is returned, then speedup mode was used and the 'n' decoded symbols are all the same and it is returned ain bits[0] only. If false is returned then speedup mode was not used, the decoded symbols are probably not all the same and they are returned in bits[0], bits[1], ... bits[n-1].
- Parameters:
bits
- The array where to put the decoded symbols. Must be of length 'n' or more.ctxt
- The context to use in decoding the symbols.n
- The number of symbols to decode.- Returns:
- True if speedup mode was used, false if not. If speedup mode was used then all the decoded symbols are the same and its value is returned in 'bits[0]' only (not in bits[1], bits[2], etc.).
-
decodeSymbols
public final void decodeSymbols(int[] bits, int[] cX, int n)
This function performs the arithmetic decoding. The function receives an array in which to put the decoded symbols and an array of contexts with which to decode them.Each context has a current MPS and an index describing what the current probability is for the LPS. Each bit is decoded and if the probability of the LPS exceeds .5, the MPS and LPS are switched.
- Parameters:
bits
- The array where to place the decoded symbols. It should be long enough to contain 'n' elements.cX
- The context to use in decoding each symbol.n
- The number of symbols to decode
-
decodeSymbol
public final int decodeSymbol(int context)
Arithmetically decodes one symbol from the bit stream with the given context and returns its decoded value.Each context has a current MPS and an index describing what the current probability is for the LPS. Each bit is encoded and if the probability of the LPS exceeds .5, the MPS and LPS are switched.
- Parameters:
context
- The context to use in decoding the symbol- Returns:
- The decoded symbol, 0 or 1.
-
checkPredTerm
public boolean checkPredTerm()
Checks for past errors in the decoding process using the predictable error resilient termination. This works only if the encoder used the predictable error resilient MQ termination, otherwise it reports wrong results. If an error is detected it means that the MQ bit stream has been wrongly decoded or that the MQ terminated segment length is too long. If no errors are detected it does not necessarily mean that the MQ bit stream has been correctly decoded.- Returns:
- True if errors are found, false otherwise.
-
getNumCtxts
public final int getNumCtxts()
Returns the number of contexts in the arithmetic coder.- Returns:
- The number of contexts
-
resetCtxt
public final void resetCtxt(int c)
Resets a context to the original probability distribution.- Parameters:
c
- The number of the context (it starts at 0).
-
resetCtxts
public final void resetCtxts()
Resets a context to the original probability distribution. The original probability distribution depends on the actual implementation of the arithmetic coder or decoder.
-
nextSegment
public final void nextSegment(byte[] buf, int off, int len)
Resets the MQ decoder to start a new segment. This is like recreating a new MQDecoder object with new input data.- Parameters:
buf
- The byte array containing the MQ encoded data. If null the current byte array is assumed.off
- The index of the first element in 'buf' to be decoded. If negative the byte just after the previous segment is assumed, only valid if 'buf' is null.len
- The number of bytes in 'buf' to be decoded. Any subsequent bytes are taken to be 0xFF.
-
getByteInputBuffer
public ByteInputBuffer getByteInputBuffer()
Returns the underlying 'ByteInputBuffer' from where the MQ coded input bytes are read.- Returns:
- The underlying ByteInputBuffer.
-
-