diff --git a/src/mp4box/moov.rs b/src/mp4box/moov.rs index 872ec7f..cec21c6 100644 --- a/src/mp4box/moov.rs +++ b/src/mp4box/moov.rs @@ -140,7 +140,6 @@ impl WriteBox<&mut W> for MoovBox { for trak in self.traks.iter() { trak.write_box(writer)?; } - if let Some(udta) = &self.udta { udta.write_box(writer)?; } diff --git a/src/mp4box/mvex.rs b/src/mp4box/mvex.rs index 8eb0e53..44a4f19 100644 --- a/src/mp4box/mvex.rs +++ b/src/mp4box/mvex.rs @@ -7,8 +7,7 @@ use crate::mp4box::{mehd::MehdBox, trex::TrexBox}; #[derive(Debug, Clone, PartialEq, Eq, Default, Serialize)] pub struct MvexBox { pub mehd: Option, - // todo: this should be a vec - pub trex: TrexBox, + pub trex: Vec, } impl MvexBox { @@ -17,7 +16,8 @@ impl MvexBox { } pub fn get_size(&self) -> u64 { - HEADER_SIZE + self.mehd.as_ref().map(|x| x.box_size()).unwrap_or(0) + self.trex.box_size() + let trex_sizes = self.trex.iter().fold(0, |acc, x| acc + x.box_size()); + HEADER_SIZE + self.mehd.as_ref().map(|x| x.box_size()).unwrap_or(0) + trex_sizes } } @@ -45,7 +45,7 @@ impl ReadBox<&mut R> for MvexBox { let start = box_start(reader)?; let mut mehd = None; - let mut trex = None; + let mut trex: Vec = Vec::new(); let mut current = reader.stream_position()?; let end = start + size; @@ -64,7 +64,7 @@ impl ReadBox<&mut R> for MvexBox { mehd = Some(MehdBox::read_box(reader, s)?); } BoxType::TrexBox => { - trex = Some(TrexBox::read_box(reader, s)?); + trex.push(TrexBox::read_box(reader, s)?); } _ => { // XXX warn!() @@ -75,16 +75,13 @@ impl ReadBox<&mut R> for MvexBox { current = reader.stream_position()?; } - if trex.is_none() { + if trex.is_empty() { return Err(Error::BoxNotFound(BoxType::TrexBox)); } skip_bytes_to(reader, start + size)?; - Ok(MvexBox { - mehd, - trex: trex.unwrap(), - }) + Ok(MvexBox { mehd, trex }) } } @@ -96,7 +93,9 @@ impl WriteBox<&mut W> for MvexBox { if let Some(mehd) = &self.mehd { mehd.write_box(writer)?; } - self.trex.write_box(writer)?; + for trex in self.trex { + trex.write_box(writer)?; + } Ok(size) }