Unverified Commit 1a668297 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #8551 from Williangalvani/low-latency

Add Low latency mode for video
parents f3515268 ef675ec9
...@@ -117,5 +117,12 @@ ...@@ -117,5 +117,12 @@
"longDescription": "Disable Video Stream when disarmed.", "longDescription": "Disable Video Stream when disarmed.",
"type": "bool", "type": "bool",
"defaultValue": false "defaultValue": false
},
{
"name": "lowLatencyMode",
"shortDescription": "Tweaks video for lower latency",
"longDescription": "If this option is enabled, the rtpjitterbuffer is removed and the video sink is set to assynchronous mode, reducing the latency by about 200 ms.",
"type": "bool",
"defaultValue": false
} }
] ]
...@@ -82,6 +82,7 @@ DECLARE_SETTINGSFACT(VideoSettings, enableStorageLimit) ...@@ -82,6 +82,7 @@ DECLARE_SETTINGSFACT(VideoSettings, enableStorageLimit)
DECLARE_SETTINGSFACT(VideoSettings, rtspTimeout) DECLARE_SETTINGSFACT(VideoSettings, rtspTimeout)
DECLARE_SETTINGSFACT(VideoSettings, streamEnabled) DECLARE_SETTINGSFACT(VideoSettings, streamEnabled)
DECLARE_SETTINGSFACT(VideoSettings, disableWhenDisarmed) DECLARE_SETTINGSFACT(VideoSettings, disableWhenDisarmed)
DECLARE_SETTINGSFACT(VideoSettings, lowLatencyMode)
DECLARE_SETTINGSFACT_NO_FUNC(VideoSettings, videoSource) DECLARE_SETTINGSFACT_NO_FUNC(VideoSettings, videoSource)
{ {
......
...@@ -34,6 +34,7 @@ public: ...@@ -34,6 +34,7 @@ public:
DEFINE_SETTINGFACT(rtspTimeout) DEFINE_SETTINGFACT(rtspTimeout)
DEFINE_SETTINGFACT(streamEnabled) DEFINE_SETTINGFACT(streamEnabled)
DEFINE_SETTINGFACT(disableWhenDisarmed) DEFINE_SETTINGFACT(disableWhenDisarmed)
DEFINE_SETTINGFACT(lowLatencyMode)
Q_PROPERTY(bool streamConfigured READ streamConfigured NOTIFY streamConfiguredChanged) Q_PROPERTY(bool streamConfigured READ streamConfigured NOTIFY streamConfiguredChanged)
Q_PROPERTY(QString rtspVideoSource READ rtspVideoSource CONSTANT) Q_PROPERTY(QString rtspVideoSource READ rtspVideoSource CONSTANT)
......
...@@ -521,6 +521,7 @@ void Vehicle::_commonInit() ...@@ -521,6 +521,7 @@ void Vehicle::_commonInit()
// Set video stream to udp if running ArduSub and Video is disabled // Set video stream to udp if running ArduSub and Video is disabled
if (sub() && _settingsManager->videoSettings()->videoSource()->rawValue() == VideoSettings::videoDisabled) { if (sub() && _settingsManager->videoSettings()->videoSource()->rawValue() == VideoSettings::videoDisabled) {
_settingsManager->videoSettings()->videoSource()->setRawValue(VideoSettings::videoSourceUDPH264); _settingsManager->videoSettings()->videoSource()->setRawValue(VideoSettings::videoSourceUDPH264);
_settingsManager->videoSettings()->lowLatencyMode()->setRawValue(true);
} }
//-- Airspace Management //-- Airspace Management
......
...@@ -60,6 +60,7 @@ VideoManager::setToolbox(QGCToolbox *toolbox) ...@@ -60,6 +60,7 @@ VideoManager::setToolbox(QGCToolbox *toolbox)
connect(_videoSettings->rtspUrl(), &Fact::rawValueChanged, this, &VideoManager::_rtspUrlChanged); connect(_videoSettings->rtspUrl(), &Fact::rawValueChanged, this, &VideoManager::_rtspUrlChanged);
connect(_videoSettings->tcpUrl(), &Fact::rawValueChanged, this, &VideoManager::_tcpUrlChanged); connect(_videoSettings->tcpUrl(), &Fact::rawValueChanged, this, &VideoManager::_tcpUrlChanged);
connect(_videoSettings->aspectRatio(), &Fact::rawValueChanged, this, &VideoManager::_aspectRatioChanged); connect(_videoSettings->aspectRatio(), &Fact::rawValueChanged, this, &VideoManager::_aspectRatioChanged);
connect(_videoSettings->lowLatencyMode(),&Fact::rawValueChanged, this, &VideoManager::_lowLatencyModeChanged);
MultiVehicleManager *pVehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); MultiVehicleManager *pVehicleMgr = qgcApp()->toolbox()->multiVehicleManager();
connect(pVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &VideoManager::_setActiveVehicle); connect(pVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &VideoManager::_setActiveVehicle);
...@@ -228,6 +229,13 @@ VideoManager::_tcpUrlChanged() ...@@ -228,6 +229,13 @@ VideoManager::_tcpUrlChanged()
restartVideo(); restartVideo();
} }
//-----------------------------------------------------------------------------
void
VideoManager::_lowLatencyModeChanged()
{
restartVideo();
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool bool
VideoManager::hasVideo() VideoManager::hasVideo()
......
...@@ -97,6 +97,7 @@ protected slots: ...@@ -97,6 +97,7 @@ protected slots:
void _udpPortChanged (); void _udpPortChanged ();
void _rtspUrlChanged (); void _rtspUrlChanged ();
void _tcpUrlChanged (); void _tcpUrlChanged ();
void _lowLatencyModeChanged ();
void _updateUVC (); void _updateUVC ();
void _setActiveVehicle (Vehicle* vehicle); void _setActiveVehicle (Vehicle* vehicle);
void _aspectRatioChanged (); void _aspectRatioChanged ();
......
...@@ -395,7 +395,7 @@ VideoReceiver::_makeSource(const QString& uri) ...@@ -395,7 +395,7 @@ VideoReceiver::_makeSource(const QString& uri)
gst_element_foreach_src_pad(source, _padProbe, &probeRes); gst_element_foreach_src_pad(source, _padProbe, &probeRes);
if (probeRes & 1) { if (probeRes & 1) {
if (probeRes & 2) { if (probeRes & 2 && !_videoSettings->lowLatencyMode()->rawValue().toBool()) {
if ((buffer = gst_element_factory_make("rtpjitterbuffer", nullptr)) == nullptr) { if ((buffer = gst_element_factory_make("rtpjitterbuffer", nullptr)) == nullptr) {
qCCritical(VideoReceiverLog) << "gst_element_factory_make('rtpjitterbuffer') failed"; qCCritical(VideoReceiverLog) << "gst_element_factory_make('rtpjitterbuffer') failed";
break; break;
...@@ -414,7 +414,11 @@ VideoReceiver::_makeSource(const QString& uri) ...@@ -414,7 +414,11 @@ VideoReceiver::_makeSource(const QString& uri)
} }
} }
} else { } else {
g_signal_connect(source, "pad-added", G_CALLBACK(_linkPadWithOptionalBuffer), parser); if (_videoSettings->lowLatencyMode()->rawValue().toBool()) {
g_signal_connect(source, "pad-added", G_CALLBACK(newPadCB), parser);
} else {
g_signal_connect(source, "pad-added", G_CALLBACK(_linkPadWithOptionalBuffer), parser);
}
} }
g_signal_connect(parser, "pad-added", G_CALLBACK(_wrapWithGhostPad), nullptr); g_signal_connect(parser, "pad-added", G_CALLBACK(_wrapWithGhostPad), nullptr);
...@@ -568,6 +572,9 @@ VideoReceiver::start() ...@@ -568,6 +572,9 @@ VideoReceiver::start()
qCWarning(VideoReceiverLog) << "Failed because video sink is not set"; qCWarning(VideoReceiverLog) << "Failed because video sink is not set";
return; return;
} }
g_object_set(_videoSink, "sync", !_videoSettings->lowLatencyMode()->rawValue().toBool(), NULL);
if(_running) { if(_running) {
qCDebug(VideoReceiverLog) << "Already running!"; qCDebug(VideoReceiverLog) << "Already running!";
return; return;
......
...@@ -1028,6 +1028,16 @@ Rectangle { ...@@ -1028,6 +1028,16 @@ Rectangle {
fact: QGroundControl.settingsManager.videoSettings.disableWhenDisarmed fact: QGroundControl.settingsManager.videoSettings.disableWhenDisarmed
visible: _isGst && QGroundControl.settingsManager.videoSettings.disableWhenDisarmed.visible visible: _isGst && QGroundControl.settingsManager.videoSettings.disableWhenDisarmed.visible
} }
QGCLabel {
text: qsTr("Low Latency Mode")
visible: _isGst && QGroundControl.settingsManager.videoSettings.lowLatencyMode.visible
}
FactCheckBox {
text: ""
fact: QGroundControl.settingsManager.videoSettings.lowLatencyMode
visible: _isGst && QGroundControl.settingsManager.videoSettings.lowLatencyMode.visible
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment