# dvb-conformance
ETSI TR 101 290 v1.4.1 transport-stream conformance monitor (DVB measurement
guidelines). Feed TS packets with a caller-supplied monotonic clock, drain
structured conformance events for each indicator.
## Indicator coverage
| 1 | 1.1 `TS_sync_loss` | ✅ |
| 1 | 1.2 `Sync_byte_error` | ✅ |
| 1 | 1.3.a `PAT_error_2` | ✅ |
| 1 | 1.4 `Continuity_count_error` | ✅ |
| 1 | 1.5.a `PMT_error_2` | ✅ |
| 1 | 1.6 `PID_error` | ✅ |
| 2 | 2.1 `Transport_error` | ✅ |
| 2 | 2.2 `CRC_error` | ✅ |
| 2 | 2.3a `PCR_repetition_error` | ✅ |
| 2 | 2.3b `PCR_discontinuity_indicator_error` | ✅ |
| 2 | 2.4 `PCR_accuracy_error` | ❌ requires hardware arrival timestamps; not computable under the caller-supplied-time model |
| 2 | 2.5 `PTS_error` | ✅ |
| 2 | 2.6 `CAT_error` | ✅ |
| 3 | 3.2 `SI_repetition_error` (max interval) | ✅ |
| 3 | 3.2 `SI_repetition_error` (25 ms min gap) | ❌ deferred — needs per-`(table_id, section_number)` tracking to avoid false positives on dense multi-section tables |
| 3 | 3.1/3.3–3.10 | ❌ (out of scope) |
| SI | Per-table presence (3.1/3.5/3.6/3.8) | ❌ (out of scope) |
## SI_repetition_error (3.2) — implementation notes
- **Maximum-interval checks** are implemented for NIT_actual (10 s), SDT_actual
(2 s), EIT P/F actual (2 s), and TDT (30 s). Each table's timer is lazily
armed — checking starts only after the first section of that table is seen.
An entirely absent table is **not** flagged by this indicator; that is the
role of the per-table presence indicators (3.1, 3.5, 3.6, 3.8) which are
out of scope here.
- **EIT P/F** is tracked at the table level (any section with table_id 0x4E
resets the timer), not per section_number (0 / 1). This simplification
avoids false positives from dense EIT schedules while still catching the
case where no EIT P/F section appears for too long.
- **25 ms minimum-gap** dimension is deferred — it requires per-section_number
tracking to distinguish a legitimate multi-section burst from a
repetition-rate violation; without it the check would produce false positives
on streams with many short EIT schedule sections.
## Caller-supplied time model
`ConformanceMonitor::feed(packet, t)` takes a `Duration` timestamp per packet.
The monitor uses this clock for all presence/absence timeout checks (1.3.a,
1.5.a, 1.6, 2.3a, 2.3b, 2.5, 3.2). The caller is responsible for providing a
monotonic, roughly-wall-clock-aligned timestamp — the monitor does not enforce
monotonicity, but non-monotonic timestamps will produce spurious timeout events.
Because the monitor has no independent clock, some later-priority indicators
(PCR accuracy, buffer model) that require sub-packet timing resolution or
absolute reference clocks are best-effort under this model.