From 230f717a30b1f9a6e2f04bf1b8dc363d793cc86c Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Mon, 3 Oct 2022 21:06:48 +0200 Subject: Try to decode ODR-DabMux watermark --- src/watermarkdecoder.cpp | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/watermarkdecoder.cpp (limited to 'src/watermarkdecoder.cpp') diff --git a/src/watermarkdecoder.cpp b/src/watermarkdecoder.cpp new file mode 100644 index 0000000..33eb960 --- /dev/null +++ b/src/watermarkdecoder.cpp @@ -0,0 +1,114 @@ +/* + Copyright (C) 2014 CSP Innovazione nelle ICT s.c.a r.l. (http://www.csp.it/) + Copyright (C) 2020 Matthias P. Braendli (http://www.opendigitalradio.org) + Copyright (C) 2015 Data Path + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Authors: + Sergio Sagliocco + Matthias P. Braendli + / | |- ')|) |-|_ _ (|,_ .| _ ,_ \ + Data Path \(|(||_(|/_| (||_||(a)_||||(|||.(_()|||/ + +*/ + +#include +#include +#include "watermarkdecoder.hpp" + +static std::string calc_watermark(const std::vector& bits) +{ + // First try to find the 0x55 0x55 sync in the waternark data + size_t bit_ix; + int alternance_count = 0; + bool last_bit = 1; + for (bit_ix = 0; bit_ix < bits.size(); bit_ix++) { + if (alternance_count == 16) { + break; + } + else { + if (last_bit != bits[bit_ix]) { + last_bit = bits[bit_ix]; + alternance_count++; + } + else { + alternance_count = 0; + last_bit = 1; + } + } + } + + if (bit_ix < bits.size()) { + fprintf(stderr, "Found SYNC at offset %zu out of %zu\n", + bit_ix - alternance_count, bits.size()); + + std::stringstream watermark_ss; + + uint8_t b = 0; + size_t i = 0; + while (bit_ix < bits.size()) { + + b |= bits[bit_ix] << (7 - i); + + if (i == 7) { + watermark_ss << (char)b; + + b = 0; + i = 0; + } + else { + i++; + } + + bit_ix += 2; + } + + return watermark_ss.str(); + } + else { + return ""; + } +} + +WatermarkDecoder::WatermarkDecoder() {} + +void WatermarkDecoder::push_fig0_1_bit(bool bit) +{ + // The order of FIG0_1 subchannels represents the bits + m_fig0_1_bits.push_back(bit); +} + +void WatermarkDecoder::push_confind_bit(bool confind) +{ + // The ConfInd of FIG 0/10 contains the CRC-DABMUX and ODR-DabMux watermark + m_confind_bits.push_back(confind); +} + +std::string WatermarkDecoder::calculate_watermark() +{ + std::string w_old = calc_watermark(m_confind_bits); + std::string w_new = calc_watermark(m_fig0_1_bits); + if (not w_new.empty()) { + return w_new; + } + else if (not w_old.empty()) { + return w_old + " (old watermark)"; + } + else { + return "(NOT FOUND)"; + } +} + + -- cgit v1.2.3