Merge pull request #10743 from tellowkrinkle/LargeBlockRVZ

Fix creation of rvz with > 2mb chunk size
This commit is contained in:
JMC47 2022-06-14 16:17:24 -04:00 committed by GitHub
commit 431d757151
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 10 deletions

View File

@ -1142,8 +1142,8 @@ static bool AllSame(const u8* begin, const u8* end)
template <typename OutputParametersEntry>
static void RVZPack(const u8* in, OutputParametersEntry* out, u64 bytes_per_chunk, size_t chunks,
u64 total_size, u64 data_offset, u64 in_offset, bool multipart,
bool allow_junk_reuse, bool compression, const FileSystem* file_system)
u64 total_size, u64 data_offset, bool multipart, bool allow_junk_reuse,
bool compression, const FileSystem* file_system)
{
using Seed = std::array<u32, LaggedFibonacciGenerator::SEED_SIZE>;
struct JunkInfo
@ -1162,7 +1162,7 @@ static void RVZPack(const u8* in, OutputParametersEntry* out, u64 bytes_per_chun
{
// Skip the 0 to 32 zero bytes that typically come after a file
size_t zeroes = 0;
while (position + zeroes < total_size && in[in_offset + position + zeroes] == 0)
while (position + zeroes < total_size && in[position + zeroes] == 0)
++zeroes;
// If there are very many zero bytes (perhaps the PRNG junk data has been scrubbed?)
@ -1182,7 +1182,7 @@ static void RVZPack(const u8* in, OutputParametersEntry* out, u64 bytes_per_chun
Seed seed;
const size_t bytes_reconstructed = LaggedFibonacciGenerator::GetSeed(
in + in_offset + position, bytes_to_read, data_offset_mod, seed.data());
in + position, bytes_to_read, data_offset_mod, seed.data());
if (bytes_reconstructed > 0)
junk_info.emplace(position + bytes_reconstructed, JunkInfo{position, seed});
@ -1248,7 +1248,7 @@ static void RVZPack(const u8* in, OutputParametersEntry* out, u64 bytes_per_chun
if (next_junk_start == end_offset)
{
// Storing this chunk without RVZ packing would be inefficient, so store it without
PushBack(&entry.main_data, in + in_offset + current_offset, in + in_offset + end_offset);
PushBack(&entry.main_data, in + current_offset, in + end_offset);
break;
}
@ -1258,7 +1258,7 @@ static void RVZPack(const u8* in, OutputParametersEntry* out, u64 bytes_per_chun
const u64 non_junk_bytes = next_junk_start - current_offset;
if (non_junk_bytes > 0)
{
const u8* ptr = in + in_offset + current_offset;
const u8* ptr = in + current_offset;
PushBack(&entry.main_data, Common::swap32(static_cast<u32>(non_junk_bytes)));
PushBack(&entry.main_data, ptr, ptr + non_junk_bytes);
@ -1284,8 +1284,7 @@ template <typename OutputParametersEntry>
static void RVZPack(const u8* in, OutputParametersEntry* out, u64 size, u64 data_offset,
bool allow_junk_reuse, bool compression, const FileSystem* file_system)
{
RVZPack(in, out, size, 1, size, data_offset, 0, false, allow_junk_reuse, compression,
file_system);
RVZPack(in, out, size, 1, size, data_offset, false, allow_junk_reuse, compression, file_system);
}
template <bool RVZ>
@ -1473,8 +1472,8 @@ WIARVZFileReader<RVZ>::ProcessAndCompress(CompressThreadState* state, CompressPa
const u64 data_offset = parameters.data_offset + write_offset_of_group;
RVZPack(state->decryption_buffer[0].data(), output_entries.data() + first_chunk,
bytes_per_chunk, chunks, total_size, data_offset, write_offset_of_group,
groups > 1, allow_junk_reuse, compression, file_system);
bytes_per_chunk, chunks, total_size, data_offset, groups > 1, allow_junk_reuse,
compression, file_system);
}
else
{