From f873d7fa08ab2f48e5ca96a5b6d1b41724874b09 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 8 Feb 2015 01:12:30 +0100 Subject: [PATCH] Switch to a different RS encoding. --- rsdecoder.cpp | 8 +++++--- rsdecoder.h | 1 + rsencoder.cpp | 12 +++++++++--- rsencoder.h | 5 +++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/rsdecoder.cpp b/rsdecoder.cpp index 20297bf..8a27896 100644 --- a/rsdecoder.cpp +++ b/rsdecoder.cpp @@ -15,7 +15,10 @@ extern "C" { using namespace std; RSDecoder::RSDecoder(Sender *sender) - : sender(sender) {} + : sender(sender) +{ + rs = init_rs_char(RS_SYM_SIZE, RS_GF_POLY, 1, 1, RS_PARITY_SIZE, RS_PAD); +} void RSDecoder::send_packet(uint16_t proto, const std::string &data, int incoming_seq) { @@ -109,8 +112,7 @@ void RSDecoder::send_packet(uint16_t proto, const std::string &data, int incomin for (int j = 0; j < RS_GROUP_SIZE; ++j) { ch[j] = padded_packets[j][i]; } - int ret = decode_rs_8(ch, &missing_packets[0], missing_packets.size(), - RS_PAD); + int ret = decode_rs_char(rs, ch, &missing_packets[0], missing_packets.size()); if (ret == -1) { printf("Failed reconstruction!\n"); // We might get more data later, so don't remove it. diff --git a/rsdecoder.h b/rsdecoder.h index 5ee52d1..c4303f0 100644 --- a/rsdecoder.h +++ b/rsdecoder.h @@ -21,6 +21,7 @@ private: }; Sender *sender; std::map rs_groups; + void *rs; }; #endif /* !defined(_RSDECODER_H) */ diff --git a/rsencoder.cpp b/rsencoder.cpp index 3026dd4..d98a13c 100644 --- a/rsencoder.cpp +++ b/rsencoder.cpp @@ -16,6 +16,12 @@ extern "C" { #include using namespace std; + +RSEncoder::RSEncoder(Sender *sender) + : sender(sender) +{ + rs = init_rs_char(RS_SYM_SIZE, RS_GF_POLY, 1, 1, RS_PARITY_SIZE, RS_PAD); +} void RSEncoder::send_packet(uint16_t proto, const std::string &data, int incoming_seq) { @@ -73,9 +79,9 @@ void RSEncoder::finish_group() for (int j = 0; j < packet_history.size(); ++j) { data[j] = packet_history[j].data[i]; } - encode_rs_8(reinterpret_cast(&data[0]), - reinterpret_cast(&parity[0]), - RS_PAD); + encode_rs_char(rs, + reinterpret_cast(&data[0]), + reinterpret_cast(&parity[0])); for (int j = 0; j < RS_PARITY_SIZE; ++j) { rs_packets[j][i] = parity[j]; } diff --git a/rsencoder.h b/rsencoder.h index 75f0f24..ef8f289 100644 --- a/rsencoder.h +++ b/rsencoder.h @@ -12,14 +12,15 @@ class Sender; class RSEncoder : public Sender { public: - RSEncoder(Sender* sender) : sender(sender) {} + RSEncoder(Sender* sender); virtual void send_packet(uint16_t proto, const std::string &data, int incoming_seq); private: void finish_group(); - Sender* sender; + Sender *sender; std::vector packet_history; + void *rs; }; #endif // !defined(_RSENCODER_H) -- 2.39.2