mp4_atom/moov/udta/meta/
mod.rs1mod 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}