netpix_common/mpegts/descriptors/
ca_descriptor.rs

1use crate::implement_descriptor;
2use crate::mpegts::descriptors::{DescriptorHeader, ParsableDescriptor};
3use crate::utils::bits::BitReader;
4use bincode::{Decode, Encode};
5
6const CA_PID_MASK: u8 = 0b0001_1111;
7
8implement_descriptor! {
9    pub struct CaDescriptor {
10        pub ca_system_id: u16,
11        pub ca_pid: u16,
12        pub private_data: Vec<u8>,
13    }
14    unmarshall_impl: |header, data| {
15        if data.len() < 4 {
16            return None;
17        }
18
19        let reader = BitReader::new(data);
20        let ca_system_id = reader.get_bits_u16(0, 0xFF, 0xFF)?;
21        let ca_pid = reader.get_bits_u16_with_shift(2, CA_PID_MASK, 0xFF, 5)?;
22
23        Some(CaDescriptor {
24            header,
25            ca_system_id,
26            ca_pid,
27            private_data: reader.remaining_from(4)?,
28        })
29    }
30}
31
32#[cfg(test)]
33mod test {
34    use super::*;
35    use crate::mpegts::descriptors::{DescriptorHeader, ParsableDescriptor};
36
37    #[test]
38    fn test_unmarshall() {
39        let data = vec![0x01, 0x02, 0x03, 0x04, 0x05, 0x06];
40        let header = DescriptorHeader {
41            descriptor_tag: 0x01.into(),
42            descriptor_length: 0x02,
43        };
44        let ca_descriptor = CaDescriptor {
45            header: header.clone(),
46            ca_system_id: 0x0102,
47            ca_pid: 0x03 << 5 | 0x04,
48            private_data: vec![0x05, 0x06],
49        };
50        assert_eq!(CaDescriptor::unmarshall(header, &data), Some(ca_descriptor));
51    }
52
53    #[test]
54    fn test_eq() {
55        let header = DescriptorHeader {
56            descriptor_tag: 0x01.into(),
57            descriptor_length: 0x02,
58        };
59        let ca_descriptor = CaDescriptor {
60            header: header.clone(),
61            ca_system_id: 0x0102,
62            ca_pid: 0x03 << 5 | 0x04,
63            private_data: vec![0x05, 0x06],
64        };
65        assert_eq!(ca_descriptor, ca_descriptor.clone());
66    }
67
68    #[test]
69    fn test_should_display_audio_stream_descriptor() {
70        let header = DescriptorHeader {
71            descriptor_tag: 0x01.into(),
72            descriptor_length: 0x02,
73        };
74        let ca_descriptor = CaDescriptor {
75            header: header.clone(),
76            ca_system_id: 0x0102,
77            ca_pid: 0x03 << 5 | 0x04,
78            private_data: vec![0x05, 0x06],
79        };
80        assert_eq!(
81            format!("{}", ca_descriptor),
82            "Ca Descriptor\nCa System Id: 258\nCa Pid: 100\nPrivate Data: [5, 6]\n"
83        );
84    }
85}