Project Files
src / fpzip / fpzip_bridge.cpp
#include <stdint.h>
#include "fpzip.h"
extern "C"
{
int fpzip_get_header(
const uint8_t *buffer,
int *outType,
int *outPrec,
int *outNx,
int *outNy,
int *outNz,
int *outNf)
{
FPZ *fpz = fpzip_read_from_buffer(buffer);
if (!fpz)
return 0;
if (!fpzip_read_header(fpz))
{
fpzip_read_close(fpz);
return 0;
}
*outType = fpz->type;
*outPrec = fpz->prec;
*outNx = fpz->nx;
*outNy = fpz->ny;
*outNz = fpz->nz;
*outNf = fpz->nf;
fpzip_read_close(fpz);
return 1;
}
// Returns number of compressed bytes consumed (0 on error)
int fpzip_decompress_f32(const uint8_t *buffer, float *outData)
{
FPZ *fpz = fpzip_read_from_buffer(buffer);
if (!fpz)
return 0;
if (!fpzip_read_header(fpz))
{
fpzip_read_close(fpz);
return 0;
}
if (fpz->type != FPZIP_TYPE_FLOAT)
{
fpzip_read_close(fpz);
return 0;
}
size_t bytes = fpzip_read(fpz, outData);
fpzip_read_close(fpz);
return (int)bytes;
}
// Returns number of compressed bytes written (0 on error)
int fpzip_compress_f32(
const float *data,
int nValues,
int precBits,
uint8_t *outBuffer,
int outCap)
{
FPZ *fpz = fpzip_write_to_buffer(outBuffer, (size_t)outCap);
if (!fpz)
return 0;
fpz->type = FPZIP_TYPE_FLOAT;
fpz->prec = precBits;
fpz->nx = nValues;
fpz->ny = 1;
fpz->nz = 1;
fpz->nf = 1;
if (!fpzip_write_header(fpz))
{
fpzip_write_close(fpz);
return 0;
}
size_t bytes = fpzip_write(fpz, data);
fpzip_write_close(fpz);
return (int)bytes;
}
// NNC-compatible compression with proper tensor dimensions
// NNC sets: nx=dims[last], ny=dims[last-1], nz=dims[last-2], nf=remaining
// For a [height, width, channels] tensor: nx=channels, ny=width, nz=height
int fpzip_compress_f32_dims(
const float *data,
int nx,
int ny,
int nz,
int nf,
int precBits,
uint8_t *outBuffer,
int outCap)
{
FPZ *fpz = fpzip_write_to_buffer(outBuffer, (size_t)outCap);
if (!fpz)
return 0;
fpz->type = FPZIP_TYPE_FLOAT;
fpz->prec = precBits;
fpz->nx = nx;
fpz->ny = ny;
fpz->nz = nz;
fpz->nf = nf;
if (!fpzip_write_header(fpz))
{
fpzip_write_close(fpz);
return 0;
}
size_t bytes = fpzip_write(fpz, data);
fpzip_write_close(fpz);
return (int)bytes;
}
int fpzip_errno_code()
{
return (int)fpzip_errno;
}
const char *fpzip_errno_string()
{
return fpzip_errstr[(int)fpzip_errno];
}
}