For DiscImageChef format, if compressed block is bigger than uncompressed, store uncompressed.

This commit is contained in:
2018-01-30 08:01:24 +00:00
parent d578ca5230
commit 1736e672dc

View File

@@ -189,6 +189,7 @@ namespace DiscImageChef.DiscImages
ulong[] userDataDdt; ulong[] userDataDdt;
bool writingLong; bool writingLong;
bool deduplicate; bool deduplicate;
MemoryStream decompressedStream;
public DiscImageChef() public DiscImageChef()
{ {
@@ -2688,13 +2689,24 @@ namespace DiscImageChef.DiscImages
lzmaProperties = lzmaBlockStream.Properties; lzmaProperties = lzmaBlockStream.Properties;
lzmaBlockStream.Close(); lzmaBlockStream.Close();
cmpCrc64Context.Update(lzmaProperties); cmpCrc64Context.Update(lzmaProperties);
if(blockStream.Length > decompressedStream.Length)
currentBlockHeader.compression = CompressionType.None;
}
if(currentBlockHeader.compression == CompressionType.None)
{
blockStream = decompressedStream;
currentBlockHeader.cmpCrc64 = currentBlockHeader.crc64;
}
else
{
cmpCrc64Context.Update(blockStream.ToArray());
currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64Context.Final(), 0);
} }
currentBlockHeader.cmpLength = (uint)blockStream.Length; currentBlockHeader.cmpLength = (uint)blockStream.Length;
if(currentBlockHeader.compression == CompressionType.Lzma) if(currentBlockHeader.compression == CompressionType.Lzma)
currentBlockHeader.cmpLength += LZMA_PROPERTIES_LENGTH; currentBlockHeader.cmpLength += LZMA_PROPERTIES_LENGTH;
cmpCrc64Context.Update(blockStream.ToArray());
currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64Context.Final(), 0);
index.Add(new IndexEntry index.Add(new IndexEntry
{ {
@@ -2712,6 +2724,7 @@ namespace DiscImageChef.DiscImages
structureBytes = null; structureBytes = null;
if(currentBlockHeader.compression == CompressionType.Lzma) if(currentBlockHeader.compression == CompressionType.Lzma)
imageStream.Write(lzmaProperties, 0, lzmaProperties.Length); imageStream.Write(lzmaProperties, 0, lzmaProperties.Length);
imageStream.Write(blockStream.ToArray(), 0, (int)blockStream.Length); imageStream.Write(blockStream.ToArray(), 0, (int)blockStream.Length);
blockStream = null; blockStream = null;
currentBlockOffset = 0; currentBlockOffset = 0;
@@ -2732,6 +2745,7 @@ namespace DiscImageChef.DiscImages
currentBlockHeader.compression = CompressionType.Flac; currentBlockHeader.compression = CompressionType.Flac;
blockStream = new MemoryStream(); blockStream = new MemoryStream();
decompressedStream = new MemoryStream();
if(currentBlockHeader.compression == CompressionType.Flac) if(currentBlockHeader.compression == CompressionType.Flac)
flakeWriter = new FlakeWriter("", blockStream, flakeWriterSettings) {DoSeekTable = false}; flakeWriter = new FlakeWriter("", blockStream, flakeWriterSettings) {DoSeekTable = false};
else lzmaBlockStream = new LzmaStream(lzmaEncoderProperties, false, blockStream); else lzmaBlockStream = new LzmaStream(lzmaEncoderProperties, false, blockStream);
@@ -2747,7 +2761,11 @@ namespace DiscImageChef.DiscImages
AudioBuffer audioBuffer = new AudioBuffer(AudioPCMConfig.RedBook, data, SAMPLES_PER_SECTOR); AudioBuffer audioBuffer = new AudioBuffer(AudioPCMConfig.RedBook, data, SAMPLES_PER_SECTOR);
flakeWriter.Write(audioBuffer); flakeWriter.Write(audioBuffer);
} }
else lzmaBlockStream.Write(data, 0, data.Length); else
{
decompressedStream.Write(data, 0, data.Length);
lzmaBlockStream.Write(data, 0, data.Length);
}
SetDdtEntry(sectorAddress, ddtEntry); SetDdtEntry(sectorAddress, ddtEntry);
crc64.Update(data); crc64.Update(data);
@@ -3093,14 +3111,24 @@ namespace DiscImageChef.DiscImages
{ {
lzmaProperties = lzmaBlockStream.Properties; lzmaProperties = lzmaBlockStream.Properties;
lzmaBlockStream.Close(); lzmaBlockStream.Close();
cmpCrc64Context.Update(lzmaProperties); if(blockStream.Length > decompressedStream.Length)
currentBlockHeader.compression = CompressionType.None;
}
if(currentBlockHeader.compression == CompressionType.None)
{
blockStream = decompressedStream;
currentBlockHeader.cmpCrc64 = currentBlockHeader.crc64;
}
else
{
cmpCrc64Context.Update(blockStream.ToArray());
currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64Context.Final(), 0);
} }
currentBlockHeader.cmpLength = (uint)blockStream.Length; currentBlockHeader.cmpLength = (uint)blockStream.Length;
if(currentBlockHeader.compression == CompressionType.Lzma) if(currentBlockHeader.compression == CompressionType.Lzma)
currentBlockHeader.cmpLength += LZMA_PROPERTIES_LENGTH; currentBlockHeader.cmpLength += LZMA_PROPERTIES_LENGTH;
cmpCrc64Context.Update(blockStream.ToArray());
currentBlockHeader.cmpCrc64 = BitConverter.ToUInt64(cmpCrc64Context.Final(), 0);
index.Add(new IndexEntry index.Add(new IndexEntry
{ {