mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Media Foundation/V4L2 grabber ... (#1119)
* - New Media Foundation grabber
- JsonAPI available grabber fix
- commented json config removed
* Added libjpeg-turbo to dependencies
* Fix OSX build
Removed Azure Pipelines from build scripts
* Remove Platform from Dashboard
* Correct Grabber Namings
* Grabber UI improvements, generic JSONEditor Selection Update
* Active grabber fix
* Stop Framebuffer grabber on failure
* - Image format NV12 and I420 added
- Flip mode
- Scaling factor for MJPEG
- VSCode (compile before run)
- CI (push) dependency libjpeg-turbo added
* Refactor MediaFoundation (Part 1)
* Remove QDebug output
* Added image flipping ability to MF Grabber
* fix issue 1160
* -Reload MF Grabber only once per WebUI update
- Cleanup
* Improvements
* - Set 'Software Frame Decimation' begin to 0
- Removed grabber specific device name from Log
- Keep pixel format when switching resolution
- Display 'Flip mode' correct in Log
- BGR24 images always flipped
* Refactor MediaFoundation (Part 2)
* Refactor V4L2 grabber (part 1) (#62)
* Media Foundation grabber adapted to V4L2 change
* Enable Media Foundation grabber on windows
* Have fps as int, fix height typo
* Added video standards to JsonAPI output
* Error handling in source reader improved
* Fix "Frame to small" error
* Discovery VideoSources and Dynamically Update Editor
* Hide all element when no video grabber discovered, upate naming
* Do not show unsupported grabbers
* Copy Log to Clipboard
* Update Grabber schema and Defaults
* Update access levels and validate crop ranges
* Height and width in Qt grabber corrected
* Correct formatting
* Untabify
* Global component states across instances
* Components divided on the dashboard
* refactor
* Fix Merge-issues
* Database migration aligning with updated grabber model
* Align Grabber.js with new utility functions
* Allow editor-validation for enum-lists
* Handle "Show Explainations scenario" correctly
* Grabber - Ensure save is only possible on valid content
* Dashboard update + fix GlobalSignal connection
* Ensure default database is populated with current release
* Correct grabber4L2 access level
* Display Signal detection area in preview
* Write Hyperion version into default config on compiling.
* Create defaultconfig.json dynamically
* WebUI changes
* Correct grabber config look-ups
* Refactor i18n language loading
* Fix en.json
* Split global capture from instance capture config
* Update grabber default values
* Standalone grabber: Add --debug switch
* Enhance showInputOptionsForKey for multiple keys
* Add grabber instance link to system grabber config
* Only show signal detection area, if grabber is enabled
* Always show Active element on grabber page
* Remote control - Only display gabber status, if global grabber is enabled
* WebUI optimization (thx to @mkcologne)
Start Grabber only when global settings are enabled
Fixed an issue in the WebUI preview
* V4L2/MF changes
* Jsoneditor, Correct translation for default values
* Refactor LED-Device handling in UI and make element naming consistent
* MF Discovery extended
* Fix LGTM finding
* Support Grabber Bri, Hue, Sat and Con in UI, plus their defaults
* Concider Access level for item filtering
* Concider Access level for item filtering
* Revert "Concider Access level for item filtering"
This reverts commit 5b0ce3c0f2
.
* Disable fpsSoftwareDecimation for framegrabber, as not supported yet
* JSON-Editor- Add updated schema for validation on dynamic elements
* added V4L2 color IDs
* LGTM findings fix
* destroy SR callback only on exit
* Grabber.js - Hide elements not supported by platform
* Fixed freezing start effect
* Grabber UI - Hardware controls - Show current values and allow to reset to defaults
* Grabber - Discovery - Add current values to properties
* Small things
* Clean-up Effects and have ENDLESS consistently defined
* Fix on/off/on priority during startup, by initializing _prevVisComp in line with background priority
* Add missing translation mappings
* DirectX Grabber reactivated/ QT Grabber size decimation fixed
* typo in push-master workflow
* Use PreciseTimer for Grabber to ensure stable FPS timing
* Set default Screencapture rate consistently
* Fix libjpeg-turbo download
* Remove Zero character from file
* docker-compile Add PLATFORM parameter, only copy output file after successful compile
* Framebuffer, Dispmanx, OSX, AML Grabber discovery, various clean-up and consistencies across grabbers
* Fix merge problem - on docker-compile Add PLATFORM parameter, only copy output file after successful compile
* Fix definition
* OSXFRameGrabber - Revert cast
* Clean-ups nach Feedback
* Disable certain libraries when building armlogic via standard stretch image as developer
* Add CEC availability to ServerInfo to have it platform independent
* Grabber UI - Fix problem that crop values are not populated when refining editor rage
* Preserve value when updating json-editor range
* LEDVisualisation - Clear image when source changes
* Fix - Preserve value when updating json-editor range
* LEDVisualisation - Clear image when no component is active
* Allow to have password handled by Password-Manager (#1263)
* Update default signal detection area to green assuming rainbow grabber
* LED Visualisation - Handle empty priority update
* Fix yuv420 in v4l2 grabber
* V4L2-Grabber discovery - Only report grabbers with valid video input information
* Grabber - Update static variables to have them working in release build
* LED Visualisation - ClearImage when no priorities
* LED Visualisation - Fix Logo resizing issue
* LED Visualisation - Have nearly black background and negative logo
Co-authored-by: LordGrey <lordgrey.emmel@gmail.com>
Co-authored-by: LordGrey <48840279+Lord-Grey@users.noreply.github.com>
This commit is contained in:
@@ -47,6 +47,7 @@ void CaptureCont::handleV4lImage(const QString& name, const Image<ColorRgb> & im
|
||||
{
|
||||
_hyperion->registerInput(_v4lCaptPrio, hyperion::COMP_V4L, "System", name);
|
||||
_v4lCaptName = name;
|
||||
emit GlobalSignals::getInstance()->requestSource(hyperion::COMP_V4L, int(_hyperion->getInstanceIndex()), _v4lCaptEnabled);
|
||||
}
|
||||
_v4lInactiveTimer->start();
|
||||
_hyperion->setInputImage(_v4lCaptPrio, image);
|
||||
@@ -58,6 +59,7 @@ void CaptureCont::handleSystemImage(const QString& name, const Image<ColorRgb>&
|
||||
{
|
||||
_hyperion->registerInput(_systemCaptPrio, hyperion::COMP_GRABBER, "System", name);
|
||||
_systemCaptName = name;
|
||||
emit GlobalSignals::getInstance()->requestSource(hyperion::COMP_GRABBER, int(_hyperion->getInstanceIndex()), _systemCaptEnabled);
|
||||
}
|
||||
_systemInactiveTimer->start();
|
||||
_hyperion->setInputImage(_systemCaptPrio, image);
|
||||
@@ -75,7 +77,7 @@ void CaptureCont::setSystemCaptureEnable(bool enable)
|
||||
}
|
||||
else
|
||||
{
|
||||
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, 0, 0);
|
||||
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, 0);
|
||||
_hyperion->clear(_systemCaptPrio);
|
||||
_systemInactiveTimer->stop();
|
||||
_systemCaptName = "";
|
||||
@@ -98,7 +100,7 @@ void CaptureCont::setV4LCaptureEnable(bool enable)
|
||||
}
|
||||
else
|
||||
{
|
||||
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, 0, 0);
|
||||
disconnect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, this, 0);
|
||||
_hyperion->clear(_v4lCaptPrio);
|
||||
_v4lInactiveTimer->stop();
|
||||
_v4lCaptName = "";
|
||||
@@ -125,8 +127,8 @@ void CaptureCont::handleSettingsUpdate(settings::type type, const QJsonDocument&
|
||||
_systemCaptPrio = obj["systemPriority"].toInt(250);
|
||||
}
|
||||
|
||||
setV4LCaptureEnable(obj["v4lEnable"].toBool(true));
|
||||
setSystemCaptureEnable(obj["systemEnable"].toBool(true));
|
||||
setV4LCaptureEnable(obj["v4lEnable"].toBool(false));
|
||||
setSystemCaptureEnable(obj["systemEnable"].toBool(false));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,33 +1,46 @@
|
||||
#include <hyperion/Grabber.h>
|
||||
#include <hyperion/GrabberWrapper.h>
|
||||
|
||||
Grabber::Grabber(const QString& grabberName, int width, int height, int cropLeft, int cropRight, int cropTop, int cropBottom)
|
||||
: _imageResampler()
|
||||
Grabber::Grabber(const QString& grabberName, int cropLeft, int cropRight, int cropTop, int cropBottom)
|
||||
: _grabberName(grabberName)
|
||||
, _log(Logger::getInstance(_grabberName.toUpper()))
|
||||
, _useImageResampler(true)
|
||||
, _videoMode(VideoMode::VIDEO_2D)
|
||||
, _width(width)
|
||||
, _height(height)
|
||||
, _fps(15)
|
||||
, _videoStandard(VideoStandard::NO_CHANGE)
|
||||
, _pixelDecimation(GrabberWrapper::DEFAULT_PIXELDECIMATION)
|
||||
, _flipMode(FlipMode::NO_CHANGE)
|
||||
, _width(0)
|
||||
, _height(0)
|
||||
, _fps(GrabberWrapper::DEFAULT_RATE_HZ)
|
||||
, _fpsSoftwareDecimation(0)
|
||||
, _input(-1)
|
||||
, _cropLeft(0)
|
||||
, _cropRight(0)
|
||||
, _cropTop(0)
|
||||
, _cropBottom(0)
|
||||
, _enabled(true)
|
||||
, _log(Logger::getInstance(grabberName.toUpper()))
|
||||
, _isEnabled(true)
|
||||
, _isDeviceInError(false)
|
||||
{
|
||||
Grabber::setVideoMode(VideoMode::VIDEO_2D);
|
||||
Grabber::setCropping(cropLeft, cropRight, cropTop, cropBottom);
|
||||
}
|
||||
|
||||
void Grabber::setEnabled(bool enable)
|
||||
{
|
||||
Info(_log,"Capture interface is now %s", enable ? "enabled" : "disabled");
|
||||
_enabled = enable;
|
||||
_isEnabled = enable;
|
||||
}
|
||||
|
||||
void Grabber::setInError(const QString& errorMsg)
|
||||
{
|
||||
_isDeviceInError = true;
|
||||
_isEnabled = false;
|
||||
|
||||
Error(_log, "Grabber disabled, device '%s' signals error: '%s'", QSTRING_CSTR(_grabberName), QSTRING_CSTR(errorMsg));
|
||||
}
|
||||
|
||||
void Grabber::setVideoMode(VideoMode mode)
|
||||
{
|
||||
Debug(_log,"Set videomode to %d", mode);
|
||||
Info(_log,"Set videomode to %s", QSTRING_CSTR(videoMode2String(mode)));
|
||||
_videoMode = mode;
|
||||
if ( _useImageResampler )
|
||||
{
|
||||
@@ -35,11 +48,46 @@ void Grabber::setVideoMode(VideoMode mode)
|
||||
}
|
||||
}
|
||||
|
||||
void Grabber::setCropping(unsigned cropLeft, unsigned cropRight, unsigned cropTop, unsigned cropBottom)
|
||||
void Grabber::setVideoStandard(VideoStandard videoStandard)
|
||||
{
|
||||
if (_videoStandard != videoStandard) {
|
||||
_videoStandard = videoStandard;
|
||||
}
|
||||
}
|
||||
|
||||
bool Grabber::setPixelDecimation(int pixelDecimation)
|
||||
{
|
||||
if (_pixelDecimation != pixelDecimation)
|
||||
{
|
||||
Info(_log,"Set image size decimation to %d", pixelDecimation);
|
||||
_pixelDecimation = pixelDecimation;
|
||||
if ( _useImageResampler )
|
||||
{
|
||||
_imageResampler.setHorizontalPixelDecimation(pixelDecimation);
|
||||
_imageResampler.setVerticalPixelDecimation(pixelDecimation);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Grabber::setFlipMode(FlipMode mode)
|
||||
{
|
||||
Info(_log,"Set flipmode to %s", QSTRING_CSTR(flipModeToString(mode)));
|
||||
_flipMode = mode;
|
||||
if ( _useImageResampler )
|
||||
{
|
||||
_imageResampler.setFlipMode(_flipMode);
|
||||
}
|
||||
}
|
||||
|
||||
void Grabber::setCropping(int cropLeft, int cropRight, int cropTop, int cropBottom)
|
||||
{
|
||||
if (_width>0 && _height>0)
|
||||
{
|
||||
if (cropLeft + cropRight >= (unsigned)_width || cropTop + cropBottom >= (unsigned)_height)
|
||||
if (cropLeft + cropRight >= _width || cropTop + cropBottom >= _height)
|
||||
{
|
||||
Error(_log, "Rejecting invalid crop values: left: %d, right: %d, top: %d, bottom: %d, higher than height/width %d/%d", cropLeft, cropRight, cropTop, cropBottom, _height, _width);
|
||||
return;
|
||||
@@ -79,29 +127,45 @@ bool Grabber::setInput(int input)
|
||||
|
||||
bool Grabber::setWidthHeight(int width, int height)
|
||||
{
|
||||
bool rc (false);
|
||||
// eval changes with crop
|
||||
if ( (width>0 && height>0) && (_width != width || _height != height) )
|
||||
{
|
||||
if (_cropLeft + _cropRight >= width || _cropTop + _cropBottom >= height)
|
||||
{
|
||||
Error(_log, "Rejecting invalid width/height values as it collides with image cropping: width: %d, height: %d", width, height);
|
||||
return false;
|
||||
rc = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug(_log, "Set new width: %d, height: %d for capture", width, height);
|
||||
_width = width;
|
||||
_height = height;
|
||||
rc = true;
|
||||
}
|
||||
Debug(_log, "Set new width: %d, height: %d for capture", width, height);
|
||||
_width = width;
|
||||
_height = height;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool Grabber::setFramerate(int fps)
|
||||
{
|
||||
if((fps > 0) && (_fps != fps))
|
||||
{
|
||||
Info(_log,"Set new frames per second to: %i fps", fps);
|
||||
_fps = fps;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Grabber::setFpsSoftwareDecimation(int decimation)
|
||||
{
|
||||
if((_fpsSoftwareDecimation != decimation))
|
||||
{
|
||||
_fpsSoftwareDecimation = decimation;
|
||||
if(decimation > 0){
|
||||
Debug(_log,"Skip %i frame per second", decimation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -10,22 +10,31 @@
|
||||
#include <QTimer>
|
||||
|
||||
GrabberWrapper* GrabberWrapper::instance = nullptr;
|
||||
const int GrabberWrapper::DEFAULT_RATE_HZ = 10;
|
||||
const int GrabberWrapper::DEFAULT_MIN_GRAB_RATE_HZ = 1;
|
||||
const int GrabberWrapper::DEFAULT_MAX_GRAB_RATE_HZ = 30;
|
||||
const int GrabberWrapper::DEFAULT_PIXELDECIMATION = 8;
|
||||
|
||||
GrabberWrapper::GrabberWrapper(const QString& grabberName, Grabber * ggrabber, unsigned width, unsigned height, unsigned updateRate_Hz)
|
||||
/// Map of Hyperion instances with grabber name that requested screen capture
|
||||
QMap<int, QString> GrabberWrapper::GRABBER_SYS_CLIENTS = QMap<int, QString>();
|
||||
QMap<int, QString> GrabberWrapper::GRABBER_V4L_CLIENTS = QMap<int, QString>();
|
||||
bool GrabberWrapper::GLOBAL_GRABBER_SYS_ENABLE = false;
|
||||
bool GrabberWrapper::GLOBAL_GRABBER_V4L_ENABLE = false;
|
||||
|
||||
GrabberWrapper::GrabberWrapper(const QString& grabberName, Grabber * ggrabber, int updateRate_Hz)
|
||||
: _grabberName(grabberName)
|
||||
, _timer(new QTimer(this))
|
||||
, _updateInterval_ms(1000/updateRate_Hz)
|
||||
, _log(Logger::getInstance(grabberName))
|
||||
, _ggrabber(ggrabber)
|
||||
, _image(0,0)
|
||||
, _log(Logger::getInstance(grabberName.toUpper()))
|
||||
, _timer(new QTimer(this))
|
||||
, _updateInterval_ms(1000/updateRate_Hz)
|
||||
, _ggrabber(ggrabber)
|
||||
, _image(0,0)
|
||||
{
|
||||
GrabberWrapper::instance = this;
|
||||
|
||||
// Configure the timer to generate events every n milliseconds
|
||||
_timer->setTimerType(Qt::PreciseTimer);
|
||||
_timer->setInterval(_updateInterval_ms);
|
||||
|
||||
_image.resize(width, height);
|
||||
|
||||
connect(_timer, &QTimer::timeout, this, &GrabberWrapper::action);
|
||||
|
||||
// connect the image forwarding
|
||||
@@ -44,17 +53,26 @@ GrabberWrapper::~GrabberWrapper()
|
||||
|
||||
bool GrabberWrapper::start()
|
||||
{
|
||||
// Start the timer with the pre configured interval
|
||||
Debug(_log,"Grabber start()");
|
||||
_timer->start();
|
||||
return _timer->isActive();
|
||||
bool rc = false;
|
||||
if ( open() )
|
||||
{
|
||||
if (!_timer->isActive())
|
||||
{
|
||||
// Start the timer with the pre configured interval
|
||||
Debug(_log,"Grabber start()");
|
||||
_timer->start();
|
||||
}
|
||||
|
||||
rc = _timer->isActive();
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
void GrabberWrapper::stop()
|
||||
{
|
||||
if (_timer->isActive())
|
||||
{
|
||||
// Stop the timer, effectivly stopping the process
|
||||
// Stop the timer, effectively stopping the process
|
||||
Debug(_log,"Grabber stop()");
|
||||
_timer->stop();
|
||||
}
|
||||
@@ -65,50 +83,58 @@ bool GrabberWrapper::isActive() const
|
||||
return _timer->isActive();
|
||||
}
|
||||
|
||||
QString GrabberWrapper::getActive() const
|
||||
QStringList GrabberWrapper::getActive(int inst) const
|
||||
{
|
||||
return _grabberName;
|
||||
QStringList result = QStringList();
|
||||
|
||||
if(GRABBER_V4L_CLIENTS.contains(inst))
|
||||
result << GRABBER_V4L_CLIENTS.value(inst);
|
||||
|
||||
if(GRABBER_SYS_CLIENTS.contains(inst))
|
||||
result << GRABBER_SYS_CLIENTS.value(inst);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
QStringList GrabberWrapper::availableGrabbers()
|
||||
{
|
||||
QStringList grabbers;
|
||||
|
||||
#ifdef ENABLE_DISPMANX
|
||||
#ifdef ENABLE_DISPMANX
|
||||
grabbers << "dispmanx";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_V4L2
|
||||
#if defined(ENABLE_V4L2) || defined(ENABLE_MF)
|
||||
grabbers << "v4l2";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_FB
|
||||
#ifdef ENABLE_FB
|
||||
grabbers << "framebuffer";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_AMLOGIC
|
||||
#ifdef ENABLE_AMLOGIC
|
||||
grabbers << "amlogic";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_OSX
|
||||
#ifdef ENABLE_OSX
|
||||
grabbers << "osx";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_X11
|
||||
#ifdef ENABLE_X11
|
||||
grabbers << "x11";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_XCB
|
||||
#ifdef ENABLE_XCB
|
||||
grabbers << "xcb";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_QT
|
||||
#ifdef ENABLE_QT
|
||||
grabbers << "qt";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DX
|
||||
grabbers << "dx";
|
||||
#endif
|
||||
#ifdef ENABLE_DX
|
||||
grabbers << "dx";
|
||||
#endif
|
||||
|
||||
return grabbers;
|
||||
}
|
||||
@@ -117,12 +143,17 @@ void GrabberWrapper::setVideoMode(VideoMode mode)
|
||||
{
|
||||
if (_ggrabber != nullptr)
|
||||
{
|
||||
Info(_log,"setvideomode");
|
||||
Info(_log,"setVideoMode");
|
||||
_ggrabber->setVideoMode(mode);
|
||||
}
|
||||
}
|
||||
|
||||
void GrabberWrapper::setCropping(unsigned cropLeft, unsigned cropRight, unsigned cropTop, unsigned cropBottom)
|
||||
void GrabberWrapper::setFlipMode(const QString& flipMode)
|
||||
{
|
||||
_ggrabber->setFlipMode(parseFlipMode(flipMode));
|
||||
}
|
||||
|
||||
void GrabberWrapper::setCropping(int cropLeft, int cropRight, int cropTop, int cropBottom)
|
||||
{
|
||||
_ggrabber->setCropping(cropLeft, cropRight, cropTop, cropBottom);
|
||||
}
|
||||
@@ -143,33 +174,40 @@ void GrabberWrapper::updateTimer(int interval)
|
||||
}
|
||||
|
||||
void GrabberWrapper::handleSettingsUpdate(settings::type type, const QJsonDocument& config)
|
||||
{
|
||||
if(type == settings::SYSTEMCAPTURE && !_grabberName.startsWith("V4L"))
|
||||
{ if(type == settings::SYSTEMCAPTURE && !_grabberName.startsWith("V4L"))
|
||||
{
|
||||
// extract settings
|
||||
const QJsonObject& obj = config.object();
|
||||
|
||||
// width/height
|
||||
_ggrabber->setWidthHeight(obj["width"].toInt(96), obj["height"].toInt(96));
|
||||
// set global grabber state
|
||||
setSysGrabberState(obj["enable"].toBool(false));
|
||||
|
||||
// display index for MAC
|
||||
_ggrabber->setDisplayIndex(obj["display"].toInt(0));
|
||||
if (getSysGrabberState())
|
||||
{
|
||||
// width/height
|
||||
_ggrabber->setWidthHeight(obj["width"].toInt(96), obj["height"].toInt(96));
|
||||
|
||||
// device path for Framebuffer
|
||||
_ggrabber->setDevicePath(obj["device"].toString("/dev/fb0"));
|
||||
// display index for MAC
|
||||
_ggrabber->setDisplayIndex(obj["input"].toInt(0));
|
||||
|
||||
// pixel decimation for x11
|
||||
_ggrabber->setPixelDecimation(obj["pixelDecimation"].toInt(8));
|
||||
// pixel decimation for x11
|
||||
_ggrabber->setPixelDecimation(obj["pixelDecimation"].toInt(DEFAULT_PIXELDECIMATION));
|
||||
|
||||
// crop for system capture
|
||||
_ggrabber->setCropping(
|
||||
obj["cropLeft"].toInt(0),
|
||||
obj["cropRight"].toInt(0),
|
||||
obj["cropTop"].toInt(0),
|
||||
obj["cropBottom"].toInt(0));
|
||||
// crop for system capture
|
||||
_ggrabber->setCropping(
|
||||
obj["cropLeft"].toInt(0),
|
||||
obj["cropRight"].toInt(0),
|
||||
obj["cropTop"].toInt(0),
|
||||
obj["cropBottom"].toInt(0));
|
||||
|
||||
// eval new update time
|
||||
updateTimer(1000/obj["frequency_Hz"].toInt(10));
|
||||
_ggrabber->setFramerate(obj["fps"].toInt(DEFAULT_RATE_HZ));
|
||||
// eval new update time
|
||||
updateTimer(_ggrabber->getUpdateInterval());
|
||||
}
|
||||
else
|
||||
{
|
||||
stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,24 +215,24 @@ void GrabberWrapper::handleSourceRequest(hyperion::Components component, int hyp
|
||||
{
|
||||
if(component == hyperion::Components::COMP_GRABBER && !_grabberName.startsWith("V4L"))
|
||||
{
|
||||
if(listen && !GRABBER_SYS_CLIENTS.contains(hyperionInd))
|
||||
GRABBER_SYS_CLIENTS.append(hyperionInd);
|
||||
else if (!listen)
|
||||
GRABBER_SYS_CLIENTS.removeOne(hyperionInd);
|
||||
if(listen)
|
||||
GRABBER_SYS_CLIENTS.insert(hyperionInd, _grabberName);
|
||||
else
|
||||
GRABBER_SYS_CLIENTS.remove(hyperionInd);
|
||||
|
||||
if(GRABBER_SYS_CLIENTS.empty())
|
||||
if(GRABBER_SYS_CLIENTS.empty() || !getSysGrabberState())
|
||||
stop();
|
||||
else
|
||||
start();
|
||||
}
|
||||
else if(component == hyperion::Components::COMP_V4L && _grabberName.startsWith("V4L"))
|
||||
{
|
||||
if(listen && !GRABBER_V4L_CLIENTS.contains(hyperionInd))
|
||||
GRABBER_V4L_CLIENTS.append(hyperionInd);
|
||||
else if (!listen)
|
||||
GRABBER_V4L_CLIENTS.removeOne(hyperionInd);
|
||||
if(listen)
|
||||
GRABBER_V4L_CLIENTS.insert(hyperionInd, _grabberName);
|
||||
else
|
||||
GRABBER_V4L_CLIENTS.remove(hyperionInd);
|
||||
|
||||
if(GRABBER_V4L_CLIENTS.empty())
|
||||
if(GRABBER_V4L_CLIENTS.empty() || !getV4lGrabberState())
|
||||
stop();
|
||||
else
|
||||
start();
|
||||
@@ -204,48 +242,6 @@ void GrabberWrapper::handleSourceRequest(hyperion::Components component, int hyp
|
||||
void GrabberWrapper::tryStart()
|
||||
{
|
||||
// verify start condition
|
||||
if((_grabberName.startsWith("V4L") && !GRABBER_V4L_CLIENTS.empty()) || (!_grabberName.startsWith("V4L") && !GRABBER_SYS_CLIENTS.empty()))
|
||||
{
|
||||
if(!_grabberName.startsWith("V4L") && !GRABBER_SYS_CLIENTS.empty() && getSysGrabberState())
|
||||
start();
|
||||
}
|
||||
}
|
||||
|
||||
QStringList GrabberWrapper::getV4L2devices() const
|
||||
{
|
||||
if(_grabberName.startsWith("V4L"))
|
||||
return _ggrabber->getV4L2devices();
|
||||
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
QString GrabberWrapper::getV4L2deviceName(const QString& devicePath) const
|
||||
{
|
||||
if(_grabberName.startsWith("V4L"))
|
||||
return _ggrabber->getV4L2deviceName(devicePath);
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
QMultiMap<QString, int> GrabberWrapper::getV4L2deviceInputs(const QString& devicePath) const
|
||||
{
|
||||
if(_grabberName.startsWith("V4L"))
|
||||
return _ggrabber->getV4L2deviceInputs(devicePath);
|
||||
|
||||
return QMultiMap<QString, int>();
|
||||
}
|
||||
|
||||
QStringList GrabberWrapper::getResolutions(const QString& devicePath) const
|
||||
{
|
||||
if(_grabberName.startsWith("V4L"))
|
||||
return _ggrabber->getResolutions(devicePath);
|
||||
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
QStringList GrabberWrapper::getFramerates(const QString& devicePath) const
|
||||
{
|
||||
if(_grabberName.startsWith("V4L"))
|
||||
return _ggrabber->getFramerates(devicePath);
|
||||
|
||||
return QStringList();
|
||||
}
|
||||
|
@@ -56,7 +56,7 @@ Hyperion::Hyperion(quint8 instance, bool readonlyMode)
|
||||
, _hwLedCount()
|
||||
, _ledGridSize(hyperion::getLedLayoutGridSize(getSetting(settings::LEDS).array()))
|
||||
, _BGEffectHandler(nullptr)
|
||||
,_captureCont(nullptr)
|
||||
, _captureCont(nullptr)
|
||||
, _ledBuffer(_ledString.leds().size(), ColorRgb::BLACK)
|
||||
, _boblightServer(nullptr)
|
||||
, _readOnlyMode(readonlyMode)
|
||||
|
@@ -88,7 +88,6 @@ bool HyperionIManager::startInstance(quint8 inst, bool block, QObject* caller, i
|
||||
// from Hyperion
|
||||
connect(hyperion, &Hyperion::settingsChanged, this, &HyperionIManager::settingsChanged);
|
||||
connect(hyperion, &Hyperion::videoMode, this, &HyperionIManager::requestVideoMode);
|
||||
connect(hyperion, &Hyperion::compStateChangeRequest, this, &HyperionIManager::compStateChangeRequest);
|
||||
// to Hyperion
|
||||
connect(this, &HyperionIManager::newVideoMode, hyperion, &Hyperion::newVideoMode);
|
||||
|
||||
|
@@ -14,14 +14,17 @@
|
||||
|
||||
const int PriorityMuxer::FG_PRIORITY = 1;
|
||||
const int PriorityMuxer::BG_PRIORITY = 254;
|
||||
const int PriorityMuxer::MANUAL_SELECTED_PRIORITY = 256;
|
||||
const int PriorityMuxer::LOWEST_PRIORITY = std::numeric_limits<uint8_t>::max();
|
||||
const int PriorityMuxer::TIMEOUT_NOT_ACTIVE_PRIO = -100;
|
||||
|
||||
PriorityMuxer::PriorityMuxer(int ledCount, QObject * parent)
|
||||
: QObject(parent)
|
||||
, _log(Logger::getInstance("HYPERION"))
|
||||
, _currentPriority(PriorityMuxer::LOWEST_PRIORITY)
|
||||
, _previousPriority(_currentPriority)
|
||||
, _manualSelectedPriority(256)
|
||||
, _manualSelectedPriority(MANUAL_SELECTED_PRIORITY)
|
||||
, _prevVisComp (hyperion::Components::COMP_COLOR)
|
||||
, _activeInputs()
|
||||
, _lowestPriorityInfo()
|
||||
, _sourceAutoSelectEnabled(true)
|
||||
@@ -101,7 +104,7 @@ void PriorityMuxer::updateLedColorsLength(int ledCount)
|
||||
{
|
||||
for (auto infoIt = _activeInputs.begin(); infoIt != _activeInputs.end();)
|
||||
{
|
||||
if (infoIt->ledColors.size() >= 1)
|
||||
if (!infoIt->ledColors.empty())
|
||||
{
|
||||
infoIt->ledColors.resize(ledCount, infoIt->ledColors.at(0));
|
||||
}
|
||||
@@ -151,7 +154,7 @@ void PriorityMuxer::registerInput(int priority, hyperion::Components component,
|
||||
|
||||
InputInfo& input = _activeInputs[priority];
|
||||
input.priority = priority;
|
||||
input.timeoutTime_ms = newInput ? -100 : input.timeoutTime_ms;
|
||||
input.timeoutTime_ms = newInput ? TIMEOUT_NOT_ACTIVE_PRIO : input.timeoutTime_ms;
|
||||
input.componentId = component;
|
||||
input.origin = origin;
|
||||
input.smooth_cfg = smooth_cfg;
|
||||
@@ -162,7 +165,9 @@ void PriorityMuxer::registerInput(int priority, hyperion::Components component,
|
||||
Debug(_log,"Register new input '%s/%s' with priority %d as inactive", QSTRING_CSTR(origin), hyperion::componentToIdString(component), priority);
|
||||
// emit 'prioritiesChanged' only if _sourceAutoSelectEnabled is false
|
||||
if (!_sourceAutoSelectEnabled)
|
||||
{
|
||||
emit prioritiesChanged();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -180,19 +185,26 @@ bool PriorityMuxer::setInput(int priority, const std::vector<ColorRgb>& ledColor
|
||||
return false;
|
||||
}
|
||||
|
||||
// calc final timeout
|
||||
if(timeout_ms > 0)
|
||||
timeout_ms = QDateTime::currentMSecsSinceEpoch() + timeout_ms;
|
||||
|
||||
InputInfo& input = _activeInputs[priority];
|
||||
InputInfo& input = _activeInputs[priority];
|
||||
// detect active <-> inactive changes
|
||||
bool activeChange = false;
|
||||
bool active = true;
|
||||
if(input.timeoutTime_ms == -100 && timeout_ms != -100)
|
||||
|
||||
// calculate final timeout
|
||||
if (timeout_ms >= 0)
|
||||
{
|
||||
timeout_ms = QDateTime::currentMSecsSinceEpoch() + timeout_ms;
|
||||
}
|
||||
else if (input.timeoutTime_ms >= 0)
|
||||
{
|
||||
timeout_ms = QDateTime::currentMSecsSinceEpoch();
|
||||
}
|
||||
|
||||
if(input.timeoutTime_ms == TIMEOUT_NOT_ACTIVE_PRIO && timeout_ms != TIMEOUT_NOT_ACTIVE_PRIO)
|
||||
{
|
||||
activeChange = true;
|
||||
}
|
||||
else if(timeout_ms == -100 && input.timeoutTime_ms != -100)
|
||||
else if(timeout_ms == TIMEOUT_NOT_ACTIVE_PRIO && input.timeoutTime_ms != TIMEOUT_NOT_ACTIVE_PRIO)
|
||||
{
|
||||
active = false;
|
||||
activeChange = true;
|
||||
@@ -224,19 +236,26 @@ bool PriorityMuxer::setInputImage(int priority, const Image<ColorRgb>& image, in
|
||||
return false;
|
||||
}
|
||||
|
||||
// calculate final timeout
|
||||
if(timeout_ms > 0)
|
||||
timeout_ms = QDateTime::currentMSecsSinceEpoch() + timeout_ms;
|
||||
|
||||
InputInfo& input = _activeInputs[priority];
|
||||
InputInfo& input = _activeInputs[priority];
|
||||
// detect active <-> inactive changes
|
||||
bool activeChange = false;
|
||||
bool active = true;
|
||||
if(input.timeoutTime_ms == -100 && timeout_ms != -100)
|
||||
|
||||
// calculate final timeout
|
||||
if (timeout_ms >= 0)
|
||||
{
|
||||
timeout_ms = QDateTime::currentMSecsSinceEpoch() + timeout_ms;
|
||||
}
|
||||
else if (input.timeoutTime_ms >= 0)
|
||||
{
|
||||
timeout_ms = QDateTime::currentMSecsSinceEpoch();
|
||||
}
|
||||
|
||||
if(input.timeoutTime_ms == TIMEOUT_NOT_ACTIVE_PRIO && timeout_ms != TIMEOUT_NOT_ACTIVE_PRIO)
|
||||
{
|
||||
activeChange = true;
|
||||
}
|
||||
else if(timeout_ms == -100 && input.timeoutTime_ms != -100)
|
||||
else if(timeout_ms == TIMEOUT_NOT_ACTIVE_PRIO && input.timeoutTime_ms != TIMEOUT_NOT_ACTIVE_PRIO)
|
||||
{
|
||||
active = false;
|
||||
activeChange = true;
|
||||
@@ -251,7 +270,9 @@ bool PriorityMuxer::setInputImage(int priority, const Image<ColorRgb>& image, in
|
||||
{
|
||||
Debug(_log, "Priority %d is now %s", priority, active ? "active" : "inactive");
|
||||
if (_currentPriority < priority)
|
||||
{
|
||||
emit prioritiesChanged();
|
||||
}
|
||||
setCurrentTime();
|
||||
}
|
||||
|
||||
@@ -261,12 +282,12 @@ bool PriorityMuxer::setInputImage(int priority, const Image<ColorRgb>& image, in
|
||||
bool PriorityMuxer::setInputInactive(int priority)
|
||||
{
|
||||
Image<ColorRgb> image;
|
||||
return setInputImage(priority, image, -100);
|
||||
return setInputImage(priority, image, TIMEOUT_NOT_ACTIVE_PRIO);
|
||||
}
|
||||
|
||||
bool PriorityMuxer::clearInput(int priority)
|
||||
{
|
||||
if (priority < PriorityMuxer::LOWEST_PRIORITY && _activeInputs.remove(priority))
|
||||
if (priority < PriorityMuxer::LOWEST_PRIORITY && (_activeInputs.remove(priority) > 0))
|
||||
{
|
||||
Debug(_log,"Removed source priority %d",priority);
|
||||
// on clear success update _currentPriority
|
||||
@@ -318,14 +339,15 @@ void PriorityMuxer::setCurrentTime()
|
||||
}
|
||||
else
|
||||
{
|
||||
// timeoutTime of -100 is awaiting data (inactive); skip
|
||||
if(infoIt->timeoutTime_ms > -100)
|
||||
// timeoutTime of TIMEOUT_NOT_ACTIVE_PRIO is awaiting data (inactive); skip
|
||||
if(infoIt->timeoutTime_ms > TIMEOUT_NOT_ACTIVE_PRIO)
|
||||
newPriority = qMin(newPriority, infoIt->priority);
|
||||
|
||||
// call timeTrigger when effect or color is running with timeout > 0, blacklist prio 255
|
||||
if(infoIt->priority < BG_PRIORITY && infoIt->timeoutTime_ms > 0 && (infoIt->componentId == hyperion::COMP_EFFECT || infoIt->componentId == hyperion::COMP_COLOR || infoIt->componentId == hyperion::COMP_IMAGE))
|
||||
if (infoIt->priority < BG_PRIORITY && infoIt->timeoutTime_ms > 0 && (infoIt->componentId == hyperion::COMP_EFFECT || infoIt->componentId == hyperion::COMP_COLOR || infoIt->componentId == hyperion::COMP_IMAGE))
|
||||
{
|
||||
emit signalTimeTrigger(); // as signal to prevent Threading issues
|
||||
|
||||
}
|
||||
++infoIt;
|
||||
}
|
||||
}
|
||||
|
@@ -391,12 +391,67 @@ bool SettingsManager::handleConfigUpgrade(QJsonObject& config)
|
||||
Warning(_log, "Instance [%u]: HwLedCount/Layout mismatch! Setting Hardware LED count to number of LEDs configured via layout", _instance);
|
||||
hwLedcount = layoutLedCount;
|
||||
newDeviceConfig["hardwareLedCount"] = hwLedcount;
|
||||
|
||||
config["device"] = newDeviceConfig;
|
||||
migrated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (newDeviceConfig.contains("type"))
|
||||
{
|
||||
QString type = newDeviceConfig["type"].toString();
|
||||
if (type == "atmoorb" || type == "fadecandy" || type == "philipshue" )
|
||||
{
|
||||
if (newDeviceConfig.contains("output"))
|
||||
{
|
||||
newDeviceConfig["host"] = newDeviceConfig["output"].toString();
|
||||
newDeviceConfig.remove("output");
|
||||
migrated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (migrated)
|
||||
{
|
||||
config["device"] = newDeviceConfig;
|
||||
Debug(_log, "LED-Device records migrated");
|
||||
}
|
||||
}
|
||||
|
||||
if (config.contains("grabberV4L2"))
|
||||
{
|
||||
QJsonObject newGrabberV4L2Config = config["grabberV4L2"].toObject();
|
||||
|
||||
if (newGrabberV4L2Config.contains("encoding_format"))
|
||||
{
|
||||
newGrabberV4L2Config.remove("encoding_format");
|
||||
config["grabberV4L2"] = newGrabberV4L2Config;
|
||||
migrated = true;
|
||||
Debug(_log, "GrabberV4L2 records migrated");
|
||||
}
|
||||
}
|
||||
|
||||
if (config.contains("framegrabber"))
|
||||
{
|
||||
QJsonObject newFramegrabberConfig = config["framegrabber"].toObject();
|
||||
|
||||
//Align element namings with grabberV4L2
|
||||
//Rename element type -> device
|
||||
if (newFramegrabberConfig.contains("type"))
|
||||
{
|
||||
newFramegrabberConfig["device"] = newFramegrabberConfig["type"];
|
||||
newFramegrabberConfig.remove("type");
|
||||
migrated = true;
|
||||
}
|
||||
//Rename element frequency_Hz -> fps
|
||||
if (newFramegrabberConfig.contains("frequency_Hz"))
|
||||
{
|
||||
newFramegrabberConfig["fps"] = newFramegrabberConfig["frequency_Hz"];
|
||||
newFramegrabberConfig.remove("frequency_Hz");
|
||||
migrated = true;
|
||||
}
|
||||
|
||||
config["framegrabber"] = newFramegrabberConfig;
|
||||
Debug(_log, "Framegrabber records migrated");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,6 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file alias="hyperion-schema">hyperion.schema.json</file>
|
||||
<file alias="hyperion_default.config">../../config/hyperion.config.json.default</file>
|
||||
<file alias="schema-general.json">schema/schema-general.json</file>
|
||||
<file alias="schema-logger.json">schema/schema-logger.json</file>
|
||||
<file alias="schema-device.json">schema/schema-device.json</file>
|
||||
|
@@ -1,100 +1,142 @@
|
||||
{
|
||||
"type" : "object",
|
||||
"title" : "edt_conf_fg_heading_title",
|
||||
"properties" :
|
||||
"properties":
|
||||
{
|
||||
"type" :
|
||||
{
|
||||
"type" : "string",
|
||||
"title" : "edt_conf_fg_type_title",
|
||||
"enum" : ["auto","amlogic","dispmanx","dx","framebuffer","osx","qt","x11", "xcb"],
|
||||
"options":
|
||||
{
|
||||
"enum_titles": ["edt_conf_enum_automatic","AMLogic","DispmanX","DirectX9","Framebuffer","OSX","QT","X11","XCB"]
|
||||
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"title": "edt_conf_general_enable_title",
|
||||
"required": true,
|
||||
"default": false,
|
||||
"propertyOrder": 1
|
||||
},
|
||||
"available_devices": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_grabber_discovered_title",
|
||||
"default": "edt_conf_grabber_discovery_inprogress",
|
||||
"options": {
|
||||
"infoText": "edt_conf_grabber_discovered_title_info"
|
||||
},
|
||||
"default" : "auto",
|
||||
"propertyOrder" : 1
|
||||
"propertyOrder": 2,
|
||||
"required": false
|
||||
},
|
||||
"width" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_fg_width_title",
|
||||
"minimum" : 10,
|
||||
"default" : 80,
|
||||
"append" : "edt_append_pixel",
|
||||
"propertyOrder" : 2
|
||||
"device": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required": true,
|
||||
"comment": "The 'available_devices' settings are dynamically inserted into the WebUI under PropertyOrder '2'.",
|
||||
"propertyOrder": 3
|
||||
},
|
||||
"height" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_fg_height_title",
|
||||
"minimum" : 10,
|
||||
"default" : 45,
|
||||
"append" : "edt_append_pixel",
|
||||
"propertyOrder" : 3
|
||||
"device_inputs": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_input_title",
|
||||
"propertyOrder": 4,
|
||||
"required": false
|
||||
},
|
||||
"frequency_Hz" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_fg_frequency_Hz_title",
|
||||
"minimum" : 1,
|
||||
"default" : 10,
|
||||
"append" : "edt_append_hz",
|
||||
"propertyOrder" : 4
|
||||
"input": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required": true,
|
||||
"propertyOrder": 5,
|
||||
"comment": "The 'device_inputs' settings are dynamically inserted into the WebUI under PropertyOrder '4'."
|
||||
},
|
||||
"cropLeft" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropLeft_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"propertyOrder" : 5
|
||||
"resolutions": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_resolution_title",
|
||||
"propertyOrder": 6,
|
||||
"required": false
|
||||
},
|
||||
"cropRight" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropRight_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"propertyOrder" : 6
|
||||
"width": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"minimum": 10,
|
||||
"default": 80,
|
||||
"append": "edt_append_pixel",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required": true,
|
||||
"propertyOrder": 9,
|
||||
"comment": "The 'resolutions' settings are dynamically inserted into the WebUI under PropertyOrder '6'."
|
||||
},
|
||||
"cropTop" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropTop_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"propertyOrder" : 7
|
||||
"height": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"append": "edt_append_pixel",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required": true,
|
||||
"propertyOrder": 10,
|
||||
"comment": "The 'resolutions' settings are dynamically inserted into the WebUI under PropertyOrder '6'."
|
||||
},
|
||||
"cropBottom" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropBottom_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"propertyOrder" : 8
|
||||
"framerates": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_fg_frequency_Hz_title",
|
||||
"propertyOrder": 11,
|
||||
"required": false
|
||||
},
|
||||
"pixelDecimation" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_fg_pixelDecimation_title",
|
||||
"minimum" : 1,
|
||||
"maximum" : 30,
|
||||
"default" : 8,
|
||||
"propertyOrder" : 9
|
||||
"fps": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"default":10,
|
||||
"minimum": 1,
|
||||
"append": "fps",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required": true,
|
||||
"propertyOrder": 12,
|
||||
"comment": "The 'framerates' setting is dynamically inserted into the WebUI under PropertyOrder '11'."
|
||||
},
|
||||
"display" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_fg_display_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"propertyOrder" : 10
|
||||
"pixelDecimation": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_fg_pixelDecimation_title",
|
||||
"minimum": 1,
|
||||
"maximum": 30,
|
||||
"default": 8,
|
||||
"required": true,
|
||||
"propertyOrder": 13
|
||||
},
|
||||
"cropLeft": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropLeft_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"propertyOrder": 14
|
||||
},
|
||||
"cropRight": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropRight_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"propertyOrder": 15
|
||||
},
|
||||
"cropTop": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropTop_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"propertyOrder": 16
|
||||
},
|
||||
"cropBottom": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropBottom_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"propertyOrder": 17
|
||||
}
|
||||
},
|
||||
"additionalProperties" : false
|
||||
|
@@ -2,263 +2,359 @@
|
||||
"type" : "object",
|
||||
"required" : true,
|
||||
"title" : "edt_conf_v4l2_heading_title",
|
||||
"properties" :
|
||||
"properties":
|
||||
{
|
||||
"device" :
|
||||
{
|
||||
"type" : "string",
|
||||
"title" : "edt_conf_enum_custom",
|
||||
"default" : "auto",
|
||||
"options" : {
|
||||
"hidden":true
|
||||
"enable": {
|
||||
"type": "boolean",
|
||||
"title": "edt_conf_general_enable_title",
|
||||
"required": true,
|
||||
"default": false,
|
||||
"propertyOrder": 1
|
||||
},
|
||||
"available_devices": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_grabber_discovered_title",
|
||||
"default": "edt_conf_grabber_discovery_inprogress",
|
||||
"options": {
|
||||
"infoText": "edt_conf_grabber_discovered_title_info"
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 2,
|
||||
"comment" : "The 'available_devices' settings are dynamically inserted into the WebUI under PropertyOrder '1'."
|
||||
"propertyOrder": 2,
|
||||
"required": false
|
||||
},
|
||||
"input" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_enum_custom",
|
||||
"default" : 0,
|
||||
"options" : {
|
||||
"hidden":true
|
||||
"device": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 4,
|
||||
"comment" : "The 'device_inputs' settings are dynamically inserted into the WebUI under PropertyOrder '3'."
|
||||
"required": true,
|
||||
"comment": "The 'available_devices' settings are dynamically inserted into the WebUI under PropertyOrder '2'.",
|
||||
"propertyOrder": 3
|
||||
},
|
||||
"standard" :
|
||||
{
|
||||
"type" : "string",
|
||||
"title" : "edt_conf_v4l2_standard_title",
|
||||
"enum" : ["NO_CHANGE", "PAL","NTSC","SECAM"],
|
||||
"default" : "NO_CHANGE",
|
||||
"options" : {
|
||||
"enum_titles" : ["edt_conf_enum_NO_CHANGE", "edt_conf_enum_PAL", "edt_conf_enum_NTSC", "edt_conf_enum_SECAM"]
|
||||
"device_inputs": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_input_title",
|
||||
"propertyOrder": 4,
|
||||
"required": false
|
||||
},
|
||||
"input": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"default": 0,
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 5
|
||||
"required": true,
|
||||
"propertyOrder": 5,
|
||||
"comment": "The 'device_inputs' settings are dynamically inserted into the WebUI under PropertyOrder '4'."
|
||||
},
|
||||
"width" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_fg_width_title",
|
||||
"default" : 0,
|
||||
"minimum" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"options" : {
|
||||
"hidden":true
|
||||
|
||||
"standard": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_standard_title",
|
||||
"required": false,
|
||||
"propertyOrder": 6
|
||||
},
|
||||
"encoding": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_encoding_title",
|
||||
"required": false,
|
||||
"access": "advanced",
|
||||
"propertyOrder": 7
|
||||
},
|
||||
"resolutions": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_resolution_title",
|
||||
"propertyOrder": 8,
|
||||
"required": false
|
||||
},
|
||||
"width": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_fg_width_title",
|
||||
"default": 0,
|
||||
"minimum": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 7,
|
||||
"comment" : "The 'resolutions' settings are dynamically inserted into the WebUI under PropertyOrder '6'."
|
||||
"required": true,
|
||||
"propertyOrder": 9,
|
||||
"comment": "The 'resolutions' settings are dynamically inserted into the WebUI under PropertyOrder '8'."
|
||||
},
|
||||
"height" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_fg_height_title",
|
||||
"default" : 0,
|
||||
"minimum" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"options" : {
|
||||
"hidden":true
|
||||
"height": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_fg_height_title",
|
||||
"default": 0,
|
||||
"minimum": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 8
|
||||
"required": true,
|
||||
"propertyOrder": 10,
|
||||
"comment": "The 'resolutions' settings are dynamically inserted into the WebUI under PropertyOrder '8'."
|
||||
},
|
||||
"fps" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_enum_custom",
|
||||
"default" : 15,
|
||||
"minimum" : 1,
|
||||
"append" : "fps",
|
||||
"options" : {
|
||||
"hidden":true
|
||||
"framerates": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_framerate_title",
|
||||
"propertyOrder": 11,
|
||||
"required": false
|
||||
},
|
||||
"fps": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_enum_custom",
|
||||
"default": 15,
|
||||
"minimum": 0,
|
||||
"append": "fps",
|
||||
"options": {
|
||||
"hidden": true
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 10,
|
||||
"comment" : "The 'framerates' setting is dynamically inserted into the WebUI under PropertyOrder '9'."
|
||||
"required": true,
|
||||
"propertyOrder": 12,
|
||||
"comment": "The 'framerates' setting is dynamically inserted into the WebUI under PropertyOrder '11'."
|
||||
},
|
||||
"sizeDecimation" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_sizeDecimation_title",
|
||||
"minimum" : 1,
|
||||
"maximum" : 30,
|
||||
"default" : 6,
|
||||
"required" : true,
|
||||
"propertyOrder" : 11
|
||||
"fpsSoftwareDecimation": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_fpsSoftwareDecimation_title",
|
||||
"minimum": 0,
|
||||
"maximum": 60,
|
||||
"default": 0,
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 13
|
||||
},
|
||||
"cropLeft" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropLeft_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"required" : true,
|
||||
"propertyOrder" : 12
|
||||
"flip": {
|
||||
"type": "string",
|
||||
"title": "edt_conf_v4l2_flip_title",
|
||||
"enum": [ "NO_CHANGE", "HORIZONTAL", "VERTICAL", "BOTH" ],
|
||||
"default": "NO_CHANGE",
|
||||
"options": {
|
||||
"enum_titles": [ "edt_conf_enum_NO_CHANGE", "edt_conf_enum_HORIZONTAL", "edt_conf_enum_VERTICAL", "edt_conf_enum_BOTH" ]
|
||||
},
|
||||
"required": true,
|
||||
"access": "advanced",
|
||||
"propertyOrder": 14
|
||||
},
|
||||
"cropRight" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropRight_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"required" : true,
|
||||
"propertyOrder" : 13
|
||||
"sizeDecimation": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_sizeDecimation_title",
|
||||
"minimum": 1,
|
||||
"maximum": 30,
|
||||
"default": 8,
|
||||
"required": true,
|
||||
"propertyOrder": 15
|
||||
},
|
||||
"cropTop" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropTop_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"required" : true,
|
||||
"propertyOrder" : 14
|
||||
"hardware_brightness": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_hardware_brightness_title",
|
||||
"default": 0,
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 16
|
||||
},
|
||||
"cropBottom" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_cropBottom_title",
|
||||
"minimum" : 0,
|
||||
"default" : 0,
|
||||
"append" : "edt_append_pixel",
|
||||
"required" : true,
|
||||
"propertyOrder" : 15
|
||||
"hardware_contrast": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_hardware_contrast_title",
|
||||
"default": 0,
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 17
|
||||
},
|
||||
"cecDetection" :
|
||||
{
|
||||
"type" : "boolean",
|
||||
"title" : "edt_conf_v4l2_cecDetection_title",
|
||||
"default" : false,
|
||||
"required" : true,
|
||||
"propertyOrder" : 16
|
||||
"hardware_saturation": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_hardware_saturation_title",
|
||||
"default": 0,
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 18
|
||||
},
|
||||
"signalDetection" :
|
||||
{
|
||||
"type" : "boolean",
|
||||
"title" : "edt_conf_v4l2_signalDetection_title",
|
||||
"default" : false,
|
||||
"required" : true,
|
||||
"propertyOrder" : 17
|
||||
"hardware_hue": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_hardware_hue_title",
|
||||
"default": 0,
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 19
|
||||
},
|
||||
"redSignalThreshold" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_redSignalThreshold_title",
|
||||
"minimum" : 0,
|
||||
"maximum" : 100,
|
||||
"default" : 5,
|
||||
"append" : "edt_append_percent",
|
||||
"cropLeft": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropLeft_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"required": true,
|
||||
"propertyOrder": 20
|
||||
},
|
||||
"cropRight": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropRight_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"required": true,
|
||||
"propertyOrder": 21
|
||||
},
|
||||
"cropTop": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropTop_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"required": true,
|
||||
"propertyOrder": 22
|
||||
},
|
||||
"cropBottom": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_cropBottom_title",
|
||||
"minimum": 0,
|
||||
"default": 0,
|
||||
"append": "edt_append_pixel",
|
||||
"required": true,
|
||||
"propertyOrder": 23
|
||||
},
|
||||
"cecDetection": {
|
||||
"type": "boolean",
|
||||
"title": "edt_conf_v4l2_cecDetection_title",
|
||||
"default": false,
|
||||
"required": true,
|
||||
"access": "advanced",
|
||||
"propertyOrder": 24
|
||||
},
|
||||
"signalDetection": {
|
||||
"type": "boolean",
|
||||
"title": "edt_conf_v4l2_signalDetection_title",
|
||||
"default": false,
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 25
|
||||
},
|
||||
"redSignalThreshold": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_redSignalThreshold_title",
|
||||
"minimum": 0,
|
||||
"maximum": 100,
|
||||
"default": 0,
|
||||
"append": "edt_append_percent",
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 18
|
||||
"access": "expert",
|
||||
"required": true,
|
||||
"propertyOrder": 26
|
||||
},
|
||||
"greenSignalThreshold" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_greenSignalThreshold_title",
|
||||
"minimum" : 0,
|
||||
"maximum" : 100,
|
||||
"default" : 5,
|
||||
"append" : "edt_append_percent",
|
||||
"greenSignalThreshold": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_greenSignalThreshold_title",
|
||||
"minimum": 0,
|
||||
"maximum": 100,
|
||||
"default": 100,
|
||||
"append": "edt_append_percent",
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 19
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 27
|
||||
},
|
||||
"blueSignalThreshold" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"title" : "edt_conf_v4l2_blueSignalThreshold_title",
|
||||
"minimum" : 0,
|
||||
"maximum" : 100,
|
||||
"default" : 5,
|
||||
"append" : "edt_append_percent",
|
||||
"blueSignalThreshold": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_blueSignalThreshold_title",
|
||||
"minimum": 0,
|
||||
"maximum": 100,
|
||||
"default": 0,
|
||||
"append": "edt_append_percent",
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 20
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 28
|
||||
},
|
||||
"sDVOffsetMin" :
|
||||
{
|
||||
"type" : "number",
|
||||
"title" : "edt_conf_v4l2_sDVOffsetMin_title",
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 1.0,
|
||||
"default" : 0.25,
|
||||
"step" : 0.01,
|
||||
"noSignalCounterThreshold": {
|
||||
"type": "integer",
|
||||
"title": "edt_conf_v4l2_noSignalCounterThreshold_title",
|
||||
"minimum": 1,
|
||||
"maximum": 1000,
|
||||
"default": 200,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 21
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 29
|
||||
},
|
||||
"sDVOffsetMax" :
|
||||
{
|
||||
"type" : "number",
|
||||
"title" : "edt_conf_v4l2_sDVOffsetMax_title",
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 1.0,
|
||||
"default" : 0.75,
|
||||
"step" : 0.01,
|
||||
"sDVOffsetMin": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_v4l2_sDVOffsetMin_title",
|
||||
"minimum": 0.0,
|
||||
"maximum": 1.0,
|
||||
"default": 0.1,
|
||||
"step": 0.01,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 22
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 30
|
||||
},
|
||||
"sDHOffsetMin" :
|
||||
{
|
||||
"type" : "number",
|
||||
"title" : "edt_conf_v4l2_sDHOffsetMin_title",
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 1.0,
|
||||
"default" : 0.25,
|
||||
"step" : 0.01,
|
||||
"sDVOffsetMax": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_v4l2_sDVOffsetMax_title",
|
||||
"minimum": 0.0,
|
||||
"maximum": 1.0,
|
||||
"default": 0.9,
|
||||
"step": 0.01,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 23
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 31
|
||||
},
|
||||
"sDHOffsetMax" :
|
||||
{
|
||||
"type" : "number",
|
||||
"title" : "edt_conf_v4l2_sDHOffsetMax_title",
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 1.0,
|
||||
"default" : 0.75,
|
||||
"step" : 0.01,
|
||||
"sDHOffsetMin": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_v4l2_sDHOffsetMin_title",
|
||||
"minimum": 0.0,
|
||||
"maximum": 1.0,
|
||||
"default": 0.4,
|
||||
"step": 0.01,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required" : true,
|
||||
"propertyOrder" : 24
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 32
|
||||
},
|
||||
"sDHOffsetMax": {
|
||||
"type": "number",
|
||||
"title": "edt_conf_v4l2_sDHOffsetMax_title",
|
||||
"minimum": 0.0,
|
||||
"maximum": 1.0,
|
||||
"default": 0.46,
|
||||
"step": 0.01,
|
||||
"options": {
|
||||
"dependencies": {
|
||||
"signalDetection": true
|
||||
}
|
||||
},
|
||||
"required": true,
|
||||
"access": "expert",
|
||||
"propertyOrder": 33
|
||||
}
|
||||
},
|
||||
"additionalProperties" : true
|
||||
}
|
||||
"additionalProperties": true
|
||||
}
|
||||
|
@@ -2,43 +2,52 @@
|
||||
"type" : "object",
|
||||
"required" : true,
|
||||
"title" : "edt_conf_instC_heading_title",
|
||||
"properties" :
|
||||
{
|
||||
"systemEnable" :
|
||||
{
|
||||
"type" : "boolean",
|
||||
"required" : true,
|
||||
"title" : "edt_conf_instC_systemEnable_title",
|
||||
"default" : true,
|
||||
"propertyOrder" : 1
|
||||
"properties": {
|
||||
"systemEnable": {
|
||||
"type": "boolean",
|
||||
"required": true,
|
||||
"title": "edt_conf_instC_systemEnable_title",
|
||||
"default": false,
|
||||
"propertyOrder": 1
|
||||
},
|
||||
"systemPriority" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"required" : true,
|
||||
"title" : "edt_conf_general_priority_title",
|
||||
"minimum" : 100,
|
||||
"maximum" : 253,
|
||||
"default" : 250,
|
||||
"propertyOrder" : 2
|
||||
"systemGrabberDevice": {
|
||||
"type": "string",
|
||||
"required": true,
|
||||
"title": "edt_conf_instC_screen_grabber_device_title",
|
||||
"default": "NONE",
|
||||
"propertyOrder": 2
|
||||
},
|
||||
"v4lEnable" :
|
||||
{
|
||||
"type" : "boolean",
|
||||
"required" : true,
|
||||
"title" : "edt_conf_instC_v4lEnable_title",
|
||||
"default" : false,
|
||||
"propertyOrder" : 3
|
||||
"systemPriority": {
|
||||
"type": "integer",
|
||||
"required": true,
|
||||
"title": "edt_conf_general_priority_title",
|
||||
"minimum": 100,
|
||||
"maximum": 253,
|
||||
"default": 250,
|
||||
"propertyOrder": 3
|
||||
},
|
||||
"v4lPriority" :
|
||||
{
|
||||
"type" : "integer",
|
||||
"required" : true,
|
||||
"title" : "edt_conf_general_priority_title",
|
||||
"minimum" : 100,
|
||||
"maximum" : 253,
|
||||
"default" : 240,
|
||||
"propertyOrder" : 4
|
||||
"v4lEnable": {
|
||||
"type": "boolean",
|
||||
"required": true,
|
||||
"title": "edt_conf_instC_v4lEnable_title",
|
||||
"default": false,
|
||||
"propertyOrder": 4
|
||||
},
|
||||
"v4lGrabberDevice": {
|
||||
"type": "string",
|
||||
"required": true,
|
||||
"title": "edt_conf_instC_video_grabber_device_title",
|
||||
"default": "NONE",
|
||||
"propertyOrder": 5
|
||||
},
|
||||
"v4lPriority": {
|
||||
"type": "integer",
|
||||
"required": true,
|
||||
"title": "edt_conf_general_priority_title",
|
||||
"minimum": 100,
|
||||
"maximum": 253,
|
||||
"default": 240,
|
||||
"propertyOrder": 6
|
||||
}
|
||||
},
|
||||
"additionalProperties" : false
|
||||
|
@@ -147,7 +147,6 @@
|
||||
"ledBlacklist": {
|
||||
"type": "array",
|
||||
"title": "conf_leds_layout_blacklist_rules_title",
|
||||
"minimum": 1,
|
||||
"uniqueItems": true,
|
||||
"items": {
|
||||
"type": "object",
|
||||
|
Reference in New Issue
Block a user