computeVideoEncodings static method

  1. @internal
List<RTCRtpEncoding>? computeVideoEncodings({
  1. required bool isScreenShare,
  2. VideoDimensions? dimensions,
  3. VideoPublishOptions? options,
})

Implementation

@internal
static List<rtc.RTCRtpEncoding>? computeVideoEncodings({
  required bool isScreenShare,
  VideoDimensions? dimensions,
  VideoPublishOptions? options,
}) {
  options ??= const VideoPublishOptions();

  VideoEncoding? videoEncoding = options.videoEncoding;

  if ((videoEncoding == null && !options.simulcast) || dimensions == null) {
    // don't set encoding when we are not simulcasting and user isn't restricting
    // encoding parameters
    return [rtc.RTCRtpEncoding()];
  }

  final presets = _presetsForDimensions(
    isScreenShare: isScreenShare,
    dimensions: dimensions,
  );

  if (videoEncoding == null) {
    // find the right encoding based on width/height
    videoEncoding = _findAppropriateEncoding(
      isScreenShare: isScreenShare,
      dimensions: dimensions,
      presets: presets,
    );

    logger.fine('using video encoding', videoEncoding);
  }

  if (!options.simulcast) {
    // not using simulcast
    return [videoEncoding.toRTCRtpEncoding()];
  }

  final original = VideoParameters(
    dimensions: dimensions,
    encoding: videoEncoding,
  );

  final userParams = isScreenShare
      ? options.screenShareSimulcastLayers
      : options.videoSimulcastLayers;

  final params = (userParams.isNotEmpty
          ? userParams
          : _computeDefaultSimulcastParams(
              isScreenShare: isScreenShare, original: original))
      .sorted();

  final VideoParameters lowPreset = params.first;
  VideoParameters? midPreset;
  if (params.length > 1) {
    midPreset = params[1];
  }

  final size = dimensions.max();
  List<VideoParameters> computedParams = [original];

  if (size >= 960 && midPreset != null) {
    computedParams = [lowPreset, midPreset, original];
  } else if (size >= 480) {
    computedParams = [lowPreset, original];
  }

  return encodingsFromPresets(
    dimensions,
    presets: computedParams,
  );
}