optimizeVideo option

This commit is contained in:
Hiroshi Horie
2021-10-28 02:57:15 +09:00
parent a0a9acc9d9
commit 79a2d20702
6 changed files with 38 additions and 18 deletions
+9
View File
@@ -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,
}); });
} }
+5 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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>(
+1 -4
View File
@@ -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,
+8 -4
View File
@@ -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);
} }
} }