| #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; |
| } |