1use std::io;
2
3use scuffle_bytes_util::zero_copy::{Deserialize, Serialize, ZeroCopyReader};
4
5use super::{
6 ChunkLargeOffsetBox, ChunkOffsetBox, CompactSampleSizeBox, CompactSampleToGroupBox, CompositionOffsetBox,
7 CompositionToDecodeBox, PaddingBitsBox, SampleAuxiliaryInformationOffsetsBox, SampleAuxiliaryInformationSizesBox,
8 SampleDependencyTypeBox, SampleGroupDescriptionBox, SampleSizeBox, SampleToChunkBox, SampleToGroupBox,
9 ShadowSyncSampleBox, SubSampleInformationBox, SyncSampleBox, TimeToSampleBox,
10};
11use crate::{FullBoxHeader, IsoBox, IsoSized, UnknownBox};
12
13#[derive(IsoBox, Debug, PartialEq, Eq)]
17#[iso_box(box_type = b"stbl", crate_path = crate)]
18pub struct SampleTableBox<'a> {
19 #[iso_box(nested_box)]
21 pub stsd: SampleDescriptionBox<'a>,
22 #[iso_box(nested_box)]
24 pub stts: TimeToSampleBox,
25 #[iso_box(nested_box(collect))]
27 pub ctts: Option<CompositionOffsetBox>,
28 #[iso_box(nested_box(collect))]
30 pub cslg: Option<CompositionToDecodeBox>,
31 #[iso_box(nested_box)]
33 pub stsc: SampleToChunkBox,
34 #[iso_box(nested_box(collect))]
38 pub stsz: Option<SampleSizeBox>,
39 #[iso_box(nested_box(collect))]
43 pub stz2: Option<CompactSampleSizeBox<'a>>,
44 #[iso_box(nested_box(collect))]
48 pub stco: Option<ChunkOffsetBox>,
49 #[iso_box(nested_box(collect))]
53 pub co64: Option<ChunkLargeOffsetBox>,
54 #[iso_box(nested_box(collect))]
56 pub stss: Option<SyncSampleBox>,
57 #[iso_box(nested_box(collect))]
59 pub stsh: Option<ShadowSyncSampleBox>,
60 #[iso_box(nested_box(collect))]
62 pub padb: Option<PaddingBitsBox>,
63 #[iso_box(nested_box(collect))]
65 pub stdp: Option<DegradationPriorityBox>,
66 #[iso_box(nested_box(collect))]
68 pub sdtp: Option<SampleDependencyTypeBox>,
69 #[iso_box(nested_box(collect))]
71 pub sbgp: Vec<SampleToGroupBox>,
72 #[iso_box(nested_box(collect))]
74 pub sgpd: Vec<SampleGroupDescriptionBox<'a>>,
75 #[iso_box(nested_box(collect))]
77 pub subs: Vec<SubSampleInformationBox>,
78 #[iso_box(nested_box(collect))]
80 pub saiz: Vec<SampleAuxiliaryInformationSizesBox<'a>>,
81 #[iso_box(nested_box(collect))]
83 pub saio: Vec<SampleAuxiliaryInformationOffsetsBox>,
84 #[iso_box(nested_box(collect))]
86 pub csgp: Vec<CompactSampleToGroupBox>,
87}
88
89impl<'a> SampleTableBox<'a> {
90 pub fn new(
92 stsd: SampleDescriptionBox<'a>,
93 stts: TimeToSampleBox,
94 stsc: SampleToChunkBox,
95 stsz: Option<SampleSizeBox>,
96 stco: ChunkOffsetBox,
97 ) -> Self {
98 Self {
99 stsd,
100 stts,
101 ctts: None,
102 cslg: None,
103 stsc,
104 stsz,
105 stz2: None,
106 stco: Some(stco),
107 co64: None,
108 stss: None,
109 stsh: None,
110 padb: None,
111 stdp: None,
112 sdtp: None,
113 sbgp: vec![],
114 sgpd: vec![],
115 subs: vec![],
116 saiz: vec![],
117 saio: vec![],
118 csgp: vec![],
119 }
120 }
121}
122
123#[derive(Debug, PartialEq, Eq)]
130pub struct SampleEntry {
131 pub reserved: [u8; 6],
133 pub data_reference_index: u16,
137}
138
139impl Default for SampleEntry {
140 fn default() -> Self {
141 Self {
142 reserved: [0; 6],
143 data_reference_index: 1,
144 }
145 }
146}
147
148impl<'a> Deserialize<'a> for SampleEntry {
149 fn deserialize<R>(mut reader: R) -> io::Result<Self>
150 where
151 R: ZeroCopyReader<'a>,
152 {
153 let reserved = <[u8; 6]>::deserialize(&mut reader)?;
154 let data_reference_index = u16::deserialize(&mut reader)?;
155
156 Ok(Self {
157 reserved,
158 data_reference_index,
159 })
160 }
161}
162
163impl Serialize for SampleEntry {
164 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
165 where
166 W: std::io::Write,
167 {
168 self.reserved.serialize(&mut writer)?;
169 self.data_reference_index.serialize(&mut writer)?;
170 Ok(())
171 }
172}
173
174impl IsoSized for SampleEntry {
175 fn size(&self) -> usize {
176 self.reserved.size() + self.data_reference_index.size()
177 }
178}
179
180#[derive(IsoBox, Debug, PartialEq, Eq)]
184#[iso_box(box_type = b"btrt", crate_path = crate)]
185pub struct BitRateBox {
186 pub buffer_size_db: u32,
188 pub max_bitrate: u32,
192 pub avg_bitrate: u32,
196}
197
198#[derive(IsoBox, Debug, PartialEq, Eq)]
202#[iso_box(box_type = b"stsd", crate_path = crate)]
203pub struct SampleDescriptionBox<'a> {
204 pub full_header: FullBoxHeader,
206 pub entry_count: u32,
208 #[iso_box(nested_box(collect_unknown))]
210 pub boxes: Vec<UnknownBox<'a>>,
211}
212
213impl<'a> SampleDescriptionBox<'a> {
214 pub fn new(boxes: Vec<UnknownBox<'a>>) -> Self {
216 Self {
217 full_header: FullBoxHeader::default(),
218 entry_count: boxes.len() as u32,
219 boxes,
220 }
221 }
222}
223
224#[derive(IsoBox, Debug, PartialEq, Eq)]
228#[iso_box(box_type = b"stdp", crate_path = crate)]
229pub struct DegradationPriorityBox {
230 pub full_header: FullBoxHeader,
232 #[iso_box(repeated)]
234 pub priority: Vec<u16>,
235}