mp4_atom/moov/trak/mdia/minf/stbl/
stts.rs1use 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}