From ac2e922067be306a89cd10419263cade54b2f60f Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Sat, 17 May 2014 18:01:26 +0200 Subject: fix segfault with EDI --- src/dabOutput/edi/PFT.cpp | 21 +++++++++++++++------ src/dabOutput/edi/PFT.h | 13 +++++++++++-- 2 files changed, 26 insertions(+), 8 deletions(-) (limited to 'src/dabOutput') diff --git a/src/dabOutput/edi/PFT.cpp b/src/dabOutput/edi/PFT.cpp index e14a008..eba8ac0 100644 --- a/src/dabOutput/edi/PFT.cpp +++ b/src/dabOutput/edi/PFT.cpp @@ -31,6 +31,8 @@ #include "config.h" #include #include +#include +#include #include #include "PFT.h" #include "ReedSolomon.h" @@ -44,7 +46,14 @@ RSPacket PFT::Protect(AFPacket af_packet) { RSPacket rs_packet; - m_num_chunks = af_packet.size() / 207 + 1; + // number of chunks is ceil(afpacketsize / m_k) + if (af_packet.size() % m_k == 0) { + m_num_chunks = af_packet.size() / m_k; + } + else { + m_num_chunks = af_packet.size() / m_k + 1; + } + const size_t zero_pad = m_num_chunks * m_k - af_packet.size(); // add zero padding to last chunk @@ -53,16 +62,15 @@ RSPacket PFT::Protect(AFPacket af_packet) } for (size_t i = 1; i < af_packet.size(); i+= m_k) { - // add new chunk to the list Chunk c(m_k + ParityBytes); - for (size_t j = 0; j < m_k; j++) { - c[j] = af_packet[i+j]; - } + // copy m_k bytes into new chunk + memcpy(&c.front(), &af_packet[i], m_k); // calculate RS for chunk m_encoder.encode(&c.front(), c.size()); + // append new chunk to the RS Packet rs_packet.insert(rs_packet.end(), c.begin(), c.end()); } @@ -81,8 +89,9 @@ vector< vector > PFT::ProtectAndFragment(AFPacket af_packet) vector< vector > fragments(num_fragments); for (size_t i = 0; i < num_fragments; i++) { + fragments[i].resize(fragment_size); for (size_t j = 0; j < fragment_size; j++) { - fragments[i][j] = rs_packet[j*num_fragments + i]; //TODO that's wrong. fix it. + fragments[i][j] = rs_packet[j*num_fragments + i]; } } diff --git a/src/dabOutput/edi/PFT.h b/src/dabOutput/edi/PFT.h index 713170f..55ca569 100644 --- a/src/dabOutput/edi/PFT.h +++ b/src/dabOutput/edi/PFT.h @@ -34,6 +34,7 @@ #include "config.h" #include #include +#include #include #include "AFPacket.h" #include "Log.h" @@ -44,11 +45,19 @@ typedef std::vector RSPacket; class PFT { public: - static const int ParityBytes = 255 - 207; + static const int ParityBytes = 48; PFT(unsigned int RSDataWordLength, unsigned int NumRecoverableFragments) : - m_k(RSDataWordLength), m_m(NumRecoverableFragments), m_encoder(255, 207) + m_k(RSDataWordLength), + m_m(NumRecoverableFragments), + m_encoder(m_k + ParityBytes, m_k) { + if (m_k > 207) { + etiLog.level(warn) << + "EDI PFT: maximum chunk size is 207."; + throw std::out_of_range("EDI PFT Chunk size too large."); + } + if (m_m > 5) { etiLog.level(warn) << "EDI PFT: high number of recoverable fragments" -- cgit v1.2.3