From 5488092a1e1437a0b22fc0129944978506f520bd Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Thu, 1 Mar 2018 12:32:58 +0100 Subject: Check FI size at startup because we don't auto-split the lists --- src/ConfigParser.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/ConfigParser.cpp b/src/ConfigParser.cpp index efcafbd..4aee3ac 100644 --- a/src/ConfigParser.cpp +++ b/src/ConfigParser.cpp @@ -297,8 +297,44 @@ static void parse_freq_info(ptree& pt, } // for over fle + size_t required_fi_size = 0; // Without RegionId + length of FI list + for (const auto& fle : fi->frequency_information) { + size_t list_entry_size = 3; // size of FIG0/21 FI list header + switch (fle.rm) { + case RangeModulation::dab_ensemble: + list_entry_size += fle.fi_dab.frequencies.size() * 3; + break; + case RangeModulation::fm_with_rds: + list_entry_size += fle.fi_fm.frequencies.size() * 1; + break; + case RangeModulation::amss: + list_entry_size += 1; // Id field 2 + list_entry_size += fle.fi_amss.frequencies.size() * 2; + break; + case RangeModulation::drm: + list_entry_size += 1; // Id field 2 + list_entry_size += fle.fi_drm.frequencies.size() * 2; + break; + } + required_fi_size += list_entry_size; + } + + /* Length of FI list: this 5-bit field, expressed as an unsigned + * binary number, shall represent the length in bytes of the field + * containing FI list q to FI list g (maximum 26 bytes). + * + * ETSI EN 300 401 Clause 8.1.8 + */ + if (required_fi_size > 26) { + throw runtime_error("Too much information carried in FI " + + fi_uid + ": " + to_string(required_fi_size) + + " bytes needed out of 26 available"); + } + ensemble->frequency_information.push_back(fi); + + } // for over fi /* We sort all FI to have the OE=0 first and the OE=1 afterwards, to -- cgit v1.2.3