mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
For DiscImageChef format, if compressed block is bigger than uncompressed, store uncompressed.
This commit is contained in:
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user