diff --git a/openrtx/include/protocols/M17/M17FrameDecoder.hpp b/openrtx/include/protocols/M17/M17FrameDecoder.hpp index 0b3f7322..33f3a4d2 100644 --- a/openrtx/include/protocols/M17/M17FrameDecoder.hpp +++ b/openrtx/include/protocols/M17/M17FrameDecoder.hpp @@ -140,6 +140,9 @@ private: ///< Maximum allowed hamming distance when determining the frame type. static constexpr uint8_t MAX_SYNC_HAMM_DISTANCE = 4; + + ///< Maximum number of corrected bit errors allowed in a stream frame. + static constexpr uint16_t MAX_VITERBI_ERRORS = 15; }; } // namespace M17 diff --git a/openrtx/src/protocols/M17/M17FrameDecoder.cpp b/openrtx/src/protocols/M17/M17FrameDecoder.cpp index 46b14a3e..ef024bed 100644 --- a/openrtx/src/protocols/M17/M17FrameDecoder.cpp +++ b/openrtx/src/protocols/M17/M17FrameDecoder.cpp @@ -155,8 +155,10 @@ void M17FrameDecoder::decodeStream(const std::array &data) begin += lich.size(); std::copy(begin, data.end(), punctured.begin()); - viterbi.decodePunctured(punctured, tmp, DATA_PUNCTURE); - memcpy(&streamFrame.data, tmp.data(), tmp.size()); + // Skip payload copy if BER is too high to avoid audio artifacts + uint16_t bitErrs = viterbi.decodePunctured(punctured, tmp, DATA_PUNCTURE); + if (bitErrs < MAX_VITERBI_ERRORS) + memcpy(&streamFrame.data, tmp.data(), tmp.size()); } bool M17FrameDecoder::decodeLich(std::array &segment,