scuffle_mp4/boxes/types/
stss.rs1use std::io;
2
3use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
4use bytes::Bytes;
5
6use crate::boxes::header::{BoxHeader, FullBoxHeader};
7use crate::boxes::traits::BoxType;
8
9#[derive(Debug, Clone, PartialEq)]
10pub struct Stss {
13 pub header: FullBoxHeader,
14 pub entries: Vec<u32>,
15}
16
17impl BoxType for Stss {
18 const NAME: [u8; 4] = *b"stss";
19
20 fn demux(header: BoxHeader, data: Bytes) -> io::Result<Self> {
21 let mut reader = io::Cursor::new(data);
22
23 let header = FullBoxHeader::demux(header, &mut reader)?;
24
25 let entry_count = reader.read_u32::<BigEndian>()?;
26 let mut entries = Vec::with_capacity(entry_count as usize);
27 for _ in 0..entry_count {
28 let offset = reader.read_u32::<BigEndian>()?;
29 entries.push(offset);
30 }
31
32 Ok(Self { header, entries })
33 }
34
35 fn primitive_size(&self) -> u64 {
36 let size = self.header.size();
37 let size = size + 4; size + (self.entries.len() as u64 * 4)
40 }
41
42 fn primitive_mux<T: io::Write>(&self, writer: &mut T) -> io::Result<()> {
43 self.header.mux(writer)?;
44
45 writer.write_u32::<BigEndian>(self.entries.len() as u32)?;
46 for offset in &self.entries {
47 writer.write_u32::<BigEndian>(*offset)?;
48 }
49
50 Ok(())
51 }
52
53 fn validate(&self) -> io::Result<()> {
54 if self.header.version != 0 {
55 return Err(io::Error::new(io::ErrorKind::InvalidData, "stss version must be 0"));
56 }
57
58 if self.header.flags != 0 {
59 return Err(io::Error::new(io::ErrorKind::InvalidData, "stss flags must be 0"));
60 }
61
62 Ok(())
63 }
64}