webrtc 代码学习(三十五) SDP 创建,待续

SDP 创建
作者:LanPZzzz

文章目录

          • 1. 流程 CreateOffer 就已经完成了
          • 2.

1. 流程 CreateOffer 就已经完成了

-> PeerConnection::CreateOffer (pc\peerconnection.cc 1755)
-> PeerConnection::GetOptionsForOffer (\pc\peerconnection.cc 3675)
-> PeerConnection::GetOptionsForUnifiedPlanOffer (\pc\peerconnection.cc 3833)
-> local_contents 和 remote_contents 都没有
-> for (auto transceiver : transceivers_) , transceivers 有2个
-> GetMediaDescriptionOptionsForTransceiver (pc\peerconnection.cc 3807) 返回 cricket::MediaDescriptionOptions
-> 这里根据 transceivers_ 获取audio/video/data 的 description
-> 到这里就已经获取到 description
-> WebRtcSessionDescriptionFactory::CreateOffer (pc\webrtcsessiondescriptionfactory.cc 208) 创建request,并push
->   CreateSessionDescriptionRequest request(CreateSessionDescriptionRequest::kOffer, observer, session_options);
-> create_session_description_requests_.push(request);
->
->
->
->
->

2.

-> OnMessage(Message* msg) override (rtc_base\rtccertificategenerator.cc 59) case MSG_GENERATE_DONE
-> SignalCertificateReady => WebRtcSessionDescriptionFactory::SetCertificate (\pc\webrtcsessiondescriptionfactory.cc 465)(代码1)
-> SignalCertificateReady => PeerConnection::OnCertificateReady (\pc\peerconnection.cc 5279)
->JsepTransportController::SetLocalCertificate (pc\jseptransportcontroller.cc 209) 这里什么都没有做
->
->WebRtcSessionDescriptionFactory::InternalCreateOffer (pc\webrtcsessiondescriptionfactory.cc 319) 或者 WebRtcSessionDescriptionFactory::InternalCreateAnswer (pc\webrtcsessiondescriptionfactory.cc 365)
-> MediaSessionDescriptionFactory::CreateOffer (pc\mediasession.cc 1264)
-> std::unique_ptr offer(new SessionDescription());
-> GetCurrentStreamParams (pc\mediasession.cc 292) 根据如参获取stream params,但是我的入参是没有,返回null
-> MediaSessionDescriptionFactory::GetCodecsForOffer (pc\mediasession.cc 1610)
->   if (current_description) { MergeCodecsFromDescription(current_description, audio_codecs, video_codecs,data_codecs, &used_pltypes);} 如果 current_description,就先加入 current_description 到 audio_codecs, video_codecs,data_codecs
-> MergeCodecs(all_audio_codecs_, audio_codecs, &used_pltypes);
-> MergeCodecs(video_codecs_, video_codecs, &used_pltypes);
-> MergeCodecs(data_codecs_, data_codecs, &used_pltypes);
-> 然后加入不在 current_description 的 codec 队列
->
-> FilterDataCodecs (pc\mediasession.cc 309)
-> 入参 sctp = true,  const char* codec_name = sctp ? kGoogleRtpDataCodecName : kGoogleSctpDataCodecName;
-> 这里从 codec 中去掉了 name = kGoogleRtpDataCodecName
-> MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer (pc\mediasession.cc 1714)
-> 如果 current_description 不是空, for (const ContentInfo& content : current_description->contents())
-> audio_rtp_header_extensions(pc\mediasession.h 127) 入参unified_plan = true,
-> const char RtpExtension::kMidUri[] = “urn:ietf:params:rtp-hdrext:sdes:mid”;
-> const int RtpExtension::kMidDefaultId = 9;
-> 在audio增加了上面两个属性
-> MergeRtpHdrExts (pc\mediasession.cc 960)
-> reference_extensions 是 audio 的,有 urn:ietf:params:rtp-hdrext:sdes:mid 和 urn:ietf:params:rtp-hdrext:ssrc-audio-level
-> reference_extension.encrypt = false
->used_ids->FindAndSetIdUsed(&reference_extension);
->regular_extensions->push_back(reference_extension);
->offered_extensions->push_back(reference_extension);
-> video_rtp_header_extensions (pc\mediasession.h 141) 入参unified_plan = true,
-> MergeRtpHdrExts (pc\mediasession.cc 960)
->eference_extensions 是 video 的,有 urn:ietf:params:rtp-hdrext:toffset,http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, urn:3gpp:video-orientation, http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01, http://www.webrtc.org/experiments/rtp-hdrext/playout-delay, http://www.webrtc.org/experiments/rtp-hdrext/video-content-type, http://www.webrtc.org/experiments/rtp-hdrext/video-timing,urn:ietf:params:rtp-hdrext:sdes:mid
->
-> for (const MediaDescriptionOptions& media_description_options :session_options.media_description_options) { switch (media_description_options.type) audio/video/data
-> MediaSessionDescriptionFactory::AddAudioContentForOffer(pc\mediasession.cc 1831)
-> MediaSessionDescriptionFactory::GetAudioCodecsForOffer(pc\mediasession.cc 1546) 获取14个 audio 支持
-> CreateMediaContentOffer(pc\mediasession.cc 682)
-> AddStreamParams (pc\mediasession.cc 412)
-> 创建 stream,保存ssrc 等信息到 offer 上
->
->
-> SetMediaProtocol (pc\mediasession.cc 1143)
-> secure_transport = true,kMediaProtocolDtlsSavpf = UDP/TLS/RTP/SAVPF
```
if (!desc->cryptos().empty())
desc->set_protocol(kMediaProtocolSavpf);
else if (secure_transport)
desc->set_protocol(kMediaProtocolDtlsSavpf);
else
desc->set_protocol(kMediaProtocolAvpf);
->
-> SessionDescription::AddContent (pc\sessiondescription.cc 168) 把上面的 params 添加到 offer 中 contents_
-> MediaSessionDescriptionFactory::AddTransportOffer (pc\mediasession.cc 1768)
-> GetTransportDescription (pc\mediasession.cc 1155) 这次获取的是null
->TransportDescriptionFactory::CreateOffer (\p2p\base\transportdescriptionfactory.cc 28)
-> desc->ice_ufrag = rtc::CreateRandomString(ICE_UFRAG_LENGTH);
-> desc->ice_pwd = rtc::CreateRandomString(ICE_PWD_LENGTH);
-> 创建 ufrag,pwd
-> TransportDescriptionFactory::SetSecurityInfo (p2p\base\transportdescriptionfactory.cc 109)
-> SSLFingerprint::CreateFromCertificate (\rtc_base\sslfingerprint.cc 65) 这里不知道是干什么????
->
->
-> SessionDescription::AddTransportInfo (\pc\sessiondescription.cc 205) 把上边 TransportDescriptionFactory::CreateOffer 加入到 offer 的 transport_infos_ 中
->
->
->MediaSessionDescriptionFactory::AddVideoContentForOffer(pc\mediasession.cc 1902) 到这里了============
->MediaSessionDescriptionFactory::AddDataContentForOffer(pc\mediasession.cc 1970)
->
->
->
->
->
->

代码 1
void WebRtcSessionDescriptionFactory::SetCertificate(
    const rtc::scoped_refptr& certificate) {
  RTC_DCHECK(certificate);
  RTC_LOG(LS_VERBOSE) << "Setting new certificate.";

  certificate_request_state_ = CERTIFICATE_SUCCEEDED;
  SignalCertificateReady(certificate);

  设置 certificate
  transport_desc_factory_.set_certificate(certificate);
  transport_desc_factory_.set_secure(cricket::SEC_ENABLED);

  因为上面设置了,下面看下是否是 offer 或者 answer
  while (!create_session_description_requests_.empty()) {
    if (create_session_description_requests_.front().type ==
        CreateSessionDescriptionRequest::kOffer) {
      InternalCreateOffer(create_session_description_requests_.front());
    } else {
      InternalCreateAnswer(create_session_description_requests_.front());
    }
    create_session_description_requests_.pop();
  }
}

你可能感兴趣的:(webrtc学习)