Access threads from SdpOfferAnswerHandler via ConnectionContext

This removes a couple of methods from the PeerConnectionSdpMethods
interface.

Bug: webrtc:11995
Change-Id: I0a68178b1f0a99e779e6d7f94d03b493d811f500
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/249794
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35841}
This commit is contained in:
Harald Alvestrand 2022-01-28 17:41:30 +00:00 committed by WebRTC LUCI CQ
parent c966443594
commit 66c4036d1b
6 changed files with 42 additions and 45 deletions

View File

@ -629,8 +629,8 @@ RTCError PeerConnection::Initialize(
stats_ = std::make_unique<StatsCollector>(this);
stats_collector_ = RTCStatsCollector::Create(this);
sdp_handler_ =
SdpOfferAnswerHandler::Create(this, configuration, dependencies);
sdp_handler_ = SdpOfferAnswerHandler::Create(this, configuration,
dependencies, context_);
rtp_manager_ = std::make_unique<RtpTransmissionManager>(
IsUnifiedPlan(), signaling_thread(), worker_thread(), channel_manager(),
@ -1648,6 +1648,10 @@ void PeerConnection::AddAdaptationResource(
call_->AddAdaptationResource(resource);
}
cricket::ChannelManager* PeerConnection::channel_manager() {
return context_->channel_manager();
}
bool PeerConnection::StartRtcEventLog(std::unique_ptr<RtcEventLogOutput> output,
int64_t output_period_ms) {
return worker_thread()->Invoke<bool>(
@ -2090,10 +2094,6 @@ bool PeerConnection::ReconfigurePortAllocator_n(
stun_candidate_keepalive_interval);
}
cricket::ChannelManager* PeerConnection::channel_manager() {
return context_->channel_manager();
}
bool PeerConnection::StartRtcEventLog_w(
std::unique_ptr<RtcEventLogOutput> output,
int64_t output_period_ms) {

View File

@ -267,11 +267,6 @@ class PeerConnection : public PeerConnectionInternal,
return context_->signaling_thread();
}
// PeerConnectionInternal implementation.
rtc::Thread* signaling_thread_internal() const final {
return context_->signaling_thread();
}
rtc::Thread* network_thread() const final {
return context_->network_thread();
}
@ -360,7 +355,7 @@ class PeerConnection : public PeerConnectionInternal,
const RtpTransmissionManager* rtp_manager() const override {
return rtp_manager_.get();
}
cricket::ChannelManager* channel_manager() override;
cricket::ChannelManager* channel_manager();
JsepTransportController* transport_controller() override {
return transport_controller_.get();

View File

@ -36,13 +36,6 @@ class PeerConnectionSdpMethods {
public:
virtual ~PeerConnectionSdpMethods() = default;
// NOTE - signaling_thread() is a member of PeerConnectionInterface,
// so we have to use a different name for this function as long as
// PeerConnection is a subclass of PeerConnectionSdpMethods.
virtual rtc::Thread* signaling_thread_internal() const = 0;
virtual rtc::Thread* network_thread() const = 0;
virtual rtc::Thread* worker_thread() const = 0;
// The SDP session ID as defined by RFC 3264.
virtual std::string session_id() const = 0;
@ -78,7 +71,6 @@ class PeerConnectionSdpMethods {
// return the RTCConfiguration.crypto_options if set and will only default
// back to the PeerConnectionFactory settings if nothing was set.
virtual CryptoOptions GetCryptoOptions() = 0;
virtual cricket::ChannelManager* channel_manager() = 0;
virtual JsepTransportController* transport_controller() = 0;
virtual DataChannelController* data_channel_controller() = 0;
virtual cricket::PortAllocator* port_allocator() = 0;
@ -137,6 +129,9 @@ class PeerConnectionSdpMethods {
class PeerConnectionInternal : public PeerConnectionInterface,
public PeerConnectionSdpMethods {
public:
virtual rtc::Thread* network_thread() const = 0;
virtual rtc::Thread* worker_thread() const = 0;
// Returns true if we were the initial offerer.
virtual bool initial_offerer() const = 0;

View File

@ -1161,8 +1161,10 @@ class SdpOfferAnswerHandler::LocalIceCredentialsToReplace {
std::set<std::pair<std::string, std::string>> ice_credentials_;
};
SdpOfferAnswerHandler::SdpOfferAnswerHandler(PeerConnectionSdpMethods* pc)
SdpOfferAnswerHandler::SdpOfferAnswerHandler(PeerConnectionSdpMethods* pc,
ConnectionContext* context)
: pc_(pc),
context_(context),
local_streams_(StreamCollection::Create()),
remote_streams_(StreamCollection::Create()),
operations_chain_(rtc::OperationsChain::Create()),
@ -1183,8 +1185,9 @@ SdpOfferAnswerHandler::~SdpOfferAnswerHandler() {}
std::unique_ptr<SdpOfferAnswerHandler> SdpOfferAnswerHandler::Create(
PeerConnectionSdpMethods* pc,
const PeerConnectionInterface::RTCConfiguration& configuration,
PeerConnectionDependencies& dependencies) {
auto handler = absl::WrapUnique(new SdpOfferAnswerHandler(pc));
PeerConnectionDependencies& dependencies,
ConnectionContext* context) {
auto handler = absl::WrapUnique(new SdpOfferAnswerHandler(pc, context));
handler->Initialize(configuration, dependencies);
return handler;
}
@ -1248,7 +1251,7 @@ void SdpOfferAnswerHandler::Initialize(
// ==================================================================
// Access to pc_ variables
cricket::ChannelManager* SdpOfferAnswerHandler::channel_manager() const {
return pc_->channel_manager();
return context_->channel_manager();
}
TransceiverList* SdpOfferAnswerHandler::transceivers() {
if (!pc_->rtp_manager()) {
@ -1308,7 +1311,7 @@ void SdpOfferAnswerHandler::RestartIce() {
}
rtc::Thread* SdpOfferAnswerHandler::signaling_thread() const {
return pc_->signaling_thread_internal();
return context_->signaling_thread();
}
void SdpOfferAnswerHandler::CreateOffer(
@ -1544,7 +1547,8 @@ RTCError SdpOfferAnswerHandler::ApplyLocalDescription(
// information about DTLS transports.
if (transceiver->mid()) {
auto dtls_transport = LookupDtlsTransportByMid(
pc_->network_thread(), transport_controller(), *transceiver->mid());
context_->network_thread(), transport_controller(),
*transceiver->mid());
transceiver->sender_internal()->set_transport(dtls_transport);
transceiver->receiver_internal()->set_transport(dtls_transport);
}
@ -1978,7 +1982,8 @@ void SdpOfferAnswerHandler::ApplyRemoteDescriptionUpdateTransceiverState(
// 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());
context_->network_thread(), transport_controller(),
*transceiver->mid());
transceiver->sender_internal()->set_transport(dtls_transport);
transceiver->receiver_internal()->set_transport(dtls_transport);
}
@ -2158,7 +2163,7 @@ void SdpOfferAnswerHandler::DoSetLocalDescription(
// TODO(deadbeef): We already had to hop to the network thread for
// MaybeStartGathering...
pc_->network_thread()->Invoke<void>(
context_->network_thread()->Invoke<void>(
RTC_FROM_HERE, [this] { port_allocator()->DiscardCandidatePool(); });
// Make UMA notes about what was agreed to.
ReportNegotiatedSdpSemantics(*local_description());
@ -2358,7 +2363,7 @@ void SdpOfferAnswerHandler::SetRemoteDescriptionPostProcess(bool was_answer) {
if (was_answer) {
// TODO(deadbeef): We already had to hop to the network thread for
// MaybeStartGathering...
pc_->network_thread()->Invoke<void>(
context_->network_thread()->Invoke<void>(
RTC_FROM_HERE, [this] { port_allocator()->DiscardCandidatePool(); });
// Make UMA notes about what was agreed to.
ReportNegotiatedSdpSemantics(*remote_description());
@ -3724,7 +3729,7 @@ void SdpOfferAnswerHandler::GetOptionsForOffer(
session_options->rtcp_cname = rtcp_cname_;
session_options->crypto_options = pc_->GetCryptoOptions();
session_options->pooled_ice_credentials =
pc_->network_thread()->Invoke<std::vector<cricket::IceParameters>>(
context_->network_thread()->Invoke<std::vector<cricket::IceParameters>>(
RTC_FROM_HERE,
[this] { return port_allocator()->GetPooledIceCredentials(); });
session_options->offer_extmap_allow_mixed =
@ -3979,7 +3984,7 @@ void SdpOfferAnswerHandler::GetOptionsForAnswer(
session_options->rtcp_cname = rtcp_cname_;
session_options->crypto_options = pc_->GetCryptoOptions();
session_options->pooled_ice_credentials =
pc_->network_thread()->Invoke<std::vector<cricket::IceParameters>>(
context_->network_thread()->Invoke<std::vector<cricket::IceParameters>>(
RTC_FROM_HERE,
[this] { return port_allocator()->GetPooledIceCredentials(); });
}
@ -4439,11 +4444,12 @@ RTCError SdpOfferAnswerHandler::PushdownMediaDescription(
// - crbug.com/1187289
for (const auto& entry : channels) {
std::string error;
bool success = pc_->worker_thread()->Invoke<bool>(RTC_FROM_HERE, [&]() {
return (source == cricket::CS_LOCAL)
? entry.first->SetLocalContent(entry.second, type, error)
: entry.first->SetRemoteContent(entry.second, type, error);
});
bool success =
context_->worker_thread()->Invoke<bool>(RTC_FROM_HERE, [&]() {
return (source == cricket::CS_LOCAL)
? entry.first->SetLocalContent(entry.second, type, error)
: entry.first->SetRemoteContent(entry.second, type, error);
});
if (!success) {
return RTCError(RTCErrorType::INVALID_PARAMETER, error);
}
@ -4808,8 +4814,8 @@ cricket::VideoChannel* SdpOfferAnswerHandler::CreateVideoChannel(
bool SdpOfferAnswerHandler::CreateDataChannel(const std::string& mid) {
RTC_DCHECK_RUN_ON(signaling_thread());
if (!pc_->network_thread()->Invoke<bool>(RTC_FROM_HERE, [this, &mid] {
RTC_DCHECK_RUN_ON(pc_->network_thread());
if (!context_->network_thread()->Invoke<bool>(RTC_FROM_HERE, [this, &mid] {
RTC_DCHECK_RUN_ON(context_->network_thread());
return pc_->SetupDataChannelTransport_n(mid);
})) {
return false;
@ -4830,8 +4836,8 @@ void SdpOfferAnswerHandler::DestroyDataChannelTransport(RTCError error) {
if (has_sctp)
data_channel_controller()->OnTransportChannelClosed(error);
pc_->network_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
RTC_DCHECK_RUN_ON(pc_->network_thread());
context_->network_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
RTC_DCHECK_RUN_ON(context_->network_thread());
pc_->TeardownDataChannelTransport_n();
});
@ -5128,7 +5134,7 @@ bool SdpOfferAnswerHandler::UpdatePayloadTypeDemuxingState(
// needs to be fully (and only) managed on the network thread and once that's
// the case, there's no need to stop by on the worker. Ideally we could also
// do this without blocking.
return pc_->worker_thread()->Invoke<bool>(
return context_->worker_thread()->Invoke<bool>(
RTC_FROM_HERE, [&channels_to_update]() {
for (const auto& it : channels_to_update) {
if (!it.second->SetPayloadTypeDemuxingEnabled(it.first)) {

View File

@ -96,7 +96,8 @@ class SdpOfferAnswerHandler : public SdpStateProvider,
static std::unique_ptr<SdpOfferAnswerHandler> Create(
PeerConnectionSdpMethods* pc,
const PeerConnectionInterface::RTCConfiguration& configuration,
PeerConnectionDependencies& dependencies);
PeerConnectionDependencies& dependencies,
ConnectionContext* context);
void ResetSessionDescFactory() {
RTC_DCHECK_RUN_ON(signaling_thread());
@ -205,7 +206,8 @@ class SdpOfferAnswerHandler : public SdpStateProvider,
class LocalIceCredentialsToReplace;
// Only called by the Create() function.
explicit SdpOfferAnswerHandler(PeerConnectionSdpMethods* pc);
explicit SdpOfferAnswerHandler(PeerConnectionSdpMethods* pc,
ConnectionContext* context);
// Called from the `Create()` function. Can only be called
// once. Modifies dependencies.
void Initialize(
@ -592,6 +594,7 @@ class SdpOfferAnswerHandler : public SdpStateProvider,
const cricket::VideoOptions& video_options() { return video_options_; }
PeerConnectionSdpMethods* const pc_;
ConnectionContext* const context_;
std::unique_ptr<WebRtcSessionDescriptionFactory> webrtc_session_desc_factory_
RTC_GUARDED_BY(signaling_thread());

View File

@ -296,7 +296,6 @@ class FakePeerConnectionBase : public PeerConnectionInternal {
return nullptr;
}
rtc::Thread* signaling_thread_internal() const override { return nullptr; }
void ReportSdpFormatReceived(
const SessionDescriptionInterface& remote_description) override {}
@ -312,7 +311,6 @@ class FakePeerConnectionBase : public PeerConnectionInternal {
}
CryptoOptions GetCryptoOptions() override { return CryptoOptions(); }
cricket::ChannelManager* channel_manager() override { return nullptr; }
JsepTransportController* transport_controller() override { return nullptr; }
DataChannelController* data_channel_controller() override { return nullptr; }
cricket::PortAllocator* port_allocator() override { return nullptr; }