flowly_mp4/mp4box/
stsd.rs1use byteorder::{BigEndian, WriteBytesExt};
2use serde::Serialize;
3use std::io::Write;
4
5use crate::mp4box::vp09::Vp09Box;
6use crate::mp4box::*;
7use crate::mp4box::{avc1::Avc1Box, hev1::Hev1Box, mp4a::Mp4aBox, tx3g::Tx3gBox};
8
9#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize)]
10pub struct StsdBox {
11 pub version: u8,
12 pub flags: u32,
13
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub avc1: Option<Avc1Box>,
16
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub hev1: Option<Hev1Box>,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub vp09: Option<Vp09Box>,
22
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub mp4a: Option<Mp4aBox>,
25
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub tx3g: Option<Tx3gBox>,
28}
29
30impl StsdBox {
31 pub fn get_type(&self) -> BoxType {
32 BoxType::StsdBox
33 }
34
35 pub fn get_size(&self) -> u64 {
36 let mut size = HEADER_SIZE + HEADER_EXT_SIZE + 4;
37 if let Some(ref avc1) = self.avc1 {
38 size += avc1.box_size();
39 } else if let Some(ref hev1) = self.hev1 {
40 size += hev1.box_size();
41 } else if let Some(ref vp09) = self.vp09 {
42 size += vp09.box_size();
43 } else if let Some(ref mp4a) = self.mp4a {
44 size += mp4a.box_size();
45 } else if let Some(ref tx3g) = self.tx3g {
46 size += tx3g.box_size();
47 }
48
49 size
50 }
51}
52
53impl Mp4Box for StsdBox {
54 const TYPE: BoxType = BoxType::StsdBox;
55
56 fn box_size(&self) -> u64 {
57 self.get_size()
58 }
59
60 fn to_json(&self) -> Result<String, Error> {
61 Ok(serde_json::to_string(&self).unwrap())
62 }
63
64 fn summary(&self) -> Result<String, Error> {
65 let s = String::new();
66 Ok(s)
67 }
68}
69
70impl BlockReader for StsdBox {
71 fn read_block<'a>(reader: &mut impl Reader<'a>) -> Result<Self, Error> {
72 let (version, flags) = read_box_header_ext(reader);
73
74 reader.get_u32(); let mut avc1 = None;
77 let mut hev1 = None;
78 let mut vp09 = None;
79 let mut mp4a = None;
80 let mut tx3g = None;
81
82 while let Some(mut bx) = reader.get_box()? {
83 match bx.kind {
84 BoxType::Avc1Box => {
85 avc1 = Some(bx.read()?);
86 }
87
88 BoxType::Hev1Box => {
89 hev1 = Some(bx.read()?);
90 }
91
92 BoxType::Vp09Box => {
93 vp09 = Some(bx.read()?);
94 }
95
96 BoxType::Mp4aBox => {
97 mp4a = Some(bx.read()?);
98 }
99
100 BoxType::Tx3gBox => {
101 tx3g = Some(bx.read()?);
102 }
103
104 _ => {}
105 }
106 }
107
108 Ok(StsdBox {
109 version,
110 flags,
111 avc1,
112 hev1,
113 vp09,
114 mp4a,
115 tx3g,
116 })
117 }
118
119 fn size_hint() -> usize {
120 8
121 }
122}
123
124impl<W: Write> WriteBox<&mut W> for StsdBox {
125 fn write_box(&self, writer: &mut W) -> Result<u64, Error> {
126 let size = self.box_size();
127 BoxHeader::new(Self::TYPE, size).write(writer)?;
128
129 write_box_header_ext(writer, self.version, self.flags)?;
130
131 writer.write_u32::<BigEndian>(1)?; if let Some(ref avc1) = self.avc1 {
134 avc1.write_box(writer)?;
135 } else if let Some(ref hev1) = self.hev1 {
136 hev1.write_box(writer)?;
137 } else if let Some(ref vp09) = self.vp09 {
138 vp09.write_box(writer)?;
139 } else if let Some(ref mp4a) = self.mp4a {
140 mp4a.write_box(writer)?;
141 } else if let Some(ref tx3g) = self.tx3g {
142 tx3g.write_box(writer)?;
143 }
144
145 Ok(size)
146 }
147}