mp4_atom/moov/trak/mdia/minf/stbl/stsd/
ccst.rs1use 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}