35 #ifndef __viva__channel__ 36 #define __viva__channel__ 38 #include "opencv2/opencv.hpp" 40 #include <condition_variable> 60 std::deque<Data> _images;
61 std::mutex _access_queue;
62 std::mutex _access_termination;
63 std::mutex _access_fps;
66 std::condition_variable _consume;
67 std::condition_variable _produce;
74 void addData(Data &data);
78 bool getData(Data &data);
81 void setFrequency(
float frequency);
82 void setCapacity(
size_t capacity);
85 _capacity(capacity), _terminate(
false), _fps(0)
95 std::lock_guard<std::mutex> guard(_access_queue);
103 std::lock_guard<std::mutex> guard(_access_termination);
105 _consume.notify_all();
106 _produce.notify_all();
111 std::lock_guard<std::mutex> guard(_access_termination);
118 std::unique_lock<std::mutex> guard(_access_queue);
119 _produce.wait(guard,[&] {
120 return !isOpen() || (_images.size() < _capacity);
127 _images.push_back(data);
130 _consume.notify_one();
135 std::lock_guard<std::mutex> guard(_access_queue);
136 return _images.empty();
141 std::unique_lock<std::mutex> guard(_access_queue);
142 _consume.wait(guard, [&] {
143 return (!isOpen() && _images.empty()) || !_images.empty();
145 if (_images.empty() && !isOpen())
151 data = _images.front();
154 _produce.notify_one();
162 std::lock_guard<std::mutex> guard(_access_fps);
168 std::lock_guard<std::mutex> guard(_access_fps);