From 9349a3d9d3d3bc0772a35cbe7eded74a3c9c639d Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 19 May 2026 12:50:15 +0900 Subject: [PATCH 1/3] patch 1 --- lib/src/utils.dart | 19 ++++++++++--------- test/utils_test.dart | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/lib/src/utils.dart b/lib/src/utils.dart index cb0297d05..0dc0a3ef2 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -229,23 +229,24 @@ class Utils { static List _computeDefaultScreenShareSimulcastParams({ required VideoParameters original, }) { - final layers = [rtc.RTCRtpEncoding(scaleResolutionDownBy: 2, maxFramerate: 3)]; - return layers.map((e) { - final scale = e.scaleResolutionDownBy ?? 1; - final fps = e.maxFramerate ?? 3; + final originalEncoding = original.encoding!; + const scale = 2.0; - return VideoParameters( + return [ + VideoParameters( dimensions: VideoDimensions((original.dimensions.width / scale).floor(), (original.dimensions.height / scale).floor()), encoding: VideoEncoding( maxBitrate: math.max( 150 * 1000, - (original.encoding!.maxBitrate / (math.pow(scale, 2) * (original.encoding!.maxFramerate / fps))).floor(), + (originalEncoding.maxBitrate / math.pow(scale, 2)).floor(), ), - maxFramerate: fps, + maxFramerate: originalEncoding.maxFramerate, + bitratePriority: originalEncoding.bitratePriority, + networkPriority: originalEncoding.networkPriority, ), - ); - }).toList(); + ), + ]; } static List _computeDefaultSimulcastParams({ diff --git a/test/utils_test.dart b/test/utils_test.dart index 0a1ef7a28..884057b74 100644 --- a/test/utils_test.dart +++ b/test/utils_test.dart @@ -13,7 +13,9 @@ // limitations under the License. import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:livekit_client/livekit_client.dart' as lk; import 'package:livekit_client/src/utils.dart'; void main() { @@ -54,4 +56,31 @@ void main() { ), ); }); + + group('screen share simulcast encodings', () { + test('default lower layer follows top layer fps and priorities', () { + final encodings = Utils.computeVideoEncodings( + isScreenShare: true, + dimensions: const lk.VideoDimensions(1920, 1080), + options: const lk.VideoPublishOptions( + screenShareEncoding: lk.VideoEncoding( + maxBitrate: 2500000, + maxFramerate: 15, + bitratePriority: lk.Priority.high, + networkPriority: lk.Priority.high, + ), + ), + ); + + expect(encodings, hasLength(2)); + + final lowLayer = encodings![0]; + expect(lowLayer.rid, 'q'); + expect(lowLayer.scaleResolutionDownBy, 2); + expect(lowLayer.maxFramerate, 15); + expect(lowLayer.maxBitrate, 625000); + expect(lowLayer.priority, rtc.RTCPriorityType.high); + expect(lowLayer.networkPriority, rtc.RTCPriorityType.high); + }); + }); } From 65071699f27958d56055cb262744eb89bc0ac936 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 19 May 2026 12:52:42 +0900 Subject: [PATCH 2/3] fix: align screen share preset bitrates --- lib/src/types/video_parameters.dart | 4 ++-- test/utils_test.dart | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/src/types/video_parameters.dart b/lib/src/types/video_parameters.dart index 0ce57f904..b982b64c6 100644 --- a/lib/src/types/video_parameters.dart +++ b/lib/src/types/video_parameters.dart @@ -274,7 +274,7 @@ extension VideoParametersPresets on VideoParameters { static const screenShareH720FPS5 = VideoParameters( dimensions: VideoDimensionsPresets.h720_169, encoding: VideoEncoding( - maxBitrate: 400 * 1000, + maxBitrate: 800 * 1000, maxFramerate: 5, ), ); @@ -298,7 +298,7 @@ extension VideoParametersPresets on VideoParameters { static const screenShareH1080FPS30 = VideoParameters( dimensions: VideoDimensionsPresets.h1080_169, encoding: VideoEncoding( - maxBitrate: 4000 * 1000, + maxBitrate: 5000 * 1000, maxFramerate: 30, ), ); diff --git a/test/utils_test.dart b/test/utils_test.dart index 884057b74..535ae1927 100644 --- a/test/utils_test.dart +++ b/test/utils_test.dart @@ -58,6 +58,11 @@ void main() { }); group('screen share simulcast encodings', () { + test('screen share preset bitrates match common SDK presets', () { + expect(lk.VideoParametersPresets.screenShareH720FPS5.encoding?.maxBitrate, 800000); + expect(lk.VideoParametersPresets.screenShareH1080FPS30.encoding?.maxBitrate, 5000000); + }); + test('default lower layer follows top layer fps and priorities', () { final encodings = Utils.computeVideoEncodings( isScreenShare: true, From 4b2daf5a82364f1eb71995a13478f86282a742b5 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 19 May 2026 12:59:55 +0900 Subject: [PATCH 3/3] changes --- .changes/align-screenshare-simulcast-defaults | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changes/align-screenshare-simulcast-defaults diff --git a/.changes/align-screenshare-simulcast-defaults b/.changes/align-screenshare-simulcast-defaults new file mode 100644 index 000000000..949dce0a6 --- /dev/null +++ b/.changes/align-screenshare-simulcast-defaults @@ -0,0 +1 @@ +patch type="fixed" "Align screen share simulcast defaults"