Skip to content
This repository was archived by the owner on Mar 15, 2021. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 75 additions & 4 deletions src/v4l2sinkproperties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@
#include <obs-frontend-api.h>
#include <util/config-file.h>

#include <linux/videodev2.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <QDir>

V4l2sinkProperties::V4l2sinkProperties(QWidget *parent) :
QDialog(parent),
ui(new Ui::V4l2sinkProperties)
Expand All @@ -35,9 +41,17 @@ V4l2sinkProperties::V4l2sinkProperties(QWidget *parent) :
const char* device = config_get_string(config, "V4l2sink", "DevicePath");
const char* format = config_get_string(config, "V4l2sink", "Format");

init_devices(device);

ui->checkBox_auto->setChecked(autostart);
ui->lineEdit_dev->setText(device);


QMapIterator<QString, QString> i(devices);
while (i.hasNext()) {
i.next();
ui->comboBox_device->addItem(i.value(), i.key());
}
ui->comboBox_device->setCurrentIndex(ui->comboBox_device->findData(device));

ui->comboBox_format->addItem(V4L2SINK_YUV420, V4L2SINK_YUV420);
ui->comboBox_format->addItem(V4L2SINK_NV12, V4L2SINK_NV12);
ui->comboBox_format->addItem(V4L2SINK_YUY2, V4L2SINK_YUY2);
Expand All @@ -60,6 +74,63 @@ V4l2sinkProperties::~V4l2sinkProperties()
delete ui;
}

void V4l2sinkProperties::init_devices(const char* device)
{
QDir dir("/sys/class/video4linux");
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
dir.setSorting(QDir::Name);
QFileInfoList list = dir.entryInfoList();

for (int i = 0; i < list.size(); ++i) {
int fd;
uint32_t caps;
struct v4l2_capability video_cap;

QFileInfo fileInfo = list.at(i);
QString fileName = fileInfo.fileName();

if (!fileName.startsWith("video"))
continue;
QString devPath = QString("/dev/%1").arg(fileName);

if ((fd = ::open(devPath.toLatin1(), O_RDWR | O_NONBLOCK)) == -1) {
continue;
}

if (::ioctl(fd, VIDIOC_QUERYCAP, &video_cap) == -1) {
::close(fd);
continue;
}

if (video_cap.capabilities & V4L2_CAP_DEVICE_CAPS) {
caps = video_cap.device_caps;
} else {
caps = video_cap.capabilities;
}

if (!(caps & V4L2_CAP_VIDEO_CAPTURE)) {
::close(fd);
continue;
}

if (strcmp((char*) video_cap.driver, "v4l2 loopback") != 0) {
::close(fd);
continue;
}

/* make sure device names are unique */
char dev_name[68];
sprintf(dev_name, "%s (%s)", video_cap.card, video_cap.bus_info);
devices.insert(devPath, QString::fromLocal8Bit(dev_name));
::close(fd);
}

QString cur_device = QString::fromLocal8Bit(device);
if (!devices.contains(cur_device)) {
devices.remove(cur_device);
}
}

void V4l2sinkProperties::closeEvent(QCloseEvent *event)
{
saveSettings();
Expand All @@ -68,7 +139,7 @@ void V4l2sinkProperties::closeEvent(QCloseEvent *event)
void V4l2sinkProperties::saveSettings()
{
bool autostart = ui->checkBox_auto->isChecked();
QByteArray ba_dev_name = ui->lineEdit_dev->text().toUtf8();
QByteArray ba_dev_name = ui->comboBox_device->currentData().toString().toUtf8();
QByteArray ba_format = ui->comboBox_format->currentData().toString().
toUtf8();
config_t* config = obs_frontend_get_global_config();
Expand All @@ -85,7 +156,7 @@ void V4l2sinkProperties::onStart()
{
QByteArray ba_format = ui->comboBox_format->currentData().toString()
.toUtf8();
QByteArray ba_dev_name = ui->lineEdit_dev->text().toUtf8();
QByteArray ba_dev_name = ui->comboBox_device->currentData().toString().toUtf8();
signal_handler_t *handler = v4l2sink_get_signal_handler();
signal_handler_connect(handler, "v4l2close", output_stopped , this);
enableStart(false);
Expand Down
4 changes: 4 additions & 0 deletions src/v4l2sinkproperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#define V4L2SINKPROPERTIES_H

#include <QDialog>
#include <QMap>
#include <QString>
#include "v4l2sink.h"

#define V4L2SINK_NV12 "NV12"
Expand Down Expand Up @@ -46,7 +48,9 @@ private Q_SLOTS:
void onStop();

private:
void init_devices(const char* device);
Ui::V4l2sinkProperties *ui;
QMap<QString, QString> devices;
};

static void output_started(void *data, calldata_t *cd);
Expand Down
6 changes: 1 addition & 5 deletions src/v4l2sinkproperties.ui
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,7 @@
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLineEdit" name="lineEdit_dev">
<property name="placeholderText">
<string>/dev/video0</string>
</property>
</widget>
<widget class="QComboBox" name="comboBox_device"/>
</item>
<item>
<widget class="QComboBox" name="comboBox_format"/>
Expand Down