use crate::{ParsedBox, Result};
#[derive(Debug, Clone)]
pub struct SencSubsample {
pub bytes_of_clear_data: u16,
pub bytes_of_encrypted_data: u32,
}
#[derive(Debug, Clone)]
pub struct SencSample {
pub iv: [u8; 16],
pub subsamples: Vec<SencSubsample>,
}
#[derive(Debug, Clone)]
pub struct SencBox {
pub flags: u32,
pub samples: Vec<SencSample>,
}
impl SencBox {
pub fn new(box_: &mut ParsedBox, iv_size: u8, constant_iv: Option<&[u8; 16]>) -> Result<Self> {
let reader = &mut box_.reader;
let flags = box_.flags.unwrap_or(0);
let sample_count = reader.read_u32()?;
let has_subsamples = flags & 0x02 != 0;
let mut samples = Vec::with_capacity(sample_count as usize);
for _ in 0..sample_count {
let iv = if iv_size > 0 && iv_size <= 16 {
let bytes = reader.read_bytes_u8(iv_size as usize)?;
let mut iv = [0u8; 16];
iv[..bytes.len()].copy_from_slice(&bytes);
iv
} else if let Some(civ) = constant_iv {
*civ
} else {
[0u8; 16]
};
let subsamples = if has_subsamples {
let subsample_count = reader.read_u16()?;
let mut subs = Vec::with_capacity(subsample_count as usize);
for _ in 0..subsample_count {
let bytes_of_clear_data = reader.read_u16()?;
let bytes_of_encrypted_data = reader.read_u32()?;
subs.push(SencSubsample {
bytes_of_clear_data,
bytes_of_encrypted_data,
});
}
subs
} else {
Vec::new()
};
samples.push(SencSample { iv, subsamples });
}
Ok(Self { flags, samples })
}
}