fpvextract.c 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # include <stdio.h>
  2. # include <stdint.h>
  3. # include <unistd.h>
  4. # include <string.h>
  5. # include <errno.h>
  6. # include <sys/types.h>
  7. # include <sys/stat.h>
  8. # include <fcntl.h>
  9. # include <arpa/inet.h>
  10. struct fpv
  11. {
  12. uint32_t len;
  13. uint8_t type;
  14. uint32_t ms;
  15. uint8_t pad[8];
  16. } __attribute__((packed));
  17. size_t out(int fd, uint8_t *data, size_t len)
  18. {
  19. int res = 0;
  20. while (len > 0) {
  21. size_t n;
  22. if ((n = write(fd, data, len)) > 0) {
  23. len -= n;
  24. data += n;
  25. res += n;
  26. } else {
  27. if (errno != EAGAIN) {
  28. printf("write: %s\n", strerror(errno));
  29. } else {
  30. continue;
  31. }
  32. break;
  33. }
  34. }
  35. return res;
  36. }
  37. size_t in(int fd, uint8_t *data, size_t len)
  38. {
  39. int res = 0;
  40. while (len > 0) {
  41. size_t n = read(fd, data, len);
  42. if (n > 0) {
  43. len -= n;
  44. data += n;
  45. res += n;
  46. } else {
  47. if (n < 0) {
  48. if (errno != EAGAIN) {
  49. printf("read: %s\n", strerror(errno));
  50. } else {
  51. continue;
  52. }
  53. }
  54. break;
  55. }
  56. }
  57. return res;
  58. }
  59. int main(int argc, char *argv[])
  60. {
  61. struct fpv fpv;
  62. static uint8_t data[8 * 1024 * 1024];
  63. int i;
  64. for (i = 1; i < argc; i++) {
  65. int fd = open(argv[i], O_RDONLY);
  66. if (fd >= 0) {
  67. while (1) {
  68. if (in(fd, (uint8_t*)&fpv, sizeof(fpv)) > 0) {
  69. if (in(fd, data, fpv.len) > 0) {
  70. switch (fpv.type) {
  71. case 0:
  72. out(fileno(stdout), data, fpv.len);
  73. break;
  74. default:
  75. continue;
  76. }
  77. } else {
  78. break;
  79. }
  80. } else {
  81. break;
  82. }
  83. }
  84. close(fd);
  85. }
  86. }
  87. return 0;
  88. }