setPublishingCodecs method

Future<List<String>> setPublishingCodecs(
  1. List<SubscribedCodec> codecs,
  2. LocalTrack track, {
  3. bool force = false,
})

Re-applies codecs to the senders publishing them.

force asks for a write even where the sender already reports the state being applied, for a caller re-asserting a pause the sender lost without being told. It is narrowed per codec: one with every layer subscribed has nothing to re-assert, so its sender is left alone.

Implementation

Future<List<String>> setPublishingCodecs(
  List<lk_rtc.SubscribedCodec> codecs,
  LocalTrack track, {
  bool force = false,
}) async {
  logger.fine('setPublishingCodecs $codecs');

  // only enable simulcast codec for preference codec setted
  if (codec == null && codecs.isNotEmpty) {
    await setPublishingLayers(
      track,
      codecs[0].qualities,
      isSVC: isSVCCodec(codecs[0].codec),
      force: force && _hasPausedLayer(codecs[0]),
    );
    return [];
  }

  subscribedCodecs = codecs;

  final List<String> newCodecs = [];

  for (var codec in codecs) {
    final forceCodec = force && _hasPausedLayer(codec);
    if (this.codec?.toLowerCase() == codec.codec.toLowerCase()) {
      await setPublishingLayers(track, codec.qualities, isSVC: isSVCCodec(codec.codec), force: forceCodec);
    } else {
      final simulcastCodecInfo = simulcastCodecs[codec.codec];
      logger.fine('setPublishingCodecs $codecs');
      if (simulcastCodecInfo == null) {
        for (var q in codec.qualities) {
          if (q.enabled) {
            newCodecs.add(codec.codec.toLowerCase());
            break;
          }
        }
      } else if (simulcastCodecInfo.encodings != null && simulcastCodecInfo.sender != null) {
        logger.fine('setPublishingCodecs $codecs');
        await setPublishingLayersForSender(
          simulcastCodecInfo.sender!,
          simulcastCodecInfo.encodings!,
          codec.qualities,
          isSVC: isSVCCodec(codec.codec),
          force: forceCodec,
        );
      }
    }
  }
  return newCodecs;
}