Compress: Binary-compatible config with OFW

This commit is contained in:
Willy-JL
2024-07-05 18:08:55 +02:00
parent 0ae2a8b437
commit d2561b788e
4 changed files with 16 additions and 22 deletions

View File

@@ -182,9 +182,9 @@ static void compress_test_heatshrink_stream() {
File* dest_file = storage_file_alloc(api); File* dest_file = storage_file_alloc(api);
CompressConfigHeatshrink config = { CompressConfigHeatshrink config = {
.base.input_buffer_sz = 128,
.window_sz2 = 9, .window_sz2 = 9,
.lookahead_sz2 = 4, .lookahead_sz2 = 4,
.input_buffer_sz = 128,
}; };
Compress* compress = compress_alloc(CompressTypeHeatshrink, &config); Compress* compress = compress_alloc(CompressTypeHeatshrink, &config);

View File

@@ -17,9 +17,9 @@
#define COMPRESS_ICON_ENCODED_BUFF_SIZE (256u) #define COMPRESS_ICON_ENCODED_BUFF_SIZE (256u)
const CompressConfigHeatshrink compress_config_heatshrink_default = { const CompressConfigHeatshrink compress_config_heatshrink_default = {
.base.input_buffer_sz = COMPRESS_ICON_ENCODED_BUFF_SIZE,
.window_sz2 = COMPRESS_EXP_BUFF_SIZE_LOG, .window_sz2 = COMPRESS_EXP_BUFF_SIZE_LOG,
.lookahead_sz2 = COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG, .lookahead_sz2 = COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG,
.input_buffer_sz = COMPRESS_ICON_ENCODED_BUFF_SIZE,
}; };
/** Buffer size for input data */ /** Buffer size for input data */
@@ -377,7 +377,7 @@ bool compress_decode(
if(!compress->decoder) { if(!compress->decoder) {
CompressConfigHeatshrink* hs_config = (CompressConfigHeatshrink*)compress->config; CompressConfigHeatshrink* hs_config = (CompressConfigHeatshrink*)compress->config;
compress->decoder = heatshrink_decoder_alloc( compress->decoder = heatshrink_decoder_alloc(
hs_config->base.input_buffer_sz, hs_config->window_sz2, hs_config->lookahead_sz2); hs_config->input_buffer_sz, hs_config->window_sz2, hs_config->lookahead_sz2);
} }
return compress_decode_internal( return compress_decode_internal(
compress->decoder, data_in, data_in_size, data_out, data_out_size, data_res_size); compress->decoder, data_in, data_in_size, data_out, data_out_size, data_res_size);
@@ -392,13 +392,13 @@ bool compress_decode_streamed(
CompressConfigHeatshrink* hs_config = (CompressConfigHeatshrink*)compress->config; CompressConfigHeatshrink* hs_config = (CompressConfigHeatshrink*)compress->config;
if(!compress->decoder) { if(!compress->decoder) {
compress->decoder = heatshrink_decoder_alloc( compress->decoder = heatshrink_decoder_alloc(
hs_config->base.input_buffer_sz, hs_config->window_sz2, hs_config->lookahead_sz2); hs_config->input_buffer_sz, hs_config->window_sz2, hs_config->lookahead_sz2);
} }
heatshrink_decoder_reset(compress->decoder); heatshrink_decoder_reset(compress->decoder);
return compress_decode_stream_internal( return compress_decode_stream_internal(
compress->decoder, compress->decoder,
hs_config->base.input_buffer_sz, hs_config->input_buffer_sz,
read_cb, read_cb,
read_context, read_context,
write_cb, write_cb,
@@ -469,20 +469,20 @@ CompressStreamDecoder* compress_stream_decoder_alloc(
furi_check(type < CompressTypeMAX); furi_check(type < CompressTypeMAX);
furi_check(config); furi_check(config);
const CompressConfigBase* base_config = config;
CompressStreamDecoder* instance = malloc(sizeof(CompressStreamDecoder)); CompressStreamDecoder* instance = malloc(sizeof(CompressStreamDecoder));
instance->type = type; instance->type = type;
instance->stream_position = 0; instance->stream_position = 0;
instance->decode_buffer_size = base_config->input_buffer_sz;
instance->decode_buffer_position = 0; instance->decode_buffer_position = 0;
instance->decode_buffer = malloc(base_config->input_buffer_sz);
instance->read_cb = read_cb; instance->read_cb = read_cb;
instance->read_context = read_context; instance->read_context = read_context;
if(type == CompressTypeHeatshrink) { if(type == CompressTypeHeatshrink) {
const CompressConfigHeatshrink* hs_config = config; const CompressConfigHeatshrink* hs_config = config;
instance->decode_buffer_size = hs_config->input_buffer_sz;
instance->decode_buffer = malloc(hs_config->input_buffer_sz);
heatshrink_decoder* hs_decoder = heatshrink_decoder_alloc( heatshrink_decoder* hs_decoder = heatshrink_decoder_alloc(
base_config->input_buffer_sz, hs_config->window_sz2, hs_config->lookahead_sz2); hs_config->input_buffer_sz, hs_config->window_sz2, hs_config->lookahead_sz2);
if(hs_decoder == NULL) { if(hs_decoder == NULL) {
free(instance->decode_buffer); free(instance->decode_buffer);
free(instance); free(instance);
@@ -492,6 +492,9 @@ CompressStreamDecoder* compress_stream_decoder_alloc(
} else if(type == CompressTypeGzip) { } else if(type == CompressTypeGzip) {
const CompressConfigGzip* gz_config = config; const CompressConfigGzip* gz_config = config;
instance->decode_buffer_size = gz_config->input_buffer_sz;
instance->decode_buffer = malloc(gz_config->input_buffer_sz);
gzip_decoder* gz_decoder = malloc(sizeof(gzip_decoder) + gz_config->dict_sz); gzip_decoder* gz_decoder = malloc(sizeof(gzip_decoder) + gz_config->dict_sz);
gz_decoder->sd = instance; gz_decoder->sd = instance;
gz_decoder->dict_sz = gz_config->dict_sz; gz_decoder->dict_sz = gz_config->dict_sz;

View File

@@ -56,31 +56,22 @@ typedef enum {
CompressTypeMAX, CompressTypeMAX,
} CompressType; } CompressType;
/** Base configuration for all compression types */
typedef struct {
uint16_t input_buffer_sz;
} CompressConfigBase;
/** Configuration for heatshrink compression */ /** Configuration for heatshrink compression */
typedef struct { typedef struct {
CompressConfigBase base;
uint16_t window_sz2; uint16_t window_sz2;
uint16_t lookahead_sz2; uint16_t lookahead_sz2;
uint16_t input_buffer_sz;
} CompressConfigHeatshrink; } CompressConfigHeatshrink;
_Static_assert(offsetof(CompressConfigHeatshrink, base) == 0, "Base must be first struct member");
/** Default configuration for heatshrink compression. Used for image assets. */ /** Default configuration for heatshrink compression. Used for image assets. */
extern const CompressConfigHeatshrink compress_config_heatshrink_default; extern const CompressConfigHeatshrink compress_config_heatshrink_default;
/** Configuration for gzip compression */ /** Configuration for gzip compression */
typedef struct { typedef struct {
CompressConfigBase base;
uint32_t dict_sz; uint32_t dict_sz;
uint16_t input_buffer_sz;
} CompressConfigGzip; } CompressConfigGzip;
_Static_assert(offsetof(CompressConfigGzip, base) == 0, "Base must be first struct member");
/** Allocate encoder and decoder /** Allocate encoder and decoder
* *
* @param type Compression type * @param type Compression type

View File

@@ -75,7 +75,6 @@ const struct mtar_ops filesystem_ops = {
typedef struct { typedef struct {
CompressType type; CompressType type;
union { union {
CompressConfigBase base; // All other configs start with base
CompressConfigHeatshrink heatshrink; CompressConfigHeatshrink heatshrink;
CompressConfigGzip gzip; CompressConfigGzip gzip;
} config; } config;
@@ -191,7 +190,6 @@ bool tar_archive_open(TarArchive* archive, const char* path, TarOpenMode mode) {
CompressedStream* compressed_stream = malloc(sizeof(CompressedStream)); CompressedStream* compressed_stream = malloc(sizeof(CompressedStream));
compressed_stream->stream = stream; compressed_stream->stream = stream;
compressed_stream->config.base.input_buffer_sz = FILE_BLOCK_SIZE;
if(mode == TarOpenModeReadHeatshrink) { if(mode == TarOpenModeReadHeatshrink) {
/* Read and validate stream header */ /* Read and validate stream header */
@@ -207,10 +205,12 @@ bool tar_archive_open(TarArchive* archive, const char* path, TarOpenMode mode) {
compressed_stream->type = CompressTypeHeatshrink; compressed_stream->type = CompressTypeHeatshrink;
compressed_stream->config.heatshrink.window_sz2 = header.window_sz2; compressed_stream->config.heatshrink.window_sz2 = header.window_sz2;
compressed_stream->config.heatshrink.lookahead_sz2 = header.lookahead_sz2; compressed_stream->config.heatshrink.lookahead_sz2 = header.lookahead_sz2;
compressed_stream->config.heatshrink.input_buffer_sz = FILE_BLOCK_SIZE;
} else if(mode == TarOpenModeReadGzip) { } else if(mode == TarOpenModeReadGzip) {
compressed_stream->type = CompressTypeGzip; compressed_stream->type = CompressTypeGzip;
compressed_stream->config.gzip.dict_sz = 32 * 1024; compressed_stream->config.gzip.dict_sz = 32 * 1024;
compressed_stream->config.gzip.input_buffer_sz = FILE_BLOCK_SIZE;
} }
compressed_stream->decoder = compress_stream_decoder_alloc( compressed_stream->decoder = compress_stream_decoder_alloc(