flowly_mp4/mp4box/
udta.rs1use 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}