netpix_common/mpegts/descriptors/
ca_descriptor.rs1use 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}