}
bool LZMA2Codec::doNeedsUncompressedLength() const {
- return !encodeSize();
+ return false;
}
uint64_t LZMA2Codec::doMaxUncompressedLength() const {
SCOPE_EXIT { lzma_end(&stream); };
// Max 64MiB in one go
- constexpr uint32_t maxSingleStepLength = uint32_t(64) << 20; // 64MiB
- constexpr uint32_t defaultBufferLength = uint32_t(4) << 20; // 4MiB
+ constexpr uint32_t maxSingleStepLength = uint32_t(64) << 20; // 64MiB
+ constexpr uint32_t defaultBufferLength = uint32_t(256) << 10; // 256 KiB
folly::io::Cursor cursor(data);
- uint64_t actualUncompressedLength;
if (encodeSize()) {
- actualUncompressedLength = decodeVarintFromCursor(cursor);
+ const uint64_t actualUncompressedLength = decodeVarintFromCursor(cursor);
if (uncompressedLength != UNKNOWN_UNCOMPRESSED_LENGTH &&
uncompressedLength != actualUncompressedLength) {
throw std::runtime_error("LZMA2Codec: invalid uncompressed length");
}
- } else {
- actualUncompressedLength = uncompressedLength;
- DCHECK_NE(actualUncompressedLength, UNKNOWN_UNCOMPRESSED_LENGTH);
+ uncompressedLength = actualUncompressedLength;
}
auto out = addOutputBuffer(
&stream,
- (actualUncompressedLength <= maxSingleStepLength ?
- actualUncompressedLength :
- defaultBufferLength));
+ ((uncompressedLength != UNKNOWN_UNCOMPRESSED_LENGTH &&
+ uncompressedLength <= maxSingleStepLength)
+ ? uncompressedLength
+ : defaultBufferLength));
bool streamEnd = false;
auto buf = cursor.peekBytes();
out->prev()->trimEnd(stream.avail_out);
- if (actualUncompressedLength != stream.total_out) {
- throw std::runtime_error(to<std::string>(
- "LZMA2Codec: invalid uncompressed length"));
+ if (uncompressedLength != UNKNOWN_UNCOMPRESSED_LENGTH &&
+ uncompressedLength != stream.total_out) {
+ throw std::runtime_error(
+ to<std::string>("LZMA2Codec: invalid uncompressed length"));
}
return out;
{ CodecType::SNAPPY, false },
{ CodecType::ZLIB, false },
{ CodecType::LZ4_VARINT_SIZE, false },
- { CodecType::LZMA2, true },
+ { CodecType::LZMA2, false },
{ CodecType::LZMA2_VARINT_SIZE, false },
{ CodecType::ZSTD, false },
{ CodecType::GZIP, false },
supportedCodecs({
CodecType::SNAPPY,
CodecType::ZLIB,
+ CodecType::LZMA2,
CodecType::ZSTD,
CodecType::LZ4_FRAME,
})));