From 456cccd9cf26fa584b3a5a6cfe8523423dd75d2d Mon Sep 17 00:00:00 2001 From: Paulchen Panther Date: Tue, 26 Jan 2021 20:01:23 +0100 Subject: [PATCH] -Reload MF Grabber only once per WebUI update - Cleanup --- include/grabber/MFGrabber.h | 13 +- include/grabber/MFThread.h | 20 +-- include/grabber/MFWrapper.h | 16 +-- include/hyperion/Grabber.h | 7 +- libsrc/grabber/mediafoundation/MFGrabber.cpp | 114 +++++++----------- .../mediafoundation/MFSourceReaderCB.h | 8 +- libsrc/grabber/mediafoundation/MFThread.cpp | 27 +---- libsrc/grabber/mediafoundation/MFWrapper.cpp | 44 ++++--- libsrc/hyperion/GrabberWrapper.cpp | 2 +- src/hyperiond/hyperiond.cpp | 5 +- 10 files changed, 109 insertions(+), 147 deletions(-) diff --git a/include/grabber/MFGrabber.h b/include/grabber/MFGrabber.h index 4644ca66..a8a4219e 100644 --- a/include/grabber/MFGrabber.h +++ b/include/grabber/MFGrabber.h @@ -56,7 +56,7 @@ public: QList valid = QList(); }; - MFGrabber(const QString & device, const unsigned width, const unsigned height, const unsigned fps, const unsigned input, int pixelDecimation, QString flipMode); + MFGrabber(const QString & device, const unsigned width, const unsigned height, const unsigned fps, int pixelDecimation, QString flipMode); ~MFGrabber() override; void receive_image(const void *frameImageBuffer, int size); @@ -74,14 +74,15 @@ public: void setSignalDetectionEnable(bool enable) override; void setPixelDecimation(int pixelDecimation) override; void setCecDetectionEnable(bool enable) override; - void setDeviceVideoStandard(QString device, VideoStandard videoStandard) override; - bool setInput(int input) override; + bool setDevice(QString device) override; bool setWidthHeight(int width, int height) override; bool setFramerate(int fps) override; void setFpsSoftwareDecimation(int decimation); - void setEncoding(QString enc); + bool setEncoding(QString enc); void setFlipMode(QString flipMode); - void setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue); + bool setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue); + + void reloadGrabber(); public slots: bool start(); @@ -105,7 +106,7 @@ private: QMap _deviceProperties; HRESULT _hr; SourceReaderCB* _sourceReaderCB; - PixelFormat _pixelFormat; + PixelFormat _pixelFormat, _pixelFormatConfig; int _pixelDecimation, _lineLength, _frameByteSize, diff --git a/include/grabber/MFThread.h b/include/grabber/MFThread.h index 52f93776..567870d1 100644 --- a/include/grabber/MFThread.h +++ b/include/grabber/MFThread.h @@ -51,25 +51,15 @@ private: tjtransform* _xform; #endif - static volatile bool _isActive; + static volatile bool _isActive; volatile bool _isBusy; QSemaphore _semaphore; unsigned int _threadIndex; PixelFormat _pixelFormat; - uint8_t* _localData; - int _localDataSize, - _scalingFactorsCount, - _size, - _width, - _height, - _lineLength, - _subsamp, - _currentFrame, - _pixelDecimation; - unsigned _cropLeft, - _cropTop, - _cropBottom, - _cropRight; + uint8_t* _localData, *_flipBuffer; + int _scalingFactorsCount, _width, _height, _lineLength, _subsamp, _currentFrame, _pixelDecimation; + unsigned long _size; + unsigned _cropLeft, _cropTop, _cropBottom, _cropRight; FlipMode _flipMode; ImageResampler _imageResampler; }; diff --git a/include/grabber/MFWrapper.h b/include/grabber/MFWrapper.h index d373f557..9b1d53dc 100644 --- a/include/grabber/MFWrapper.h +++ b/include/grabber/MFWrapper.h @@ -8,7 +8,7 @@ class MFWrapper : public GrabberWrapper Q_OBJECT public: - MFWrapper(const QString & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned fps, const unsigned input, int pixelDecimation, QString flipMode); + MFWrapper(const QString & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned fps, int pixelDecimation, QString flipMode); ~MFWrapper() override; bool getSignalDetectionEnable() const; @@ -23,17 +23,11 @@ public slots: void setSignalDetectionOffset(double verticalMin, double horizontalMin, double verticalMax, double horizontalMax); void setSignalDetectionEnable(bool enable); void setCecDetectionEnable(bool enable); - void setDeviceVideoStandard(const QString& device, VideoStandard videoStandard); - void handleSettingsUpdate(settings::type type, const QJsonDocument& config) override; - - /// - /// @brief set software decimation (v4l2) - /// + bool setDevice(const QString& device); void setFpsSoftwareDecimation(int decimation); - - void setEncoding(QString enc); - - void setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue); + bool setEncoding(QString enc); + bool setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue); + void handleSettingsUpdate(settings::type type, const QJsonDocument& config) override; private slots: void newFrame(const Image & image); diff --git a/include/hyperion/Grabber.h b/include/hyperion/Grabber.h index 93dd1d47..dd4a5e83 100644 --- a/include/hyperion/Grabber.h +++ b/include/hyperion/Grabber.h @@ -92,10 +92,15 @@ public: virtual void setCecDetectionEnable(bool enable) {} /// - /// @brief Apply device and videoStanded (used from v4l) + /// @brief Apply device and videoStandard (used from v4l) /// virtual void setDeviceVideoStandard(QString device, VideoStandard videoStandard) {} + /// + /// @brief Apply device (used from MediaFoundation) + /// + virtual bool setDevice(QString device) { return false; } + /// /// @brief Apply display index (used from qt) /// diff --git a/libsrc/grabber/mediafoundation/MFGrabber.cpp b/libsrc/grabber/mediafoundation/MFGrabber.cpp index 18f59996..0e40a9ac 100644 --- a/libsrc/grabber/mediafoundation/MFGrabber.cpp +++ b/libsrc/grabber/mediafoundation/MFGrabber.cpp @@ -4,7 +4,7 @@ // Constants namespace { const bool verbose = false; } -MFGrabber::MFGrabber(const QString & device, unsigned width, unsigned height, unsigned fps, unsigned input, int pixelDecimation, QString flipMode) +MFGrabber::MFGrabber(const QString & device, unsigned width, unsigned height, unsigned fps, int pixelDecimation, QString flipMode) : Grabber("V4L2:"+device) , _deviceName(device) , _hr(S_FALSE) @@ -30,11 +30,9 @@ MFGrabber::MFGrabber(const QString & device, unsigned width, unsigned height, un , _x_frac_max(0.75) , _y_frac_max(0.75) { - setInput(input); setWidthHeight(width, height); setFramerate(fps); setFlipMode(flipMode); - // setDeviceVideoStandard(device, videoStandard); // TODO CoInitializeEx(0, COINIT_MULTITHREADED); _hr = MFStartup(MF_VERSION, MFSTARTUP_NOSOCKET); @@ -178,7 +176,8 @@ HRESULT MFGrabber::init_device(QString deviceName, DevicePropertiesItem props) IMFMediaType* type = nullptr; HRESULT hr = S_OK; - Debug(_log, "Init %s, %d x %d @ %d fps (%s) => %s", QSTRING_CSTR(deviceName), props.x, props.y, props.fps, QSTRING_CSTR(pixelFormatToString(pixelformat)), QSTRING_CSTR(guid)); + Debug(_log, "Init %s, %d x %d @ %d fps (%s)", QSTRING_CSTR(deviceName), props.x, props.y, props.fps, QSTRING_CSTR(pixelFormatToString(pixelformat))); + DebugIf(verbose, _log, "Symbolic link: %s", QSTRING_CSTR(guid)); hr = MFCreateAttributes(&deviceAttributes, 2); if(FAILED(hr)) @@ -426,7 +425,7 @@ void MFGrabber::enumVideoCaptureDevices() IMFActivate** devices; if(SUCCEEDED(MFEnumDeviceSources(attr, &devices, &count))) { - Debug(_log, "Detected devices: %u", count); + DebugIf(verbose, _log, "Detected devices: %u", count); for(UINT32 i = 0; i < count; i++) { UINT32 length; @@ -441,7 +440,7 @@ void MFGrabber::enumVideoCaptureDevices() MFGrabber::DeviceProperties properties; properties.name = QString::fromUtf16((const ushort*)symlink); - Info(_log, "Found capture device: %s", QSTRING_CSTR(dev)); + Debug(_log, "Found capture device: %s", QSTRING_CSTR(dev)); IMFMediaSource *pSource = nullptr; if(SUCCEEDED(devices[i]->ActivateObject(IID_PPV_ARGS(&pSource)))) { @@ -523,7 +522,7 @@ void MFGrabber::enumVideoCaptureDevices() void MFGrabber::start_capturing() { - if (_sourceReader) + if (_initialized && _sourceReader) { HRESULT hr = _sourceReader->ReadSample(MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, NULL, NULL, NULL, NULL); if (!SUCCEEDED(hr)) @@ -610,7 +609,7 @@ bool MFGrabber::start() try { _threadManager.start(); - Info(_log, "Decoding threads: %d",_threadManager._maxThreads); + DebugIf(verbose, _log, "Decoding threads: %d",_threadManager._maxThreads); if(init()) { @@ -631,10 +630,11 @@ void MFGrabber::stop() { if(_initialized) { + _initialized = false; _threadManager.stop(); uninit_device(); + _pixelFormat = _pixelFormatConfig; _deviceProperties.clear(); - _initialized = false; Info(_log, "Stopped"); } } @@ -741,6 +741,16 @@ void MFGrabber::setCecDetectionEnable(bool enable) } } +bool MFGrabber::setDevice(QString device) +{ + if(_deviceName != device) + { + _deviceName = device; + return true; + } + return false; +} + void MFGrabber::setPixelDecimation(int pixelDecimation) { if(_pixelDecimation != pixelDecimation) @@ -753,46 +763,11 @@ void MFGrabber::setFlipMode(QString flipMode) Grabber::setFlipMode(parseFlipMode(flipMode)); } -void MFGrabber::setDeviceVideoStandard(QString device, VideoStandard videoStandard) -{ - if(_deviceName != device) - { - _deviceName = device; - if(_initialized && !device.isEmpty()) - { - Debug(_log,"Restarting Media Foundation grabber"); - uninit(); - start(); - } - } -} - -bool MFGrabber::setInput(int input) -{ - if(Grabber::setInput(input)) - { - bool started = _initialized; - uninit(); - if(started) - start(); - - return true; - } - - return false; -} - bool MFGrabber::setWidthHeight(int width, int height) { - if(Grabber::setWidthHeight(width,height)) + if(Grabber::setWidthHeight(width, height)) { - Debug(_log,"Set width:height to: %i:&i", width, height); - if(_initialized) - { - Debug(_log,"Restarting Media Foundation grabber"); - uninit(); - start(); - } + Debug(_log,"Set width:height to: %i:%i", width, height); return true; } return false; @@ -803,12 +778,6 @@ bool MFGrabber::setFramerate(int fps) if(Grabber::setFramerate(fps)) { Debug(_log,"Set fps to: %i", fps); - if(_initialized) - { - Debug(_log,"Restarting Media Foundation grabber"); - uninit(); - start(); - } return true; } return false; @@ -821,22 +790,20 @@ void MFGrabber::setFpsSoftwareDecimation(int decimation) Debug(_log,"Every %ith image per second are processed", decimation); } -void MFGrabber::setEncoding(QString enc) +bool MFGrabber::setEncoding(QString enc) { - if(_pixelFormat != parsePixelFormat(enc)) + if(_pixelFormatConfig != parsePixelFormat(enc)) { - Debug(_log,"Set encoding to: %s", QSTRING_CSTR(enc)); - _pixelFormat = parsePixelFormat(enc); - if(_initialized) - { - Debug(_log,"Restarting Media Foundation Grabber"); - uninit(); - start(); - } + Debug(_log,"Set hardware encoding to: %s", QSTRING_CSTR(enc.toUpper())); + _pixelFormatConfig = parsePixelFormat(enc); + if(!_initialized) + _pixelFormat = _pixelFormatConfig; + return true; } + return false; } -void MFGrabber::setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue) +bool MFGrabber::setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue) { if(_brightness != brightness || _contrast != contrast || _saturation != saturation || _hue != hue) { @@ -846,12 +813,21 @@ void MFGrabber::setBrightnessContrastSaturationHue(int brightness, int contrast, _hue = hue; Debug(_log,"Set brightness to %i, contrast to %i, saturation to %i, hue to %i", _brightness, _contrast, _saturation, _hue); + return true; + } + return false; +} - if(_initialized) - { - Debug(_log,"Restarting Media Foundation Grabber"); - uninit(); - start(); - } +void MFGrabber::reloadGrabber() +{ + if(_initialized) + { + Debug(_log,"Reloading Media Foundation Grabber"); + // stop grabber + uninit(); + // restore pixelformat to configs value + _pixelFormat = _pixelFormatConfig; + // start grabber + start(); } } diff --git a/libsrc/grabber/mediafoundation/MFSourceReaderCB.h b/libsrc/grabber/mediafoundation/MFSourceReaderCB.h index efbccb3c..2b78832f 100644 --- a/libsrc/grabber/mediafoundation/MFSourceReaderCB.h +++ b/libsrc/grabber/mediafoundation/MFSourceReaderCB.h @@ -331,7 +331,13 @@ public: STDMETHODIMP OnFlush(DWORD) { return S_OK; } private: - virtual ~SourceReaderCB() {} + virtual ~SourceReaderCB() + { + _transform->ProcessMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM, 0); + _transform->ProcessMessage(MFT_MESSAGE_NOTIFY_END_STREAMING, 0); + SAFE_RELEASE(_transform); + } + void NotifyError(HRESULT hr) { Error(_grabber->_log, "Source Reader error"); } private: diff --git a/libsrc/grabber/mediafoundation/MFThread.cpp b/libsrc/grabber/mediafoundation/MFThread.cpp index 44d28ab3..5c8c7345 100644 --- a/libsrc/grabber/mediafoundation/MFThread.cpp +++ b/libsrc/grabber/mediafoundation/MFThread.cpp @@ -6,7 +6,6 @@ MFThread::MFThread() : _isBusy(false) , _semaphore(1) , _localData(nullptr) - , _localDataSize(0) , _scalingFactorsCount(0) , _scalingFactors(nullptr) , _transform(nullptr) @@ -28,7 +27,6 @@ MFThread::~MFThread() { free(_localData); _localData = nullptr; - _localDataSize = 0; } } @@ -41,7 +39,7 @@ void MFThread::setup( _threadIndex = threadIndex; _lineLength = lineLength; _pixelFormat = pixelFormat; - _size = size; + _size = (unsigned long) size; _width = width; _height = height; _subsamp = subsamp; @@ -59,15 +57,10 @@ void MFThread::setup( _imageResampler.setHorizontalPixelDecimation(_pixelDecimation); _imageResampler.setVerticalPixelDecimation(_pixelDecimation); - if (size > _localDataSize) - { - if (_localData) - tjFree(_localData); - - _localData = (uint8_t*)tjAlloc(size + 1); - _localDataSize = size; - } + if (_localData) + tjFree(_localData); + _localData = (uint8_t*)tjAlloc(size + 1); memcpy(_localData, sharedData, size); } @@ -121,21 +114,13 @@ void MFThread::processImageMjpeg() if (_flipMode == FlipMode::BOTH || _flipMode == FlipMode::HORIZONTAL) { _xform->op = TJXOP_HFLIP; - uint8_t* dstBuf = nullptr; - unsigned long dstSize = 0; - tjTransform(_transform, _localData, _size, 1, &dstBuf, &dstSize, _xform, TJFLAG_FASTDCT | TJFLAG_FASTUPSAMPLE); - _localData = dstBuf; - _size = dstSize; + tjTransform(_transform, _localData, _size, 1, &_localData, &_size, _xform, TJFLAG_FASTDCT | TJFLAG_FASTUPSAMPLE); } if (_flipMode == FlipMode::BOTH || _flipMode == FlipMode::VERTICAL) { _xform->op = TJXOP_VFLIP; - uint8_t *dstBuf = nullptr; - unsigned long dstSize = 0; - tjTransform(_transform, _localData, _size, 1, &dstBuf, &dstSize, _xform, TJFLAG_FASTDCT | TJFLAG_FASTUPSAMPLE); - _localData = dstBuf; - _size = dstSize; + tjTransform(_transform, _localData, _size, 1, &_localData, &_size, _xform, TJFLAG_FASTDCT | TJFLAG_FASTUPSAMPLE); } if (!_decompress) diff --git a/libsrc/grabber/mediafoundation/MFWrapper.cpp b/libsrc/grabber/mediafoundation/MFWrapper.cpp index f4801b91..53625a52 100644 --- a/libsrc/grabber/mediafoundation/MFWrapper.cpp +++ b/libsrc/grabber/mediafoundation/MFWrapper.cpp @@ -5,9 +5,9 @@ // qt #include -MFWrapper::MFWrapper(const QString &device, unsigned grabWidth, unsigned grabHeight, unsigned fps, unsigned input, int pixelDecimation, QString flipMode) +MFWrapper::MFWrapper(const QString &device, unsigned grabWidth, unsigned grabHeight, unsigned fps, int pixelDecimation, QString flipMode) : GrabberWrapper("V4L2:"+device, &_grabber, grabWidth, grabHeight, 10) - , _grabber(device, grabWidth, grabHeight, fps, input, pixelDecimation, flipMode) + , _grabber(device, grabWidth, grabHeight, fps, pixelDecimation, flipMode) { _ggrabber = &_grabber; @@ -79,9 +79,9 @@ bool MFWrapper::getCecDetectionEnable() const return _grabber.getCecDetectionEnabled(); } -void MFWrapper::setDeviceVideoStandard(const QString& device, VideoStandard videoStandard) +bool MFWrapper::setDevice(const QString& device) { - _grabber.setDeviceVideoStandard(device, VideoStandard::NO_CHANGE); + return _grabber.setDevice(device); } void MFWrapper::setFpsSoftwareDecimation(int decimation) @@ -89,14 +89,14 @@ void MFWrapper::setFpsSoftwareDecimation(int decimation) _grabber.setFpsSoftwareDecimation(decimation); } -void MFWrapper::setEncoding(QString enc) +bool MFWrapper::setEncoding(QString enc) { - _grabber.setEncoding(enc); + return _grabber.setEncoding(enc); } -void MFWrapper::setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue) +bool MFWrapper::setBrightnessContrastSaturationHue(int brightness, int contrast, int saturation, int hue) { - _grabber.setBrightnessContrastSaturationHue(brightness, contrast, saturation, hue); + return _grabber.setBrightnessContrastSaturationHue(brightness, contrast, saturation, hue); } void MFWrapper::handleSettingsUpdate(settings::type type, const QJsonDocument& config) @@ -105,20 +105,23 @@ void MFWrapper::handleSettingsUpdate(settings::type type, const QJsonDocument& c { // extract settings const QJsonObject& obj = config.object(); + // reload state + bool reload = false; // device name, video standard - _grabber.setDeviceVideoStandard( - obj["device"].toString("auto"), - parseVideoStandard(obj["standard"].toString("no-change"))); + if (_grabber.setDevice(obj["device"].toString("auto"))) + reload = true; // device input _grabber.setInput(obj["input"].toInt(-1)); // device resolution - _grabber.setWidthHeight(obj["width"].toInt(0), obj["height"].toInt(0)); + if (_grabber.setWidthHeight(obj["width"].toInt(0), obj["height"].toInt(0))) + reload = true; // device framerate - _grabber.setFramerate(obj["fps"].toInt(15)); + if (_grabber.setFramerate(obj["fps"].toInt(15))) + reload = true; // image size decimation _grabber.setPixelDecimation(obj["sizeDecimation"].toInt(8)); @@ -134,10 +137,8 @@ void MFWrapper::handleSettingsUpdate(settings::type type, const QJsonDocument& c obj["cropBottom"].toInt(0)); // Brightness, Contrast, Saturation, Hue - _grabber.setBrightnessContrastSaturationHue(obj["hardware_brightness"].toInt(0), - obj["hardware_contrast"].toInt(0), - obj["hardware_saturation"].toInt(0), - obj["hardware_hue"].toInt(0)); + if (_grabber.setBrightnessContrastSaturationHue(obj["hardware_brightness"].toInt(0), obj["hardware_contrast"].toInt(0), obj["hardware_saturation"].toInt(0), obj["hardware_hue"].toInt(0))) + reload = true; // CEC Standby _grabber.setCecDetectionEnable(obj["cecDetection"].toBool(true)); @@ -146,6 +147,7 @@ void MFWrapper::handleSettingsUpdate(settings::type type, const QJsonDocument& c _grabber.setFpsSoftwareDecimation(obj["fpsSoftwareDecimation"].toInt(1)); // Signal detection + _grabber.setSignalDetectionEnable(obj["signalDetection"].toBool(true)); _grabber.setSignalDetectionOffset( obj["sDHOffsetMin"].toDouble(0.25), obj["sDVOffsetMin"].toDouble(0.25), @@ -156,9 +158,13 @@ void MFWrapper::handleSettingsUpdate(settings::type type, const QJsonDocument& c obj["greenSignalThreshold"].toDouble(0.0)/100.0, obj["blueSignalThreshold"].toDouble(0.0)/100.0, obj["noSignalCounterThreshold"].toInt(50) ); - _grabber.setSignalDetectionEnable(obj["signalDetection"].toBool(true)); // Hardware encoding format - _grabber.setEncoding(obj["encoding"].toString("NO_CHANGE")); + if (_grabber.setEncoding(obj["encoding"].toString("NO_CHANGE"))) + reload = true; + + // Reload the Grabber if any settings have been changed that require it + if (reload) + _grabber.reloadGrabber(); } } diff --git a/libsrc/hyperion/GrabberWrapper.cpp b/libsrc/hyperion/GrabberWrapper.cpp index f3f79583..a287b208 100644 --- a/libsrc/hyperion/GrabberWrapper.cpp +++ b/libsrc/hyperion/GrabberWrapper.cpp @@ -15,7 +15,7 @@ GrabberWrapper::GrabberWrapper(const QString& grabberName, Grabber * ggrabber, u : _grabberName(grabberName) , _timer(new QTimer(this)) , _updateInterval_ms(1000/updateRate_Hz) - , _log(Logger::getInstance(grabberName)) + , _log(Logger::getInstance(grabberName.toUpper())) , _ggrabber(ggrabber) , _image(0,0) { diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index a2efe55c..29a82d5e 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -604,7 +604,6 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs grabberConfig["width"].toInt(0), grabberConfig["height"].toInt(0), grabberConfig["fps"].toInt(15), - grabberConfig["input"].toInt(-1), grabberConfig["sizeDecimation"].toInt(8), grabberConfig["flip"].toString("auto")); @@ -619,9 +618,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs _mfGrabber->setFpsSoftwareDecimation(grabberConfig["fpsSoftwareDecimation"].toInt(1)); // Hardware encoding format - _mfGrabber->setEncoding(grabberConfig["encoding"].toString("NONE")); + _mfGrabber->setEncoding(grabberConfig["encoding"].toString("NO_CHANGE")); // Signal detection + _mfGrabber->setSignalDetectionEnable(grabberConfig["signalDetection"].toBool(true)); _mfGrabber->setSignalDetectionOffset( grabberConfig["sDHOffsetMin"].toDouble(0.25), grabberConfig["sDVOffsetMin"].toDouble(0.25), @@ -632,7 +632,6 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs grabberConfig["greenSignalThreshold"].toDouble(0.0) / 100.0, grabberConfig["blueSignalThreshold"].toDouble(0.0) / 100.0, grabberConfig["noSignalCounterThreshold"].toInt(50) ); - _mfGrabber->setSignalDetectionEnable(grabberConfig["signalDetection"].toBool(true)); // CEC Standby _mfGrabber->setCecDetectionEnable(grabberConfig["cecDetection"].toBool(true));