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 <hta@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35649}
This commit is contained in:
Tomas Gunnarsson 2022-01-06 14:47:12 +00:00 committed by WebRTC LUCI CQ
parent 47ff35db61
commit e68d874cf1

View File

@ -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();
}