From 54929a0b598f06fbe026c5adc8b13a619abceb9d Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Wed, 4 Sep 2019 13:45:47 -0700 Subject: [PATCH] Disable video workaround for gstreamer crashes --- src/FlightDisplay/FlightDisplayViewVideo.qml | 102 +++++++++++-------- src/Settings/VideoSettings.h | 2 + 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/src/FlightDisplay/FlightDisplayViewVideo.qml b/src/FlightDisplay/FlightDisplayViewVideo.qml index 365c05713..8b2e2311f 100644 --- a/src/FlightDisplay/FlightDisplayViewVideo.qml +++ b/src/FlightDisplay/FlightDisplayViewVideo.qml @@ -72,53 +72,67 @@ Item { //-- Fit Width return _ar != 0.0 ? parent.width * (1 / _ar) : parent.height } - QGCVideoBackground { - id: videoContent - height: parent.getHeight() - width: parent.getWidth() - anchors.centerIn: parent - receiver: _videoReceiver - display: _videoReceiver && _videoReceiver.videoSurface - visible: _videoReceiver && _videoReceiver.videoRunning - Connections { - target: _videoReceiver - onImageFileChanged: { - videoContent.grabToImage(function(result) { - if (!result.saveToFile(_videoReceiver.imageFile)) { - console.error('Error capturing video frame'); - } - }); + Component { + id: videoBackgroundComponent + QGCVideoBackground { + id: videoContent + receiver: _videoReceiver + display: _videoReceiver && _videoReceiver.videoSurface + + Connections { + target: _videoReceiver + onImageFileChanged: { + videoContent.grabToImage(function(result) { + if (!result.saveToFile(_videoReceiver.imageFile)) { + console.error('Error capturing video frame'); + } + }); + } + } + Rectangle { + color: Qt.rgba(1,1,1,0.5) + height: parent.height + width: 1 + x: parent.width * 0.33 + visible: _showGrid && !QGroundControl.videoManager.fullScreen + } + Rectangle { + color: Qt.rgba(1,1,1,0.5) + height: parent.height + width: 1 + x: parent.width * 0.66 + visible: _showGrid && !QGroundControl.videoManager.fullScreen + } + Rectangle { + color: Qt.rgba(1,1,1,0.5) + width: parent.width + height: 1 + y: parent.height * 0.33 + visible: _showGrid && !QGroundControl.videoManager.fullScreen + } + Rectangle { + color: Qt.rgba(1,1,1,0.5) + width: parent.width + height: 1 + y: parent.height * 0.66 + visible: _showGrid && !QGroundControl.videoManager.fullScreen } - } - Rectangle { - color: Qt.rgba(1,1,1,0.5) - height: parent.height - width: 1 - x: parent.width * 0.33 - visible: _showGrid && !QGroundControl.videoManager.fullScreen - } - Rectangle { - color: Qt.rgba(1,1,1,0.5) - height: parent.height - width: 1 - x: parent.width * 0.66 - visible: _showGrid && !QGroundControl.videoManager.fullScreen - } - Rectangle { - color: Qt.rgba(1,1,1,0.5) - width: parent.width - height: 1 - y: parent.height * 0.33 - visible: _showGrid && !QGroundControl.videoManager.fullScreen - } - Rectangle { - color: Qt.rgba(1,1,1,0.5) - width: parent.width - height: 1 - y: parent.height * 0.66 - visible: _showGrid && !QGroundControl.videoManager.fullScreen } } + Loader { + // GStreamer is causing crashes on Lenovo laptop OpenGL Intel drivers. In order to workaround this + // we don't load a QGCVideoBackground object when video is disabled. This prevents any video rendering + // code from running. Setting QGCVideoBackground.receiver/display = null does not work to prevent any + // video OpenGL from being generated. Hence the Loader to completely remove it. + height: parent.getHeight() + width: parent.getWidth() + anchors.centerIn: parent + visible: _videoReceiver && _videoReceiver.videoRunning + sourceComponent: videoDisabled ? null : videoBackgroundComponent + + property bool videoDisabled: QGroundControl.settingsManager.videoSettings.videoSource.rawValue === QGroundControl.settingsManager.videoSettings.disabledVideoSource + } + MouseArea { anchors.fill: parent onDoubleClicked: { diff --git a/src/Settings/VideoSettings.h b/src/Settings/VideoSettings.h index a419b6a95..7288e0cf0 100644 --- a/src/Settings/VideoSettings.h +++ b/src/Settings/VideoSettings.h @@ -40,12 +40,14 @@ public: Q_PROPERTY(QString udpVideoSource READ udpVideoSource CONSTANT) Q_PROPERTY(QString tcpVideoSource READ tcpVideoSource CONSTANT) Q_PROPERTY(QString mpegtsVideoSource READ mpegtsVideoSource CONSTANT) + Q_PROPERTY(QString disabledVideoSource READ disabledVideoSource CONSTANT) bool streamConfigured (); QString rtspVideoSource () { return videoSourceRTSP; } QString udpVideoSource () { return videoSourceUDP; } QString tcpVideoSource () { return videoSourceTCP; } QString mpegtsVideoSource () { return videoSourceMPEGTS; } + QString disabledVideoSource () { return videoDisabled; } static const char* videoSourceNoVideo; static const char* videoDisabled; -- 2.22.0