scuffle_mp4/object_description/
profile_level_indication_index.rs

1use isobmff::IsoSized;
2use scuffle_bytes_util::zero_copy::{Deserialize, DeserializeSeed, Serialize};
3
4use super::{BaseDescriptor, DescriptorTag};
5
6/// Profile Level Indication Index Descriptor
7///
8/// ISO/IEC 14496-1 - 7.2.6.20
9#[derive(Debug, PartialEq, Eq)]
10pub struct ProfileLevelIndicationIndexDescriptor {
11    /// A unique identifier for the set of profile and level indications described
12    /// in this descriptor within the name scope defined by the IOD.
13    pub profile_level_indication_index: u8,
14}
15
16impl ProfileLevelIndicationIndexDescriptor {
17    /// Returns the base descriptor of this `ProfileLevelIndicationIndexDescriptor`.
18    pub fn base_descriptor(&self) -> BaseDescriptor {
19        BaseDescriptor {
20            tag: DescriptorTag::profileLevelIndicationIndexDescrTag,
21            size_of_instance: self.payload_size() as u32,
22        }
23    }
24
25    fn payload_size(&self) -> usize {
26        self.profile_level_indication_index.size()
27    }
28}
29
30impl<'a> Deserialize<'a> for ProfileLevelIndicationIndexDescriptor {
31    fn deserialize<R>(mut reader: R) -> std::io::Result<Self>
32    where
33        R: scuffle_bytes_util::zero_copy::ZeroCopyReader<'a>,
34    {
35        let base_descriptor = BaseDescriptor::deserialize(&mut reader)?;
36        Self::deserialize_seed(reader, base_descriptor)
37    }
38}
39
40impl<'a> DeserializeSeed<'a, BaseDescriptor> for ProfileLevelIndicationIndexDescriptor {
41    fn deserialize_seed<R>(reader: R, seed: BaseDescriptor) -> std::io::Result<Self>
42    where
43        R: scuffle_bytes_util::zero_copy::ZeroCopyReader<'a>,
44    {
45        let reader = reader.take(seed.size_of_instance as usize);
46
47        Ok(Self {
48            profile_level_indication_index: u8::deserialize(reader)?,
49        })
50    }
51}
52
53impl Serialize for ProfileLevelIndicationIndexDescriptor {
54    fn serialize<W>(&self, mut writer: W) -> std::io::Result<()>
55    where
56        W: std::io::Write,
57    {
58        self.base_descriptor().serialize(&mut writer)?;
59        self.profile_level_indication_index.serialize(&mut writer)?;
60        Ok(())
61    }
62}
63
64impl IsoSized for ProfileLevelIndicationIndexDescriptor {
65    fn size(&self) -> usize {
66        self.base_descriptor().size() + self.payload_size()
67    }
68}