summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Elder <paul.elder@ideasonboard.com>2020-06-19 13:02:19 +0900
committerPaul Elder <paul.elder@ideasonboard.com>2020-06-25 23:41:15 +0900
commitd37ec82515fda4ae014d904e6d50cd0ed0ada850 (patch)
tree41e9dbb16c3ef35126db5c9b79e4bce4ea757ac9
parent58732e4b49583e0b035980d71e8d15e76bbaf77b (diff)
v4l2: v4l2_camera_file: Add V4L2CameraFile to model the opened camera file
With relation to opening files, the kernel has three objects related to files: - inodes, that represent files on disk - file objects, that are allocated at open() time and store all data related to the open file - file descriptors, that are integers that map to a file In the V4L2 compatibility layer, V4L2CameraProxy, which wraps a single libcamera camera via V4L2Camera, is more or less equivalent to the inode. We also already have file descriptors (that are really eventfds) that mirror the file descriptors. Here we create a V4L2CameraFile to model the file objects, to contain information related to the open file, namely if the file has been opened as non-blocking, and the V4L2 priority (to support VIDIOC_G/S_PRIORITY later on). This new class allows us to more cleanly support multiple open later on, since we can move out of V4L2CameraProxy the handling of mapping the fd to the open file information. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/v4l2/meson.build1
-rw-r--r--src/v4l2/v4l2_camera_file.cpp26
-rw-r--r--src/v4l2/v4l2_camera_file.h37
3 files changed, 64 insertions, 0 deletions
diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build
index f2e4aaf2..e3838f0b 100644
--- a/src/v4l2/meson.build
+++ b/src/v4l2/meson.build
@@ -2,6 +2,7 @@
v4l2_compat_sources = files([
'v4l2_camera.cpp',
+ 'v4l2_camera_file.cpp',
'v4l2_camera_proxy.cpp',
'v4l2_compat.cpp',
'v4l2_compat_manager.cpp',
diff --git a/src/v4l2/v4l2_camera_file.cpp b/src/v4l2/v4l2_camera_file.cpp
new file mode 100644
index 00000000..d3232ab2
--- /dev/null
+++ b/src/v4l2/v4l2_camera_file.cpp
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2020, Google Inc.
+ *
+ * v4l2_camera_file.h - V4L2 compatibility camera file information
+ */
+
+#include "v4l2_camera_file.h"
+
+#include <linux/videodev2.h>
+
+#include "v4l2_camera_proxy.h"
+
+using namespace libcamera;
+
+V4L2CameraFile::V4L2CameraFile(int efd, bool nonBlocking, V4L2CameraProxy *proxy)
+ : proxy_(proxy), nonBlocking_(nonBlocking), efd_(efd),
+ priority_(V4L2_PRIORITY_DEFAULT)
+{
+ proxy_->open(nonBlocking);
+}
+
+V4L2CameraFile::~V4L2CameraFile()
+{
+ proxy_->close();
+}
diff --git a/src/v4l2/v4l2_camera_file.h b/src/v4l2/v4l2_camera_file.h
new file mode 100644
index 00000000..8f4670a0
--- /dev/null
+++ b/src/v4l2/v4l2_camera_file.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2020, Google Inc.
+ *
+ * v4l2_camera_file.h - V4L2 compatibility camera file information
+ */
+
+#ifndef __V4L2_CAMERA_FILE_H__
+#define __V4L2_CAMERA_FILE_H__
+
+#include <linux/videodev2.h>
+
+class V4L2CameraProxy;
+
+class V4L2CameraFile
+{
+public:
+ V4L2CameraFile(int efd, bool nonBlocking, V4L2CameraProxy *proxy);
+ ~V4L2CameraFile();
+
+ V4L2CameraProxy *proxy() const { return proxy_; }
+
+ bool nonBlocking() const { return nonBlocking_; }
+ int efd() const { return efd_; }
+
+ enum v4l2_priority priority() const { return priority_; }
+ void setPriority(enum v4l2_priority priority) { priority_ = priority; }
+
+private:
+ V4L2CameraProxy *proxy_;
+
+ bool nonBlocking_;
+ int efd_;
+ enum v4l2_priority priority_;
+};
+
+#endif /* __V4L2_CAMERA_FILE_H__ */