mp4_atom/moov/trak/mdia/minf/
vmhd.rs1use 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}