Skip to content

Commit 19c73b0

Browse files
authored
support target resolution setting (#789)
1 parent 8a272a7 commit 19c73b0

File tree

3 files changed

+92
-29
lines changed

3 files changed

+92
-29
lines changed

packages/stream_video/lib/src/call/call.dart

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,8 @@ class Call {
13121312
? FacingMode.user
13131313
: FacingMode.environment,
13141314
speakerDefaultOn: settings.audio.speakerDefaultOn,
1315+
targetResolution: settings.video.targetResolution,
1316+
screenShareTargetResolution: settings.screenShare.targetResolution,
13151317
);
13161318
}
13171319

@@ -1320,9 +1322,13 @@ class Call {
13201322
await _applyCameraOption(
13211323
_connectOptions.camera,
13221324
_connectOptions.cameraFacingMode,
1325+
_connectOptions.targetResolution,
13231326
);
13241327
await _applyMicrophoneOption(_connectOptions.microphone);
1325-
await _applyScreenShareOption(_connectOptions.screenShare);
1328+
await _applyScreenShareOption(
1329+
_connectOptions.screenShare,
1330+
_connectOptions.screenShareTargetResolution,
1331+
);
13261332

13271333
if (_connectOptions.audioInputDevice != null) {
13281334
await setAudioInputDevice(_connectOptions.audioInputDevice!);
@@ -1344,6 +1350,7 @@ class Call {
13441350
Future<void> _applyCameraOption(
13451351
TrackOption cameraOption,
13461352
FacingMode facingMode,
1353+
StreamTargetResolution? targetResolution,
13471354
) async {
13481355
if (cameraOption is TrackProvided) {
13491356
await _setLocalTrack(cameraOption.track);
@@ -1352,6 +1359,8 @@ class Call {
13521359
enabled: true,
13531360
constraints: CameraConstraints(
13541361
facingMode: facingMode,
1362+
params: targetResolution?.toVideoParams() ??
1363+
RtcVideoParametersPresets.h720_16x9,
13551364
),
13561365
);
13571366
}
@@ -1365,11 +1374,22 @@ class Call {
13651374
}
13661375
}
13671376

1368-
Future<void> _applyScreenShareOption(TrackOption screenShareOption) async {
1377+
Future<void> _applyScreenShareOption(
1378+
TrackOption screenShareOption,
1379+
StreamTargetResolution? targetResolution,
1380+
) async {
13691381
if (screenShareOption is TrackProvided) {
13701382
await _setLocalTrack(screenShareOption.track);
13711383
} else if (screenShareOption is TrackEnabled) {
1372-
await setScreenShareEnabled(enabled: true);
1384+
await setScreenShareEnabled(
1385+
enabled: true,
1386+
constraints: ScreenShareConstraints(
1387+
params: targetResolution?.toVideoParams(
1388+
defaultBitrate: RtcVideoParametersPresets.k1080pBitrate,
1389+
) ??
1390+
RtcVideoParametersPresets.h1080_16x9,
1391+
),
1392+
);
13731393
}
13741394
}
13751395

@@ -1842,9 +1862,17 @@ class Call {
18421862
return Result.error('Missing permission to share screen for the user');
18431863
}
18441864

1865+
final updatedConstraints =
1866+
(constraints ?? const ScreenShareConstraints()).copyWith(
1867+
params: constraints?.params ??
1868+
_connectOptions.screenShareTargetResolution?.toVideoParams(
1869+
defaultBitrate: RtcVideoParametersPresets.k1080pBitrate,
1870+
),
1871+
);
1872+
18451873
final result = await _session?.setScreenShareEnabled(
18461874
enabled,
1847-
constraints: constraints,
1875+
constraints: updatedConstraints,
18481876
) ??
18491877
Result.error('Call session is null, cannot start screen share');
18501878

packages/stream_video/lib/src/call/call_connect_options.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class CallConnectOptions with EquatableMixin {
1111
this.audioInputDevice,
1212
this.speakerDefaultOn = false,
1313
this.cameraFacingMode = FacingMode.user,
14+
this.targetResolution,
15+
this.screenShareTargetResolution,
1416
});
1517

1618
final TrackOption camera;
@@ -22,6 +24,8 @@ class CallConnectOptions with EquatableMixin {
2224
final bool speakerDefaultOn;
2325

2426
final FacingMode cameraFacingMode;
27+
final StreamTargetResolution? targetResolution;
28+
final StreamTargetResolution? screenShareTargetResolution;
2529

2630
CallConnectOptions copyWith({
2731
TrackOption? camera,
@@ -31,6 +35,8 @@ class CallConnectOptions with EquatableMixin {
3135
RtcMediaDevice? audioInputDevice,
3236
FacingMode? cameraFacingMode,
3337
bool? speakerDefaultOn,
38+
StreamTargetResolution? targetResolution,
39+
StreamTargetResolution? screenShareTargetResolution,
3440
}) {
3541
return CallConnectOptions(
3642
camera: camera ?? this.camera,
@@ -40,6 +46,9 @@ class CallConnectOptions with EquatableMixin {
4046
audioInputDevice: audioInputDevice ?? this.audioInputDevice,
4147
cameraFacingMode: cameraFacingMode ?? this.cameraFacingMode,
4248
speakerDefaultOn: speakerDefaultOn ?? this.speakerDefaultOn,
49+
targetResolution: targetResolution ?? this.targetResolution,
50+
screenShareTargetResolution:
51+
screenShareTargetResolution ?? this.screenShareTargetResolution,
4352
);
4453
}
4554

@@ -52,6 +61,8 @@ class CallConnectOptions with EquatableMixin {
5261
audioInputDevice: other.audioInputDevice,
5362
cameraFacingMode: other.cameraFacingMode,
5463
speakerDefaultOn: other.speakerDefaultOn,
64+
targetResolution: other.targetResolution,
65+
screenShareTargetResolution: other.screenShareTargetResolution,
5566
);
5667
}
5768

@@ -64,6 +75,8 @@ class CallConnectOptions with EquatableMixin {
6475
audioInputDevice,
6576
cameraFacingMode,
6677
speakerDefaultOn,
78+
targetResolution,
79+
screenShareTargetResolution,
6780
];
6881

6982
@override
@@ -76,6 +89,8 @@ class CallConnectOptions with EquatableMixin {
7689
' audioInput: $audioInputDevice, '
7790
' cameraFacingMode: $cameraFacingMode, '
7891
' speakerDefaultOn: $speakerDefaultOn'
92+
' targetResolution: $targetResolution'
93+
' screenShareTargetResolution: $screenShareTargetResolution'
7994
'}';
8095
}
8196
}

packages/stream_video/lib/src/models/call_settings.dart

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import 'package:equatable/equatable.dart';
22

33
import '../../open_api/video/coordinator/api.dart';
4+
import '../webrtc/model/rtc_video_dimension.dart';
5+
import '../webrtc/model/rtc_video_encoding.dart';
6+
import '../webrtc/model/rtc_video_parameters.dart';
47

58
class CallSettings with EquatableMixin {
69
const CallSettings({
@@ -123,8 +126,10 @@ class StreamVideoSettings extends MediaSettings {
123126
this.enabled = false,
124127
this.cameraDefaultOn = true,
125128
this.cameraFacing = VideoSettingsRequestCameraFacingEnum.front,
126-
this.targetResolution =
127-
const StreamTargetResolution(height: 1280, width: 720),
129+
this.targetResolution = const StreamTargetResolution(
130+
height: 720,
131+
width: 1280,
132+
),
128133
});
129134

130135
final bool enabled;
@@ -357,6 +362,44 @@ class StreamHlsSettings extends AbstractSettings {
357362
List<Object?> get props => [enabled, autoOn, qualityTracks];
358363
}
359364

365+
class StreamTargetResolution extends AbstractSettings {
366+
const StreamTargetResolution({
367+
required this.height,
368+
required this.width,
369+
this.bitrate,
370+
});
371+
372+
final int height;
373+
final int width;
374+
final int? bitrate;
375+
376+
@override
377+
List<Object?> get props => [height, width, bitrate];
378+
379+
TargetResolution toOpenDto() {
380+
return TargetResolution(
381+
height: height,
382+
width: width,
383+
bitrate: bitrate,
384+
);
385+
}
386+
387+
RtcVideoParameters toVideoParams({
388+
int defaultBitrate = RtcVideoParametersPresets.k720pBitrate,
389+
}) {
390+
return RtcVideoParameters(
391+
dimension: RtcVideoDimension(
392+
width: width,
393+
height: height,
394+
),
395+
encoding: RtcVideoEncoding(
396+
maxFramerate: 30,
397+
maxBitrate: bitrate ?? defaultBitrate,
398+
),
399+
);
400+
}
401+
}
402+
360403
class StreamRtmpSettings extends AbstractSettings {
361404
const StreamRtmpSettings({
362405
required this.quality,
@@ -485,26 +528,3 @@ enum NoiceCancellationSettingsMode {
485528
}
486529
}
487530
}
488-
489-
class StreamTargetResolution extends AbstractSettings {
490-
const StreamTargetResolution({
491-
required this.height,
492-
required this.width,
493-
this.bitrate,
494-
});
495-
496-
final int height;
497-
final int width;
498-
final int? bitrate;
499-
500-
@override
501-
List<Object?> get props => [height, width, bitrate];
502-
503-
TargetResolution toOpenDto() {
504-
return TargetResolution(
505-
height: height,
506-
width: width,
507-
bitrate: bitrate,
508-
);
509-
}
510-
}

0 commit comments

Comments
 (0)