generateProfileLevelIdForAnswer static method

String? generateProfileLevelIdForAnswer({
  1. Map local_supported_params = const {},
  2. Map remote_offered_params = const {},
})

Implementation

static String? generateProfileLevelIdForAnswer({
  Map<dynamic, dynamic> local_supported_params = const {},
  Map<dynamic, dynamic> remote_offered_params = const {},
}) {
  // If both local and remote params do not contain profile-level-id, they are
	  // both using the default profile. In this case, don't return anything.
  if (local_supported_params['profile-level-id'] == null && remote_offered_params['profile-level-id'] == null) {
    print('generateProfileLevelIdForAnswer() | no profile-level-id in local and remote params');

    return null;
  }

  // Parse profile-level-ids.
  final ProfileLevelId? local_profile_level_id = parseSdpProfileLevelId(params: local_supported_params);
  final ProfileLevelId? remote_profile_level_id = parseSdpProfileLevelId(params: remote_offered_params);

  // The local and remote codec must have valid and equal H264 Profiles.
  if (local_profile_level_id == null) {
    throw('invalid local_profile_level_id');
  }
  if (remote_profile_level_id == null) {
    throw('invalid remote_profile_level_id');
  }

  if (local_profile_level_id.profile != local_profile_level_id.profile) {
    throw('H264 Profile mismatch');
  }

  // Parse level information.
  final bool level_asymmetry_allowed = (isLevelAsymmetryAllowed(params: local_supported_params) && isLevelAsymmetryAllowed(params: remote_offered_params));

  final int local_level = local_profile_level_id.level;
  final int remote_level = remote_profile_level_id.level;
  final int min_level = minLevel(local_level, remote_level);

  // Determine answer level. When level asymmetry is not allowed, level upgrade
	  // is not allowed, i.e., the level in the answer must be equal to or lower
	  // than the level in the offer.
  final int answer_level = level_asymmetry_allowed ? local_level : min_level;

  print('generateProfileLevelIdForAnswer() | result: [profile:${local_profile_level_id.profile}, level:$answer_level');

  // Return the resulting profile-level-id for the answer parameters.
  return profileLevelIdToString(ProfileLevelId(profile: local_profile_level_id.profile, level: answer_level,));
}