UVCCallBack.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/time.h>
  4. #include <iostream>
  5. #include <fstream>
  6. #include <vector>
  7. #include <memory>
  8. #include "../libuvc/libuvc.h"
  9. #include "UVCDeviceManager.h"
  10. #include "../DataManager/DataManager.h"
  11. #include "../DataManager/DataPackage.h"
  12. #include <opencv4/opencv2/opencv.hpp>
  13. #include <opencv4/opencv2/imgcodecs.hpp>
  14. struct timeval pre_frame_time;
  15. /* This callback function runs once per frame. Use it to perform any
  16. * quick processing you need, or have it put the frame into your application's
  17. * input queue. If this function takes too long, you'll start losing frames. */
  18. void cbSaveToLocal(uvc_frame_t *frame, void *ptr)
  19. {
  20. uvc_error_t ret;
  21. int *pindex = (int *)ptr;
  22. int index = *pindex;
  23. FILE *fp;
  24. static int jpeg_count[3] = {0};
  25. static int jpeg_group[3] = {0};
  26. static const char *H264_FILE = "iOSDevLog.h264";
  27. static const char *MJPEG_FILE = ".jpeg";
  28. char filename[264];
  29. std::fstream log_file("CallBackLog.txt", std::ios::app);
  30. DataPackagePtr dataPackage = nullptr;
  31. std::shared_ptr<DataPipe<DataPackage>> pipe;
  32. switch (frame->frame_format)
  33. {
  34. case UVC_FRAME_FORMAT_H264:
  35. /* use `ffplay H264_FILE` to play */
  36. fp = fopen(H264_FILE, "a");
  37. fwrite(frame->data, 1, frame->data_bytes, fp);
  38. fclose(fp);
  39. break;
  40. case UVC_COLOR_FORMAT_MJPEG:
  41. if (!g_gpioExplorer->getFailingStatus(index))
  42. {
  43. std::cout << "Pass this wave" << std::endl;
  44. break;
  45. }
  46. g_gpioExplorer->resetFailingStatus(index);
  47. if (jpeg_count[index] / 12 >= 1)
  48. jpeg_group[index]++;
  49. jpeg_count[index] = jpeg_count[index] % 12;
  50. std::cout << "Current File Device " << index << " Index : " << jpeg_count[index] << std::endl;
  51. sprintf(filename, "./data/%d/%d-%d%s", index, jpeg_group[index], jpeg_count[index]++, MJPEG_FILE);
  52. dataPackage = DataManager::getInstance().acquireDataBuffer<DataPackage>();
  53. memcpy(dataPackage->pJpegData, frame->data, frame->data_bytes);
  54. dataPackage->nJpegSize = frame->data_bytes;
  55. dataPackage->nWidth = frame->width;
  56. dataPackage->nHeight = frame->height;
  57. dataPackage->nTimeStamp = frame->capture_time_finished.tv_sec * 1000 + frame->capture_time_finished.tv_nsec / 1000000;
  58. DataManager::getInstance().pushData<DataPackage>("uvc" + std::to_string(index), dataPackage);
  59. break;
  60. case UVC_COLOR_FORMAT_YUYV:
  61. break;
  62. default:
  63. break;
  64. }
  65. if (frame->sequence % 30 == 0)
  66. {
  67. printf(" * got image %u\n", frame->sequence);
  68. }
  69. }
  70. // call back function
  71. void cbDoNothing(uvc_frame_t *frame, void *ptr)
  72. {
  73. printf("callback! frame_format = %d, width = %d, height = %d, length = %lu, ptr = %p\n",
  74. frame->frame_format, frame->width, frame->height, frame->data_bytes, ptr);
  75. }