From e68d874cf109ddd262dc0857b183f495b0349bbc Mon Sep 17 00:00:00 2001 From: Tomas Gunnarsson Date: Thu, 6 Jan 2022 14:47:12 +0000 Subject: [PATCH] Update SetPayloadTypeDemuxingEnabled_w to avoid an unnecessary Invoke. If a call to BaseChannel::SetPayloadTypeDemuxingEnabled does not result in a demuxer criteria configuration change, we can avoid an Invoke and speed up negotiations. Bug: webrtc:11993 Change-Id: I80c894d7cc2a733ab84c1f4978f0c58c09a123a5 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/244920 Reviewed-by: Harald Alvestrand Commit-Queue: Tomas Gunnarsson Cr-Commit-Position: refs/heads/main@{#35649} --- pc/channel.cc | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/pc/channel.cc b/pc/channel.cc index 6716c060ee..c60cce58c0 100644 --- a/pc/channel.cc +++ b/pc/channel.cc @@ -572,10 +572,16 @@ void BaseChannel::ChannelNotWritable_n() { } bool BaseChannel::SetPayloadTypeDemuxingEnabled_w(bool enabled) { + RTC_LOG_THREAD_BLOCK_COUNT(); + if (enabled == payload_type_demuxing_enabled_) { return true; } + payload_type_demuxing_enabled_ = enabled; + + bool config_changed = false; + if (!enabled) { // TODO(crbug.com/11477): This will remove *all* unsignaled streams (those // without an explicitly signaled SSRC), which may include streams that @@ -583,14 +589,25 @@ bool BaseChannel::SetPayloadTypeDemuxingEnabled_w(bool enabled) { // streams that were matched based on payload type alone, but currently // there is no straightforward way to identify those streams. media_channel()->ResetUnsignaledRecvStream(); - demuxer_criteria_.payload_types().clear(); + if (!demuxer_criteria_.payload_types().empty()) { + config_changed = true; + demuxer_criteria_.payload_types().clear(); + } } else if (!payload_types_.empty()) { - // TODO(tommi): Instead of 'insert', should this simply overwrite the value - // of the criteria? - demuxer_criteria_.payload_types().insert(payload_types_.begin(), - payload_types_.end()); + for (const auto& type : payload_types_) { + if (demuxer_criteria_.payload_types().insert(type).second) { + config_changed = true; + } + } + } else { + RTC_DCHECK(demuxer_criteria_.payload_types().empty()); } + RTC_DCHECK_BLOCK_COUNT_NO_MORE_THAN(0); + + if (!config_changed) + return true; + // Note: This synchronously hops to the network thread. return RegisterRtpDemuxerSink_w(); }