ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
compression.h File Reference

📦 Network Packet Compression Utilities More...

Go to the source code of this file.

Data Structures

struct  compression_workspace_t
 Owns the temporary storage used by compression workspace. The data pointers and size or cursor fields describe the live portion of the allocation; callers must use the type's cleanup path when the buffer or queue is no longer needed. Output is borrowed until the next call or destruction; never queue it without copying. The caller serializes access to the workspace. More...

Macros

Compression Settings
#define COMPRESSION_RATIO_THRESHOLD   0.8f
 Compression ratio threshold - only use if <80% original size.
#define COMPRESSION_MIN_SIZE   1024
 Minimum packet size to attempt compression (1KB).

Functions

asciichat_error_t compress_data (const void *input, size_t input_size, void **output, size_t *output_size, int compression_level)
 Compress data using zstd with configurable compression level.
asciichat_error_t decompress_data (const void *input, size_t input_size, void *output, size_t output_size)
 Decompress data using zstd.
asciichat_error_t decompress_data_exact (const void *input, size_t input_size, void *output, size_t expected_size)
bool should_compress (size_t original_size, size_t compressed_size)
 Determine if compression should be used for given data sizes.
asciichat_error_t compress_workspace (compression_workspace_t *workspace, const void *input, size_t size, int level)
void compression_workspace_destroy (compression_workspace_t *workspace)

Detailed Description

📦 Network Packet Compression Utilities

Definition in file compression.h.

Function Documentation

◆ compress_workspace()

asciichat_error_t compress_workspace ( compression_workspace_t * workspace,
const void * input,
size_t size,
int level )

Definition at line 133 of file compression.c.

133 {
134 ASCII_OTEL_SCOPE(ZSTD_COMPRESS_WORKSPACE);
135 ASCII_OTEL_ATTR_STRING("compression.algorithm", "zstd");
136 ASCII_OTEL_ATTR_STRING("compression.library.version", ZSTD_versionString());
137 ASCII_OTEL_ATTR_INT("compression.level", level);
138 ASCII_OTEL_ATTR_INT("compression.input.size", (int64_t)size);
139 if (!workspace || !input || !size || level < 1 || level > 9)
140 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid compression workspace request");
141 workspace->output.length = 0;
142 size_t bound = ZSTD_compressBound(size);
143 if (!bound || bound > 256 * 1024 * 1024)
144 return SET_ERRNO(ERROR_INVALID_PARAM, "Compression workspace exceeds maximum size");
145 asciichat_error_t result = buffer_workspace_reserve(&workspace->output, NULL, bound);
146 if (result != ASCIICHAT_OK)
147 return result;
148 if (!workspace->codec)
149 workspace->codec = ZSTD_createCCtx();
150 if (!workspace->codec)
151 return SET_ERRNO(ERROR_MEMORY, "Cannot create compression context");
152 size_t written = ZSTD_compressCCtx(workspace->codec, workspace->output.data, buffer_capacity(workspace->output.data),
153 input, size, level);
154 if (ZSTD_isError(written))
155 return SET_ERRNO(ERROR_GENERAL, "Compression failed: %s", ZSTD_getErrorName(written));
156 workspace->output.length = written;
157 result = buffer_set_size(workspace->output.data, written);
158 if (result == ASCIICHAT_OK) {
159 ASCII_OTEL_ATTR_INT("compression.output.size", (int64_t)written);
160 ASCII_OTEL_ATTR_INT("compression.ratio.permille", (int64_t)(1000.0 * (double)written / (double)size));
161 compression_measure(size, written, true);
162 }
163 return result;
164}
#define SET_ERRNO(code,...)
size_t buffer_capacity(const void *data)
Definition buffer.c:280
asciichat_error_t buffer_workspace_reserve(buffer_workspace_t *workspace, buffer_domain_t *domain, size_t capacity)
Definition buffer.c:356
asciichat_error_t buffer_set_size(void *data, size_t size)
Definition buffer.c:287
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ERROR_MEMORY
Definition error_codes.h:51
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_GENERAL
Definition error_codes.h:47
@ ERROR_INVALID_PARAM
#define ASCII_OTEL_SCOPE(id)
Definition otel.h:72
#define ASCII_OTEL_ATTR_INT(key, value)
Definition otel.h:67
#define ASCII_OTEL_ATTR_STRING(key, value)
Definition otel.h:66
buffer_workspace_t output

References ASCII_OTEL_ATTR_INT, ASCII_OTEL_ATTR_STRING, ASCII_OTEL_SCOPE, ASCIICHAT_OK, buffer_capacity(), buffer_set_size(), buffer_workspace_reserve(), compression_workspace_t::codec, buffer_workspace_t::data, ERROR_GENERAL, ERROR_INVALID_PARAM, ERROR_MEMORY, buffer_workspace_t::length, compression_workspace_t::output, and SET_ERRNO.

Referenced by acip_send_ascii_frame_contract().

◆ compression_workspace_destroy()

void compression_workspace_destroy ( compression_workspace_t * workspace)

Definition at line 166 of file compression.c.

166 {
167 if (!workspace)
168 return;
169 ZSTD_freeCCtx(workspace->codec);
170 workspace->codec = NULL;
171 buffer_workspace_destroy(&workspace->output);
172}
void buffer_workspace_destroy(buffer_workspace_t *workspace)
Definition buffer.c:374

References buffer_workspace_destroy(), compression_workspace_t::codec, and compression_workspace_t::output.

Referenced by acip_frame_workspace_destroy().