scuffle_mp4/boxes/types/esds/
descriptor.rs

1use std::io;
2
3use byteorder::WriteBytesExt;
4use bytes::Bytes;
5
6use self::header::DescriptorHeader;
7use self::traits::DescriptorType;
8use self::types::decoder_config::DecoderConfigDescriptor;
9use self::types::decoder_specific_info::DecoderSpecificInfoDescriptor;
10use self::types::es::EsDescriptor;
11use self::types::sl_config::SLConfigDescriptor;
12
13pub mod header;
14pub mod traits;
15pub mod types;
16
17#[derive(Debug, Clone, PartialEq)]
18pub enum DynDescriptor {
19    Es(EsDescriptor),
20    DecoderConfig(DecoderConfigDescriptor),
21    DecoderSpecificInfo(DecoderSpecificInfoDescriptor),
22    SLConfig(SLConfigDescriptor),
23    Unknown(DescriptorHeader, Bytes),
24}
25
26impl DynDescriptor {
27    pub fn demux(reader: &mut io::Cursor<Bytes>) -> io::Result<Self> {
28        let (header, data) = DescriptorHeader::parse(reader)?;
29        match header.tag {
30            EsDescriptor::TAG => Ok(Self::Es(EsDescriptor::demux(header, data)?)),
31            DecoderConfigDescriptor::TAG => Ok(Self::DecoderConfig(DecoderConfigDescriptor::demux(header, data)?)),
32            DecoderSpecificInfoDescriptor::TAG => {
33                Ok(Self::DecoderSpecificInfo(DecoderSpecificInfoDescriptor::demux(header, data)?))
34            }
35            SLConfigDescriptor::TAG => Ok(Self::SLConfig(SLConfigDescriptor::demux(header, data)?)),
36            _ => Ok(Self::Unknown(header, data)),
37        }
38    }
39
40    pub fn size(&self) -> u64 {
41        match self {
42            Self::Es(desc) => desc.size(),
43            Self::DecoderConfig(desc) => desc.size(),
44            Self::DecoderSpecificInfo(desc) => desc.size(),
45            Self::SLConfig(desc) => desc.size(),
46            Self::Unknown(_, data) => {
47                1 // tag
48                + {
49                    let mut size = data.len() as u32;
50                    let mut bytes_required = 0;
51                    loop {
52                        size >>= 7;
53                        bytes_required += 1;
54                        if size == 0 {
55                            break;
56                        }
57                    }
58
59                    bytes_required // number of bytes required to encode the size
60                }
61                + data.len() as u64 // data
62            }
63        }
64    }
65
66    pub fn mux<T: io::Write>(&self, writer: &mut T) -> io::Result<()> {
67        match self {
68            Self::Es(desc) => desc.mux(writer),
69            Self::DecoderConfig(desc) => desc.mux(writer),
70            Self::DecoderSpecificInfo(desc) => desc.mux(writer),
71            Self::SLConfig(desc) => desc.mux(writer),
72            Self::Unknown(header, data) => {
73                writer.write_u8(header.tag.into())?;
74                let mut size = data.len() as u32;
75                loop {
76                    let byte = (size & 0b01111111) as u8;
77                    size >>= 7;
78                    if size == 0 {
79                        writer.write_u8(byte)?;
80                        break;
81                    } else {
82                        writer.write_u8(byte | 0b10000000)?;
83                    }
84                }
85                writer.write_all(data)?;
86
87                Ok(())
88            }
89        }
90    }
91}