Class Bzip2BlockDecompressor

java.lang.Object
io.netty.handler.codec.compression.Bzip2BlockDecompressor

final class Bzip2BlockDecompressor extends Object
Reads and decompresses a single Bzip2 block.

Block decoding consists of the following stages:
1. Read block header
2. Read Huffman tables
3. Read and decode Huffman encoded data - decodeHuffmanData(Bzip2HuffmanStageDecoder)
4. Run-Length Decoding[2] - decodeHuffmanData(Bzip2HuffmanStageDecoder)
5. Inverse Move To Front Transform - decodeHuffmanData(Bzip2HuffmanStageDecoder)
6. Inverse Burrows Wheeler Transform - initialiseInverseBWT()
7. Run-Length Decoding[1] - read()
8. Optional Block De-Randomisation - read() (through decodeNextBWTByte())
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final int
    The CRC of the current block as read from the block header.
    private final boolean
    true if the current block is randomised, otherwise false.
    private final byte[]
    The Burrows-Wheeler Transform processed data.
    private int
    The actual length in bytes of the current block at the Inverse Burrows Wheeler Transform stage (before final Run-Length Decoding).
    private final int[]
    Counts of each byte value within the huffmanSymbolMap data.
    private int
    The number of output bytes that have been decoded up to the Inverse Burrows Wheeler Transform stage.
    private int
    The current merged pointer into the Burrow-Wheeler Transform array.
    private int[]
    At each position contains the union of :- An output character (8 bits) A pointer from each position to its successor (24 bits, left shifted 8 bits) As the pointer cannot exceed the maximum block size of 900k, 24 bits is more than enough to hold it; Folding the character data into the spare bits while performing the inverse BWT, when both pieces of information are available, saves a large number of memory accesses in the final decoding stages.
    private final int
    Starting pointer into BWT for after untransform.
    private final Crc32
    Calculates the block CRC from the fully decoded bytes of the block.
    (package private) int
    The end-of-block Huffman symbol.
    (package private) int
    Bitmap, of ranges of 16 bytes, present/not present.
    (package private) final byte[]
    A map from Huffman symbol index to output character.
    private int
     
    private int
    If the current block is randomised, the remaining count at the current RNUMS position.
    private int
    If the current block is randomised, the position within the RNUMS randomisation array.
    private final Bzip2BitReader
    A reader that provides bit-level reads.
    private int
     
    private int
     
    private int
    The number of previous identical output bytes decoded.
    private int
    The most recently RLE decoded byte.
    private int
    The RLE repeat count of the current decoded byte.
    private final Bzip2MoveToFrontTable
    Table for Move To Front transformations.
  • Constructor Summary

    Constructors
    Constructor
    Description
    Bzip2BlockDecompressor(int blockSize, int blockCRC, boolean blockRandomised, int bwtStartPointer, Bzip2BitReader reader)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    int
     
    (package private) int
    Verify and return the block CRC.
    (package private) boolean
    Reads the Huffman encoded data from the input stream, performs Run-Length Decoding and applies the Move To Front transform to reconstruct the Burrows-Wheeler Transform array.
    private int
    Decodes a byte from the Burrows-Wheeler Transform stage.
    private void
    Set up the Inverse Burrows-Wheeler Transform merged pointer array.
    int
    Decodes a byte from the final Run-Length Encoding stage, pulling a new byte from the Burrows-Wheeler Transform stage when required.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • reader

      private final Bzip2BitReader reader
      A reader that provides bit-level reads.
    • crc

      private final Crc32 crc
      Calculates the block CRC from the fully decoded bytes of the block.
    • blockCRC

      private final int blockCRC
      The CRC of the current block as read from the block header.
    • blockRandomised

      private final boolean blockRandomised
      true if the current block is randomised, otherwise false.
    • huffmanEndOfBlockSymbol

      int huffmanEndOfBlockSymbol
      The end-of-block Huffman symbol. Decoding of the block ends when this is encountered.
    • huffmanInUse16

      int huffmanInUse16
      Bitmap, of ranges of 16 bytes, present/not present.
    • huffmanSymbolMap

      final byte[] huffmanSymbolMap
      A map from Huffman symbol index to output character. Some types of data (e.g. ASCII text) may contain only a limited number of byte values; Huffman symbols are only allocated to those values that actually occur in the uncompressed data.
    • bwtByteCounts

      private final int[] bwtByteCounts
      Counts of each byte value within the huffmanSymbolMap data. Collected at the Move To Front stage, consumed by the Inverse Burrows Wheeler Transform stage.
    • bwtBlock

      private final byte[] bwtBlock
      The Burrows-Wheeler Transform processed data. Read at the Move To Front stage, consumed by the Inverse Burrows Wheeler Transform stage.
    • bwtStartPointer

      private final int bwtStartPointer
      Starting pointer into BWT for after untransform.
    • bwtMergedPointers

      private int[] bwtMergedPointers
      At each position contains the union of :- An output character (8 bits) A pointer from each position to its successor (24 bits, left shifted 8 bits) As the pointer cannot exceed the maximum block size of 900k, 24 bits is more than enough to hold it; Folding the character data into the spare bits while performing the inverse BWT, when both pieces of information are available, saves a large number of memory accesses in the final decoding stages.
    • bwtCurrentMergedPointer

      private int bwtCurrentMergedPointer
      The current merged pointer into the Burrow-Wheeler Transform array.
    • bwtBlockLength

      private int bwtBlockLength
      The actual length in bytes of the current block at the Inverse Burrows Wheeler Transform stage (before final Run-Length Decoding).
    • bwtBytesDecoded

      private int bwtBytesDecoded
      The number of output bytes that have been decoded up to the Inverse Burrows Wheeler Transform stage.
    • rleLastDecodedByte

      private int rleLastDecodedByte
      The most recently RLE decoded byte.
    • rleAccumulator

      private int rleAccumulator
      The number of previous identical output bytes decoded. After 4 identical bytes, the next byte decoded is an RLE repeat count.
    • rleRepeat

      private int rleRepeat
      The RLE repeat count of the current decoded byte. When this reaches zero, a new byte is decoded.
    • randomIndex

      private int randomIndex
      If the current block is randomised, the position within the RNUMS randomisation array.
    • randomCount

      private int randomCount
      If the current block is randomised, the remaining count at the current RNUMS position.
    • symbolMTF

      private final Bzip2MoveToFrontTable symbolMTF
      Table for Move To Front transformations.
    • repeatCount

      private int repeatCount
    • repeatIncrement

      private int repeatIncrement
    • mtfValue

      private int mtfValue
  • Constructor Details

    • Bzip2BlockDecompressor

      Bzip2BlockDecompressor(int blockSize, int blockCRC, boolean blockRandomised, int bwtStartPointer, Bzip2BitReader reader)
  • Method Details

    • decodeHuffmanData

      boolean decodeHuffmanData(Bzip2HuffmanStageDecoder huffmanDecoder)
      Reads the Huffman encoded data from the input stream, performs Run-Length Decoding and applies the Move To Front transform to reconstruct the Burrows-Wheeler Transform array.
    • initialiseInverseBWT

      private void initialiseInverseBWT()
      Set up the Inverse Burrows-Wheeler Transform merged pointer array.
    • read

      public int read()
      Decodes a byte from the final Run-Length Encoding stage, pulling a new byte from the Burrows-Wheeler Transform stage when required.
      Returns:
      The decoded byte, or -1 if there are no more bytes
    • decodeNextBWTByte

      private int decodeNextBWTByte()
      Decodes a byte from the Burrows-Wheeler Transform stage. If the block has randomisation applied, reverses the randomisation.
      Returns:
      The decoded byte
    • blockLength

      public int blockLength()
    • checkCRC

      int checkCRC()
      Verify and return the block CRC. This method may only be called after all of the block's bytes have been read.
      Returns:
      The block CRC