aboutsummaryrefslogtreecommitdiff
path: root/util/cbfstool/compress.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/cbfstool/compress.c')
-rw-r--r--util/cbfstool/compress.c41
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;