mp4_atom/moov/udta/meta/
mod.rs

1mod ilst;
2pub use ilst::*;
3
4use crate::*;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub enum Meta {
9    Mdir { ilst: Option<Ilst> },
10    Unknown { hdlr: Hdlr, data: Vec<u8> },
11}
12
13impl Default for Meta {
14    fn default() -> Self {
15        Self::Mdir { ilst: None }
16    }
17}
18
19const MDIR: FourCC = FourCC::new(b"mdir");
20
21impl AtomExt for Meta {
22    type Ext = ();
23
24    const KIND_EXT: FourCC = FourCC::new(b"meta");
25
26    fn decode_body_ext<B: Buf>(buf: &mut B, _ext: ()) -> Result<Self> {
27        let hdlr = Hdlr::decode(buf)?;
28
29        match hdlr.handler {
30            MDIR => {
31                let ilst = Ilst::decode_maybe(buf)?;
32                Ok(Meta::Mdir { ilst })
33            }
34            _ => {
35                let data = Vec::<u8>::decode(buf)?;
36                Ok(Meta::Unknown { hdlr, data })
37            }
38        }
39    }
40
41    fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
42        match self {
43            Self::Mdir { ilst } => {
44                Hdlr {
45                    handler: MDIR,
46                    ..Default::default()
47                }
48                .encode(buf)?;
49                ilst.encode(buf)?;
50            }
51            Self::Unknown { hdlr, data } => {
52                hdlr.encode(buf)?;
53                data.encode(buf)?;
54            }
55        }
56
57        Ok(())
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64
65    #[test]
66    fn test_meta_mdir_empty() {
67        let expected = Meta::Mdir { ilst: None };
68
69        let mut buf = Vec::new();
70        expected.encode(&mut buf).unwrap();
71
72        let mut buf = buf.as_ref();
73        let output = Meta::decode(&mut buf).unwrap();
74        assert_eq!(output, expected);
75    }
76
77    #[test]
78    fn test_meta_mdir() {
79        let expected = Meta::Mdir {
80            ilst: Some(Ilst::default()),
81        };
82
83        let mut buf = Vec::new();
84        expected.encode(&mut buf).unwrap();
85
86        let mut buf = buf.as_ref();
87        let output = Meta::decode(&mut buf).unwrap();
88        assert_eq!(output, expected);
89    }
90}