summaryrefslogtreecommitdiff
path: root/src/camera/veyeimx287m.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera/veyeimx287m.cpp')
-rw-r--r--src/camera/veyeimx287m.cpp104
1 files changed, 46 insertions, 58 deletions
diff --git a/src/camera/veyeimx287m.cpp b/src/camera/veyeimx287m.cpp
index 958c985..5b745aa 100644
--- a/src/camera/veyeimx287m.cpp
+++ b/src/camera/veyeimx287m.cpp
@@ -9,7 +9,9 @@
#include <sys/mman.h>
#include <unistd.h>
+#include <execution>
#include <iostream>
+#include <ranges>
#include <span>
#include <QElapsedTimer>
@@ -650,47 +652,37 @@ void VeyeIMX287m::calcFrameLoop(std::stop_token stopToken)
{
t.start();
- // std::lock_guard buffer_lock{m_bufferMutexes[bufferIdx]};
- // get: 4100-4500
- // memcpy(&image.data, m_videoBuffers[bufferIdx], img_size);
- memcpy(&image.data, m_videoBuffers[bufferIdx], radxa_raw_img_size);
- // memcpy(&image.data, buffers[bufferIdx].mem[0], radxa_raw_img_size);
- // get: 5000-5100
- // memcpy_1by1<img_size / sizeof(ARRAY_TYPE)>((ARRAY_TYPE *) &image.data,
- // (ARRAY_TYPE *) m_videoBuffers[bufferIdx]);
- // memcpy_1by1<img_size>((std::byte *) &image.data,
- // (std::byte *) m_videoBuffers[bufferIdx]);
+ // auto &src = *(Image::data_t *) m_videoBuffers[bufferIdx];
+ auto &src = *(Image::radxa_data_t *) m_videoBuffers[bufferIdx];
+ auto &dst = image.data;
+ Image::copy(dst, src);
- // memcpy_neon<img_size / sizeof(ARRAY_TYPE)>((ARRAY_TYPE *) &image.data,
- // (ARRAY_TYPE *) m_videoBuffers[bufferIdx]);
- // std::cerr << "size: " << img_size / sizeof(ARRAY_TYPE) << std::endl;
- // Image::data_t native;
- // Image::data_t neon;
- // memcpy(&native, m_videoBuffers[bufferIdx], img_size);
- // memcpy_neon<img_size / sizeof(ARRAY_TYPE)>((ARRAY_TYPE *) &neon,
- // (ARRAY_TYPE *) m_videoBuffers[bufferIdx]);
-
- // if (memcmp(&native, &neon, img_size) != 0) {
- // std::cerr << "different: " << img_size / sizeof(ARRAY_TYPE) << std::endl;
+ // #pragma omp parallel for num_threads(4)
+ // for (size_t i = 0; i < img_height; ++i) {
+ // memcpy(dst[i].data(), src[i].data(), img_width);
// }
+
+ // for (std::tuple<Image::row_t, Image::row_t> dst_src : std::views::zip())
+
+ // auto &dst = *(Image::data_t *) m_videoBuffers[bufferIdx];
+ // std::transform(std::execution::unseq,
+ // src.begin(),
+ // src.end(),
+ // dst.begin(),
+ // src.begin(),
+ // [](auto &srcRow, auto &dstRow) -> Image::row_t {
+ // // memcpy(dstRow.data(), srcRow.data(), img_width);
+ // return dstRow;
+ // // return Image::row_t(dst.begin(), dst.begin() + img_width);
+ // });
+ // memcpy(&image.data, m_videoBuffers[bufferIdx], radxa_raw_img_size);
get_elapsed_ns += t.nsecsElapsed();
}
image.rotate();
- // const auto pixels = image.pixels();
const auto pixels = image.sharedPixels();
++processedCounter;
-
-#pragma push_macro("emit")
-#undef emit
- // std::cout << "emit pixels" << std::endl;
- newPixels.emit(pixels);
-#pragma pop_macro("emit")
- // const auto lines = pixelsToLines(*pixels);
- // continue;
-
- // setCamParam(V4L2_CID_EXPOSURE, 18);
}
}
@@ -706,11 +698,11 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex)
double elapsedTime = (curr.tv_sec - prev.tv_sec) * 1000.0; // sec to ms
elapsedTime += (curr.tv_usec - prev.tv_usec) / 1000.0; // us to ms
- if (elapsedTime > 1000.) {
+ if (elapsedTime > 1000. && processedCounter != 0) {
fprintf(stderr,
- "fps: %d\tdropped: %d sec: %d "
- "dq: %d get: %d rot: %d pix: %d sum: %d corr: "
- "%d val: %d\n",
+ "fps: %d\tdropped: %lu sec: %ld "
+ "dq: %lu get: %lu rot: %lu pix: %lu sum: %lu corr: "
+ "%lu val: %lu\n",
counter,
dropped_count,
curr.tv_sec % 1000,
@@ -753,25 +745,20 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex)
buf.m.planes = planes;
static uint16_t requestIdx{0};
// buffer.index = BUFFER_COUNT;
+ const auto tmpIdx = requestIdx++ % BUFFER_COUNT;
buf.index = requestIdx++ % BUFFER_COUNT;
{
QElapsedTimer t;
t.start();
- // {
- // std::lock_guard<std::mutex> lock(m_queueMtx);
-
- // if (m_buffersQueue.size() >= BUFFER_COUNT) {
- // // std::cout << "frame skip" << std::endl;
- // dq_elapsed_ns += t.nsecsElapsed();
- // return false;
- // }
- // }
auto oldIdx = buf.index;
// m_bufferMutexes[buffer.index].lock();
- std::lock_guard<std::mutex> lock(m_camMtx);
- ret = ioctl(m_cam_fd, VIDIOC_DQBUF, &buf);
+ {
+ std::lock_guard<std::mutex> lock(m_camMtx);
+ ret = ioctl(m_cam_fd, VIDIOC_DQBUF, &buf);
+ }
+
// m_bufferMutexes[buffer.index].unlock();
auto newIdx = buf.index;
@@ -798,7 +785,7 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex)
// auto &image = video_buffer_ptr[buffer.index];
imageIndex = buf.index;
- // std::cout << "index: " << imageIndex << std::endl;
+ // std::cout << "index: " << imageIndex << '\t' << tmpIdx << std::endl;
auto &image = m_images[buf.index];
image.height = img_height;
image.width = img_width;
@@ -812,21 +799,14 @@ bool VeyeIMX287m::dequeueImageBuffer(size_t &imageIndex)
image.counters.timestampUs = buf.timestamp.tv_sec * 1000 * 1000 + buf.timestamp.tv_usec;
- // {
- // QElapsedTimer t;
- // t.start();
- // memcpy(&image.data, m_videoBuffers[buffer.index], img_size);
- // // std::cout << (void *) video_buffer_ptr[buffer.index] << std::endl;
- // get_elapsed_ns += t.nsecsElapsed();
- // }
-
{
std::lock_guard<std::mutex> lock(m_camMtx);
ret = ioctl(m_cam_fd, VIDIOC_QBUF, &buf);
}
if (ret != 0) {
- DBG("ioctl(VIDIOC_QBUF) failed %d(%s)", errno, strerror(errno));
+ std::cerr << "ioctl(VIDIOC_QBUF) failed: " << errno << " (" << strerror(errno) << ")"
+ << std::endl;
return false;
}
@@ -846,7 +826,15 @@ bool VeyeIMX287m::getImage(Image &image)
{
QElapsedTimer t;
t.start();
- memcpy(&image.data, m_videoBuffers[bufferIdx], img_size);
+ // memcpy(&image.data, m_videoBuffers[bufferIdx], img_size);
+ auto &src = *(Image::radxa_data_t *) m_videoBuffers[bufferIdx];
+ auto &dst = image.data;
+ Image::copy(dst, src);
+
+ // #pragma omp parallel for num_threads(4)
+ // for (size_t i = 0; i < img_height; ++i) {
+ // memcpy(dst[i].data(), src[i].data(), img_width);
+ // }
// memcpy(&image.data, buffers[bufferIdx].mem[0], img_size);
get_elapsed_ns += t.nsecsElapsed();
}