mp4_atom/moov/trak/mdia/minf/
vmhd.rs

1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq, Default)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5pub struct Vmhd {
6    pub graphics_mode: u16,
7    pub op_color: RgbColor,
8}
9
10#[derive(Debug, Clone, PartialEq, Eq, Default)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12pub struct RgbColor {
13    pub red: u16,
14    pub green: u16,
15    pub blue: u16,
16}
17
18impl AtomExt for Vmhd {
19    type Ext = ();
20
21    const KIND_EXT: FourCC = FourCC::new(b"vmhd");
22
23    fn decode_body_ext<B: Buf>(buf: &mut B, _ext: ()) -> Result<Self> {
24        let graphics_mode = u16::decode(buf)?;
25        let op_color = RgbColor {
26            red: u16::decode(buf)?,
27            green: u16::decode(buf)?,
28            blue: u16::decode(buf)?,
29        };
30
31        Ok(Vmhd {
32            graphics_mode,
33            op_color,
34        })
35    }
36
37    fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
38        self.graphics_mode.encode(buf)?;
39        self.op_color.red.encode(buf)?;
40        self.op_color.green.encode(buf)?;
41        self.op_color.blue.encode(buf)?;
42
43        Ok(())
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn test_vmhd() {
53        let expected = Vmhd {
54            graphics_mode: 0,
55            op_color: RgbColor {
56                red: 0,
57                green: 0,
58                blue: 0,
59            },
60        };
61        let mut buf = Vec::new();
62        expected.encode(&mut buf).unwrap();
63
64        let mut buf = buf.as_ref();
65        let decoded = Vmhd::decode(&mut buf).unwrap();
66        assert_eq!(decoded, expected);
67    }
68}