From patchwork Fri Jun 19 05:41:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 4081 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CD8A1609C3 for ; Fri, 19 Jun 2020 07:41:37 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ACHmaiAT"; dkim-atps=neutral Received: from jade.flets-east.jp (unknown [IPv6:2400:4051:61:600:e972:d773:e99a:4f79]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 44549556; Fri, 19 Jun 2020 07:41:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1592545297; bh=sGpECNNuvQhy36csLwcUlYnqDWMX3dqit3oJ1LHQneg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ACHmaiATHk6IIehPUNTJfTVvdvG1a61hlnndxL3s6rBBpFGNXJMEQhJuRM0ZXFb6q 4i89No2Db96/AqJV7uAbrZE6fo01Cm4tIZxiYzxt22BTzM3jn7Zv+HMOiyFGC2Eg25 zVth6mg4Lq4gCfjBpInV3Ehl7XzfImb0UY/0myuA= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Fri, 19 Jun 2020 14:41:07 +0900 Message-Id: <20200619054123.19052-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619054123.19052-1-paul.elder@ideasonboard.com> References: <20200619054123.19052-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 01/17] v4l2: v4l2_camera_file: Add V4L2CameraFile to model the opened camera file X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jun 2020 05:41:38 -0000 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 Reviewed-by: Laurent Pinchart --- New in v2 --- src/v4l2/meson.build | 1 + src/v4l2/v4l2_camera_file.cpp | 45 +++++++++++++++++++++++++++++++++++ src/v4l2/v4l2_camera_file.h | 35 +++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/v4l2/v4l2_camera_file.cpp create mode 100644 src/v4l2/v4l2_camera_file.h diff --git a/src/v4l2/meson.build b/src/v4l2/meson.build index f2e4aaf..e3838f0 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 0000000..8916729 --- /dev/null +++ b/src/v4l2/v4l2_camera_file.cpp @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * v4l2_camera_file.h - V4L2 compatibility camera file descriptor information + */ + +#include "v4l2_camera_file.h" + +#include + +#include "libcamera/internal/log.h" + +#include "v4l2_camera_proxy.h" + +using namespace libcamera; + +LOG_DECLARE_CATEGORY(V4L2Compat); + +V4L2CameraFile::V4L2CameraFile(int efd, bool nonBlocking, V4L2CameraProxy *proxy) + : priority_(V4L2_PRIORITY_DEFAULT), proxy_(proxy), + nonBlocking_(nonBlocking), efd_(efd) +{ + proxy_->open(nonBlocking); +} + +V4L2CameraFile::~V4L2CameraFile() +{ + proxy_->close(); +} + +V4L2CameraProxy *V4L2CameraFile::proxy() +{ + return proxy_; +} + +bool V4L2CameraFile::nonBlocking() +{ + return nonBlocking_; +} + +int V4L2CameraFile::efd() +{ + return efd_; +} diff --git a/src/v4l2/v4l2_camera_file.h b/src/v4l2/v4l2_camera_file.h new file mode 100644 index 0000000..cf282e9 --- /dev/null +++ b/src/v4l2/v4l2_camera_file.h @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * v4l2_camera_file.h - V4L2 compatibility camera file descriptor information + */ + +#ifndef __V4L2_CAMERA_FILE_H__ +#define __V4L2_CAMERA_FILE_H__ + +#include + +class V4L2CameraProxy; + +class V4L2CameraFile +{ +public: + V4L2CameraFile(int efd, bool nonBlocking, V4L2CameraProxy *proxy); + ~V4L2CameraFile(); + + V4L2CameraProxy *proxy(); + + bool nonBlocking(); + int efd(); + + enum v4l2_priority priority_; + +private: + V4L2CameraProxy *proxy_; + + bool nonBlocking_; + int efd_; +}; + +#endif /* __V4L2_CAMERA_FILE_H__ */