/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* * Copyright (C) 2018-2019, Google Inc. * * device_enumerator_udev.h - udev-based device enumerator */ #ifndef __LIBCAMERA_DEVICE_ENUMERATOR_UDEV_H__ #define __LIBCAMERA_DEVICE_ENUMERATOR_UDEV_H__ #include #include #include #include #include #include #include "libcamera/internal/device_enumerator.h" struct udev; struct udev_device; struct udev_monitor; namespace libcamera { class EventNotifier; class MediaDevice; class MediaEntity; class DeviceEnumeratorUdev : public DeviceEnumerator { public: DeviceEnumeratorUdev(); ~DeviceEnumeratorUdev(); int init() final; int enumerate() final; private: using DependencyMap = std::map>; struct MediaDeviceDeps { MediaDeviceDeps(std::unique_ptr &&media, DependencyMap &&deps) : media_(std::move(media)), deps_(std::move(deps)) { } bool operator==(const MediaDeviceDeps &other) const { return media_ == other.media_; } std::unique_ptr media_; DependencyMap deps_; }; int addUdevDevice(struct udev_device *dev); int populateMediaDevice(MediaDevice *media, DependencyMap *deps); std::string lookupDeviceNode(dev_t devnum); int addV4L2Device(dev_t devnum); void udevNotify(EventNotifier *notifier); struct udev *udev_; struct udev_monitor *monitor_; EventNotifier *notifier_; std::set orphans_; std::list pending_; std::map devMap_; }; } /* namespace libcamera */ #endif /* __LIBCAMERA_DEVICE_ENUMERATOR_UDEV_H__ */