diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/camera/veyeimx287m.cpp | 124 | ||||
| -rw-r--r-- | src/camera/veyeimx287m.h | 14 |
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{}; |
