UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
AvailableSettings Class Reference

#include <available_settings.hpp>

Collaboration diagram for AvailableSettings:
Collaboration graph

Public Member Functions

const std::vector< std::string > & getAvailableSettings (SettingType type) const
 
const std::vector< Device > & getDevices (SettingType type) const
 
const std::vector< Codec > & getVideoCompressCodecs () const
 
const std::vector< CompressModule > & getVideoCompressModules () const
 
bool isAvailable (const std::string &name, SettingType type) const
 
void queryBegin ()
 
void queryBeginPass ()
 
void queryEnd ()
 
void queryLine (std::string_view line)
 

Private Member Functions

void parseStateVersion (std::string_view line)
 
void queryDevice (std::string_view line)
 
void queryProcessLine (std::string_view line)
 
void queryVideoCompress (std::string_view line)
 

Private Attributes

std::vector< std::string > available [SETTING_TYPE_COUNT]
 
std::vector< Device > devices [SETTING_TYPE_COUNT]
 
bool endMarkerFound = false
 
void(AvailableSettings::* parseFunc )(std::string_view str) = nullptr
 
std::vector< Codec > videoCompressCodecs
 
std::vector< CompressModule > videoCompressModules
 

Detailed Description

Definition at line 85 of file available_settings.hpp.

Member Function Documentation

◆ getAvailableSettings()

const std::vector< std::string > & AvailableSettings::getAvailableSettings ( SettingType type) const

Definition at line 276 of file available_settings.cpp.

276 {
277 return available[type];
278}
std::vector< std::string > available[SETTING_TYPE_COUNT]
Option::OptType type
Definition settings.cpp:194

References available, and type.

Referenced by getAudioCompress(), getVideoDisplay(), and getVideoSrc().

◆ getDevices()

const std::vector< Device > & AvailableSettings::getDevices ( SettingType type) const

Definition at line 280 of file available_settings.cpp.

280 {
281 return devices[type];
282}
std::vector< Device > devices[SETTING_TYPE_COUNT]

References devices, and type.

Referenced by SettingsUi::buildSettingsDeviceList(), getAudioPlayback(), getAudioSrc(), getVideoDisplay(), getVideoModes(), getVideoSrc(), and Settings::populateDeviceSettings().

◆ getVideoCompressCodecs()

const std::vector< Codec > & AvailableSettings::getVideoCompressCodecs ( ) const
inline

◆ getVideoCompressModules()

const std::vector< CompressModule > & AvailableSettings::getVideoCompressModules ( ) const
inline

◆ isAvailable()

bool AvailableSettings::isAvailable ( const std::string & name,
SettingType type ) const

Definition at line 272 of file available_settings.cpp.

272 {
274}
static bool vectorContains(const std::vector< std::string > &v, const std::string &s)
const char * name
Definition settings.cpp:193

References available, name, type, and vectorContains().

Referenced by UltragridWindow::checkPreview().

Here is the call graph for this function:

◆ parseStateVersion()

void AvailableSettings::parseStateVersion ( std::string_view line)
private

Definition at line 74 of file available_settings.cpp.

74 {
75 int ver = 0;
76 std::string_view verStr = "[capability][start] version ";
77
78 if(sv_is_prefix(line, verStr)){
79 line.remove_prefix(verStr.size());
80 parse_num(line, ver);
81
82 const int expectedVersion = 4;
83 if(ver != expectedVersion){
84 QMessageBox msgBox;
85 QString msg = "Capabilities start marker with expected version not found"
86 " in ug output.";
87 if(ver != 0)
88 msg += " Version found: " + QString::number(ver);
89 msgBox.setText(msg);
90 msgBox.setIcon(QMessageBox::Critical);
91 msgBox.exec();
92 parseFunc = nullptr;
93 } else {
95 }
96 }
97}
void(AvailableSettings::* parseFunc)(std::string_view str)
void queryProcessLine(std::string_view line)
bool parse_num(std::string_view sv, T &res, int base=10)
bool sv_is_prefix(std::string_view haystack, std::string_view needle)

References parse_num(), parseFunc, queryProcessLine(), and sv_is_prefix().

Referenced by queryBeginPass().

Here is the call graph for this function:

◆ queryBegin()

void AvailableSettings::queryBegin ( )

Definition at line 104 of file available_settings.cpp.

104 {
105 for(auto& i : available){
106 i.clear();
107 }
108 for(auto& i : devices){
109 i.clear();
110 }
111 videoCompressModules.clear();
112 videoCompressCodecs.clear();
113 videoCompressModules.emplace_back(CompressModule{"", {}, });
114 videoCompressCodecs.emplace_back(Codec{"None", "", {Encoder{"default", ""}}, 0});
115
117}

