Skip to content

Commit fbefff6

Browse files
committed
Fix vpVideoWriterStorageWorker to be able to use a vector of vpConcurrentQueue.
1 parent 43a6fa7 commit fbefff6

File tree

3 files changed

+37
-27
lines changed

3 files changed

+37
-27
lines changed

example/device/framegrabber/grabV4l2MultiCpp11Thread.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,12 @@ int main(int argc, char *argv[])
491491
ss << "/%06d.png";
492492
std::string filename = ss.str();
493493

494-
storages.emplace_back(std::ref(save_queues[deviceId]), std::cref(filename));
494+
std::vector< std::reference_wrapper<vpConcurrentQueue<vpImage<vpRGBa>>> > save_queue_single;
495+
save_queue_single.emplace_back(std::ref(save_queues[deviceId]));
496+
497+
std::vector<std::string> filenames;
498+
filenames.emplace_back(filename);
499+
storages.emplace_back(save_queue_single, filenames);
495500
}
496501
}
497502

modules/core/include/visp3/core/vpConcurrentQueue.h

+8-13
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,14 @@ template <class T, class Container = std::deque<T>> class VISP_EXPORT vpConcurre
5050
{ };
5151

5252
vpConcurrentQueue()
53-
: m_cancelled(false), m_cond(), /*m_data(),*/ m_maxQueueSize(1024), m_mutex(), m_queue()
53+
: m_cancelled(false), m_cond(), m_data(), m_maxQueueSize(1024), m_mutex(), m_queue()
5454
{ }
5555

5656
void cancel()
5757
{
58-
58+
std::lock_guard<std::mutex> lock(m_mutex);
59+
m_cancelled = true;
60+
m_cond.notify_all();
5961
}
6062

6163
// Push the data into the queue (FIFO)
@@ -73,8 +75,7 @@ template <class T, class Container = std::deque<T>> class VISP_EXPORT vpConcurre
7375
m_cond.notify_one();
7476
}
7577

76-
// Pop the image to save from the queue (FIFO)
77-
T &pop()
78+
T pop()
7879
{
7980
std::unique_lock<std::mutex> lock(m_mutex);
8081

@@ -90,16 +91,10 @@ template <class T, class Container = std::deque<T>> class VISP_EXPORT vpConcurre
9091
}
9192
}
9293

93-
// TODO:
94-
// m_data = m_queue.front();
95-
// m_queue.pop();
96-
97-
// return m_data;
98-
99-
T &data = m_queue.front();
94+
m_data = m_queue.front();
10095
m_queue.pop();
10196

102-
return data;
97+
return m_data;
10398
}
10499

105100
void setMaxQueueSize(size_t max_queue_size)
@@ -110,7 +105,7 @@ template <class T, class Container = std::deque<T>> class VISP_EXPORT vpConcurre
110105
private:
111106
bool m_cancelled;
112107
std::condition_variable m_cond;
113-
// T m_data;
108+
T m_data;
114109
size_t m_maxQueueSize;
115110
std::mutex m_mutex;
116111
std::queue<T> m_queue;

modules/io/include/visp3/io/vpVideoWriterStorageWorker.h

+23-13
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@
4747
template <class T, class Container = std::deque<vpImage<T>>> class VISP_EXPORT vpVideoWriterStorageWorker
4848
{
4949
public:
50-
vpVideoWriterStorageWorker(vpConcurrentQueue<vpImage<T>, Container> &queue, const std::string &filename)
51-
: m_filename(filename), m_queue(queue), m_writer()
50+
vpVideoWriterStorageWorker(const std::vector<std::reference_wrapper<vpConcurrentQueue<vpImage<T>, Container>>> &queues,
51+
const std::vector< std::string > &filenames)
52+
: m_filenames(filenames), m_images(), m_queues(queues), m_writers()
5253
{
5354
assert(!m_queues.empty());
5455
assert(m_queues.size() == m_filenames.size());
@@ -57,29 +58,38 @@ template <class T, class Container = std::deque<vpImage<T>>> class VISP_EXPORT v
5758
// Thread main loop
5859
void run()
5960
{
60-
m_writer.setFileName(m_filename);
61+
m_images.resize(m_queues.size());
62+
m_writers.resize(m_queues.size());
63+
64+
std::vector<bool> is_opened_vec;
65+
for (size_t i = 0; i < m_filenames.size(); i++) {
66+
m_writers[i].setFileName(m_filenames[i]);
67+
is_opened_vec.push_back(false);
68+
}
6169

6270
try {
63-
bool is_opened = false;
6471
for (;;) {
65-
vpImage<T> &image = m_queue.pop();
72+
for (size_t i = 0; i < m_queues.size(); i++) {
73+
m_images[i] = m_queues[i].get().pop();
6674

67-
if (!is_opened) {
68-
m_writer.open(image);
69-
is_opened = true;
70-
}
75+
if (!is_opened_vec[i]) {
76+
m_writers[i].open(m_images[i]);
77+
is_opened_vec[i] = true;
78+
}
7179

72-
m_writer.saveFrame(image);
80+
m_writers[i].saveFrame(m_images[i]);
81+
}
7382
}
7483
}
7584
catch (typename vpConcurrentQueue<vpImage<T>, Container>::vpCancelled_t &) {
7685
}
7786
}
7887

7988
private:
80-
std::string m_filename;
81-
vpConcurrentQueue<vpImage<T>, Container> &m_queue;
82-
vpVideoWriter m_writer;
89+
std::vector<std::string> m_filenames;
90+
std::vector<vpImage<T>> m_images;
91+
std::vector< std::reference_wrapper<vpConcurrentQueue<vpImage<T>, Container>> > m_queues;
92+
std::vector<vpVideoWriter> m_writers;
8393
};
8494

8595
#endif

0 commit comments

Comments
 (0)