| 393 | } |
| 394 | |
| 395 | bool GSDumpLzma::DecompressNextBlock() |
| 396 | { |
| 397 | if (m_block_index == m_blocks.size()) |
| 398 | return false; |
| 399 | |
| 400 | const Block& block = m_blocks[m_block_index]; |
| 401 | |
| 402 | if (block.compressed_size > m_block_read_buffer.size()) |
| 403 | m_block_read_buffer.resize(Common::AlignUpPow2(block.compressed_size, _128kb)); |
| 404 | |
| 405 | if (FileSystem::FSeek64(m_fp.get(), static_cast<s64>(block.file_offset), SEEK_SET) != 0 || |
| 406 | std::fread(m_block_read_buffer.data(), block.compressed_size, 1, m_fp.get()) != 1) |
| 407 | { |
| 408 | Console.ErrorFmt("Failed to read {} bytes from offset {}", block.file_offset, block.compressed_size); |
| 409 | return false; |
| 410 | } |
| 411 | |
| 412 | if (block.uncompressed_size > m_block_buffer.size()) |
| 413 | m_block_buffer.resize(Common::AlignUpPow2(block.uncompressed_size, _128kb)); |
| 414 | |
| 415 | XzUnpacker_Init(&m_unpacker); |
| 416 | m_unpacker.streamFlags = block.stream_flags; |
| 417 | XzUnpacker_PrepareToRandomBlockDecoding(&m_unpacker); |
| 418 | XzUnpacker_SetOutBuf(&m_unpacker, m_block_buffer.data(), block.uncompressed_size); |
| 419 | SizeT out_uncompressed_size = block.uncompressed_size; |
| 420 | SizeT out_compressed_size = block.compressed_size; |
| 421 | |
| 422 | ECoderStatus status; |
| 423 | const SRes res = XzUnpacker_Code(&m_unpacker, nullptr, &out_uncompressed_size, |
| 424 | m_block_read_buffer.data(), &out_compressed_size, true, CODER_FINISH_END, &status); |
| 425 | if (res != SZ_OK || status != CODER_STATUS_FINISHED_WITH_MARK) [[unlikely]] |
| 426 | { |
| 427 | Console.ErrorFmt("XzUnpacker_Code() failed: {} (status {})", res, static_cast<unsigned>(status)); |
| 428 | return false; |
| 429 | } |
| 430 | |
| 431 | if (out_compressed_size != block.compressed_size || out_uncompressed_size != block.uncompressed_size) |
| 432 | { |
| 433 | Console.WarningFmt("Decompress size mismatch: {}/{} vs {}/{}", out_compressed_size, out_uncompressed_size, |
| 434 | block.compressed_size, block.uncompressed_size); |
| 435 | } |
| 436 | |
| 437 | m_block_size = out_uncompressed_size; |
| 438 | m_block_pos = 0; |
| 439 | m_block_index++; |
| 440 | return true; |
| 441 | } |
| 442 | |
| 443 | bool GSDumpLzma::IsEof() |
| 444 | { |
nothing calls this directly
no test coverage detected