Convert signals in rtp_transport_internal.h to CallbackList
Bug: webrtc:11943
Change-Id: I8e0839363712d9d8b49c2f6cbdb5f3ac59d79219
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/318882
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40700}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index d63d98e..e8d1e86 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -475,9 +475,9 @@
":session_description",
"../call:rtp_receiver",
"../p2p:rtc_p2p",
+ "../rtc_base:callback_list",
"../rtc_base:network_route",
"../rtc_base:ssl",
- "../rtc_base/third_party/sigslot",
]
}
diff --git a/pc/channel.cc b/pc/channel.cc
index afe9d03..82ca1a3 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -166,14 +166,17 @@
if (!rtp_transport_->RegisterRtpDemuxerSink(demuxer_criteria_, this)) {
return false;
}
- rtp_transport_->SignalReadyToSend.connect(
- this, &BaseChannel::OnTransportReadyToSend);
- rtp_transport_->SignalNetworkRouteChanged.connect(
- this, &BaseChannel::OnNetworkRouteChanged);
- rtp_transport_->SignalWritableState.connect(this,
- &BaseChannel::OnWritableState);
- rtp_transport_->SignalSentPacket.connect(this,
- &BaseChannel::SignalSentPacket_n);
+ rtp_transport_->SubscribeReadyToSend(
+ this, [this](bool ready) { OnTransportReadyToSend(ready); });
+ rtp_transport_->SubscribeNetworkRouteChanged(
+ this, [this](absl::optional<rtc::NetworkRoute> route) {
+ OnNetworkRouteChanged(route);
+ });
+ rtp_transport_->SubscribeWritableState(
+ this, [this](bool state) { OnWritableState(state); });
+ rtp_transport_->SubscribeSentPacket(
+ this,
+ [this](const rtc::SentPacket& packet) { SignalSentPacket_n(packet); });
return true;
}
@@ -181,10 +184,10 @@
RTC_DCHECK(rtp_transport_);
RTC_DCHECK(media_send_channel());
rtp_transport_->UnregisterRtpDemuxerSink(this);
- rtp_transport_->SignalReadyToSend.disconnect(this);
- rtp_transport_->SignalNetworkRouteChanged.disconnect(this);
- rtp_transport_->SignalWritableState.disconnect(this);
- rtp_transport_->SignalSentPacket.disconnect(this);
+ rtp_transport_->UnsubscribeReadyToSend(this);
+ rtp_transport_->UnsubscribeNetworkRouteChanged(this);
+ rtp_transport_->UnsubscribeWritableState(this);
+ rtp_transport_->UnsubscribeSentPacket(this);
rtp_transport_ = nullptr;
media_send_channel()->SetInterface(nullptr);
media_receive_channel()->SetInterface(nullptr);
diff --git a/pc/channel.h b/pc/channel.h
index 23ae69f..d3a7e89 100644
--- a/pc/channel.h
+++ b/pc/channel.h
@@ -45,7 +45,6 @@
#include "rtc_base/network/sent_packet.h"
#include "rtc_base/network_route.h"
#include "rtc_base/socket.h"
-#include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/unique_id_generator.h"
@@ -69,8 +68,6 @@
class VoiceChannel;
class BaseChannel : public ChannelInterface,
- // TODO(tommi): Remove has_slots inheritance.
- public sigslot::has_slots<>,
// TODO(tommi): Consider implementing these interfaces
// via composition.
public MediaChannelNetworkInterface,
diff --git a/pc/dtls_srtp_transport_unittest.cc b/pc/dtls_srtp_transport_unittest.cc
index 5c4eac0..bf0676c 100644
--- a/pc/dtls_srtp_transport_unittest.cc
+++ b/pc/dtls_srtp_transport_unittest.cc
@@ -77,17 +77,23 @@
dtls_srtp_transport2_ =
MakeDtlsSrtpTransport(rtp_dtls2, rtcp_dtls2, rtcp_mux_enabled);
- dtls_srtp_transport1_->SignalRtcpPacketReceived.connect(
+ dtls_srtp_transport1_->SubscribeRtcpPacketReceived(
&transport_observer1_,
- &webrtc::TransportObserver::OnRtcpPacketReceived);
- dtls_srtp_transport1_->SignalReadyToSend.connect(
- &transport_observer1_, &webrtc::TransportObserver::OnReadyToSend);
+ [this](rtc::CopyOnWriteBuffer* buffer, int64_t packet_time_ms) {
+ transport_observer1_.OnRtcpPacketReceived(buffer, packet_time_ms);
+ });
+ dtls_srtp_transport1_->SubscribeReadyToSend(
+ &transport_observer1_,
+ [this](bool ready) { transport_observer1_.OnReadyToSend(ready); });
- dtls_srtp_transport2_->SignalRtcpPacketReceived.connect(
+ dtls_srtp_transport2_->SubscribeRtcpPacketReceived(
&transport_observer2_,
- &webrtc::TransportObserver::OnRtcpPacketReceived);
- dtls_srtp_transport2_->SignalReadyToSend.connect(
- &transport_observer2_, &webrtc::TransportObserver::OnReadyToSend);
+ [this](rtc::CopyOnWriteBuffer* buffer, int64_t packet_time_ms) {
+ transport_observer2_.OnRtcpPacketReceived(buffer, packet_time_ms);
+ });
+ dtls_srtp_transport2_->SubscribeReadyToSend(
+ &transport_observer2_,
+ [this](bool ready) { transport_observer2_.OnReadyToSend(ready); });
webrtc::RtpDemuxerCriteria demuxer_criteria;
// 0x00 is the payload type used in kPcmuFrame.
demuxer_criteria.payload_types() = {0x00};
diff --git a/pc/jsep_transport_controller.cc b/pc/jsep_transport_controller.cc
index 6676680..792365b 100644
--- a/pc/jsep_transport_controller.cc
+++ b/pc/jsep_transport_controller.cc
@@ -1090,10 +1090,16 @@
UpdateAggregateStates_n();
});
- jsep_transport->rtp_transport()->SignalRtcpPacketReceived.connect(
- this, &JsepTransportController::OnRtcpPacketReceived_n);
- jsep_transport->rtp_transport()->SignalUnDemuxableRtpPacketReceived.connect(
- this, &JsepTransportController::OnUnDemuxableRtpPacketReceived_n);
+ jsep_transport->rtp_transport()->SubscribeRtcpPacketReceived(
+ this, [this](rtc::CopyOnWriteBuffer* buffer, int64_t packet_time_ms) {
+ RTC_DCHECK_RUN_ON(network_thread_);
+ OnRtcpPacketReceived_n(buffer, packet_time_ms);
+ });
+ jsep_transport->rtp_transport()->SetUnDemuxableRtpPacketReceivedHandler(
+ [this](webrtc::RtpPacketReceived& packet) {
+ RTC_DCHECK_RUN_ON(network_thread_);
+ OnUnDemuxableRtpPacketReceived_n(packet);
+ });
transports_.RegisterTransport(content_info.name, std::move(jsep_transport));
UpdateAggregateStates_n();
diff --git a/pc/rtp_transport.cc b/pc/rtp_transport.cc
index 8ef597f..32bdf99 100644
--- a/pc/rtp_transport.cc
+++ b/pc/rtp_transport.cc
@@ -59,7 +59,7 @@
rtp_packet_transport_->SignalWritableState.disconnect(this);
rtp_packet_transport_->SignalSentPacket.disconnect(this);
// Reset the network route of the old transport.
- SignalNetworkRouteChanged(absl::optional<rtc::NetworkRoute>());
+ SendNetworkRouteChanged(absl::optional<rtc::NetworkRoute>());
}
if (new_packet_transport) {
new_packet_transport->SignalReadyToSend.connect(
@@ -73,7 +73,7 @@
new_packet_transport->SignalSentPacket.connect(this,
&RtpTransport::OnSentPacket);
// Set the network route for the new transport.
- SignalNetworkRouteChanged(new_packet_transport->network_route());
+ SendNetworkRouteChanged(new_packet_transport->network_route());
}
rtp_packet_transport_ = new_packet_transport;
@@ -95,7 +95,7 @@
rtcp_packet_transport_->SignalWritableState.disconnect(this);
rtcp_packet_transport_->SignalSentPacket.disconnect(this);
// Reset the network route of the old transport.
- SignalNetworkRouteChanged(absl::optional<rtc::NetworkRoute>());
+ SendNetworkRouteChanged(absl::optional<rtc::NetworkRoute>());
}
if (new_packet_transport) {
new_packet_transport->SignalReadyToSend.connect(
@@ -109,7 +109,7 @@
new_packet_transport->SignalSentPacket.connect(this,
&RtpTransport::OnSentPacket);
// Set the network route for the new transport.
- SignalNetworkRouteChanged(new_packet_transport->network_route());
+ SendNetworkRouteChanged(new_packet_transport->network_route());
}
rtcp_packet_transport_ = new_packet_transport;
@@ -195,7 +195,7 @@
if (!rtp_demuxer_.OnRtpPacket(parsed_packet)) {
RTC_LOG(LS_VERBOSE) << "Failed to demux RTP packet: "
<< RtpDemuxer::DescribePacket(parsed_packet);
- SignalUnDemuxableRtpPacketReceived(parsed_packet);
+ NotifyUnDemuxableRtpPacketReceived(parsed_packet);
}
}
@@ -212,21 +212,21 @@
void RtpTransport::OnNetworkRouteChanged(
absl::optional<rtc::NetworkRoute> network_route) {
- SignalNetworkRouteChanged(network_route);
+ SendNetworkRouteChanged(network_route);
}
void RtpTransport::OnWritableState(
rtc::PacketTransportInternal* packet_transport) {
RTC_DCHECK(packet_transport == rtp_packet_transport_ ||
packet_transport == rtcp_packet_transport_);
- SignalWritableState(IsTransportWritable());
+ SendWritableState(IsTransportWritable());
}
void RtpTransport::OnSentPacket(rtc::PacketTransportInternal* packet_transport,
const rtc::SentPacket& sent_packet) {
RTC_DCHECK(packet_transport == rtp_packet_transport_ ||
packet_transport == rtcp_packet_transport_);
- SignalSentPacket(sent_packet);
+ SendSentPacket(sent_packet);
}
void RtpTransport::OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet,
@@ -236,7 +236,7 @@
void RtpTransport::OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet,
int64_t packet_time_us) {
- SignalRtcpPacketReceived(&packet, packet_time_us);
+ SendRtcpPacketReceived(&packet, packet_time_us);
}
void RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport,
@@ -286,7 +286,7 @@
rtp_ready_to_send_ && (rtcp_ready_to_send_ || rtcp_mux_enabled_);
if (ready_to_send != ready_to_send_) {
ready_to_send_ = ready_to_send;
- SignalReadyToSend(ready_to_send);
+ SendReadyToSend(ready_to_send);
}
}
diff --git a/pc/rtp_transport_internal.h b/pc/rtp_transport_internal.h
index 264be13..4114fa9 100644
--- a/pc/rtp_transport_internal.h
+++ b/pc/rtp_transport_internal.h
@@ -12,13 +12,14 @@
#define PC_RTP_TRANSPORT_INTERNAL_H_
#include <string>
+#include <utility>
#include "call/rtp_demuxer.h"
#include "p2p/base/ice_transport_internal.h"
#include "pc/session_description.h"
+#include "rtc_base/callback_list.h"
#include "rtc_base/network_route.h"
#include "rtc_base/ssl_stream_adapter.h"
-#include "rtc_base/third_party/sigslot/sigslot.h"
namespace rtc {
class CopyOnWriteBuffer;
@@ -50,27 +51,59 @@
// Called whenever a transport's ready-to-send state changes. The argument
// is true if all used transports are ready to send. This is more specific
// than just "writable"; it means the last send didn't return ENOTCONN.
- sigslot::signal1<bool> SignalReadyToSend;
+ void SubscribeReadyToSend(const void* tag,
+ absl::AnyInvocable<void(bool)> callback) {
+ callback_list_ready_to_send_.AddReceiver(tag, std::move(callback));
+ }
+ void UnsubscribeReadyToSend(const void* tag) {
+ callback_list_ready_to_send_.RemoveReceivers(tag);
+ }
// Called whenever an RTCP packet is received. There is no equivalent signal
// for demuxable RTP packets because they would be forwarded to the
// BaseChannel through the RtpDemuxer callback.
- sigslot::signal2<rtc::CopyOnWriteBuffer*, int64_t> SignalRtcpPacketReceived;
+ void SubscribeRtcpPacketReceived(
+ const void* tag,
+ absl::AnyInvocable<void(rtc::CopyOnWriteBuffer*, int64_t)> callback) {
+ callback_list_rtcp_packet_received_.AddReceiver(tag, std::move(callback));
+ }
+ // There doesn't seem to be a need to unsubscribe from this signal.
// Called whenever a RTP packet that can not be demuxed by the transport is
// received.
- sigslot::signal<const webrtc::RtpPacketReceived&>
- SignalUnDemuxableRtpPacketReceived;
+ void SetUnDemuxableRtpPacketReceivedHandler(
+ absl::AnyInvocable<void(webrtc::RtpPacketReceived&)> callback) {
+ callback_undemuxable_rtp_packet_received_ = std::move(callback);
+ }
// Called whenever the network route of the P2P layer transport changes.
// The argument is an optional network route.
- sigslot::signal1<absl::optional<rtc::NetworkRoute>> SignalNetworkRouteChanged;
+ void SubscribeNetworkRouteChanged(
+ const void* tag,
+ absl::AnyInvocable<void(absl::optional<rtc::NetworkRoute>)> callback) {
+ callback_list_network_route_changed_.AddReceiver(tag, std::move(callback));
+ }
+ void UnsubscribeNetworkRouteChanged(const void* tag) {
+ callback_list_network_route_changed_.RemoveReceivers(tag);
+ }
// Called whenever a transport's writable state might change. The argument is
// true if the transport is writable, otherwise it is false.
- sigslot::signal1<bool> SignalWritableState;
-
- sigslot::signal1<const rtc::SentPacket&> SignalSentPacket;
+ void SubscribeWritableState(const void* tag,
+ absl::AnyInvocable<void(bool)> callback) {
+ callback_list_writable_state_.AddReceiver(tag, std::move(callback));
+ }
+ void UnsubscribeWritableState(const void* tag) {
+ callback_list_writable_state_.RemoveReceivers(tag);
+ }
+ void SubscribeSentPacket(
+ const void* tag,
+ absl::AnyInvocable<void(const rtc::SentPacket&)> callback) {
+ callback_list_sent_packet_.AddReceiver(tag, std::move(callback));
+ }
+ void UnsubscribeSentPacket(const void* tag) {
+ callback_list_sent_packet_.RemoveReceivers(tag);
+ }
virtual bool IsWritable(bool rtcp) const = 0;
@@ -103,6 +136,37 @@
RtpPacketSinkInterface* sink) = 0;
virtual bool UnregisterRtpDemuxerSink(RtpPacketSinkInterface* sink) = 0;
+
+ protected:
+ void SendReadyToSend(bool arg) { callback_list_ready_to_send_.Send(arg); }
+ void SendRtcpPacketReceived(rtc::CopyOnWriteBuffer* buffer,
+ int64_t packet_time_us) {
+ callback_list_rtcp_packet_received_.Send(buffer, packet_time_us);
+ }
+ void NotifyUnDemuxableRtpPacketReceived(RtpPacketReceived& packet) {
+ callback_undemuxable_rtp_packet_received_(packet);
+ }
+ void SendNetworkRouteChanged(absl::optional<rtc::NetworkRoute> route) {
+ callback_list_network_route_changed_.Send(route);
+ }
+ void SendWritableState(bool state) {
+ callback_list_writable_state_.Send(state);
+ }
+ void SendSentPacket(const rtc::SentPacket& packet) {
+ callback_list_sent_packet_.Send(packet);
+ }
+
+ private:
+ CallbackList<bool> callback_list_ready_to_send_;
+ CallbackList<rtc::CopyOnWriteBuffer*, int64_t>
+ callback_list_rtcp_packet_received_;
+ absl::AnyInvocable<void(webrtc::RtpPacketReceived&)>
+ callback_undemuxable_rtp_packet_received_ =
+ [](RtpPacketReceived& packet) {};
+ CallbackList<absl::optional<rtc::NetworkRoute>>
+ callback_list_network_route_changed_;
+ CallbackList<bool> callback_list_writable_state_;
+ CallbackList<const rtc::SentPacket&> callback_list_sent_packet_;
};
} // namespace webrtc
diff --git a/pc/rtp_transport_unittest.cc b/pc/rtp_transport_unittest.cc
index e3d4101..ca748ae 100644
--- a/pc/rtp_transport_unittest.cc
+++ b/pc/rtp_transport_unittest.cc
@@ -30,9 +30,12 @@
public:
explicit SignalObserver(RtpTransport* transport) {
transport_ = transport;
- transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
- transport->SignalNetworkRouteChanged.connect(
- this, &SignalObserver::OnNetworkRouteChanged);
+ transport->SubscribeReadyToSend(
+ this, [this](bool ready) { OnReadyToSend(ready); });
+ transport->SubscribeNetworkRouteChanged(
+ this, [this](absl::optional<rtc::NetworkRoute> route) {
+ OnNetworkRouteChanged(route);
+ });
if (transport->rtp_packet_transport()) {
transport->rtp_packet_transport()->SignalSentPacket.connect(
this, &SignalObserver::OnSentPacket);
diff --git a/pc/srtp_transport.cc b/pc/srtp_transport.cc
index 1698b21..cc20216 100644
--- a/pc/srtp_transport.cc
+++ b/pc/srtp_transport.cc
@@ -244,7 +244,7 @@
return;
}
packet.SetSize(len);
- SignalRtcpPacketReceived(&packet, packet_time_us);
+ SendRtcpPacketReceived(&packet, packet_time_us);
}
void SrtpTransport::OnNetworkRouteChanged(
@@ -257,12 +257,12 @@
}
network_route->packet_overhead += srtp_overhead;
}
- SignalNetworkRouteChanged(network_route);
+ SendNetworkRouteChanged(network_route);
}
void SrtpTransport::OnWritableState(
rtc::PacketTransportInternal* packet_transport) {
- SignalWritableState(IsWritable(/*rtcp=*/false) && IsWritable(/*rtcp=*/true));
+ SendWritableState(IsWritable(/*rtcp=*/false) && IsWritable(/*rtcp=*/true));
}
bool SrtpTransport::SetRtpParams(int send_crypto_suite,
@@ -515,7 +515,7 @@
// Only fire the signal if the writable state changes.
if (writable_ != writable) {
writable_ = writable;
- SignalWritableState(writable_);
+ SendWritableState(writable_);
}
}
diff --git a/pc/srtp_transport_unittest.cc b/pc/srtp_transport_unittest.cc
index 4e64393..ac8be87 100644
--- a/pc/srtp_transport_unittest.cc
+++ b/pc/srtp_transport_unittest.cc
@@ -66,10 +66,16 @@
srtp_transport1_->SetRtpPacketTransport(rtp_packet_transport1_.get());
srtp_transport2_->SetRtpPacketTransport(rtp_packet_transport2_.get());
- srtp_transport1_->SignalRtcpPacketReceived.connect(
- &rtp_sink1_, &TransportObserver::OnRtcpPacketReceived);
- srtp_transport2_->SignalRtcpPacketReceived.connect(
- &rtp_sink2_, &TransportObserver::OnRtcpPacketReceived);
+ srtp_transport1_->SubscribeRtcpPacketReceived(
+ &rtp_sink1_,
+ [this](rtc::CopyOnWriteBuffer* buffer, int64_t packet_time_ms) {
+ rtp_sink1_.OnRtcpPacketReceived(buffer, packet_time_ms);
+ });
+ srtp_transport2_->SubscribeRtcpPacketReceived(
+ &rtp_sink2_,
+ [this](rtc::CopyOnWriteBuffer* buffer, int64_t packet_time_ms) {
+ rtp_sink2_.OnRtcpPacketReceived(buffer, packet_time_ms);
+ });
RtpDemuxerCriteria demuxer_criteria;
// 0x00 is the payload type used in kPcmuFrame.
diff --git a/pc/test/rtp_transport_test_util.h b/pc/test/rtp_transport_test_util.h
index e93dbdb..29ffad8 100644
--- a/pc/test/rtp_transport_test_util.h
+++ b/pc/test/rtp_transport_test_util.h
@@ -14,24 +14,26 @@
#include "call/rtp_packet_sink_interface.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "pc/rtp_transport_internal.h"
-#include "rtc_base/third_party/sigslot/sigslot.h"
namespace webrtc {
// Used to handle the signals when the RtpTransport receives an RTP/RTCP packet.
// Used in Rtp/Srtp/DtlsTransport unit tests.
-class TransportObserver : public RtpPacketSinkInterface,
- public sigslot::has_slots<> {
+class TransportObserver : public RtpPacketSinkInterface {
public:
TransportObserver() {}
explicit TransportObserver(RtpTransportInternal* rtp_transport) {
- rtp_transport->SignalRtcpPacketReceived.connect(
- this, &TransportObserver::OnRtcpPacketReceived);
- rtp_transport->SignalReadyToSend.connect(this,
- &TransportObserver::OnReadyToSend);
- rtp_transport->SignalUnDemuxableRtpPacketReceived.connect(
- this, &TransportObserver::OnUndemuxableRtpPacket);
+ rtp_transport->SubscribeRtcpPacketReceived(
+ this, [this](rtc::CopyOnWriteBuffer* buffer, int64_t packet_time_ms) {
+ OnRtcpPacketReceived(buffer, packet_time_ms);
+ });
+ rtp_transport->SubscribeReadyToSend(
+ this, [this](bool arg) { OnReadyToSend(arg); });
+ rtp_transport->SetUnDemuxableRtpPacketReceivedHandler(
+ [this](webrtc::RtpPacketReceived& packet) {
+ OnUndemuxableRtpPacket(packet);
+ });
}
// RtpPacketInterface override.