80 if (initial_mask != NULL) {
183 Xt->
num_words = (((comp->
F + 7U) / 8U) + 3U) / 4U;
197 for (
size_t i = 1U; i <= num_changes; i++) {
202 for (
size_t w = 0U; w < Xt->
num_words; w++) {
220 (void)current_change;
226 if (comp->
t > (
size_t)Rt) {
232 for (
size_t i = (
size_t)Rt + 1U; (i <= 15U) && (i <= comp->t) && (done == 0); i++) {
238 if (Ct >= (15U - Rt)) {
264 if ((Xt != NULL) && (mask != NULL)) {
270 for (
size_t i = 0U; (i < num_words) && (result == 0); i++) {
272 if ((Xt->
data[i] & ~mask->
data[i]) != 0U) {
285 int current_new_mask_flag
299 if (current_new_mask_flag != 0) {
304 size_t iterations_to_check = ((size_t)Vt <= comp->t) ? (size_t)Vt : comp->
t;
306 for (
size_t i = 0U; i < iterations_to_check; i++) {
338 if ((comp == NULL) || (input == NULL) || (output == NULL)) {
340 }
else if (input->
length != comp->
F) {
346 if (params == NULL) {
348 effective_params = &local_params;
407 for (
int i = 3; i >= 0; i--) {
408 uint32_t vt_shifted = (uint32_t)Vt >> (uint32_t)i;
409 uint32_t vt_masked = vt_shifted & 1U;
410 int bit_val = (int)vt_masked;
481 if ((ct != 0) && (Vt > 0U)) {
520 const uint8_t *input_data,
522 uint8_t *output_buffer,
523 size_t output_buffer_size,
528 if ((comp == NULL) || (input_data == NULL) || (output_buffer == NULL) || (output_size == NULL)) {
532 size_t packet_size_bytes = (comp->
F + 7U) / 8U;
535 if ((input_size % packet_size_bytes) != 0U) {
539 size_t num_packets = input_size / packet_size_bytes;
545 size_t total_output_bytes = 0U;
546 int compress_error = 0;
549 for (
size_t i = 0U; (i < num_packets) && (compress_error == 0); i++) {
621 result = packet_result;
626 size_t packet_size =
bitbuffer_to_bytes(&packet_output, packet_bytes,
sizeof(packet_bytes));
629 if ((total_output_bytes + packet_size) > output_buffer_size) {
634 (void)memcpy(&output_buffer[total_output_bytes], packet_bytes, packet_size);
635 total_output_bytes += packet_size;
641 if (compress_error == 0) {
642 *output_size = total_output_bytes;
CCSDS 124.0-B-1 Compression Library - Public API.
static void get_default_params(ccsds124_params_t *params, const ccsds124_compressor_t *comp)
Get default compression parameters.
int bitbuffer_append_bitvector(bitbuffer_t *bb, const bitvector_t *bv)
Append all bits from a bit vector.
int bitbuffer_append_bit(bitbuffer_t *bb, int bit)
Append a single bit to buffer.
void bitbuffer_clear(bitbuffer_t *bb)
Clear bit buffer contents.
void bitbuffer_init(bitbuffer_t *bb)
Initialize bit buffer to empty state.
size_t bitbuffer_to_bytes(const bitbuffer_t *bb, uint8_t *data, size_t max_bytes)
Convert bit buffer to byte array.
void bitvector_copy(bitvector_t *dest, const bitvector_t *src)
Copy bit vector contents.
int bitvector_from_bytes(bitvector_t *bv, const uint8_t *data, size_t num_bytes)
Load bit vector from byte array.
void bitvector_xor(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise XOR operation.
size_t bitvector_hamming_weight(const bitvector_t *bv)
Count number of set bits (Hamming weight).
int bitvector_init(bitvector_t *bv, size_t num_bits)
Initialize a bit vector with specified length.
void bitvector_not(bitvector_t *result, const bitvector_t *a)
Bitwise NOT operation.
void bitvector_zero(bitvector_t *bv)
Set all bits to zero.
void bitvector_left_shift(bitvector_t *result, const bitvector_t *a)
Left shift by one bit.
void bitvector_or(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise OR operation.
int ccsds124_compressor_init(ccsds124_compressor_t *comp, size_t F, const bitvector_t *initial_mask, uint8_t robustness, int pt_limit, int ft_limit, int rt_limit)
Initialize compressor state.
int ccsds124_compress_packet(ccsds124_compressor_t *comp, const bitvector_t *input, bitbuffer_t *output, const ccsds124_params_t *params)
Compress a single input packet.
uint8_t ccsds124_compute_effective_robustness(const ccsds124_compressor_t *comp, const bitvector_t *current_change)
Compute effective robustness Vₜ.
void ccsds124_compute_robustness_window(bitvector_t *Xt, const ccsds124_compressor_t *comp, const bitvector_t *current_change)
Compute robustness window Xₜ.
void ccsds124_compressor_reset(ccsds124_compressor_t *comp)
Reset compressor to initial state.
int ccsds124_compute_ct_flag(const ccsds124_compressor_t *comp, uint8_t Vt, int current_new_mask_flag)
Compute cₜ flag for multiple mask updates.
int ccsds124_compress(ccsds124_compressor_t *comp, const uint8_t *input_data, size_t input_size, uint8_t *output_buffer, size_t output_buffer_size, size_t *output_size)
Compress entire input data stream.
int ccsds124_has_positive_updates(const bitvector_t *Xt, const bitvector_t *mask)
Check for positive mask updates (eₜ flag).
#define CCSDS124_MAX_HISTORY
#define CCSDS124_MAX_VT_HISTORY
#define CCSDS124_MAX_PACKET_LENGTH
#define CCSDS124_MAX_ROBUSTNESS
#define CCSDS124_MAX_OUTPUT_BYTES
int ccsds124_bit_extract_forward(bitbuffer_t *output, const bitvector_t *data, const bitvector_t *mask)
Bit extraction in forward order (LSB to MSB).
int ccsds124_bit_extract(bitbuffer_t *output, const bitvector_t *data, const bitvector_t *mask)
Bit extraction (CCSDS Section 5.2.4, Equation 11).
int ccsds124_rle_encode(bitbuffer_t *output, const bitvector_t *input)
Run-length encoding (CCSDS Section 5.2.3, Equation 10).
int ccsds124_count_encode(bitbuffer_t *output, uint32_t A)
Counter encoding (CCSDS Section 5.2.2, Equation 9).
#define CCSDS124_ERROR_OVERFLOW
#define CCSDS124_ERROR_INVALID_ARG
void ccsds124_compute_change(bitvector_t *change, const bitvector_t *mask, const bitvector_t *prev_mask, size_t t)
Compute change vector (CCSDS Equation 8).
void ccsds124_update_build(bitvector_t *build, const bitvector_t *input, const bitvector_t *prev_input, int new_mask_flag, size_t t)
Update build vector (CCSDS Equation 6).
void ccsds124_update_mask(bitvector_t *mask, const bitvector_t *input, const bitvector_t *prev_input, const bitvector_t *build_prev, int new_mask_flag)
Update mask vector (CCSDS Equation 7).
Variable-length bit buffer structure.
Fixed-length bit vector structure.
uint32_t data[((CCSDS124_MAX_PACKET_BYTES)+3U)/4U]
Compressor state structure.
bitvector_t work_prev_build
uint8_t new_mask_flag_history[CCSDS124_MAX_VT_HISTORY]
bitvector_t work_inverted
bitvector_t change_history[CCSDS124_MAX_HISTORY]
size_t flag_history_index
Compression parameters for a single packet.
uint8_t uncompressed_flag