publishAdditionalCodecForPublication method
Implementation
Future<void> publishAdditionalCodecForPublication(
LocalTrackPublication publication,
String backupCodec,
) async {
if (publication.track is! LocalVideoTrack) {
throw Exception('multi-codec simulcast is supported only for video');
}
final track = publication.track as LocalVideoTrack;
final backupCodecOpts = publication.backupVideoCodec;
if (backupCodecOpts == null) {
throw Exception('backupCodec settings not specified');
}
var options = room.roomOptions.defaultVideoPublishOptions;
options = options.copyWith(simulcast: backupCodecOpts.simulcast);
if (backupCodec.toLowerCase() == publication.track?.codec?.toLowerCase()) {
// not needed, same codec already published
return;
}
if (backupCodec != backupCodecOpts.codec.toLowerCase()) {
logger.warning(
'requested a different codec than specified as backup serverRequested: ${backupCodec}, backup: ${backupCodecOpts.codec}',
);
}
final encodings = Utils.computeTrackBackupEncodings(track, backupCodecOpts);
if (encodings == null) {
logger.fine('backup codec has been disabled, ignoring request to add additional codec for track');
return;
}
final simulcastTrack = track.addSimulcastTrack(backupCodec, encodings);
final dimensions = track.currentOptions.params.dimensions;
final layers = Utils.computeVideoLayers(dimensions, encodings, isSVCCodec(backupCodec));
simulcastTrack.sender = await room.engine.createSimulcastTransceiverSender(
track,
simulcastTrack,
encodings,
publication,
backupCodec,
);
final cid = simulcastTrack.sender!.senderId;
final req = lk_rtc.AddTrackRequest(
cid: cid,
name: options.name ??
(track.source == TrackSource.screenShareVideo
? VideoPublishOptions.defaultScreenShareName
: VideoPublishOptions.defaultCameraName),
type: track.kind.toPBType(),
source: track.source.toPBType(),
muted: track.muted,
layers: layers,
sid: publication.sid,
simulcastCodecs: <lk_rtc.SimulcastCodec>[
lk_rtc.SimulcastCodec(
codec: backupCodec.toLowerCase(),
cid: cid,
),
],
);
// video specific
if (dimensions.width > 0 && dimensions.height > 0) {
req.width = dimensions.width;
req.height = dimensions.height;
}
final trackInfo = await room.engine.addTrack(req);
await room.engine.negotiate();
logger.info('published backupCodec $backupCodec for track ${track.sid}, track info ${trackInfo}');
}