4#include <libavdevice/avdevice.h>
5#include <libavformat/avformat.h>
8#ifdef MAYAFLUX_PLATFORM_LINUX
10#include <linux/videodev2.h>
17#ifdef MAYAFLUX_PLATFORM_MACOS
18std::vector<CameraConfig> enumerate_macos_cameras();
21#ifndef MAYAFLUX_PLATFORM_MACOS
24 bool provides_video(
const AVDeviceInfo& info)
26 if (info.nb_media_types == 0)
28 return std::ranges::find(
29 std::span(info.media_types,
static_cast<size_t>(info.nb_media_types)),
31 != std::span(info.media_types,
static_cast<size_t>(info.nb_media_types)).end();
34#ifdef MAYAFLUX_PLATFORM_LINUX
35 bool can_capture(
const std::string& path)
37 const int fd = ::open(path.c_str(), O_RDONLY | O_NONBLOCK);
41 v4l2_capability capability {};
42 const bool queried = ::ioctl(fd, VIDIOC_QUERYCAP, &capability) == 0;
47 const uint32_t caps = (capability.capabilities & V4L2_CAP_DEVICE_CAPS)
48 ? capability.device_caps
49 : capability.capabilities;
50 return (caps & V4L2_CAP_VIDEO_CAPTURE) != 0;
59#ifdef MAYAFLUX_PLATFORM_MACOS
60 return enumerate_macos_cameras();
62 std::vector<CameraConfig> configs;
64 avdevice_register_all();
65 const AVInputFormat*
format = av_find_input_format(std::string(CAMERA_FORMAT).c_str());
66 AVDeviceInfoList* list =
nullptr;
67 if (!
format || avdevice_list_input_sources(
format,
nullptr,
nullptr, &list) < 0)
70 for (
int i = 0; i < list->nb_devices; ++i) {
71 const AVDeviceInfo& info = *list->devices[i];
72 if (!provides_video(info))
77 config.
display_name = info.device_description ? info.device_description :
"";
78#ifdef MAYAFLUX_PLATFORM_WINDOWS
81#ifdef MAYAFLUX_PLATFORM_LINUX
85 configs.push_back(std::move(config));
87 avdevice_free_list_devices(&list);
std::vector< CameraConfig > enumerate_configs() const override
Discover ready-to-open camera configurations without starting capture.
std::string device_name
Platform device string.
std::string display_name
Human-readable device name for a chooser.
Configuration for opening a camera device via FFmpeg.