flowly_mp4/mp4box/
mfhd.rs

1use byteorder::{BigEndian, WriteBytesExt};
2use serde::Serialize;
3use std::io::Write;
4
5use crate::mp4box::*;
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
8pub struct MfhdBox {
9    pub version: u8,
10    pub flags: u32,
11    pub sequence_number: u32,
12}
13
14impl Default for MfhdBox {
15    fn default() -> Self {
16        MfhdBox {
17            version: 0,
18            flags: 0,
19            sequence_number: 1,
20        }
21    }
22}
23
24impl MfhdBox {
25    pub fn get_type(&self) -> BoxType {
26        BoxType::MfhdBox
27    }
28
29    pub fn get_size(&self) -> u64 {
30        HEADER_SIZE + HEADER_EXT_SIZE + 4
31    }
32}
33
34impl Mp4Box for MfhdBox {
35    const TYPE: BoxType = BoxType::MfhdBox;
36
37    fn box_size(&self) -> u64 {
38        self.get_size()
39    }
40
41    fn to_json(&self) -> Result<String, Error> {
42        Ok(serde_json::to_string(&self).unwrap())
43    }
44
45    fn summary(&self) -> Result<String, Error> {
46        let s = format!("sequence_number={}", self.sequence_number);
47        Ok(s)
48    }
49}
50
51impl BlockReader for MfhdBox {
52    fn read_block<'a>(reader: &mut impl Reader<'a>) -> Result<Self, Error> {
53        let (version, flags) = read_box_header_ext(reader);
54
55        Ok(MfhdBox {
56            version,
57            flags,
58            sequence_number: reader.get_u32(),
59        })
60    }
61
62    fn size_hint() -> usize {
63        8
64    }
65}
66
67impl<W: Write> WriteBox<&mut W> for MfhdBox {
68    fn write_box(&self, writer: &mut W) -> Result<u64, Error> {
69        let size = self.box_size();
70        BoxHeader::new(Self::TYPE, size).write(writer)?;
71
72        write_box_header_ext(writer, self.version, self.flags)?;
73        writer.write_u32::<BigEndian>(self.sequence_number)?;
74
75        Ok(size)
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82    use crate::mp4box::BoxHeader;
83
84    #[tokio::test]
85    async fn test_mfhd() {
86        let src_box = MfhdBox {
87            version: 0,
88            flags: 0,
89            sequence_number: 1,
90        };
91        let mut buf = Vec::new();
92        src_box.write_box(&mut buf).unwrap();
93        assert_eq!(buf.len(), src_box.box_size() as usize);
94
95        let mut reader = buf.as_slice();
96        let header = BoxHeader::read(&mut reader, &mut 0).await.unwrap().unwrap();
97        assert_eq!(header.kind, BoxType::MfhdBox);
98        assert_eq!(src_box.box_size(), header.size);
99
100        let dst_box = MfhdBox::read_block(&mut reader).unwrap();
101        assert_eq!(src_box, dst_box);
102    }
103}