scuffle_mp4/boxes/types/esds/
mod.rs

1use 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)]
14/// Elementary Stream Descriptor Box
15/// ISO/IEC 14496-14:2020(E) - 6.7.2
16pub 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}