diff --git a/linphone-desktop/assets/languages/en.ts b/linphone-desktop/assets/languages/en.ts
index 6bbac0d0c..09bba3bf2 100644
--- a/linphone-desktop/assets/languages/en.ts
+++ b/linphone-desktop/assets/languages/en.ts
@@ -899,6 +899,45 @@ Server url not configured.
System locale
+
+ SettingsVideo
+
+ videoInputDeviceLabel
+ Video input device
+
+
+ useCustomVideoFramerateLabel
+ Use custom framerate
+
+
+ videoFramerateLabel
+ Framerate
+
+
+ videoCaptureTitle
+ Video capture parameters
+
+
+ videoPresetLabel
+ Video preset
+
+
+ presetDefault
+ Default
+
+
+ presetHighFps
+ High FPS
+
+
+ presetCustom
+ Custom
+
+
+ videoSizeLabel
+ Video resolution
+
+
SettingsWindow
diff --git a/linphone-desktop/assets/languages/fr.ts b/linphone-desktop/assets/languages/fr.ts
index 684a9e148..7bd2d2b95 100644
--- a/linphone-desktop/assets/languages/fr.ts
+++ b/linphone-desktop/assets/languages/fr.ts
@@ -909,6 +909,45 @@ Url du serveur non configurée.
Locale du système
+
+ SettingsVideo
+
+ videoInputDeviceLabel
+ Périphérique de capture vidéo
+
+
+ useCustomVideoFramerateLabel
+ Forcer n.b. images/s
+
+
+ videoFramerateLabel
+ Images/s
+
+
+ videoCaptureTitle
+ Paramètres de capture vidéo
+
+
+ videoPresetLabel
+ Profil vidéo
+
+
+ presetDefault
+ Défaut
+
+
+ presetHighFps
+ Fluide
+
+
+ presetCustom
+ Personnalisé
+
+
+ videoSizeLabel
+ Définition
+
+
SettingsWindow
diff --git a/linphone-desktop/src/components/settings/SettingsModel.cpp b/linphone-desktop/src/components/settings/SettingsModel.cpp
index 4d2eacc4e..3fc9bd874 100644
--- a/linphone-desktop/src/components/settings/SettingsModel.cpp
+++ b/linphone-desktop/src/components/settings/SettingsModel.cpp
@@ -148,6 +148,60 @@ void SettingsModel::setEchoCancellationEnabled (bool status) {
emit echoCancellationEnabledChanged(status);
}
+// =============================================================================
+// Video.
+// =============================================================================
+
+QStringList SettingsModel::getVideoDevices () const {
+ QStringList list;
+
+ for (const auto &device : CoreManager::getInstance()->getCore()->getVideoDevices())
+ list << ::Utils::linphoneStringToQString(device);
+
+ return list;
+}
+
+// -----------------------------------------------------------------------------
+
+QString SettingsModel::getVideoDevice () const {
+ return ::Utils::linphoneStringToQString(
+ CoreManager::getInstance()->getCore()->getVideoDevice()
+ );
+}
+
+void SettingsModel::setVideoDevice (const QString &device) {
+ CoreManager::getInstance()->getCore()->setVideoDevice(
+ ::Utils::qStringToLinphoneString(device)
+ );
+ emit videoDeviceChanged(device);
+}
+
+// -----------------------------------------------------------------------------
+
+QString SettingsModel::getVideoPreset () const {
+ return ::Utils::linphoneStringToQString(
+ CoreManager::getInstance()->getCore()->getVideoPreset()
+ );
+}
+
+void SettingsModel::setVideoPreset (const QString &preset) {
+ CoreManager::getInstance()->getCore()->setVideoPreset(
+ ::Utils::qStringToLinphoneString(preset)
+ );
+ emit videoPresetChanged(preset);
+}
+
+// -----------------------------------------------------------------------------
+
+int SettingsModel::getVideoFramerate () const {
+ return static_cast(CoreManager::getInstance()->getCore()->getPreferredFramerate());
+}
+
+void SettingsModel::setVideoFramerate (int framerate) {
+ CoreManager::getInstance()->getCore()->setPreferredFramerate(static_cast(framerate));
+ emit videoFramerateChanged(framerate);
+}
+
// =============================================================================
// Chat & calls.
// =============================================================================
diff --git a/linphone-desktop/src/components/settings/SettingsModel.hpp b/linphone-desktop/src/components/settings/SettingsModel.hpp
index 7c07fd165..957ae40e1 100644
--- a/linphone-desktop/src/components/settings/SettingsModel.hpp
+++ b/linphone-desktop/src/components/settings/SettingsModel.hpp
@@ -49,6 +49,15 @@ class SettingsModel : public QObject {
Q_PROPERTY(bool echoCancellationEnabled READ getEchoCancellationEnabled WRITE setEchoCancellationEnabled NOTIFY echoCancellationEnabledChanged);
+ // Video. --------------------------------------------------------------------
+
+ Q_PROPERTY(QStringList videoDevices READ getVideoDevices CONSTANT);
+
+ Q_PROPERTY(QString videoDevice READ getVideoDevice WRITE setVideoDevice NOTIFY videoDeviceChanged);
+
+ Q_PROPERTY(QString videoPreset READ getVideoPreset WRITE setVideoPreset NOTIFY videoPresetChanged);
+ Q_PROPERTY(int videoFramerate READ getVideoFramerate WRITE setVideoFramerate NOTIFY videoFramerateChanged);
+
// Chat & calls. -------------------------------------------------------------
Q_PROPERTY(bool autoAnswerStatus READ getAutoAnswerStatus WRITE setAutoAnswerStatus NOTIFY autoAnswerStatusChanged);
@@ -147,6 +156,19 @@ public:
bool getEchoCancellationEnabled () const;
void setEchoCancellationEnabled (bool status);
+ // Video. --------------------------------------------------------------------
+
+ QStringList getVideoDevices () const;
+
+ QString getVideoDevice () const;
+ void setVideoDevice (const QString &device);
+
+ QString getVideoPreset () const;
+ void setVideoPreset (const QString &preset);
+
+ int getVideoFramerate () const;
+ void setVideoFramerate (int framerate);
+
// Chat & calls. -------------------------------------------------------------
bool getAutoAnswerStatus () const;
@@ -249,6 +271,13 @@ signals:
void echoCancellationEnabledChanged (bool status);
+ // Video. --------------------------------------------------------------------
+
+ void videoDeviceChanged (const QString &device);
+
+ void videoPresetChanged (const QString &preset);
+ void videoFramerateChanged (int framerate);
+
// Chat & calls. -------------------------------------------------------------
void autoAnswerStatusChanged (bool status);
diff --git a/linphone-desktop/ui/views/App/Settings/SettingsVideo.qml b/linphone-desktop/ui/views/App/Settings/SettingsVideo.qml
index f5c0de773..f2c344d7c 100644
--- a/linphone-desktop/ui/views/App/Settings/SettingsVideo.qml
+++ b/linphone-desktop/ui/views/App/Settings/SettingsVideo.qml
@@ -1,9 +1,91 @@
import QtQuick 2.7
import Common 1.0
+import Linphone 1.0
+import Utils 1.0
// =============================================================================
TabContainer {
+ Form {
+ title: qsTr('videoCaptureTitle')
+ width: parent.width
+ FormLine {
+ FormGroup {
+ label: qsTr('videoInputDeviceLabel')
+
+ ComboBox {
+ model: SettingsModel.videoDevices
+
+ Component.onCompleted: currentIndex = Utils.findIndex(model, function (device) {
+ return device === SettingsModel.videoDevice
+ })
+
+ onActivated: SettingsModel.videoDevice = model[index]
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('videoPresetLabel')
+
+ ComboBox {
+ model: ListModel {
+ id: presets
+
+ ListElement {
+ key: qsTr('presetDefault')
+ value: 'default'
+ }
+
+ ListElement {
+ key: qsTr('presetHighFps')
+ value: 'high-fps'
+ }
+
+ ListElement {
+ key: qsTr('presetCustom')
+ value: 'custom'
+ }
+ }
+
+ textRole: 'key'
+
+ Component.onCompleted: {
+ var preset = SettingsModel.videoPreset
+ currentIndex = Number(Utils.findIndex([ 'default', 'high-fps', 'custom' ], function (value) {
+ return preset === value
+ }))
+ }
+
+ onActivated: SettingsModel.videoPreset = presets.get(index).value
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('videoSizeLabel')
+
+ ComboBox {
+ // TODO
+ }
+ }
+
+ FormGroup {
+ label: qsTr('videoFramerateLabel')
+
+ NumericField {
+ maxValue: 60
+ minValue: 1
+ readOnly: SettingsModel.videoPreset !== 'custom'
+ text: SettingsModel.videoFramerate
+
+ onEditingFinished: SettingsModel.videoFramerate = text
+ }
+ }
+ }
+ }
}