scuffle_mp4/boxes/types/esds/
mod.rs1use std::io;
2
3use bytes::{Buf, Bytes};
4
5use self::descriptor::DynDescriptor;
6use self::descriptor::traits::DescriptorType;
7use self::descriptor::types::es::EsDescriptor;
8use crate::boxes::header::{BoxHeader, FullBoxHeader};
9use crate::boxes::traits::BoxType;
10
11pub mod descriptor;
12
13#[derive(Debug, Clone, PartialEq)]
14pub struct Esds {
17 pub header: FullBoxHeader,
18 pub es_descriptor: EsDescriptor,
19 pub unknown: Vec<DynDescriptor>,
20}
21
22impl Esds {
23 pub fn new(es_descriptor: EsDescriptor) -> Self {
24 Self {
25 header: FullBoxHeader::new(Self::NAME, 0, 0),
26 es_descriptor,
27 unknown: Vec::new(),
28 }
29 }
30}
31
32impl BoxType for Esds {
33 const NAME: [u8; 4] = *b"esds";
34
35 fn demux(header: BoxHeader, data: Bytes) -> io::Result<Self> {
36 let mut reader = io::Cursor::new(data);
37
38 let header = FullBoxHeader::demux(header, &mut reader)?;
39
40 let mut es_descriptor = None;
41 let mut unknown = Vec::new();
42
43 while reader.has_remaining() {
44 let descriptor = DynDescriptor::demux(&mut reader)?;
45 match descriptor {
46 DynDescriptor::Es(desc) => {
47 es_descriptor = Some(desc);
48 }
49 _ => unknown.push(descriptor),
50 }
51 }
52
53 let es_descriptor = es_descriptor
54 .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidData, "esds box must contain es descriptor"))?;
55
56 Ok(Self {
57 header,
58 es_descriptor,
59 unknown,
60 })
61 }
62
63 fn primitive_size(&self) -> u64 {
64 self.header.size() + self.es_descriptor.size()
65 }
66
67 fn primitive_mux<T: io::Write>(&self, writer: &mut T) -> io::Result<()> {
68 self.header.mux(writer)?;
69
70 self.es_descriptor.mux(writer)?;
71
72 Ok(())
73 }
74}