Move MID/JsepTransport mappings into a new manager object.

This is part of the work to make Bundle handling understandable,
so that we can get it to work right.

Bug: webrtc:12837
Change-Id: I77f046b4bac2d9709460b3b956a2edc3df0cdaac
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/221745
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34261}
This commit is contained in:
Harald Alvestrand
2021-06-10 06:03:06 +00:00
committed by WebRTC LUCI CQ
parent 64e3a36668
commit 9dea393f17
7 changed files with 362 additions and 195 deletions

View File

@ -41,8 +41,6 @@ rtc_library("rtc_pc_base") {
visibility = [ "*" ]
defines = []
sources = [
"bundle_manager.cc",
"bundle_manager.h",
"channel.cc",
"channel.h",
"channel_interface.h",
@ -58,6 +56,8 @@ rtc_library("rtc_pc_base") {
"ice_transport.h",
"jsep_transport.cc",
"jsep_transport.h",
"jsep_transport_collection.cc",
"jsep_transport_collection.h",
"jsep_transport_controller.cc",
"jsep_transport_controller.h",
"media_session.cc",

View File

@ -1,49 +0,0 @@
/*
* Copyright 2021 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "pc/bundle_manager.h"
namespace webrtc {
void BundleManager::Update(const cricket::SessionDescription* description) {
bundle_groups_.clear();
for (const cricket::ContentGroup* new_bundle_group :
description->GetGroupsByName(cricket::GROUP_TYPE_BUNDLE)) {
bundle_groups_.push_back(
std::make_unique<cricket::ContentGroup>(*new_bundle_group));
}
}
void BundleManager::DeleteMid(const cricket::ContentGroup* bundle_group,
const std::string& mid) {
// Remove the rejected content from the |bundle_group|.
// The const pointer arg is used to identify the group, we verify
// it before we use it to make a modification.
auto bundle_group_it = std::find_if(
bundle_groups_.begin(), bundle_groups_.end(),
[bundle_group](std::unique_ptr<cricket::ContentGroup>& group) {
return bundle_group == group.get();
});
RTC_DCHECK(bundle_group_it != bundle_groups_.end());
(*bundle_group_it)->RemoveContentName(mid);
}
void BundleManager::DeleteGroup(const cricket::ContentGroup* bundle_group) {
// Delete the BUNDLE group.
auto bundle_group_it = std::find_if(
bundle_groups_.begin(), bundle_groups_.end(),
[bundle_group](std::unique_ptr<cricket::ContentGroup>& group) {
return bundle_group == group.get();
});
RTC_DCHECK(bundle_group_it != bundle_groups_.end());
bundle_groups_.erase(bundle_group_it);
}
} // namespace webrtc

View File

@ -1,54 +0,0 @@
/*
* Copyright 2021 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef PC_BUNDLE_MANAGER_H_
#define PC_BUNDLE_MANAGER_H_
#include <memory>
#include <string>
#include <vector>
#include "pc/session_description.h"
namespace webrtc {
// This class manages information about RFC 8843 BUNDLE bundles
// in SDP descriptions.
// This is a work-in-progress. Planned steps:
// 1) Move all Bundle-related data structures from JsepTransport
// into this class.
// 2) Move all Bundle-related functions into this class.
// 3) Move remaining Bundle-related logic into this class.
// Make data members private.
// 4) Refine interface to have comprehensible semantics.
// 5) Add unit tests.
// 6) Change the logic to do what's right.
class BundleManager {
public:
const std::vector<std::unique_ptr<cricket::ContentGroup>>& bundle_groups()
const {
return bundle_groups_;
}
// Update the groups description. This completely replaces the group
// description with the one from the SessionDescription.
void Update(const cricket::SessionDescription* description);
// Delete a MID from the group that contains it.
void DeleteMid(const cricket::ContentGroup* bundle_group,
const std::string& mid);
// Delete a group.
void DeleteGroup(const cricket::ContentGroup* bundle_group);
private:
std::vector<std::unique_ptr<cricket::ContentGroup>> bundle_groups_;
};
} // namespace webrtc
#endif // PC_BUNDLE_MANAGER_H_

View File

@ -0,0 +1,182 @@
/*
* Copyright 2021 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "pc/jsep_transport_collection.h"
#include <map>
namespace webrtc {
void BundleManager::Update(const cricket::SessionDescription* description) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
bundle_groups_.clear();
for (const cricket::ContentGroup* new_bundle_group :
description->GetGroupsByName(cricket::GROUP_TYPE_BUNDLE)) {
bundle_groups_.push_back(
std::make_unique<cricket::ContentGroup>(*new_bundle_group));
}
}
void BundleManager::DeleteMid(const cricket::ContentGroup* bundle_group,
const std::string& mid) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
// Remove the rejected content from the |bundle_group|.
// The const pointer arg is used to identify the group, we verify
// it before we use it to make a modification.
auto bundle_group_it = std::find_if(
bundle_groups_.begin(), bundle_groups_.end(),
[bundle_group](std::unique_ptr<cricket::ContentGroup>& group) {
return bundle_group == group.get();
});
RTC_DCHECK(bundle_group_it != bundle_groups_.end());
(*bundle_group_it)->RemoveContentName(mid);
}
void BundleManager::DeleteGroup(const cricket::ContentGroup* bundle_group) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
// Delete the BUNDLE group.
auto bundle_group_it = std::find_if(
bundle_groups_.begin(), bundle_groups_.end(),
[bundle_group](std::unique_ptr<cricket::ContentGroup>& group) {
return bundle_group == group.get();
});
RTC_DCHECK(bundle_group_it != bundle_groups_.end());
bundle_groups_.erase(bundle_group_it);
}
void JsepTransportCollection::RegisterTransport(
const std::string& mid,
std::unique_ptr<cricket::JsepTransport> transport) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
jsep_transports_by_name_[mid] = std::move(transport);
}
std::vector<cricket::JsepTransport*> JsepTransportCollection::Transports() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
std::vector<cricket::JsepTransport*> result;
for (auto& kv : jsep_transports_by_name_) {
result.push_back(kv.second.get());
}
return result;
}
void JsepTransportCollection::DestroyAllTransports() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
for (const auto& jsep_transport : jsep_transports_by_name_) {
map_change_callback_(jsep_transport.first, nullptr);
}
jsep_transports_by_name_.clear();
}
const cricket::JsepTransport* JsepTransportCollection::GetTransportByName(
const std::string& transport_name) const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
auto it = jsep_transports_by_name_.find(transport_name);
return (it == jsep_transports_by_name_.end()) ? nullptr : it->second.get();
}
cricket::JsepTransport* JsepTransportCollection::GetTransportByName(
const std::string& transport_name) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
auto it = jsep_transports_by_name_.find(transport_name);
return (it == jsep_transports_by_name_.end()) ? nullptr : it->second.get();
}
cricket::JsepTransport* JsepTransportCollection::GetTransportForMid(
const std::string& mid) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
auto it = mid_to_transport_.find(mid);
return it == mid_to_transport_.end() ? nullptr : it->second;
}
const cricket::JsepTransport* JsepTransportCollection::GetTransportForMid(
const std::string& mid) const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
auto it = mid_to_transport_.find(mid);
return it == mid_to_transport_.end() ? nullptr : it->second;
}
bool JsepTransportCollection::SetTransportForMid(
const std::string& mid,
cricket::JsepTransport* jsep_transport) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
RTC_DCHECK(jsep_transport);
auto it = mid_to_transport_.find(mid);
if (it != mid_to_transport_.end() && it->second == jsep_transport)
return true;
pending_mids_.push_back(mid);
if (it == mid_to_transport_.end()) {
mid_to_transport_.insert(std::make_pair(mid, jsep_transport));
} else {
it->second = jsep_transport;
}
return map_change_callback_(mid, jsep_transport);
}
void JsepTransportCollection::RemoveTransportForMid(const std::string& mid) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
bool ret = map_change_callback_(mid, nullptr);
// Calling OnTransportChanged with nullptr should always succeed, since it is
// only expected to fail when adding media to a transport (not removing).
RTC_DCHECK(ret);
mid_to_transport_.erase(mid);
}
void JsepTransportCollection::RollbackTransports() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
for (auto&& mid : pending_mids_) {
RemoveTransportForMid(mid);
}
for (auto&& mid : pending_mids_) {
MaybeDestroyJsepTransport(mid);
}
pending_mids_.clear();
}
void JsepTransportCollection::CommitTransports() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
pending_mids_.clear();
}
bool JsepTransportCollection::TransportInUse(
cricket::JsepTransport* jsep_transport) const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
for (const auto& kv : mid_to_transport_) {
if (kv.second == jsep_transport) {
return true;
}
}
return false;
}
void JsepTransportCollection::MaybeDestroyJsepTransport(
const std::string& mid) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
auto it = jsep_transports_by_name_.find(mid);
if (it == jsep_transports_by_name_.end()) {
return;
}
// Don't destroy the JsepTransport if there are still media sections referring
// to it.
if (TransportInUse(it->second.get())) {
return;
}
jsep_transports_by_name_.erase(mid);
state_change_callback_();
}
} // namespace webrtc

View File

@ -0,0 +1,125 @@
/*
* Copyright 2021 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef PC_JSEP_TRANSPORT_COLLECTION_H_
#define PC_JSEP_TRANSPORT_COLLECTION_H_
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "pc/jsep_transport.h"
#include "pc/session_description.h"
namespace webrtc {
// This class manages information about RFC 8843 BUNDLE bundles
// in SDP descriptions.
// This is a work-in-progress. Planned steps:
// 1) Move all Bundle-related data structures from JsepTransport
// into this class.
// 2) Move all Bundle-related functions into this class.
// 3) Move remaining Bundle-related logic into this class.
// Make data members private.
// 4) Refine interface to have comprehensible semantics.
// 5) Add unit tests.
// 6) Change the logic to do what's right.
class BundleManager {
public:
BundleManager() {
// Allow constructor to be called on a different thread.
sequence_checker_.Detach();
}
const std::vector<std::unique_ptr<cricket::ContentGroup>>& bundle_groups()
const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
return bundle_groups_;
}
// Update the groups description. This completely replaces the group
// description with the one from the SessionDescription.
void Update(const cricket::SessionDescription* description);
// Delete a MID from the group that contains it.
void DeleteMid(const cricket::ContentGroup* bundle_group,
const std::string& mid);
// Delete a group.
void DeleteGroup(const cricket::ContentGroup* bundle_group);
private:
RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_;
std::vector<std::unique_ptr<cricket::ContentGroup>> bundle_groups_
RTC_GUARDED_BY(sequence_checker_);
};
// This class keeps the mapping of MIDs to transports.
// It is pulled out here because a lot of the code that deals with
// bundles end up modifying this map, and the two need to be consistent;
// the managers may merge.
class JsepTransportCollection {
public:
JsepTransportCollection(std::function<bool(const std::string& mid,
cricket::JsepTransport* transport)>
map_change_callback,
std::function<void()> state_change_callback)
: map_change_callback_(map_change_callback),
state_change_callback_(state_change_callback) {
// Allow constructor to be called on a different thread.
sequence_checker_.Detach();
}
void RegisterTransport(const std::string& mid,
std::unique_ptr<cricket::JsepTransport> transport);
std::vector<cricket::JsepTransport*> Transports();
void DestroyAllTransports();
// Lookup a JsepTransport by the MID that was used to register it.
cricket::JsepTransport* GetTransportByName(const std::string& mid);
const cricket::JsepTransport* GetTransportByName(
const std::string& mid) const;
// Lookup a JsepTransport by any MID that refers to it.
cricket::JsepTransport* GetTransportForMid(const std::string& mid);
const cricket::JsepTransport* GetTransportForMid(
const std::string& mid) const;
bool SetTransportForMid(const std::string& mid,
cricket::JsepTransport* jsep_transport);
void RemoveTransportForMid(const std::string& mid);
// Roll back pending mid-to-transport mappings.
void RollbackTransports();
// Commit pending mid-transport mappings (rollback is no longer possible).
void CommitTransports();
// Returns true if any mid currently maps to this transport.
bool TransportInUse(cricket::JsepTransport* jsep_transport) const;
// Destroy a transport if it's no longer in use.
void MaybeDestroyJsepTransport(const std::string& mid);
private:
RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_;
// This member owns the JSEP transports.
std::map<std::string, std::unique_ptr<cricket::JsepTransport>>
jsep_transports_by_name_ RTC_GUARDED_BY(sequence_checker_);
// This keeps track of the mapping between media section
// (BaseChannel/SctpTransport) and the JsepTransport underneath.
std::map<std::string, cricket::JsepTransport*> mid_to_transport_
RTC_GUARDED_BY(sequence_checker_);
// Keep track of mids that have been mapped to transports. Used for rollback.
std::vector<std::string> pending_mids_ RTC_GUARDED_BY(sequence_checker_);
// Callback used to inform subscribers of altered transports.
const std::function<bool(const std::string& mid,
cricket::JsepTransport* transport)>
map_change_callback_;
// Callback used to inform subscribers of possibly altered state.
const std::function<void()> state_change_callback_;
};
} // namespace webrtc
#endif // PC_JSEP_TRANSPORT_COLLECTION_H_

View File

@ -13,6 +13,7 @@
#include <stddef.h>
#include <algorithm>
#include <functional>
#include <memory>
#include <utility>
@ -59,6 +60,14 @@ JsepTransportController::JsepTransportController(
: network_thread_(network_thread),
port_allocator_(port_allocator),
async_dns_resolver_factory_(async_dns_resolver_factory),
transports_(
[this](const std::string& mid, cricket::JsepTransport* transport) {
return OnTransportChanged(mid, transport);
},
[this]() {
RTC_DCHECK_RUN_ON(network_thread_);
UpdateAggregateStates_n();
}),
config_(config),
active_reset_srtp_params_(config.active_reset_srtp_params) {
// The |transport_observer| is assumed to be non-null.
@ -179,8 +188,8 @@ void JsepTransportController::SetIceConfig(const cricket::IceConfig& config) {
void JsepTransportController::SetNeedsIceRestartFlag() {
RTC_DCHECK_RUN_ON(network_thread_);
for (auto& kv : jsep_transports_by_name_) {
kv.second->SetNeedsIceRestartFlag();
for (auto& transport : transports_.Transports()) {
transport->SetNeedsIceRestartFlag();
}
}
@ -233,8 +242,8 @@ bool JsepTransportController::SetLocalCertificate(
// Set certificate for JsepTransport, which verifies it matches the
// fingerprint in SDP, and DTLS transport.
// Fallback from DTLS to SDES is not supported.
for (auto& kv : jsep_transports_by_name_) {
kv.second->SetLocalCertificate(certificate_);
for (auto& transport : transports_.Transports()) {
transport->SetLocalCertificate(certificate_);
}
for (auto& dtls : GetDtlsTransports()) {
bool set_cert_success = dtls->SetLocalCertificate(certificate_);
@ -374,8 +383,8 @@ void JsepTransportController::SetActiveResetSrtpParams(
<< "Updating the active_reset_srtp_params for JsepTransportController: "
<< active_reset_srtp_params;
active_reset_srtp_params_ = active_reset_srtp_params;
for (auto& kv : jsep_transports_by_name_) {
kv.second->SetActiveResetSrtpParams(active_reset_srtp_params);
for (auto& transport : transports_.Transports()) {
transport->SetActiveResetSrtpParams(active_reset_srtp_params);
}
}
@ -385,13 +394,7 @@ void JsepTransportController::RollbackTransports() {
return;
}
RTC_DCHECK_RUN_ON(network_thread_);
for (auto&& mid : pending_mids_) {
RemoveTransportForMid(mid);
}
for (auto&& mid : pending_mids_) {
MaybeDestroyJsepTransport(mid);
}
pending_mids_.clear();
transports_.RollbackTransports();
}
rtc::scoped_refptr<webrtc::IceTransportInterface>
@ -523,9 +526,7 @@ std::vector<cricket::DtlsTransportInternal*>
JsepTransportController::GetDtlsTransports() {
RTC_DCHECK_RUN_ON(network_thread_);
std::vector<cricket::DtlsTransportInternal*> dtls_transports;
for (auto it = jsep_transports_by_name_.begin();
it != jsep_transports_by_name_.end(); ++it) {
auto jsep_transport = it->second.get();
for (auto jsep_transport : transports_.Transports()) {
RTC_DCHECK(jsep_transport);
if (jsep_transport->rtp_dtls_transport()) {
dtls_transports.push_back(jsep_transport->rtp_dtls_transport());
@ -661,7 +662,7 @@ RTCError JsepTransportController::ApplyDescription_n(
}
}
if (type == SdpType::kAnswer) {
pending_mids_.clear();
transports_.CommitTransports();
}
return RTCError::OK();
}
@ -839,7 +840,7 @@ void JsepTransportController::HandleRejectedContent(
// Rejecting a BUNDLE group's first mid means we are rejecting the entire
// group.
for (const auto& content_name : bundle_group->content_names()) {
RemoveTransportForMid(content_name);
transports_.RemoveTransportForMid(content_name);
// We are about to delete this BUNDLE group, erase all mappings to it.
it = established_bundle_groups_by_mid.find(content_name);
RTC_DCHECK(it != established_bundle_groups_by_mid.end());
@ -848,7 +849,7 @@ void JsepTransportController::HandleRejectedContent(
// Delete the BUNDLE group.
bundles_.DeleteGroup(bundle_group);
} else {
RemoveTransportForMid(content_info.name);
transports_.RemoveTransportForMid(content_info.name);
if (bundle_group) {
// Remove the rejected content from the |bundle_group|.
bundles_.DeleteMid(bundle_group, content_info.name);
@ -868,7 +869,7 @@ bool JsepTransportController::HandleBundledContent(
// If the content is bundled, let the
// BaseChannel/SctpTransport change the RtpTransport/DtlsTransport first,
// then destroy the cricket::JsepTransport.
if (SetTransportForMid(content_info.name, jsep_transport)) {
if (transports_.SetTransportForMid(content_info.name, jsep_transport)) {
// TODO(bugs.webrtc.org/9719) For media transport this is far from ideal,
// because it means that we first create media transport and start
// connecting it, and then we destroy it. We will need to address it before
@ -879,41 +880,6 @@ bool JsepTransportController::HandleBundledContent(
return false;
}
bool JsepTransportController::SetTransportForMid(
const std::string& mid,
cricket::JsepTransport* jsep_transport) {
TRACE_EVENT0("webrtc", "JsepTransportController::SetTransportForMid");
RTC_DCHECK_RUN_ON(network_thread_);
RTC_DCHECK(jsep_transport);
auto it = mid_to_transport_.find(mid);
if (it != mid_to_transport_.end() && it->second == jsep_transport)
return true;
pending_mids_.push_back(mid);
if (it == mid_to_transport_.end()) {
mid_to_transport_.insert(std::make_pair(mid, jsep_transport));
} else {
it->second = jsep_transport;
}
return config_.transport_observer->OnTransportChanged(
mid, jsep_transport->rtp_transport(), jsep_transport->RtpDtlsTransport(),
jsep_transport->data_channel_transport());
}
void JsepTransportController::RemoveTransportForMid(const std::string& mid) {
RTC_DCHECK_RUN_ON(network_thread_);
bool ret = config_.transport_observer->OnTransportChanged(mid, nullptr,
nullptr, nullptr);
// Calling OnTransportChanged with nullptr should always succeed, since it is
// only expected to fail when adding media to a transport (not removing).
RTC_DCHECK(ret);
mid_to_transport_.erase(mid);
}
cricket::JsepTransportDescription
JsepTransportController::CreateJsepTransportDescription(
const cricket::ContentInfo& content_info,
@ -1024,26 +990,22 @@ int JsepTransportController::GetRtpAbsSendTimeHeaderExtensionId(
const cricket::JsepTransport* JsepTransportController::GetJsepTransportForMid(
const std::string& mid) const {
auto it = mid_to_transport_.find(mid);
return it == mid_to_transport_.end() ? nullptr : it->second;
return transports_.GetTransportForMid(mid);
}
cricket::JsepTransport* JsepTransportController::GetJsepTransportForMid(
const std::string& mid) {
auto it = mid_to_transport_.find(mid);
return it == mid_to_transport_.end() ? nullptr : it->second;
return transports_.GetTransportForMid(mid);
}
const cricket::JsepTransport* JsepTransportController::GetJsepTransportByName(
const std::string& transport_name) const {
auto it = jsep_transports_by_name_.find(transport_name);
return (it == jsep_transports_by_name_.end()) ? nullptr : it->second.get();
return transports_.GetTransportByName(transport_name);
}
cricket::JsepTransport* JsepTransportController::GetJsepTransportByName(
const std::string& transport_name) {
auto it = jsep_transports_by_name_.find(transport_name);
return (it == jsep_transports_by_name_.end()) ? nullptr : it->second.get();
return transports_.GetTransportByName(transport_name);
}
RTCError JsepTransportController::MaybeCreateJsepTransport(
@ -1116,9 +1078,9 @@ RTCError JsepTransportController::MaybeCreateJsepTransport(
jsep_transport->SignalRtcpMuxActive.connect(
this, &JsepTransportController::UpdateAggregateStates_n);
SetTransportForMid(content_info.name, jsep_transport.get());
transports_.SetTransportForMid(content_info.name, jsep_transport.get());
jsep_transports_by_name_[content_info.name] = std::move(jsep_transport);
transports_.RegisterTransport(content_info.name, std::move(jsep_transport));
UpdateAggregateStates_n();
return RTCError::OK();
}
@ -1133,23 +1095,15 @@ void JsepTransportController::MaybeDestroyJsepTransport(
// Don't destroy the JsepTransport if there are still media sections referring
// to it.
for (const auto& kv : mid_to_transport_) {
if (kv.second == jsep_transport) {
return;
}
if (transports_.TransportInUse(jsep_transport)) {
return;
}
jsep_transports_by_name_.erase(mid);
transports_.MaybeDestroyJsepTransport(mid);
UpdateAggregateStates_n();
}
void JsepTransportController::DestroyAllJsepTransports_n() {
for (const auto& jsep_transport : jsep_transports_by_name_) {
config_.transport_observer->OnTransportChanged(jsep_transport.first,
nullptr, nullptr, nullptr);
}
jsep_transports_by_name_.clear();
transports_.DestroyAllTransports();
}
void JsepTransportController::SetIceRole_n(cricket::IceRole ice_role) {
@ -1467,4 +1421,21 @@ void JsepTransportController::OnDtlsHandshakeError(
config_.on_dtls_handshake_error_(error);
}
bool JsepTransportController::OnTransportChanged(
const std::string& mid,
cricket::JsepTransport* jsep_transport) {
if (config_.transport_observer) {
if (jsep_transport) {
return config_.transport_observer->OnTransportChanged(
mid, jsep_transport->rtp_transport(),
jsep_transport->RtpDtlsTransport(),
jsep_transport->data_channel_transport());
} else {
return config_.transport_observer->OnTransportChanged(mid, nullptr,
nullptr, nullptr);
}
}
return false;
}
} // namespace webrtc

View File

@ -44,11 +44,11 @@
#include "p2p/base/port_allocator.h"
#include "p2p/base/transport_description.h"
#include "p2p/base/transport_info.h"
#include "pc/bundle_manager.h"
#include "pc/channel.h"
#include "pc/dtls_srtp_transport.h"
#include "pc/dtls_transport.h"
#include "pc/jsep_transport.h"
#include "pc/jsep_transport_collection.h"
#include "pc/rtp_transport.h"
#include "pc/rtp_transport_internal.h"
#include "pc/sctp_transport.h"
@ -336,10 +336,6 @@ class JsepTransportController : public sigslot::has_slots<> {
const cricket::ContentGroup& bundle_group)
RTC_RUN_ON(network_thread_);
bool SetTransportForMid(const std::string& mid,
cricket::JsepTransport* jsep_transport);
void RemoveTransportForMid(const std::string& mid);
cricket::JsepTransportDescription CreateJsepTransportDescription(
const cricket::ContentInfo& content_info,
const cricket::TransportInfo& transport_info,
@ -453,18 +449,14 @@ class JsepTransportController : public sigslot::has_slots<> {
void OnDtlsHandshakeError(rtc::SSLHandshakeError error);
bool OnTransportChanged(const std::string& mid,
cricket::JsepTransport* transport);
rtc::Thread* const network_thread_ = nullptr;
cricket::PortAllocator* const port_allocator_ = nullptr;
AsyncDnsResolverFactoryInterface* const async_dns_resolver_factory_ = nullptr;
std::map<std::string, std::unique_ptr<cricket::JsepTransport>>
jsep_transports_by_name_ RTC_GUARDED_BY(network_thread_);
// This keeps track of the mapping between media section
// (BaseChannel/SctpTransport) and the JsepTransport underneath.
std::map<std::string, cricket::JsepTransport*> mid_to_transport_
RTC_GUARDED_BY(network_thread_);
// Keep track of mids that have been mapped to transports. Used for rollback.
std::vector<std::string> pending_mids_ RTC_GUARDED_BY(network_thread_);
JsepTransportCollection transports_ RTC_GUARDED_BY(network_thread_);
// Aggregate states for Transports.
// standardized_ice_connection_state_ is intended to replace
// ice_connection_state, see bugs.webrtc.org/9308