Skip to content

Commit

Permalink
Fusionado en feature/zlib_streams_compression (solicitud de integración
Browse files Browse the repository at this point in the history
#4)

Feature/zlib streams compression
  • Loading branch information
Danixu committed Jul 6, 2021
2 parents dfac19a + ed92e0b commit 013c8ef
Show file tree
Hide file tree
Showing 7 changed files with 517 additions and 92 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ ecmtool:

# Compile the Linux release
mkdir -p release/linux
g++ -o release/linux/$@ ecmtool.cpp sector_tools.cpp -Lzlib-${zlib_version} -lzlinux -Izlib-${zlib_version}
g++ -o release/linux/$@ ecmtool.cpp compressor.cpp sector_tools.cpp -Lzlib-${zlib_version} -lzlinux -Izlib-${zlib_version}

# Clean the zlib directory at end
make -C zlib-${zlib_version} -f Makefile.linux clean
Expand All @@ -23,7 +23,7 @@ ecmtool.exe:

# Compile the Win64 release
mkdir -p release/win64
x86_64-w64-mingw32-g++ -O2 -ffunction-sections -Wl,-gc-sections -static-libstdc++ -s -o release/win64/$@ ecmtool.cpp sector_tools.cpp -Izlib-${zlib_version} zlib-${zlib_version}/libzwindows.a
x86_64-w64-mingw32-g++ -O2 -ffunction-sections -Wl,-gc-sections -static-libstdc++ -s -o release/win64/$@ ecmtool.cpp compressor.cpp sector_tools.cpp -Izlib-${zlib_version} zlib-${zlib_version}/libzwindows.a

# Clean the zlib directory at end
make -C zlib-${zlib_version} -f Makefile.win clean
Expand Down
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,24 @@ By Daniel Carrasco (https://www.electrosoftcloud.com)

# Changelog

### 20210706

* Added a "block size" header to help to the random seek decoder to know how many sectors there are in every block
* Added compression level option to program
* Fixed a bug in zlib compression in encoding phase
* Fixed a bug in zlib compression in decoding phase
* Now zlib compression is fully working
* Updated help message
* Fixed a bug in stream change detection

### 20210705

* Added zlib compression to decoding (Not working yet because need more fixes)

### 20210704

* New ECM file version. This version improves the way the data is stored to allow better random access
* Added zlib compression to encoding (Not working yet because must be implemented in decoding too)

### 20210627

Expand Down
111 changes: 111 additions & 0 deletions compressor.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#include <stdexcept>
#include "compressor.h"

compressor::compressor(sector_tools_compression mode, bool is_compression, int8_t comp_level) {
comp_mode = mode;
compression = is_compression;
// Class initialzer
if (mode == C_DATA_ZLIB) {
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;

int ret;
if (is_compression) {
ret = deflateInit(&strm, comp_level);
}
else {
ret = inflateInit(&strm);
}

if (ret != Z_OK) {
//throw std::runtime_error("Error initializing the zlib compressor/decompressor.");
}
}
}


int8_t compressor::set_input(uint8_t* in, size_t &in_size){
if (!compression) {
if (comp_mode == C_DATA_ZLIB) {
strm.avail_in = in_size;
strm.next_in = in;

return 0;
}

return 0;
}
else {
//throw std::runtime_error("Trying to use a decompression object to compress.");
return -1;
}
}


int8_t compressor::set_output(uint8_t* out, size_t &out_size){
if (compression) {
if (comp_mode == C_DATA_ZLIB) {
strm.avail_out = out_size;
strm.next_out = out;

return 0;
}

return 0;
}
else {
//throw std::runtime_error("Trying to use a decompression object to compress.");
return -1;
}
}


int8_t compressor::compress(size_t &out_size, uint8_t* in, size_t in_size, uint8_t flusmode){
if (compression) {
if (comp_mode == C_DATA_ZLIB) {
strm.avail_in = in_size;
strm.next_in = in;

int8_t return_code = deflate(&strm, flusmode);

out_size = strm.avail_out;
return return_code;
}

return 0;
}
else {
//throw std::runtime_error("Trying to use a decompression object to compress.");
return -1;
}
}

int8_t compressor::decompress(uint8_t* out, size_t out_size, size_t &in_size, uint8_t flusmode){
if (!compression) {
if (comp_mode == C_DATA_ZLIB) {
strm.avail_out = out_size;
strm.next_out = out;
int8_t return_code = inflate(&strm, flusmode);

in_size = strm.avail_in;
return return_code;
}

return 0;
}
else {
//throw std::runtime_error("Trying to use a compression object to decompress.");
return -1;
}
}

int8_t compressor::close(){
if (compression) {
(void)deflateEnd(&strm);
}
else {
(void)inflateEnd(&strm);
}
return 0;
}
40 changes: 40 additions & 0 deletions compressor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include <stdint.h>
#include "zlib.h"

//
// Stream types detectable by the class
//
enum sector_tools_compression : uint8_t {
C_NONE = 0,
C_AUDIO_FLAC,
C_AUDIO_APE,
C_AUDIO_WAVPACK,
C_DATA_ZLIB = 1,
C_DATA_LZMA,
C_DATA_BZ2,
C_DATA_LZ4
};

//
// compressor Class
//
class compressor {
public:
// Public methods
compressor(sector_tools_compression mode, bool is_compression, int8_t comp_level = -1);

int8_t set_input(uint8_t* in, size_t &in_size);
int8_t set_output(uint8_t* out, size_t &out_size);
int8_t compress(size_t &out_size, uint8_t* in, size_t in_size, uint8_t flusmode = Z_NO_FLUSH);
int8_t decompress(uint8_t* out, size_t out_size, size_t &in_size, uint8_t flusmode);
size_t data_left_in() { return strm.avail_in; };
size_t data_left_out() {return strm.avail_out; };

int8_t close();

private:
// zlib object
z_stream strm;
sector_tools_compression comp_mode;
bool compression;
};
Loading

0 comments on commit 013c8ef

Please sign in to comment.