mp4_atom/meta/properties/
rref.rs1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq, Default)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct Rref {
9 pub reference_types: Vec<FourCC>,
10}
11
12impl AtomExt for Rref {
13 type Ext = ();
14
15 const KIND_EXT: FourCC = FourCC::new(b"rref");
16
17 fn decode_body_ext<B: Buf>(buf: &mut B, _ext: ()) -> Result<Self> {
18 let reference_type_count = u8::decode(buf)?;
19 let mut reference_types = Vec::with_capacity(reference_type_count as usize);
20 for _ in 0..reference_type_count {
21 reference_types.push(FourCC::decode(buf)?);
22 }
23 Ok(Rref { reference_types })
24 }
25
26 fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
27 let reference_type_count = self.reference_types.len() as u8;
28 reference_type_count.encode(buf)?;
29 for reference_type in &self.reference_types {
30 reference_type.encode(buf)?;
31 }
32 Ok(())
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39
40 #[test]
41 fn test_rref() {
42 let expected = Rref {
43 reference_types: vec![FourCC::new(b"dpnd"), FourCC::new(b"base")],
44 };
45 let mut buf = Vec::new();
46 expected.encode(&mut buf).unwrap();
47
48 let mut buf = buf.as_ref();
49 assert_eq!(
50 buf,
51 [
52 0, 0, 0, 0x15, b'r', b'r', b'e', b'f', 0, 0, 0, 0, 2, b'd', b'p', b'n', b'd', b'b',
53 b'a', b's', b'e'
54 ]
55 );
56 let decoded = Rref::decode(&mut buf).unwrap();
57 assert_eq!(decoded, expected);
58 }
59}