Skip to main content

dvb_si/collect/
nit.rs

1use crate::descriptors::DescriptorRegistry;
2use crate::tables::nit;
3use alloc::vec::Vec;
4
5use super::{CompleteSectionSet, CompleteTransportStream, ParsedDescriptorLoop};
6
7/// Complete logical Network Information Table.
8#[derive(Debug)]
9#[non_exhaustive]
10pub struct CompleteNit<'a> {
11    /// Variant discriminator.
12    pub kind: nit::NitKind,
13    /// Network identifier.
14    pub network_id: u16,
15    /// 5-bit version_number.
16    pub version_number: u8,
17    /// current_next_indicator bit.
18    pub current_next_indicator: bool,
19    /// Network-wide descriptors, concatenated across every section that
20    /// carries a `network_descriptors_loop` (EN 300 468 ยง5.2.1: each section
21    /// has its own loop, so a network name/linkage split across sections is
22    /// not lost).
23    pub network_descriptors: ParsedDescriptorLoop<'a>,
24    /// Transport-stream loop entries from all sections in wire order.
25    pub transport_streams: Vec<CompleteTransportStream<'a>>,
26}
27
28impl<'a> CompleteNit<'a> {
29    pub(crate) fn parse(
30        set: &'a CompleteSectionSet,
31        registry: Option<&'a DescriptorRegistry>,
32    ) -> crate::Result<Self> {
33        let sections: Vec<nit::NitSection<'a>> = set.parse_sections()?;
34        let first = sections.first().ok_or(crate::Error::BufferTooShort(
35            broadcast_common::error::BufferTooShort {
36                need: 1,
37                have: 0,
38                what: "CompleteNit sections",
39            },
40        ))?;
41        let transport_streams = CompleteTransportStream::collect(
42            sections.iter().flat_map(|section| {
43                section.transport_streams.iter().map(|ts| {
44                    (
45                        ts.transport_stream_id,
46                        ts.original_network_id,
47                        ts.descriptors,
48                    )
49                })
50            }),
51            registry,
52        );
53        Ok(Self {
54            kind: first.kind,
55            network_id: first.network_id,
56            version_number: first.version_number,
57            current_next_indicator: first.current_next_indicator,
58            network_descriptors: ParsedDescriptorLoop::parse_all(
59                sections.iter().map(|section| section.network_descriptors),
60                registry,
61            ),
62            transport_streams,
63        })
64    }
65}