ipedec.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <unistd.h>
  5. #include <sys/time.h>
  6. #include <errno.h>
  7. #include <ufodecode.h>
  8. int read_raw_file(const char *filename, char **buffer, size_t *length)
  9. {
  10. FILE *fp = fopen(filename, "rb");
  11. if (fp == NULL)
  12. return ENOENT;
  13. fseek(fp, 0, SEEK_END);
  14. *length = ftell(fp);
  15. rewind(fp);
  16. *buffer = (char *) malloc(*length);
  17. if (*buffer == NULL) {
  18. fclose(fp);
  19. return ENOMEM;
  20. }
  21. size_t buffer_length = fread(*buffer, 1, *length, fp);
  22. fclose(fp);
  23. if (buffer_length != *length) {
  24. free(buffer);
  25. return ERANGE;
  26. }
  27. return 0;
  28. }
  29. int main(int argc, char const* argv[])
  30. {
  31. if (argc < 3) {
  32. fprintf(stderr, "Usage: ipedec <filename> <number of lines per frame>\n");
  33. return EXIT_FAILURE;
  34. }
  35. char *buffer = NULL;
  36. size_t num_bytes = 0;
  37. if (read_raw_file(argv[1], &buffer, &num_bytes))
  38. return EXIT_FAILURE;
  39. const int rows = atoi(argv[2]);
  40. ufo_decoder decoder = ufo_decoder_new(rows, (uint32_t *) buffer, num_bytes);
  41. int err = 0;
  42. uint16_t *pixels = (uint16_t *) malloc(2048 * rows * sizeof(uint16_t));
  43. uint32_t frame_number, time_stamp;
  44. int num_frames = 0;
  45. struct timeval start, end;
  46. long seconds = 0L, useconds = 0L;
  47. FILE *fp = fopen("test.raw", "wb");
  48. while (!err) {
  49. gettimeofday(&start, NULL);
  50. err = ufo_decoder_get_next_frame(decoder, &pixels, &frame_number, &time_stamp);
  51. gettimeofday(&end, NULL);
  52. if (!err) {
  53. num_frames++;
  54. seconds += end.tv_sec - start.tv_sec;
  55. useconds += end.tv_usec - start.tv_usec;
  56. fwrite(pixels, sizeof(uint16_t), 2048 * 1088, fp);
  57. }
  58. }
  59. fclose(fp);
  60. float mtime = seconds * 1000.0 + useconds / 1000.0;
  61. printf("Decoded %i frames in %.5fms\n", num_frames, mtime);
  62. free(pixels);
  63. ufo_decoder_free(decoder);
  64. free(buffer);
  65. return 0;
  66. }