pub mod ids {
pub const BYTE_SINGLE: u16 = 1;
pub const BYTE_INTERLEAVED2: u16 = 2;
pub const R64_SINGLE: u16 = 3;
pub const R64_INTERLEAVED2: u16 = 4;
pub const WORD_SINGLE: u16 = 5;
pub const WORD_INTERLEAVED2: u16 = 6;
pub const WORD_INTERLEAVED8: u16 = 7;
pub const WORD_INTERLEAVED16: u16 = 8;
pub const ALIAS_SINGLE: u16 = 9;
pub const ALIAS_INTERLEAVED2: u16 = 10;
}
pub fn codec_name(id: u16) -> &'static str {
match id {
ids::BYTE_SINGLE => "byte-single",
ids::BYTE_INTERLEAVED2 => "byte-interleaved2",
ids::R64_SINGLE => "r64-single",
ids::R64_INTERLEAVED2 => "r64-interleaved2",
ids::WORD_SINGLE => "word-single",
ids::WORD_INTERLEAVED2 => "word-interleaved2",
ids::WORD_INTERLEAVED8 => "word-interleaved8",
ids::WORD_INTERLEAVED16 => "word-interleaved16",
ids::ALIAS_SINGLE => "alias-single",
ids::ALIAS_INTERLEAVED2 => "alias-interleaved2",
_ => "unknown",
}
}
pub fn codec_states(id: u16) -> Option<u8> {
match id {
ids::BYTE_SINGLE | ids::R64_SINGLE | ids::WORD_SINGLE | ids::ALIAS_SINGLE => Some(1),
ids::BYTE_INTERLEAVED2
| ids::R64_INTERLEAVED2
| ids::WORD_INTERLEAVED2
| ids::ALIAS_INTERLEAVED2 => Some(2),
ids::WORD_INTERLEAVED8 => Some(8),
ids::WORD_INTERLEAVED16 => Some(16),
_ => None,
}
}
pub fn validate_scale_bits(id: u16, scale_bits: u8) -> Result<(), &'static str> {
match id {
ids::BYTE_SINGLE | ids::BYTE_INTERLEAVED2 => {
if scale_bits >= 1 && scale_bits <= 16 {
Ok(())
} else {
Err("byte rANS requires scale_bits 1..=16")
}
}
ids::R64_SINGLE | ids::R64_INTERLEAVED2 => {
if scale_bits >= 1 && scale_bits <= 31 {
Ok(())
} else {
Err("R64 requires scale_bits 1..=31")
}
}
ids::WORD_SINGLE
| ids::WORD_INTERLEAVED2
| ids::WORD_INTERLEAVED8
| ids::WORD_INTERLEAVED16 => {
if scale_bits == 12 {
Ok(())
} else {
Err("word rANS requires scale_bits = 12")
}
}
ids::ALIAS_SINGLE | ids::ALIAS_INTERLEAVED2 => {
if scale_bits >= 8 && scale_bits <= 17 {
Ok(())
} else {
Err("alias requires scale_bits 8..=17")
}
}
_ => Err("unknown codec"),
}
}
pub fn is_supported(id: u16) -> bool {
matches!(
id,
ids::BYTE_SINGLE
| ids::BYTE_INTERLEAVED2
| ids::R64_SINGLE
| ids::R64_INTERLEAVED2
| ids::WORD_SINGLE
| ids::WORD_INTERLEAVED2
| ids::WORD_INTERLEAVED8
| ids::WORD_INTERLEAVED16
| ids::ALIAS_SINGLE
| ids::ALIAS_INTERLEAVED2
)
}