1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

fix(video): workaround for webcams that provide no fps value

fixes #5082
This commit is contained in:
sudden6 2018-09-28 20:54:12 +02:00
parent 39dc6dacb8
commit 3746bd13bc
No known key found for this signature in database
GPG Key ID: 279509B499E032B9
2 changed files with 17 additions and 2 deletions

View File

@ -126,8 +126,10 @@ QVector<VideoMode> v4l2::getDeviceModes(QString devName)
int error = 0; int error = 0;
int fd = deviceOpen(devName, &error); int fd = deviceOpen(devName, &error);
if (fd < 0 || error != 0) if (fd < 0 || error != 0) {
return modes; return modes;
}
v4l2_fmtdesc vfd{}; v4l2_fmtdesc vfd{};
vfd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vfd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
@ -156,10 +158,18 @@ QVector<VideoMode> v4l2::getDeviceModes(QString devName)
QVector<float> rates = QVector<float> rates =
getDeviceModeFramerates(fd, mode.width, mode.height, vfd.pixelformat); getDeviceModeFramerates(fd, mode.width, mode.height, vfd.pixelformat);
// insert dummy FPS value to have the mode in the list even if we don't know the FPS
// this fixes support for some webcams, see #5082
if (rates.isEmpty()) {
rates.append(0.0f);
}
for (float rate : rates) { for (float rate : rates) {
mode.FPS = rate; mode.FPS = rate;
if (!modes.contains(mode)) if (!modes.contains(mode)) {
modes.append(std::move(mode)); modes.append(std::move(mode));
}
} }
vfse.index++; vfse.index++;
} }

View File

@ -222,6 +222,11 @@ void AVForm::on_videoModescomboBox_currentIndexChanged(int index)
void AVForm::selectBestModes(QVector<VideoMode>& allVideoModes) void AVForm::selectBestModes(QVector<VideoMode>& allVideoModes)
{ {
if (allVideoModes.isEmpty()) {
qCritical() << "Trying to select best mode from empty modes list";
return;
}
// Identify the best resolutions available for the supposed XXXXp resolutions. // Identify the best resolutions available for the supposed XXXXp resolutions.
std::map<int, VideoMode> idealModes; std::map<int, VideoMode> idealModes;
idealModes[120] = VideoMode(160, 120); idealModes[120] = VideoMode(160, 120);