Class: Omnizip::Formats::Rar::Rar5::Solid::SolidEncoder

Inherits:
Object
  • Object
show all
Defined in:
lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb

Overview

Solid LZMA encoder with persistent dictionary

This encoder maintains LZMA dictionary state across multiple files, allowing later files to reference data from earlier files. This is the core technique behind solid compression's improved ratios.

Unlike normal compression where each file is independent, solid compression treats all files as one continuous stream, maximizing dictionary-based compression efficiency.

Examples:

Compress multiple files in solid mode

encoder = SolidEncoder.new(level: 5)
compressed = encoder.compress_stream(concatenated_data)

Defined Under Namespace

Classes: LzmaOptions

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ SolidEncoder

Initialize solid encoder

Parameters:

  • options (Hash) (defaults to: {})

    Encoder options

Options Hash (options):

  • :level (Integer)

    Compression level (1-5, default: 3)



34
35
36
37
# File 'lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb', line 34

def initialize(options = {})
  @level = options[:level] || 3
  @lzma_options = build_lzma_options(@level)
end

Instance Attribute Details

#levelInteger (readonly)

Returns Compression level (1-5).

Returns:

  • (Integer)

    Compression level (1-5)



25
26
27
# File 'lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb', line 25

def level
  @level
end

#lzma_optionsHash (readonly)

Returns LZMA options.

Returns:

  • (Hash)

    LZMA options



28
29
30
# File 'lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb', line 28

def lzma_options
  @lzma_options
end

Instance Method Details

#build_lzma_options(level) ⇒ LzmaOptions

Build LZMA options for solid compression

Solid compression benefits from larger dictionaries since we're compressing more data at once.

Parameters:

  • level (Integer)

    RAR5 compression level (1-5)

Returns:



79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb', line 79

def build_lzma_options(level)
  # Use larger dictionaries for solid mode
  # This allows better cross-file references
  dict_size = 1 << case level
                   when 1 then 20  # 1 MB (fastest)
                   when 2 then 22  # 4 MB (fast)
                   when 3 then 24  # 16 MB (normal)
                   when 4 then 25  # 32 MB (good)
                   when 5 then 26  # 64 MB (best)
                   else 24 # default: 16 MB
                   end

  LzmaOptions.new(level, dict_size)
end

#compress_stream(data) ⇒ String

Compress data with persistent dictionary

Parameters:

  • data (String)

    Data to compress (concatenated files)

Returns:

  • (String)

    Compressed data



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb', line 43

def compress_stream(data)
  input = StringIO.new(data)
  output = StringIO.new
  output.set_encoding(Encoding::BINARY)

  # Create LZMA encoder
  lzma = Algorithms::LZMA.new

  # Compress entire stream at once (maintains dictionary)
  lzma.compress(input, output, @lzma_options)

  output.string
end

#decompress_stream(data) ⇒ String

Decompress solid stream

Parameters:

  • data (String)

    Compressed data

Returns:

  • (String)

    Decompressed data



61
62
63
64
65
66
67
68
69
70
# File 'lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb', line 61

def decompress_stream(data)
  input = StringIO.new(data)
  output = StringIO.new
  output.set_encoding(Encoding::BINARY)

  lzma = Algorithms::LZMA.new
  lzma.decompress(input, output)

  output.string
end