From 6d98fe5b683a38748d708c810d52d5f96e312bda Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 1 Sep 2021 21:00:24 +0300 Subject: libcamera: v4l2_videodevice: Cache PixelFormatInfo Cache the PixelFormatInfo instead of looking it up in every call to createBuffer(). This prepares for usage of the info in queueBuffer(), to avoid a looking every time a buffer is queued. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham Reviewed-by: Hirokazu Honda --- src/libcamera/v4l2_videodevice.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 1c4e6fbf..1483181a 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -482,8 +482,8 @@ const std::string V4L2DeviceFormat::toString() const * \param[in] deviceNode The file-system path to the video device node */ V4L2VideoDevice::V4L2VideoDevice(const std::string &deviceNode) - : V4L2Device(deviceNode), cache_(nullptr), fdBufferNotifier_(nullptr), - streaming_(false) + : V4L2Device(deviceNode), formatInfo_(nullptr), cache_(nullptr), + fdBufferNotifier_(nullptr), streaming_(false) { /* * We default to an MMAP based CAPTURE video device, however this will @@ -586,6 +586,8 @@ int V4L2VideoDevice::open() return ret; } + formatInfo_ = &PixelFormatInfo::info(format_.fourcc); + return 0; } @@ -681,6 +683,8 @@ int V4L2VideoDevice::open(int handle, enum v4l2_buf_type type) return ret; } + formatInfo_ = &PixelFormatInfo::info(format_.fourcc); + return 0; } @@ -695,6 +699,8 @@ void V4L2VideoDevice::close() releaseBuffers(); delete fdBufferNotifier_; + formatInfo_ = nullptr; + V4L2Device::close(); } @@ -787,6 +793,8 @@ int V4L2VideoDevice::setFormat(V4L2DeviceFormat *format) return ret; format_ = *format; + formatInfo_ = &PixelFormatInfo::info(format_.fourcc); + return 0; } @@ -1325,19 +1333,23 @@ std::unique_ptr V4L2VideoDevice::createBuffer(unsigned int index) planes.push_back(std::move(plane)); } - const auto &info = PixelFormatInfo::info(format_.fourcc); - if (info.isValid() && info.numPlanes() != numPlanes) { + /* + * The format info is not guaranteed to be valid, as there are no + * PixelFormatInfo for metadata formats, so check it first. + */ + if (formatInfo_->isValid() && formatInfo_->numPlanes() != numPlanes) { ASSERT(numPlanes == 1u); - const size_t numColorPlanes = info.numPlanes(); - planes.resize(numColorPlanes); + + planes.resize(formatInfo_->numPlanes()); const FileDescriptor &fd = planes[0].fd; size_t offset = 0; - for (size_t i = 0; i < numColorPlanes; ++i) { + + for (size_t i = 0; i < planes.size(); ++i) { planes[i].fd = fd; planes[i].offset = offset; /* \todo Take the V4L2 stride into account */ - planes[i].length = info.planeSize(format_.size, i); + planes[i].length = formatInfo_->planeSize(format_.size, i); offset += planes[i].length; } } -- cgit v1.2.1