NORM-mirror/examples/normRatelessTest.cpp

89 lines
2.5 KiB
C++

#include <normApi.h>
#include <normEncoder.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
class MockRatelessEncoder : public NormEncoder {
public:
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize) {
ndata = numData;
vec_size = vectorSize;
return true;
}
virtual void Destroy() {}
virtual void Encode(unsigned int segmentId, const char* dataVector, char** parityVectorList) {}
virtual bool IsRateless() const { return true; }
private:
unsigned int ndata;
UINT16 vec_size;
};
class MockRatelessDecoder : public NormDecoder {
public:
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize) {
ndata = numData;
vec_size = vectorSize;
return true;
}
virtual void Destroy() {}
virtual int Decode(char** vectorList, unsigned int numData, unsigned int erasureCount, unsigned int* erasureLocs) {
return erasureCount;
}
private:
unsigned int ndata;
UINT16 vec_size;
};
extern "C" {
NormEncoder* CreateMockEncoder() { return new MockRatelessEncoder(); }
NormDecoder* CreateMockDecoder() { return new MockRatelessDecoder(); }
}
int main(int argc, char* argv[]) {
NormInstanceHandle instance = NormCreateInstance();
if (!instance) return -1;
NormSessionHandle session = NormCreateSession(instance, "127.0.0.1", 6003, 1);
// Register Rateless Coder (FEC ID 131)
if (!NormRegisterFecCoder(session, 131, CreateMockEncoder, CreateMockDecoder, true)) {
fprintf(stderr, "Failed to register custom FEC codec.\n");
return -1;
}
NormSetRxPortReuse(session, true);
NormSetMulticastLoopback(session, true);
// Start Sender using FEC 131
if (!NormStartSender(session, 1, 1024*1024, 1024, 64, 0, 131)) {
fprintf(stderr, "Failed to start sender.\n");
return -1;
}
printf("Sender started with mock rateless codec. Transmitting...\n");
NormObjectHandle obj = NormDataEnqueue(session, "testdata", 8);
if (obj) {
bool running = true;
while (running) {
NormEvent event;
if (NormGetNextEvent(instance, &event)) {
if (event.type == NORM_TX_FLUSH_COMPLETED) {
printf("Transmission flushed completely.\n");
running = false;
}
}
}
}
NormStopSender(session);
NormDestroyInstance(instance);
printf("Success.\n");
return 0;
}