dummy_source.hpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #ifndef OPENCV_GAPI_PIPELINE_MODELING_TOOL_DUMMY_SOURCE_HPP
  2. #define OPENCV_GAPI_PIPELINE_MODELING_TOOL_DUMMY_SOURCE_HPP
  3. #include <thread>
  4. #include <memory>
  5. #include <chrono>
  6. #include <opencv2/gapi.hpp>
  7. #include <opencv2/gapi/streaming/cap.hpp> // cv::gapi::wip::IStreamSource
  8. #include "utils.hpp"
  9. class DummySource final: public cv::gapi::wip::IStreamSource {
  10. public:
  11. using Ptr = std::shared_ptr<DummySource>;
  12. DummySource(const double latency,
  13. const OutputDescr& output);
  14. bool pull(cv::gapi::wip::Data& data) override;
  15. cv::GMetaArg descr_of() const override;
  16. private:
  17. double m_latency;
  18. cv::Mat m_mat;
  19. using TimePoint =
  20. std::chrono::time_point<std::chrono::high_resolution_clock>;
  21. cv::optional<TimePoint> m_prev_pull_tp;
  22. };
  23. DummySource::DummySource(const double latency,
  24. const OutputDescr& output)
  25. : m_latency(latency) {
  26. utils::createNDMat(m_mat, output.dims, output.precision);
  27. utils::generateRandom(m_mat);
  28. }
  29. bool DummySource::pull(cv::gapi::wip::Data& data) {
  30. using namespace std::chrono;
  31. using namespace cv::gapi::streaming;
  32. // NB: In case it's the first pull.
  33. if (!m_prev_pull_tp) {
  34. m_prev_pull_tp = cv::util::make_optional(high_resolution_clock::now());
  35. }
  36. // NB: Just increase reference counter not to release mat memory
  37. // after assigning it to the data.
  38. cv::Mat mat = m_mat;
  39. auto end = high_resolution_clock::now();
  40. auto elapsed =
  41. duration_cast<duration<double, std::milli>>(end - *m_prev_pull_tp).count();
  42. auto delta = m_latency - elapsed;
  43. if (delta > 0) {
  44. utils::sleep(delta);
  45. }
  46. data.meta[meta_tag::timestamp] = int64_t{utils::timestamp<milliseconds>()};
  47. data = mat;
  48. m_prev_pull_tp = cv::util::make_optional(high_resolution_clock::now());
  49. return true;
  50. }
  51. cv::GMetaArg DummySource::descr_of() const {
  52. return cv::GMetaArg{cv::descr_of(m_mat)};
  53. }
  54. #endif // OPENCV_GAPI_PIPELINE_MODELING_TOOL_DUMMY_SOURCE_HPP