summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-11-30 01:36:09 +0100
committerNikita Kostovsky <nikita@kostovsky.me>2025-11-30 01:36:09 +0100
commitaf4ed371ad41a53c34c8da193542cc87ddca17ed (patch)
treee97e4020749a24bc7d1c53eb04faac16a0cb3c5f
parentcf87257fc3b7132eccf305f3eca9ee56c151d913 (diff)
unsynced but fast getting pixels and imageHEADmaster
-rw-r--r--src/camera/icamera.h1
-rw-r--r--src/camera/veyeimx287m.cpp109
-rw-r--r--src/image.h2
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);