MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / DecompressNextBlock

Method DecompressNextBlock

pcsx2/GS/GSLzma.cpp:395–441  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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 {

Callers

nothing calls this directly

Calls 11

AlignUpPow2Function · 0.85
XzUnpacker_InitFunction · 0.85
XzUnpacker_SetOutBufFunction · 0.85
XzUnpacker_CodeFunction · 0.85
sizeMethod · 0.45
resizeMethod · 0.45
getMethod · 0.45
dataMethod · 0.45
ErrorFmtMethod · 0.45
WarningFmtMethod · 0.45

Tested by

no test coverage detected