mp4_atom/moov/trak/mdia/minf/stbl/stsd/vp9/
vp09.rs

1use crate::*;
2
3// https://www.webmproject.org/vp9/mp4/
4#[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}