1pub use self::adaptation_field::{AdaptationExtensionField, AdaptationField};
7pub use self::packet::{TsHeader, TsPacket, TsPayload};
8pub use self::pat::ProgramAssociation;
9pub use self::pmt::{Descriptor, EsInfo};
10pub use self::reader::{ReadTsPacket, TsPacketReader};
11pub use self::types::{
12 ContinuityCounter, LegalTimeWindow, Pid, PiecewiseRate, SeamlessSplice,
13 TransportScramblingControl, VersionNumber,
14};
15pub use self::writer::{TsPacketWriter, WriteTsPacket};
16
17pub mod payload {
18 pub use super::null::Null;
21 pub use super::pat::Pat;
22 pub use super::pes::Pes;
23 pub use super::pmt::Pmt;
24 pub use super::section::Section;
25 pub use super::types::Bytes;
26}
27
28mod adaptation_field;
29mod null;
30mod packet;
31mod pat;
32mod pes;
33mod pmt;
34mod psi;
35mod reader;
36mod section;
37mod types;
38mod writer;
39
40#[cfg(test)]
41mod test {
42 use super::*;
43 use crate::es::StreamType;
44
45 #[test]
46 fn pat() {
47 let mut reader = TsPacketReader::new(pat_packet_bytes());
48 let packet = track_try_unwrap!(reader.read_ts_packet()).unwrap();
49 assert_eq!(packet, pat_packet());
50 assert_eq!(track_try_unwrap!(reader.read_ts_packet()), None);
51
52 let mut writer = TsPacketWriter::new(Vec::new());
53 track_try_unwrap!(writer.write_ts_packet(&packet));
54
55 let mut reader = TsPacketReader::new(&writer.stream()[..]);
56 let packet = track_try_unwrap!(reader.read_ts_packet()).unwrap();
57 assert_eq!(packet.header, pat_packet().header);
58 assert_eq!(packet.payload, pat_packet().payload);
59 assert_eq!(track_try_unwrap!(reader.read_ts_packet()), None);
60 }
61
62 fn pat_packet_bytes() -> &'static [u8] {
63 &[
64 71, 64, 0, 17, 0, 0, 176, 13, 0, 0, 195, 0, 0, 0, 1, 225, 224, 232, 95, 116, 236, 255,
65 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
66 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
67 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
68 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
69 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
70 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
71 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
72 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
73 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
74 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
75 ][..]
76 }
77
78 fn pat_packet() -> TsPacket {
79 TsPacket {
80 header: TsHeader {
81 transport_error_indicator: false,
82 transport_priority: false,
83 pid: Pid::from(0),
84 transport_scrambling_control: TransportScramblingControl::NotScrambled,
85 continuity_counter: ContinuityCounter::from_u8(1).unwrap(),
86 },
87 adaptation_field: None,
88 payload: Some(TsPayload::Pat(payload::Pat {
89 transport_stream_id: 0,
90 version_number: VersionNumber::from_u8(1).unwrap(),
91 table: vec![ProgramAssociation {
92 program_num: 1,
93 program_map_pid: Pid::new(480).unwrap(),
94 }],
95 })),
96 }
97 }
98
99 #[test]
100 fn pmt() {
101 let mut bytes = Vec::new();
102 bytes.extend(pat_packet_bytes());
103 bytes.extend(pmt_packet_bytes());
104 let mut reader = TsPacketReader::new(&bytes[..]);
105 let mut writer = TsPacketWriter::new(Vec::new());
106
107 let packet = track_try_unwrap!(reader.read_ts_packet()).unwrap();
108 track_try_unwrap!(writer.write_ts_packet(&packet));
109
110 let packet = track_try_unwrap!(reader.read_ts_packet()).unwrap();
111 assert_eq!(packet.header, pmt_packet().header);
112 assert_eq!(packet.payload, pmt_packet().payload);
113 track_try_unwrap!(writer.write_ts_packet(&packet));
114
115 let mut reader = TsPacketReader::new(&writer.stream()[..]);
116 track_try_unwrap!(reader.read_ts_packet()).unwrap();
117 let packet = track_try_unwrap!(reader.read_ts_packet()).unwrap();
118 assert_eq!(packet.header, pmt_packet().header);
119 assert_eq!(packet.payload, pmt_packet().payload);
120 assert_eq!(track_try_unwrap!(reader.read_ts_packet()), None);
121 }
122
123 fn pmt_packet_bytes() -> &'static [u8] {
124 &[
125 71, 65, 224, 48, 0, 0, 2, 176, 34, 0, 1, 193, 0, 0, 225, 2, 240, 6, 5, 4, 67, 85, 69,
126 73, 134, 225, 3, 240, 0, 15, 225, 1, 240, 0, 27, 225, 2, 240, 0, 225, 243, 90, 60, 255,
127 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
128 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
129 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
130 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
131 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
132 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
133 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
134 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
135 255, 255, 255, 255, 255, 255, 255, 255,
136 ][..]
137 }
138
139 fn pmt_packet() -> TsPacket {
140 TsPacket {
141 header: TsHeader {
142 transport_error_indicator: false,
143 transport_priority: false,
144 pid: Pid::new(480).unwrap(),
145 transport_scrambling_control: TransportScramblingControl::NotScrambled,
146 continuity_counter: ContinuityCounter::from_u8(0).unwrap(),
147 },
148 adaptation_field: None,
149 payload: Some(TsPayload::Pmt(payload::Pmt {
150 program_num: 1,
151 pcr_pid: Some(Pid::new(258).unwrap()),
152 version_number: VersionNumber::new(),
153 program_info: vec![Descriptor {
154 tag: 5,
155 data: b"CUEI".to_vec(),
156 }],
157 es_info: vec![
158 EsInfo {
159 stream_type: StreamType::Dts8ChannelLosslessAudio,
160 elementary_pid: Pid::new(259).unwrap(),
161 descriptors: vec![],
162 },
163 EsInfo {
164 stream_type: StreamType::AdtsAac,
165 elementary_pid: Pid::new(257).unwrap(),
166 descriptors: vec![],
167 },
168 EsInfo {
169 stream_type: StreamType::H264,
170 elementary_pid: Pid::new(258).unwrap(),
171 descriptors: vec![],
172 },
173 ],
174 })),
175 }
176 }
177
178 #[test]
179 fn pid17() {
180 let mut reader = TsPacketReader::new(pid17_packet_bytes());
181 let packet = track_try_unwrap!(reader.read_ts_packet()).unwrap();
182 assert_eq!(packet.header.pid, Pid::from(17));
183 }
184
185 fn pid17_packet_bytes() -> &'static [u8] {
186 &[
187 71, 64, 17, 16, 0, 66, 240, 42, 0, 1, 193, 0, 0, 0, 1, 255, 0, 1, 252, 128, 25, 72, 23,
188 1, 6, 70, 70, 109, 112, 101, 103, 14, 66, 105, 103, 32, 66, 117, 99, 107, 32, 66, 117,
189 110, 110, 121, 182, 64, 83, 76, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
190 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
191 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
192 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
193 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
194 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
195 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
196 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
197 255, 255, 255, 255, 255, 255, 255, 25,
198 ][..]
199 }
200}