diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-29 18:49:35 +0100 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-29 18:49:35 +0100 |
| commit | c657073f8ebe84505613b593db4a41f30f86c970 (patch) | |
| tree | 2774796d44ae38852fbbea9af0cdb82899c806d0 /src/camera/veyeimx287m.cpp | |
| parent | fe1a89dbd83e10bfb480962a511fa0f43885eb77 (diff) | |
introduce sem_queue
Diffstat (limited to 'src/camera/veyeimx287m.cpp')
| -rw-r--r-- | src/camera/veyeimx287m.cpp | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/src/camera/veyeimx287m.cpp b/src/camera/veyeimx287m.cpp index 6df5a3e..a97297d 100644 --- a/src/camera/veyeimx287m.cpp +++ b/src/camera/veyeimx287m.cpp @@ -602,16 +602,22 @@ void VeyeIMX287m::getFrameLoop(std::stop_token stopToken) auto &src = *(Image::radxa_data_t *) m_buffers[bufferIdx].mem; auto &dst = image->data; Image::copy(dst, src); + // image->rotate(); + // const auto pixels = image->sharedPixels(); get_elapsed_ns += t.nsecsElapsed(); } ++processedCounter; - m_sync.freeRawBuffers.acquire(); - // TODO: check that queue cannot contain duplicate indices due to ioctl - // TODO: separate copied images from raw buffers - m_sync.rawBufferIndices.enqueue(bufferIdx); - m_sync.usedRawBuffers.release(); + m_sync.rawSemQueue.enqueue(bufferIdx); + // m_sync.freeRawBuffers.acquire(); + // // TODO: check that queue cannot contain duplicate indices due to ioctl + // // TODO: separate copied images from raw buffers + // { + // std::lock_guard l{m_sync.rawBufferMtx}; + // m_sync.rawBufferIndices.enqueue(bufferIdx); + // } + // m_sync.usedRawBuffers.release(); // image->rotate(); // const auto pixels = image->sharedPixels(); @@ -623,15 +629,25 @@ void VeyeIMX287m::rotateFrameLoop(std::stop_token stopToken) while (!stopToken.stop_requested()) { // std::cout << __func__ << std::endl; - m_sync.usedRawBuffers.acquire(); - const auto idx = m_sync.rawBufferIndices.dequeue(); + // m_sync.usedRawBuffers.acquire(); + // size_t idx = std::numeric_limits<size_t>::max(); + // { + // std::lock_guard l{m_sync.rawBufferMtx}; + // idx = m_sync.rawBufferIndices.dequeue(); + // } + const auto idx = m_sync.rawSemQueue.dequeue(); const auto &image = m_buffers[idx].image; image->rotate(); // const auto pixels = image->sharedPixels(); - m_sync.freeRawBuffers.release(); + m_lastProcessedIdx = idx; + // m_sync.freeRawBuffers.release(); + m_sync.rotSemQueue.enqueue(idx); // m_sync.freeRotatedBuffers.acquire(); - // m_sync.rotatedBufferIndices.enqueue(idx); + // { + // std::lock_guard l{m_sync.rotatedBufferMtx}; + // m_sync.rotatedBufferIndices.enqueue(idx); + // } // m_sync.usedRotatedBuffers.release(); } } @@ -639,11 +655,16 @@ void VeyeIMX287m::rotateFrameLoop(std::stop_token stopToken) void VeyeIMX287m::calcPixelsLoop(std::stop_token stopToken) { while (!stopToken.stop_requested()) { - m_sync.usedRotatedBuffers.acquire(); - const auto idx = m_sync.rotatedBufferIndices.dequeue(); + // m_sync.usedRotatedBuffers.acquire(); + // size_t idx{std::numeric_limits<size_t>::max()}; + // { + // std::lock_guard l{m_sync.rotatedBufferMtx}; + // idx = m_sync.rotatedBufferIndices.dequeue(); + // } + const auto idx = m_sync.rotSemQueue.dequeue(); const auto &image = m_buffers[idx].image; const auto pixels = image->sharedPixels(); - m_sync.freeRotatedBuffers.release(); + // m_sync.freeRotatedBuffers.release(); } } @@ -756,6 +777,7 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex) bool VeyeIMX287m::getImage(Image *image) { + return false; if (!image) { std::cerr << __func__ << ": image is nullptr" << std::endl; @@ -790,6 +812,12 @@ std::shared_ptr<Image> VeyeIMX287m::getImage() { std::shared_ptr<Image> result; + if (m_lastProcessedIdx != std::numeric_limits<size_t>::max()) { + return m_buffers[m_lastProcessedIdx].image; + } + + return {}; + size_t bufferIdx{}; if (!dequeueImageBuffer(bufferIdx)) { |
