Move a part of ApplyRemoteDescription() into a separate function.
This part is specific to unified plan and doesn't need most of the state related to the remote description (and doesn't return an error). Bug: none Change-Id: I0de66bdb2e925072a6d9010e4444e75d4574ae04 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/245102 Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Auto-Submit: Tomas Gunnarsson <tommi@webrtc.org> Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35642}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
b625edfa47
commit
651586c4e1
@ -1678,115 +1678,7 @@ RTCError SdpOfferAnswerHandler::ApplyRemoteDescription(
|
||||
}
|
||||
|
||||
if (is_unified_plan) {
|
||||
std::vector<rtc::scoped_refptr<RtpTransceiverInterface>>
|
||||
now_receiving_transceivers;
|
||||
std::vector<rtc::scoped_refptr<RtpTransceiverInterface>> remove_list;
|
||||
std::vector<rtc::scoped_refptr<MediaStreamInterface>> added_streams;
|
||||
std::vector<rtc::scoped_refptr<MediaStreamInterface>> removed_streams;
|
||||
for (const auto& transceiver_ext : transceivers()->List()) {
|
||||
const auto transceiver = transceiver_ext->internal();
|
||||
const ContentInfo* content =
|
||||
FindMediaSectionForTransceiver(transceiver, remote_description());
|
||||
if (!content) {
|
||||
continue;
|
||||
}
|
||||
const MediaContentDescription* media_desc = content->media_description();
|
||||
RtpTransceiverDirection local_direction =
|
||||
RtpTransceiverDirectionReversed(media_desc->direction());
|
||||
// Roughly the same as steps 2.2.8.6 of section 4.4.1.6 "Set the
|
||||
// RTCSessionDescription: Set the associated remote streams given
|
||||
// transceiver.[[Receiver]], msids, addList, and removeList".
|
||||
// https://w3c.github.io/webrtc-pc/#set-the-rtcsessiondescription
|
||||
if (RtpTransceiverDirectionHasRecv(local_direction)) {
|
||||
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();
|
||||
}
|
||||
transceivers()
|
||||
->StableState(transceiver_ext)
|
||||
->SetRemoteStreamIdsIfUnset(transceiver->receiver()->stream_ids());
|
||||
|
||||
RTC_LOG(LS_INFO) << "Processing the MSIDs for MID=" << content->name
|
||||
<< " (" << GetStreamIdsString(stream_ids) << ").";
|
||||
SetAssociatedRemoteStreams(transceiver->receiver_internal(), stream_ids,
|
||||
&added_streams, &removed_streams);
|
||||
// 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.
|
||||
if (!transceiver->fired_direction() ||
|
||||
!RtpTransceiverDirectionHasRecv(*transceiver->fired_direction())) {
|
||||
RTC_LOG(LS_INFO)
|
||||
<< "Processing the addition of a remote track for MID="
|
||||
<< content->name << ".";
|
||||
// Since the transceiver is passed to the user in an
|
||||
// OnTrack event, we must use the proxied transceiver.
|
||||
now_receiving_transceivers.push_back(transceiver_ext);
|
||||
}
|
||||
}
|
||||
// 2.2.8.1.9: If direction is "sendonly" or "inactive", and transceiver's
|
||||
// [[FiredDirection]] slot is either "sendrecv" or "recvonly", process the
|
||||
// removal of a remote track for the media description, given transceiver,
|
||||
// removeList, and muteTracks.
|
||||
if (!RtpTransceiverDirectionHasRecv(local_direction) &&
|
||||
(transceiver->fired_direction() &&
|
||||
RtpTransceiverDirectionHasRecv(*transceiver->fired_direction()))) {
|
||||
ProcessRemovalOfRemoteTrack(transceiver_ext, &remove_list,
|
||||
&removed_streams);
|
||||
}
|
||||
// 2.2.8.1.10: Set transceiver's [[FiredDirection]] slot to direction.
|
||||
transceiver->set_fired_direction(local_direction);
|
||||
// 2.2.8.1.11: If description is of type "answer" or "pranswer", then run
|
||||
// the following steps:
|
||||
if (type == SdpType::kPrAnswer || type == SdpType::kAnswer) {
|
||||
// 2.2.8.1.11.1: Set transceiver's [[CurrentDirection]] slot to
|
||||
// direction.
|
||||
transceiver->set_current_direction(local_direction);
|
||||
// 2.2.8.1.11.[3-6]: Set the transport internal slots.
|
||||
if (transceiver->mid()) {
|
||||
auto dtls_transport = LookupDtlsTransportByMid(pc_->network_thread(),
|
||||
transport_controller(),
|
||||
*transceiver->mid());
|
||||
transceiver->sender_internal()->set_transport(dtls_transport);
|
||||
transceiver->receiver_internal()->set_transport(dtls_transport);
|
||||
}
|
||||
}
|
||||
// 2.2.8.1.12: If the media description is rejected, and transceiver is
|
||||
// not already stopped, stop the RTCRtpTransceiver transceiver.
|
||||
if (content->rejected && !transceiver->stopped()) {
|
||||
RTC_LOG(LS_INFO) << "Stopping transceiver for MID=" << content->name
|
||||
<< " since the media section was rejected.";
|
||||
transceiver->StopTransceiverProcedure();
|
||||
}
|
||||
if (!content->rejected &&
|
||||
RtpTransceiverDirectionHasRecv(local_direction)) {
|
||||
if (!media_desc->streams().empty() &&
|
||||
media_desc->streams()[0].has_ssrcs()) {
|
||||
uint32_t ssrc = media_desc->streams()[0].first_ssrc();
|
||||
transceiver->receiver_internal()->SetupMediaChannel(ssrc);
|
||||
} else {
|
||||
transceiver->receiver_internal()->SetupUnsignaledMediaChannel();
|
||||
}
|
||||
}
|
||||
}
|
||||
// Once all processing has finished, fire off callbacks.
|
||||
auto observer = pc_->Observer();
|
||||
for (const auto& transceiver : now_receiving_transceivers) {
|
||||
pc_->stats()->AddTrack(transceiver->receiver()->track());
|
||||
observer->OnTrack(transceiver);
|
||||
observer->OnAddTrack(transceiver->receiver(),
|
||||
transceiver->receiver()->streams());
|
||||
}
|
||||
for (const auto& stream : added_streams) {
|
||||
observer->OnAddStream(stream);
|
||||
}
|
||||
for (const auto& transceiver : remove_list) {
|
||||
observer->OnRemoveTrack(transceiver->receiver());
|
||||
}
|
||||
for (const auto& stream : removed_streams) {
|
||||
observer->OnRemoveStream(stream);
|
||||
}
|
||||
ApplyRemoteDescriptionUpdateTransceiverState(type);
|
||||
}
|
||||
|
||||
const cricket::AudioContentDescription* audio_desc =
|
||||
@ -1817,6 +1709,118 @@ RTCError SdpOfferAnswerHandler::ApplyRemoteDescription(
|
||||
return RTCError::OK();
|
||||
}
|
||||
|
||||
void SdpOfferAnswerHandler::ApplyRemoteDescriptionUpdateTransceiverState(
|
||||
SdpType sdp_type) {
|
||||
RTC_DCHECK_RUN_ON(signaling_thread());
|
||||
RTC_DCHECK(IsUnifiedPlan());
|
||||
std::vector<rtc::scoped_refptr<RtpTransceiverInterface>>
|
||||
now_receiving_transceivers;
|
||||
std::vector<rtc::scoped_refptr<RtpTransceiverInterface>> remove_list;
|
||||
std::vector<rtc::scoped_refptr<MediaStreamInterface>> added_streams;
|
||||
std::vector<rtc::scoped_refptr<MediaStreamInterface>> removed_streams;
|
||||
for (const auto& transceiver_ext : transceivers()->List()) {
|
||||
const auto transceiver = transceiver_ext->internal();
|
||||
const ContentInfo* content =
|
||||
FindMediaSectionForTransceiver(transceiver, remote_description());
|
||||
if (!content) {
|
||||
continue;
|
||||
}
|
||||
const MediaContentDescription* media_desc = content->media_description();
|
||||
RtpTransceiverDirection local_direction =
|
||||
RtpTransceiverDirectionReversed(media_desc->direction());
|
||||
// Roughly the same as steps 2.2.8.6 of section 4.4.1.6 "Set the
|
||||
// RTCSessionDescription: Set the associated remote streams given
|
||||
// transceiver.[[Receiver]], msids, addList, and removeList".
|
||||
// https://w3c.github.io/webrtc-pc/#set-the-rtcsessiondescription
|
||||
if (RtpTransceiverDirectionHasRecv(local_direction)) {
|
||||
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();
|
||||
}
|
||||
transceivers()
|
||||
->StableState(transceiver_ext)
|
||||
->SetRemoteStreamIdsIfUnset(transceiver->receiver()->stream_ids());
|
||||
|
||||
RTC_LOG(LS_INFO) << "Processing the MSIDs for MID=" << content->name
|
||||
<< " (" << GetStreamIdsString(stream_ids) << ").";
|
||||
SetAssociatedRemoteStreams(transceiver->receiver_internal(), stream_ids,
|
||||
&added_streams, &removed_streams);
|
||||
// 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.
|
||||
if (!transceiver->fired_direction() ||
|
||||
!RtpTransceiverDirectionHasRecv(*transceiver->fired_direction())) {
|
||||
RTC_LOG(LS_INFO) << "Processing the addition of a remote track for MID="
|
||||
<< content->name << ".";
|
||||
// Since the transceiver is passed to the user in an
|
||||
// OnTrack event, we must use the proxied transceiver.
|
||||
now_receiving_transceivers.push_back(transceiver_ext);
|
||||
}
|
||||
}
|
||||
// 2.2.8.1.9: If direction is "sendonly" or "inactive", and transceiver's
|
||||
// [[FiredDirection]] slot is either "sendrecv" or "recvonly", process the
|
||||
// removal of a remote track for the media description, given transceiver,
|
||||
// removeList, and muteTracks.
|
||||
if (!RtpTransceiverDirectionHasRecv(local_direction) &&
|
||||
(transceiver->fired_direction() &&
|
||||
RtpTransceiverDirectionHasRecv(*transceiver->fired_direction()))) {
|
||||
ProcessRemovalOfRemoteTrack(transceiver_ext, &remove_list,
|
||||
&removed_streams);
|
||||
}
|
||||
// 2.2.8.1.10: Set transceiver's [[FiredDirection]] slot to direction.
|
||||
transceiver->set_fired_direction(local_direction);
|
||||
// 2.2.8.1.11: If description is of type "answer" or "pranswer", then run
|
||||
// the following steps:
|
||||
if (sdp_type == SdpType::kPrAnswer || sdp_type == SdpType::kAnswer) {
|
||||
// 2.2.8.1.11.1: Set transceiver's [[CurrentDirection]] slot to
|
||||
// direction.
|
||||
transceiver->set_current_direction(local_direction);
|
||||
// 2.2.8.1.11.[3-6]: Set the transport internal slots.
|
||||
if (transceiver->mid()) {
|
||||
auto dtls_transport = LookupDtlsTransportByMid(
|
||||
pc_->network_thread(), transport_controller(), *transceiver->mid());
|
||||
transceiver->sender_internal()->set_transport(dtls_transport);
|
||||
transceiver->receiver_internal()->set_transport(dtls_transport);
|
||||
}
|
||||
}
|
||||
// 2.2.8.1.12: If the media description is rejected, and transceiver is
|
||||
// not already stopped, stop the RTCRtpTransceiver transceiver.
|
||||
if (content->rejected && !transceiver->stopped()) {
|
||||
RTC_LOG(LS_INFO) << "Stopping transceiver for MID=" << content->name
|
||||
<< " since the media section was rejected.";
|
||||
transceiver->StopTransceiverProcedure();
|
||||
}
|
||||
if (!content->rejected && RtpTransceiverDirectionHasRecv(local_direction)) {
|
||||
if (!media_desc->streams().empty() &&
|
||||
media_desc->streams()[0].has_ssrcs()) {
|
||||
uint32_t ssrc = media_desc->streams()[0].first_ssrc();
|
||||
transceiver->receiver_internal()->SetupMediaChannel(ssrc);
|
||||
} else {
|
||||
transceiver->receiver_internal()->SetupUnsignaledMediaChannel();
|
||||
}
|
||||
}
|
||||
}
|
||||
// Once all processing has finished, fire off callbacks.
|
||||
auto observer = pc_->Observer();
|
||||
for (const auto& transceiver : now_receiving_transceivers) {
|
||||
pc_->stats()->AddTrack(transceiver->receiver()->track());
|
||||
observer->OnTrack(transceiver);
|
||||
observer->OnAddTrack(transceiver->receiver(),
|
||||
transceiver->receiver()->streams());
|
||||
}
|
||||
for (const auto& stream : added_streams) {
|
||||
observer->OnAddStream(stream);
|
||||
}
|
||||
for (const auto& transceiver : remove_list) {
|
||||
observer->OnRemoveTrack(transceiver->receiver());
|
||||
}
|
||||
for (const auto& stream : removed_streams) {
|
||||
observer->OnRemoveStream(stream);
|
||||
}
|
||||
}
|
||||
|
||||
void SdpOfferAnswerHandler::PlanBUpdateSendersAndReceivers(
|
||||
const cricket::ContentInfo* audio_content,
|
||||
const cricket::AudioContentDescription* audio_desc,
|
||||
|
@ -236,6 +236,9 @@ class SdpOfferAnswerHandler : public SdpStateProvider,
|
||||
const std::map<std::string, const cricket::ContentGroup*>&
|
||||
bundle_groups_by_mid);
|
||||
|
||||
// Part of ApplyRemoteDescription steps specific to Unified Plan.
|
||||
void ApplyRemoteDescriptionUpdateTransceiverState(SdpType sdp_type);
|
||||
|
||||
// Part of ApplyRemoteDescription steps specific to plan b.
|
||||
void PlanBUpdateSendersAndReceivers(
|
||||
const cricket::ContentInfo* audio_content,
|
||||
|
Reference in New Issue
Block a user