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, ParsedDescriptorLoop};
6
7/// Transport-stream entry in a complete NIT.
8#[derive(Debug)]
9#[non_exhaustive]
10pub struct CompleteNitTransportStream<'a> {
11    /// transport_stream_id of the described TS.
12    pub transport_stream_id: u16,
13    /// original_network_id of the described TS.
14    pub original_network_id: u16,
15    /// Typed descriptor loop for this transport stream.
16    pub descriptors: ParsedDescriptorLoop<'a>,
17}
18
19/// Complete logical Network Information Table.
20#[derive(Debug)]
21#[non_exhaustive]
22pub struct CompleteNit<'a> {
23    /// Variant discriminator.
24    pub kind: nit::NitKind,
25    /// Network identifier.
26    pub network_id: u16,
27    /// 5-bit version_number.
28    pub version_number: u8,
29    /// current_next_indicator bit.
30    pub current_next_indicator: bool,
31    /// Network-wide descriptors from section 0.
32    pub network_descriptors: ParsedDescriptorLoop<'a>,
33    /// Transport-stream loop entries from all sections in wire order.
34    pub transport_streams: Vec<CompleteNitTransportStream<'a>>,
35}
36
37impl<'a> CompleteNit<'a> {
38    pub(crate) fn parse(
39        set: &'a CompleteSectionSet,
40        registry: Option<&'a DescriptorRegistry>,
41    ) -> crate::Result<Self> {
42        let sections: Vec<nit::NitSection<'a>> = set.parse_sections()?;
43        let first = sections.first().ok_or(crate::Error::BufferTooShort {
44            need: 1,
45            have: 0,
46            what: "CompleteNit sections",
47        })?;
48        let mut transport_streams = Vec::new();
49        for section in &sections {
50            transport_streams.extend(section.transport_streams.iter().map(|ts| {
51                CompleteNitTransportStream {
52                    transport_stream_id: ts.transport_stream_id,
53                    original_network_id: ts.original_network_id,
54                    descriptors: ParsedDescriptorLoop::parse(ts.descriptors, registry),
55                }
56            }));
57        }
58        Ok(Self {
59            kind: first.kind,
60            network_id: first.network_id,
61            version_number: first.version_number,
62            current_next_indicator: first.current_next_indicator,
63            // The network descriptor loop is carried in section 0; completed
64            // sets are stored in section-number order, so `first` is
65            // authoritative for table-wide descriptors.
66            network_descriptors: ParsedDescriptorLoop::parse(first.network_descriptors, registry),
67            transport_streams,
68        })
69    }
70}