Make AudioSendStream to be OverheadObserver
In order to have correct overhead adjustments for ANA in AudioSendStream we need to know both transport and audio packetization overheads in AudioSendStream. This change makes AudioSendStream to be OverheadObserver instead of ChannelSend. This change is required for https://webrtc-review.googlesource.com/c/src/+/115082.
This change was also suggested earlier in TODO:
// TODO(solenberg): Make AudioSendStream an OverheadObserver instead.
https://cs.chromium.org/chromium/src/third_party/webrtc/audio/channel_send.cc?rcl=71b5a7df7794bbc4103296fcd8bd740acebdc901&l=1181
I think we should also consider moving TargetTransferRate observer to AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it makes sense to consolidate all rate (and overhead) calculation there. Added TODO to clean it up in next chanelists.
Bug: webrtc:10150
Change-Id: I48791b998ea00ffde9ec75c6bca8b6dc83001b42
Reviewed-on: https://webrtc-review.googlesource.com/c/119121
Commit-Queue: Anton Sukhanov <sukhanov@webrtc.org>
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Reviewed-by: Minyue Li <minyue@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26540}diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
index 544c936..baf51b2 100644
--- a/audio/audio_send_stream.cc
+++ b/audio/audio_send_stream.cc
@@ -111,6 +111,7 @@
voe::CreateChannelSend(worker_queue,
module_process_thread,
config.media_transport,
+ /*overhead_observer=*/this,
config.send_transport,
rtcp_rtt_stats,
event_log,
@@ -152,7 +153,15 @@
// should be no rtp_transport, and below check should be strengthened to XOR
// (either rtp_transport or media_transport but not both).
RTC_DCHECK(rtp_transport || config.media_transport);
-
+ if (config.media_transport) {
+ // TODO(sukhanov): Currently media transport audio overhead is considered
+ // constant, we will not get overhead_observer calls when using
+ // media_transport. In the future when we introduce RTP media transport we
+ // should make audio overhead interface consistent and work for both RTP and
+ // non-RTP implementations.
+ audio_overhead_per_packet_bytes_ =
+ config.media_transport->GetAudioPacketOverhead();
+ }
rtp_rtcp_module_ = channel_send_->GetRtpRtcp();
RTC_DCHECK(rtp_rtcp_module_);
@@ -480,9 +489,38 @@
}
}
-void AudioSendStream::SetTransportOverhead(int transport_overhead_per_packet) {
+void AudioSendStream::SetTransportOverhead(
+ int transport_overhead_per_packet_bytes) {
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
- channel_send_->SetTransportOverhead(transport_overhead_per_packet);
+ rtc::CritScope cs(&overhead_per_packet_lock_);
+ transport_overhead_per_packet_bytes_ = transport_overhead_per_packet_bytes;
+ UpdateOverheadForEncoder();
+}
+
+void AudioSendStream::OnOverheadChanged(
+ size_t overhead_bytes_per_packet_bytes) {
+ rtc::CritScope cs(&overhead_per_packet_lock_);
+ audio_overhead_per_packet_bytes_ = overhead_bytes_per_packet_bytes;
+ UpdateOverheadForEncoder();
+}
+
+void AudioSendStream::UpdateOverheadForEncoder() {
+ const size_t overhead_per_packet_bytes = GetPerPacketOverheadBytes();
+ CallEncoder(channel_send_, [&](AudioEncoder* encoder) {
+ if (encoder) {
+ encoder->OnReceivedOverhead(overhead_per_packet_bytes);
+ }
+ });
+}
+
+size_t AudioSendStream::TestOnlyGetPerPacketOverheadBytes() const {
+ rtc::CritScope cs(&overhead_per_packet_lock_);
+ return GetPerPacketOverheadBytes();
+}
+
+size_t AudioSendStream::GetPerPacketOverheadBytes() const {
+ return transport_overhead_per_packet_bytes_ +
+ audio_overhead_per_packet_bytes_;
}
RtpState AudioSendStream::GetRtpState() const {
@@ -568,10 +606,18 @@
new_config.send_codec_spec->format.clockrate_hz);
}
+ // Set currently known overhead (used in ANA, opus only).
+ // If overhead changes later, it will be updated in UpdateOverheadForEncoder.
+ {
+ rtc::CritScope cs(&stream->overhead_per_packet_lock_);
+ encoder->OnReceivedOverhead(stream->GetPerPacketOverheadBytes());
+ }
+
stream->StoreEncoderProperties(encoder->SampleRateHz(),
encoder->NumChannels());
stream->channel_send_->SetEncoder(new_config.send_codec_spec->payload_type,
std::move(encoder));
+
return true;
}
@@ -619,6 +665,12 @@
ReconfigureANA(stream, new_config);
ReconfigureCNG(stream, new_config);
+ // Set currently known overhead (used in ANA, opus only).
+ {
+ rtc::CritScope cs(&stream->overhead_per_packet_lock_);
+ stream->UpdateOverheadForEncoder();
+ }
+
return true;
}