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