buildAvOffer function

String buildAvOffer({
  1. required String username,
  2. required String localHost,
  3. required int audioPort,
  4. int? videoPort,
  5. G711Variant audioPreferred = G711Variant.pcmu,
  6. G711Variant? audioSecond = G711Variant.pcma,
  7. int? audioRtcpPort,
  8. int? telephoneEventPt = 101,
  9. String telephoneEventRange = '0-15',
  10. int videoPayloadType = 96,
  11. SdpVideoCodec videoCodec = SdpVideoCodec.vp8,
  12. int? videoRtcpPort,
  13. SdpDirection direction = SdpDirection.sendrecv,
  14. int? sessionId,
  15. int? sessionVersion,
})

Build an audio+video SDP offer/answer. Audio uses the same defaults as buildG711Offer; video advertises VP8 on PT 96 by default.

Implementation

String buildAvOffer({
  required String username,
  required String localHost,
  required int audioPort,
  int? videoPort,
  G711Variant audioPreferred = G711Variant.pcmu,
  G711Variant? audioSecond = G711Variant.pcma,
  int? audioRtcpPort,
  int? telephoneEventPt = 101,
  String telephoneEventRange = '0-15',
  int videoPayloadType = 96,
  SdpVideoCodec videoCodec = SdpVideoCodec.vp8,
  int? videoRtcpPort,
  SdpDirection direction = SdpDirection.sendrecv,
  int? sessionId,
  int? sessionVersion,
}) {
  final sid = sessionId ?? DateTime.now().millisecondsSinceEpoch ~/ 1000;
  final ver = sessionVersion ?? sid;
  final audioPts = <G711Variant>[
    audioPreferred,
    if (audioSecond != null && audioSecond != audioPreferred) audioSecond,
  ];
  final audioPtNumbers = audioPts.map((v) => v.payloadType).toList();
  if (telephoneEventPt != null) audioPtNumbers.add(telephoneEventPt);

  final lines = <String>[
    'v=0',
    'o=$username $sid $ver IN IP4 $localHost',
    's=flutter_sip_ua',
    'c=IN IP4 $localHost',
    't=0 0',
    'm=audio $audioPort RTP/AVP ${audioPtNumbers.join(' ')}',
    for (final v in audioPts) 'a=rtpmap:${v.payloadType} ${v.rtpmap}/8000',
    if (telephoneEventPt != null) ...[
      'a=rtpmap:$telephoneEventPt telephone-event/8000',
      'a=fmtp:$telephoneEventPt $telephoneEventRange',
    ],
    if (audioRtcpPort != null) 'a=rtcp:$audioRtcpPort',
    'a=ptime:20',
    'a=${_directionToken(direction)}',
    if (videoPort != null) ...[
      'm=video $videoPort RTP/AVP $videoPayloadType',
      'a=rtpmap:$videoPayloadType ${videoCodec.rtpmap}/${videoCodec.clockRate}',
      if (videoRtcpPort != null) 'a=rtcp:$videoRtcpPort',
      'a=${_directionToken(direction)}',
    ],
  ];
  return '${lines.join('\r\n')}\r\n';
}