From 40ca7f75b233425b33c4db537783d32f1b1ab7fe Mon Sep 17 00:00:00 2001 From: Nikita Kostovsky Date: Wed, 12 Nov 2025 12:07:14 +0100 Subject: radxa: copy only first img_width bytes for each row; cleanup --- src/camera/veyeimx287m.cpp | 106 ++++++++++++++++++++------------------------- src/camera/veyeimx287m.h | 3 +- 2 files changed, 48 insertions(+), 61 deletions(-) (limited to 'src/camera') 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 #include +#include #include +#include #include #include @@ -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((ARRAY_TYPE *) &image.data, - // (ARRAY_TYPE *) m_videoBuffers[bufferIdx]); - // memcpy_1by1((std::byte *) &image.data, - // (std::byte *) m_videoBuffers[bufferIdx]); - - // memcpy_neon((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((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; + // 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); + + // #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 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 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 lock(m_camMtx); - ret = ioctl(m_cam_fd, VIDIOC_DQBUF, &buf); + { + std::lock_guard 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 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(); } diff --git a/src/camera/veyeimx287m.h b/src/camera/veyeimx287m.h index e1eb76d..b28ce96 100644 --- a/src/camera/veyeimx287m.h +++ b/src/camera/veyeimx287m.h @@ -44,6 +44,7 @@ public: public: // libcamera::Signal> newPixels; // libcamera::Signal> newImage; + uint32_t processedCounter{0}; private: bool setCamParam(unsigned int v4l2controlId, int value); @@ -81,6 +82,4 @@ private: std::jthread m_streamThread; // std::jthread m_calcThreads[1]; std::jthread m_calcThreads[4]; - - uint32_t processedCounter{0}; }; -- cgit v1.2.3-70-g09d2