AsyncProcessor.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #pragma once
  2. #include <iostream>
  3. #include <queue>
  4. #include <thread>
  5. #include <mutex>
  6. #include <condition_variable>
  7. #include <functional>
  8. #include <map>
  9. #include <atomic>
  10. #include "Common.h"
  11. #include "Request.h"
  12. // #include "ResourceKit.h"
  13. struct PreProcessedCache
  14. {
  15. // unsigned char *preProcessedImg;
  16. // unsigned char *preProcessedMaxImg;
  17. std::shared_ptr<unsigned char> preProcessedMaxImg;
  18. int preProcessedImgSize;
  19. float scaleInfo; ///< 缩放因子
  20. int srcWidth, srcHeight; ///< 媒体流的宽高
  21. };
  22. struct InferedCache
  23. {
  24. // int8_t *inferedMaxTotalensor;
  25. #ifdef EEASY_CHIP
  26. std::shared_ptr<int8_t> inferedMaxTotalensor;
  27. std::vector<signed char *> inferedTensor;
  28. #elif AXERA_CHIP
  29. std::shared_ptr<float_t> inferedMaxTotalensor;
  30. std::vector<float *> inferedTensor;
  31. #endif
  32. // std::vector<std::shared_ptr<signed char> > inferedTensor;
  33. // std::vector<vx_size[4]> outputDataDims; ///< 输出数据的维度
  34. std::vector<std::array<size_t, 4>> outputDataDims; ///< 输出数据的维度
  35. int32_t dataType[5]; ///< 数据类型数组
  36. int floatingPoint[5]; ///< 浮点数位数数组
  37. unsigned int strides[5]; ///< 步长数组
  38. std::vector<std::string> classNames; ///< 类别名称数组
  39. PreProcessedCache preProcessedCache;
  40. };
  41. class AsyncProcessor
  42. {
  43. public:
  44. // AsynProcessor();
  45. // ~AsynProcessor()
  46. // {
  47. // // cleanup(); // 在对象销毁时执行清理操作
  48. // }
  49. int initialize(const ResourceKit resourceKit);
  50. int setCache(unsigned long maxPreprocessDstImageSize,unsigned long maxInferedTensorTotalSize);
  51. void cleanup();
  52. int createRequest(const frame_t data, const ResourceKit resourceKit, std::vector<std::tuple<int, std::vector<int>>> inferResource);
  53. void wait(int requestId);
  54. Result getResult(int requestId);
  55. private:
  56. int nextRequestId = 0;
  57. void processUnit(int unit);
  58. void process(Request &request, int unit);
  59. void distribution(Request &request);
  60. // 预处理后结果缓存
  61. PreProcessedCache preProcessedCache;
  62. std::mutex mutex_preProcessedImg;
  63. // 推理后结果缓存
  64. InferedCache inferedCache;
  65. std::mutex mutex_infered;
  66. // 后处理需要用到的变量
  67. // PostProcessedCache postProcessedCache;
  68. // ai处理的三个线程
  69. std::vector<std::thread> aiThreads;
  70. // 未处理队列
  71. std::vector<std::queue<Request>> unprocessedQueues;
  72. // 未处理队列锁
  73. std::mutex mutex_unprocessedQueues;
  74. // 已经有结果的队列
  75. std::mutex mutex_processedRequests;
  76. // 未有结果的队列
  77. std::map<int, Result> processedRequests;
  78. std::condition_variable condition;
  79. std::condition_variable conditionProcessed;
  80. std::atomic<bool> stopProcessing;
  81. };