93 lines
1.9 KiB
C
93 lines
1.9 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <sys/time.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
|
|
#include "mcast_image.h"
|
|
#include <crc32.h>
|
|
|
|
#define ERASE_SIZE 131072
|
|
//#define PKT_SIZE 1400
|
|
#define NR_PKTS ((ERASE_SIZE + PKT_SIZE - 1) / PKT_SIZE)
|
|
#define DROPS 8
|
|
|
|
int main(void)
|
|
{
|
|
int i, j;
|
|
unsigned char buf[NR_PKTS * PKT_SIZE];
|
|
unsigned char pktbuf[(NR_PKTS + DROPS) * PKT_SIZE];
|
|
struct fec_parms *fec;
|
|
unsigned char *srcs[NR_PKTS];
|
|
unsigned char *pkt[NR_PKTS + DROPS];
|
|
int pktnr[NR_PKTS + DROPS];
|
|
struct timeval then, now;
|
|
|
|
srand(3453);
|
|
for (i=0; i < sizeof(buf); i++)
|
|
if (i < ERASE_SIZE)
|
|
buf[i] = rand();
|
|
else
|
|
buf[i] = 0;
|
|
|
|
for (i=0; i < NR_PKTS + DROPS; i++)
|
|
srcs[i] = buf + (i * PKT_SIZE);
|
|
|
|
for (i=0; i < NR_PKTS + DROPS; i++) {
|
|
pkt[i] = malloc(PKT_SIZE);
|
|
pktnr[i] = -1;
|
|
}
|
|
fec = fec_new(NR_PKTS, NR_PKTS + DROPS);
|
|
if (!fec) {
|
|
printf("fec_init() failed\n");
|
|
exit(1);
|
|
}
|
|
j = 0;
|
|
for (i=0; i < NR_PKTS + DROPS; i++) {
|
|
#if 1
|
|
if (i == 27 || i == 40 || i == 44 || i == 45 || i == 56 )
|
|
continue;
|
|
#endif
|
|
if (i == 69 || i == 93 || i == 103)
|
|
continue;
|
|
fec_encode(fec, srcs, pkt[j], i, PKT_SIZE);
|
|
pktnr[j] = i;
|
|
j++;
|
|
}
|
|
gettimeofday(&then, NULL);
|
|
if (fec_decode(fec, pkt, pktnr, PKT_SIZE)) {
|
|
printf("Decode failed\n");
|
|
exit(1);
|
|
}
|
|
|
|
for (i=0; i < NR_PKTS; i++)
|
|
memcpy(pktbuf + (i*PKT_SIZE), pkt[i], PKT_SIZE);
|
|
gettimeofday(&now, NULL);
|
|
now.tv_sec -= then.tv_sec;
|
|
now.tv_usec -= then.tv_usec;
|
|
if (now.tv_usec < 0) {
|
|
now.tv_usec += 1000000;
|
|
now.tv_sec--;
|
|
}
|
|
|
|
if (memcmp(pktbuf, buf, ERASE_SIZE)) {
|
|
int fd;
|
|
printf("Compare failed\n");
|
|
fd = open("before", O_WRONLY|O_TRUNC|O_CREAT, 0644);
|
|
if (fd >= 0)
|
|
write(fd, buf, ERASE_SIZE);
|
|
close(fd);
|
|
fd = open("after", O_WRONLY|O_TRUNC|O_CREAT, 0644);
|
|
if (fd >= 0)
|
|
write(fd, pktbuf, ERASE_SIZE);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
printf("Decoded in %ld.%06lds\n", now.tv_sec, now.tv_usec);
|
|
return 0;
|
|
}
|