3535#include "deps/zx/zx7/zx7.h"
3636#include "deps/zx/zx0/zx0.h"
3737#include "deps/lz4/lib/lz4.h"
38+ #include "deps/lz4/lib/lz4hc.h"
3839
40+ #include <stdbool.h>
3941#include <string.h>
4042
4143#define LZ4_SIZE_PREFIX_BYTES 3
@@ -98,7 +100,7 @@ static uint8_t *compress_zx0(void *data, size_t *size)
98100 return compressed_data ;
99101}
100102
101- static uint8_t * compress_lz4 (void * data , size_t * size )
103+ static uint8_t * compress_lz4_block (void * data , size_t * size , bool high_compression )
102104{
103105 uint8_t * compressed_data ;
104106 const char * input ;
@@ -130,8 +132,16 @@ static uint8_t *compress_lz4(void *data, size_t *size)
130132 return NULL ;
131133 }
132134
133- compressed_size = LZ4_compress_default (input , (char * )(compressed_data + LZ4_SIZE_PREFIX_BYTES ),
134- input_size , max_compressed_size );
135+ if (high_compression )
136+ {
137+ compressed_size = LZ4_compress_HC (input , (char * )(compressed_data + LZ4_SIZE_PREFIX_BYTES ),
138+ input_size , max_compressed_size , LZ4HC_CLEVEL_MAX );
139+ }
140+ else
141+ {
142+ compressed_size = LZ4_compress_default (input , (char * )(compressed_data + LZ4_SIZE_PREFIX_BYTES ),
143+ input_size , max_compressed_size );
144+ }
135145
136146 if (compressed_size <= 0 )
137147 {
@@ -152,13 +162,24 @@ static uint8_t *compress_lz4(void *data, size_t *size)
152162 compressed_data [2 ] = (uint8_t )((compressed_size >> 16 ) & 0xFF );
153163
154164 total_size = (size_t )compressed_size + LZ4_SIZE_PREFIX_BYTES ;
155- LOG_DEBUG ("Compressed size: %zu -> %zu (lz4 block)\n" , orig_size , total_size );
165+ LOG_DEBUG ("Compressed size: %zu -> %zu (lz4%s block)\n" ,
166+ orig_size , total_size , high_compression ? "hc" : "" );
156167
157168 * size = total_size ;
158169
159170 return compressed_data ;
160171}
161172
173+ static uint8_t * compress_lz4 (void * data , size_t * size )
174+ {
175+ return compress_lz4_block (data , size , false);
176+ }
177+
178+ static uint8_t * compress_lz4hc (void * data , size_t * size )
179+ {
180+ return compress_lz4_block (data , size , true);
181+ }
182+
162183uint8_t * compress_array (uint8_t * data , size_t * size , compress_mode_t mode )
163184{
164185 switch (mode )
@@ -172,6 +193,9 @@ uint8_t *compress_array(uint8_t *data, size_t *size, compress_mode_t mode)
172193 case COMPRESS_LZ4 :
173194 return compress_lz4 (data , size );
174195
196+ case COMPRESS_LZ4HC :
197+ return compress_lz4hc (data , size );
198+
175199 default :
176200 return NULL ;
177201 }
0 commit comments