Call the audio encoder asynchronously when updating RTT, loss and bitrate allocation.
This avoids blocking the worker thread on audio encoding for these updates.
Bug: None
Change-Id: I4a3ddbbfd5cfad6190d258d8d173d07d3d86d404
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/383520
Commit-Queue: Jakob Ivarsson‎ <jakobi@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44260}
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index 1a487d9..b9e0d58 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -20,6 +20,7 @@
#include <utility>
#include <vector>
+#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "api/array_view.h"
#include "api/audio_codecs/audio_encoder.h"
@@ -250,6 +251,9 @@
void InitFrameTransformerDelegate(
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer);
+ // Calls the encoder on the encoder queue (instead of blocking).
+ void CallEncoderAsync(absl::AnyInvocable<void(AudioEncoder*)> modifier);
+
const Environment env_;
// Thread checkers document and lock usage of some methods on voe::Channel to
@@ -637,14 +641,15 @@
});
}
+void ChannelSend::CallEncoderAsync(
+ absl::AnyInvocable<void(AudioEncoder*)> modifier) {
+ encoder_queue_->PostTask([this, modifier = std::move(modifier)]() mutable {
+ CallEncoder(modifier);
+ });
+}
+
void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
- // This method can be called on the worker thread, module process thread
- // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
- // TODO(solenberg): Figure out a good way to check this or enforce calling
- // rules.
- // RTC_DCHECK(worker_thread_checker_.IsCurrent() ||
- // module_process_thread_checker_.IsCurrent());
- CallEncoder([&](AudioEncoder* encoder) {
+ CallEncoderAsync([update](AudioEncoder* encoder) {
encoder->OnReceivedUplinkAllocation(update);
});
retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
@@ -656,7 +661,7 @@
void ChannelSend::OnReportBlockDataUpdated(ReportBlockData report_block) {
float packet_loss_rate = report_block.fraction_lost();
- CallEncoder([&](AudioEncoder* encoder) {
+ CallEncoderAsync([packet_loss_rate](AudioEncoder* encoder) {
encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
});
}
@@ -927,8 +932,7 @@
}
void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
- // Invoke audio encoders OnReceivedRtt().
- CallEncoder(
+ CallEncoderAsync(
[rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
}