scuffle_mp4/boxes/types/esds/
descriptor.rs1use 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 + {
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 }
61 + data.len() as u64 }
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}