xref: /xiu/library/container/mpegts/src/pat.rs (revision c4a586d9)
1 use {
2     super::{crc32, define::epat_pid, errors::MpegTsError, pmt},
3     byteorder::{BigEndian, LittleEndian},
4     bytes::BytesMut,
5     bytesio::bytes_writer::BytesWriter,
6 };
7 
8 #[derive(Debug, Clone)]
9 pub struct Pat {
10     transport_stream_id: u16,
11     version_number: u8, //5bits
12     //continuity_counter: u8, //s4 bits
13 
14     //pub pmt_count: usize,
15     pub pmt: Vec<pmt::Pmt>,
16 }
17 
18 impl Default for Pat {
default() -> Self19     fn default() -> Self {
20         Self::new()
21     }
22 }
23 
24 impl Pat {
new() -> Self25     pub fn new() -> Self {
26         Self {
27             transport_stream_id: 1,
28             version_number: 0,
29             //continuity_counter: 0,
30             //pmt_count: 0,
31             pmt: Vec::new(),
32         }
33     }
34 }
35 pub struct PatMuxer {
36     pub bytes_writer: BytesWriter,
37 }
38 
39 impl Default for PatMuxer {
default() -> Self40     fn default() -> Self {
41         Self::new()
42     }
43 }
44 //ITU-T H.222.0
45 impl PatMuxer {
new() -> Self46     pub fn new() -> Self {
47         Self {
48             bytes_writer: BytesWriter::new(),
49         }
50     }
51 
write(&mut self, pat: Pat) -> Result<BytesMut, MpegTsError>52     pub fn write(&mut self, pat: Pat) -> Result<BytesMut, MpegTsError> {
53         /*table id*/
54         self.bytes_writer.write_u8(epat_pid::PAT_TID_PAS as u8)?;
55 
56         /*section length*/
57         let length = pat.pmt.len() as u16 * 4 + 5 + 4;
58         self.bytes_writer.write_u16::<BigEndian>(0xb000 | length)?;
59         /*transport_stream_id*/
60         self.bytes_writer
61             .write_u16::<BigEndian>(pat.transport_stream_id)?;
62         /*version_number*/
63         self.bytes_writer
64             .write_u8(0xC1 | (pat.version_number << 1))?;
65 
66         /*section_number*/
67         /*last_section_number*/
68         self.bytes_writer.write_u16::<BigEndian>(0x00)?;
69 
70         for ele in &pat.pmt {
71             /*program number*/
72             self.bytes_writer
73                 .write_u16::<BigEndian>(ele.program_number)?;
74             /*PID*/
75             self.bytes_writer.write_u16::<BigEndian>(0xE000 | ele.pid)?;
76         }
77 
78         /*crc32*/
79         let crc32_value = crc32::gen_crc32(0xffffffff, self.bytes_writer.get_current_bytes());
80         self.bytes_writer.write_u32::<LittleEndian>(crc32_value)?;
81 
82         // let mut test = BytesWriter::new();
83         // test.write_u32::<LittleEndian>(crc32_value)?;
84         // let a0 = test.get(0).unwrap().clone();
85         // let aa0 = crc32_value & 0xFF;
86         // let b0 = test.get(1).unwrap().clone();
87         // let bb0 = (crc32_value >> 8) & 0xFF;
88         // let c0 = test.get(2).unwrap().clone();
89         // let cc0 = (crc32_value >> 16) & 0xFF;
90         // let d0 = test.get(3).unwrap().clone();
91         // let dd0 = (crc32_value >> 24) & 0xFF;
92 
93         Ok(self.bytes_writer.extract_current_bytes())
94     }
95 }
96