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