CCSDS 124.0-B-1 C 1.0.0
CCSDS 124.0-B-1 Lossless Compression
Loading...
Searching...
No Matches
ccsds124.h
Go to the documentation of this file.
1
28#ifndef CCSDS124_H
29#define CCSDS124_H
30
31#include <stdint.h>
32#include <stddef.h>
33
38#define CCSDS124_VERSION_MAJOR 1
39#define CCSDS124_VERSION_MINOR 0
40#define CCSDS124_VERSION_PATCH 0
47#define CCSDS124_OK 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
67#endif
68
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)
75#endif
82typedef struct bitvector bitvector_t;
83typedef struct bitbuffer bitbuffer_t;
94typedef struct {
96 uint8_t new_mask_flag;
100
107typedef struct {
108 uint8_t status;
109 uint8_t Vt;
110 uint8_t ft;
111 uint8_t rt;
133struct bitvector {
134 uint32_t data[((CCSDS124_MAX_PACKET_BYTES) + 3U) / 4U];
135 size_t length;
136 size_t num_words;
137};
138
148int bitvector_init(bitvector_t *bv, size_t num_bits);
149
155
161void bitvector_copy(bitvector_t *dest, const bitvector_t *src);
162
169static inline int bitvector_get_bit(const bitvector_t *bv, size_t pos) {
170 int result = 0;
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) {
176 result = 1;
177 }
178 }
179 return result;
180}
181
188static inline void bitvector_set_bit(bitvector_t *bv, size_t pos, int value) {
189 if ((bv != NULL) && (pos < bv->length)) {
190 size_t word_index = pos >> 5U;
191 size_t bit_in_word = 31U - (pos & 31U);
192 if (value != 0) {
193 bv->data[word_index] |= (1U << bit_in_word);
194 } else {
195 bv->data[word_index] &= ~(1U << bit_in_word);
196 }
197 }
198}
199
206void bitvector_xor(bitvector_t *result, const bitvector_t *a, const bitvector_t *b);
207
214void bitvector_or(bitvector_t *result, const bitvector_t *a, const bitvector_t *b);
215
222void bitvector_and(bitvector_t *result, const bitvector_t *a, const bitvector_t *b);
223
229void bitvector_not(bitvector_t *result, const bitvector_t *a);
230
239void bitvector_left_shift(bitvector_t *result, const bitvector_t *a);
240
250void bitvector_reverse(bitvector_t *result, const bitvector_t *a);
251
257size_t bitvector_hamming_weight(const bitvector_t *bv);
258
265int bitvector_equals(const bitvector_t *a, const bitvector_t *b);
266
277int bitvector_from_bytes(bitvector_t *bv, const uint8_t *data, size_t num_bytes);
278
289int bitvector_to_bytes(const bitvector_t *bv, uint8_t *data, size_t num_bytes);
290
/* End of bitvector group */
292
308struct bitbuffer {
310 size_t num_bits;
311 uint32_t acc;
312 size_t acc_len;
313};
314
320
326
333int bitbuffer_append_bit(bitbuffer_t *bb, int bit);
334
342int bitbuffer_append_bits(bitbuffer_t *bb, const uint8_t *data, size_t num_bits);
343
355int bitbuffer_append_value(bitbuffer_t *bb, uint32_t value, size_t num_bits);
356
364
370size_t bitbuffer_size(const bitbuffer_t *bb);
371
382size_t bitbuffer_to_bytes(const bitbuffer_t *bb, uint8_t *data, size_t max_bytes);
383
/* End of bitbuffer group */
385
408 bitvector_t *build,
409 const bitvector_t *input,
410 const bitvector_t *prev_input,
411 int new_mask_flag,
412 size_t t
413);
414
427 bitvector_t *mask,
428 const bitvector_t *input,
429 const bitvector_t *prev_input,
430 const bitvector_t *build_prev,
431 int new_mask_flag
432);
433
446 bitvector_t *change,
447 const bitvector_t *mask,
448 const bitvector_t *prev_mask,
449 size_t t
450);
451
/* End of mask group */
453
473int ccsds124_count_encode(bitbuffer_t *output, uint32_t A);
474
485int ccsds124_rle_encode(bitbuffer_t *output, const bitvector_t *input);
486
499 bitbuffer_t *output,
500 const bitvector_t *data,
501 const bitvector_t *mask
502);
503
516 bitbuffer_t *output,
517 const bitvector_t *data,
518 const bitvector_t *mask
519);
520
/* End of encoding group */
522
586
605 size_t F,
606 const bitvector_t *initial_mask,
607 uint8_t robustness,
608 int pt_limit,
609 int ft_limit,
610 int rt_limit
611);
612
622
637 const bitvector_t *input,
638 bitbuffer_t *output,
639 const ccsds124_params_t *params
640);
641
661 const uint8_t *input_data,
662 size_t input_size,
663 uint8_t *output_buffer,
664 size_t output_buffer_size,
665 size_t *output_size
666);
667
679 bitvector_t *Xt,
680 const ccsds124_compressor_t *comp,
681 const bitvector_t *current_change
682);
683
695 const ccsds124_compressor_t *comp,
696 const bitvector_t *current_change
697);
698
710 const bitvector_t *Xt,
711 const bitvector_t *mask
712);
713
726 const ccsds124_compressor_t *comp,
727 uint8_t Vt,
728 int current_new_mask_flag
729);
730
/* End of compression group */
732
748typedef struct {
749 const uint8_t *data;
750 size_t num_bits;
751 size_t bit_pos;
753
761void bitreader_init(bitreader_t *reader, const uint8_t *data, size_t num_bits);
762
770
780uint32_t bitreader_read_bits(bitreader_t *reader, size_t num_bits);
781
788size_t bitreader_position(const bitreader_t *reader);
789
796size_t bitreader_remaining(const bitreader_t *reader);
797
806
/* End of bitreader group */
808
830int ccsds124_count_decode(bitreader_t *reader, uint32_t *value);
831
842int ccsds124_rle_decode(bitreader_t *reader, bitvector_t *result, size_t length);
843
854int ccsds124_bit_insert(bitreader_t *reader, bitvector_t *data, const bitvector_t *mask);
855
/* End of decoding group */
857
906
920 size_t F,
921 const bitvector_t *initial_mask,
922 uint8_t robustness
923);
924
934
959 uint32_t lost_count
960);
961
975 bitreader_t *reader,
976 bitvector_t *output
977);
978
1000 const uint8_t *data,
1001 size_t num_bits,
1002 bitvector_t *output,
1004);
1005
1023 const uint8_t *data,
1024 size_t num_bits,
1025 uint32_t *packet_length
1026);
1027
1046 const uint8_t *input_data,
1047 size_t input_size,
1048 uint8_t *output_buffer,
1049 size_t output_buffer_size,
1050 size_t *output_size
1051);
1052
/* End of decompression group */
1054
1065const char* ccsds124_version_string(void);
1066
1072const char* ccsds124_error_string(int error_code);
1073
/* End of utility group */
1075
1076#endif /* CCSDS124_H */
int bitbuffer_append_bitvector(bitbuffer_t *bb, const bitvector_t *bv)
Append all bits from a bit vector.
Definition bitbuffer.c:181
int bitbuffer_append_bits(bitbuffer_t *bb, const uint8_t *data, size_t num_bits)
Append multiple bits from byte array.
Definition bitbuffer.c:105
int bitbuffer_append_value(bitbuffer_t *bb, uint32_t value, size_t num_bits)
Append multiple bits from a value directly to accumulator.
Definition bitbuffer.c:151
int bitbuffer_append_bit(bitbuffer_t *bb, int bit)
Append a single bit to buffer.
Definition bitbuffer.c:77
void bitbuffer_clear(bitbuffer_t *bb)
Clear bit buffer contents.
Definition bitbuffer.c:50
void bitbuffer_init(bitbuffer_t *bb)
Initialize bit buffer to empty state.
Definition bitbuffer.c:40
size_t bitbuffer_size(const bitbuffer_t *bb)
Get number of bits in buffer.
Definition bitbuffer.c:226
size_t bitbuffer_to_bytes(const bitbuffer_t *bb, uint8_t *data, size_t max_bytes)
Convert bit buffer to byte array.
Definition bitbuffer.c:244
size_t bitreader_position(const bitreader_t *reader)
Get current bit position.
Definition decompress.c:136
void bitreader_align_byte(bitreader_t *reader)
Skip to next byte boundary.
Definition decompress.c:158
int bitreader_read_bit(bitreader_t *reader)
Read a single bit.
Definition decompress.c:97
uint32_t bitreader_read_bits(bitreader_t *reader, size_t num_bits)
Read multiple bits as unsigned value.
Definition decompress.c:115
size_t bitreader_remaining(const bitreader_t *reader)
Get remaining bits.
Definition decompress.c:147
void bitreader_init(bitreader_t *reader, const uint8_t *data, size_t num_bits)
Initialize bit reader.
Definition decompress.c:88
void bitvector_copy(bitvector_t *dest, const bitvector_t *src)
Copy bit vector contents.
Definition bitvector.c:72
int bitvector_from_bytes(bitvector_t *bv, const uint8_t *data, size_t num_bytes)
Load bit vector from byte array.
Definition bitvector.c:269
int bitvector_to_bytes(const bitvector_t *bv, uint8_t *data, size_t num_bytes)
Store bit vector to byte array.
Definition bitvector.c:311
void bitvector_xor(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise XOR operation.
Definition bitvector.c:93
void bitvector_reverse(bitvector_t *result, const bitvector_t *a)
Reverse bit order.
Definition bitvector.c:200
size_t bitvector_hamming_weight(const bitvector_t *bv)
Count number of set bits (Hamming weight).
Definition bitvector.c:222
static void bitvector_set_bit(bitvector_t *bv, size_t pos, int value)
Set bit value at position (inline for performance).
Definition ccsds124.h:188
int bitvector_init(bitvector_t *bv, size_t num_bits)
Initialize a bit vector with specified length.
Definition bitvector.c:44
static int bitvector_get_bit(const bitvector_t *bv, size_t pos)
Get bit value at position (inline for performance).
Definition ccsds124.h:169
int bitvector_equals(const bitvector_t *a, const bitvector_t *b)
Compare two bit vectors for equality.
Definition bitvector.c:247
void bitvector_not(bitvector_t *result, const bitvector_t *a)
Bitwise NOT operation.
Definition bitvector.c:144
void bitvector_zero(bitvector_t *bv)
Set all bits to zero.
Definition bitvector.c:65
void bitvector_left_shift(bitvector_t *result, const bitvector_t *a)
Left shift by one bit.
Definition bitvector.c:178
void bitvector_and(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise AND operation.
Definition bitvector.c:127
void bitvector_or(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise OR operation.
Definition bitvector.c:110
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.
Definition compress.c:36
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.
Definition compress.c:330
uint8_t ccsds124_compute_effective_robustness(const ccsds124_compressor_t *comp, const bitvector_t *current_change)
Compute effective robustness Vₜ.
Definition compress.c:210
void ccsds124_compute_robustness_window(bitvector_t *Xt, const ccsds124_compressor_t *comp, const bitvector_t *current_change)
Compute robustness window Xₜ.
Definition compress.c:173
void ccsds124_compressor_reset(ccsds124_compressor_t *comp)
Reset compressor to initial state.
Definition compress.c:107
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.
Definition compress.c:282
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.
Definition compress.c:518
int ccsds124_has_positive_updates(const bitvector_t *Xt, const bitvector_t *mask)
Check for positive mask updates (eₜ flag).
Definition compress.c:254
#define CCSDS124_MAX_HISTORY
Definition ccsds124.h:71
#define CCSDS124_MAX_VT_HISTORY
Definition ccsds124.h:72
#define CCSDS124_MAX_PACKET_BYTES
Definition ccsds124.h:69
#define CCSDS124_MAX_OUTPUT_BYTES
Definition ccsds124.h:74
int ccsds124_rle_decode(bitreader_t *reader, bitvector_t *result, size_t length)
Run-length decoding (inverse of ccsds124_rle_encode).
Definition decompress.c:251
int ccsds124_count_decode(bitreader_t *reader, uint32_t *value)
Counter decoding (inverse of ccsds124_count_encode).
Definition decompress.c:175
int ccsds124_bit_insert(bitreader_t *reader, bitvector_t *data, const bitvector_t *mask)
Bit insertion (inverse of ccsds124_bit_extract).
Definition decompress.c:287
int ccsds124_decompress_packet(ccsds124_decompressor_t *decomp, bitreader_t *reader, bitvector_t *output)
Decompress a single compressed packet.
Definition decompress.c:740
void ccsds124_decompressor_reset(ccsds124_decompressor_t *decomp)
Reset decompressor to initial state.
Definition decompress.c:389
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.
Definition decompress.c:749
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.
Definition decompress.c:954
int ccsds124_decompressor_notify_packet_loss(ccsds124_decompressor_t *decomp, uint32_t lost_count)
Notify decompressor of packet loss.
Definition decompress.c:409
int ccsds124_decompressor_init(ccsds124_decompressor_t *decomp, size_t F, const bitvector_t *initial_mask, uint8_t robustness)
Initialize decompressor state.
Definition decompress.c:335
int ccsds124_bit_extract_forward(bitbuffer_t *output, const bitvector_t *data, const bitvector_t *mask)
Bit extraction in forward order (LSB to MSB).
Definition encode.c:273
int ccsds124_bit_extract(bitbuffer_t *output, const bitvector_t *data, const bitvector_t *mask)
Bit extraction (CCSDS Section 5.2.4, Equation 11).
Definition encode.c:220
int ccsds124_rle_encode(bitbuffer_t *output, const bitvector_t *input)
Run-length encoding (CCSDS Section 5.2.3, Equation 10).
Definition encode.c:135
int ccsds124_count_encode(bitbuffer_t *output, uint32_t A)
Counter encoding (CCSDS Section 5.2.2, Equation 9).
Definition encode.c:40
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).
Definition mask.c:125
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).
Definition mask.c:43
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).
Definition mask.c:85
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.
Definition ccsds124.h:308
uint8_t data[CCSDS124_MAX_OUTPUT_BYTES]
Definition ccsds124.h:309
size_t acc_len
Definition ccsds124.h:312
size_t num_bits
Definition ccsds124.h:310
uint32_t acc
Definition ccsds124.h:311
Bit reader structure for sequential reading.
Definition ccsds124.h:748
const uint8_t * data
Definition ccsds124.h:749
size_t bit_pos
Definition ccsds124.h:751
size_t num_bits
Definition ccsds124.h:750
Fixed-length bit vector structure.
Definition ccsds124.h:133
size_t num_words
Definition ccsds124.h:136
size_t length
Definition ccsds124.h:135
uint32_t data[((CCSDS124_MAX_PACKET_BYTES)+3U)/4U]
Definition ccsds124.h:134
Compressor state structure.
Definition ccsds124.h:537
bitvector_t work_prev_build
Definition ccsds124.h:578
uint8_t new_mask_flag_history[CCSDS124_MAX_VT_HISTORY]
Definition ccsds124.h:557
bitvector_t work_shifted
Definition ccsds124.h:582
bitvector_t work_change
Definition ccsds124.h:579
bitvector_t work_Xt
Definition ccsds124.h:580
bitvector_t work_inverted
Definition ccsds124.h:581
bitvector_t mask
Definition ccsds124.h:547
bitvector_t prev_input
Definition ccsds124.h:550
bitvector_t work_diff
Definition ccsds124.h:583
bitvector_t prev_mask
Definition ccsds124.h:548
bitvector_t change_history[CCSDS124_MAX_HISTORY]
Definition ccsds124.h:551
size_t flag_history_index
Definition ccsds124.h:558
bitvector_t initial_mask
Definition ccsds124.h:541
bitvector_t build
Definition ccsds124.h:549
Decompression result with accuracy guarantee status.
Definition ccsds124.h:107
Decompressor state structure.
Definition ccsds124.h:872
uint8_t mask_inconsistent
Definition ccsds124.h:894
uint8_t received_status_index
Definition ccsds124.h:903
bitvector_t prev_output
Definition ccsds124.h:883
uint8_t received_status_ring[CCSDS124_MAX_VT_HISTORY]
Definition ccsds124.h:901
uint8_t received_status_count
Definition ccsds124.h:902
bitvector_t initial_mask
Definition ccsds124.h:876
Compression parameters for a single packet.
Definition ccsds124.h:94
uint8_t min_robustness
Definition ccsds124.h:95
uint8_t uncompressed_flag
Definition ccsds124.h:98
uint8_t send_mask_flag
Definition ccsds124.h:97
uint8_t new_mask_flag
Definition ccsds124.h:96