The type of length calculation and termination can be chosen at /// construction time. /// /// ---- Tricks that have been tried to improve speed ---- /// ///
1) Merging Qe and mPS and doubling the lookup tables
///
/// Merge the mPS into Qe, as the sign bit (if Qe>=0 the sense of MPS is 0, if
/// Qe<0 the sense is 1), and double the lookup tables. The first half of the
/// lookup tables correspond to Qe>=0 (i.e. the sense of MPS is 0) and the
/// second half to Qe<0 (i.e. the sense of MPS is 1). The nLPS lookup table is
/// modified to incorporate the changes in the sense of MPS, by making it jump
/// from the first to the second half and vice-versa, when a change is
/// specified by the swicthLM lookup table. See JPEG book, section 13.2, page
/// 225.
///
/// There is NO speed improvement in doing this, actually there is a slight
/// decrease, probably due to the fact that often Q has to be negated. Also the
/// fact that a brach of the type "if (bit==mPS[li])" is replaced by two
/// simpler braches of the type "if (bit==0)" and "if (q<0)" may contribute to
/// that.
2) Removing cT
///
/// It is possible to remove the cT counter by setting a flag bit in the high
/// bits of the C register. This bit will be automatically shifted left
/// whenever a renormalization shift occurs, which is equivalent to decreasing
/// cT. When the flag bit reaches the sign bit (leftmost bit), which is
/// equivalenet to cT==0, the byteOut() procedure is called. This test can be
/// done efficiently with "c<0" since C is a signed quantity. Care must be
/// taken in byteOut() to reset the bit in order to not interfere with other
/// bits in the C register. See JPEG book, page 228.
///
/// There is NO speed improvement in doing this. I don't really know why since
/// the number of operations whenever a renormalization occurs is
/// decreased. Maybe it is due to the number of extra operations in the
/// byteOut(), terminate() and getNumCodedBytes() procedures.
3) Change the convention of MPS and LPS.
///
/// Making the LPS interval be above the MPS interval (MQ coder convention is
/// the opposite) can reduce the number of operations along the MPS path. In
/// order to generate the same bit stream as with the MQ convention the output
/// bytes need to be modified accordingly. The basic rule for this is that C =
/// (C'^0xFF...FF)-A, where C is the codestream for the MQ convention and C' is
/// the codestream generated by this other convention. Note that this affects
/// bit-stuffing as well.
///
/// This has not been tested yet.
///
///
4) Removing normalization while loop on MPS path
///
/// Since in the MPS path Q is guaranteed to be always greater than 0x4000
/// (decimal 0.375) it is never necessary to do more than 1 renormalization
/// shift. Therefore the test of the while loop, and the loop itself, can be
/// removed.
5) Simplifying test on A register
///
/// Since A is always less than or equal to 0xFFFF, the test "(a & 0x8000)==0"
/// can be replaced by the simplete test "a < 0x8000". This test is simpler in
/// Java since it involves only 1 operation (although the original test can be
/// converted to only one operation by smart Just-In-Time compilers)
///
/// This change has been integrated in the decoding procedures.
6) Speedup mode
///
/// Implemented a method that uses the speedup mode of the MQ-coder if
/// possible. This should greately improve performance when coding long runs of
/// MPS symbols that have high probability. However, to take advantage of this,
/// the entropy coder implementation has to explicetely use it. The generated
/// bit stream is the same as if no speedup mode would have been used.
///
/// Implemented but performance not tested yet.
7) Multiple-symbol coding
///
/// Since the time spent in a method call is non-negligable, coding several
/// symbols with one method call reduces the overhead per coded symbol. The
/// decodeSymbols() method implements this. However, to take advantage of it,
/// the implementation of the entropy coder has to explicitely use it.
///
/// Implemented but performance not tested yet.
The values returned by this method are then to be used in finishing /// the length calculation with the 'finishLengthCalculation()' method, /// after compensation of the offset in the number of bytes due to previous /// terminated segments.
/// ///This method should not be called if the current coding pass is to be /// terminated. The 'terminate()' method should be called instead.
/// ///The calculation is done based on the type of length calculation /// specified at the constructor.
/// ///If the symbol 'bit' is the current more probable symbol (MPS) and /// qe[ctxt]<=0x4000, and (A-0x8000)>=qe[ctxt], speedup mode will be /// used. Otherwise the normal mode will be used. The speedup mode can /// significantly improve the speed of arithmetic coding when several MPS /// symbols, with a high probability distribution, must be coded with the /// same context. The generated bit stream is the same as if the normal mode /// was used.
/// ///This method is also faster than the 'codeSymbols()' and /// 'codeSymbol()' ones, for coding the same symbols with the same context /// several times, when speedup mode can not be used, although not /// significantly.
/// ///The advantage of using this function is that the cost of the method /// call is amortized by the number of coded symbols per method call.
/// ///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.
/// ///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.
/// ///After calling this method the 'finishLengthCalculation()' method /// should be called, after compensating the returned length for the length /// of previous coded segments, so that the length calculation is /// finalized.
/// ///The type of termination used depends on the one specified at the /// constructor.
/// ///The values in 'rates' must have been compensated for any offset due /// to previous terminated segments, so that the correct index to the /// stored coded data is used.
/// ///