libcamera: include/libcamera/internal/v4l2_device.h Source File

libcamera v0.7.0 Supporting cameras in Linux since 2019

Loading...
Searching...
No Matches
v4l2_device.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: LGPL-2.1-or-later */
2/*
3 * Copyright (C) 2019, Google Inc.
4 *
5 * Common base for V4L2 video devices and subdevices
6 */
7
8#pragma once
9
10#include <map>
11#include <memory>
12#include <optional>
13#include <stdint.h>
14#include <vector>
15
16#include <linux/videodev2.h>
17
18#include <libcamera/base/log.h>
19#include <libcamera/base/signal.h>
20#include <libcamera/base/span.h>
21#include <libcamera/base/unique_fd.h>
22
23#include <libcamera/color_space.h>
24#include <libcamera/controls.h>
25
26#include "libcamera/internal/formats.h"
27#include "libcamera/internal/v4l2_request.h"
28
29namespace libcamera {
30
31class EventNotifier;
32
33 class V4L2Device : protected Loggable
34{
35public:
36 void close();
37 bool isOpen() const { return fd_.isValid(); }
38
39 const ControlInfoMap &controls() const { return controls_; }
40
41 ControlList getControls(Span<const uint32_t> ids, const V4L2Request *request = nullptr);
42 int setControls(ControlList *ctrls, const V4L2Request *request = nullptr);
43
44 const struct v4l2_query_ext_ctrl *controlInfo(uint32_t id) const;
45
46 const std::string &deviceNode() const { return deviceNode_; }
47 std::string devicePath() const;
48
49 bool supportsFrameStartEvent();
50 int setFrameStartEnabled(bool enable);
51 Signal<uint32_t> frameStart;
52
53 void updateControlInfo();
54
55protected:
56 V4L2Device(const std::string &deviceNode);
57 ~V4L2Device();
58
59 int open(unsigned int flags);
60 int setFd(UniqueFD fd);
61
62 int ioctl(unsigned long request, void *argp);
63
64 int fd() const { return fd_.get(); }
65
66 template<typename T>
67 static std::optional<ColorSpace> toColorSpace(const T &v4l2Format,
68 PixelFormatInfo::ColourEncoding colourEncoding);
69
70 template<typename T>
71 static int fromColorSpace(const std::optional<ColorSpace> &colorSpace, T &v4l2Format);
72
73private:
74 static ControlType v4l2CtrlType(uint32_t ctrlType);
75 static std::unique_ptr<ControlId> v4l2ControlId(const v4l2_query_ext_ctrl &ctrl);
76 std::optional<ControlInfo> v4l2ControlInfo(const v4l2_query_ext_ctrl &ctrl);
77 std::optional<ControlInfo> v4l2MenuControlInfo(const v4l2_query_ext_ctrl &ctrl);
78
79 void listControls();
80 void updateControls(ControlList *ctrls,
81 Span<const v4l2_ext_control> v4l2Ctrls);
82
83 void eventAvailable();
84
85 std::map<unsigned int, struct v4l2_query_ext_ctrl> controlInfo_;
86 std::vector<std::unique_ptr<ControlId>> controlIds_;
87 ControlIdMap controlIdMap_;
88 ControlInfoMap controls_;
89 std::string deviceNode_;
90 UniqueFD fd_;
91
92 EventNotifier *fdEventNotifier_;
93 bool frameStartEnabled_;
94};
95
96} /* namespace libcamera */
libcamera::ControlInfoMap
A map of ControlId to ControlInfo.
Definition controls.h:365
libcamera::ControlList
Associate a list of ControlId with their values for an object.
Definition controls.h:409
libcamera::EventNotifier
Notify of activity on a file descriptor.
Definition event_notifier.h:20
libcamera::Loggable
Base class to support log message extensions.
Definition log.h:92
libcamera::PixelFormatInfo::ColourEncoding
ColourEncoding
The colour encoding type.
Definition formats.h:23
libcamera::Signal
Generic signal and slot communication mechanism.
Definition signal.h:39
libcamera::UniqueFD
unique_ptr-like wrapper for a file descriptor
Definition unique_fd.h:17
libcamera::V4L2Device::~V4L2Device
~V4L2Device()
Destroy a V4L2Device.
Definition v4l2_device.cpp:68
libcamera::V4L2Device::frameStart
Signal< uint32_t > frameStart
A Signal emitted when capture of a frame has started.
Definition v4l2_device.h:51
libcamera::V4L2Device::setFrameStartEnabled
int setFrameStartEnabled(bool enable)
Enable or disable frame start event notification.
Definition v4l2_device.cpp:504
libcamera::V4L2Device::ioctl
int ioctl(unsigned long request, void *argp)
Perform an IOCTL system call on the device node.
Definition v4l2_device.cpp:535
libcamera::V4L2Device::fromColorSpace
static int fromColorSpace(const std::optional< ColorSpace > &colorSpace, T &v4l2Format)
Fill in the color space fields of a V4L2 format from a ColorSpace.
Definition v4l2_device.cpp:1033
libcamera::V4L2Device::controls
const ControlInfoMap & controls() const
Retrieve the supported V4L2 controls and their information.
Definition v4l2_device.h:39
libcamera::V4L2Device::close
void close()
Close the device node.
Definition v4l2_device.cpp:140
libcamera::V4L2Device::updateControlInfo
void updateControlInfo()
Update the information for all device controls.
Definition v4l2_device.cpp:780
libcamera::V4L2Device::open
int open(unsigned int flags)
Open a V4L2 device node.
Definition v4l2_device.cpp:81
libcamera::V4L2Device::supportsFrameStartEvent
bool supportsFrameStartEvent()
Check if frame start event is supported.
Definition v4l2_device.cpp:482
libcamera::V4L2Device::devicePath
std::string devicePath() const
Retrieve the device path in sysfs.
Definition v4l2_device.cpp:456
libcamera::V4L2Device::deviceNode
const std::string & deviceNode() const
Retrieve the device node path.
Definition v4l2_device.h:46
libcamera::V4L2Device::getControls
ControlList getControls(Span< const uint32_t > ids, const V4L2Request *request=nullptr)
Read controls from the device.
Definition v4l2_device.cpp:180
libcamera::V4L2Device::fd
int fd() const
Retrieve the V4L2 device file descriptor.
Definition v4l2_device.h:64
libcamera::V4L2Device::setFd
int setFd(UniqueFD fd)
Set the file descriptor of a V4L2 device.
Definition v4l2_device.cpp:119
libcamera::V4L2Device::toColorSpace
static std::optional< ColorSpace > toColorSpace(const T &v4l2Format, PixelFormatInfo::ColourEncoding colourEncoding)
Convert the color space fields in a V4L2 format to a ColorSpace.
Definition v4l2_device.cpp:954
libcamera::V4L2Device::controlInfo
const struct v4l2_query_ext_ctrl * controlInfo(uint32_t id) const
Retrieve the v4l2_query_ext_ctrl information for the given control.
Definition v4l2_device.cpp:436
libcamera::V4L2Device::V4L2Device
V4L2Device(const std::string &deviceNode)
Construct a V4L2Device.
Definition v4l2_device.cpp:59
libcamera::V4L2Device::isOpen
bool isOpen() const
Check if the V4L2 device node is open.
Definition v4l2_device.h:37
libcamera::V4L2Device::setControls
int setControls(ControlList *ctrls, const V4L2Request *request=nullptr)
Write controls to the device.
Definition v4l2_device.cpp:310
libcamera::V4L2Request
V4L2Request object and API.
Definition v4l2_request.h:22
color_space.h
Class and enums to represent color spaces.
controls.h
Framework to manage controls related to an object.
formats.h
Types and helper functions to handle libcamera image formats.
log.h
Logging infrastructure.
libcamera
Top-level libcamera namespace.
Definition backtrace.h:17
libcamera::ControlType
ControlType
Define the data type of a Control.
Definition controls.h:29
libcamera::ControlIdMap
std::unordered_map< unsigned int, const ControlId * > ControlIdMap
A map of numerical control ID to ControlId.
Definition controls.h:362
signal.h
Signal & slot implementation.
unique_fd.h
File descriptor wrapper that owns a file descriptor.
v4l2_request.h
V4L2 Request.