mp4_atom/moof/traf/
tfdt.rs1use 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}