mpeg2ts/ts/
mod.rs

1//! Transport stream.
2//!
3//! # References
4//!
5//! - [MPEG transport stream](https://en.wikipedia.org/wiki/MPEG_transport_stream)
6pub 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    //! Transport stream payloads.
19
20    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}