38#define CCSDS124_VERSION_MAJOR 1
39#define CCSDS124_VERSION_MINOR 0
40#define CCSDS124_VERSION_PATCH 0
48#define CCSDS124_ERROR_INVALID_ARG -1
49#define CCSDS124_ERROR_OVERFLOW -2
50#define CCSDS124_ERROR_UNDERFLOW -3
57#define CCSDS124_STATUS_UNGUARANTEED 1
58#define CCSDS124_STATUS_TRUNCATED_LENGTH 2
65#ifndef CCSDS124_MAX_PACKET_LENGTH
66#define CCSDS124_MAX_PACKET_LENGTH 65535U
69#define CCSDS124_MAX_PACKET_BYTES (((CCSDS124_MAX_PACKET_LENGTH) + 7U) / 8U)
70#define CCSDS124_MAX_ROBUSTNESS 7U
71#define CCSDS124_MAX_HISTORY 16U
72#define CCSDS124_MAX_VT_HISTORY 16U
73#ifndef CCSDS124_MAX_OUTPUT_BYTES
74#define CCSDS124_MAX_OUTPUT_BYTES ((CCSDS124_MAX_PACKET_BYTES) * 12U)
171 if ((bv != NULL) && (pos < bv->length)) {
172 size_t word_index = pos >> 5U;
173 size_t bit_in_word = 31U - (pos & 31U);
174 uint32_t shifted = bv->
data[word_index] >> bit_in_word;
175 if ((shifted & 1U) != 0U) {
189 if ((bv != NULL) && (pos < bv->length)) {
190 size_t word_index = pos >> 5U;
191 size_t bit_in_word = 31U - (pos & 31U);
193 bv->
data[word_index] |= (1U << bit_in_word);
195 bv->
data[word_index] &= ~(1U << bit_in_word);
661 const uint8_t *input_data,
663 uint8_t *output_buffer,
664 size_t output_buffer_size,
728 int current_new_mask_flag
1000 const uint8_t *data,
1023 const uint8_t *data,
1025 uint32_t *packet_length
1046 const uint8_t *input_data,
1048 uint8_t *output_buffer,
1049 size_t output_buffer_size,
int bitbuffer_append_bitvector(bitbuffer_t *bb, const bitvector_t *bv)
Append all bits from a bit vector.
int bitbuffer_append_bits(bitbuffer_t *bb, const uint8_t *data, size_t num_bits)
Append multiple bits from byte array.
int bitbuffer_append_value(bitbuffer_t *bb, uint32_t value, size_t num_bits)
Append multiple bits from a value directly to accumulator.
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_size(const bitbuffer_t *bb)
Get number of bits in buffer.
size_t bitbuffer_to_bytes(const bitbuffer_t *bb, uint8_t *data, size_t max_bytes)
Convert bit buffer to byte array.
size_t bitreader_position(const bitreader_t *reader)
Get current bit position.
void bitreader_align_byte(bitreader_t *reader)
Skip to next byte boundary.
int bitreader_read_bit(bitreader_t *reader)
Read a single bit.
uint32_t bitreader_read_bits(bitreader_t *reader, size_t num_bits)
Read multiple bits as unsigned value.
size_t bitreader_remaining(const bitreader_t *reader)
Get remaining bits.
void bitreader_init(bitreader_t *reader, const uint8_t *data, size_t num_bits)
Initialize bit reader.
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.
int bitvector_to_bytes(const bitvector_t *bv, uint8_t *data, size_t num_bytes)
Store bit vector to byte array.
void bitvector_xor(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise XOR operation.
void bitvector_reverse(bitvector_t *result, const bitvector_t *a)
Reverse bit order.
size_t bitvector_hamming_weight(const bitvector_t *bv)
Count number of set bits (Hamming weight).
static void bitvector_set_bit(bitvector_t *bv, size_t pos, int value)
Set bit value at position (inline for performance).
int bitvector_init(bitvector_t *bv, size_t num_bits)
Initialize a bit vector with specified length.
static int bitvector_get_bit(const bitvector_t *bv, size_t pos)
Get bit value at position (inline for performance).
int bitvector_equals(const bitvector_t *a, const bitvector_t *b)
Compare two bit vectors for equality.
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_and(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise AND operation.
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_BYTES
#define CCSDS124_MAX_OUTPUT_BYTES
int ccsds124_rle_decode(bitreader_t *reader, bitvector_t *result, size_t length)
Run-length decoding (inverse of ccsds124_rle_encode).
int ccsds124_count_decode(bitreader_t *reader, uint32_t *value)
Counter decoding (inverse of ccsds124_count_encode).
int ccsds124_bit_insert(bitreader_t *reader, bitvector_t *data, const bitvector_t *mask)
Bit insertion (inverse of ccsds124_bit_extract).
int ccsds124_decompress_packet(ccsds124_decompressor_t *decomp, bitreader_t *reader, bitvector_t *output)
Decompress a single compressed packet.
void ccsds124_decompressor_reset(ccsds124_decompressor_t *decomp)
Reset decompressor to initial state.
int ccsds124_decompress_packet_checked(ccsds124_decompressor_t *decomp, const uint8_t *data, size_t num_bits, bitvector_t *output, ccsds124_decompress_result_t *result)
Decompress a single packet with accuracy guarantee checking.
int ccsds124_decompress(ccsds124_decompressor_t *decomp, const uint8_t *input_data, size_t input_size, uint8_t *output_buffer, size_t output_buffer_size, size_t *output_size)
Decompress entire compressed data stream.
int ccsds124_discover_packet_length(const uint8_t *data, size_t num_bits, uint32_t *packet_length)
Discover packet length (F) from a compressed packet.
int ccsds124_decompressor_notify_packet_loss(ccsds124_decompressor_t *decomp, uint32_t lost_count)
Notify decompressor of packet loss.
int ccsds124_decompressor_init(ccsds124_decompressor_t *decomp, size_t F, const bitvector_t *initial_mask, uint8_t robustness)
Initialize decompressor state.
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).
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).
const char * ccsds124_version_string(void)
Get version string.
const char * ccsds124_error_string(int error_code)
Get error message for error code.
Variable-length bit buffer structure.
uint8_t data[CCSDS124_MAX_OUTPUT_BYTES]
Bit reader structure for sequential reading.
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
Decompression result with accuracy guarantee status.
Decompressor state structure.
uint8_t mask_inconsistent
uint8_t received_status_index
uint8_t received_status_ring[CCSDS124_MAX_VT_HISTORY]
uint8_t received_status_count
Compression parameters for a single packet.
uint8_t uncompressed_flag