diff options
Diffstat (limited to 'util/cbfstool/compress.c')
-rw-r--r-- | util/cbfstool/compress.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/util/cbfstool/compress.c b/util/cbfstool/compress.c index 51353317f4..a6a0df4dd1 100644 --- a/util/cbfstool/compress.c +++ b/util/cbfstool/compress.c @@ -20,7 +20,42 @@ #include <string.h> #include <stdio.h> +#include <stdlib.h> #include "common.h" +#include "lz4/lib/lz4frame.h" +#include <commonlib/compression.h> + +static int lz4_compress(char *in, int in_len, char *out, int *out_len) +{ + LZ4F_preferences_t prefs = { + .compressionLevel = 20, + .frameInfo = { + .blockSizeID = max4MB, + .blockMode = blockIndependent, + .contentChecksumFlag = noContentChecksum, + }, + }; + size_t worst_size = LZ4F_compressFrameBound(in_len, &prefs); + void *bounce = malloc(worst_size); + if (!bounce) + return -1; + *out_len = LZ4F_compressFrame(bounce, worst_size, in, in_len, &prefs); + if (LZ4F_isError(*out_len) || *out_len >= in_len) + return -1; + memcpy(out, bounce, *out_len); + return 0; +} + +static int lz4_decompress(char *in, int in_len, char *out, int out_len, + size_t *actual_size) +{ + size_t result = ulz4fn(in, in_len, out, out_len); + if (result == 0) + return -1; + if (actual_size != NULL) + *actual_size = result; + return 0; +} static int lzma_compress(char *in, int in_len, char *out, int *out_len) { @@ -58,6 +93,9 @@ comp_func_ptr compression_function(enum comp_algo algo) case CBFS_COMPRESS_LZMA: compress = lzma_compress; break; + case CBFS_COMPRESS_LZ4: + compress = lz4_compress; + break; default: ERROR("Unknown compression algorithm %d!\n", algo); return NULL; @@ -75,6 +113,9 @@ decomp_func_ptr decompression_function(enum comp_algo algo) case CBFS_COMPRESS_LZMA: decompress = lzma_decompress; break; + case CBFS_COMPRESS_LZ4: + decompress = lz4_decompress; + break; default: ERROR("Unknown compression algorithm %d!\n", algo); return NULL; |