optimizeVideo option
This commit is contained in:
@@ -12,10 +12,19 @@ class ConnectOptions {
|
||||
/// Default options used when publishing a audio track
|
||||
final AudioPublishOptions defaultAudioPublishOptions;
|
||||
|
||||
/// When this is turned on, the following optimizations will be made:
|
||||
/// - [RemoteTrackPublication] will be enabled/disabled based on the corresponding
|
||||
/// [VideoTrackRenderer]'s visibility on screen.
|
||||
/// - Re-sizing a [VideoTrackRenderer] will signal the server to send down
|
||||
/// a relavant quality layer (if simulcast is enabled on the publisher)
|
||||
/// defaults to true.
|
||||
final bool optimizeVideo;
|
||||
|
||||
const ConnectOptions({
|
||||
this.autoSubscribe = true,
|
||||
this.defaultVideoPublishOptions = const VideoPublishOptions(),
|
||||
this.defaultAudioPublishOptions = const AudioPublishOptions(),
|
||||
this.optimizeVideo = true,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import '../extensions.dart';
|
||||
import '../logger.dart';
|
||||
import '../managers/event.dart';
|
||||
import '../proto/livekit_models.pb.dart' as lk_models;
|
||||
import '../signal_client.dart';
|
||||
import '../rtc_engine.dart';
|
||||
import '../track/remote_track_publication.dart';
|
||||
import '../track/track.dart';
|
||||
import '../types.dart';
|
||||
@@ -17,11 +17,11 @@ import 'participant.dart';
|
||||
|
||||
/// Represents other participant in the [Room].
|
||||
class RemoteParticipant extends Participant {
|
||||
final SignalClient _client;
|
||||
SignalClient get client => _client;
|
||||
final RTCEngine _engine;
|
||||
RTCEngine get engine => _engine;
|
||||
|
||||
RemoteParticipant(
|
||||
this._client,
|
||||
this._engine,
|
||||
String sid,
|
||||
String identity, {
|
||||
required EventsEmitter<RoomEvent> roomEvents,
|
||||
@@ -32,7 +32,7 @@ class RemoteParticipant extends Participant {
|
||||
);
|
||||
|
||||
RemoteParticipant.fromInfo(
|
||||
this._client,
|
||||
this._engine,
|
||||
lk_models.ParticipantInfo info, {
|
||||
required EventsEmitter<RoomEvent> roomEvents,
|
||||
}) : super(
|
||||
|
||||
+3
-3
@@ -119,7 +119,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
||||
final joinResponse = await engine.join(
|
||||
url,
|
||||
token,
|
||||
options: options,
|
||||
connectOptions: options,
|
||||
);
|
||||
|
||||
logger.fine(
|
||||
@@ -227,14 +227,14 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
||||
|
||||
if (info == null) {
|
||||
participant = RemoteParticipant(
|
||||
engine.signalClient,
|
||||
engine,
|
||||
sid,
|
||||
'',
|
||||
roomEvents: events,
|
||||
);
|
||||
} else {
|
||||
participant = RemoteParticipant.fromInfo(
|
||||
engine.signalClient,
|
||||
engine,
|
||||
info,
|
||||
roomEvents: events,
|
||||
);
|
||||
|
||||
+12
-2
@@ -30,6 +30,8 @@ class RTCEngine extends Disposable with EventsEmittable<EngineEvent> {
|
||||
// config for RTCPeerConnection
|
||||
final RTCConfiguration? rtcConfig;
|
||||
|
||||
ConnectOptions connectOptions = const ConnectOptions();
|
||||
|
||||
@internal
|
||||
PCTransport? publisher;
|
||||
|
||||
@@ -91,13 +93,21 @@ class RTCEngine extends Disposable with EventsEmittable<EngineEvent> {
|
||||
Future<lk_rtc.JoinResponse> join(
|
||||
String url,
|
||||
String token, {
|
||||
ConnectOptions? options,
|
||||
ConnectOptions? connectOptions,
|
||||
}) async {
|
||||
this.url = url;
|
||||
this.token = token;
|
||||
|
||||
if (connectOptions != null) {
|
||||
this.connectOptions = connectOptions;
|
||||
}
|
||||
|
||||
// connect to rtc server
|
||||
await signalClient.connect(url, token, options: options);
|
||||
await signalClient.connect(
|
||||
url,
|
||||
token,
|
||||
options: this.connectOptions,
|
||||
);
|
||||
|
||||
// wait for join response
|
||||
final event = await _signalListener.waitFor<SignalConnectedEvent>(
|
||||
|
||||
@@ -41,11 +41,8 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
|
||||
Future<void> connect(
|
||||
String uriString,
|
||||
String token, {
|
||||
ConnectOptions? options,
|
||||
required ConnectOptions options,
|
||||
}) async {
|
||||
// Create default options if null
|
||||
options ??= const ConnectOptions();
|
||||
|
||||
final rtcUri = Utils.buildUri(
|
||||
uriString,
|
||||
token: token,
|
||||
|
||||
@@ -130,7 +130,7 @@ class RemoteTrackPublication extends TrackPublication {
|
||||
}
|
||||
|
||||
logger.fine('[Visibility] Sending to server ${settings.toProto3Json()}');
|
||||
_participant.client.sendUpdateTrackSettings(settings);
|
||||
_participant.engine.signalClient.sendUpdateTrackSettings(settings);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -141,7 +141,11 @@ class RemoteTrackPublication extends TrackPublication {
|
||||
super.track?.dispose();
|
||||
super.track = newValue;
|
||||
|
||||
if (newValue != null && newValue.kind == lk_models.TrackType.VIDEO) {
|
||||
// Only listen for visibility updates if video optimization is on
|
||||
// and the attached track is a video track
|
||||
if (_participant.engine.connectOptions.optimizeVideo &&
|
||||
newValue != null &&
|
||||
newValue.kind == lk_models.TrackType.VIDEO) {
|
||||
//
|
||||
// Attach visibility event listener (if video track)
|
||||
//
|
||||
@@ -223,7 +227,7 @@ class RemoteTrackPublication extends TrackPublication {
|
||||
trackSids: [sid],
|
||||
subscribe: subscribed,
|
||||
);
|
||||
_participant.client.sendUpdateSubscription(subscription);
|
||||
_participant.engine.signalClient.sendUpdateSubscription(subscription);
|
||||
}
|
||||
|
||||
void _sendUpdateTrackSettings() {
|
||||
@@ -234,6 +238,6 @@ class RemoteTrackPublication extends TrackPublication {
|
||||
if (kind == lk_models.TrackType.VIDEO) {
|
||||
settings.quality = _videoQuality;
|
||||
}
|
||||
_participant.client.sendUpdateTrackSettings(settings);
|
||||
_participant.engine.signalClient.sendUpdateTrackSettings(settings);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user