mp4_atom/moov/trak/mdia/minf/stbl/stsd/
audio.rs

1use crate::coding::{Decode, Encode};
2use crate::{Buf, BufMut, Error, FixedPoint, Result};
3
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct Audio {
7    pub data_reference_index: u16,
8    pub channel_count: u16,
9    pub sample_size: u16,
10    pub sample_rate: FixedPoint<u16>,
11}
12
13impl Encode for Audio {
14    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
15        0u32.encode(buf)?; // reserved
16        0u16.encode(buf)?; // reserved
17        self.data_reference_index.encode(buf)?;
18        0u16.encode(buf)?; // version
19        0u16.encode(buf)?; // reserved
20        0u32.encode(buf)?; // reserved
21        self.channel_count.encode(buf)?;
22        self.sample_size.encode(buf)?;
23        0u32.encode(buf)?; // reserved
24        self.sample_rate.encode(buf)?;
25
26        Ok(())
27    }
28}
29impl Decode for Audio {
30    fn decode<B: Buf>(buf: &mut B) -> Result<Self> {
31        u32::decode(buf)?; // reserved
32        u16::decode(buf)?; // reserved
33        let data_reference_index = u16::decode(buf)?;
34        let version = u16::decode(buf)?;
35        u16::decode(buf)?; // reserved
36        u32::decode(buf)?; // reserved
37        let channel_count = u16::decode(buf)?;
38        let sample_size = u16::decode(buf)?;
39        u32::decode(buf)?; // pre-defined, reserved
40        let sample_rate = FixedPoint::decode(buf)?;
41
42        match version {
43            0 => {}
44            1 => {
45                // Quicktime sound sample description version 1.
46                u64::decode(buf)?;
47                u64::decode(buf)?;
48            }
49            2 => {
50                // Quicktime sound sample description version 2.
51                u32::decode(buf)?;
52                let _sample_rate = u64::decode(buf)?;
53                let _channel_count = u32::decode(buf)?;
54                <[u8; 20]>::decode(buf)?;
55            }
56            n => return Err(Error::UnknownQuicktimeVersion(n)),
57        }
58
59        Ok(Self {
60            data_reference_index,
61            channel_count,
62            sample_size,
63            sample_rate,
64        })
65    }
66}