summaryrefslogtreecommitdiffstats
path: root/src/dabOutput
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2014-05-17 18:01:26 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2014-05-20 21:39:37 +0200
commitac2e922067be306a89cd10419263cade54b2f60f (patch)
tree04486fac3fd732a3e8f52ac4eea337cecf70ab0b /src/dabOutput
parent8a4f546b85d0887d1d5af0a428753c7d31304b72 (diff)
downloaddabmux-ac2e922067be306a89cd10419263cade54b2f60f.tar.gz
dabmux-ac2e922067be306a89cd10419263cade54b2f60f.tar.bz2
dabmux-ac2e922067be306a89cd10419263cade54b2f60f.zip
fix segfault with EDI
Diffstat (limited to 'src/dabOutput')
-rw-r--r--src/dabOutput/edi/PFT.cpp21
-rw-r--r--src/dabOutput/edi/PFT.h13
2 files changed, 26 insertions, 8 deletions
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 <vector>
#include <list>
+#include <cstdio>
+#include <cstring>
#include <stdint.h>
#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<uint8_t> > PFT::ProtectAndFragment(AFPacket af_packet)
vector< vector<uint8_t> > 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 <vector>
#include <list>
+#include <stdexcept>
#include <stdint.h>
#include "AFPacket.h"
#include "Log.h"
@@ -44,11 +45,19 @@ typedef std::vector<uint8_t> 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"