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