From cf87257fc3b7132eccf305f3eca9ee56c151d913 Mon Sep 17 00:00:00 2001 From: Nikita Kostovsky Date: Sun, 30 Nov 2025 01:19:33 +0100 Subject: don't waste memory --- src/camera/veyeimx287m.cpp | 179 +++++++++++++++++++++++---------------------- 1 file changed, 90 insertions(+), 89 deletions(-) (limited to 'src/camera/veyeimx287m.cpp') diff --git a/src/camera/veyeimx287m.cpp b/src/camera/veyeimx287m.cpp index 54bb47e..c36caaa 100644 --- a/src/camera/veyeimx287m.cpp +++ b/src/camera/veyeimx287m.cpp @@ -572,30 +572,26 @@ void VeyeIMX287m::getFramesLoop(std::stop_token stopToken) const uint8_t i = threadIdx % futures.size(); futures[i].waitForFinished(); + m_images[i].reset(); { t.start(); const auto &src = *(Image::radxa_data_t *) m_rawBuffers[bufferIdx].mem; - // const auto image = std::make_shared(); - // const auto &image = m_rawBuffers[i].image; - auto &dst = m_rawBuffers[i].image->data; + auto &dst = m_images[i].data; Image::copy(dst, src); - // image->rotate(); - // const auto pixels = image->sharedPixels(); - get_elapsed_ns += t.nsecsElapsed(); - // 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(); + futures[i] = QtConcurrent::run(/*&threadPool, */ [this, i]() { + auto &image = m_images[i]; + image.rotate(); + // const auto pixels = image.sharedPixels(); + const auto &pixels = image.getPixels(); + m_lastImageIdx = i; + return i; + }) /*.then([this](const uint8_t i) { + auto &image = m_images[i]; + const auto pixels = image.sharedPixels(); return i; })*/ ; @@ -712,83 +708,88 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex) return true; } -bool VeyeIMX287m::getImage(Image *image) -{ - return false; - // if (!image) { - // std::cerr << __func__ << ": image is nullptr" << std::endl; +// bool VeyeIMX287m::getImage(Image *image) +// { +// return false; +// if (!image) { +// std::cerr << __func__ << ": image is nullptr" << std::endl; - // return false; - // } +// return false; +// } - // size_t bufferIdx{}; +// size_t bufferIdx{}; - // if (!dequeueImageBuffer(bufferIdx)) { - // return false; - // } - - // // TODO: remove this bullshit. return ptr to image or copy image metainfo - // // only, then copy data - // // *image = std::move(m_images[bufferIdx]); - // *image = std::move(*m_rawBuffers[bufferIdx].image); - // { - // QElapsedTimer t; - // t.start(); - // std::lock_guard lock{m_imageMutexes[bufferIdx]}; - - // auto &src = *(Image::radxa_data_t *) m_rawBuffers[bufferIdx].mem; - // auto &dst = image->data; - // Image::copy(dst, src); - // get_elapsed_ns += t.nsecsElapsed(); - // } - - // return true; -} +// if (!dequeueImageBuffer(bufferIdx)) { +// return false; +// } -std::shared_ptr VeyeIMX287m::getImage() -{ - std::shared_ptr result; - // std::shared_ptr result = std::make_shared(); +// // TODO: remove this bullshit. return ptr to image or copy image metainfo +// // only, then copy data +// // *image = std::move(m_images[bufferIdx]); +// *image = std::move(*m_rawBuffers[bufferIdx].image); +// { +// QElapsedTimer t; +// t.start(); +// std::lock_guard lock{m_imageMutexes[bufferIdx]}; - // if (m_lastProcessedImage != std::numeric_limits::max()) { - // if (m_lastProcessedImage) { - // return m_rawBuffers[m_lastProcessedImage].image; - // } +// auto &src = *(Image::radxa_data_t *) m_rawBuffers[bufferIdx].mem; +// auto &dst = image->data; +// Image::copy(dst, src); +// get_elapsed_ns += t.nsecsElapsed(); +// } - { - std::lock_guard l{m_lastImageMtx}; - // result = m_lastProcessedImage; - // std::swap(result, m_lastProcessedImage); - } - // return {}; - // { - // return m_lastProcessedImage; - // result = m_lastProcessedImage; - // } - return result; - - // size_t bufferIdx{}; - - // if (!dequeueImageBuffer(bufferIdx)) { - // std::cerr << "cannot dequeue" << std::endl; - // return {}; - // } - - // // TODO: remove this bullshit. return ptr to image or copy image metainfo - // // only, then copy data - // // *image = std::move(m_images[bufferIdx]); - // // result = m_rawBuffers[bufferIdx].image; - // { - // QElapsedTimer t; - // t.start(); - // std::lock_guard lock{m_imageMutexes[bufferIdx]}; - - // auto &src = *(Image::radxa_data_t *) m_rawBuffers[bufferIdx].mem; - // auto &dst = result->data; - // Image::copy(dst, src); - // get_elapsed_ns += t.nsecsElapsed(); - // } - // // std::cerr << "ok" << std::endl; - - // return result; +// return true; +// } + +Image *VeyeIMX287m::getImage() +{ + return m_lastImageIdx.has_value() ? &m_images[*m_lastImageIdx] : nullptr; } + +// std::shared_ptr VeyeIMX287m::getImage() +// { +// std::shared_ptr result; +// std::shared_ptr result = std::make_shared(); + +// if (m_lastProcessedImage != std::numeric_limits::max()) { +// if (m_lastProcessedImage) { +// return m_rawBuffers[m_lastProcessedImage].image; +// } + +// { +// std::lock_guard l{m_lastImageMtx}; +// result = m_lastProcessedImage; +// std::swap(result, m_lastProcessedImage); +// } +// return {}; +// { +// return m_lastProcessedImage; +// result = m_lastProcessedImage; +// } +// return result; + +// size_t bufferIdx{}; + +// if (!dequeueImageBuffer(bufferIdx)) { +// std::cerr << "cannot dequeue" << std::endl; +// return {}; +// } + +// // TODO: remove this bullshit. return ptr to image or copy image metainfo +// // only, then copy data +// // *image = std::move(m_images[bufferIdx]); +// // result = m_rawBuffers[bufferIdx].image; +// { +// QElapsedTimer t; +// t.start(); +// std::lock_guard lock{m_imageMutexes[bufferIdx]}; + +// auto &src = *(Image::radxa_data_t *) m_rawBuffers[bufferIdx].mem; +// auto &dst = result->data; +// Image::copy(dst, src); +// get_elapsed_ns += t.nsecsElapsed(); +// } +// // std::cerr << "ok" << std::endl; + +// return result; +// } -- cgit v1.2.3-70-g09d2