CCSDS 124.0-B-1 C 1.0.0
CCSDS 124.0-B-1 Lossless Compression
Loading...
Searching...
No Matches
CCSDS 124.0-B-1 C Implementation

Build Lines Functions License: MIT

A MISRA-C compliant C implementation of the CCSDS 124.0-B-1 lossless compression algorithm of fixed-length housekeeping data.

Citation

If CCSDS 124.0-B-1 contributes to your research, please cite:

‍D. Evans, G. Labrèche, D. Marszk, S. Bammens, M. Hernandez-Cabronero, V. Zelenevskiy, V. Shiradhonkar, M. Starcik, and M. Henkel. 2022. "Implementing the New CCSDS Housekeeping Data Compression Standard 124.0-B-1 (based on POCKET+) on OPS-SAT-1," Proceedings of the Small Satellite Conference, Communications, SSC22-XII-03. https://digitalcommons.usu.edu/smallsat/2022/all2022/133/

BibTeX

@inproceedings{evans2022ccsds124,
author = {Evans, David and Labrèche, Georges and Marszk, Dominik and Bammens, Samuel and Hernandez-Cabronero, Miguel and Zelenevskiy, Vladimir and Shiradhonkar, Vasundhara and Starcik, Mario and Henkel, Maximilian},
title = {Implementing the New CCSDS Housekeeping Data Compression Standard 124.0-B-1 (based on POCKET+) on OPS-SAT-1},
booktitle = {Proceedings of the Small Satellite Conference},
year = {2022},
note = {SSC22-XII-03},
url = {https://digitalcommons.usu.edu/smallsat/2022/all2022/133/}
}

Building

make # Build library and CLI
make test # Run all tests
make valgrind # Run memory check (requires valgrind)
make coverage # Run tests with coverage report
make coverage-html # Run tests with coverage report in html (requires lcov)
make misra # Run MISRA-C:2012 compliance check (requires cppcheck)
make docs # Generate API documentation (requires doxygen)
make crossvalidation # Run CCSDS cross-validation (requires test data)
make clean # Clean build artifacts

Docker

docker-compose run --rm c # Build, test, coverage
docker-compose run --rm c make misra # Run MISRA check
docker-compose run --rm --build c # Rebuild after changes
docker-compose run --rm c-crossvalidation # CCSDS cross-validation

CLI

# Compress
./build/ccsds124 <input> <packet_size> <pt> <ft> <rt> <robustness>
# Decompress
./build/ccsds124 -d <input.pkt> <packet_size> <robustness>

Example:

./build/ccsds124 data.bin 90 10 20 50 1 # -> data.bin.pkt
./build/ccsds124 -d data.bin.pkt 90 1 # -> data.bin.depkt

Run ./build/ccsds124 --help for full usage.

Library Usage

#include "ccsds124.h"
// Compress
ccsds124_compressor_init(&comp, 720, NULL, 1, 10, 20, 50);
ccsds124_compress(&comp, input, input_size, output, output_max, &output_size);
// Decompress
ccsds124_decompressor_init(&decomp, 720, NULL, 1);
ccsds124_decompress(&decomp, compressed, comp_size, output, output_max, &output_size);
CCSDS 124.0-B-1 Compression Library - Public API.
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(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_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_decompressor_init(ccsds124_decompressor_t *decomp, size_t F, const bitvector_t *initial_mask, uint8_t robustness)
Initialize decompressor state.
Definition decompress.c:335
Compressor state structure.
Definition ccsds124.h:537
Decompressor state structure.
Definition ccsds124.h:872

Design

  • Zero dependencies - C99 standard library only
  • Static allocation - No malloc/free, embedded-friendly (verified via valgrind in CI)
  • MISRA-C compliant - Suitable for safety-critical systems

MISRA-C:2012 Compliance

The core library has zero Required violations. One Mandatory rule (17.3) is suppressed for performance-critical compiler intrinsics. Remaining violations are all Advisory. All suppressions have documented rationale in misra.supp:

Rule Level Description Rationale
17.3 Mandatory Implicit function declaration __builtin_popcount/__builtin_clz intrinsics for 5x performance improvement. Supported by GCC, Clang, and ARM CC.
8.7 Advisory External linkage could be internal Public API functions require external linkage
15.5 Advisory Multiple return statements Early returns for error handling in decompression
2.5 Advisory Unused macros Version macros used in CLI, not library

Run MISRA checks locally (requires cppcheck):

make misra # Local
docker-compose run --rm c make misra # Docker

CI automatically runs MISRA checks on every push/PR to C code.

Testing

See docs/TESTING.md for detailed test documentation including:

  • Unit tests for all components
  • Malformed input handling
  • Robustness parameter (R=0-7) validation against ESA reference
  • Packet loss recovery simulation
  • Fuzzing results
  • CCSDS-style GB-scale validation
  • CCSDS cross-validation (24,900 vectors from UAB suite)

File Structure

implementations/c/
├── include/ccsds124.h # Public API
├── src/
│ ├── bitvector.c # Fixed-length bit vectors
│ ├── bitbuffer.c # Variable-length output buffer
│ ├── encode.c # COUNT, RLE, BE encoding
│ ├── mask.c # Mask update logic
│ ├── compress.c # Compression algorithm
│ ├── decompress.c # Decompression algorithm
│ └── cli.c # Command-line interface
├── tests/ # Unit and integration tests
├── fuzz/ # Fuzzing harnesses
└── ../../crossvalidation/c/ # CCSDS cross-validation harnesses (shared infra)

API

High-Level

Low-Level

Memory

For maximum packet size (65535 bits):

  • ccsds124_compressor_t: ~148 KB
  • ccsds124_decompressor_t: ~50 KB

Reduce with #define CCSDS124_MAX_PACKET_LENGTH 720 for 90-byte packets.

References