Skip to main content

dvb_si/descriptors/
decoder_config_flags.rs

1//! decoder_config_flags — ISO/IEC 13818-1 §2.6.61, Table 2-90.
2//!
3//! 3-bit field in the metadata_descriptor that indicates how decoder
4//! configuration information is conveyed.
5
6/// decoder_config_flags values (Table 2-90).
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize))]
9#[non_exhaustive]
10pub enum DecoderConfigFlags {
11    /// 0b000 — No decoder configuration needed.
12    None,
13    /// 0b001 — Carried in this descriptor (decoder_config_byte).
14    InDescriptor,
15    /// 0b010 — Carried in the same metadata service.
16    SameService,
17    /// 0b011 — Carried in a DSM-CC carousel (dec_config_identification_record).
18    DsmccCarousel,
19    /// 0b100 — Carried in another metadata service (decoder_config_metadata_service_id).
20    OtherService,
21    /// 0b101–0b110 — Reserved.
22    Reserved(u8),
23    /// 0b111 — Privately defined.
24    Private,
25}
26
27impl DecoderConfigFlags {
28    /// Construct from a raw 3-bit value.
29    #[must_use]
30    pub fn from_u8(v: u8) -> Self {
31        match v & 0x07 {
32            0 => Self::None,
33            1 => Self::InDescriptor,
34            2 => Self::SameService,
35            3 => Self::DsmccCarousel,
36            4 => Self::OtherService,
37            5 | 6 => Self::Reserved(v & 0x07),
38            _ => Self::Private,
39        }
40    }
41
42    /// Return the raw 3-bit value.
43    #[must_use]
44    pub fn to_u8(self) -> u8 {
45        match self {
46            Self::None => 0,
47            Self::InDescriptor => 1,
48            Self::SameService => 2,
49            Self::DsmccCarousel => 3,
50            Self::OtherService => 4,
51            Self::Reserved(v) => v,
52            Self::Private => 7,
53        }
54    }
55
56    /// Returns a human-readable spec name for this value.
57    #[must_use]
58    pub fn name(self) -> &'static str {
59        match self {
60            Self::None => "none",
61            Self::InDescriptor => "in descriptor",
62            Self::SameService => "same service",
63            Self::DsmccCarousel => "DSM-CC carousel",
64            Self::OtherService => "other service",
65            Self::Reserved(_) => "reserved",
66            Self::Private => "private",
67        }
68    }
69}
70dvb_common::impl_spec_display!(DecoderConfigFlags, Reserved);
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75
76    #[test]
77    fn round_trip_values() {
78        for v in 0u8..=7 {
79            let cf = DecoderConfigFlags::from_u8(v);
80            assert_eq!(cf.to_u8(), v & 0x07, "value {v} round-trip mismatch");
81        }
82    }
83}