15 func_ptr(opt, suboption, opaque);
38 if(sub.first.empty() || sub.first ==
value){
39 out += sub.second->getLaunchOption();
97 auto pair = std::make_pair(
limit, sub);
115 std::cout <<
"Attempted to remove non-existent callback "
122 std::cout <<
"Removing callback "
134static void test_callback(
Option &opt,
bool,
void *){
135 std::cout <<
"Callback: " << opt.
getName()
137 <<
" (" << opt.
isEnabled() <<
")" << std::endl;
153 }
else if(
type ==
"mult"){
155 }
else if(
type ==
"rs"){
159 }
else if(
type ==
"ldgm"){
180 if(video_compress ==
""){
182 }
else if(video_compress ==
"jpeg"){
184 }
else if(video_compress ==
"libavcodec"
203 {
"video.source.embeddedAudioAvailable",
Option::SilentOpt,
"",
"",
false,
"",
""},
204 {
"testcard.width",
Option::StringOpt,
":",
"",
false,
"video.source",
"testcard"},
205 {
"testcard.height",
Option::StringOpt,
":",
"",
false,
"video.source",
"testcard"},
207 {
"testcard.format",
Option::StringOpt,
":",
"",
false,
"video.source",
"testcard"},
212 {
"v4l2.force_rgb",
Option::BoolOpt,
":convert=RGB",
"t",
true,
"video.source",
"v4l2"},
214 {
"dshow.force_rgb",
Option::BoolOpt,
":RGB",
"t",
true,
"video.source",
"dshow"},
215 {
"avfoundation.mode",
Option::StringOpt,
":mode=",
"",
false,
"video.source",
"avfoundation"},
216 {
"avfoundation.fps",
Option::StringOpt,
":fps=",
"",
false,
"video.source",
"avfoundation"},
217 {
"decklink.modeOpt",
Option::StringOpt,
":",
"",
false,
"video.source",
"decklink"},
219 {
"video.display.embeddedAudioAvailable",
Option::SilentOpt,
"",
"",
false,
"",
""},
222 {
"audio.source.channels",
Option::StringOpt,
" --audio-capture-format channels=",
"",
false,
"",
""},
228 {
"network.control_port",
Option::StringOpt,
" --control-port ",
"8888",
true,
"",
""},
229 {
"network.control_port.random",
Option::BoolOpt,
"",
"",
true,
"",
""},
237 {
"ldgm.device",
Option::SilentOpt,
" --param ldgm-device=",
"CPU",
false,
"network.fec",
""},
241 {
"decode.hwaccel",
Option::BoolOpt,
" --param use-hw-accel",
"f",
false,
"",
""},
245 {
"errors_fatal",
Option::BoolOpt,
" --param errors-fatal",
"t",
true,
"",
""},
259 std::random_device rd;
260 std::mt19937 gen(rd());
261 std::uniform_int_distribution<> bounds(0, (
'9' -
'0') + (
'z' -
'a'));
262 for(
int i = 0; i < 8; i++){
263 int rand = bounds(gen);
293 if(
getOption(
"network.control_port.random").isEnabled())
305 out +=
" --capture-filter preview";
311 const auto &dispOpt =
getOption(
"video.display");
312 if(dispOpt.isEnabled()){
314 out += dispOpt.getParam();
315 out +=
"multiplier:" + dispOpt.getValue() + dispOpt.getSubVals();
323 out += dispOpt.getParam();
329 out +=
" --audio-filter controlport_stats";
334 if(audioPlay.empty() &&
getOption(
"preview").isEnabled()){
335 audioPlay =
" -r dummy";
354 out +=
" --capture-filter preview";
358 out +=
" -d preview";
360 out +=
" --audio-filter controlport_stats#discard";
372 auto search =
options.find(opt);
375 std::unique_ptr<Option> newOption(
new Option(
this, opt));
376 auto p = newOption.get();
377 options[opt] = std::move(newOption);
381 return *search->second;
385 auto search =
options.find(opt);
390 return *search->second;
399 const std::string &
param,
400 const std::string &value,
402 const std::string &
parent,
403 const std::string &
limit)
413 std::unique_ptr<Option> newOption(
new Option(
this,
name));
414 opt = newOption.get();
417 opt = search->second.get();
456 const char *optPrefix;
458 {VIDEO_SRC,
"video.source"},
459 {VIDEO_DISPLAY,
"video.display"},
460 {AUDIO_SRC,
"audio.source"},
461 {AUDIO_PLAYBACK,
"audio.playback"},
464 for(
const auto& devType : devTypes){
465 for(
const auto& dev : availSettings->
getDevices(devType.type)){
468 for(
const auto& devOpt : dev.opts){
469 addOption(dev.deviceOpt +
"." + devOpt.key,
474 std::string(devType.optPrefix) +
"." + dev.type +
".device",
491 for(
const auto& modOption: mod.opts){
492 addOption(mod.name +
"." + modOption.key,
504 std::string optName =
"video.compress.";
505 optName +=
codec.module_name;
const std::vector< CompressModule > & getVideoCompressModules() const
const std::vector< Codec > & getVideoCompressCodecs() const
const std::vector< Device > & getDevices(SettingType type) const
void(*)(Option &, bool, void *) fcn_type
Callback(fcn_type func_ptr, void *opaque)
bool operator==(const Callback &) const
void operator()(Option &, bool) const
void removeOnChangeCallback(const Callback &callback)
std::string getValue() const
void setType(OptType type)
void setParam(const std::string &p)
void setEnabled(bool enable, bool suppressCallback=false)
void addOnChangeCallback(Callback callback)
std::vector< Callback > onChangeCallbacks
static void suboptionChanged(Option &opt, bool suboption, void *opaque)
void addSuboption(Option *sub, const std::string &limit="")
std::string getSubVals() const
std::vector< std::pair< std::string, Option * > > suboptions
virtual void setValue(const std::string &val, bool suppressCallback=false)
std::string getName() const
virtual std::string getLaunchOption() const
std::string getParam() const
virtual void setDefaultValue(const std::string &val)
std::map< std::string, std::unique_ptr< Option > > options
const Option & getOption(const std::string &opt) const
std::string getLaunchParams() const
const std::string & getSessRndKey() const
std::string getPreviewParams() const
void populateVideoCompressSettings(AvailableSettings *availSettings)
void populateSettingsFromCapabilities(AvailableSettings *availSettings)
const std::map< std::string, std::unique_ptr< Option > > & getOptionMap() const
std::string getControlPort() const
Option & addOption(std::string name, Option::OptType type, const std::string ¶m, const std::string &value="", bool enabled=true, const std::string &parent="", const std::string &limit="")
void populateDeviceSettings(AvailableSettings *availSettings)
static void addDevOpt(Settings *settings, const Device &dev, const char *parent)
static const struct @0 optionList[]
static void fec_builder_callback(Option &opt, bool subopt, void *)
const struct @1 optionCallbacks[]
Option::Callback::fcn_type callback
static void fec_auto_callback(Option &opt, bool, void *)
std::vector< encoder > encoders