fectest.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <sys/time.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include "mcast_image.h"
  10. #include "libfec.h"
  11. #include <crc32.h>
  12. #define ERASE_SIZE 131072
  13. #define NR_PKTS ((ERASE_SIZE + PKT_SIZE - 1) / PKT_SIZE)
  14. #define DROPS 8
  15. int main(void)
  16. {
  17. int i, j;
  18. unsigned char buf[NR_PKTS * PKT_SIZE];
  19. unsigned char pktbuf[(NR_PKTS + DROPS) * PKT_SIZE];
  20. struct fec_parms *fec;
  21. unsigned char *srcs[NR_PKTS];
  22. unsigned char *pkt[NR_PKTS + DROPS];
  23. int pktnr[NR_PKTS + DROPS];
  24. struct timeval then, now;
  25. srand(3453);
  26. for (i=0; i < sizeof(buf); i++)
  27. if (i < ERASE_SIZE)
  28. buf[i] = rand();
  29. else
  30. buf[i] = 0;
  31. for (i=0; i < NR_PKTS + DROPS; i++)
  32. srcs[i] = buf + (i * PKT_SIZE);
  33. for (i=0; i < NR_PKTS + DROPS; i++) {
  34. pkt[i] = malloc(PKT_SIZE);
  35. pktnr[i] = -1;
  36. }
  37. fec = fec_new(NR_PKTS, NR_PKTS + DROPS);
  38. if (!fec) {
  39. printf("fec_init() failed\n");
  40. exit(1);
  41. }
  42. j = 0;
  43. for (i=0; i < NR_PKTS + DROPS; i++) {
  44. #if 1
  45. if (i == 27 || i == 40 || i == 44 || i == 45 || i == 56 )
  46. continue;
  47. #endif
  48. if (i == 69 || i == 93 || i == 103)
  49. continue;
  50. fec_encode(fec, srcs, pkt[j], i, PKT_SIZE);
  51. pktnr[j] = i;
  52. j++;
  53. }
  54. gettimeofday(&then, NULL);
  55. if (fec_decode(fec, pkt, pktnr, PKT_SIZE)) {
  56. printf("Decode failed\n");
  57. exit(1);
  58. }
  59. for (i=0; i < NR_PKTS; i++)
  60. memcpy(pktbuf + (i*PKT_SIZE), pkt[i], PKT_SIZE);
  61. gettimeofday(&now, NULL);
  62. now.tv_sec -= then.tv_sec;
  63. now.tv_usec -= then.tv_usec;
  64. if (now.tv_usec < 0) {
  65. now.tv_usec += 1000000;
  66. now.tv_sec--;
  67. }
  68. if (memcmp(pktbuf, buf, ERASE_SIZE)) {
  69. int fd;
  70. printf("Compare failed\n");
  71. fd = open("before", O_WRONLY|O_TRUNC|O_CREAT, 0644);
  72. if (fd >= 0)
  73. write(fd, buf, ERASE_SIZE);
  74. close(fd);
  75. fd = open("after", O_WRONLY|O_TRUNC|O_CREAT, 0644);
  76. if (fd >= 0)
  77. write(fd, pktbuf, ERASE_SIZE);
  78. exit(1);
  79. }
  80. printf("Decoded in %ld.%06lds\n", now.tv_sec, now.tv_usec);
  81. return 0;
  82. }