From 0818cfe4e72ac682d2dac028b9928dd6e7551306 Mon Sep 17 00:00:00 2001 From: dogmaphobic Date: Wed, 28 Oct 2015 00:45:20 -0400 Subject: [PATCH] Detect video stream. --- src/FlightDisplay/FlightDisplayView.qml | 4 -- .../FlightDisplayViewController.cc | 33 ++++++++++++ .../FlightDisplayViewController.h | 15 ++++++ src/FlightDisplay/FlightDisplayViewVideo.qml | 50 ++++++++++++------- src/FlightMap/QGCVideoBackground.qml | 7 +-- src/VideoStreaming/VideoSurface.cc | 2 + src/VideoStreaming/VideoSurface.h | 3 ++ 7 files changed, 90 insertions(+), 24 deletions(-) diff --git a/src/FlightDisplay/FlightDisplayView.qml b/src/FlightDisplay/FlightDisplayView.qml index 26efdb2cd..873a84acf 100644 --- a/src/FlightDisplay/FlightDisplayView.qml +++ b/src/FlightDisplay/FlightDisplayView.qml @@ -114,7 +114,6 @@ Item { _flightMap.updateMapPosition(true /* force */) } else { _flightVideo = item - _flightVideo.visible = true } } } @@ -144,20 +143,17 @@ Item { onLoaded: { if(_mainIsMap) { _flightVideo = item - _flightVideo.visible = true } else { _flightMap = item _savedZoomLevel = _flightMap.zoomLevel _flightMap.zoomLevel = _savedZoomLevel - 3 } - pip.visible = _controller.hasVideo } } MouseArea { anchors.fill: parent onClicked: { _mainIsMap = !_mainIsMap - pip.visible = false reloadContents(); QGroundControl.saveBoolGlobalSetting(_mainIsMapKey, _mainIsMap) } diff --git a/src/FlightDisplay/FlightDisplayViewController.cc b/src/FlightDisplay/FlightDisplayViewController.cc index c0ff3de87..387bc1215 100644 --- a/src/FlightDisplay/FlightDisplayViewController.cc +++ b/src/FlightDisplay/FlightDisplayViewController.cc @@ -34,6 +34,7 @@ const char* kMainFlightDisplayViewControllerGroup = "FlightDisplayViewController FlightDisplayViewController::FlightDisplayViewController(QObject *parent) : QObject(parent) + , _videoRunning(false) { /* * This is the receiving end of an UDP RTP stream. The sender can be setup with this command: @@ -65,6 +66,8 @@ FlightDisplayViewController::FlightDisplayViewController(QObject *parent) _videoReceiver->setUri(QLatin1Literal("udp://0.0.0.0:5000")); #if defined(QGC_GST_STREAMING) _videoReceiver->setVideoSink(_videoSurface->videoSink()); + connect(&_frameTimer, &QTimer::timeout, this, &FlightDisplayViewController::_updateTimer); + _frameTimer.start(1000); #endif } @@ -72,3 +75,33 @@ FlightDisplayViewController::~FlightDisplayViewController() { } + +#if defined(QGC_GST_STREAMING) +void FlightDisplayViewController::_updateTimer(void) +{ + if(_videoRunning) + { + time_t elapsed = 0; + if(_videoSurface) + { + elapsed = time(0) - _videoSurface->lastFrame(); + } + if(elapsed > 2) + { + _videoRunning = false; + _videoSurface->setLastFrame(0); + emit videoRunningChanged(); + } + } + else + { + if(_videoSurface && _videoSurface->lastFrame()) { + if(!_videoRunning) + { + _videoRunning = true; + emit videoRunningChanged(); + } + } + } +} +#endif diff --git a/src/FlightDisplay/FlightDisplayViewController.h b/src/FlightDisplay/FlightDisplayViewController.h index 87accb71e..5c62b8783 100644 --- a/src/FlightDisplay/FlightDisplayViewController.h +++ b/src/FlightDisplay/FlightDisplayViewController.h @@ -25,6 +25,7 @@ This file is part of the QGROUNDCONTROL project #define FlightDisplayViewController_H #include +#include #include "VideoSurface.h" #include "VideoReceiver.h" @@ -42,15 +43,29 @@ public: Q_PROPERTY(VideoSurface* videoSurface MEMBER _videoSurface CONSTANT); Q_PROPERTY(VideoReceiver* videoReceiver MEMBER _videoReceiver CONSTANT); + Q_PROPERTY(bool videoRunning READ videoRunning NOTIFY videoRunningChanged) + #if defined(QGC_GST_STREAMING) bool hasVideo () { return true; } #else bool hasVideo () { return false; } #endif + bool videoRunning() { return _videoRunning; } + +signals: + void videoRunningChanged(); + +private: + void _updateTimer(void); + private: VideoSurface* _videoSurface; VideoReceiver* _videoReceiver; + bool _videoRunning; +#if defined(QGC_GST_STREAMING) + QTimer _frameTimer; +#endif }; #endif diff --git a/src/FlightDisplay/FlightDisplayViewVideo.qml b/src/FlightDisplay/FlightDisplayViewVideo.qml index 8390277cf..94f945560 100644 --- a/src/FlightDisplay/FlightDisplayViewVideo.qml +++ b/src/FlightDisplay/FlightDisplayViewVideo.qml @@ -34,22 +34,38 @@ import QGroundControl.Vehicle 1.0 import QGroundControl.Controllers 1.0 -QGCVideoBackground { - anchors.fill: parent - display: _controller.videoSurface - receiver: _controller.videoReceiver - - /* TODO: Come up with a way to make this an option - QGCAttitudeHUD { - id: attitudeHUD - visible: !_mainIsMap - rollAngle: _roll - pitchAngle: _pitch - width: ScreenTools.defaultFontPixelSize * (30) - height: ScreenTools.defaultFontPixelSize * (30) - active: multiVehicleManager.activeVehicleAvailable - z: QGroundControl.zOrderWidgets +Item { + id: root + Rectangle { + id: noVideo + anchors.fill: parent + color: "black" + visible: !_controller.videoRunning + QGCLabel { + text: "NO VIDEO" + font.weight: Font.DemiBold + color: "white" + font.pixelSize: ScreenTools.defaultFontPixelSize * 1.5 + anchors.centerIn: parent + } + } + QGCVideoBackground { + anchors.fill: parent + display: _controller.videoSurface + receiver: _controller.videoReceiver + visible: _controller.videoRunning + runVideo: true + /* TODO: Come up with a way to make this an option + QGCAttitudeHUD { + id: attitudeHUD + visible: !_mainIsMap + rollAngle: _roll + pitchAngle: _pitch + width: ScreenTools.defaultFontPixelSize * (30) + height: ScreenTools.defaultFontPixelSize * (30) + active: multiVehicleManager.activeVehicleAvailable + z: QGroundControl.zOrderWidgets + } + */ } - */ - } diff --git a/src/FlightMap/QGCVideoBackground.qml b/src/FlightMap/QGCVideoBackground.qml index 639bba83f..ca62c142e 100644 --- a/src/FlightMap/QGCVideoBackground.qml +++ b/src/FlightMap/QGCVideoBackground.qml @@ -35,10 +35,11 @@ VideoItem { id: videoBackground property var display property var receiver + property var runVideo: false surface: display - onVisibleChanged: { + onRunVideoChanged: { if(videoBackground.receiver && videoBackground.display) { - if(videoBackground.visible) { + if(videoBackground.runVideo) { videoBackground.receiver.start(); } else { videoBackground.receiver.stop(); @@ -46,7 +47,7 @@ VideoItem { } } Component.onCompleted: { - if(videoBackground.visible && videoBackground.receiver) { + if(videoBackground.runVideo && videoBackground.receiver) { videoBackground.receiver.start(); } } diff --git a/src/VideoStreaming/VideoSurface.cc b/src/VideoStreaming/VideoSurface.cc index 9202f1984..b8612401d 100644 --- a/src/VideoStreaming/VideoSurface.cc +++ b/src/VideoStreaming/VideoSurface.cc @@ -39,6 +39,7 @@ VideoSurface::VideoSurface(QObject *parent) : QObject(parent) #if defined(QGC_GST_STREAMING) , _data(new VideoSurfacePrivate) + , _lastFrame(0) #endif { } @@ -68,6 +69,7 @@ GstElement* VideoSurface::videoSink() const void VideoSurface::onUpdate() { + _lastFrame = time(0); Q_FOREACH(QQuickItem *item, _data->items) { item->update(); } diff --git a/src/VideoStreaming/VideoSurface.h b/src/VideoStreaming/VideoSurface.h index deb140ad7..a307f7ac7 100644 --- a/src/VideoStreaming/VideoSurface.h +++ b/src/VideoStreaming/VideoSurface.h @@ -54,6 +54,8 @@ public: */ #if defined(QGC_GST_STREAMING) GstElement* videoSink() const; + time_t lastFrame() { return _lastFrame; } + void setLastFrame(time_t t) { _lastFrame = t; } #endif protected: @@ -66,6 +68,7 @@ private: friend class VideoItem; #if defined(QGC_GST_STREAMING) VideoSurfacePrivate * const _data; + time_t _lastFrame; #endif }; -- 2.22.0