flowly_mp4/mp4box/
stsd.rs

1use 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(); // XXX entry_count
75
76        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)?; // entry_count
132
133        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}