diff options
Diffstat (limited to 'src/camera')
| -rw-r--r-- | src/camera/icamera.h | 6 | ||||
| -rw-r--r-- | src/camera/veyeimx287m.cpp | 163 | ||||
| -rw-r--r-- | src/camera/veyeimx287m.h | 20 |
3 files changed, 98 insertions, 91 deletions
diff --git a/src/camera/icamera.h b/src/camera/icamera.h index 545daf9..310e709 100644 --- a/src/camera/icamera.h +++ b/src/camera/icamera.h @@ -49,8 +49,10 @@ public: [[nodiscard]] virtual bool set_gain(const float value) = 0; [[nodiscard]] virtual std::optional<float> get_gain() = 0; - [[nodiscard]] virtual bool getImage(Image *image) = 0; - [[nodiscard]] virtual std::shared_ptr<Image> getImage() = 0; + // [[nodiscard]] virtual bool getImage(Image *image) = 0; + // [[nodiscard]] virtual std::shared_ptr<Image> getImage() = 0; + // [[nodiscard]] virtual std::optional<Image &> getImage() = 0; + [[nodiscard]] virtual Image *getImage() = 0; public: [[nodiscard]] virtual bool startStream() = 0; 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<Image>(); - // 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; - // } +// 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]}; +// // 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(); - // } +// 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; -} +// return true; +// } -std::shared_ptr<Image> VeyeIMX287m::getImage() +Image *VeyeIMX287m::getImage() { - std::shared_ptr<Image> result; - // std::shared_ptr<Image> result = std::make_shared<Image>(); + return m_lastImageIdx.has_value() ? &m_images[*m_lastImageIdx] : nullptr; +} - // if (m_lastProcessedImage != std::numeric_limits<size_t>::max()) { - // if (m_lastProcessedImage) { - // return m_rawBuffers[m_lastProcessedImage].image; - // } +// std::shared_ptr<Image> VeyeIMX287m::getImage() +// { +// std::shared_ptr<Image> result; +// std::shared_ptr<Image> result = std::make_shared<Image>(); - { - std::lock_guard l{m_lastImageMtx}; - // result = m_lastProcessedImage; - // std::swap(result, m_lastProcessedImage); - } - // return {}; - // { - // return m_lastProcessedImage; - // result = m_lastProcessedImage; - // } - return result; +// if (m_lastProcessedImage != std::numeric_limits<size_t>::max()) { +// if (m_lastProcessedImage) { +// return m_rawBuffers[m_lastProcessedImage].image; +// } - // size_t bufferIdx{}; +// { +// std::lock_guard l{m_lastImageMtx}; +// result = m_lastProcessedImage; +// std::swap(result, m_lastProcessedImage); +// } +// return {}; +// { +// return m_lastProcessedImage; +// result = m_lastProcessedImage; +// } +// return result; - // if (!dequeueImageBuffer(bufferIdx)) { - // std::cerr << "cannot dequeue" << std::endl; - // return {}; - // } +// size_t bufferIdx{}; - // // 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]}; +// if (!dequeueImageBuffer(bufferIdx)) { +// std::cerr << "cannot dequeue" << std::endl; +// return {}; +// } - // 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; +// // 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]}; - // return result; -} +// 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; +// } diff --git a/src/camera/veyeimx287m.h b/src/camera/veyeimx287m.h index d65b00d..3f591f7 100644 --- a/src/camera/veyeimx287m.h +++ b/src/camera/veyeimx287m.h @@ -44,8 +44,9 @@ public: [[nodiscard]] bool dequeueImageBuffer(size_t &image); // bool getImage(Image &image); - [[nodiscard]] bool getImage(Image *image) override; - [[nodiscard]] std::shared_ptr<Image> getImage() override; + // [[nodiscard]] bool getImage(Image *image) override; + [[nodiscard]] Image *getImage() override; + // [[nodiscard]] std::shared_ptr<Image> getImage() override; bool init(); @@ -66,7 +67,7 @@ public: public: /*! * \brief processedCounter - count of images processed in current second. - * Used for performance measurement and bottlenecks analysing + * Used for performance measurement and bottlenecks analysis */ uint32_t processedCounter{0}; @@ -76,6 +77,11 @@ private: [[nodiscard]] bool initI2C(); + /*! + * \brief getFramesLoop - get frames from camera and manage futher processing + * \note to be started in a soparate thread + * \param stopToken - asks to break the loop + */ void getFramesLoop(std::stop_token stopToken); private: @@ -96,21 +102,19 @@ private: */ std::array<std::mutex, BUFFER_COUNT> m_imageMutexes; - // TODO: split this - // there should be no chance of changing image by ioctl during futher processing struct buffer { void *mem{nullptr}; - std::shared_ptr<Image> image{std::make_shared<Image>()}; }; std::vector<buffer> m_rawBuffers; - // std::array<Image, BUFFER_COUNT> m_images; + std::array<Image, BUFFER_COUNT> m_images; + // std::optional<std::remove_const<decltype(BUFFER_COUNT)>> m_lastImageIdx; + std::optional<uint8_t> m_lastImageIdx; std::mutex m_camMtx; std::jthread m_streamThread; std::jthread m_getThreads[1]; - std::mutex m_lastImageMtx; std::shared_ptr<Image> m_lastProcessedImage{}; std::shared_ptr<veye::imx287m::i2c> m_i2c; |
