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

1use crate::*;
2
3#[derive(Debug, Clone, PartialEq, Eq, Default)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5pub struct Ccst {
6    pub all_ref_pics_intra: bool,
7    pub intra_pred_used: bool,
8    pub max_ref_per_pic: u8,
9}
10
11impl AtomExt for Ccst {
12    type Ext = ();
13
14    const KIND_EXT: FourCC = FourCC::new(b"ccst");
15
16    fn decode_body_ext<B: Buf>(buf: &mut B, _ext: ()) -> Result<Self> {
17        let bits = u32::decode(buf)?;
18        let all_ref_pics_intra = (bits & 0x80000000u32) != 0;
19        let intra_pred_used = (bits & 0x40000000u32) != 0;
20        let max_ref_per_pic = ((bits & 0x3c000000u32) >> 26) as u8;
21        Ok(Ccst {
22            all_ref_pics_intra,
23            intra_pred_used,
24            max_ref_per_pic,
25        })
26    }
27
28    fn encode_body_ext<B: BufMut>(&self, buf: &mut B) -> Result<()> {
29        let mut bits = 0u32;
30        if self.all_ref_pics_intra {
31            bits |= 0x80000000u32;
32        }
33        if self.intra_pred_used {
34            bits |= 0x40000000u32;
35        }
36        let max_ref_per_pic = (self.max_ref_per_pic as u32) << 26;
37        bits |= max_ref_per_pic & 0x3c000000u32;
38        bits.encode(buf)
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_ccst_true_false_1() {
48        let expected = Ccst {
49            all_ref_pics_intra: true,
50            intra_pred_used: false,
51            max_ref_per_pic: 1,
52        };
53        let mut buf = Vec::new();
54        expected.encode(&mut buf).unwrap();
55
56        let mut buf = buf.as_ref();
57        assert_eq!(
58            buf,
59            [0, 0, 0, 0x10, b'c', b'c', b's', b't', 0, 0, 0, 0, 0b10000100, 0x00, 0x00, 0x00]
60        );
61        let decoded = Ccst::decode(&mut buf).unwrap();
62        assert_eq!(decoded, expected);
63    }
64
65    #[test]
66    fn test_ccst_false_true_15() {
67        let expected = Ccst {
68            all_ref_pics_intra: false,
69            intra_pred_used: true,
70            max_ref_per_pic: 15,
71        };
72        let mut buf = Vec::new();
73        expected.encode(&mut buf).unwrap();
74
75        let mut buf = buf.as_ref();
76        assert_eq!(
77            buf,
78            [0, 0, 0, 0x10, b'c', b'c', b's', b't', 0, 0, 0, 0, 0b01111100, 0x00, 0x00, 0x00]
79        );
80        let decoded = Ccst::decode(&mut buf).unwrap();
81        assert_eq!(decoded, expected);
82    }
83
84    #[test]
85    fn test_ccst_true_true_0() {
86        let expected = Ccst {
87            all_ref_pics_intra: true,
88            intra_pred_used: true,
89            max_ref_per_pic: 0,
90        };
91        let mut buf = Vec::new();
92        expected.encode(&mut buf).unwrap();
93
94        let mut buf = buf.as_ref();
95        assert_eq!(
96            buf,
97            [0, 0, 0, 0x10, b'c', b'c', b's', b't', 0, 0, 0, 0, 0b11000000, 0x00, 0x00, 0x00]
98        );
99        let decoded = Ccst::decode(&mut buf).unwrap();
100        assert_eq!(decoded, expected);
101    }
102
103    #[test]
104    fn test_ccst_false_false_7() {
105        let expected = Ccst {
106            all_ref_pics_intra: false,
107            intra_pred_used: false,
108            max_ref_per_pic: 7,
109        };
110        let mut buf = Vec::new();
111        expected.encode(&mut buf).unwrap();
112
113        let mut buf = buf.as_ref();
114        assert_eq!(
115            buf,
116            [0, 0, 0, 0x10, b'c', b'c', b's', b't', 0, 0, 0, 0, 0b00011100, 0x00, 0x00, 0x00]
117        );
118        let decoded = Ccst::decode(&mut buf).unwrap();
119        assert_eq!(decoded, expected);
120    }
121}