mp4_atom/moof/traf/
tfdt.rs

1use crate::*;
2
3ext! {
4    name: Tfdt,
5    versions: [0, 1],
6    flags: {}
7}
8
9#[derive(Debug, Clone, PartialEq, Eq, Default)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct Tfdt {
12    pub base_media_decode_time: u64,
13}
14
15impl AtomExt for Tfdt {
16    const KIND_EXT: FourCC = FourCC::new(b"tfdt");
17
18    type Ext = TfdtExt;
19
20    fn decode_body_ext<B: Buf>(buf: &mut B, ext: TfdtExt) -> Result<Self> {
21        let base_media_decode_time = match ext.version {
22            TfdtVersion::V1 => u64::decode(buf)?,
23            TfdtVersion::V0 => u32::decode(buf)? as u64,
24        };
25
26        Ok(Tfdt {
27            base_media_decode_time,
28        })
29    }
30
31    fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<TfdtExt> {
32        self.base_media_decode_time.encode(buf)?;
33        Ok(TfdtVersion::V1.into())
34    }
35}
36
37#[cfg(test)]
38mod tests {
39
40    use super::*;
41
42    #[test]
43    fn test_tfdt32() {
44        let expected = Tfdt {
45            base_media_decode_time: 0,
46        };
47        let mut buf = Vec::new();
48        expected.encode(&mut buf).unwrap();
49
50        let mut buf = buf.as_ref();
51        let decoded = Tfdt::decode(&mut buf).unwrap();
52        assert_eq!(decoded, expected);
53    }
54
55    #[test]
56    fn test_tfdt64() {
57        let expected = Tfdt {
58            base_media_decode_time: u32::MAX as u64 + 1,
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 = Tfdt::decode(&mut buf).unwrap();
66        assert_eq!(decoded, expected);
67    }
68}