mp4_atom/moov/trak/mdia/minf/stbl/stsd/vp9/
vp09.rs1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq, Default)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub struct Vp09 {
7 pub visual: Visual,
8 pub vpcc: VpcC,
9 pub btrt: Option<Btrt>,
10 pub colr: Option<Colr>,
11 pub pasp: Option<Pasp>,
12}
13
14impl Atom for Vp09 {
15 const KIND: FourCC = FourCC::new(b"vp09");
16
17 fn decode_body<B: Buf>(buf: &mut B) -> Result<Self> {
18 let visual = Visual::decode(buf)?;
19
20 let mut vpcc = None;
21 let mut btrt = None;
22 let mut colr = None;
23 let mut pasp = None;
24 while let Some(atom) = Any::decode_maybe(buf)? {
25 match atom {
26 Any::VpcC(atom) => vpcc = atom.into(),
27 Any::Btrt(atom) => btrt = atom.into(),
28 Any::Colr(atom) => colr = atom.into(),
29 Any::Pasp(atom) => pasp = atom.into(),
30 unknown => Self::decode_unknown(&unknown)?,
31 }
32 }
33
34 Ok(Self {
35 visual,
36 vpcc: vpcc.ok_or(Error::MissingBox(VpcC::KIND))?,
37 btrt,
38 colr,
39 pasp,
40 })
41 }
42
43 fn encode_body<B: BufMut>(&self, buf: &mut B) -> Result<()> {
44 self.visual.encode(buf)?;
45 self.vpcc.encode(buf)?;
46 self.btrt.encode(buf)?;
47 self.colr.encode(buf)?;
48 self.pasp.encode(buf)?;
49
50 Ok(())
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn test_vp09() {
60 let expected = Vp09 {
61 visual: Visual {
62 width: 1920,
63 height: 1080,
64 ..Default::default()
65 },
66 vpcc: VpcC::default(),
67 btrt: None,
68 colr: None,
69 pasp: None,
70 };
71 let mut buf = Vec::new();
72 expected.encode(&mut buf).unwrap();
73
74 let mut buf = buf.as_ref();
75 let decoded = Vp09::decode(&mut buf).unwrap();
76 assert_eq!(decoded, expected);
77 }
78}