diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-30 01:36:09 +0100 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-30 01:36:09 +0100 |
| commit | af4ed371ad41a53c34c8da193542cc87ddca17ed (patch) | |
| tree | e97e4020749a24bc7d1c53eb04faac16a0cb3c5f | |
| parent | cf87257fc3b7132eccf305f3eca9ee56c151d913 (diff) | |
| -rw-r--r-- | src/camera/icamera.h | 1 | ||||
| -rw-r--r-- | src/camera/veyeimx287m.cpp | 109 | ||||
| -rw-r--r-- | src/image.h | 2 |
3 files changed, 10 insertions, 102 deletions
diff --git a/src/camera/icamera.h b/src/camera/icamera.h index 310e709..d618e57 100644 --- a/src/camera/icamera.h +++ b/src/camera/icamera.h @@ -52,6 +52,7 @@ public: // [[nodiscard]] virtual bool getImage(Image *image) = 0; // [[nodiscard]] virtual std::shared_ptr<Image> getImage() = 0; // [[nodiscard]] virtual std::optional<Image &> getImage() = 0; + // FIXME: this shit is not thread-safe: data can be changed [[nodiscard]] virtual Image *getImage() = 0; public: diff --git a/src/camera/veyeimx287m.cpp b/src/camera/veyeimx287m.cpp index c36caaa..845bcdc 100644 --- a/src/camera/veyeimx287m.cpp +++ b/src/camera/veyeimx287m.cpp @@ -285,9 +285,6 @@ bool VeyeIMX287m::init() return false; } - // if (!initHttpServer()) - // return false; - return true; } @@ -583,25 +580,23 @@ void VeyeIMX287m::getFramesLoop(std::stop_token stopToken) } futures[i] = QtConcurrent::run(/*&threadPool, */ [this, i]() { + auto &image = m_images[i]; + image.rotate(); + // const auto &pixels = image.getPixels(); + // m_lastImageIdx = i; + return i; + }).then([this](const uint8_t 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; - })*/ - ; + }); ++processedCounter; ++threadIdx; } } -// TODO: check if some of buffers are being overritten during processing bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex) { static struct timeval curr, prev; @@ -682,18 +677,9 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex) imageIndex = buf.index; - // const auto &image = m_rawBuffers[buf.index].image; - // image->height = img_height; - // image->width = img_width; - // // TODO: fill - // // image.counters.encoderPosition = RotaryEncoder::instance()->position(); - // image->counters.measurementCounter = buf.sequence; - dropped_count += buf.sequence - m_previousFrameCounter.value_or(buf.sequence) - 1; m_previousFrameCounter = buf.sequence; - // image->counters.timestampUs = buf.timestamp.tv_sec * 1000 * 1000 + buf.timestamp.tv_usec; - { std::lock_guard<std::mutex> lock(m_camMtx); ret = ioctl(m_cam_fd, VIDIOC_QBUF, &buf); @@ -708,88 +694,7 @@ 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; - -// return false; -// } - -// 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; -// } - Image *VeyeIMX287m::getImage() { return m_lastImageIdx.has_value() ? &m_images[*m_lastImageIdx] : nullptr; } - -// std::shared_ptr<Image> VeyeIMX287m::getImage() -// { -// std::shared_ptr<Image> result; -// std::shared_ptr<Image> result = std::make_shared<Image>(); - -// if (m_lastProcessedImage != std::numeric_limits<size_t>::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; -// } diff --git a/src/image.h b/src/image.h index 105711b..838180c 100644 --- a/src/image.h +++ b/src/image.h @@ -43,6 +43,8 @@ struct Image void rotate(); // std::shared_ptr<Pixels> sharedPixels(); + // FIXME: is not thread-safe: processing can be triggered from multiple + // threads at the same time Pixels &getPixels(); void copyFromData(const void* src, size_t size); |
