mp4_atom/moov/trak/mdia/
hdlr.rs1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5pub struct Hdlr {
6 pub handler: FourCC,
7 pub name: String,
8}
9
10impl Default for Hdlr {
11 fn default() -> Self {
12 Hdlr {
13 handler: FourCC::new(b"none"),
14 name: String::new(),
15 }
16 }
17}
18
19impl AtomExt for Hdlr {
20 type Ext = ();
21 const KIND_EXT: FourCC = FourCC::new(b"hdlr");
22
23 fn decode_body_ext<B: Buf>(buf: &mut B, _ext: ()) -> Result<Self> {
24 u32::decode(buf)?; let handler = FourCC::decode(buf)?;
26
27 <[u8; 12]>::decode(buf)?; let name = String::decode(buf)?;
30
31 Ok(Hdlr { handler, name })
35 }
36
37 fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
38 0u32.encode(buf)?; self.handler.encode(buf)?;
40
41 [0u8; 12].encode(buf)?;
43
44 self.name.as_str().encode(buf)?;
45
46 Ok(())
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::*;
53
54 #[test]
55 fn test_hdlr() {
56 let expected = Hdlr {
57 handler: FourCC::new(b"vide"),
58 name: String::from("VideoHandler"),
59 };
60 let mut buf = Vec::new();
61 expected.encode(&mut buf).unwrap();
62
63 let mut buf = buf.as_ref();
64 let decoded = Hdlr::decode(&mut buf).unwrap();
65 assert_eq!(decoded, expected);
66 }
67
68 #[test]
69 fn test_hdlr_empty() {
70 let expected = Hdlr {
71 handler: FourCC::new(b"vide"),
72 name: String::new(),
73 };
74 let mut buf = Vec::new();
75 expected.encode(&mut buf).unwrap();
76
77 let mut buf = buf.as_ref();
78 let decoded = Hdlr::decode(&mut buf).unwrap();
79 assert_eq!(decoded, expected);
80 }
81}