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
//! ETSI TS 102 773 v1.4.1 DVB-T2 Modulator Interface (T2-MI) parser + builder.
//!
//! Entry points:
//! - [`Parse`](dvb_common::Parse) / [`Serialize`](dvb_common::Serialize) — the two
//! symmetric contracts every payload type implements.
//! - [`packet`] — T2-MI packet header and type parsing.
//! - [`payload`] — BBFrame, L1, FEF, timestamp, and addressing payload types.
//! - [`crc`] — CRC-32 per Annex A.
//!
//! # RFU policy
//!
//! Payload parsers REJECT non-zero reserved (rfu) bits with
//! `ReservedBitsViolation` and serialize them as 0 — with one deliberate
//! exception: individual addressing (0x21) PRESERVES its leading rfu byte
//! verbatim so gateway streams round-trip byte-exact (see
//! `payload::individual_addressing`).
//!
//! # Quickstart: pump a TS, get typed payloads
//!
//! [`pump::T2miPump`] filters a TS by PID, reassembles + CRC-validates T2-MI
//! packets, and hands back events whose [`payload`](pump::T2miEvent::payload)
//! dispatches to a typed [`payload::AnyPayload`]:
//!
//! ```no_run
//! use dvb_t2mi::pump::T2miPump;
//! use dvb_t2mi::payload::AnyPayload;
//!
//! let mut pump = T2miPump::new(0x0006); // T2-MI PID from the PMT
//! # let ts_packets: Vec<[u8; 188]> = Vec::new();
//! for packet in &ts_packets { // each aligned 188-byte TS packet
//! for event in pump.feed_ts(packet) {
//! if let Ok(AnyPayload::Bbframe(bb)) = event.payload() {
//! println!("BBFrame plp_id={}", bb.plp_id);
//! }
//! }
//! }
//! ```
//!
//! # The full signal chain
//!
//! T2-MI carries DVB-T2 BBFrames, which carry the inner MPEG-TS, which carries
//! SI. The crates compose end to end — T2-MI here, BBFrame extraction in
//! [`dvb-bbframe`](https://docs.rs/dvb-bbframe), SI demux in
//! [`dvb-si`](https://docs.rs/dvb-si):
//!
//! ```text
//! TS (T2-MI PID) ─▶ T2miPump ─▶ AnyPayload::Bbframe
//! │ bb.bbframe
//! ▼
//! dvb_bbframe::Bbheader::parse + up_iter
//! │ inner TS packets
//! ▼
//! dvb_si::demux::SiDemux ─▶ AnyTable
//! ```
//!
//! A complete, working version of this chain (synthetic fixture, every layer
//! built and asserted) lives in `dvb-t2mi/tests/chain.rs`.
//!
//! # Header-only example
//!
//! ```
//! use dvb_t2mi::packet::Header;
//! use dvb_common::Parse;
//! let buf = [0x00u8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
//! let hdr = Header::parse(&buf[..]).unwrap();
//! assert_eq!(hdr.payload_len_bits, 0);
//! ```
pub use ;