Skip to main content

mp4_atom/moov/trak/mdia/minf/stbl/stsd/amr/
amrsampleentry.rs

1use crate::coding::{Decode, Encode};
2use crate::{Buf, BufMut, Result};
3
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct AmrSampleEntry {
7    pub data_reference_index: u16,
8    pub timescale: u16,
9}
10
11impl Encode for AmrSampleEntry {
12    fn encode<B: BufMut>(&self, buf: &mut B) -> Result<()> {
13        [0u8; 6].encode(buf)?; // Reserved_6
14        self.data_reference_index.encode(buf)?;
15        [0u8; 8].encode(buf)?; // Reserved_8
16        2u16.encode(buf)?; // Reserved_2
17        16u16.encode(buf)?; // Reserved_2
18        [0u8; 4].encode(buf)?; // Reserved_4
19        self.timescale.encode(buf)?;
20        0u16.encode(buf)?; // Reserved_2
21        Ok(())
22    }
23}
24impl Decode for AmrSampleEntry {
25    fn decode<B: Buf>(buf: &mut B) -> Result<Self> {
26        u32::decode(buf)?; // first part of reserved_6
27        u16::decode(buf)?; // second part of reserved_6
28        let data_reference_index = u16::decode(buf)?;
29        u32::decode(buf)?; // first half of reserved_8
30        u32::decode(buf)?; // second half of reserved_8
31        u16::decode(buf)?; // reserved_2
32        u16::decode(buf)?; // reserved_2
33        u32::decode(buf)?; // reserved_4
34        let timescale = u16::decode(buf)?;
35        u16::decode(buf)?; // reserved_2
36
37        Ok(Self {
38            data_reference_index,
39            timescale,
40        })
41    }
42}