dvb-bbframe
ETSI DVB-S2 / S2X / T2 Base-Band Frame (BBFRAME) parser and builder, supporting both Normal Mode (NM) and High Efficiency Mode (HEM).
A BBFRAME is the unit of payload carried in a DVB-S2/S2X/T2 baseband stream: a
10-byte BBHEADER followed by a data field of user packets (a Transport Stream or
Generic Stream). This crate parses and rebuilds the header and walks the data
field; it does not implement the physical layer (LDPC/BCH coding, modulation).
GSE payloads (Generic Stream Encapsulation) are out of scope — hand the data
field to the third-party dvb-gse crate.
Quick start
use ;
use BbframePump;
// Parse a 10-byte BBHEADER directly:
let hdr = parse?;
assert_eq!;
println!;
// Or use the pump for per-PLP BBFrame→inner-TS extraction:
let mut pump = new;
let inner_ts_packets = pump.feed;
for pkt in inner_ts_packets
What's implemented
BBHEADER (10 bytes, EN 302 307-1 / EN 302 755)
All fields from the Bbheader struct:
| Field | Width | Notes |
|---|---|---|
matype.ts_gs |
2 bits | TsGs enum: Ts, Gfps, Gcs, Gse |
matype.sis |
1 bit | Single/Multi input stream |
matype.ccm |
1 bit | CCM/ACM flag |
matype.issyi |
1 bit | Input Stream Synchronization Indicator active |
matype.npd |
1 bit | Null Packet Deletion active |
matype.ext |
2 bits | Roll-off / reserved (RollOff accessor for S2/S2X) |
matype.isi |
8 bits | Input Stream Identifier (MIS only) |
upl |
16 bits | User Packet Length in bits (NM only; 0 in HEM) |
sync |
8 bits | UP sync byte copy (NM only) |
dfl |
16 bits | Data Field Length in bits |
syncd |
16 bits | Bit offset to first complete UP in data field |
mode |
CRC-8 | Mode enum: Normal (0) or HighEfficiency (1), recovered via crc8(hdr[0..9]) ^ hdr[9] |
issy_in_header |
3 bytes | ISSY bytes (HEM only; None in NM) |
Bbheader::issy() decodes issy_in_header into an Issy enum.
ISSY decoding (EN 302 755 Annex C / EN 302 307-1 Annex D)
Issy, SignallingKind, and BufsUnit cover all three ISSY forms:
| Form | Prefix | Result |
|---|---|---|
| ISCR short | bit[7]=0 |
Issy::IscrShort(u16) — 15-bit ISCR |
| ISCR long | bit[7:6]=10 |
Issy::IscrLong(u32) — 22-bit ISCR |
| Signalling | bit[7:6]=11 |
Issy::Signalling(SignallingKind) |
SignallingKind variants: Bufs { bufs, units }, Tto { tto_e, tto_m, tto_l },
BufStat { bufstat, units } (DVB-S2 Annex D), Reserved(u32). Decoded accessors:
bufs_bits(), bufs_bytes(), bufstat_bits(), bufstat_bytes(), tto_t_over_256().
User-packet extraction (EN 302 755 §5.1.8)
| Type | Description |
|---|---|
NmTsIter |
Iterator over NM UPs (188-byte stride; CRC-8 byte replaced with sync 0x47) |
HemTsIter |
Iterator over HEM UPs (187-byte stride; sync byte prepended; DNP skipped when NPD active) |
UpIter |
Runtime-dispatched enum wrapping either iterator |
up_iter(data, bbheader) |
Constructs the right iterator from the parsed header |
CarryOverExtractor |
Stateful cross-boundary reassembler; feed_nm / feed_hem (allocating) and feed_nm_into / feed_hem_into (buffer-reuse) |
SYNCD = 0xFFFF (no UP starts in this data field) is handled correctly.
BbframePump
BbframePump packages the whole BBHEADER-parse → mode-detect → CarryOverExtractor
chain for multi-PLP streams. Feed (plp_id, df_bytes) pairs; the pump keeps
independent per-PLP carry-over state and returns completed 188-byte inner TS packets.
Feature flags
| Feature | Default | Description |
|---|---|---|
std |
on | Link the standard library. Without it the crate is #![no_std] + alloc. |
serde |
off | Serialize-only (serde::Serialize) on Bbheader, Matype, TsGs, Mode, Issy, SignallingKind, BufsUnit, RollOff. |
yoke |
off | yoke::Yokeable on NmTsIter and HemTsIter. |
MSRV
Rust 1.81.
Authoritative references
- ETSI EN 302 307-1 (DVB-S2) / EN 302 307-2 (DVB-S2X)
- ETSI EN 302 755 (DVB-T2) — §5.1.7 (BBHEADER/HEM), §5.1.8 (UP carriage), Annex C (ISSY), Annex F (CRC-8)
The structured spec reference is under docs/; the canonical PDFs are
vendored in the workspace specs/ directory.
Examples
Run with cargo run -p dvb-bbframe --example <name>:
parse_bbheader— parse a single DVB-S2 BBHEADER (with a valid Normal-Mode CRC-8).walk_capture— reassemble BBFrames from a real DVB-S2 capture and parse every header.
License
Licensed under either of MIT (LICENSE-MIT) or Apache-2.0 (LICENSE-APACHE), at your option.