References available, devices, queryBeginPass(), videoCompressCodecs, and videoCompressModules.

Referenced by UltragridWindow::launchQuery().

Here is the call graph for this function:

◆ queryBeginPass()

void AvailableSettings::queryBeginPass ( )

Definition at line 99 of file available_settings.cpp.

99 {
100 endMarkerFound = false;
102}
void parseStateVersion(std::string_view line)

References endMarkerFound, parseFunc, and parseStateVersion().

Referenced by queryBegin().

Here is the call graph for this function:

◆ queryDevice()

void AvailableSettings::queryDevice ( std::string_view line)
private

Definition at line 212 of file available_settings.cpp.

212 {
213 static std::map<std::string, SettingType> settingTypeMap = {
214 {"video_cap", VIDEO_SRC},
215 {"video_disp", VIDEO_DISPLAY},
216 {"audio_play", AUDIO_PLAYBACK},
217 {"audio_cap", AUDIO_SRC},
218 };
219
220 QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromRawData(line.data(), line.size()));
221 if(!doc.isObject())
222 return;
223
224 Device dev;
225 QJsonObject obj = doc.object();
226 maybeWriteString(obj, "name", dev.name);
227 maybeWriteString(obj, "module", dev.type);
228 maybeWriteString(obj, "device", dev.deviceOpt);
229
230 if(obj.contains("extra") && obj["extra"].isObject()){
231 const auto& extraObj = obj["extra"].toObject();
232 for(auto it = extraObj.constBegin(); it != extraObj.constEnd(); it++){
233 if(it.value().isString()){
234 dev.extra[it.key().toStdString()] = it.value().toString().toStdString();
235 }
236 }
237 }
238
239 if(obj.contains("modes") && obj["modes"].isArray()){
240 for(const QJsonValue &val : obj["modes"].toArray()){
241 if(val.isObject()){
242 QJsonObject modeJson = val.toObject();
243
245
246 maybeWriteString(modeJson, "name", mode.name);
247
248 if(modeJson.contains("opts") && modeJson["opts"].isObject()){
249 QJsonObject modeOpts = modeJson["opts"].toObject();
250 for(const QString &key : modeOpts.keys()){
251 if(modeOpts[key].isString()){
252 mode.opts.push_back(SettingVal{key.toStdString(),
253 modeOpts[key].toString().toStdString()});
254 }
255 }
256 dev.modes.push_back(std::move(mode));
257 }
258 }
259 }
260 }
261
262 dev.opts = parseCapabOpts(obj);
263
264 SettingType settingType = SETTING_TYPE_UNKNOWN;
265 if(obj.contains("purpose") && obj["purpose"].isString()){
266 settingType = settingTypeMap[obj["purpose"].toString().toStdString()];
267 }
268 dev.settingType = settingType;
269 devices[settingType].push_back(std::move(dev));
270}
int void * val
static void maybeWriteString(const QJsonObject &obj, const char *key, std::string &result)
std::vector< CapabOpt > parseCapabOpts(const QJsonObject &obj)
const char * doc
Definition host.cpp:923
enum openssl_mode mode
std::string type
std::map< std::string, std::string > extra
std::vector< CapabOpt > opts
SettingType settingType
std::vector< DeviceMode > modes
std::string name
std::string deviceOpt
const char * key
Definition cineform.cpp:125

References Device::deviceOpt, devices, doc, Device::extra, key, maybeWriteString(), mode, Device::modes, Device::name, Device::opts, parseCapabOpts(), Device::settingType, Device::type, and val.

Referenced by queryProcessLine().

Here is the call graph for this function:

◆ queryEnd()

void AvailableSettings::queryEnd ( )

Definition at line 119 of file available_settings.cpp.

119 {
120 std::sort(videoCompressCodecs.begin(), videoCompressCodecs.end(),
121 [](const Codec& a, const Codec& b){
122 return a.priority < b.priority;
123 });
124}

References videoCompressCodecs.

◆ queryLine()

void AvailableSettings::queryLine ( std::string_view line)

Definition at line 126 of file available_settings.cpp.

126 {
127 if(!parseFunc || (!sv_is_prefix(line, "[cap]") && !sv_is_prefix(line, "[capability]")))
128 return;
129
130 (this->*parseFunc)(line);
131}

References parseFunc, and sv_is_prefix().

Here is the call graph for this function:

◆ queryProcessLine()

void AvailableSettings::queryProcessLine ( std::string_view line)
private

Definition at line 43 of file available_settings.cpp.

