From 1c7ccf59cfe4ea7f0d7284e69ddf506c45a45b60 Mon Sep 17 00:00:00 2001 From: Michael Froman Date: Fri, 14 Jul 2023 16:01:16 -0500 Subject: [PATCH] Bug 1843113 - Vendor libwebrtc from e46e37b6f8 Upstream commit: https://webrtc.googlesource.com/src/+/e46e37b6f831763aceaf5f5bd081a47cbd562890 [M114] Move transceiver iteration loop over to the signaling thread. This is required for ReportTransportStats since iterating over the transceiver list from the network thread is not safe. (cherry picked from commit dba22d31909298161318e00d43a80cdb0abc940f) No-Try: true Bug: chromium:1446274, webrtc:12692 Change-Id: I7c514df9f029112c4b1da85826af91217850fb26 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/307340 Reviewed-by: Harald Alvestrand Commit-Queue: Tomas Gunnarsson Cr-Original-Commit-Position: refs/heads/main@{#40197} Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/308001 Reviewed-by: Mirko Bonadei Cr-Commit-Position: refs/branch-heads/5735@{#3} Cr-Branched-From: df7df199abd619e75b9f1d9a7e12fc3f3f748775-refs/heads/main@{#39949} --- third_party/libwebrtc/README.moz-ff-commit | 3 ++ third_party/libwebrtc/README.mozilla | 2 ++ third_party/libwebrtc/pc/peer_connection.cc | 35 ++++++++++++------- third_party/libwebrtc/pc/peer_connection.h | 3 +- .../pc/peer_connection_integrationtest.cc | 8 +++++ 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/third_party/libwebrtc/README.moz-ff-commit b/third_party/libwebrtc/README.moz-ff-commit index 910f0d31d9808..3b4739aaff223 100644 --- a/third_party/libwebrtc/README.moz-ff-commit +++ b/third_party/libwebrtc/README.moz-ff-commit @@ -23496,3 +23496,6 @@ df7df199ab # MOZ_LIBWEBRTC_SRC=/home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc MOZ_LIBWEBRTC_BRANCH=mozpatches bash dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh # base of lastest vendoring ecab2a49da +# MOZ_LIBWEBRTC_SRC=/home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc MOZ_LIBWEBRTC_BRANCH=mozpatches bash dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh +# base of lastest vendoring +e46e37b6f8 diff --git a/third_party/libwebrtc/README.mozilla b/third_party/libwebrtc/README.mozilla index b76f55384e3d0..85149842b3c0f 100644 --- a/third_party/libwebrtc/README.mozilla +++ b/third_party/libwebrtc/README.mozilla @@ -15686,3 +15686,5 @@ libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2023-07-14T20:59:06.341337. # ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2023-07-14T21:00:06.469027. +# ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc +libwebrtc updated from /home/mfroman/mozilla/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2023-07-14T21:01:04.634768. diff --git a/third_party/libwebrtc/pc/peer_connection.cc b/third_party/libwebrtc/pc/peer_connection.cc index 627e4afcfa562..f7aec9ebcca83 100644 --- a/third_party/libwebrtc/pc/peer_connection.cc +++ b/third_party/libwebrtc/pc/peer_connection.cc @@ -735,9 +735,6 @@ JsepTransportController* PeerConnection::InitializeTransportController_n( transport_controller_->SubscribeIceConnectionState( [this](cricket::IceConnectionState s) { RTC_DCHECK_RUN_ON(network_thread()); - if (s == cricket::kIceConnectionConnected) { - ReportTransportStats(); - } signaling_thread()->PostTask( SafeTask(signaling_thread_safety_.flag(), [this, s]() { RTC_DCHECK_RUN_ON(signaling_thread()); @@ -2401,6 +2398,20 @@ void PeerConnection::OnTransportControllerConnectionState( case cricket::kIceConnectionConnected: RTC_LOG(LS_INFO) << "Changing to ICE connected state because " "all transports are writable."; + { + std::vector transceivers; + if (ConfiguredForMedia()) { + transceivers = rtp_manager()->transceivers()->List(); + } + + network_thread()->PostTask( + SafeTask(network_thread_safety_, + [this, transceivers = std::move(transceivers)] { + RTC_DCHECK_RUN_ON(network_thread()); + ReportTransportStats(std::move(transceivers)); + })); + } + SetIceConnectionState(PeerConnectionInterface::kIceConnectionConnected); NoteUsageEvent(UsageEvent::ICE_STATE_CONNECTED); break; @@ -2743,20 +2754,18 @@ void PeerConnection::OnTransportControllerGatheringState( } // Runs on network_thread(). -void PeerConnection::ReportTransportStats() { +void PeerConnection::ReportTransportStats( + std::vector transceivers) { TRACE_EVENT0("webrtc", "PeerConnection::ReportTransportStats"); rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls; std::map> media_types_by_transport_name; - if (ConfiguredForMedia()) { - for (const auto& transceiver : - rtp_manager()->transceivers()->UnsafeList()) { - if (transceiver->internal()->channel()) { - std::string transport_name( - transceiver->internal()->channel()->transport_name()); - media_types_by_transport_name[transport_name].insert( - transceiver->media_type()); - } + for (const auto& transceiver : transceivers) { + if (transceiver->internal()->channel()) { + std::string transport_name( + transceiver->internal()->channel()->transport_name()); + media_types_by_transport_name[transport_name].insert( + transceiver->media_type()); } } diff --git a/third_party/libwebrtc/pc/peer_connection.h b/third_party/libwebrtc/pc/peer_connection.h index 32d304e6e7f4c..21b9a5a4306e3 100644 --- a/third_party/libwebrtc/pc/peer_connection.h +++ b/third_party/libwebrtc/pc/peer_connection.h @@ -569,7 +569,8 @@ class PeerConnection : public PeerConnectionInternal, // Invoked when TransportController connection completion is signaled. // Reports stats for all transports in use. - void ReportTransportStats() RTC_RUN_ON(network_thread()); + void ReportTransportStats(std::vector transceivers) + RTC_RUN_ON(network_thread()); // Gather the usage of IPv4/IPv6 as best connection. static void ReportBestConnectionState(const cricket::TransportStats& stats); diff --git a/third_party/libwebrtc/pc/peer_connection_integrationtest.cc b/third_party/libwebrtc/pc/peer_connection_integrationtest.cc index 812833000b5a2..07c5e0c0d3710 100644 --- a/third_party/libwebrtc/pc/peer_connection_integrationtest.cc +++ b/third_party/libwebrtc/pc/peer_connection_integrationtest.cc @@ -1831,6 +1831,10 @@ TEST_P(PeerConnectionIntegrationTest, EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected, callee()->ice_connection_state(), kDefaultTimeout); + // Part of reporting the stats will occur on the network thread, so flush it + // before checking NumEvents. + SendTask(network_thread(), [] {}); + EXPECT_METRIC_EQ(1, webrtc::metrics::NumEvents( "WebRTC.PeerConnection.CandidatePairType_UDP", webrtc::kIceCandidatePairHostNameHostName)); @@ -1959,6 +1963,10 @@ TEST_P(PeerConnectionIntegrationIceStatesTest, MAYBE_VerifyBestConnection) { EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected, callee()->ice_connection_state(), kDefaultTimeout); + // Part of reporting the stats will occur on the network thread, so flush it + // before checking NumEvents. + SendTask(network_thread(), [] {}); + // TODO(bugs.webrtc.org/9456): Fix it. const int num_best_ipv4 = webrtc::metrics::NumEvents( "WebRTC.PeerConnection.IPMetrics", webrtc::kBestConnections_IPv4);