16 #include <lzo/lzoconf.h>
17 #include <lzo/lzoutil.h>
18 #include <lzo/lzo1x.h>
37 using namespace shogun;
46 uint8_t* &compressed, uint64_t &compressed_size, int32_t level)
48 uint64_t initial_buffer_size=0;
50 if (uncompressed_size==0)
61 initial_buffer_size=uncompressed_size;
62 compressed_size=uncompressed_size;
63 compressed=SG_MALLOC(uint8_t, compressed_size);
64 memcpy(compressed, uncompressed, uncompressed_size);
70 if (lzo_init() != LZO_E_OK)
71 SG_ERROR(
"Error initializing LZO Compression\n")
73 lzo_bytep lzo_wrkmem = (lzo_bytep) lzo_malloc(LZO1X_999_MEM_COMPRESS);
75 SG_ERROR(
"Error allocating LZO workmem\n")
77 initial_buffer_size=uncompressed_size +
78 uncompressed_size / 16+ 64 + 3;
80 compressed_size=initial_buffer_size;
81 compressed=SG_MALLOC(uint8_t, initial_buffer_size);
83 lzo_uint lzo_size=compressed_size;
88 ret=lzo1x_1_15_compress(uncompressed, uncompressed_size,
89 compressed, &lzo_size, lzo_wrkmem);
93 ret=lzo1x_999_compress(uncompressed, uncompressed_size,
94 compressed, &lzo_size, lzo_wrkmem);
97 compressed_size=lzo_size;
101 SG_ERROR(
"Error lzo-compressing data\n")
109 initial_buffer_size=1.001*uncompressed_size + 12;
110 compressed_size=initial_buffer_size;
111 compressed=SG_MALLOC(uint8_t, initial_buffer_size);
112 uLongf gz_size=compressed_size;
114 if (compress2(compressed, &gz_size, uncompressed,
115 uncompressed_size, level) != Z_OK)
117 SG_ERROR(
"Error gzip-compressing data\n")
119 compressed_size=gz_size;
130 initial_buffer_size=1.01*uncompressed_size + 600;
131 compressed_size=initial_buffer_size;
132 compressed=SG_MALLOC(uint8_t, initial_buffer_size);
133 if (BZ2_bzCompressInit(&strm, level, 0, 0)!=BZ_OK)
134 SG_ERROR(
"Error initializing bzip2 compressor\n")
136 strm.next_in=(
char*) uncompressed;
137 strm.avail_in=(
unsigned int) uncompressed_size;
138 strm.next_out=(
char*) compressed;
139 strm.avail_out=(
unsigned int) compressed_size;
140 if (BZ2_bzCompress(&strm, BZ_RUN) != BZ_RUN_OK)
141 SG_ERROR(
"Error bzip2-compressing data (BZ_RUN)\n")
146 ret=BZ2_bzCompress(&strm, BZ_FINISH);
147 if (ret==BZ_FINISH_OK)
149 if (ret==BZ_STREAM_END)
152 SG_ERROR(
"Error bzip2-compressing data (BZ_FINISH)\n")
154 BZ2_bzCompressEnd(&strm);
155 compressed_size=(((uint64_t) strm.total_out_hi32) << 32) + strm.total_out_lo32;
162 lzma_stream strm = LZMA_STREAM_INIT;
163 initial_buffer_size = lzma_stream_buffer_bound(uncompressed_size);
164 compressed_size=initial_buffer_size;
165 compressed=SG_MALLOC(uint8_t, initial_buffer_size);
166 strm.next_in=uncompressed;
167 strm.avail_in=(size_t) uncompressed_size;
168 strm.next_out=compressed;
169 strm.avail_out=(size_t) compressed_size;
171 if (lzma_easy_encoder(&strm, level, LZMA_CHECK_CRC32) != LZMA_OK)
172 SG_ERROR(
"Error initializing lzma compressor\n")
173 if (lzma_code(&strm, LZMA_RUN) != LZMA_OK)
174 SG_ERROR(
"Error lzma-compressing data (LZMA_RUN)\n")
179 ret=lzma_code(&strm, LZMA_FINISH);
182 if (ret==LZMA_STREAM_END)
185 SG_ERROR(
"Error lzma-compressing data (LZMA_FINISH)\n")
188 compressed_size=strm.total_out;
195 compressed=SG_MALLOC(uint8_t, snappy::MaxCompressedLength((
size_t) uncompressed_size));
196 size_t output_length;
197 snappy::RawCompress((
char*) uncompressed,
size_t(uncompressed_size), (
char*) compressed, &output_length);
198 compressed_size=(uint64_t) output_length;
203 SG_ERROR(
"Unknown compression type\n")
207 compressed = SG_REALLOC(uint8_t, compressed, initial_buffer_size, compressed_size);
211 uint8_t* uncompressed, uint64_t& uncompressed_size)
213 if (compressed_size==0)
223 ASSERT(uncompressed_size>=compressed_size)
224 uncompressed_size=compressed_size;
225 memcpy(uncompressed, compressed, uncompressed_size);
231 if (lzo_init() != LZO_E_OK)
232 SG_ERROR(
"Error initializing LZO Compression\n")
234 lzo_bytep lzo_wrkmem = (lzo_bytep) lzo_malloc(LZO1X_999_MEM_COMPRESS);
236 SG_ERROR(
"Error allocating LZO workmem\n")
238 lzo_uint lzo_size=uncompressed_size;
239 if (lzo1x_decompress(compressed, compressed_size, uncompressed,
240 &lzo_size, NULL) != LZO_E_OK)
242 SG_ERROR(
"Error uncompressing lzo-data\n")
244 uncompressed_size=lzo_size;
246 lzo_free(lzo_wrkmem);
253 uLongf gz_size=uncompressed_size;
254 if (uncompress(uncompressed, &gz_size, compressed,
255 compressed_size) != Z_OK)
257 SG_ERROR(
"Error uncompressing gzip-data\n")
259 uncompressed_size=gz_size;
270 if (BZ2_bzDecompressInit(&strm, 0, 0)!=BZ_OK)
271 SG_ERROR(
"Error initializing bzip2 decompressor\n")
272 strm.next_in=(
char*) compressed;
273 strm.avail_in=(
unsigned int) compressed_size;
274 strm.next_out=(
char*) uncompressed;
275 strm.avail_out=(
unsigned int) uncompressed_size;
276 if (BZ2_bzDecompress(&strm) != BZ_STREAM_END || strm.avail_in!=0)
277 SG_ERROR(
"Error uncompressing bzip2-data\n")
278 BZ2_bzDecompressEnd(&strm);
285 lzma_stream strm = LZMA_STREAM_INIT;
286 strm.next_in=compressed;
287 strm.avail_in=(size_t) compressed_size;
288 strm.next_out=uncompressed;
289 strm.avail_out=(size_t) uncompressed_size;
291 uint64_t memory_limit=lzma_easy_decoder_memusage(9);
293 if (lzma_stream_decoder(&strm, memory_limit, 0)!= LZMA_OK)
294 SG_ERROR(
"Error initializing lzma decompressor\n")
295 if (lzma_code(&strm, LZMA_RUN) != LZMA_STREAM_END)
296 SG_ERROR(
"Error decompressing lzma data\n")
304 size_t uncompressed_length;
305 if (!snappy::GetUncompressedLength( (
char*) compressed,
306 (
size_t) compressed_size, &uncompressed_length))
307 SG_ERROR(
"Error obtaining uncompressed length\n")
309 ASSERT(uncompressed_length<=uncompressed_size)
310 uncompressed_size=uncompressed_length;
311 if (!snappy::RawUncompress((
char*) compressed,
312 (
size_t) compressed_size,
313 (
char*) uncompressed))
314 SG_ERROR(
"Error uncompressing snappy data\n")
320 SG_ERROR(
"Unknown compression type\n")