diff --git a/src/Camera/QGCCameraControl.cc b/src/Camera/QGCCameraControl.cc index ffad98fcd0d1889d5388d4d0d7cf3b774bebf3ce..4fe1818acbce9c24115599fba3d6f880152f7540 100644 --- a/src/Camera/QGCCameraControl.cc +++ b/src/Camera/QGCCameraControl.cc @@ -10,6 +10,7 @@ #include "SettingsManager.h" #include "VideoManager.h" #include "QGCMapEngine.h" +#include "QGCCameraManager.h" #include #include @@ -153,21 +154,6 @@ QGCCameraControl::QGCCameraControl(const mavlink_camera_information_t *info, Veh : FactGroup(0, parent) , _vehicle(vehicle) , _compID(compID) - , _version(0) - , _cached(false) - , _paramComplete(false) - , _storageFree(0) - , _storageTotal(0) - , _netManager(nullptr) - , _cameraMode(CAM_MODE_UNDEFINED) - , _photoMode(PHOTO_CAPTURE_SINGLE) - , _photoLapse(1.0) - , _photoLapseCount(0) - , _video_status(VIDEO_CAPTURE_STATUS_UNDEFINED) - , _photo_status(PHOTO_CAPTURE_STATUS_UNDEFINED) - , _storageInfoRetries(0) - , _captureInfoRetries(0) - , _resetting(false) { QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); memcpy(&_info, info, sizeof(mavlink_camera_information_t)); @@ -190,6 +176,16 @@ QGCCameraControl::QGCCameraControl(const mavlink_camera_information_t *info, Veh _photoMode = static_cast(settings.value(kPhotoMode, static_cast(PHOTO_CAPTURE_SINGLE)).toInt()); _photoLapse = settings.value(kPhotoLapse, 1.0).toDouble(); _photoLapseCount = settings.value(kPhotoLapseCount, 0).toInt(); + //-- Check for video streaming + if(_info.flags & CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM) { + connect(&_streamInfoTimer, &QTimer::timeout, this, &QGCCameraControl::_streamTimeout); + _streamInfoTimer.setSingleShot(false); + connect(&_streamStatusTimer, &QTimer::timeout, this, &QGCCameraControl::_streamStatusTimeout); + _streamStatusTimer.setSingleShot(true); + //-- Request all streams + _requestStreamInfo(0); + _streamInfoTimer.start(2000); + } } //----------------------------------------------------------------------------- @@ -270,7 +266,11 @@ QGCCameraControl::setCameraMode(CameraMode mode) setPhotoMode(); } else { qCDebug(CameraControlLog) << "setCameraMode() Invalid mode:" << mode; - return; + } + //-- Update stream status + QGCVideoStreamInfo* pInfo = currentStreamInstance(); + if(pInfo) { + _requestStreamStatus(static_cast(pInfo->streamID())); } } } @@ -1386,7 +1386,7 @@ QGCCameraControl::handleSettings(const mavlink_camera_settings_t& settings) void QGCCameraControl::handleStorageInfo(const mavlink_storage_information_t& st) { - qCDebug(CameraControlLog) << "_handleStorageInfo:" << st.available_capacity << st.status << st.storage_count << st.storage_id << st.total_capacity << st.used_capacity; + qCDebug(CameraControlLog) << "handleStorageInfo:" << st.available_capacity << st.status << st.storage_count << st.storage_id << st.total_capacity << st.used_capacity; uint32_t t = static_cast(st.total_capacity); if(_storageTotal != t) { _storageTotal = t; @@ -1434,6 +1434,201 @@ QGCCameraControl::handleCaptureStatus(const mavlink_camera_capture_status_t& cap } } +//----------------------------------------------------------------------------- +void +QGCCameraControl::handleVideoInfo(const mavlink_video_stream_information_t* vi) +{ + qCDebug(CameraControlLog) << "handleVideoInfo:" << vi->stream_id << vi->uri; + _expectedCount = vi->count; + if(!_findStream(vi->stream_id)) { + QGCVideoStreamInfo* pStream = new QGCVideoStreamInfo(this, vi); + QQmlEngine::setObjectOwnership(pStream, QQmlEngine::CppOwnership); + _streams.append(pStream); + emit streamsChanged(); + } + //-- Check for missing count + if(_streams.count() < _expectedCount) { + _streamInfoTimer.start(1000); + } else { + //-- Done + _streamInfoTimer.stop(); + emit autoStreamChanged(); + } +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::handleVideoStatus(const mavlink_video_stream_status_t* vs) +{ + _streamStatusTimer.stop(); + qCDebug(CameraControlLog) << "handleVideoStatus:" << vs->stream_id; + QGCVideoStreamInfo* pInfo = _findStream(vs->stream_id); + if(pInfo) { + if(pInfo->update(vs)) { + emit _vehicle->dynamicCameras()->streamChanged(); + } + } +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::setCurrentStream(int stream) +{ + if(stream != _currentStream && stream >= 0 && stream < _streams.count()) { + if(_currentStream != stream) { + QGCVideoStreamInfo* pInfo = currentStreamInstance(); + if(pInfo) { + //-- Stop current stream + _vehicle->sendMavCommand( + _compID, // Target component + MAV_CMD_VIDEO_STOP_STREAMING, // Command id + false, // ShowError + pInfo->streamID()); // Stream ID + } + _currentStream = stream; + pInfo = currentStreamInstance(); + if(pInfo) { + //-- Start new stream + _vehicle->sendMavCommand( + _compID, // Target component + MAV_CMD_VIDEO_START_STREAMING, // Command id + false, // ShowError + pInfo->streamID()); // Stream ID + //-- Update stream status + _requestStreamStatus(static_cast(pInfo->streamID())); + } + emit currentStreamChanged(); + emit _vehicle->dynamicCameras()->streamChanged(); + } + } +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::stopStream() +{ + QGCVideoStreamInfo* pInfo = currentStreamInstance(); + if(pInfo) { + //-- Stop current stream + _vehicle->sendMavCommand( + _compID, // Target component + MAV_CMD_VIDEO_STOP_STREAMING, // Command id + false, // ShowError + pInfo->streamID()); // Stream ID + } +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::resumeStream() +{ + QGCVideoStreamInfo* pInfo = currentStreamInstance(); + if(pInfo) { + //-- Start new stream + _vehicle->sendMavCommand( + _compID, // Target component + MAV_CMD_VIDEO_START_STREAMING, // Command id + false, // ShowError + pInfo->streamID()); // Stream ID + } +} + +//----------------------------------------------------------------------------- +bool +QGCCameraControl::autoStream() +{ + if(hasVideoStream()) { + return _streams.count() > 0; + } + return false; +} + +//----------------------------------------------------------------------------- +QGCVideoStreamInfo* +QGCCameraControl::currentStreamInstance() +{ + if(_currentStream < _streams.count() && _streams.count()) { + QGCVideoStreamInfo* pStream = qobject_cast(_streams[_currentStream]); + return pStream; + } + return nullptr; +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::_requestStreamInfo(uint8_t streamID) +{ + qCDebug(CameraControlLog) << "Requesting video stream info for:" << streamID; + _vehicle->sendMavCommand( + _compID, // Target component + MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION, // Command id + false, // ShowError + streamID); // Stream ID +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::_requestStreamStatus(uint8_t streamID) +{ + qCDebug(CameraControlLog) << "Requesting video stream status for:" << streamID; + _vehicle->sendMavCommand( + _compID, // Target component + MAV_CMD_REQUEST_VIDEO_STREAM_STATUS, // Command id + false, // ShowError + streamID); // Stream ID + _streamStatusTimer.start(1000); // Wait up to a second for it +} + +//----------------------------------------------------------------------------- +QGCVideoStreamInfo* +QGCCameraControl::_findStream(uint8_t id) +{ + for(int i = 0; i < _streams.count(); i++) { + if(_streams[i]) { + QGCVideoStreamInfo* pStream = qobject_cast(_streams[i]); + if(pStream) { + if(pStream->streamID() == id) { + return pStream; + } + } else { + qCritical() << "Null QGCVideoStreamInfo instance"; + } + } + } + qWarning() << "Stream id not found:" << id; + return nullptr; +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::_streamTimeout() +{ + _requestCount++; + int count = _expectedCount * 3; + if(_requestCount > count) { + qCWarning(CameraControlLog) << "Giving up requesting video stream info"; + _streamInfoTimer.stop(); + return; + } + for(uint8_t i = 0; i < _expectedCount; i++) { + //-- Stream ID starts at 1 + if(!_findStream(i+1)) { + _requestStreamInfo(i+1); + return; + } + } +} + +//----------------------------------------------------------------------------- +void +QGCCameraControl::_streamStatusTimeout() +{ + QGCVideoStreamInfo* pStream = currentStreamInstance(); + if(pStream) { + _requestStreamStatus(static_cast(pStream->streamID())); + } +} + //----------------------------------------------------------------------------- QStringList QGCCameraControl::_loadExclusions(QDomNode option) @@ -1741,3 +1936,59 @@ QGCCameraControl::wb() { return (_paramComplete && _activeSettings.contains(kCAM_WBMODE)) ? getFact(kCAM_WBMODE) : nullptr; } + +//----------------------------------------------------------------------------- +QGCVideoStreamInfo::QGCVideoStreamInfo(QObject* parent, const mavlink_video_stream_information_t *si) + : QObject(parent) +{ + memcpy(&_streamInfo, si, sizeof(mavlink_video_stream_information_t)); +} + +//----------------------------------------------------------------------------- +qreal +QGCVideoStreamInfo::aspectRatio() +{ + if(_streamInfo.resolution_h && _streamInfo.resolution_v) { + return static_cast(_streamInfo.resolution_h) / static_cast(_streamInfo.resolution_v); + } + return 1.0; +} + +//----------------------------------------------------------------------------- +bool +QGCVideoStreamInfo::update(const mavlink_video_stream_status_t* vs) +{ + bool changed = false; + if(_streamInfo.hfov != vs->hfov) { + changed = true; + _streamInfo.hfov = vs->hfov; + } + if(_streamInfo.flags != vs->flags) { + changed = true; + _streamInfo.flags = vs->flags; + } + if(_streamInfo.bitrate != vs->bitrate) { + changed = true; + _streamInfo.bitrate = vs->bitrate; + } + if(_streamInfo.rotation != vs->rotation) { + changed = true; + _streamInfo.rotation = vs->rotation; + } + if(_streamInfo.framerate != vs->framerate) { + changed = true; + _streamInfo.framerate = vs->framerate; + } + if(_streamInfo.resolution_h != vs->resolution_h) { + changed = true; + _streamInfo.resolution_h = vs->resolution_h; + } + if(_streamInfo.resolution_v != vs->resolution_v) { + changed = true; + _streamInfo.resolution_v = vs->resolution_v; + } + if(changed) { + emit infoChanged(); + } + return changed; +} diff --git a/src/Camera/QGCCameraControl.h b/src/Camera/QGCCameraControl.h index 87542920cc48f63f6c35397bb9b261ed0c72d830..a7b8c0c9b211ef0a15c1eee85c85e121a3b944bf 100644 --- a/src/Camera/QGCCameraControl.h +++ b/src/Camera/QGCCameraControl.h @@ -17,6 +17,36 @@ class QGCCameraParamIO; Q_DECLARE_LOGGING_CATEGORY(CameraControlLog) Q_DECLARE_LOGGING_CATEGORY(CameraControlLogVerbose) +//----------------------------------------------------------------------------- +class QGCVideoStreamInfo : public QObject +{ + Q_OBJECT +public: + QGCVideoStreamInfo(QObject* parent, const mavlink_video_stream_information_t* si); + + Q_PROPERTY(QString uri READ uri NOTIFY infoChanged) + Q_PROPERTY(int streamID READ streamID NOTIFY infoChanged) + Q_PROPERTY(int type READ type NOTIFY infoChanged) + Q_PROPERTY(qreal aspectRatio READ aspectRatio NOTIFY infoChanged) + Q_PROPERTY(qreal hfov READ hfov NOTIFY infoChanged) + Q_PROPERTY(bool isThermal READ isThermal NOTIFY infoChanged) + + QString uri () { return QString(_streamInfo.uri); } + qreal aspectRatio (); + qreal hfov () { return _streamInfo.hfov; } + int type () { return _streamInfo.type; } + int streamID () { return _streamInfo.stream_id; } + bool isThermal () { return _streamInfo.flags & VIDEO_STREAM_STATUS_FLAGS_THERMAL; } + + bool update (const mavlink_video_stream_status_t* vs); + +signals: + void infoChanged (); + +private: + mavlink_video_stream_information_t _streamInfo; +}; + //----------------------------------------------------------------------------- class QGCCameraOptionExclusion : public QObject { @@ -99,6 +129,7 @@ public: Q_PROPERTY(bool hasModes READ hasModes NOTIFY infoChanged) Q_PROPERTY(bool hasZoom READ hasZoom NOTIFY infoChanged) Q_PROPERTY(bool hasFocus READ hasFocus NOTIFY infoChanged) + Q_PROPERTY(bool hasVideoStream READ hasVideoStream NOTIFY infoChanged) Q_PROPERTY(bool photosInVideoMode READ photosInVideoMode NOTIFY infoChanged) Q_PROPERTY(bool videoInPhotoMode READ videoInPhotoMode NOTIFY infoChanged) Q_PROPERTY(bool isBasic READ isBasic NOTIFY infoChanged) @@ -124,6 +155,10 @@ public: Q_PROPERTY(qreal photoLapse READ photoLapse WRITE setPhotoLapse NOTIFY photoLapseChanged) Q_PROPERTY(int photoLapseCount READ photoLapseCount WRITE setPhotoLapseCount NOTIFY photoLapseCountChanged) Q_PROPERTY(PhotoMode photoMode READ photoMode WRITE setPhotoMode NOTIFY photoModeChanged) + Q_PROPERTY(int currentStream READ currentStream WRITE setCurrentStream NOTIFY currentStreamChanged) + Q_PROPERTY(bool autoStream READ autoStream NOTIFY autoStreamChanged) + Q_PROPERTY(QmlObjectListModel* streams READ streams NOTIFY streamsChanged) + Q_PROPERTY(QGCVideoStreamInfo* currentStreamInstance READ currentStreamInstance NOTIFY currentStreamChanged) Q_INVOKABLE virtual void setVideoMode (); Q_INVOKABLE virtual void setPhotoMode (); @@ -138,6 +173,8 @@ public: Q_INVOKABLE virtual void stepZoom (int direction); Q_INVOKABLE virtual void startZoom (int direction); Q_INVOKABLE virtual void stopZoom (); + Q_INVOKABLE virtual void stopStream (); + Q_INVOKABLE virtual void resumeStream (); virtual int version () { return _version; } virtual QString modelName () { return _modelName; } @@ -151,6 +188,7 @@ public: virtual bool hasModes () { return _info.flags & CAMERA_CAP_FLAGS_HAS_MODES; } virtual bool hasZoom () { return _info.flags & CAMERA_CAP_FLAGS_HAS_BASIC_ZOOM; } virtual bool hasFocus () { return _info.flags & CAMERA_CAP_FLAGS_HAS_BASIC_FOCUS; } + virtual bool hasVideoStream () { return _info.flags & CAMERA_CAP_FLAGS_HAS_VIDEO_STREAM; } virtual bool photosInVideoMode () { return _info.flags & CAMERA_CAP_FLAGS_CAN_CAPTURE_IMAGE_IN_VIDEO_MODE; } virtual bool videoInPhotoMode () { return _info.flags & CAMERA_CAP_FLAGS_CAN_CAPTURE_VIDEO_IN_IMAGE_MODE; } @@ -170,6 +208,12 @@ public: virtual qreal zoomLevel () { return _zoomLevel; } virtual qreal focusLevel () { return _focusLevel; } + virtual QmlObjectListModel* streams () { return &_streams; } + virtual QGCVideoStreamInfo* currentStreamInstance(); + virtual int currentStream () { return _currentStream; } + virtual void setCurrentStream (int stream); + virtual bool autoStream (); + virtual Fact* exposureMode (); virtual Fact* ev (); virtual Fact* iso (); @@ -189,6 +233,8 @@ public: virtual void handleParamAck (const mavlink_param_ext_ack_t& ack); virtual void handleParamValue (const mavlink_param_ext_value_t& value); virtual void handleStorageInfo (const mavlink_storage_information_t& st); + virtual void handleVideoInfo (const mavlink_video_stream_information_t *vi); + virtual void handleVideoStatus (const mavlink_video_stream_status_t *vs); //-- Notify controller a parameter has changed virtual void factChanged (Fact* pFact); @@ -212,11 +258,17 @@ signals: void parametersReady (); void zoomLevelChanged (); void focusLevelChanged (); + void streamsChanged (); + void currentStreamChanged (); + void autoStreamChanged (); protected: virtual void _setVideoStatus (VideoStatus status); virtual void _setPhotoStatus (PhotoStatus status); virtual void _setCameraMode (CameraMode mode); + virtual void _requestStreamInfo (uint8_t streamID); + virtual void _requestStreamStatus (uint8_t streamID); + virtual QGCVideoStreamInfo* _findStream (uint8_t streamID); protected slots: virtual void _initWhenReady (); @@ -229,7 +281,8 @@ protected slots: virtual void _mavCommandResult (int vehicleId, int component, int command, int result, bool noReponseFromVehicle); virtual void _dataReady (QByteArray data); virtual void _paramDone (); - + virtual void _streamTimeout (); + virtual void _streamStatusTimeout (); private: bool _handleLocalization (QByteArray& bytes); @@ -252,26 +305,26 @@ private: QString _getParamName (const char* param_id); protected: - Vehicle* _vehicle; - int _compID; + Vehicle* _vehicle = nullptr; + int _compID = 0; mavlink_camera_information_t _info; - int _version; - bool _cached; - bool _paramComplete; - qreal _zoomLevel; - qreal _focusLevel; - uint32_t _storageFree; - uint32_t _storageTotal; - QNetworkAccessManager* _netManager; + int _version = 0; + bool _cached = false; + bool _paramComplete = false; + qreal _zoomLevel = 0.0; + qreal _focusLevel = 0.0; + uint32_t _storageFree = 0; + uint32_t _storageTotal = 0; + QNetworkAccessManager* _netManager = nullptr; QString _modelName; QString _vendor; QString _cacheFile; - CameraMode _cameraMode; - PhotoMode _photoMode; - qreal _photoLapse; - int _photoLapseCount; - VideoStatus _video_status; - PhotoStatus _photo_status; + CameraMode _cameraMode = CAM_MODE_UNDEFINED; + PhotoMode _photoMode = PHOTO_CAPTURE_SINGLE; + qreal _photoLapse = 1.0; + int _photoLapseCount = 0; + VideoStatus _video_status = VIDEO_CAPTURE_STATUS_UNDEFINED; + PhotoStatus _photo_status = PHOTO_CAPTURE_STATUS_UNDEFINED; QStringList _activeSettings; QStringList _settings; QTimer _captureStatusTimer; @@ -280,10 +333,17 @@ protected: QMap _originalOptNames; QMap _originalOptValues; QMap _paramIO; - int _storageInfoRetries; - int _captureInfoRetries; - bool _resetting; + int _storageInfoRetries = 0; + int _captureInfoRetries = 0; + bool _resetting = false; //-- Parameters that require a full update QMap _requestUpdates; QStringList _updatesToRequest; + //-- Video Streams + int _requestCount = 0; + int _currentStream = 0; + int _expectedCount = 1; + QTimer _streamInfoTimer; + QTimer _streamStatusTimer; + QmlObjectListModel _streams; }; diff --git a/src/Camera/QGCCameraManager.cc b/src/Camera/QGCCameraManager.cc index 8610a6f22cee840ef088f6c0c41546fea7d30c54..ba0a112038631e23ff4c1f1fd663474500c3e438 100644 --- a/src/Camera/QGCCameraManager.cc +++ b/src/Camera/QGCCameraManager.cc @@ -35,6 +35,7 @@ QGCCameraManager::setCurrentCamera(int sel) if(sel != _currentCamera && sel >= 0 && sel < _cameras.count()) { _currentCamera = sel; emit currentCameraChanged(); + emit streamChanged(); } } @@ -80,6 +81,12 @@ QGCCameraManager::_mavlinkMessageReceived(const mavlink_message_t& message) case MAVLINK_MSG_ID_PARAM_EXT_VALUE: _handleParamValue(message); break; + case MAVLINK_MSG_ID_VIDEO_STREAM_INFORMATION: + _handleVideoStreamInfo(message); + break; + case MAVLINK_MSG_ID_VIDEO_STREAM_STATUS: + _handleVideoStreamStatus(message); + break; } } } @@ -100,6 +107,29 @@ QGCCameraManager::_handleHeartbeat(const mavlink_message_t &message) } } +//----------------------------------------------------------------------------- +QGCCameraControl* +QGCCameraManager::currentCameraInstance() +{ + if(_currentCamera < _cameras.count() && _cameras.count()) { + QGCCameraControl* pCamera = qobject_cast(_cameras[_currentCamera]); + return pCamera; + } + return nullptr; +} + +//----------------------------------------------------------------------------- +QGCVideoStreamInfo* +QGCCameraManager::currentStreamInstance() +{ + QGCCameraControl* pCamera = currentCameraInstance(); + if(pCamera) { + QGCVideoStreamInfo* pInfo = pCamera->currentStreamInstance(); + return pInfo; + } + return nullptr; +} + //----------------------------------------------------------------------------- QGCCameraControl* QGCCameraManager::_findCamera(int id) @@ -202,6 +232,30 @@ QGCCameraManager::_handleParamValue(const mavlink_message_t& message) } } +//----------------------------------------------------------------------------- +void +QGCCameraManager::_handleVideoStreamInfo(const mavlink_message_t& message) +{ + QGCCameraControl* pCamera = _findCamera(message.compid); + if(pCamera) { + mavlink_video_stream_information_t streamInfo; + mavlink_msg_video_stream_information_decode(&message, &streamInfo); + pCamera->handleVideoInfo(&streamInfo); + } +} + +//----------------------------------------------------------------------------- +void +QGCCameraManager::_handleVideoStreamStatus(const mavlink_message_t& message) +{ + QGCCameraControl* pCamera = _findCamera(message.compid); + if(pCamera) { + mavlink_video_stream_status_t streamStatus; + mavlink_msg_video_stream_status_decode(&message, &streamStatus); + pCamera->handleVideoStatus(&streamStatus); + } +} + //----------------------------------------------------------------------------- void QGCCameraManager::_requestCameraInfo(int compID) @@ -224,11 +278,13 @@ QGCCameraManager::_activeJoystickChanged(Joystick* joystick) if(_activeJoystick) { disconnect(_activeJoystick, &Joystick::stepZoom, this, &QGCCameraManager::_stepZoom); disconnect(_activeJoystick, &Joystick::stepCamera, this, &QGCCameraManager::_stepCamera); + disconnect(_activeJoystick, &Joystick::stepStream, this, &QGCCameraManager::_stepStream); } _activeJoystick = joystick; if(_activeJoystick) { connect(_activeJoystick, &Joystick::stepZoom, this, &QGCCameraManager::_stepZoom); connect(_activeJoystick, &Joystick::stepCamera, this, &QGCCameraManager::_stepCamera); + connect(_activeJoystick, &Joystick::stepStream, this, &QGCCameraManager::_stepStream); } } @@ -239,11 +295,9 @@ QGCCameraManager::_stepZoom(int direction) if(_lastZoomChange.elapsed() > 250) { _lastZoomChange.start(); qCDebug(CameraManagerLog) << "Step Camera Zoom" << direction; - if(_cameras.count() && _cameras[_currentCamera]) { - QGCCameraControl* pCamera = qobject_cast(_cameras[_currentCamera]); - if(pCamera) { - pCamera->stepZoom(direction); - } + QGCCameraControl* pCamera = currentCameraInstance(); + if(pCamera) { + pCamera->stepZoom(direction); } } } @@ -262,4 +316,21 @@ QGCCameraManager::_stepCamera(int direction) } } +//----------------------------------------------------------------------------- +void +QGCCameraManager::_stepStream(int direction) +{ + if(_lastCameraChange.elapsed() > 1000) { + _lastCameraChange.start(); + QGCCameraControl* pCamera = currentCameraInstance(); + if(pCamera) { + qCDebug(CameraManagerLog) << "Step Camera Stream" << direction; + int c = pCamera->currentStream() + direction; + if(c < 0) c = pCamera->streams()->count() - 1; + if(c >= pCamera->streams()->count()) c = 0; + pCamera->setCurrentStream(c); + } + } +} + diff --git a/src/Camera/QGCCameraManager.h b/src/Camera/QGCCameraManager.h index b0c8b9c60292ffd4af530441f47748b904ecd63c..ead3f8ddbd04de1e21b83f9524e1b3d91587f9a7 100644 --- a/src/Camera/QGCCameraManager.h +++ b/src/Camera/QGCCameraManager.h @@ -27,9 +27,10 @@ public: QGCCameraManager(Vehicle* vehicle); virtual ~QGCCameraManager(); - Q_PROPERTY(QmlObjectListModel* cameras READ cameras NOTIFY camerasChanged) - Q_PROPERTY(QStringList cameraLabels READ cameraLabels NOTIFY cameraLabelsChanged) - Q_PROPERTY(int currentCamera READ currentCamera WRITE setCurrentCamera NOTIFY currentCameraChanged) + Q_PROPERTY(QmlObjectListModel* cameras READ cameras NOTIFY camerasChanged) + Q_PROPERTY(QStringList cameraLabels READ cameraLabels NOTIFY cameraLabelsChanged) + Q_PROPERTY(int currentCamera READ currentCamera WRITE setCurrentCamera NOTIFY currentCameraChanged) + Q_PROPERTY(QGCCameraControl* currentCameraInstance READ currentCameraInstance NOTIFY currentCameraChanged) //-- Return a list of cameras provided by this vehicle virtual QmlObjectListModel* cameras () { return &_cameras; } @@ -37,13 +38,17 @@ public: virtual QStringList cameraLabels () { return _cameraLabels; } //-- Current selected camera virtual int currentCamera () { return _currentCamera; } + virtual QGCCameraControl* currentCameraInstance(); //-- Set current camera virtual void setCurrentCamera (int sel); + //-- Current stream + virtual QGCVideoStreamInfo* currentStreamInstance(); signals: void camerasChanged (); void cameraLabelsChanged (); void currentCameraChanged (); + void streamChanged (); protected slots: virtual void _vehicleReady (bool ready); @@ -51,6 +56,7 @@ protected slots: virtual void _activeJoystickChanged (Joystick* joystick); virtual void _stepZoom (int direction); virtual void _stepCamera (int direction); + virtual void _stepStream (int direction); protected: virtual QGCCameraControl* _findCamera (int id); @@ -62,6 +68,8 @@ protected: virtual void _handleParamAck (const mavlink_message_t& message); virtual void _handleParamValue (const mavlink_message_t& message); virtual void _handleCaptureStatus (const mavlink_message_t& message); + virtual void _handleVideoStreamInfo (const mavlink_message_t& message); + virtual void _handleVideoStreamStatus(const mavlink_message_t& message); protected: Vehicle* _vehicle = nullptr; diff --git a/src/FlightDisplay/FlightDisplayViewVideo.qml b/src/FlightDisplay/FlightDisplayViewVideo.qml index a18f9c49a3d1511a6bc993db54a367f342167238..365c05713d6b598d9cef31accbc7ce5a91992af4 100644 --- a/src/FlightDisplay/FlightDisplayViewVideo.qml +++ b/src/FlightDisplay/FlightDisplayViewVideo.qml @@ -31,9 +31,7 @@ Item { property int _curCameraIndex: _dynamicCameras ? _dynamicCameras.currentCamera : 0 property bool _isCamera: _dynamicCameras ? _dynamicCameras.cameras.count > 0 : false property var _camera: _isCamera ? _dynamicCameras.cameras.get(_curCameraIndex) : null - property bool _hasCameraZoom: _camera && _camera.hasZoom - property bool _hasVideoZoom: QGroundControl.videoManager.hasZoom - property bool _hasZoom: _hasCameraZoom || _hasVideoZoom + property bool _hasZoom: _camera && _camera.hasZoom property int _fitMode: QGroundControl.settingsManager.videoSettings.videoFit.rawValue Rectangle { id: noVideo @@ -141,13 +139,7 @@ Item { z = Math.round(pinch.scale) } if(pinchZoom.zoom != z) { - //-- Camera zoom takes predence - if(_hasCameraZoom) { - _camera.stepZoom(z) - } else if (_hasVideoZoom) { - //-- Video zoom is for dumb cameras that only stream (do not present a camera interface) - QGroundControl.videoManager.stepZoom(z) - } + _camera.stepZoom(z) } } } diff --git a/src/FlightDisplay/VideoManager.cc b/src/FlightDisplay/VideoManager.cc index 5451dad2144f074c7e8b9120d19b915d2b0a34f6..dbd0082fa3cff9aa910500ab26cf724a49d79b3b 100644 --- a/src/FlightDisplay/VideoManager.cc +++ b/src/FlightDisplay/VideoManager.cc @@ -28,7 +28,7 @@ #include "MultiVehicleManager.h" #include "Settings/SettingsManager.h" #include "Vehicle.h" -#include "JoystickManager.h" +#include "QGCCameraManager.h" QGC_LOGGING_CATEGORY(VideoManagerLog, "VideoManagerLog") @@ -36,9 +36,6 @@ QGC_LOGGING_CATEGORY(VideoManagerLog, "VideoManagerLog") VideoManager::VideoManager(QGCApplication* app, QGCToolbox* toolbox) : QGCTool(app, toolbox) { - _streamInfo = {}; - _lastZoomChange.start(); - _lastStreamChange.start(); } //----------------------------------------------------------------------------- @@ -64,11 +61,9 @@ VideoManager::setToolbox(QGCToolbox *toolbox) connect(_videoSettings->udpPort(), &Fact::rawValueChanged, this, &VideoManager::_udpPortChanged); connect(_videoSettings->rtspUrl(), &Fact::rawValueChanged, this, &VideoManager::_rtspUrlChanged); connect(_videoSettings->tcpUrl(), &Fact::rawValueChanged, this, &VideoManager::_tcpUrlChanged); - connect(_videoSettings->aspectRatio(), &Fact::rawValueChanged, this, &VideoManager::_streamInfoChanged); + connect(_videoSettings->aspectRatio(), &Fact::rawValueChanged, this, &VideoManager::_aspectRatioChanged); MultiVehicleManager *pVehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); connect(pVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &VideoManager::_setActiveVehicle); - JoystickManager *pJoyMgr = qgcApp()->toolbox()->joystickManager(); - connect(pJoyMgr, &JoystickManager::activeJoystickChanged, this, &VideoManager::_activeJoystickChanged); #if defined(QGC_GST_STREAMING) #ifndef QGC_DISABLE_UVC @@ -92,14 +87,26 @@ VideoManager::setToolbox(QGCToolbox *toolbox) //----------------------------------------------------------------------------- double VideoManager::aspectRatio() { - if(isAutoStream()) { - if(_streamInfo.resolution_h && _streamInfo.resolution_v) { - return static_cast(_streamInfo.resolution_h) / static_cast(_streamInfo.resolution_v); + if(_activeVehicle) { + QGCVideoStreamInfo* pInfo = _activeVehicle->dynamicCameras()->currentStreamInstance(); + if(pInfo) { + return pInfo->aspectRatio(); + } + } + return _videoSettings->aspectRatio()->rawValue().toDouble(); +} + +//----------------------------------------------------------------------------- +bool +VideoManager::autoStreamConfigured() +{ + if(_activeVehicle) { + QGCVideoStreamInfo* pInfo = _activeVehicle->dynamicCameras()->currentStreamInstance(); + if(pInfo) { + return !pInfo->uri().isEmpty(); } - return 1.0; - } else { - return _videoSettings->aspectRatio()->rawValue().toDouble(); } + return false; } //----------------------------------------------------------------------------- @@ -156,6 +163,9 @@ VideoManager::_tcpUrlChanged() bool VideoManager::hasVideo() { + if(autoStreamConfigured()) { + return true; + } QString videoSource = _videoSettings->videoSource()->rawValue().toString(); return !videoSource.isEmpty() && videoSource != VideoSettings::videoSourceNoVideo && videoSource != VideoSettings::videoDisabled; } @@ -169,21 +179,9 @@ VideoManager::isGStreamer() return videoSource == VideoSettings::videoSourceUDP || videoSource == VideoSettings::videoSourceRTSP || - videoSource == VideoSettings::videoSourceAuto || videoSource == VideoSettings::videoSourceTCP || - videoSource == VideoSettings::videoSourceMPEGTS; -#else - return false; -#endif -} - -//----------------------------------------------------------------------------- -bool -VideoManager::isAutoStream() -{ -#if defined(QGC_GST_STREAMING) - QString videoSource = _videoSettings->videoSource()->rawValue().toString(); - return videoSource == VideoSettings::videoSourceAuto; + videoSource == VideoSettings::videoSourceMPEGTS || + autoStreamConfigured(); #else return false; #endif @@ -204,6 +202,28 @@ VideoManager::_updateSettings() { if(!_videoSettings || !_videoReceiver) return; + //-- Auto discovery + if(_activeVehicle) { + QGCVideoStreamInfo* pInfo = _activeVehicle->dynamicCameras()->currentStreamInstance(); + if(pInfo) { + switch(pInfo->type()) { + case VIDEO_STREAM_TYPE_RTSP: + case VIDEO_STREAM_TYPE_TCP_MPEG: + _videoReceiver->setUri(pInfo->uri()); + break; + case VIDEO_STREAM_TYPE_RTPUDP: + _videoReceiver->setUri(QStringLiteral("udp://0.0.0.0:%1").arg(pInfo->uri())); + break; + case VIDEO_STREAM_TYPE_MPEG_TS_H264: + _videoReceiver->setUri(QStringLiteral("mpegts://0.0.0.0:%1").arg(pInfo->uri())); + break; + default: + _videoReceiver->setUri(pInfo->uri()); + break; + } + return; + } + } QString source = _videoSettings->videoSource()->rawValue().toString(); if (source == VideoSettings::videoSourceUDP) _videoReceiver->setUri(QStringLiteral("udp://0.0.0.0:%1").arg(_videoSettings->udpPort()->rawValue().toInt())); @@ -213,24 +233,6 @@ VideoManager::_updateSettings() _videoReceiver->setUri(_videoSettings->rtspUrl()->rawValue().toString()); else if (source == VideoSettings::videoSourceTCP) _videoReceiver->setUri(QStringLiteral("tcp://%1").arg(_videoSettings->tcpUrl()->rawValue().toString())); - //-- Auto discovery - else if (isAutoStream()) { - switch(_streamInfo.type) { - case VIDEO_STREAM_TYPE_RTSP: - case VIDEO_STREAM_TYPE_TCP_MPEG: - _videoReceiver->setUri(QString(_streamInfo.uri)); - break; - case VIDEO_STREAM_TYPE_RTPUDP: - _videoReceiver->setUri(QStringLiteral("udp://0.0.0.0:%1").arg(atoi(_streamInfo.uri))); - break; - case VIDEO_STREAM_TYPE_MPEG_TS_H264: - _videoReceiver->setUri(QStringLiteral("mpegts://0.0.0.0:%1").arg(atoi(_streamInfo.uri))); - break; - default: - _videoReceiver->setUri(QString(_streamInfo.uri)); - break; - } - } } //----------------------------------------------------------------------------- @@ -252,116 +254,31 @@ void VideoManager::_setActiveVehicle(Vehicle* vehicle) { if(_activeVehicle) { - disconnect(_activeVehicle, &Vehicle::mavlinkMessageReceived, this, &VideoManager::_vehicleMessageReceived); + if(_activeVehicle->dynamicCameras()) { + QGCCameraControl* pCamera = _activeVehicle->dynamicCameras()->currentCameraInstance(); + if(pCamera) { + pCamera->stopStream(); + } + disconnect(_activeVehicle->dynamicCameras(), &QGCCameraManager::streamChanged, this, &VideoManager::_restartVideo); + } } _activeVehicle = vehicle; if(_activeVehicle) { - if(isAutoStream()) { - _videoReceiver->stop(); - } - //-- Video Stream Discovery - connect(_activeVehicle, &Vehicle::mavlinkMessageReceived, this, &VideoManager::_vehicleMessageReceived); - qCDebug(VideoManagerLog) << "Requesting video stream info"; - _activeVehicle->sendMavCommand( - MAV_COMP_ID_ALL, // Target component - MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION, // Command id - false, // ShowError - 1, // First camera only - 1); // Request video stream information - } -} - -//---------------------------------------------------------------------------------------- -void -VideoManager::_vehicleMessageReceived(const mavlink_message_t& message) -{ - //-- For now we only handle one stream. There is no UI to pick different streams. - if(message.msgid == MAVLINK_MSG_ID_VIDEO_STREAM_INFORMATION) { - _videoStreamCompID = message.compid; - mavlink_msg_video_stream_information_decode(&message, &_streamInfo); - _hasAutoStream = true; - qCDebug(VideoManagerLog) << "Received video stream info:" << _streamInfo.uri; - _restartVideo(); - emit streamInfoChanged(); - } -} - -//---------------------------------------------------------------------------------------- -void -VideoManager::_activeJoystickChanged(Joystick* joystick) -{ - if(_activeJoystick) { - disconnect(_activeJoystick, &Joystick::stepZoom, this, &VideoManager::stepZoom); - disconnect(_activeJoystick, &Joystick::stepStream, this, &VideoManager::stepStream); - } - _activeJoystick = joystick; - if(_activeJoystick) { - connect(_activeJoystick, &Joystick::stepZoom, this, &VideoManager::stepZoom); - connect(_activeJoystick, &Joystick::stepStream, this, &VideoManager::stepStream); - } -} - -//----------------------------------------------------------------------------- -void -VideoManager::stepZoom(int direction) -{ - if(_lastZoomChange.elapsed() > 250) { - _lastZoomChange.start(); - qCDebug(VideoManagerLog) << "Step Stream Zoom" << direction; - if(_activeVehicle && hasZoom()) { - _activeVehicle->sendMavCommand( - _videoStreamCompID, // Target component - MAV_CMD_SET_CAMERA_ZOOM, // Command id - false, // ShowError - ZOOM_TYPE_STEP, // Zoom type - direction); // Direction (-1 wide, 1 tele) - } - } -} - -//----------------------------------------------------------------------------- -void -VideoManager::stepStream(int direction) -{ - if(_lastStreamChange.elapsed() > 250) { - _lastStreamChange.start(); - int s = _currentStream + direction; - if(s < 1) s = _streamInfo.count; - if(s > _streamInfo.count) s = 1; - setCurrentStream(s); - } -} - -//----------------------------------------------------------------------------- -void -VideoManager::setCurrentStream(int stream) -{ - qCDebug(VideoManagerLog) << "Set Stream" << stream; - //-- TODO: Handle multiple streams - if(_hasAutoStream && stream <= _streamInfo.count && stream > 0 && _activeVehicle) { - if(_currentStream != stream) { - //-- Stop current stream - _activeVehicle->sendMavCommand( - _videoStreamCompID, // Target component - MAV_CMD_VIDEO_STOP_STREAMING, // Command id - false, // ShowError - _currentStream); // Stream ID - //-- Start new stream - _currentStream = stream; - _activeVehicle->sendMavCommand( - _videoStreamCompID, // Target component - MAV_CMD_VIDEO_START_STREAMING, // Command id - false, // ShowError - _currentStream); // Stream ID - _currentStream = stream; - emit currentStreamChanged(); + if(_activeVehicle->dynamicCameras()) { + connect(_activeVehicle->dynamicCameras(), &QGCCameraManager::streamChanged, this, &VideoManager::_restartVideo); + QGCCameraControl* pCamera = _activeVehicle->dynamicCameras()->currentCameraInstance(); + if(pCamera) { + pCamera->resumeStream(); + } } } + emit autoStreamConfiguredChanged(); + _restartVideo(); } //---------------------------------------------------------------------------------------- void -VideoManager::_streamInfoChanged() +VideoManager::_aspectRatioChanged() { - emit streamInfoChanged(); + emit aspectRatioChanged(); } diff --git a/src/FlightDisplay/VideoManager.h b/src/FlightDisplay/VideoManager.h index 0831725f7a9f2d03fa9ef08126ac3007f4346ef5..8ace9fc3927ec5793e070f5d129dadb1d391cde4 100644 --- a/src/FlightDisplay/VideoManager.h +++ b/src/FlightDisplay/VideoManager.h @@ -35,18 +35,15 @@ public: VideoManager (QGCApplication* app, QGCToolbox* toolbox); ~VideoManager (); - Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged) - Q_PROPERTY(bool isGStreamer READ isGStreamer NOTIFY isGStreamerChanged) - Q_PROPERTY(bool isAutoStream READ isAutoStream NOTIFY isAutoStreamChanged) - Q_PROPERTY(bool isTaisync READ isTaisync WRITE setIsTaisync NOTIFY isTaisyncChanged) - Q_PROPERTY(QString videoSourceID READ videoSourceID NOTIFY videoSourceIDChanged) - Q_PROPERTY(bool uvcEnabled READ uvcEnabled CONSTANT) - Q_PROPERTY(bool fullScreen READ fullScreen WRITE setfullScreen NOTIFY fullScreenChanged) - Q_PROPERTY(VideoReceiver* videoReceiver READ videoReceiver CONSTANT) - Q_PROPERTY(double aspectRatio READ aspectRatio NOTIFY streamInfoChanged) - Q_PROPERTY(bool hasZoom READ hasZoom NOTIFY streamInfoChanged) - Q_PROPERTY(int streamCount READ streamCount NOTIFY streamCountChanged) - Q_PROPERTY(int currentStream READ currentStream WRITE setCurrentStream NOTIFY currentStreamChanged) + Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged) + Q_PROPERTY(bool isGStreamer READ isGStreamer NOTIFY isGStreamerChanged) + Q_PROPERTY(bool isTaisync READ isTaisync WRITE setIsTaisync NOTIFY isTaisyncChanged) + Q_PROPERTY(QString videoSourceID READ videoSourceID NOTIFY videoSourceIDChanged) + Q_PROPERTY(bool uvcEnabled READ uvcEnabled CONSTANT) + Q_PROPERTY(bool fullScreen READ fullScreen WRITE setfullScreen NOTIFY fullScreenChanged) + Q_PROPERTY(VideoReceiver* videoReceiver READ videoReceiver CONSTANT) + Q_PROPERTY(double aspectRatio READ aspectRatio NOTIFY aspectRatioChanged) + Q_PROPERTY(bool autoStreamConfigured READ autoStreamConfigured NOTIFY autoStreamConfiguredChanged) bool hasVideo (); bool isGStreamer (); @@ -54,11 +51,8 @@ public: bool isTaisync () { return _isTaisync; } bool fullScreen () { return _fullScreen; } QString videoSourceID () { return _videoSourceID; } - QString autoURL () { return QString(_streamInfo.uri); } double aspectRatio (); - bool hasZoom () { return _streamInfo.flags & VIDEO_STREAM_HAS_BASIC_ZOOM; } - int currentStream () { return _currentStream; } - int streamCount () { return _streamInfo.count; } + bool autoStreamConfigured(); VideoReceiver* videoReceiver () { return _videoReceiver; } @@ -70,15 +64,12 @@ public: void setfullScreen (bool f) { _fullScreen = f; emit fullScreenChanged(); } void setIsTaisync (bool t) { _isTaisync = t; emit isTaisyncChanged(); } - void setCurrentStream (int stream); // Override from QGCTool void setToolbox (QGCToolbox *toolbox); Q_INVOKABLE void startVideo () { _videoReceiver->start(); } Q_INVOKABLE void stopVideo () { _videoReceiver->stop(); } - Q_INVOKABLE void stepZoom (int direction); - Q_INVOKABLE void stepStream (int direction); signals: void hasVideoChanged (); @@ -86,10 +77,9 @@ signals: void videoSourceIDChanged (); void fullScreenChanged (); void isAutoStreamChanged (); - void streamInfoChanged (); void isTaisyncChanged (); - void currentStreamChanged (); - void streamCountChanged (); + void aspectRatioChanged (); + void autoStreamConfiguredChanged(); private slots: void _videoSourceChanged (); @@ -97,14 +87,12 @@ private slots: void _rtspUrlChanged (); void _tcpUrlChanged (); void _updateUVC (); - void _streamInfoChanged (); void _setActiveVehicle (Vehicle* vehicle); - void _activeJoystickChanged (Joystick* joystick); - void _vehicleMessageReceived (const mavlink_message_t& message); + void _aspectRatioChanged (); + void _restartVideo (); private: void _updateSettings (); - void _restartVideo (); private: bool _isTaisync = false; @@ -113,13 +101,6 @@ private: QString _videoSourceID; bool _fullScreen = false; Vehicle* _activeVehicle = nullptr; - Joystick* _activeJoystick = nullptr; - mavlink_video_stream_information_t _streamInfo; - bool _hasAutoStream = false; - uint8_t _videoStreamCompID = 0; - int _currentStream = 1; - QTime _lastZoomChange; - QTime _lastStreamChange; }; #endif diff --git a/src/Settings/VideoSettings.cc b/src/Settings/VideoSettings.cc index 16ea77d446c64445a64662ba733c9f32bc4a52e2..544e5e132d5cad78abde0d99d19673b8de0c5ffe 100644 --- a/src/Settings/VideoSettings.cc +++ b/src/Settings/VideoSettings.cc @@ -21,7 +21,6 @@ const char* VideoSettings::videoSourceNoVideo = "No Video Available"; const char* VideoSettings::videoDisabled = "Video Stream Disabled"; -const char* VideoSettings::videoSourceAuto = "Automatic Video Stream"; const char* VideoSettings::videoSourceRTSP = "RTSP Video Stream"; const char* VideoSettings::videoSourceUDP = "UDP Video Stream"; const char* VideoSettings::videoSourceTCP = "TCP-MPEG2 Video Stream"; @@ -35,7 +34,6 @@ DECLARE_SETTINGGROUP(Video, "Video") // Setup enum values for videoSource settings into meta data QStringList videoSourceList; #ifdef QGC_GST_STREAMING - videoSourceList.append(videoSourceAuto); videoSourceList.append(videoSourceRTSP); #ifndef NO_UDP_VIDEO videoSourceList.append(videoSourceUDP); @@ -133,10 +131,16 @@ bool VideoSettings::streamConfigured(void) #if !defined(QGC_GST_STREAMING) return false; #endif + //-- First, check if it's disabled QString vSource = videoSource()->rawValue().toString(); if(vSource == videoSourceNoVideo || vSource == videoDisabled) { return false; } + //-- Check if it's autoconfigured + if(qgcApp()->toolbox()->videoManager()->autoStreamConfigured()) { + qCDebug(VideoManagerLog) << "Stream auto configured"; + return true; + } //-- If UDP, check if port is set if(vSource == videoSourceUDP) { qCDebug(VideoManagerLog) << "Testing configuration for UDP Stream:" << udpPort()->rawValue().toInt(); @@ -157,11 +161,6 @@ bool VideoSettings::streamConfigured(void) qCDebug(VideoManagerLog) << "Testing configuration for MPEG-TS Stream:" << udpPort()->rawValue().toInt(); return udpPort()->rawValue().toInt() != 0; } - //-- If Auto, check for received URL - if(vSource == videoSourceAuto) { - qCDebug(VideoManagerLog) << "Testing configuration for Auto Stream:" << qgcApp()->toolbox()->videoManager()->autoURL(); - return !qgcApp()->toolbox()->videoManager()->autoURL().isEmpty(); - } return false; } diff --git a/src/Settings/VideoSettings.h b/src/Settings/VideoSettings.h index ff560235851f9de52338eb4514335725def43b85..a419b6a95d8e7ee7b12f3d7dc286931349dc8026 100644 --- a/src/Settings/VideoSettings.h +++ b/src/Settings/VideoSettings.h @@ -36,14 +36,12 @@ public: DEFINE_SETTINGFACT(disableWhenDisarmed) Q_PROPERTY(bool streamConfigured READ streamConfigured NOTIFY streamConfiguredChanged) - Q_PROPERTY(QString autoVideoSource READ autoVideoSource CONSTANT) Q_PROPERTY(QString rtspVideoSource READ rtspVideoSource CONSTANT) Q_PROPERTY(QString udpVideoSource READ udpVideoSource CONSTANT) Q_PROPERTY(QString tcpVideoSource READ tcpVideoSource CONSTANT) Q_PROPERTY(QString mpegtsVideoSource READ mpegtsVideoSource CONSTANT) bool streamConfigured (); - QString autoVideoSource () { return videoSourceAuto; } QString rtspVideoSource () { return videoSourceRTSP; } QString udpVideoSource () { return videoSourceUDP; } QString tcpVideoSource () { return videoSourceTCP; } @@ -53,7 +51,6 @@ public: static const char* videoDisabled; static const char* videoSourceUDP; static const char* videoSourceRTSP; - static const char* videoSourceAuto; static const char* videoSourceTCP; static const char* videoSourceMPEGTS; diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index 2a906c2cc44f64d193a255b512126ac86226936a..a358e29338399b803557f81f4e57dd848b08e036 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -47,7 +47,6 @@ QGCView { property string _videoSource: QGroundControl.settingsManager.videoSettings.videoSource.value property bool _isGst: QGroundControl.videoManager.isGStreamer - property bool _isAutoStream: QGroundControl.videoManager.isAutoStream property bool _isUDP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.udpVideoSource property bool _isRTSP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.rtspVideoSource property bool _isTCP: _isGst && _videoSource === QGroundControl.settingsManager.videoSettings.tcpVideoSource @@ -691,7 +690,7 @@ QGCView { QGCLabel { id: videoSectionLabel text: qsTr("Video") - visible: QGroundControl.settingsManager.videoSettings.visible + visible: QGroundControl.settingsManager.videoSettings.visible && !QGroundControl.videoManager.autoStreamConfigured } Rectangle { Layout.preferredWidth: videoGrid.width + (_margins * 2) @@ -751,12 +750,12 @@ QGCView { } QGCLabel { text: qsTr("Aspect Ratio") - visible: !_isAutoStream && _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible + visible: _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible } FactTextField { Layout.preferredWidth: _comboFieldWidth fact: QGroundControl.settingsManager.videoSettings.aspectRatio - visible: !_isAutoStream && _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible + visible: _isGst && QGroundControl.settingsManager.videoSettings.aspectRatio.visible } QGCLabel { @@ -776,10 +775,10 @@ QGCView { QGCLabel { id: videoRecSectionLabel text: qsTr("Video Recording") - visible: QGroundControl.settingsManager.videoSettings.visible && _isGst + visible: (QGroundControl.settingsManager.videoSettings.visible && _isGst) || QGroundControl.videoManager.autoStreamConfigured } Rectangle { - Layout.preferredWidth: videoRecCol.width + (_margins * 2) + Layout.preferredWidth: videoRecCol.width + (_margins * 2) Layout.preferredHeight: videoRecCol.height + (_margins * 2) Layout.fillWidth: true color: qgcPal.windowShade