mp4_atom/moov/trak/mdia/
hdlr.rs

1use 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)?; // pre-defined
25        let handler = FourCC::decode(buf)?;
26
27        <[u8; 12]>::decode(buf)?; // reserved
28
29        let name = String::decode(buf)?;
30
31        // Skip any trailing padding
32        //buf.advance(buf.remaining());
33
34        Ok(Hdlr { handler, name })
35    }
36
37    fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
38        0u32.encode(buf)?; // pre-defined
39        self.handler.encode(buf)?;
40
41        // 12 bytes reserved
42        [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}