diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-04-20 05:40:53 +0200 | 
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-04-20 05:40:53 +0200 | 
| commit | dd14214e1ad46b9fa323be7e7e13c55c30085a67 (patch) | |
| tree | 0ed7b28d3ad2c5cf2bbaa8c7d121f52f26512aa9 /src | |
| parent | f6803b2375d1b21ed4cc035e268f8759d5170491 (diff) | |
| download | dabmux-dd14214e1ad46b9fa323be7e7e13c55c30085a67.tar.gz dabmux-dd14214e1ad46b9fa323be7e7e13c55c30085a67.tar.bz2 dabmux-dd14214e1ad46b9fa323be7e7e13c55c30085a67.zip  | |
WIP: Correct calculation of FIG0/21 required size
Diffstat (limited to 'src')
| -rw-r--r-- | src/fig/FIG0_21.cpp | 51 | ||||
| -rw-r--r-- | src/fig/FIGCarousel.cpp | 4 | 
2 files changed, 27 insertions, 28 deletions
diff --git a/src/fig/FIG0_21.cpp b/src/fig/FIG0_21.cpp index 51b4a0d..515e67a 100644 --- a/src/fig/FIG0_21.cpp +++ b/src/fig/FIG0_21.cpp @@ -50,7 +50,29 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size)      for (; freqInfoFIG0_21 != ensemble->frequency_information.end();              ++freqInfoFIG0_21) { -        size_t required_size = sizeof(struct FIGtype0_21_header); +        size_t required_fi_size = 2; // RegionId + length of FI list +        for (const auto& fle : (*freqInfoFIG0_21)->frequency_information) { +            size_t list_entry_size = sizeof(FIGtype0_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; +        } + +        const size_t required_size = sizeof(struct FIGtype0_21_header) + required_fi_size;          if (fig0 == nullptr) {              if (remaining < 2 + required_size) { @@ -70,34 +92,11 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size)              buf += 2;              remaining -= 2;          } - -        if (remaining < required_size) { +        else if (remaining < required_size) {              break;          }          for (const auto& fle : (*freqInfoFIG0_21)->frequency_information) { -            size_t list_entry_size = sizeof(FIGtype0_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() * 3; -                    break; -                case RangeModulation::amss: -                    list_entry_size += 1; // Id field 2 -                    list_entry_size += fle.fi_amss.frequencies.size() * 3; -                    break; -                case RangeModulation::drm: -                    list_entry_size += 1; // Id field 2 -                    list_entry_size += fle.fi_drm.frequencies.size() * 3; -                    break; -            } - -            if (remaining < list_entry_size) { -                break; -            } -              auto *fig0_21_header = (FIGtype0_21_header*)buf;              fig0_21_header->rfa = 0; // This was RegionId in EN 300 401 V1.4.1              switch (fle.rm) { @@ -195,7 +194,7 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size)                          remaining -= 2;                      }                      break; -            } +            } // switch (RM)          } // for over fle      } // for over FI diff --git a/src/fig/FIGCarousel.cpp b/src/fig/FIGCarousel.cpp index 81f2100..6d89ad8 100644 --- a/src/fig/FIGCarousel.cpp +++ b/src/fig/FIGCarousel.cpp @@ -286,8 +286,8 @@ size_t FIGCarousel::carousel(          if (written == 1 or written == 2) {              std::stringstream ss;              ss << "Assertion error: FIG" << fig_el->fig->figtype() << "/" << -                fig_el->fig->figextension() << " wrote not enough data (" << -                written << ")"; +                fig_el->fig->figextension() << +                " did not write enough data: (" << written << ")";              throw std::runtime_error(ss.str());          }  | 
