blob: 7430681f450aaa7d7ce5f4c82dc19f3f47e9e159 [file] [log] [blame]
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +02001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "audio/audio_receive_stream.h"
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020012
13#include <string>
Tommif888bb52015-12-12 01:37:01 +010014#include <utility>
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020015
Yves Gerey988cc082018-10-23 12:03:01 +020016#include "absl/memory/memory.h"
17#include "api/array_view.h"
18#include "api/audio_codecs/audio_format.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/call/audio_sink.h"
Steve Anton10542f22019-01-11 09:11:00 -080020#include "api/rtp_parameters.h"
Markus Handellacd16af2021-05-29 13:21:28 +020021#include "api/sequence_checker.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "audio/audio_send_stream.h"
23#include "audio/audio_state.h"
Yves Gerey988cc082018-10-23 12:03:01 +020024#include "audio/channel_receive.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "audio/conversion.h"
Yves Gerey988cc082018-10-23 12:03:01 +020026#include "call/rtp_config.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "call/rtp_stream_receiver_controller_interface.h"
Ranveer Aggarwaldea374a2021-01-23 12:27:19 +053028#include "modules/rtp_rtcp/source/rtp_packet_received.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "rtc_base/checks.h"
30#include "rtc_base/logging.h"
Tommifef05002018-02-27 13:51:08 +010031#include "rtc_base/strings/string_builder.h"
Steve Anton10542f22019-01-11 09:11:00 -080032#include "rtc_base/time_utils.h"
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020033
34namespace webrtc {
Stefan Holmer3842c5c2016-01-12 13:55:00 +010035
Tommi3176ef72022-05-22 20:47:28 +020036std::string AudioReceiveStreamInterface::Config::Rtp::ToString() const {
Karl Wiberg881f1682018-03-08 15:03:23 +010037 char ss_buf[1024];
38 rtc::SimpleStringBuilder ss(ss_buf);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020039 ss << "{remote_ssrc: " << remote_ssrc;
solenberg85a04962015-10-27 03:35:21 -070040 ss << ", local_ssrc: " << local_ssrc;
solenberg8189b022016-06-14 12:13:00 -070041 ss << ", nack: " << nack.ToString();
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020042 ss << '}';
43 return ss.str();
44}
45
Tommi3176ef72022-05-22 20:47:28 +020046std::string AudioReceiveStreamInterface::Config::ToString() const {
Karl Wiberg881f1682018-03-08 15:03:23 +010047 char ss_buf[1024];
48 rtc::SimpleStringBuilder ss(ss_buf);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020049 ss << "{rtp: " << rtp.ToString();
solenberg85a04962015-10-27 03:35:21 -070050 ss << ", rtcp_send_transport: "
deadbeef922246a2017-02-26 04:18:12 -080051 << (rtcp_send_transport ? "(Transport)" : "null");
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020052 if (!sync_group.empty()) {
pbos8fc7fa72015-07-15 08:02:58 -070053 ss << ", sync_group: " << sync_group;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020054 }
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020055 ss << '}';
56 return ss.str();
57}
58
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010059namespace {
Niels Möller349ade32018-11-16 09:50:42 +010060std::unique_ptr<voe::ChannelReceiveInterface> CreateChannelReceive(
Sebastian Jansson977b3352019-03-04 17:43:34 +010061 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010062 webrtc::AudioState* audio_state,
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +010063 NetEqFactory* neteq_factory,
Tommi3176ef72022-05-22 20:47:28 +020064 const webrtc::AudioReceiveStreamInterface::Config& config,
Niels Möllerfa4e1852018-08-14 09:43:34 +020065 RtcEventLog* event_log) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010066 RTC_DCHECK(audio_state);
67 internal::AudioState* internal_audio_state =
68 static_cast<internal::AudioState*>(audio_state);
Niels Möller349ade32018-11-16 09:50:42 +010069 return voe::CreateChannelReceive(
Markus Handelleb61b7f2021-06-22 10:46:48 +020070 clock, neteq_factory, internal_audio_state->audio_device_module(),
71 config.rtcp_send_transport, event_log, config.rtp.local_ssrc,
72 config.rtp.remote_ssrc, config.jitter_buffer_max_packets,
73 config.jitter_buffer_fast_accelerate, config.jitter_buffer_min_delay_ms,
Tommi1def8992022-05-20 16:17:49 +020074 config.enable_non_sender_rtt, config.decoder_factory,
75 config.codec_pair_id, std::move(config.frame_decryptor),
76 config.crypto_options, std::move(config.frame_transformer));
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010077}
78} // namespace
79
Tommidddbbeb2022-05-20 15:21:33 +020080AudioReceiveStreamImpl::AudioReceiveStreamImpl(
Sebastian Jansson977b3352019-03-04 17:43:34 +010081 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010082 PacketRouter* packet_router,
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +010083 NetEqFactory* neteq_factory,
Tommi3176ef72022-05-22 20:47:28 +020084 const webrtc::AudioReceiveStreamInterface::Config& config,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010085 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
86 webrtc::RtcEventLog* event_log)
Tommidddbbeb2022-05-20 15:21:33 +020087 : AudioReceiveStreamImpl(clock,
88 packet_router,
89 config,
90 audio_state,
91 event_log,
92 CreateChannelReceive(clock,
93 audio_state.get(),
94 neteq_factory,
95 config,
96 event_log)) {}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010097
Tommidddbbeb2022-05-20 15:21:33 +020098AudioReceiveStreamImpl::AudioReceiveStreamImpl(
Sebastian Jansson977b3352019-03-04 17:43:34 +010099 Clock* clock,
nisse0245da02016-11-30 03:35:20 -0800100 PacketRouter* packet_router,
Tommi3176ef72022-05-22 20:47:28 +0200101 const webrtc::AudioReceiveStreamInterface::Config& config,
ivoc14d5dbe2016-07-04 07:06:55 -0700102 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100103 webrtc::RtcEventLog* event_log,
Niels Möller349ade32018-11-16 09:50:42 +0100104 std::unique_ptr<voe::ChannelReceiveInterface> channel_receive)
Markus Handellacd16af2021-05-29 13:21:28 +0200105 : config_(config),
106 audio_state_(audio_state),
Ranveer Aggarwaldea374a2021-01-23 12:27:19 +0530107 source_tracker_(clock),
108 channel_receive_(std::move(channel_receive)) {
Tommidddbbeb2022-05-20 15:21:33 +0200109 RTC_LOG(LS_INFO) << "AudioReceiveStreamImpl: " << config.rtp.remote_ssrc;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100110 RTC_DCHECK(config.decoder_factory);
Niels Möllerae4237e2018-10-05 11:28:38 +0200111 RTC_DCHECK(config.rtcp_send_transport);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100112 RTC_DCHECK(audio_state_);
Niels Möller349ade32018-11-16 09:50:42 +0100113 RTC_DCHECK(channel_receive_);
solenberg7add0582015-11-20 09:59:34 -0800114
Tommi90738dd2021-05-31 17:36:47 +0200115 packet_sequence_checker_.Detach();
Tommi02df2eb2021-05-31 12:57:53 +0200116
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800117 RTC_DCHECK(packet_router);
118 // Configure bandwidth estimation.
119 channel_receive_->RegisterReceiverCongestionControlObjects(packet_router);
nisse0f15f922017-06-21 01:05:22 -0700120
Ranveer Aggarwaldea374a2021-01-23 12:27:19 +0530121 // When output is muted, ChannelReceive will directly notify the source
122 // tracker of "delivered" frames, so RtpReceiver information will continue to
123 // be updated.
124 channel_receive_->SetSourceTracker(&source_tracker_);
125
Markus Handellacd16af2021-05-29 13:21:28 +0200126 // Complete configuration.
127 // TODO(solenberg): Config NACK history window (which is a packet count),
128 // using the actual packet size for the configured codec.
129 channel_receive_->SetNACKStatus(config.rtp.nack.rtp_history_ms != 0,
130 config.rtp.nack.rtp_history_ms / 20);
131 channel_receive_->SetReceiveCodecs(config.decoder_map);
Tommi6eda26c2021-06-09 13:46:28 +0200132 // `frame_transformer` and `frame_decryptor` have been given to
133 // `channel_receive_` already.
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200134}
135
Tommidddbbeb2022-05-20 15:21:33 +0200136AudioReceiveStreamImpl::~AudioReceiveStreamImpl() {
solenberg3ebbcb52017-01-31 03:58:40 -0800137 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Tommidddbbeb2022-05-20 15:21:33 +0200138 RTC_LOG(LS_INFO) << "~AudioReceiveStreamImpl: " << remote_ssrc();
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100139 Stop();
Niels Möller349ade32018-11-16 09:50:42 +0100140 channel_receive_->SetAssociatedSendChannel(nullptr);
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800141 channel_receive_->ResetReceiverCongestionControlObjects();
pbosa2f30de2015-10-15 05:22:13 -0700142}
143
Tommidddbbeb2022-05-20 15:21:33 +0200144void AudioReceiveStreamImpl::RegisterWithTransport(
Tommi02df2eb2021-05-31 12:57:53 +0200145 RtpStreamReceiverControllerInterface* receiver_controller) {
Tommi90738dd2021-05-31 17:36:47 +0200146 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Tommi02df2eb2021-05-31 12:57:53 +0200147 RTC_DCHECK(!rtp_stream_receiver_);
148 rtp_stream_receiver_ = receiver_controller->CreateReceiver(
Tommicc50b042022-05-09 10:22:48 +0000149 remote_ssrc(), channel_receive_.get());
Tommi02df2eb2021-05-31 12:57:53 +0200150}
151
Tommidddbbeb2022-05-20 15:21:33 +0200152void AudioReceiveStreamImpl::UnregisterFromTransport() {
Tommi90738dd2021-05-31 17:36:47 +0200153 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Tommi02df2eb2021-05-31 12:57:53 +0200154 rtp_stream_receiver_.reset();
155}
156
Tommidddbbeb2022-05-20 15:21:33 +0200157void AudioReceiveStreamImpl::ReconfigureForTesting(
Tommi3176ef72022-05-22 20:47:28 +0200158 const webrtc::AudioReceiveStreamInterface::Config& config) {
Tommi6eda26c2021-06-09 13:46:28 +0200159 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Andrey Logvin8a18e5b2021-06-09 10:15:47 +0000160
161 // SSRC can't be changed mid-stream.
Tommicc50b042022-05-09 10:22:48 +0000162 RTC_DCHECK_EQ(remote_ssrc(), config.rtp.remote_ssrc);
163 RTC_DCHECK_EQ(local_ssrc(), config.rtp.local_ssrc);
Tommi6eda26c2021-06-09 13:46:28 +0200164
165 // Configuration parameters which cannot be changed.
166 RTC_DCHECK_EQ(config_.rtcp_send_transport, config.rtcp_send_transport);
167 // Decoder factory cannot be changed because it is configured at
168 // voe::Channel construction time.
169 RTC_DCHECK_EQ(config_.decoder_factory, config.decoder_factory);
Markus Handellacd16af2021-05-29 13:21:28 +0200170
171 // TODO(solenberg): Config NACK history window (which is a packet count),
172 // using the actual packet size for the configured codec.
Tommi6eda26c2021-06-09 13:46:28 +0200173 RTC_DCHECK_EQ(config_.rtp.nack.rtp_history_ms, config.rtp.nack.rtp_history_ms)
174 << "Use SetUseTransportCcAndNackHistory";
Markus Handellacd16af2021-05-29 13:21:28 +0200175
Tommi6eda26c2021-06-09 13:46:28 +0200176 RTC_DCHECK(config_.decoder_map == config.decoder_map) << "Use SetDecoderMap";
177 RTC_DCHECK_EQ(config_.frame_transformer, config.frame_transformer)
178 << "Use SetDepacketizerToDecoderFrameTransformer";
Markus Handellacd16af2021-05-29 13:21:28 +0200179
180 config_ = config;
Fredrik Solenberg3b903d02018-01-10 15:17:10 +0100181}
182
Tommidddbbeb2022-05-20 15:21:33 +0200183void AudioReceiveStreamImpl::Start() {
solenberg3ebbcb52017-01-31 03:58:40 -0800184 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
aleloi04c07222016-11-22 06:42:53 -0800185 if (playing_) {
186 return;
187 }
Niels Möller349ade32018-11-16 09:50:42 +0100188 channel_receive_->StartPlayout();
aleloi04c07222016-11-22 06:42:53 -0800189 playing_ = true;
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100190 audio_state()->AddReceivingStream(this);
solenberg7add0582015-11-20 09:59:34 -0800191}
192
Tommidddbbeb2022-05-20 15:21:33 +0200193void AudioReceiveStreamImpl::Stop() {
solenberg3ebbcb52017-01-31 03:58:40 -0800194 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
aleloi04c07222016-11-22 06:42:53 -0800195 if (!playing_) {
196 return;
197 }
Niels Möller349ade32018-11-16 09:50:42 +0100198 channel_receive_->StopPlayout();
aleloi04c07222016-11-22 06:42:53 -0800199 playing_ = false;
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100200 audio_state()->RemoveReceivingStream(this);
solenberg7add0582015-11-20 09:59:34 -0800201}
202
Tommidddbbeb2022-05-20 15:21:33 +0200203bool AudioReceiveStreamImpl::IsRunning() const {
Tomas Gunnarsson8467cf22021-01-17 14:36:44 +0100204 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
205 return playing_;
206}
207
Tommidddbbeb2022-05-20 15:21:33 +0200208void AudioReceiveStreamImpl::SetDepacketizerToDecoderFrameTransformer(
Tommi6eda26c2021-06-09 13:46:28 +0200209 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
210 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
211 channel_receive_->SetDepacketizerToDecoderFrameTransformer(
212 std::move(frame_transformer));
213}
214
Tommidddbbeb2022-05-20 15:21:33 +0200215void AudioReceiveStreamImpl::SetDecoderMap(
Tommi6eda26c2021-06-09 13:46:28 +0200216 std::map<int, SdpAudioFormat> decoder_map) {
217 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
218 config_.decoder_map = std::move(decoder_map);
219 channel_receive_->SetReceiveCodecs(config_.decoder_map);
220}
221
Tommia136ed42022-05-30 15:08:13 +0200222void AudioReceiveStreamImpl::SetNackHistory(int history_ms) {
Tommi6eda26c2021-06-09 13:46:28 +0200223 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
224 RTC_DCHECK_GE(history_ms, 0);
Tommia136ed42022-05-30 15:08:13 +0200225
226 if (config_.rtp.nack.rtp_history_ms == history_ms)
227 return;
228
229 config_.rtp.nack.rtp_history_ms = history_ms;
230 // TODO(solenberg): Config NACK history window (which is a packet count),
231 // using the actual packet size for the configured codec.
232 channel_receive_->SetNACKStatus(history_ms != 0, history_ms / 20);
Tommi6eda26c2021-06-09 13:46:28 +0200233}
234
Tommidddbbeb2022-05-20 15:21:33 +0200235void AudioReceiveStreamImpl::SetNonSenderRttMeasurement(bool enabled) {
Ivo Creusen2562cf02021-09-03 14:51:22 +0000236 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
237 config_.enable_non_sender_rtt = enabled;
238 channel_receive_->SetNonSenderRttMeasurement(enabled);
239}
240
Tommidddbbeb2022-05-20 15:21:33 +0200241void AudioReceiveStreamImpl::SetFrameDecryptor(
Tommie0972822021-06-14 08:11:10 +0200242 rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
243 // TODO(bugs.webrtc.org/11993): This is called via WebRtcAudioReceiveStream,
244 // expect to be called on the network thread.
245 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
246 channel_receive_->SetFrameDecryptor(std::move(frame_decryptor));
247}
248
Tommi3176ef72022-05-22 20:47:28 +0200249webrtc::AudioReceiveStreamInterface::Stats AudioReceiveStreamImpl::GetStats(
Niels Möller6b4d9622020-09-14 10:47:50 +0200250 bool get_and_clear_legacy_stats) const {
solenberg3ebbcb52017-01-31 03:58:40 -0800251 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Tommi3176ef72022-05-22 20:47:28 +0200252 webrtc::AudioReceiveStreamInterface::Stats stats;
Tommicc50b042022-05-09 10:22:48 +0000253 stats.remote_ssrc = remote_ssrc();
solenberg8b85de22015-11-16 09:48:04 -0800254
Niels Möller530ead42018-10-04 14:28:39 +0200255 webrtc::CallReceiveStatistics call_stats =
Niels Möller349ade32018-11-16 09:50:42 +0100256 channel_receive_->GetRTCPStatistics();
solenbergbd9a77f2017-02-06 12:53:57 -0800257 // TODO(solenberg): Don't return here if we can't get the codec - return the
258 // stats we *can* get.
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100259 auto receive_codec = channel_receive_->GetReceiveCodec();
260 if (!receive_codec) {
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200261 return stats;
262 }
263
Niels Möllerac0a4cb2019-10-09 15:01:33 +0200264 stats.payload_bytes_rcvd = call_stats.payload_bytes_rcvd;
265 stats.header_and_padding_bytes_rcvd =
266 call_stats.header_and_padding_bytes_rcvd;
solenberg85a04962015-10-27 03:35:21 -0700267 stats.packets_rcvd = call_stats.packetsReceived;
268 stats.packets_lost = call_stats.cumulativeLost;
Jakob Ivarssone54914a2021-07-01 11:16:05 +0200269 stats.nacks_sent = call_stats.nacks_sent;
solenberg8b85de22015-11-16 09:48:04 -0800270 stats.capture_start_ntp_time_ms = call_stats.capture_start_ntp_time_ms_;
Henrik Boström01738c62019-04-15 17:32:00 +0200271 stats.last_packet_received_timestamp_ms =
272 call_stats.last_packet_received_timestamp_ms;
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100273 stats.codec_name = receive_codec->second.name;
274 stats.codec_payload_type = receive_codec->first;
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100275 int clockrate_khz = receive_codec->second.clockrate_hz / 1000;
276 if (clockrate_khz > 0) {
277 stats.jitter_ms = call_stats.jitterSamples / clockrate_khz;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200278 }
Niels Möller349ade32018-11-16 09:50:42 +0100279 stats.delay_estimate_ms = channel_receive_->GetDelayEstimate();
280 stats.audio_level = channel_receive_->GetSpeechOutputLevelFullRange();
281 stats.total_output_energy = channel_receive_->GetTotalOutputEnergy();
282 stats.total_output_duration = channel_receive_->GetTotalOutputDuration();
Åsa Perssonfcf79cc2019-10-22 15:23:44 +0200283 stats.estimated_playout_ntp_timestamp_ms =
284 channel_receive_->GetCurrentEstimatedPlayoutNtpTimestampMs(
285 rtc::TimeMillis());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200286
solenberg8b85de22015-11-16 09:48:04 -0800287 // Get jitter buffer and total delay (alg + jitter + playout) stats.
Niels Möller6b4d9622020-09-14 10:47:50 +0200288 auto ns = channel_receive_->GetNetworkStatistics(get_and_clear_legacy_stats);
Minyue Li28a2c632021-07-07 15:53:38 +0200289 stats.packets_discarded = ns.packetsDiscarded;
Ivo Creusen8d8ffdb2019-04-30 09:45:21 +0200290 stats.fec_packets_received = ns.fecPacketsReceived;
291 stats.fec_packets_discarded = ns.fecPacketsDiscarded;
solenberg8b85de22015-11-16 09:48:04 -0800292 stats.jitter_buffer_ms = ns.currentBufferSize;
293 stats.jitter_buffer_preferred_ms = ns.preferredBufferSize;
Steve Anton2dbc69f2017-08-24 17:15:13 -0700294 stats.total_samples_received = ns.totalSamplesReceived;
295 stats.concealed_samples = ns.concealedSamples;
Ivo Creusen8d8ffdb2019-04-30 09:45:21 +0200296 stats.silent_concealed_samples = ns.silentConcealedSamples;
Gustaf Ullberg9a2e9062017-09-18 09:28:20 +0200297 stats.concealment_events = ns.concealmentEvents;
Gustaf Ullbergb0a02072017-10-02 12:00:34 +0200298 stats.jitter_buffer_delay_seconds =
299 static_cast<double>(ns.jitterBufferDelayMs) /
300 static_cast<double>(rtc::kNumMillisecsPerSec);
Chen Xing0acffb52019-01-15 15:46:29 +0100301 stats.jitter_buffer_emitted_count = ns.jitterBufferEmittedCount;
Artem Titove618cc92020-03-11 11:18:54 +0100302 stats.jitter_buffer_target_delay_seconds =
303 static_cast<double>(ns.jitterBufferTargetDelayMs) /
304 static_cast<double>(rtc::kNumMillisecsPerSec);
Ivo Creusen1a84b562022-07-19 16:33:10 +0200305 stats.jitter_buffer_minimum_delay_seconds =
306 static_cast<double>(ns.jitterBufferMinimumDelayMs) /
307 static_cast<double>(rtc::kNumMillisecsPerSec);
Ivo Creusen8d8ffdb2019-04-30 09:45:21 +0200308 stats.inserted_samples_for_deceleration = ns.insertedSamplesForDeceleration;
309 stats.removed_samples_for_acceleration = ns.removedSamplesForAcceleration;
solenberg8b85de22015-11-16 09:48:04 -0800310 stats.expand_rate = Q14ToFloat(ns.currentExpandRate);
311 stats.speech_expand_rate = Q14ToFloat(ns.currentSpeechExpandRate);
312 stats.secondary_decoded_rate = Q14ToFloat(ns.currentSecondaryDecodedRate);
minyue-webrtc0e320ec2017-08-28 13:51:27 +0200313 stats.secondary_discarded_rate = Q14ToFloat(ns.currentSecondaryDiscardedRate);
solenberg8b85de22015-11-16 09:48:04 -0800314 stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
315 stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
Ruslan Burakov8af88962018-11-22 17:21:10 +0100316 stats.jitter_buffer_flushes = ns.packetBufferFlushes;
Jakob Ivarsson352ce5c2018-11-27 12:52:16 +0100317 stats.delayed_packet_outage_samples = ns.delayedPacketOutageSamples;
Jakob Ivarsson232b3fd2019-03-06 09:18:40 +0100318 stats.relative_packet_arrival_delay_seconds =
319 static_cast<double>(ns.relativePacketArrivalDelayMs) /
320 static_cast<double>(rtc::kNumMillisecsPerSec);
Henrik Lundin44125fa2019-04-29 17:00:46 +0200321 stats.interruption_count = ns.interruptionCount;
322 stats.total_interruption_duration_ms = ns.totalInterruptionDurationMs;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200323
Niels Möller349ade32018-11-16 09:50:42 +0100324 auto ds = channel_receive_->GetDecodingCallStatistics();
solenberg8b85de22015-11-16 09:48:04 -0800325 stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;
326 stats.decoding_calls_to_neteq = ds.calls_to_neteq;
327 stats.decoding_normal = ds.decoded_normal;
Alex Narest5b5d97c2019-08-07 18:15:08 +0200328 stats.decoding_plc = ds.decoded_neteq_plc;
329 stats.decoding_codec_plc = ds.decoded_codec_plc;
solenberg8b85de22015-11-16 09:48:04 -0800330 stats.decoding_cng = ds.decoded_cng;
331 stats.decoding_plc_cng = ds.decoded_plc_cng;
henrik.lundin63489782016-09-20 01:47:12 -0700332 stats.decoding_muted_output = ds.decoded_muted_output;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200333
Alessio Bazzicaf7b1b952021-03-23 17:23:04 +0100334 stats.last_sender_report_timestamp_ms =
335 call_stats.last_sender_report_timestamp_ms;
336 stats.last_sender_report_remote_timestamp_ms =
337 call_stats.last_sender_report_remote_timestamp_ms;
338 stats.sender_reports_packets_sent = call_stats.sender_reports_packets_sent;
339 stats.sender_reports_bytes_sent = call_stats.sender_reports_bytes_sent;
340 stats.sender_reports_reports_count = call_stats.sender_reports_reports_count;
Ivo Creusen2562cf02021-09-03 14:51:22 +0000341 stats.round_trip_time = call_stats.round_trip_time;
342 stats.round_trip_time_measurements = call_stats.round_trip_time_measurements;
343 stats.total_round_trip_time = call_stats.total_round_trip_time;
Alessio Bazzicaf7b1b952021-03-23 17:23:04 +0100344
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200345 return stats;
Fredrik Solenberg04f49312015-06-08 13:04:56 +0200346}
347
Tommidddbbeb2022-05-20 15:21:33 +0200348void AudioReceiveStreamImpl::SetSink(AudioSinkInterface* sink) {
solenberg3ebbcb52017-01-31 03:58:40 -0800349 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100350 channel_receive_->SetSink(sink);
Tommif888bb52015-12-12 01:37:01 +0100351}
352
Tommidddbbeb2022-05-20 15:21:33 +0200353void AudioReceiveStreamImpl::SetGain(float gain) {
solenberg3ebbcb52017-01-31 03:58:40 -0800354 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100355 channel_receive_->SetChannelOutputVolumeScaling(gain);
solenberg217fb662016-06-17 08:30:54 -0700356}
357
Tommidddbbeb2022-05-20 15:21:33 +0200358bool AudioReceiveStreamImpl::SetBaseMinimumPlayoutDelayMs(int delay_ms) {
Ruslan Burakov3b50f9f2019-02-06 09:45:56 +0100359 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
360 return channel_receive_->SetBaseMinimumPlayoutDelayMs(delay_ms);
361}
362
Tommidddbbeb2022-05-20 15:21:33 +0200363int AudioReceiveStreamImpl::GetBaseMinimumPlayoutDelayMs() const {
Ruslan Burakov3b50f9f2019-02-06 09:45:56 +0100364 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
365 return channel_receive_->GetBaseMinimumPlayoutDelayMs();
366}
367
Tommidddbbeb2022-05-20 15:21:33 +0200368std::vector<RtpSource> AudioReceiveStreamImpl::GetSources() const {
hbos8d609f62017-04-10 07:39:05 -0700369 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Chen Xing054e3bb2019-08-02 10:29:26 +0000370 return source_tracker_.GetSources();
hbos8d609f62017-04-10 07:39:05 -0700371}
372
Tommidddbbeb2022-05-20 15:21:33 +0200373AudioMixer::Source::AudioFrameInfo
374AudioReceiveStreamImpl::GetAudioFrameWithInfo(int sample_rate_hz,
375 AudioFrame* audio_frame) {
Chen Xing054e3bb2019-08-02 10:29:26 +0000376 AudioMixer::Source::AudioFrameInfo audio_frame_info =
377 channel_receive_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame);
378 if (audio_frame_info != AudioMixer::Source::AudioFrameInfo::kError) {
379 source_tracker_.OnFrameDelivered(audio_frame->packet_infos_);
380 }
381 return audio_frame_info;
solenberg3ebbcb52017-01-31 03:58:40 -0800382}
383
Tommidddbbeb2022-05-20 15:21:33 +0200384int AudioReceiveStreamImpl::Ssrc() const {
Tommicc50b042022-05-09 10:22:48 +0000385 return remote_ssrc();
solenberg3ebbcb52017-01-31 03:58:40 -0800386}
387
Tommidddbbeb2022-05-20 15:21:33 +0200388int AudioReceiveStreamImpl::PreferredSampleRate() const {
Niels Möller349ade32018-11-16 09:50:42 +0100389 return channel_receive_->PreferredSampleRate();
solenberg3ebbcb52017-01-31 03:58:40 -0800390}
391
Tommidddbbeb2022-05-20 15:21:33 +0200392uint32_t AudioReceiveStreamImpl::id() const {
solenberg3ebbcb52017-01-31 03:58:40 -0800393 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Tommicc50b042022-05-09 10:22:48 +0000394 return remote_ssrc();
solenberg3ebbcb52017-01-31 03:58:40 -0800395}
396
Tommidddbbeb2022-05-20 15:21:33 +0200397absl::optional<Syncable::Info> AudioReceiveStreamImpl::GetInfo() const {
Tomas Gunnarsson0f030fd2021-04-01 20:12:04 +0200398 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
399 // expect to be called on the network thread.
400 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
401 return channel_receive_->GetSyncInfo();
solenberg3ebbcb52017-01-31 03:58:40 -0800402}
403
Tommidddbbeb2022-05-20 15:21:33 +0200404bool AudioReceiveStreamImpl::GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp,
405 int64_t* time_ms) const {
solenberg3ebbcb52017-01-31 03:58:40 -0800406 // Called on video capture thread.
Åsa Perssonfcf79cc2019-10-22 15:23:44 +0200407 return channel_receive_->GetPlayoutRtpTimestamp(rtp_timestamp, time_ms);
408}
409
Tommidddbbeb2022-05-20 15:21:33 +0200410void AudioReceiveStreamImpl::SetEstimatedPlayoutNtpTimestampMs(
Åsa Perssonfcf79cc2019-10-22 15:23:44 +0200411 int64_t ntp_timestamp_ms,
412 int64_t time_ms) {
413 // Called on video capture thread.
414 channel_receive_->SetEstimatedPlayoutNtpTimestampMs(ntp_timestamp_ms,
415 time_ms);
solenberg3ebbcb52017-01-31 03:58:40 -0800416}
417
Tommidddbbeb2022-05-20 15:21:33 +0200418bool AudioReceiveStreamImpl::SetMinimumPlayoutDelay(int delay_ms) {
Tomas Gunnarsson0f030fd2021-04-01 20:12:04 +0200419 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
420 // expect to be called on the network thread.
421 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100422 return channel_receive_->SetMinimumPlayoutDelay(delay_ms);
pbosa2f30de2015-10-15 05:22:13 -0700423}
424
Tommidddbbeb2022-05-20 15:21:33 +0200425void AudioReceiveStreamImpl::AssociateSendStream(
426 internal::AudioSendStream* send_stream) {
Tommi90738dd2021-05-31 17:36:47 +0200427 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100428 channel_receive_->SetAssociatedSendChannel(
429 send_stream ? send_stream->GetChannel() : nullptr);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100430 associated_send_stream_ = send_stream;
solenberg7602aab2016-11-14 11:30:07 -0800431}
432
Tommidddbbeb2022-05-20 15:21:33 +0200433void AudioReceiveStreamImpl::DeliverRtcp(const uint8_t* packet, size_t length) {
pbos1ba8d392016-05-01 20:18:34 -0700434 // TODO(solenberg): Tests call this function on a network thread, libjingle
435 // calls on the worker thread. We should move towards always using a network
436 // thread. Then this check can be enabled.
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200437 // RTC_DCHECK(!thread_checker_.IsCurrent());
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100438 channel_receive_->ReceivedRTCPPacket(packet, length);
pbos1ba8d392016-05-01 20:18:34 -0700439}
440
Tommidddbbeb2022-05-20 15:21:33 +0200441void AudioReceiveStreamImpl::SetSyncGroup(absl::string_view sync_group) {
Tommi55107c82021-06-16 16:31:18 +0200442 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Ali Tofigh4d278e22022-03-01 10:32:20 +0100443 config_.sync_group = std::string(sync_group);
Tommi55107c82021-06-16 16:31:18 +0200444}
445
Tommidddbbeb2022-05-20 15:21:33 +0200446void AudioReceiveStreamImpl::SetLocalSsrc(uint32_t local_ssrc) {
Tommi08be9ba2021-06-15 23:01:57 +0200447 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
448 // TODO(tommi): Consider storing local_ssrc in one place.
449 config_.rtp.local_ssrc = local_ssrc;
450 channel_receive_->OnLocalSsrcChange(local_ssrc);
451}
452
Tommidddbbeb2022-05-20 15:21:33 +0200453uint32_t AudioReceiveStreamImpl::local_ssrc() const {
Tommi08be9ba2021-06-15 23:01:57 +0200454 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
455 RTC_DCHECK_EQ(config_.rtp.local_ssrc, channel_receive_->GetLocalSsrc());
456 return config_.rtp.local_ssrc;
457}
458
Tommidddbbeb2022-05-20 15:21:33 +0200459const std::string& AudioReceiveStreamImpl::sync_group() const {
Tommicc50b042022-05-09 10:22:48 +0000460 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
461 return config_.sync_group;
aleloi04c07222016-11-22 06:42:53 -0800462}
463
Tommidddbbeb2022-05-20 15:21:33 +0200464const AudioSendStream*
465AudioReceiveStreamImpl::GetAssociatedSendStreamForTesting() const {
Tommi90738dd2021-05-31 17:36:47 +0200466 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100467 return associated_send_stream_;
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200468}
aleloi04c07222016-11-22 06:42:53 -0800469
Tommidddbbeb2022-05-20 15:21:33 +0200470internal::AudioState* AudioReceiveStreamImpl::audio_state() const {
solenberg3ebbcb52017-01-31 03:58:40 -0800471 auto* audio_state = static_cast<internal::AudioState*>(audio_state_.get());
472 RTC_DCHECK(audio_state);
473 return audio_state;
474}
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200475} // namespace webrtc