SetLocal 和 SetRemote
作者:LanPZzzz
文章目录
1. 获取到 offer, SetRemoteDescription,然后CreateAnswer
-> PeerConnection::SetRemoteDescription
->PeerConnection::ApplyRemoteDescription, 这里的主要参照是 offer 中的 sdp
->PeerConnection::UpdateTransceiversAndDataChannels
-> new_session 中有 offer 信息, const ContentInfos& new_contents = new_session.description()->contents(); 中 old_local_description 和 old_remote_description 都是null
-> for (size_t i = 0; i < new_contents.size(); ++i)
-> PeerConnection::AssociateTransceiver
-> PeerConnection::GetAssociatedTransceiver 根据 mid 从 transceivers_ 获取 transceiver,mid = content.name, sdp 中 a=mid:0。(代码1),可能找不到
-> 如果上面找不到 transceiver, RtpTransceiverDirectionHasRecv 是否是有Recv的, 如果是 PeerConnection::FindAvailableTransceiverToReceive 根据 type 值找
-> 找不到,就在重新创建 transceiver
-> transceiver->internal()->set_mid(content.name); transceiver->internal()->set_mline_index(mline_index); 设置
->
->PeerConnection::UpdateTransceiverChannel 设置Channel, 如果原先的没有,创建VoiceChannel 或者 VideoChannel
->
->
->
-> PeerConnection::UpdateSessionState
-> 如果是IsUnifiedPlan, for (auto transceiver : transceivers_) (代码2)
->PeerConnection::FindMediaSectionForTransceiver
-> return sdesc->description()->GetContentByName(transceiver->internal()->mid()); 根据 transceiver 的mid 获取 ContentInfo,因为上面已经设置了可用的 transceiver 的mid,这里就是找上面可用的,不可用就不要了
->
->
-> for (auto transceiver : now_receiving_transceivers) 经过代码2,获取出可用的 transceiver
-> StatsCollector::AddTrack
-> CreateTrackReport
->
-> Conductor::OnAddTrack,回调给外面
->
->
->
->
->
->
代码1
PeerConnection::FindAvailableTransceiverToReceive
。。。
for (auto transceiver : transceivers_) {
if (transceiver->media_type() == media_type &&
transceiver->internal()->created_by_addtrack() && !transceiver->mid() &&
!transceiver->stopped()) {
return transceiver;
}
}
。。。。
代码2
for (auto transceiver : transceivers_) {
根据上面的 mid 获取 content,获取到的是可用的
const ContentInfo* content =
FindMediaSectionForTransceiver(transceiver, remote_description());
if (!content) {
continue;
}
const MediaContentDescription* media_desc = content->media_description();
RtpTransceiverDirection local_direction =
RtpTransceiverDirectionReversed(media_desc->direction());
// From the WebRTC specification, steps 2.2.8.5/6 of section 4.4.1.6 "Set
// the RTCSessionDescription: If direction is sendrecv or recvonly, and
// transceiver's current direction is neither sendrecv nor recvonly,
// process the addition of a remote track for the media description.
获取 stream
std::vector<std::string> stream_ids;
if (!media_desc->streams().empty()) {
// The remote description has signaled the stream IDs.
stream_ids = media_desc->streams()[0].stream_ids();
}
if (RtpTransceiverDirectionHasRecv(local_direction) &&
(!transceiver->fired_direction() ||
!RtpTransceiverDirectionHasRecv(*transceiver->fired_direction()))) {
RTC_LOG(LS_INFO) << "Processing the addition of a new track for MID="
<< content->name << " (added to "
<< GetStreamIdsString(stream_ids) << ").";
std::vector<rtc::scoped_refptr<MediaStreamInterface>> media_streams;
枚举stream
for (const std::string& stream_id : stream_ids) {
rtc::scoped_refptr<MediaStreamInterface> stream =
remote_streams_->find(stream_id);
没有找到,就重新创建
if (!stream) {
stream = MediaStreamProxy::Create(rtc::Thread::Current(),
MediaStream::Create(s