Move PostTask for DeliverRtcp from PeerConnection to Call.
This is part of moving the thread hops from the network thread to
worker (required by Call) into Call itself so that we can eventually
remove them.
Bug: webrtc:11993
Change-Id: Ib3ccdd6c75a3848daae2e3ce6c9a55d9617c2f50
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220604
Commit-Queue: Tommi <tommi@webrtc.org>
Reviewed-by: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34160}
diff --git a/call/call.cc b/call/call.cc
index cdc57be..678ea55 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -352,16 +352,12 @@
RTC_GUARDED_BY(sequence_checker_);
};
- DeliveryStatus DeliverRtcp(MediaType media_type,
- const uint8_t* packet,
- size_t length)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(worker_thread_);
+ void DeliverRtcp(MediaType media_type, rtc::CopyOnWriteBuffer packet)
+ RTC_RUN_ON(network_thread_);
DeliveryStatus DeliverRtp(MediaType media_type,
rtc::CopyOnWriteBuffer packet,
- int64_t packet_time_us)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(worker_thread_);
- void ConfigureSync(const std::string& sync_group)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(worker_thread_);
+ int64_t packet_time_us) RTC_RUN_ON(worker_thread_);
+ void ConfigureSync(const std::string& sync_group) RTC_RUN_ON(worker_thread_);
void NotifyBweOfReceivedPacket(const RtpPacketReceived& packet,
MediaType media_type)
@@ -371,7 +367,7 @@
// Ensure that necessary process threads are started, and any required
// callbacks have been registered.
- void EnsureStarted() RTC_EXCLUSIVE_LOCKS_REQUIRED(worker_thread_);
+ void EnsureStarted() RTC_RUN_ON(worker_thread_);
rtc::TaskQueue* send_transport_queue() const {
return transport_send_ptr_->GetWorkerQueue();
@@ -1420,9 +1416,8 @@
}
}
-PacketReceiver::DeliveryStatus Call::DeliverRtcp(MediaType media_type,
- const uint8_t* packet,
- size_t length) {
+// RTC_RUN_ON(network_thread_)
+void Call::DeliverRtcp(MediaType media_type, rtc::CopyOnWriteBuffer packet) {
TRACE_EVENT0("webrtc", "Call::DeliverRtcp");
// TODO(bugs.webrtc.org/11993): This DCHECK is here just to maintain the
@@ -1437,42 +1432,39 @@
// This way we'll also know more about the context of the packet.
RTC_DCHECK_EQ(media_type, MediaType::ANY);
- // TODO(pbos): Make sure it's a valid packet.
- // Return DELIVERY_UNKNOWN_SSRC if it can be determined that
- // there's no receiver of the packet.
- receive_stats_.AddReceivedRtcpBytes(static_cast<int>(length));
- bool rtcp_delivered = false;
- if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
- for (VideoReceiveStream2* stream : video_receive_streams_) {
- if (stream->DeliverRtcp(packet, length))
- rtcp_delivered = true;
- }
- }
- if (media_type == MediaType::ANY || media_type == MediaType::AUDIO) {
- for (AudioReceiveStream* stream : audio_receive_streams_) {
- stream->DeliverRtcp(packet, length);
- rtcp_delivered = true;
- }
- }
- if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
- for (VideoSendStream* stream : video_send_streams_) {
- stream->DeliverRtcp(packet, length);
- rtcp_delivered = true;
- }
- }
- if (media_type == MediaType::ANY || media_type == MediaType::AUDIO) {
- for (auto& kv : audio_send_ssrcs_) {
- kv.second->DeliverRtcp(packet, length);
- rtcp_delivered = true;
- }
- }
+ // TODO(bugs.webrtc.org/11993): This should execute directly on the network
+ // thread.
+ worker_thread_->PostTask(
+ ToQueuedTask(task_safety_, [this, packet = std::move(packet)]() {
+ RTC_DCHECK_RUN_ON(worker_thread_);
- if (rtcp_delivered) {
- event_log_->Log(std::make_unique<RtcEventRtcpPacketIncoming>(
- rtc::MakeArrayView(packet, length)));
- }
+ receive_stats_.AddReceivedRtcpBytes(static_cast<int>(packet.size()));
+ bool rtcp_delivered = false;
+ for (VideoReceiveStream2* stream : video_receive_streams_) {
+ if (stream->DeliverRtcp(packet.cdata(), packet.size()))
+ rtcp_delivered = true;
+ }
- return rtcp_delivered ? DELIVERY_OK : DELIVERY_PACKET_ERROR;
+ for (AudioReceiveStream* stream : audio_receive_streams_) {
+ stream->DeliverRtcp(packet.cdata(), packet.size());
+ rtcp_delivered = true;
+ }
+
+ for (VideoSendStream* stream : video_send_streams_) {
+ stream->DeliverRtcp(packet.cdata(), packet.size());
+ rtcp_delivered = true;
+ }
+
+ for (auto& kv : audio_send_ssrcs_) {
+ kv.second->DeliverRtcp(packet.cdata(), packet.size());
+ rtcp_delivered = true;
+ }
+
+ if (rtcp_delivered) {
+ event_log_->Log(std::make_unique<RtcEventRtcpPacketIncoming>(
+ rtc::MakeArrayView(packet.cdata(), packet.size())));
+ }
+ }));
}
PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type,
@@ -1549,11 +1541,13 @@
MediaType media_type,
rtc::CopyOnWriteBuffer packet,
int64_t packet_time_us) {
+ if (IsRtcp(packet.cdata(), packet.size())) {
+ RTC_DCHECK_RUN_ON(network_thread_);
+ DeliverRtcp(media_type, std::move(packet));
+ return DELIVERY_OK;
+ }
+
RTC_DCHECK_RUN_ON(worker_thread_);
-
- if (IsRtcp(packet.cdata(), packet.size()))
- return DeliverRtcp(media_type, packet.cdata(), packet.size());
-
return DeliverRtp(media_type, std::move(packet), packet_time_us);
}
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index 0939f59..2ef00de 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -2869,18 +2869,10 @@
int64_t packet_time_us)>
PeerConnection::InitializeRtcpCallback() {
RTC_DCHECK_RUN_ON(network_thread());
- return [this, flag = worker_thread_safety_](
- const rtc::CopyOnWriteBuffer& packet, int64_t packet_time_us) {
+ return [this](const rtc::CopyOnWriteBuffer& packet, int64_t packet_time_us) {
RTC_DCHECK_RUN_ON(network_thread());
- // TODO(bugs.webrtc.org/11993): We should actually be delivering this call
- // directly to the Call class somehow directly on the network thread and not
- // incur this hop here. The DeliverPacket() method will eventually just have
- // to hop back over to the network thread.
- worker_thread()->PostTask(ToQueuedTask(flag, [this, packet,
- packet_time_us] {
- RTC_DCHECK_RUN_ON(worker_thread());
- call_->Receiver()->DeliverPacket(MediaType::ANY, packet, packet_time_us);
- }));
+ call_ptr_->Receiver()->DeliverPacket(MediaType::ANY, packet,
+ packet_time_us);
};
}