/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2019, Google Inc. * * v4l2_compat_manager.h - V4L2 compatibility manager */ #pragma once #include <fcntl.h> #include <map> #include <memory> #include <sys/types.h> #include <vector> #include <libcamera/camera_manager.h> #include "v4l2_camera_proxy.h" class V4L2CompatManager { public: struct FileOperations { using openat_func_t = int (*)(int dirfd, const char *path, int oflag, ...); using dup_func_t = int (*)(int oldfd); using close_func_t = int (*)(int fd); using ioctl_func_t = int (*)(int fd, unsigned long request, ...); using mmap_func_t = void *(*)(void *addr, size_t length, int prot, int flags, int fd, off64_t offset); using munmap_func_t = int (*)(void *addr, size_t length); openat_func_t openat; dup_func_t dup; close_func_t close; ioctl_func_t ioctl; mmap_func_t mmap; munmap_func_t munmap; }; static V4L2CompatManager *instance(); const FileOperations &fops() const { return fops_; } int openat(int dirfd, const char *path, int oflag, mode_t mode); int dup(int oldfd); int close(int fd); void *mmap(void *addr, size_t length, int prot, int flags, int fd, off64_t offset); int munmap(void *addr, size_t length); int ioctl(int fd, unsigned long request, void *arg); private: V4L2CompatManager(); ~V4L2CompatManager(); int start(); int getCameraIndex(int fd); std::shared_ptr<V4L2CameraFile> cameraFile(int fd); FileOperations fops_; libcamera::CameraManager *cm_; std::vector<std::unique_ptr<V4L2CameraProxy>> proxies_; std::map<int, std::shared_ptr<V4L2CameraFile>> files_; std::map<void *, V4L2CameraProxy *> mmaps_; };