use crate::error::Result;
pub mod adc_bitpack;
pub mod auto;
pub mod log_quant;
pub mod lossless_f32;
#[cfg(feature = "pco-backend")]
pub mod lossless_f32_pco;
#[cfg(feature = "lz4-baseline")]
pub mod lz4_baseline;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u16)]
#[non_exhaustive]
pub enum CodecId {
LosslessF32BssZstd = 0x0001,
LosslessF32Pco = 0x0002,
AdcBitpack = 0x0010,
LogQuantization = 0x0020,
RawZstd = 0x00F0,
RawNone = 0x00FF,
}
impl CodecId {
pub fn from_wire(value: u16) -> Option<Self> {
match value {
0x0001 => Some(Self::LosslessF32BssZstd),
0x0002 => Some(Self::LosslessF32Pco),
0x0010 => Some(Self::AdcBitpack),
0x0020 => Some(Self::LogQuantization),
0x00F0 => Some(Self::RawZstd),
0x00FF => Some(Self::RawNone),
_ => None,
}
}
pub fn to_wire(self) -> u16 {
self as u16
}
}
#[derive(Debug, Clone)]
pub struct ChannelParams {
pub name: String,
pub stored_bits: u8,
pub range: u32,
pub log_decades: (f32, f32),
pub adc_bits: Option<u8>,
pub signed: bool,
}
impl ChannelParams {
pub fn linear_unsigned(name: impl Into<String>, range: u32) -> Self {
Self {
name: name.into(),
stored_bits: 32,
range,
log_decades: (0.0, 0.0),
adc_bits: None,
signed: false,
}
}
pub fn is_log(&self) -> bool {
self.log_decades.0 > 0.0
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct EncodeStats {
pub input_events: u32,
pub input_bytes: u64,
pub output_bytes: u64,
}
impl EncodeStats {
pub fn ratio(&self) -> f64 {
if self.output_bytes == 0 {
0.0
} else {
self.input_bytes as f64 / self.output_bytes as f64
}
}
}
pub trait ColumnCodec: Send + Sync {
fn id(&self) -> CodecId;
fn encode_chunk(
&self,
input: &[f32],
params: &ChannelParams,
out: &mut Vec<u8>,
) -> Result<EncodeStats>;
fn decode_chunk(
&self,
payload: &[u8],
params: &ChannelParams,
out: &mut [f32],
) -> Result<()>;
}