computeVideoEncodings static method
List<RTCRtpEncoding>?
computeVideoEncodings(
{ - required bool isScreenShare,
- VideoDimensions? dimensions,
- 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,
);
}