Browse Source

List video devices using v4l2 directly, not ffmpeg

Turns out, FFmpeg is annoyingly unreliable when it comes to this. It ignores uvcvideo devices for example
pull/2513/head
tux3 10 years ago
parent
commit
71e26fb15b
No known key found for this signature in database
GPG Key ID: 7E086DD661263264
  1. 31
      src/platform/camera/v4l2.cpp
  2. 1
      src/platform/camera/v4l2.h
  3. 4
      src/video/cameradevice.cpp

31
src/platform/camera/v4l2.cpp

@ -27,6 +27,7 @@ @@ -27,6 +27,7 @@
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <dirent.h>
/**
* Most of this file is adapted from libavdevice's v4l2.c,
@ -135,3 +136,33 @@ QVector<VideoMode> v4l2::getDeviceModes(QString devName) @@ -135,3 +136,33 @@ QVector<VideoMode> v4l2::getDeviceModes(QString devName)
return modes;
}
QVector<QPair<QString, QString>> v4l2::getDeviceList()
{
QVector<QPair<QString, QString>> devices;
QVector<QString> deviceFiles;
DIR *dir = opendir("/dev");
if (!dir)
return devices;
dirent* e;
while ((e = readdir(dir)))
if (!strncmp(e->d_name, "video", 5) || !strncmp(e->d_name, "vbi", 3))
deviceFiles += QString("/dev/") + e->d_name;
closedir(dir);
for (QString file : deviceFiles)
{
int fd = open(file.toStdString().c_str(), O_RDWR);
if (fd < 0)
continue;
v4l2_capability caps;
ioctl(fd, VIDIOC_QUERYCAP, &caps);
close(fd);
devices += {file, (const char*)caps.card};
}
return devices;
}

1
src/platform/camera/v4l2.h

@ -31,6 +31,7 @@ @@ -31,6 +31,7 @@
namespace v4l2
{
QVector<VideoMode> getDeviceModes(QString devName);
QVector<QPair<QString, QString>> getDeviceList();
}
#endif // V4L2_H

4
src/video/cameradevice.cpp

@ -263,6 +263,10 @@ QVector<QPair<QString, QString>> CameraDevice::getDeviceList() @@ -263,6 +263,10 @@ QVector<QPair<QString, QString>> CameraDevice::getDeviceList()
#ifdef Q_OS_WIN
else if (iformat->name == QString("dshow"))
devices += DirectShow::getDeviceList();
#endif
#ifdef Q_OS_LINUX
else if (iformat->name == QString("video4linux2,v4l2"))
devices += v4l2::getDeviceList();
#endif
else
devices += getRawDeviceListGeneric();

Loading…
Cancel
Save