mp4_atom/moov/mvex/
trex.rs

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