#[derive(Debug)]
pub enum DecodeError {
NotHeif,
TruncatedBox(usize),
MissingBox(&'static str),
UnsupportedItemType(String),
Bitstream(String),
CabacDesync,
UnsupportedChroma(u8),
UnsupportedBitDepth(u8),
BadDimensions {
w: u32,
h: u32,
},
ParamSet(String),
Unsupported(String),
LimitExceeded {
what: &'static str,
value: u64,
limit: u64,
},
AllocationFailed {
what: &'static str,
bytes: usize,
},
}
impl std::fmt::Display for DecodeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::NotHeif => write!(f, "Not a HEIF/HEIC file (bad ftyp)"),
Self::TruncatedBox(offset) => write!(f, "Truncated box at offset {offset}"),
Self::MissingBox(name) => write!(f, "Required box '{name}' not found"),
Self::UnsupportedItemType(ty) => {
write!(f, "Unsupported item type '{ty}' — only hvc1 is supported")
}
Self::Bitstream(msg) => write!(f, "HEVC bitstream error: {msg}"),
Self::CabacDesync => write!(f, "CABAC decoder desync"),
Self::UnsupportedChroma(fmt) => write!(f, "Unsupported chroma format {fmt}"),
Self::UnsupportedBitDepth(depth) => write!(f, "Unsupported bit depth {depth}"),
Self::BadDimensions { w, h } => {
write!(f, "Image dimensions {w}×{h} are zero or exceed limits")
}
Self::ParamSet(msg) => write!(f, "SPS/PPS parse error: {msg}"),
Self::Unsupported(msg) => write!(f, "Unsupported HEVC feature: {msg}"),
Self::LimitExceeded { what, value, limit } => write!(
f,
"parse limit exceeded: {what} = {value} exceeds configured limit {limit}"
),
Self::AllocationFailed { what, bytes } => {
write!(f, "allocation failed for {what} ({bytes} bytes)")
}
}
}
}
impl std::error::Error for DecodeError {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn try_vec_reports_capacity_overflow() {
let result = (|| -> Result<Vec<u8>, DecodeError> {
Ok(try_vec![0u8; usize::MAX, "test image buffer"])
})();
assert!(matches!(
result,
Err(DecodeError::AllocationFailed {
what: "test image buffer",
..
})
));
}
}