diff --git a/Cargo.lock b/Cargo.lock index fc7efa2..99a7c28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -133,7 +133,7 @@ dependencies = [ "impl-trait-for-tuples", "indexmap", "itertools", - "lz4", + "lz4_flex", "mimalloc", "num-traits", "pastey", @@ -709,23 +709,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] -name = "lz4" -version = "1.28.1" +name = "lz4_flex" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" -dependencies = [ - "lz4-sys", -] - -[[package]] -name = "lz4-sys" -version = "1.11.1+lz4-1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" -dependencies = [ - "cc", - "libc", -] +checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" [[package]] name = "manyhow" diff --git a/bff/Cargo.toml b/bff/Cargo.toml index 284e172..5112f52 100644 --- a/bff/Cargo.toml +++ b/bff/Cargo.toml @@ -23,7 +23,7 @@ hound = "3.5.1" impl-trait-for-tuples = "0.2.2" indexmap = { version = "2.0.0", features = ["serde"] } itertools = "0.14.0" -lz4 = "1.24.0" +lz4_flex = { version = "0.11", default-features = false, features = ["std"] } num-traits = "0.2.15" pastey = "0.2.1" petgraph = "0.8.1" diff --git a/bff/src/lz/lz4.rs b/bff/src/lz/lz4.rs index 3ad6683..2cacb0c 100644 --- a/bff/src/lz/lz4.rs +++ b/bff/src/lz/lz4.rs @@ -39,23 +39,7 @@ pub fn lz4_decompress_body_parser( #[binrw::writer(writer)] pub fn lz4_compress_data_writer(data: &[u8]) -> BinResult<()> { // TODO: Not the same parameters used by the game. - let compress_bound = unsafe { lz4::liblz4::LZ4_compressBound(data.len() as i32) as usize }; - let mut compressed_buffer: Vec = Vec::with_capacity(compress_bound); - unsafe { - let result = lz4::liblz4::LZ4_compress_default( - data.as_ptr() as *const i8, - compressed_buffer.as_mut_ptr() as *mut i8, - data.len() as i32, - compressed_buffer.capacity() as i32, - ); - if result < 0 { - return BinResult::Err(binrw::Error::AssertFail { - pos: writer.stream_position()?, - message: format!("LZ4 compression failed with code {}", result), - }); - } - compressed_buffer.set_len(result as usize); - } + let compressed_buffer = lz4_flex::block::compress(data); writer.write_all(&compressed_buffer)?; Ok(()) } @@ -95,22 +79,13 @@ pub fn lz4_decompress_data_parser( if compressed_size != 0 { let compressed_buffer = Vec::::read_args(reader, args! { count: compressed_size as usize })?; - let mut decompressed_buffer: Vec = Vec::with_capacity(decompressed_size as usize); - unsafe { - let result = lz4::liblz4::LZ4_decompress_safe( - compressed_buffer.as_ptr() as *const i8, - decompressed_buffer.as_mut_ptr() as *mut i8, - compressed_size as i32, - decompressed_size as i32, - ); - if result < 0 { - return BinResult::Err(binrw::Error::AssertFail { - pos: reader.stream_position()?, - message: format!("LZ4 decompression failed with code {}", result), - }); - } - decompressed_buffer.set_len(result as usize); - } + let decompressed_buffer = + lz4_flex::block::decompress(&compressed_buffer, decompressed_size as usize).map_err( + |e| binrw::Error::AssertFail { + pos: reader.stream_position().unwrap_or_default(), + message: format!("LZ4 decompression failed: {}", e), + }, + )?; if decompressed_buffer.len() != decompressed_size as usize { return BinResult::Err(binrw::Error::AssertFail { pos: reader.stream_position()?,