1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 19:27:45 +00:00

LibCompress: Refactor LZMA model property decoding into a static helper

This commit is contained in:
Tim Schumacher 2023-03-14 02:36:03 +01:00 committed by Andreas Kling
parent 52d9fc92f1
commit 04f69de7f1
2 changed files with 26 additions and 19 deletions

View file

@ -39,7 +39,7 @@ Optional<u64> LzmaHeader::uncompressed_size() const
return uncompressed_size; return uncompressed_size;
} }
ErrorOr<void> LzmaHeader::decode_model_properties(u8& literal_context_bits, u8& literal_pos_bits, u8& pos_bits) const ErrorOr<LzmaModelProperties> LzmaHeader::decode_model_properties(u8 input_bits)
{ {
// "Decodes the following values from the encoded model properties field: // "Decodes the following values from the encoded model properties field:
// //
@ -50,34 +50,35 @@ ErrorOr<void> LzmaHeader::decode_model_properties(u8& literal_context_bits, u8&
// //
// Encoded using `((pb * 5 + lp) * 9 + lc)`." // Encoded using `((pb * 5 + lp) * 9 + lc)`."
u8 input_bits = m_model_properties;
if (input_bits >= (9 * 5 * 5)) if (input_bits >= (9 * 5 * 5))
return Error::from_string_literal("Encoded model properties value is larger than the highest possible value"); return Error::from_string_literal("Encoded model properties value is larger than the highest possible value");
literal_context_bits = input_bits % 9; u8 literal_context_bits = input_bits % 9;
input_bits /= 9; input_bits /= 9;
VERIFY(literal_context_bits >= 0 && literal_context_bits <= 8);
literal_pos_bits = input_bits % 5; u8 literal_position_bits = input_bits % 5;
input_bits /= 5; input_bits /= 5;
VERIFY(literal_position_bits >= 0 && literal_position_bits <= 4);
pos_bits = input_bits; u8 position_bits = input_bits;
VERIFY(position_bits >= 0 && position_bits <= 4);
return {}; return LzmaModelProperties {
.literal_context_bits = literal_context_bits,
.literal_position_bits = literal_position_bits,
.position_bits = position_bits,
};
} }
ErrorOr<LzmaDecompressorOptions> LzmaHeader::as_decompressor_options() const ErrorOr<LzmaDecompressorOptions> LzmaHeader::as_decompressor_options() const
{ {
u8 literal_context_bits { 0 }; auto model_properties = TRY(decode_model_properties(m_encoded_model_properties));
u8 literal_position_bits { 0 };
u8 position_bits { 0 };
TRY(decode_model_properties(literal_context_bits, literal_position_bits, position_bits)); return Compress::LzmaDecompressorOptions {
.literal_context_bits = model_properties.literal_context_bits,
return LzmaDecompressorOptions { .literal_position_bits = model_properties.literal_position_bits,
.literal_context_bits = literal_context_bits, .position_bits = model_properties.position_bits,
.literal_position_bits = literal_position_bits,
.position_bits = position_bits,
.dictionary_size = dictionary_size(), .dictionary_size = dictionary_size(),
.uncompressed_size = uncompressed_size(), .uncompressed_size = uncompressed_size(),
}; };

View file

@ -17,6 +17,12 @@ namespace Compress {
// This implementation is mostly based on the LZMA specification contained in the 7-Zip SDK, which has been placed in the public domain. // This implementation is mostly based on the LZMA specification contained in the 7-Zip SDK, which has been placed in the public domain.
// LZMA Specification Draft (2015): https://www.7-zip.org/a/lzma-specification.7z // LZMA Specification Draft (2015): https://www.7-zip.org/a/lzma-specification.7z
struct LzmaModelProperties {
u8 literal_context_bits;
u8 literal_position_bits;
u8 position_bits;
};
struct LzmaDecompressorOptions { struct LzmaDecompressorOptions {
u8 literal_context_bits { 0 }; u8 literal_context_bits { 0 };
u8 literal_position_bits { 0 }; u8 literal_position_bits { 0 };
@ -32,10 +38,10 @@ struct [[gnu::packed]] LzmaHeader {
ErrorOr<LzmaDecompressorOptions> as_decompressor_options() const; ErrorOr<LzmaDecompressorOptions> as_decompressor_options() const;
private: static ErrorOr<LzmaModelProperties> decode_model_properties(u8 input_bits);
ErrorOr<void> decode_model_properties(u8& literal_context_bits, u8& literal_pos_bits, u8& pos_bits) const;
u8 m_model_properties; private:
u8 m_encoded_model_properties;
u32 m_dictionary_size; u32 m_dictionary_size;
u64 m_uncompressed_size; u64 m_uncompressed_size;
}; };