flowly_mp4/mp4box/
udta.rs

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