源码路径:
api/peer_connection_interface.h
pc/peer_connection.cc
pc/sdp_offer_answer.cc对应规范:W3C WebRTC 1.0 §4.6.2
1、W3C 规范怎么定义 SetRemoteDescription
W3C 规范对 setRemoteDescription() 的核心要求:
将对端的 SDP 描述设置为远端描述,根据描述内容驱动本端 Transceiver 状态更新、Track 创建/移除、信令状态机推进。
与 SetLocalDescription 相比,SetRemoteDescription 多了一项关键职责: 触发 OnTrack / OnAddTrack 回调,通知应用层对端的媒体轨道已就绪。
规范要求:
同样必须通过 OperationsChain 串行执行
设置成功后信令状态按规则推进
Offer 时创建/更新 Transceiver,并触发
ontrack事件Answer 时确认方向,绑定 DtlsTransport
支持 Implicit Rollback(Unified Plan 下收到新 Offer 时自动回滚旧 Offer)
2、接口签名
// api/peer_connection_interface.h virtual void SetRemoteDescription( std::unique_ptr<SessionDescriptionInterface> desc, rtc::scoped_refptr<SetRemoteDescriptionObserverInterface> observer) = 0;与 SetLocalDescription 对称,同样是 Observer 异步回调。
3、完整调用链
应用层 pc->SetRemoteDescription(desc, observer) │ ▼ [Signaling Thread 断言] PeerConnection::SetRemoteDescription() │ 委托 sdp_handler_ ▼ SdpOfferAnswerHandler::SetRemoteDescription() │ 入 OperationsChain 串行队列 ▼ SdpOfferAnswerHandler::DoSetRemoteDescription() │ ├── ① Implicit Rollback 处理 ├── ② FillInMissingRemoteMids(兼容旧端点) ├── ③ ValidateSessionDescription(SDP 合法性校验) ├── ④ ApplyRemoteDescription(核心落地) │ ├── 更新描述槽位(pending/current) │ ├── PushdownTransportDescription(ICE+DTLS 下推) │ ├── UpdateTransceiversAndDataChannels(Transceiver 同步) │ ├── UpdateSessionState(状态机推进 + 媒体参数下推) │ ├── UseCandidatesInSessionDescription(应用内嵌候选) │ ├── CheckForRemoteIceRestart(ICE Restart 检测) │ ├── IceConnectionState → Checking │ └── OnTrack / OnAddTrack / OnRemoveTrack 回调触发 │ ├── ⑤ Answer 时 RemoveStoppedTransceivers └── ⑥ observer->OnSetRemoteDescriptionComplete(OK)4、DoSetRemoteDescription:入口与前置处理
void SdpOfferAnswerHandler::DoSetRemoteDescription( std::unique_ptr<SessionDescriptionInterface> desc, rtc::scoped_refptr<SetRemoteDescriptionObserverInterface> observer) { RTC_DCHECK_RUN_ON(signaling_thread()); // ... if (IsUnifiedPlan()) { if (pc_->configuration()->enable_implicit_rollback) { if (desc->GetType() == SdpType::kOffer && signaling_state() == PeerConnectionInterface::kHaveL