diff options
| -rw-r--r-- | src/camera/icamera.h | 29 | ||||
| -rw-r--r-- | src/camera/veyeimx287m.cpp | 53 | ||||
| -rw-r--r-- | src/camera/veyeimx287m.h | 12 |
3 files changed, 38 insertions, 56 deletions
diff --git a/src/camera/icamera.h b/src/camera/icamera.h index 44ed4b3..6ceb520 100644 --- a/src/camera/icamera.h +++ b/src/camera/icamera.h @@ -32,34 +32,25 @@ public: virtual ~ICamera() = default; public: - virtual bool set_autoExposure(const bool enable) = 0; - /*! - * \brief get_autoExposure - check if auto exposure is enabled - * \param ok - indicates successful read - * \return true if enabled, false otherwise - */ + [[nodiscard]] virtual bool set_autoExposure(const bool enable) = 0; /*! * \brief get_autoExposure - check if auto exposure is enabled * \return non-empty value on success, empty value on failure */ - virtual std::optional<bool> get_autoExposure() = 0; + [[nodiscard]] virtual std::optional<bool> get_autoExposure() = 0; - virtual bool set_exposureTime(const std::chrono::microseconds us) = 0; - virtual std::optional<const std::chrono::microseconds> get_exposureTime() = 0; + [[nodiscard]] virtual bool set_exposureTime(const std::chrono::microseconds us) = 0; + [[nodiscard]] virtual std::optional<const std::chrono::microseconds> get_exposureTime() = 0; - virtual bool set_autoGain(const bool enable) = 0; - virtual std::optional<bool> get_autoGain() = 0; + [[nodiscard]] virtual bool set_autoGain(const bool enable) = 0; + [[nodiscard]] virtual std::optional<bool> get_autoGain() = 0; - virtual bool set_gain(const float value) = 0; - virtual std::optional<float> get_gain() = 0; + [[nodiscard]] virtual bool set_gain(const float value) = 0; + [[nodiscard]] virtual std::optional<float> get_gain() = 0; - virtual bool getImage(Image *image) = 0; - -public: - std::function<void(std::shared_ptr<Pixels>)> newPixelsCallback; - std::function<void(Image &)> newImageCallback; + [[nodiscard]] virtual bool getImage(Image *image) = 0; public: - virtual bool startStream() = 0; + [[nodiscard]] virtual bool startStream() = 0; }; diff --git a/src/camera/veyeimx287m.cpp b/src/camera/veyeimx287m.cpp index 2e4a4aa..6491d9d 100644 --- a/src/camera/veyeimx287m.cpp +++ b/src/camera/veyeimx287m.cpp @@ -212,8 +212,8 @@ VeyeIMX287m::~VeyeIMX287m() } #ifdef RADXA_ZERO_3E - for (const auto buffer : buffers) { - if (munmap(buffer.mem[0], radxa_raw_img_size) < 0) { + for (const auto buffer : m_buffers) { + if (munmap(buffer.mem, radxa_raw_img_size) < 0) { DBG("Munmap failed!!."); } } @@ -500,17 +500,13 @@ bool VeyeIMX287m::initCam() return false; } - std::cout << "buffers requested" << std::endl; - if (rb.count < BUFFER_COUNT) { fprintf(stderr, "cannot set cam request buffers\n"); return false; } - std::cout << "buffers count is ok: " << rb.count << std::endl; - - buffers.resize(rb.count); + m_buffers.resize(rb.count); std::cout << "query buffers" << std::endl; @@ -529,7 +525,6 @@ bool VeyeIMX287m::initCam() buf.length = VIDEO_MAX_PLANES; buf.m.planes = planes; - std::cout << "run ioctl(VIDIOC_QUERYBUF) for buf #" << i << std::endl; ret = ioctl(m_cam_fd, VIDIOC_QUERYBUF, &buf); if (ret < 0) { @@ -539,23 +534,15 @@ bool VeyeIMX287m::initCam() return false; } - std::cout << "ioctl(VIDIOC_QUERYBUF) is ok: " << std::endl; - std::cout << "buffer.length: " << buf.length << std::endl; std::cout << "buffer.m.offset: " << buf.m.offset << std::endl; - - buffers[i].idx = i; + std::cout << "buffer.index: " << buf.index << " " << i << std::endl; const auto length = buf.m.planes[0].length; const auto offset = buf.m.planes[0].m.mem_offset; - buffers[i].mem[0] = mmap(0, - length, - PROT_READ | PROT_WRITE, - MAP_SHARED, - m_cam_fd, - offset); + m_buffers[i].mem = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, m_cam_fd, offset); - if (buffers[i].mem[0] == MAP_FAILED) { + if (m_buffers[i].mem == MAP_FAILED) { std::cerr << "mmap() failed: " << errno << " (" << strerror(errno) << ")" << std::endl; std::cerr << "length: " << length << std::endl; @@ -564,15 +551,17 @@ bool VeyeIMX287m::initCam() return false; } - m_videoBuffers[i] = (uint8_t *) buffers[i].mem[0]; + m_videoBuffers[i] = (uint8_t *) m_buffers[i].mem; - buffers[i].size[i] = length; - buffers[i].padding[i] = 0; + auto p1 = (Image::radxa_data_t *) m_videoBuffers[i]; + auto p2 = (Image::radxa_data_t *) m_buffers[i].mem; + if (p1 != p2) { + std::cout << "AAAAAAA: " << (void *) p1 << ' ' << (void *) p2 << std::endl; + } + m_buffers[i].size[i] = length; + m_buffers[i].padding[i] = 0; - printf("Buffer %u/%u mapped at address %p.\n", - buffers[i].idx, - i, - buffers[i].mem[0]); + printf("Buffer mapped at address %p.\n", m_buffers[i].mem); ret = ioctl(m_cam_fd, VIDIOC_QBUF, &buf); @@ -581,15 +570,11 @@ bool VeyeIMX287m::initCam() << strerror(errno) << ")" << std::endl; return false; } - - std::cout << "ioctl(VIDIOC_QBUF) is OK" << std::endl; } fflush(stdout); fflush(stderr); - std::cout << "imx287 cam initialized" << std::endl; - return true; } @@ -628,7 +613,15 @@ void VeyeIMX287m::calcFrameLoop(std::stop_token stopToken) { t.start(); + auto p1 = (void *) m_videoBuffers[bufferIdx]; + auto p2 = (void *) m_buffers[bufferIdx].mem; + + // if (p1 != p2) { + // std::cout << (void *) p1 << ' ' << (void *) p2 << std::endl; + // } + auto &src = *(Image::radxa_data_t *) m_videoBuffers[bufferIdx]; + // auto &src = *(Image::radxa_data_t *) buffers[bufferIdx].mem[0]; auto &dst = image.data; Image::copy(dst, src); diff --git a/src/camera/veyeimx287m.h b/src/camera/veyeimx287m.h index 03b7df9..7946d2f 100644 --- a/src/camera/veyeimx287m.h +++ b/src/camera/veyeimx287m.h @@ -101,14 +101,12 @@ private: struct buffer { - unsigned int idx{std::numeric_limits<unsigned int>::max()}; - unsigned int padding[VIDEO_MAX_PLANES]{ - std::numeric_limits<unsigned int>::max()}; - unsigned int size[VIDEO_MAX_PLANES]{ - std::numeric_limits<unsigned int>::max()}; - void *mem[VIDEO_MAX_PLANES]{nullptr}; + unsigned int padding[VIDEO_MAX_PLANES]{std::numeric_limits<unsigned int>::max()}; + unsigned int size[VIDEO_MAX_PLANES]{std::numeric_limits<unsigned int>::max()}; + // void *mem[VIDEO_MAX_PLANES]{nullptr}; + void *mem{nullptr}; }; - std::vector<buffer> buffers; + std::vector<buffer> m_buffers; // std::mutex m_queueMtx; std::mutex m_camMtx; |
