A fast, high performance, lossless compression system.
Code documentation is here: https://jaredmales.github.io/xrif-docs/modules.html
The only dependencies are the check unit testing framework and subunit streaming system.
On CentOS:
$ sudo yum install check-devel
$ sudo yum install subunit-devel
On Ubuntu:
$ sudo apt-get install check
For a standard posix system, you should only need to do these steps:
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make test
$ sudo make install
$ sudo ldconfig
The below code shows the steps needed to initialize an xrif handle and use it to compress a cube of images.
int16_t * source_data;
// ... allocate and populate source_data with `planes` images of size `rows X cols`
xrif_t xrif;
xrif_error_t rv;
rv = xrif_new(&xrif);
rv = xrif_set_size(xrif, rows, cols, 1, planes, XRIF_TYPECODE_INT16); // For a cube with `planes` images of size `rows X cols` of type `int16_t`
rv = xrif_allocate(xrif);
memcpy( xrif->raw, source_data, rows*cols*planes*sizeof(int16_t));
rv = xrif_encode(xrif);
rv = xrif_decode(xrif);
memcpy(source_data, xrif->raw, rows*cols*planes*sizeof(int16_t));
The library provides ways to use source_data directly (avoiding the memcpy), and control over which algorithms are used at each step of the compression.
Note that only int16 monochrome images are fully supported at this time.
| Field | Bytes | value |
|---|---|---|
| 0 | 0-3 | 'x' 'r' 'i' 'f' [magic number] |
| 1 | 4-7 | uint32_t version number of xrif protocol |
| 2 | 8-11 | uint32_t total size of header [offset to beginning of data, minimum is 48] |
| 3 | 12-15 | uint32_t width of a frame |
| 4 | 16-19 | uint32_t height of a frame |
| 5 | 20-23 | uint32_t depth of a frame [allows cubes, IFU spectra, etc] |
| 6 | 24-27 | uint32_t number of frames |
| 7 | 28-29 | uint16_t typecode [is uint8_t in struct, but alignment] |
| 7 | 30-31 | uint16_t difference method |
| 8 | 32-33 | uint16_t reorder method |
| 9 | 34-35 | uint16_t compression method |
| 10 | 36-39 | uint32_t size of compressed data |
| 10 | 40-47 | Reserved, used for method specific parameters. |
The current version is 0
The size of the data is specified by width X height X depth X xrif_typesize(typecode) X frames
Difference method can be:
| Val. | Meaning |
|---|---|
| 0 | none |
| 100 | w.r.t. previous frame |
| 200 | w.r.t. first frame |
Reorder method can be:
| Val. | Meaning |
|---|---|
| 0 | none |
| 100 | bytepack |
| 200 | bytepack-renibble |
| 300 | bitpack [warning: bitpack is broken, do not use] |
Compression method can be:
| Val. | Meaning |
|---|---|
| 0 | none |
| 100 | LZ4 |
If Compression method is LZ4 then bytes 40-41 are uint16_t containing the lz4_acceleration parameter.
The code documentation is here: https://jaredmales.github.io/xrif/