Skip to content
Snippets Groups Projects
Commit af1f038e authored by theazgra's avatar theazgra
Browse files

Added basic lzma.

parent 4d401199
No related branches found
No related tags found
No related merge requests found
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
- [x] gZip (zLib, huffman deflate combination) - [x] gZip (zLib, huffman deflate combination)
- [ ] Save all different results at different settings, use different `Compression strategy` - [ ] Save all different results at different settings, use different `Compression strategy`
- [ ] bzip2 - [ ] bzip2
- [ ] LZMA (7-zip)
- [ ] Different presets and `extreme` preset http://www.manpagez.com/man/1/lzma/
- [ ] deflate - [ ] deflate
- [ ] *B3D cuda library* - [ ] *B3D cuda library*
- [ ] Look at *Image difference* - [ ] Look at *Image difference*
...@@ -60,4 +62,4 @@ Later on, we can extend our program to handle more things from the file, like: ...@@ -60,4 +62,4 @@ Later on, we can extend our program to handle more things from the file, like:
## Image difference ## Image difference
- Find difference between included images. - Find difference between included images.
- Plot those differences and find out if certain images aren't same, just positioned little bit differently - Plot those differences and find out if certain images aren't same, just positioned little bit differently
- *Pattern matching* - Find if there are some patterns in image sets. - *Pattern matching* - Find if there are some patterns in image sets.
\ No newline at end of file
...@@ -15,13 +15,27 @@ find_package(Boost REQUIRED COMPONENTS filesystem locale) ...@@ -15,13 +15,27 @@ find_package(Boost REQUIRED COMPONENTS filesystem locale)
if(Boost_FOUND) if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS}) include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(czi-parser ${Boost_LIBRARIES}) target_link_libraries(czi-parser ${Boost_LIBRARIES})
message("LINKED BOOST")
endif() endif()
find_package (Threads) find_package (Threads)
target_link_libraries (czi-parser ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (czi-parser ${CMAKE_THREAD_LIBS_INIT})
find_package(ZLIB) find_package(ZLIB)
if(ZLIB_FOUND)
target_link_libraries(czi-parser ${ZLIB_LIBRARIES}) target_link_libraries(czi-parser ${ZLIB_LIBRARIES})
message("LINKED ZLIB")
endif(ZLIB_FOUND)
find_package(LibLZMA)
if (LIBLZMA_FOUND)
include_directories(${LIBLZMA_INCLUDE_DIRS})
target_link_libraries(czi-parser ${LIBLZMA_LIBRARIES})
message("LINKED LIBLZMA")
endif()
set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
......
...@@ -8,11 +8,23 @@ namespace library_zlib ...@@ -8,11 +8,23 @@ namespace library_zlib
#include <zlib.h> #include <zlib.h>
}; };
namespace library_lzma
{
#include <lzma.h>
};
enum CompressionMethod enum CompressionMethod
{ {
CompressionMethod_RLE, CompressionMethod_RLE,
CompressionMethod_LZ, CompressionMethod_LZ,
CompressionMethod_GZIP CompressionMethod_GZIP,
CompressionMethod_LZMA,
};
struct CompressionSettings
{
size_t lzmaPreset = LZMA_PRESET_DEFAULT; //LZMA_PRESET_EXTREME;
bool lzmaExtreme = false;
}; };
struct CompressionResult struct CompressionResult
...@@ -48,7 +60,7 @@ inline float compression_ratio(float uncompressedSize, float compressedSize) ...@@ -48,7 +60,7 @@ inline float compression_ratio(float uncompressedSize, float compressedSize)
return (uncompressedSize / compressedSize); return (uncompressedSize / compressedSize);
} }
ByteArray gzip_encode(const std::vector<byte> &data) ByteArray gzip_encode(const std::vector<byte> &data, CompressionSettings settings)
{ {
size_t compressedSize = library_zlib::compressBound(data.size()); size_t compressedSize = library_zlib::compressBound(data.size());
ByteArray compressedBuffer; ByteArray compressedBuffer;
...@@ -80,6 +92,48 @@ ByteArray gzip_encode(const std::vector<byte> &data) ...@@ -80,6 +92,48 @@ ByteArray gzip_encode(const std::vector<byte> &data)
return actualCompressedData; return actualCompressedData;
} }
ByteArray lzma_encode(const std::vector<byte> &data, CompressionSettings settings)
{
size_t maximumSize = library_lzma::lzma_stream_buffer_bound(data.size());
ByteArray buffer;
buffer.resize(maximumSize);
size_t finalSize = 0;
auto compressionResult = library_lzma::lzma_easy_buffer_encode(settings.lzmaPreset, library_lzma::LZMA_CHECK_NONE,
nullptr, data.data(), data.size(),
buffer.data(), &finalSize, maximumSize);
switch (compressionResult)
{
case library_lzma::LZMA_MEM_ERROR:
printf(RED "Unable to allocate memory!\n" RESET);
break;
case library_lzma::LZMA_MEMLIMIT_ERROR:
printf(RED "Memory limit was reached!\n" RESET);
break;
case library_lzma::LZMA_BUF_ERROR:
printf(RED "Cannot consume input buffer!\n" RESET);
break;
case library_lzma::LZMA_PROG_ERROR:
printf(RED "Wrong arguments!\n" RESET);
break;
// To make GCC with -Wall happy.
case library_lzma::LZMA_OK:
case library_lzma::LZMA_STREAM_END:
case library_lzma::LZMA_NO_CHECK:
case library_lzma::LZMA_UNSUPPORTED_CHECK:
case library_lzma::LZMA_GET_CHECK:
case library_lzma::LZMA_FORMAT_ERROR:
case library_lzma::LZMA_OPTIONS_ERROR:
case library_lzma::LZMA_DATA_ERROR:
break;
}
always_assert(compressionResult == library_lzma::LZMA_OK);
ByteArray result(buffer.begin(), buffer.begin() + finalSize);
always_assert(result.size() == finalSize);
return result;
}
// Run-Length encode bytes and return compressed bytes. // Run-Length encode bytes and return compressed bytes.
std::vector<byte> rle_encode(const std::vector<byte> &bytes) std::vector<byte> rle_encode(const std::vector<byte> &bytes)
{ {
...@@ -328,7 +382,7 @@ void comp_test() ...@@ -328,7 +382,7 @@ void comp_test()
always_assert(same && "Error in compression!"); always_assert(same && "Error in compression!");
} }
CompressionResult test_compression_method(const ByteArray &data, CompressionMethod method) CompressionResult test_compression_method(const ByteArray &data, CompressionMethod method, CompressionSettings settings)
{ {
ByteArray compressedData; ByteArray compressedData;
switch (method) switch (method)
...@@ -340,7 +394,10 @@ CompressionResult test_compression_method(const ByteArray &data, CompressionMeth ...@@ -340,7 +394,10 @@ CompressionResult test_compression_method(const ByteArray &data, CompressionMeth
compressedData = lz_encode(data); compressedData = lz_encode(data);
break; break;
case CompressionMethod_GZIP: case CompressionMethod_GZIP:
compressedData = gzip_encode(data); compressedData = gzip_encode(data, settings);
break;
case CompressionMethod_LZMA:
compressedData = lzma_encode(data, settings);
break; break;
default: default:
INVALID_CASE; INVALID_CASE;
......
...@@ -423,6 +423,9 @@ void CziFile::test_compression(CompressionMethod method, bool verbose) const ...@@ -423,6 +423,9 @@ void CziFile::test_compression(CompressionMethod method, bool verbose) const
case CompressionMethod_GZIP: case CompressionMethod_GZIP:
printf("Selected compression: GZIP (zlib)\n"); printf("Selected compression: GZIP (zlib)\n");
break; break;
case CompressionMethod_LZMA:
printf("Selected compression: LZMA (2?)\n");
break;
default: default:
INVALID_CASE; INVALID_CASE;
return; return;
...@@ -431,13 +434,15 @@ void CziFile::test_compression(CompressionMethod method, bool verbose) const ...@@ -431,13 +434,15 @@ void CziFile::test_compression(CompressionMethod method, bool verbose) const
CompressionResult overallN; CompressionResult overallN;
CompressionResult overallZ; CompressionResult overallZ;
//TODO: Use settings.
CompressionSettings settings;
for (size_t i = 0; i < subBlockDirectory.entries.size(); i++) for (size_t i = 0; i < subBlockDirectory.entries.size(); i++)
{ {
auto data = get_image_data(i, false); auto data = get_image_data(i, false);
auto dataZ = get_image_data(i, true); auto dataZ = get_image_data(i, true);
CompressionResult nResult = test_compression_method(data, method); CompressionResult nResult = test_compression_method(data, method, settings);
CompressionResult zResult = test_compression_method(dataZ, method); CompressionResult zResult = test_compression_method(dataZ, method, settings);
overallN.compressionRatio += nResult.compressionRatio; overallN.compressionRatio += nResult.compressionRatio;
overallZ.compressionRatio += zResult.compressionRatio; overallZ.compressionRatio += zResult.compressionRatio;
......
...@@ -24,6 +24,7 @@ int main(int argc, char **argv) ...@@ -24,6 +24,7 @@ int main(int argc, char **argv)
args::Flag rleCompressionOption(compressionGroup, "RLE", "RLE compression", {"rle"}); args::Flag rleCompressionOption(compressionGroup, "RLE", "RLE compression", {"rle"});
args::Flag lzCompressionOption(compressionGroup, "LZ", "LZ compression", {"lz"}); args::Flag lzCompressionOption(compressionGroup, "LZ", "LZ compression", {"lz"});
args::Flag gzipCompressionOption(compressionGroup, "GZIP", "GZIP (zlib) compression", {"gzip"}); args::Flag gzipCompressionOption(compressionGroup, "GZIP", "GZIP (zlib) compression", {"gzip"});
args::Flag lzmaCompressionOption(compressionGroup, "LZMA", "LZMA (2?) compression", {"lzma"});
try try
{ {
...@@ -58,6 +59,8 @@ int main(int argc, char **argv) ...@@ -58,6 +59,8 @@ int main(int argc, char **argv)
cm = CompressionMethod_LZ; cm = CompressionMethod_LZ;
else if (gzipCompressionOption) else if (gzipCompressionOption)
cm = CompressionMethod_GZIP; cm = CompressionMethod_GZIP;
else if (lzmaCompressionOption)
cm = CompressionMethod_LZMA;
parsedFile.test_compression(cm, verboseOption.Matched()); parsedFile.test_compression(cm, verboseOption.Matched());
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment