From cf8830ad468da38584ea4829f8aa92aa7a23d0d0 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 23 Mar 2026 21:22:37 +0900 Subject: [PATCH 1/4] impl 1 --- lib/src/publication/remote.dart | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/src/publication/remote.dart b/lib/src/publication/remote.dart index e27b96c1b..66a1e1825 100644 --- a/lib/src/publication/remote.dart +++ b/lib/src/publication/remote.dart @@ -30,6 +30,7 @@ import '../track/local/local.dart'; import '../track/remote/remote.dart'; import '../track/remote/video.dart'; import '../types/other.dart'; +import '../types/video_dimensions.dart'; import '../utils.dart'; import 'track_publication.dart'; @@ -47,8 +48,11 @@ class RemoteTrackPublication extends TrackPublication int? _fps; int get fps => _fps ?? 0; - VideoQuality _videoQuality = VideoQuality.HIGH; - VideoQuality get videoQuality => _videoQuality; + VideoQuality? _videoQuality = VideoQuality.HIGH; + VideoQuality? get videoQuality => _videoQuality; + + VideoDimensions? _videoDimensions; + VideoDimensions? get videoDimensions => _videoDimensions; /// The server may pause the track when they are bandwidth limitations and resume /// when there is more capacity. This property will be updated when the track is @@ -228,6 +232,20 @@ class RemoteTrackPublication extends TrackPublication Future setVideoQuality(VideoQuality newValue) async { if (newValue == _videoQuality) return; _videoQuality = newValue; + _videoDimensions = null; + sendUpdateTrackSettings(); + } + + /// Set preferred video dimensions for this track. + /// + /// Server will choose the appropriate layer based on these dimensions. + /// Will override previous calls to [setVideoQuality]. + Future setVideoDimensions(VideoDimensions newValue) async { + if (newValue.width == _videoDimensions?.width && newValue.height == _videoDimensions?.height) { + return; + } + _videoDimensions = newValue; + _videoQuality = null; sendUpdateTrackSettings(); } @@ -300,7 +318,14 @@ class RemoteTrackPublication extends TrackPublication disabled: !_enabled, ); if (kind == TrackType.VIDEO) { - settings.quality = _videoQuality.toPBType(); + if (_videoDimensions != null) { + settings.width = _videoDimensions!.width; + settings.height = _videoDimensions!.height; + } else if (_videoQuality != null) { + settings.quality = _videoQuality!.toPBType(); + } else { + settings.quality = VideoQuality.HIGH.toPBType(); + } if (_fps != null) settings.fps = _fps!; } participant.room.engine.signalClient.sendUpdateTrackSettings(settings); From 1e100b2372d2b55d4d74d4077c74749bc9c0ac85 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 23 Mar 2026 21:24:36 +0900 Subject: [PATCH 2/4] changes --- .changes/set-video-dimensions | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changes/set-video-dimensions diff --git a/.changes/set-video-dimensions b/.changes/set-video-dimensions new file mode 100644 index 000000000..1353ab298 --- /dev/null +++ b/.changes/set-video-dimensions @@ -0,0 +1 @@ +minor type="added" "Add setVideoDimensions for remote track publications" From 3804a56a911d045a9bd0a9aa58a422480ccafd11 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 23 Mar 2026 21:32:11 +0900 Subject: [PATCH 3/4] fix breaking change detector finding --- lib/src/publication/remote.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/publication/remote.dart b/lib/src/publication/remote.dart index 66a1e1825..c1e6337f8 100644 --- a/lib/src/publication/remote.dart +++ b/lib/src/publication/remote.dart @@ -49,7 +49,7 @@ class RemoteTrackPublication extends TrackPublication int get fps => _fps ?? 0; VideoQuality? _videoQuality = VideoQuality.HIGH; - VideoQuality? get videoQuality => _videoQuality; + VideoQuality get videoQuality => _videoQuality ?? VideoQuality.HIGH; VideoDimensions? _videoDimensions; VideoDimensions? get videoDimensions => _videoDimensions; From 1ec6b989a40ea112defdb40bfc1e8e9e8b829b3c Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 24 Mar 2026 16:25:47 +0900 Subject: [PATCH 4/4] guard --- lib/src/publication/remote.dart | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/src/publication/remote.dart b/lib/src/publication/remote.dart index c1e6337f8..f9e30bb5e 100644 --- a/lib/src/publication/remote.dart +++ b/lib/src/publication/remote.dart @@ -229,8 +229,28 @@ class RemoteTrackPublication extends TrackPublication return didUpdate; } + bool _canUpdateManualVideoSettings() { + if (kind != TrackType.VIDEO) { + logger.warning('Manual video setting updates are only supported for video tracks'); + return false; + } + + if (!subscribed) { + logger.warning('Manual video setting update ignored because the publication is not subscribed'); + return false; + } + + if (participant.room.roomOptions.adaptiveStream) { + logger.warning('Manual video setting update ignored because adaptive stream is enabled'); + return false; + } + + return true; + } + Future setVideoQuality(VideoQuality newValue) async { if (newValue == _videoQuality) return; + if (!_canUpdateManualVideoSettings()) return; _videoQuality = newValue; _videoDimensions = null; sendUpdateTrackSettings(); @@ -244,6 +264,7 @@ class RemoteTrackPublication extends TrackPublication if (newValue.width == _videoDimensions?.width && newValue.height == _videoDimensions?.height) { return; } + if (!_canUpdateManualVideoSettings()) return; _videoDimensions = newValue; _videoQuality = null; sendUpdateTrackSettings(); @@ -253,6 +274,7 @@ class RemoteTrackPublication extends TrackPublication /// It's only supported for video codecs that support SVC currently. Future setVideoFPS(int newValue) async { if (newValue == _fps) return; + if (!_canUpdateManualVideoSettings()) return; _fps = newValue; sendUpdateTrackSettings(); }