use crate::{ParsedBox, Result};
#[derive(Debug, Clone)]
pub struct TrunSample {
pub sample_duration: Option<u32>,
pub sample_size: Option<u32>,
pub sample_composition_time_offset: Option<i32>,
}
#[derive(Debug, Clone)]
pub struct TrunBox {
pub sample_count: u32,
pub sample_data: Vec<TrunSample>,
pub data_offset: Option<u32>,
}
impl TrunBox {
pub fn new(box_: &mut ParsedBox) -> Result<Self> {
let reader = &mut box_.reader;
let version = box_.version.unwrap();
let flags = box_.flags.unwrap();
let sample_count = reader.read_u32()?;
let mut sample_data = vec![];
let mut data_offset = None;
if (flags & 0x000001) != 0 {
data_offset = Some(reader.read_u32()?);
}
if (flags & 0x000004) != 0 {
reader.skip(4)?;
}
for _ in 0..sample_count {
let mut sample = TrunSample {
sample_duration: None,
sample_size: None,
sample_composition_time_offset: None,
};
if (flags & 0x000100) != 0 {
sample.sample_duration = Some(reader.read_u32()?);
}
if (flags & 0x000200) != 0 {
sample.sample_size = Some(reader.read_u32()?);
}
if (flags & 0x000400) != 0 {
reader.skip(4)?;
}
if (flags & 0x000800) != 0 {
sample.sample_composition_time_offset = Some(if version == 0 {
reader.read_u32()? as i32
} else {
reader.read_i32()?
});
}
sample_data.push(sample);
}
Ok(Self {
sample_count,
sample_data,
data_offset,
})
}
}