1 #include "qtcamscanner.h"
2 #include "qtcamconfig.h"
7 #include <linux/videodev2.h>
12 class QtCamScannerPrivate {
18 QList<QPair<QString, QVariant> > devices;
21 void QtCamScannerPrivate::scanEnum() {
22 // Too bad there's no way to get the values of an enum without creating the element :(
23 GstElement *elem = gst_element_factory_make(conf->videoSource().toAscii(), NULL);
28 GParamSpec *spec = g_object_class_find_property(G_OBJECT_GET_CLASS(elem),
29 conf->deviceScannerProperty().toAscii());
31 gst_object_unref(elem);
35 if (!G_IS_PARAM_SPEC_ENUM(spec)) {
36 gst_object_unref(elem);
40 GParamSpecEnum *e = G_PARAM_SPEC_ENUM(spec);
41 // First add the default:
42 devices << qMakePair<QString, QVariant>(e->enum_class->values[e->default_value].value_name,
43 QByteArray::number(e->default_value));
45 for (int x = e->enum_class->minimum; x <= e->enum_class->maximum; x++) {
46 if (x != e->default_value) {
47 devices << qMakePair<QString, QVariant>(e->enum_class->values[x].value_name,
48 QByteArray::number(x));
52 gst_object_unref(elem);
55 void QtCamScannerPrivate::scanV4l2() {
56 QDir d("/dev/", "video?", QDir::Name | QDir::IgnoreCase, QDir::System);
58 QStringList entries = d.entryList();
60 foreach (const QString& dv, entries) {
61 QString dev = d.absoluteFilePath(dv);
62 struct v4l2_capability cap;
63 memset(&cap, 0x0, sizeof(cap));
65 int fd = open(dev.toLocal8Bit().data(), O_RDONLY);
70 if (ioctl(fd, VIDIOC_QUERYCAP, &cap) != 0) {
77 if (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) {
78 devices << qMakePair<QString, QVariant>((char *)cap.card, dev.toLocal8Bit());
83 QtCamScanner::QtCamScanner(QtCamConfig *conf, QObject *parent) :
84 QObject(parent), d_ptr(new QtCamScannerPrivate) {
89 QtCamScanner::~QtCamScanner() {
90 delete d_ptr; d_ptr = 0;
93 void QtCamScanner::refresh() {
94 d_ptr->devices.clear();
96 if (d_ptr->conf->deviceScannerType() == SCANNER_TYPE_ENUM) {
104 QList<QPair<QString, QVariant> > QtCamScanner::devices() const {
105 return d_ptr->devices;