flowly_mp4/mp4box/
mvex.rs1use serde::Serialize;
2use std::io::Write;
3
4use crate::mp4box::*;
5use crate::mp4box::{mehd::MehdBox, trex::TrexBox};
6
7#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize)]
8pub struct MvexBox {
9 pub mehd: Option<MehdBox>,
10 pub trex: TrexBox,
11}
12
13impl MvexBox {
14 pub fn get_type(&self) -> BoxType {
15 BoxType::MdiaBox
16 }
17
18 pub fn get_size(&self) -> u64 {
19 HEADER_SIZE + self.mehd.as_ref().map(|x| x.box_size()).unwrap_or(0) + self.trex.box_size()
20 }
21}
22
23impl Mp4Box for MvexBox {
24 const TYPE: BoxType = BoxType::MvexBox;
25
26 fn box_size(&self) -> u64 {
27 self.get_size()
28 }
29
30 fn to_json(&self) -> Result<String, Error> {
31 Ok(serde_json::to_string(&self).unwrap())
32 }
33
34 fn summary(&self) -> Result<String, Error> {
35 let s = String::new();
36 Ok(s)
37 }
38}
39
40impl BlockReader for MvexBox {
41 fn read_block<'a>(reader: &mut impl Reader<'a>) -> Result<Self, Error> {
42 let (mehd, trex) = reader.try_find_box2::<MehdBox, TrexBox>()?;
43
44 if trex.is_none() {
45 return Err(Error::BoxNotFound(BoxType::TrexBox));
46 }
47
48 Ok(MvexBox {
49 mehd,
50 trex: trex.unwrap(),
51 })
52 }
53
54 fn size_hint() -> usize {
55 TrexBox::size_hint()
56 }
57}
58
59impl<W: Write> WriteBox<&mut W> for MvexBox {
60 fn write_box(&self, writer: &mut W) -> Result<u64, Error> {
61 let size = self.box_size();
62 BoxHeader::new(Self::TYPE, size).write(writer)?;
63
64 if let Some(mehd) = &self.mehd {
65 mehd.write_box(writer)?;
66 }
67
68 self.trex.write_box(writer)?;
69
70 Ok(size)
71 }
72}