[libcamera-devel] [PATCH v2 01/17] v4l2: v4l2_camera_file: Add V4L2CameraFile to model the opened camera file

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat Jun 20 01:30:50 CEST 2020


Hi Paul,

Thank you for the patch.

On Fri, Jun 19, 2020 at 02:41:07PM +0900, Paul Elder wrote:
> 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 at ideasonboard.com>
> 
> ---
> 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.

Happy new year :-)

> + *
> + * v4l2_camera_file.h - V4L2 compatibility camera file descriptor information

s/descriptor // as this is the file, not the file descriptor ?

> + */
> +
> +#include "v4l2_camera_file.h"
> +
> +#include <linux/videodev2.h>
> +
> +#include "libcamera/internal/log.h"
> +
> +#include "v4l2_camera_proxy.h"
> +
> +using namespace libcamera;
> +
> +LOG_DECLARE_CATEGORY(V4L2Compat);

You don't use LOG() here, so you can drop this, as well as the #include.

> +
> +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.

2020 here too.

> + *
> + * v4l2_camera_file.h - V4L2 compatibility camera file descriptor 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();
> +
> +	bool nonBlocking();
> +	int efd();

You can make those three methods const. I would also inline them as
they're very simple.

> +
> +	enum v4l2_priority priority_;

This is the only public field, it stands out a little bit. Would the
following be better ?

	enum v4l2_priority priority() const { return priority_; }
	void setPriority(enum v4l2_priority priority) { priority_ = priority; }

The compiler will optimize all that.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +
> +private:
> +	V4L2CameraProxy *proxy_;
> +
> +	bool nonBlocking_;
> +	int efd_;
> +};
> +
> +#endif /* __V4L2_CAMERA_FILE_H__ */

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list