mp4_atom/moov/trak/mdia/minf/stbl/
stts.rs

1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq, Default)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5pub struct Stts {
6    pub entries: Vec<SttsEntry>,
7}
8
9#[derive(Debug, Clone, PartialEq, Eq, Default)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct SttsEntry {
12    pub sample_count: u32,
13    pub sample_delta: u32,
14}
15
16impl AtomExt for Stts {
17    type Ext = ();
18
19    const KIND_EXT: FourCC = FourCC::new(b"stts");
20
21    fn decode_body_ext<B: Buf>(buf: &mut B, _ext: ()) -> Result<Self> {
22        let entry_count = u32::decode(buf)?;
23        let mut entries = Vec::new();
24        for _ in 0..entry_count {
25            let entry = SttsEntry {
26                sample_count: u32::decode(buf)?,
27                sample_delta: u32::decode(buf)?,
28            };
29            entries.push(entry);
30        }
31
32        Ok(Stts { entries })
33    }
34
35    fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
36        (self.entries.len() as u32).encode(buf)?;
37        for entry in self.entries.iter() {
38            entry.sample_count.encode(buf)?;
39            entry.sample_delta.encode(buf)?;
40        }
41
42        Ok(())
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn test_stts() {
52        let expected = Stts {
53            entries: vec![
54                SttsEntry {
55                    sample_count: 29726,
56                    sample_delta: 1024,
57                },
58                SttsEntry {
59                    sample_count: 1,
60                    sample_delta: 512,
61                },
62            ],
63        };
64        let mut buf = Vec::new();
65        expected.encode(&mut buf).unwrap();
66
67        let mut buf = buf.as_ref();
68        let decoded = Stts::decode(&mut buf).unwrap();
69        assert_eq!(decoded, expected);
70    }
71}