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