UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
settings_ui.cpp
Go to the documentation of this file.
1#include <stdio.h>
2#include <iostream>
3#include <QMetaType>
4#include <QLabel>
5#include <QLineEdit>
6#include <QCheckBox>
7#include <functional>
8#include "settings_ui.hpp"
9#include "video_opts.hpp"
10
11void SettingsUi::init(Settings *settings, AvailableSettings *availableSettings){
12 this->settings = settings;
13 this->availableSettings = availableSettings;
14}
15
17 uiControls.emplace_back(widget);
18
19 connect(widget, &WidgetUi::changed, this, &SettingsUi::changed);
20}
21
22void SettingsUi::initMainWin(Ui::UltragridWindow *ui){
23 mainWin = ui;
24
26#ifdef DEBUG
27 connect(mainWin->actionTest, SIGNAL(triggered()), this, SLOT(test()));
28#endif
29
30 addControl(new CheckboxUi(ui->fECCheckBox, settings, "network.fec.enabled"));
31 addControl(new CheckboxUi(ui->previewCheckBox, settings, "preview"));
33 new LineEditUi(ui->networkDestinationEdit, settings, "network.destination")
34 );
35 addControl(new ActionCheckableUi(ui->actionVuMeter, settings, "vuMeter"));
36 addControl(new ActionCheckableUi(ui->actionUse_hw_acceleration,
38 "decode.hwaccel"));
39
41 new ComboBoxUi(ui->videoSourceComboBox,
43 "video.source",
45 );
46
47 LineEditUi *videoBitrate = new LineEditUi(ui->videoBitrateEdit,
49 "");
50 addControl(videoBitrate);
51
52 std::unique_ptr<VideoBitrateCallbackData> vidBitrateCallData(new VideoBitrateCallbackData());
53
54 vidBitrateCallData->availSettings = availableSettings;
55 vidBitrateCallData->lineEditUi = videoBitrate;
56 vidBitrateCallData->label = mainWin->videoBitrateLabel;
57
58 auto extraPtr = vidBitrateCallData.get();
59 videoBitrate->registerCustomCallback("video.compress",
61 std::move(vidBitrateCallData));
62
63
65 new ComboBoxUi(ui->videoCompressionComboBox,
67 "video.compress",
69 );
70
72 new ComboBoxUi(ui->videoDisplayComboBox,
74 "video.display",
76 );
77
78 ComboBoxUi *videoModeCombo = new ComboBoxUi(ui->videoModeComboBox,
80 "",
82 videoModeCombo->registerCallback("video.source");
83 addControl(videoModeCombo);
84
86 new ComboBoxUi(ui->audioCompressionComboBox,
88 "audio.compress",
90 );
91
92 ComboBoxUi *audioSrc = new ComboBoxUi(ui->audioSourceComboBox,
94 "audio.source",
95 std::bind(getAudioSrc, availableSettings));
96 audioSrc->registerCallback("video.source");
97 addControl(audioSrc);
98
99 ComboBoxUi *audioPlayback = new ComboBoxUi(ui->audioPlaybackComboBox,
100 settings,
101 "audio.playback",
103 audioPlayback->registerCallback("video.display");
104 addControl(audioPlayback);
105
106 addControl(new LineEditUi(ui->audioBitrateEdit,
107 settings,
108 "audio.compress.bitrate"));
109
110 addControl(new SpinBoxUi(ui->audioChannelsSpinBox,
111 settings,
112 "audio.source.channels"));
113
114 addControl(new LineEditUi(ui->portLineEdit, settings, "network.port"));
115}
116
118 for(auto &i : uiControls){
119 i->refresh();
120 }
123}
124
125void SettingsUi::refreshAllCallback(Option&, bool, void *opaque){
126 static_cast<SettingsUi *>(opaque)->refreshAll();
127}
128
129static void vuMeterCallback(Option &opt, bool /*suboption*/, void *opaque){
130 static_cast<Ui::UltragridWindow *>(opaque)->vuMeter->setVisible(opt.isEnabled());
131 static_cast<Ui::UltragridWindow *>(opaque)->vuMeterSend->setVisible(opt.isEnabled());
132}
133
144
146 printf("%s\n", settings->getLaunchParams().c_str());
147}
148
149void SettingsUi::initSettingsWin(Ui::Settings *ui){
150 settingsWin = ui;
151
152 addControl(new LineEditUi(ui->basePort, settings, "network.port"));
153 addControl(new LineEditUi(ui->controlPort, settings, "network.control_port"));
154 addControl(new CheckboxUi(ui->controlPortRandom, settings, "network.control_port.random"));
155 addControl(new CheckboxUi(ui->fecAutoCheck, settings, "network.fec.auto"));
156 addControl(new GroupBoxUi(ui->fecGroupBox, settings, "network.fec.enabled"));
157 addControl(new SpinBoxUi(ui->multSpin, settings, "network.fec.mult.factor"));
158 addControl(new SpinBoxUi(ui->ldgmK, settings, "network.fec.ldgm.k"));
159 addControl(new SpinBoxUi(ui->ldgmM, settings, "network.fec.ldgm.m"));
160 addControl(new SpinBoxUi(ui->ldgmC, settings, "network.fec.ldgm.c"));
161 addControl(new SpinBoxUi(ui->rsK, settings, "network.fec.rs.k"));
162 addControl(new SpinBoxUi(ui->rsN, settings, "network.fec.rs.n"));
163 addControl(new RadioButtonUi(ui->fecNoneRadio, "", settings, "network.fec.type"));
164 addControl(new RadioButtonUi(ui->fecMultRadio, "mult", settings, "network.fec.type"));
165 addControl(new RadioButtonUi(ui->fecLdgmRadio, "ldgm", settings, "network.fec.type"));
166 addControl(new RadioButtonUi(ui->fecRsRadio, "rs", settings, "network.fec.type"));
167 addControl(new RadioButtonUi(ui->ldgmSimpCpuRadio, "CPU", settings, "network.fec.ldgm.device"));
168 addControl(new RadioButtonUi(ui->ldgmSimpGpuRadio, "GPU", settings, "network.fec.ldgm.device"));
169 addControl(new RadioButtonUi(ui->ldgmCpuRadio, "CPU", settings, "network.fec.ldgm.device"));
170 addControl(new RadioButtonUi(ui->ldgmGpuRadio, "GPU", settings, "network.fec.ldgm.device"));
171 addControl(new CheckboxUi(ui->decodeAccelCheck, settings, "decode.hwaccel"));
172 addControl(new CheckboxUi(ui->errorsFatalBox, settings, "errors_fatal"));
173 addControl(new LineEditUi(ui->encryptionLineEdit, settings, "encryption"));
174 addControl(new LineEditUi(ui->extraOptsLineEdit, settings, "extraOpts"));
175 addControl(new CheckboxUi(ui->advModeCheck, settings, "advanced"));
176
178
180 connect(settingsWin->codecList, &QListWidget::currentItemChanged,
182}
183
185 struct{
186 const char *label;
188 const char *keyPrefix;
189 } tabs[] = {
190 {"Audio playback", AUDIO_PLAYBACK, "audio.playback"},
191 {"Audio capture", AUDIO_SRC, "audio.source"},
192 {"Display", VIDEO_DISPLAY, "video.display"},
193 {"Capture", VIDEO_SRC, "video.source"},
194 };
195
196 deviceTabs.clear();
197
198 for(const auto& i : tabs){
199 DeviceOptTab tab;
200 tab.keyPrefix = i.keyPrefix;
201 tab.page = std::make_unique<QWidget>();
202 auto layout = new QHBoxLayout();
203 tab.page->setLayout(layout);
204
205 tab.listWidget = new QListWidget();
206 layout->addWidget(tab.listWidget, 1);
207 tab.scrollArea = new QScrollArea();
208 layout->addWidget(tab.scrollArea, 3);
209
210 tab.listWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
211 tab.scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
212
214
215 if(tab.listWidget->count() == 0){
216 continue;
217 }
218
219 connect(tab.listWidget, &QListWidget::currentItemChanged,
221
222 settingsWin->tabWidget->insertTab(0, tab.page.get(), i.label);
223 deviceTabs.emplace(i.type, std::move(tab));
224 }
225}
226
228
230 if(!settingsWin)
231 return;
232
233 QListWidget *list = settingsWin->codecList;
234 list->clear();
235
236 for(const auto& codec : availableSettings->getVideoCompressCodecs()){
237 QListWidgetItem *item = new QListWidgetItem(list);
238 item->setText(QString::fromStdString(codec.name));
239 item->setData(Qt::UserRole, QVariant::fromValue(codec));
240
241 list->addItem(item);
242 }
243}
244
246
248 if(!settingsWin)
249 return;
250
251 list->clear();
252
253 for(const auto& dev : availableSettings->getDevices(type)){
254 if(dev.opts.empty())
255 continue;
256
257 QListWidgetItem *item = new QListWidgetItem(list);
258
259 item->setText(QString::fromStdString(dev.name));
260 item->setData(Qt::UserRole, QVariant::fromValue(dev));
261
262 list->addItem(item);
263 }
264}
265
266void SettingsUi::settingsCodecSelected(QListWidgetItem *curr, QListWidgetItem *){
267 if(!curr){
268 codecControls.clear();
269 return;
270 }
271
272 const auto &codec = curr->data(Qt::UserRole).value<Codec>();
273
275}
276
277void SettingsUi::settingsDeviceSelected(QListWidgetItem *curr, QListWidgetItem *){
278 if(!curr){
279 return;
280 }
281
282 const auto &dev = curr->data(Qt::UserRole).value<Device>();
283
284 buildDeviceOptControls(dev, deviceTabs.at(dev.settingType));
285}
286
288 ControlForm form;
289
290 QComboBox *encoderCombo = new QComboBox();
291 form.formLayout->addRow("Encoder", encoderCombo);
292
293 WidgetUi *encoderComboUi = new ComboBoxUi(encoderCombo,
294 settings,
295 "video.compress." + codec.module_name + ".codec." + codec.name + ".encoder",
296 std::bind(getCodecEncoders, codec));
297
298 form.uiControls.emplace_back(encoderComboUi);
299 connect(encoderComboUi, &WidgetUi::changed, this, &SettingsUi::changed);
300
301 for(const auto& compMod : availableSettings->getVideoCompressModules()){
302 if(compMod.name == codec.module_name){
303 fillFormOptions(form, "video.compress." + compMod.name + ".", compMod.opts);
304 }
305 }
306
307 codecControls = std::move(form.uiControls);
308 settingsWin->codecOptScroll->setWidget(form.uiContainer.release());
309}
310
312 ControlForm form;
313
314 std::string optPrefix = tab.keyPrefix + "." + dev.type + ".device." + dev.deviceOpt + ".";
315 fillFormOptions(form, optPrefix, dev.opts);
316
317 tab.uiControls = std::move(form.uiControls);
318 tab.scrollArea->setWidget(form.uiContainer.release());
319}
320
322 std::string_view keyPrefix,
323 const std::vector<CapabOpt>& opts)
324{
325 for(const auto& modOpt : opts){
326 QLabel *label = new QLabel(QString::fromStdString(modOpt.displayName));
327 QWidget *field = nullptr;
328 WidgetUi *widgetUi = nullptr;
329 std::string optKey = std::string(keyPrefix) + modOpt.key;
330 if(modOpt.booleanOpt){
331 QCheckBox *checkBox = new QCheckBox();
332 field = checkBox;
333
334 widgetUi = new CheckboxUi(checkBox,
335 settings,
336 optKey);
337 } else {
338 QLineEdit *lineEdit = new QLineEdit();
339 field = lineEdit;
340
341 widgetUi = new LineEditUi(lineEdit,
342 settings,
343 optKey);
344 }
345 label->setToolTip(QString::fromStdString(modOpt.displayDesc));
346 field->setToolTip(QString::fromStdString(modOpt.displayDesc));
347
348 form.formLayout->addRow(label, field);
349
350 form.uiControls.emplace_back(widgetUi);
351 connect(widgetUi, &WidgetUi::changed, this, &SettingsUi::changed);
352 }
353}
std::vector< SettingItem > getAudioCompress(AvailableSettings *availSettings)
Definition audio_opts.cpp:8
void audioCompressionCallback(Option &opt, bool suboption, void *opaque)
std::vector< SettingItem > getAudioPlayback(AvailableSettings *availSettings)
std::vector< SettingItem > getAudioSrc(AvailableSettings *availSettings)
const std::vector< CompressModule > & getVideoCompressModules() const
const std::vector< Codec > & getVideoCompressCodecs() const
const std::vector< Device > & getDevices(SettingType type) const
void addOnChangeCallback(Callback callback)
Definition settings.cpp:107
bool isEnabled() const
Definition settings.hpp:61
const Option & getOption(const std::string &opt) const
Definition settings.cpp:384
std::string getLaunchParams() const
Definition settings.cpp:299
static void refreshAllCallback(Option &, bool, void *)
Ui::Settings * settingsWin
std::vector< std::unique_ptr< WidgetUi > > uiControls
std::map< SettingType, DeviceOptTab > deviceTabs
void addControl(WidgetUi *widget)
void refreshAll()
AvailableSettings * availableSettings
void changed()
Settings * settings
void addCallbacks()
void buildSettingsDeviceList(QListWidget *list, SettingType type)
void initSettingsWin(Ui::Settings *ui)
Ui::UltragridWindow * mainWin
void buildCodecOptControls(const Codec &codec)
void initMainWin(Ui::UltragridWindow *ui)
void buildSettingsCodecList()
void fillFormOptions(ControlForm &form, std::string_view keyPrefix, const std::vector< CapabOpt > &opts)
void init(Settings *settings, AvailableSettings *availableSettings)
void buildDeviceOptControls(const Device &dev, DeviceOptTab &tab)
void settingsCodecSelected(QListWidgetItem *curr, QListWidgetItem *prev)
void settingsDeviceSelected(QListWidgetItem *curr, QListWidgetItem *prev)
void addDeviceTabs()
std::vector< std::unique_ptr< WidgetUi > > codecControls
void registerCallback(const std::string &option)
Definition widget_ui.cpp:49
void registerCustomCallback(const std::string &option, Option::Callback callback, std::unique_ptr< ExtraCallbackData > &&extraDataPtr=nullptr)
Definition widget_ui.cpp:25
void changed()
Option::OptType type
Definition settings.cpp:194
static void vuMeterCallback(Option &opt, bool, void *opaque)
Q_DECLARE_METATYPE(Codec)
std::vector< std::unique_ptr< WidgetUi > > uiControls
QFormLayout * formLayout
std::unique_ptr< QWidget > uiContainer
std::string type
std::vector< CapabOpt > opts
std::string deviceOpt
std::vector< std::unique_ptr< WidgetUi > > uiControls
std::unique_ptr< QWidget > page
std::string keyPrefix
QScrollArea * scrollArea
QListWidget * listWidget
std::string name
Definition hd-rum.c:27
const char * label
Definition cineform.cpp:124
std::vector< SettingItem > getVideoDisplay(AvailableSettings *availSettings)
std::vector< SettingItem > getCodecEncoders(const Codec &codec)
std::vector< SettingItem > getVideoSrc(AvailableSettings *availSettings)
Definition video_opts.cpp:8
std::vector< SettingItem > getVideoModes(AvailableSettings *availSettings)
void videoCompressBitrateCallback(Option &opt, bool suboption, void *opaque)
std::vector< SettingItem > getVideoCompress(AvailableSettings *availSettings)