use crate::fourcc::FourCc;
pub const CHUNK_HEADER_LEN: usize = 8;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ChunkHeader {
pub fourcc: FourCc,
pub size: u32,
}
impl ChunkHeader {
#[must_use]
pub const fn padding(size: u32) -> usize {
(size & 1) as usize
}
#[must_use]
pub const fn total_len(&self) -> usize {
CHUNK_HEADER_LEN + self.size as usize + Self::padding(self.size)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Chunk<'a> {
pub fourcc: FourCc,
pub payload: &'a [u8],
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn padding_is_one_for_odd_sizes() {
assert_eq!(ChunkHeader::padding(0), 0);
assert_eq!(ChunkHeader::padding(4), 0);
assert_eq!(ChunkHeader::padding(1), 1);
assert_eq!(ChunkHeader::padding(7), 1);
}
#[test]
fn total_len_includes_header_and_pad() {
let even = ChunkHeader {
fourcc: FourCc::VP8L,
size: 10,
};
assert_eq!(even.total_len(), CHUNK_HEADER_LEN + 10);
let odd = ChunkHeader {
fourcc: FourCc::VP8,
size: 11,
};
assert_eq!(odd.total_len(), CHUNK_HEADER_LEN + 11 + 1);
}
}