summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-09-01 21:00:24 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-09-07 19:18:13 +0300
commit6d98fe5b683a38748d708c810d52d5f96e312bda (patch)
tree9cc09d873e9caafd22944125ed60f18621ae5605
parent81a38f43738440490e9fcc1ce96b22783f541942 (diff)
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 <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
-rw-r--r--include/libcamera/internal/v4l2_videodevice.h1
-rw-r--r--src/libcamera/v4l2_videodevice.cpp28
2 files changed, 21 insertions, 8 deletions
diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
index 087ad067..efe34d47 100644
--- a/include/libcamera/internal/v4l2_videodevice.h
+++ b/include/libcamera/internal/v4l2_videodevice.h
@@ -241,6 +241,7 @@ private:
V4L2Capability caps_;
V4L2DeviceFormat format_;
+ const PixelFormatInfo *formatInfo_;
enum v4l2_buf_type bufferType_;
enum v4l2_memory memoryType_;
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<FrameBuffer> 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;
}
}