summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/camera/veyeimx287m.cpp124
-rw-r--r--src/camera/veyeimx287m.h14
2 files changed, 73 insertions, 65 deletions
diff --git a/src/camera/veyeimx287m.cpp b/src/camera/veyeimx287m.cpp
index 1301c66..a6c8b93 100644
--- a/src/camera/veyeimx287m.cpp
+++ b/src/camera/veyeimx287m.cpp
@@ -12,6 +12,7 @@
#include <iostream>
#include <QElapsedTimer>
+#include <QtConcurrent/QtConcurrentRun>
// orpheus
#include "camera/veye_i2c.h"
@@ -229,9 +230,7 @@ VeyeIMX287m::~VeyeIMX287m()
if (m_cam_fd >= 0) {
if (close(m_cam_fd) == -1) {
- std::cout << __func__
- << ": cannot close camera: " << strerror(errno)
- << std::endl;
+ std::cout << __func__ << ": cannot close camera: " << strerror(errno) << std::endl;
}
};
@@ -270,8 +269,8 @@ bool VeyeIMX287m::startStream()
const auto ret = ioctl(m_cam_fd, VIDIOC_STREAMON, &radxa_buf_type);
if (ret != 0) {
- std::cerr << "ioctl(VIDIOC_STREAMON) failed: " << errno << " ("
- << strerror(errno) << ")" << std::endl;
+ std::cerr << "ioctl(VIDIOC_STREAMON) failed: " << errno << " (" << strerror(errno) << ")"
+ << std::endl;
return false;
}
@@ -314,8 +313,8 @@ bool VeyeIMX287m::set_autoExposure(const bool enable)
{
using namespace veye::imx287m;
- const uint32_t value = static_cast<uint32_t>(
- enable ? ExposureMode::AutoExposureContinious : ExposureMode::Manual);
+ const uint32_t value = static_cast<uint32_t>(enable ? ExposureMode::AutoExposureContinious
+ : ExposureMode::Manual);
return m_i2c->write(static_cast<uint16_t>(Register::Exposure_Mode), value);
}
@@ -324,23 +323,21 @@ std::optional<bool> VeyeIMX287m::get_autoExposure()
{
using namespace veye::imx287m;
- const auto value = m_i2c->read(
- static_cast<uint32_t>(Register::Exposure_Mode));
+ const auto value = m_i2c->read(static_cast<uint32_t>(Register::Exposure_Mode));
if (!value) {
return {};
}
- return *value
- == static_cast<uint32_t>(ExposureMode::AutoExposureContinious);
+ return *value == static_cast<uint32_t>(ExposureMode::AutoExposureContinious);
}
bool VeyeIMX287m::set_autoGain(const bool enable)
{
using namespace veye::imx287m;
- const uint32_t value = static_cast<uint32_t>(
- enable ? GainMode::AutoGainContinious : GainMode::Manual);
+ const uint32_t value = static_cast<uint32_t>(enable ? GainMode::AutoGainContinious
+ : GainMode::Manual);
return m_i2c->write(static_cast<uint16_t>(Register::Gain_Mode), value);
}
@@ -402,10 +399,7 @@ bool VeyeIMX287m::openCam()
m_cam_fd = open(videoDevice, O_RDWR);
if (m_cam_fd < 0) {
- fprintf(stderr,
- "cannot open cam '%s', error: '%s'\n",
- videoDevice,
- strerror(errno));
+ fprintf(stderr, "cannot open cam '%s', error: '%s'\n", videoDevice, strerror(errno));
return false;
}
@@ -430,9 +424,7 @@ bool VeyeIMX287m::initCam()
ret = ioctl(m_cam_fd, VIDIOC_TRY_FMT, &format);
if (ret < 0) {
- fprintf(stderr,
- "cannot try cam format: error - '%s'\n",
- strerror(errno));
+ fprintf(stderr, "cannot try cam format: error - '%s'\n", strerror(errno));
return false;
}
@@ -443,9 +435,7 @@ bool VeyeIMX287m::initCam()
ret = ioctl(m_cam_fd, VIDIOC_S_FMT, &format);
if (ret < 0) {
- fprintf(stderr,
- "cannot set cam format: error - '%s'\n",
- strerror(errno));
+ fprintf(stderr, "cannot set cam format: error - '%s'\n", strerror(errno));
return false;
}
@@ -501,9 +491,7 @@ bool VeyeIMX287m::initCam()
ret = ioctl(m_cam_fd, VIDIOC_REQBUFS, &rb);
if (ret < 0) {
- fprintf(stderr,
- "cannot set cam request buffers: ioctl error - '%s'\n",
- strerror(errno));
+ fprintf(stderr, "cannot set cam request buffers: ioctl error - '%s'\n", strerror(errno));
return false;
}
@@ -519,8 +507,7 @@ bool VeyeIMX287m::initCam()
std::cout << "query buffers" << std::endl;
for (uint32_t i = 0; i < rb.count; i++) {
- std::cout << "-----------------------------------------------------"
- << std::endl;
+ std::cout << "-----------------------------------------------------" << std::endl;
struct v4l2_buffer buf;
struct v4l2_plane planes[VIDEO_MAX_PLANES];
@@ -536,8 +523,8 @@ bool VeyeIMX287m::initCam()
ret = ioctl(m_cam_fd, VIDIOC_QUERYBUF, &buf);
if (ret < 0) {
- std::cerr << "ioctl(VIDIOC_QUERYBUF) failed: " << errno << " ("
- << strerror(errno) << ")" << std::endl;
+ std::cerr << "ioctl(VIDIOC_QUERYBUF) failed: " << errno << " (" << strerror(errno)
+ << ")" << std::endl;
return false;
}
@@ -564,8 +551,8 @@ bool VeyeIMX287m::initCam()
ret = ioctl(m_cam_fd, VIDIOC_QBUF, &buf);
if (ret != 0) {
- std::cerr << "ioctl(VIDIOC_QBUF) failed: " << errno << " ("
- << strerror(errno) << ")" << std::endl;
+ std::cerr << "ioctl(VIDIOC_QBUF) failed: " << errno << " (" << strerror(errno) << ")"
+ << std::endl;
return false;
}
}
@@ -587,6 +574,12 @@ void VeyeIMX287m::getFrameLoop(std::stop_token stopToken)
{
QElapsedTimer t;
+ uint8_t threadIdx{0};
+ std::array<QFuture<uint8_t>, BUFFER_COUNT> futures;
+
+ QThreadPool threadPool{};
+ threadPool.setMaxThreadCount(BUFFER_COUNT);
+
while (!stopToken.stop_requested()) {
size_t bufferIdx{std::numeric_limits<size_t>::max()};
@@ -594,24 +587,39 @@ void VeyeIMX287m::getFrameLoop(std::stop_token stopToken)
continue;
}
- // const auto &image = m_rawBuffers[bufferIdx].image;
+ const uint8_t i = threadIdx % futures.size();
+
+ futures[i].waitForFinished();
{
t.start();
-
- auto &src = *(Image::radxa_data_t *) m_rawBuffers[bufferIdx].mem;
- const auto image = std::make_shared<Image>();
- auto &dst = image->data;
+ const auto &src = *(Image::radxa_data_t *) m_rawBuffers[bufferIdx].mem;
+ // const auto image = std::make_shared<Image>();
+ // const auto &image = m_rawBuffers[i].image;
+ auto &dst = m_rawBuffers[i].image->data;
Image::copy(dst, src);
// image->rotate();
// const auto pixels = image->sharedPixels();
get_elapsed_ns += t.nsecsElapsed();
- m_sync.rawSemQueue.enqueue(image);
+ // m_sync.rawSemQueue.enqueue(image);
}
+ futures[i] = QtConcurrent::run(&threadPool,
+ [this, i]() {
+ const auto image = m_rawBuffers[i].image;
+ image->rotate();
+ const auto pixels = image->sharedPixels();
+ return i;
+ }) /*.then(&threadPool, [this](const uint8_t i) {
+ const auto image = m_rawBuffers[i].image;
+ const auto pixels = image->sharedPixels();
+ return i;
+ })*/
+ ;
+
++processedCounter;
- // m_sync.rawSemQueue.enqueue(bufferIdx);
+ ++threadIdx;
}
}
@@ -620,28 +628,28 @@ void VeyeIMX287m::rotateFrameLoop(std::stop_token stopToken)
while (!stopToken.stop_requested()) {
// const auto idx = m_sync.rawSemQueue.dequeue();
// const auto &image = m_rawBuffers[idx].image;
- const auto image = m_sync.rawSemQueue.dequeue();
- image->rotate();
+ // const auto image = m_sync.rawSemQueue.dequeue();
+ // image->rotate();
- // m_lastProcessedImage = idx;
- // m_lastProcessedImage = image;
+ // // m_lastProcessedImage = idx;
+ // // m_lastProcessedImage = image;
- // m_sync.rotSemQueue.enqueue(idx);
- m_sync.rotSemQueue.enqueue(image);
+ // // m_sync.rotSemQueue.enqueue(idx);
+ // m_sync.rotSemQueue.enqueue(image);
}
}
void VeyeIMX287m::calcPixelsLoop(std::stop_token stopToken)
{
while (!stopToken.stop_requested()) {
- // const auto idx = m_sync.rotSemQueue.dequeue();
- const auto image = m_sync.rotSemQueue.dequeue();
- // const auto &image = m_rawBuffers[idx].image;
- const auto pixels = image->sharedPixels();
- {
- std::lock_guard l{m_lastImageMtx};
- m_lastProcessedImage = image;
- }
+ // // const auto idx = m_sync.rotSemQueue.dequeue();
+ // const auto image = m_sync.rotSemQueue.dequeue();
+ // // const auto &image = m_rawBuffers[idx].image;
+ // const auto pixels = image->sharedPixels();
+ // {
+ // std::lock_guard l{m_lastImageMtx};
+ // m_lastProcessedImage = image;
+ // }
}
}
@@ -713,8 +721,8 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex)
}
if (ret != 0) {
- std::cerr << "ioctl(VIDIOC_DQBUF) failed: " << errno << " ("
- << strerror(errno) << ")" << std::endl;
+ std::cerr << "ioctl(VIDIOC_DQBUF) failed: " << errno << " (" << strerror(errno) << ")"
+ << std::endl;
return false;
}
@@ -744,8 +752,8 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex)
}
if (ret != 0) {
- std::cerr << "ioctl(VIDIOC_QBUF) failed: " << errno << " ("
- << strerror(errno) << ")" << std::endl;
+ std::cerr << "ioctl(VIDIOC_QBUF) failed: " << errno << " (" << strerror(errno) << ")"
+ << std::endl;
return false;
}
@@ -797,7 +805,7 @@ std::shared_ptr<Image> VeyeIMX287m::getImage()
{
std::lock_guard l{m_lastImageMtx};
- result = m_lastProcessedImage;
+ // result = m_lastProcessedImage;
// std::swap(result, m_lastProcessedImage);
}
// return {};
diff --git a/src/camera/veyeimx287m.h b/src/camera/veyeimx287m.h
index b875bb7..e4c02b0 100644
--- a/src/camera/veyeimx287m.h
+++ b/src/camera/veyeimx287m.h
@@ -92,7 +92,7 @@ private:
*/
std::optional<int64_t> m_previousFrameCounter{};
- static constexpr uint8_t BUFFER_COUNT{4};
+ static constexpr uint8_t BUFFER_COUNT{16};
// std::array<Image, BUFFER_COUNT> m_images;
/*!
@@ -105,15 +105,15 @@ private:
struct buffer
{
void *mem{nullptr};
- // std::shared_ptr<Image> image{std::make_shared<Image>()};
+ std::shared_ptr<Image> image{std::make_shared<Image>()};
};
std::vector<buffer> m_rawBuffers;
struct Semaphore
{
- sem_queue<std::shared_ptr<Image>, BUFFER_COUNT> rawSemQueue;
+ // sem_queue<std::shared_ptr<Image>, BUFFER_COUNT> rawSemQueue;
// sem_queue<size_t, BUFFER_COUNT> rawSemQueue;
- sem_queue<std::shared_ptr<Image>, BUFFER_COUNT> rotSemQueue;
+ // sem_queue<std::shared_ptr<Image>, BUFFER_COUNT> rotSemQueue;
// sem_queue<size_t, BUFFER_COUNT> rotSemQueue;
} m_sync;
@@ -121,14 +121,14 @@ private:
/*!
* \brief m_buffersQueue - queue of buffers which require extracting pixels
*/
- std::queue<std::remove_const<decltype(BUFFER_COUNT)>> m_buffersQueue;
+ // std::queue<std::remove_const<decltype(BUFFER_COUNT)>> m_buffersQueue;
std::jthread m_streamThread;
std::jthread m_getThreads[1];
// std::jthread m_getThreads[4];
// TODO: sync all loops somehow to guarantee frames order
- std::jthread m_rotateThreads[2];
- std::jthread m_calcPixelsThreads[2];
+ std::jthread m_rotateThreads[0];
+ std::jthread m_calcPixelsThreads[0];
std::mutex m_lastImageMtx;
std::shared_ptr<Image> m_lastProcessedImage{};