From 81e004e0ffa41ad595c65d9ebad2a1fdf729117b Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Fri, 24 May 2019 08:47:51 +0200 Subject: libcamera: v4l2_device: Add support for META_OUTPUT Add support for output devices that expose the META_OUTPUT capabilities. Signed-off-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/libcamera/include/v4l2_device.h | 10 ++++++++-- src/libcamera/v4l2_device.cpp | 9 +++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h index 2e7bd1e7..cecafa15 100644 --- a/src/libcamera/include/v4l2_device.h +++ b/src/libcamera/include/v4l2_device.h @@ -59,7 +59,8 @@ struct V4L2Capability final : v4l2_capability { bool isOutput() const { return device_caps() & (V4L2_CAP_VIDEO_OUTPUT | - V4L2_CAP_VIDEO_OUTPUT_MPLANE); + V4L2_CAP_VIDEO_OUTPUT_MPLANE | + V4L2_CAP_META_OUTPUT); } bool isVideo() const { @@ -70,7 +71,8 @@ struct V4L2Capability final : v4l2_capability { } bool isMeta() const { - return device_caps() & V4L2_CAP_META_CAPTURE; + return device_caps() & (V4L2_CAP_META_CAPTURE | + V4L2_CAP_META_OUTPUT); } bool isVideoCapture() const { @@ -84,6 +86,10 @@ struct V4L2Capability final : v4l2_capability { { return isMeta() && isCapture(); } + bool isMetaOutput() const + { + return isMeta() && isOutput(); + } bool hasStreaming() const { return device_caps() & V4L2_CAP_STREAMING; diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp index 8366ffc4..e42f6ef0 100644 --- a/src/libcamera/v4l2_device.cpp +++ b/src/libcamera/v4l2_device.cpp @@ -116,6 +116,12 @@ LOG_DEFINE_CATEGORY(V4L2) * \return True if the device can capture image meta-data */ +/** + * \fn V4L2Capability::isMetaOutput() + * \brief Identify if the device outputs image meta-data + * \return True if the device can output image meta-data + */ + /** * \fn V4L2Capability::hasStreaming() * \brief Determine if the device can perform Streaming I/O @@ -348,6 +354,9 @@ int V4L2Device::open() } else if (caps_.isMetaCapture()) { fdEvent_ = new EventNotifier(fd_, EventNotifier::Read); bufferType_ = V4L2_BUF_TYPE_META_CAPTURE; + } else if (caps_.isMetaOutput()) { + fdEvent_ = new EventNotifier(fd_, EventNotifier::Write); + bufferType_ = V4L2_BUF_TYPE_META_OUTPUT; } else { LOG(V4L2, Error) << "Device is not a supported type"; return -EINVAL; -- cgit v1.2.1