flowly_mp4/mp4box/
mvex.rs

1use 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}