43 {
44 constexpr std::string_view module_cap_prefix = "[cap][";
45 if(sv_is_prefix(line, module_cap_prefix)){
46 line.remove_prefix(module_cap_prefix.size());
47 if(line.empty())
48 return;
49
50 auto module_type = tokenize(line, ']');
51 auto module_name = sv_trim_whitespace(tokenize(line, ']'));
52
53 if(!module_type.empty() && !module_name.empty())
54 available[strToSettingType(module_type)].emplace_back(module_name);
55
56 return;
57 }
58
59 constexpr std::string_view devStr = "[capability][device]";
60 constexpr std::string_view codecStr = "[capability][video_compress]";
61 constexpr std::string_view endMarkerStr = "[capability][end]";
62
63 if(sv_is_prefix(line, devStr)){
64 line.remove_prefix(devStr.size());
65 queryDevice(line);
66 } else if(sv_is_prefix(line, codecStr)){
67 line.remove_prefix(codecStr.size());
69 } else if(sv_is_prefix(line, endMarkerStr)){
70 endMarkerFound = true;
71 }
72}
SettingType strToSettingType(std::string_view sv)
void queryVideoCompress(std::string_view line)
void queryDevice(std::string_view line)
std::string_view tokenize(std::string_view &str, char delim, char quot)
Tokenizer for string_view.
std::string_view sv_trim_whitespace(std::string_view sv)

References available, endMarkerFound, queryDevice(), queryVideoCompress(), strToSettingType(), sv_is_prefix(), sv_trim_whitespace(), and tokenize().

Referenced by parseStateVersion().

Here is the call graph for this function:

◆ queryVideoCompress()

void AvailableSettings::queryVideoCompress ( std::string_view line)
private

Definition at line 166 of file available_settings.cpp.

166 {
167 QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromRawData(line.data(), line.size()));
168 if(!doc.isObject())
169 return;
170
171 CompressModule compMod;
172 QJsonObject obj = doc.object();
173 maybeWriteString(obj, "name", compMod.name);
174
175
176 compMod.opts = parseCapabOpts(obj);
177
178 if(obj.contains("codecs") && obj["codecs"].isArray()){
179 for(const QJsonValue &val : obj["codecs"].toArray()){
180 QJsonObject codecJson = val.toObject();
181
182 Codec codec;
183 maybeWriteString(codecJson, "name", codec.name);
184 codec.module_name = compMod.name;
185 if(codecJson.contains("priority") && codecJson["priority"].isDouble()){
186 codec.priority = codecJson["priority"].toInt();
187 }
188
189 if(codecJson.contains("encoders") && codecJson["encoders"].isArray()){
190 for(const QJsonValue &val : codecJson["encoders"].toArray()){
191 QJsonObject encoderJson = val.toObject();
192
194 maybeWriteString(encoderJson, "name", encoder.name);
195 maybeWriteString(encoderJson, "opt_str", encoder.optStr);
196
197 codec.encoders.emplace_back(std::move(encoder));
198 }
199 }
200
201 if(codec.encoders.empty()){
202 codec.encoders.emplace_back(Encoder{"default", ""});
203 }
204
205 videoCompressCodecs.emplace_back(std::move(codec));
206 }
207 }
208
209 videoCompressModules.emplace_back(std::move(compMod));
210}
std::vector< CapabOpt > opts
std::string name
std::vector< encoder > encoders
std::string name

References doc, codec::encoders, maybeWriteString(), codec::name, CompressModule::name, encoder::name, CompressModule::opts, parseCapabOpts(), codec::priority, val, videoCompressCodecs, and videoCompressModules.

Referenced by queryProcessLine().

Here is the call graph for this function:

Member Data Documentation

◆ available

std::vector<std::string> AvailableSettings::available[SETTING_TYPE_COUNT]
private

◆ devices

std::vector<Device> AvailableSettings::devices[SETTING_TYPE_COUNT]
private

Definition at line 116 of file available_settings.hpp.

Referenced by getDevices(), queryBegin(), and queryDevice().

◆ endMarkerFound

bool AvailableSettings::endMarkerFound = false
private

Definition at line 120 of file available_settings.hpp.

Referenced by queryBeginPass(), and queryProcessLine().

◆ parseFunc

void(AvailableSettings::* AvailableSettings::parseFunc) (std::string_view str) = nullptr
private

Definition at line 113 of file available_settings.hpp.

Referenced by parseStateVersion(), queryBeginPass(), and queryLine().

◆ videoCompressCodecs

std::vector<Codec> AvailableSettings::videoCompressCodecs
private

◆ videoCompressModules

std::vector<CompressModule> AvailableSettings::videoCompressModules
private

Definition at line 117 of file available_settings.hpp.

Referenced by getVideoCompressModules(), queryBegin(), and queryVideoCompress().


The documentation for this class was generated from the following files: