mp4_atom/moov/trak/mdia/minf/stbl/stsd/
audio.rs1use 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)?; 0u16.encode(buf)?; self.data_reference_index.encode(buf)?;
18 0u16.encode(buf)?; 0u16.encode(buf)?; 0u32.encode(buf)?; self.channel_count.encode(buf)?;
22 self.sample_size.encode(buf)?;
23 0u32.encode(buf)?; 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)?; u16::decode(buf)?; let data_reference_index = u16::decode(buf)?;
34 let version = u16::decode(buf)?;
35 u16::decode(buf)?; u32::decode(buf)?; let channel_count = u16::decode(buf)?;
38 let sample_size = u16::decode(buf)?;
39 u32::decode(buf)?; let sample_rate = FixedPoint::decode(buf)?;
41
42 match version {
43 0 => {}
44 1 => {
45 u64::decode(buf)?;
47 u64::decode(buf)?;
48 }
49 2 => {
50 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}