void MediaEndpointPeerConnection::createOfferTask(RTCOfferOptions&, SessionDescriptionPromise& promise) { ASSERT(!m_dtlsFingerprint.isEmpty()); RefPtr<MediaEndpointSessionConfiguration> configurationSnapshot = MediaEndpointSessionConfiguration::create(); configurationSnapshot->setSessionVersion(m_sdpSessionVersion++); RtpSenderVector senders = m_client->getSenders(); // Add media descriptions for senders. for (auto& sender : senders) { RefPtr<PeerMediaDescription> mediaDescription = PeerMediaDescription::create(); MediaStreamTrack* track = sender->track(); mediaDescription->setMediaStreamId(sender->mediaStreamIds()[0]); mediaDescription->setMediaStreamTrackId(track->id()); mediaDescription->setType(track->kind()); mediaDescription->setPayloads(track->kind() == "audio" ? m_defaultAudioPayloads : m_defaultVideoPayloads); mediaDescription->setDtlsFingerprintHashFunction(m_dtlsFingerprintFunction); mediaDescription->setDtlsFingerprint(m_dtlsFingerprint); mediaDescription->setCname(m_cname); mediaDescription->addSsrc(cryptographicallyRandomNumber()); mediaDescription->setIceUfrag(m_iceUfrag); mediaDescription->setIcePassword(m_icePassword); configurationSnapshot->addMediaDescription(WTFMove(mediaDescription)); } String sdpString; SDPProcessor::Result result = m_sdpProcessor->generate(*configurationSnapshot, sdpString); if (result != SDPProcessor::Result::Success) { LOG_ERROR("SDPProcessor internal error"); return; } promise.resolve(RTCSessionDescription::create("offer", sdpString)); }