diff --git a/lib/features/desktop/desktop_view.dart b/lib/features/desktop/desktop_view.dart index b0ff4880..b8ef8a29 100644 --- a/lib/features/desktop/desktop_view.dart +++ b/lib/features/desktop/desktop_view.dart @@ -118,17 +118,31 @@ class _DesktopViewState extends State { Future _initRenderer() async { await _localRenderer.initialize(); + _localRenderer.onFirstFrameRendered = () { + _markRemoteDesktopFrameReady(); + }; _localRenderer.onResize = () { if (_localRenderer.videoWidth > 0 && _localRenderer.videoHeight > 0) { - _hasDecodedVideoFrame = true; + _markRemoteDesktopFrameReady(); + return; } - _stopFirstFrameDiagnostics(); if (mounted) { setState(() {}); } }; } + void _markRemoteDesktopFrameReady() { + if (!_hasStream || _hasDecodedVideoFrame) { + return; + } + _hasDecodedVideoFrame = true; + _stopFirstFrameDiagnostics(); + if (mounted) { + setState(() {}); + } + } + void _startFirstFrameDiagnostics() { _firstFrameStatsTimer?.cancel(); unawaited(_collectFirstFrameStats()); @@ -148,10 +162,7 @@ class _DesktopViewState extends State { return; } if (stats.hasDecodedFrames) { - setState(() { - _hasDecodedVideoFrame = true; - }); - _stopFirstFrameDiagnostics(); + _markRemoteDesktopFrameReady(); return; } debugPrint('Remote desktop waiting for first frame: $stats'); @@ -171,6 +182,8 @@ class _DesktopViewState extends State { _streamSubscription?.cancel(); _stateSubscription?.cancel(); _client.disconnect(); + _localRenderer.onResize = null; + _localRenderer.onFirstFrameRendered = null; _localRenderer.dispose(); _displayController.dispose(); _widthController.dispose();