mp4_atom/moov/trak/mdia/minf/stbl/
stsz.rs1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5pub enum StszSamples {
6 Identical { count: u32, size: u32 },
7 Different { sizes: Vec<u32> },
8}
9
10impl Default for StszSamples {
11 fn default() -> Self {
12 StszSamples::Different { sizes: vec![] }
13 }
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Default)]
20#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21pub struct Stsz {
22 pub samples: StszSamples,
23}
24
25impl AtomExt for Stsz {
26 type Ext = ();
27
28 const KIND_EXT: FourCC = FourCC::new(b"stsz");
29
30 fn decode_body_ext<B: Buf>(buf: &mut B, _ext: ()) -> Result<Self> {
31 let size = u32::decode(buf)?;
32 let count = u32::decode(buf)?;
33
34 let samples = match size {
35 0 => {
36 let mut sizes = Vec::with_capacity(count.min(1024) as usize);
37 for _ in 0..count {
38 sizes.push(u32::decode(buf)?)
39 }
40 StszSamples::Different { sizes }
41 }
42 size => StszSamples::Identical { count, size },
43 };
44
45 Ok(Stsz { samples })
46 }
47
48 fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
49 match self.samples {
50 StszSamples::Identical { count, size } => {
51 size.encode(buf)?;
52 count.encode(buf)?;
53 }
54 StszSamples::Different { ref sizes } => {
55 0u32.encode(buf)?;
56 (sizes.len() as u32).encode(buf)?;
57
58 for size in sizes {
59 size.encode(buf)?;
60 }
61 }
62 }
63
64 Ok(())
65 }
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71
72 #[test]
73 fn test_stsz_same_size() {
74 let expected = Stsz {
75 samples: StszSamples::Identical {
76 count: 4,
77 size: 1165,
78 },
79 };
80 let mut buf = Vec::new();
81 expected.encode(&mut buf).unwrap();
82
83 let mut buf = buf.as_ref();
84 let decoded = Stsz::decode(&mut buf).unwrap();
85 assert_eq!(decoded, expected);
86 }
87
88 #[test]
89 fn test_stsz_many_sizes() {
90 let expected = Stsz {
91 samples: StszSamples::Different {
92 sizes: vec![1165, 11, 11, 8545, 10126, 10866, 9643, 9351, 7730],
93 },
94 };
95 let mut buf = Vec::new();
96 expected.encode(&mut buf).unwrap();
97
98 let mut buf = buf.as_ref();
99 let decoded = Stsz::decode(&mut buf).unwrap();
100 assert_eq!(decoded, expected);
101 }
102}