blob: 0bb11683845571dcde772886f3a8320d36236ef4 [file] [log] [blame]
Fredrik Solenberg23fba1f2015-04-29 13:24:011/*
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 04:47:3111#include "audio/audio_receive_stream.h"
Fredrik Solenberg23fba1f2015-04-29 13:24:0112
13#include <string>
Tommif888bb52015-12-12 00:37:0114#include <utility>
Fredrik Solenberg23fba1f2015-04-29 13:24:0115
Yves Gerey988cc082018-10-23 10:03:0116#include "absl/memory/memory.h"
17#include "api/array_view.h"
18#include "api/audio_codecs/audio_format.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3119#include "api/call/audio_sink.h"
Steve Anton10542f22019-01-11 17:11:0020#include "api/rtp_parameters.h"
Markus Handellacd16af2021-05-29 11:21:2821#include "api/sequence_checker.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "audio/audio_send_stream.h"
23#include "audio/audio_state.h"
Yves Gerey988cc082018-10-23 10:03:0124#include "audio/channel_receive.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3125#include "audio/conversion.h"
Yves Gerey988cc082018-10-23 10:03:0126#include "call/rtp_config.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3127#include "call/rtp_stream_receiver_controller_interface.h"
Ranveer Aggarwaldea374a2021-01-23 06:57:1928#include "modules/rtp_rtcp/source/rtp_packet_received.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3129#include "rtc_base/checks.h"
30#include "rtc_base/logging.h"
Tommifef05002018-02-27 12:51:0831#include "rtc_base/strings/string_builder.h"
Steve Anton10542f22019-01-11 17:11:0032#include "rtc_base/time_utils.h"
Fredrik Solenberg23fba1f2015-04-29 13:24:0133
34namespace webrtc {
Stefan Holmer3842c5c2016-01-12 12:55:0035
Tommi3176ef72022-05-22 18:47:2836std::string AudioReceiveStreamInterface::Config::Rtp::ToString() const {
Karl Wiberg881f1682018-03-08 14:03:2337 char ss_buf[1024];
38 rtc::SimpleStringBuilder ss(ss_buf);
Fredrik Solenberg23fba1f2015-04-29 13:24:0139 ss << "{remote_ssrc: " << remote_ssrc;
solenberg85a04962015-10-27 10:35:2140 ss << ", local_ssrc: " << local_ssrc;
solenberg8189b022016-06-14 19:13:0041 ss << ", nack: " << nack.ToString();
Fredrik Solenberg23fba1f2015-04-29 13:24:0142 ss << ", extensions: [";
43 for (size_t i = 0; i < extensions.size(); ++i) {
44 ss << extensions[i].ToString();
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2745 if (i != extensions.size() - 1) {
Fredrik Solenberg23fba1f2015-04-29 13:24:0146 ss << ", ";
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2747 }
Fredrik Solenberg23fba1f2015-04-29 13:24:0148 }
49 ss << ']';
50 ss << '}';
51 return ss.str();
52}
53
Tommi3176ef72022-05-22 18:47:2854std::string AudioReceiveStreamInterface::Config::ToString() const {
Karl Wiberg881f1682018-03-08 14:03:2355 char ss_buf[1024];
56 rtc::SimpleStringBuilder ss(ss_buf);
Fredrik Solenberg23fba1f2015-04-29 13:24:0157 ss << "{rtp: " << rtp.ToString();
solenberg85a04962015-10-27 10:35:2158 ss << ", rtcp_send_transport: "
deadbeef922246a2017-02-26 12:18:1259 << (rtcp_send_transport ? "(Transport)" : "null");
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2760 if (!sync_group.empty()) {
pbos8fc7fa72015-07-15 15:02:5861 ss << ", sync_group: " << sync_group;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2762 }
Fredrik Solenberg23fba1f2015-04-29 13:24:0163 ss << '}';
64 return ss.str();
65}
66
Fredrik Solenberg8f5787a2018-01-11 12:52:3067namespace {
Niels Möller349ade32018-11-16 08:50:4268std::unique_ptr<voe::ChannelReceiveInterface> CreateChannelReceive(
Sebastian Jansson977b3352019-03-04 16:43:3469 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 12:52:3070 webrtc::AudioState* audio_state,
Ivo Creusenc3d1f9b2019-11-01 10:47:5171 NetEqFactory* neteq_factory,
Tommi3176ef72022-05-22 18:47:2872 const webrtc::AudioReceiveStreamInterface::Config& config,
Niels Möllerfa4e1852018-08-14 07:43:3473 RtcEventLog* event_log) {
Fredrik Solenberg8f5787a2018-01-11 12:52:3074 RTC_DCHECK(audio_state);
75 internal::AudioState* internal_audio_state =
76 static_cast<internal::AudioState*>(audio_state);
Niels Möller349ade32018-11-16 08:50:4277 return voe::CreateChannelReceive(
Markus Handelleb61b7f2021-06-22 08:46:4878 clock, neteq_factory, internal_audio_state->audio_device_module(),
79 config.rtcp_send_transport, event_log, config.rtp.local_ssrc,
80 config.rtp.remote_ssrc, config.jitter_buffer_max_packets,
81 config.jitter_buffer_fast_accelerate, config.jitter_buffer_min_delay_ms,
Tommi1def8992022-05-20 14:17:4982 config.enable_non_sender_rtt, config.decoder_factory,
83 config.codec_pair_id, std::move(config.frame_decryptor),
84 config.crypto_options, std::move(config.frame_transformer));
Fredrik Solenberg8f5787a2018-01-11 12:52:3085}
86} // namespace
87
Tommidddbbeb2022-05-20 13:21:3388AudioReceiveStreamImpl::AudioReceiveStreamImpl(
Sebastian Jansson977b3352019-03-04 16:43:3489 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 12:52:3090 PacketRouter* packet_router,
Ivo Creusenc3d1f9b2019-11-01 10:47:5191 NetEqFactory* neteq_factory,
Tommi3176ef72022-05-22 18:47:2892 const webrtc::AudioReceiveStreamInterface::Config& config,
Fredrik Solenberg8f5787a2018-01-11 12:52:3093 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
94 webrtc::RtcEventLog* event_log)
Tommidddbbeb2022-05-20 13:21:3395 : AudioReceiveStreamImpl(clock,
96 packet_router,
97 config,
98 audio_state,
99 event_log,
100 CreateChannelReceive(clock,
101 audio_state.get(),
102 neteq_factory,
103 config,
104 event_log)) {}
Fredrik Solenberg8f5787a2018-01-11 12:52:30105
Tommidddbbeb2022-05-20 13:21:33106AudioReceiveStreamImpl::AudioReceiveStreamImpl(
Sebastian Jansson977b3352019-03-04 16:43:34107 Clock* clock,
nisse0245da02016-11-30 11:35:20108 PacketRouter* packet_router,
Tommi3176ef72022-05-22 18:47:28109 const webrtc::AudioReceiveStreamInterface::Config& config,
ivoc14d5dbe2016-07-04 14:06:55110 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
Fredrik Solenberg8f5787a2018-01-11 12:52:30111 webrtc::RtcEventLog* event_log,
Niels Möller349ade32018-11-16 08:50:42112 std::unique_ptr<voe::ChannelReceiveInterface> channel_receive)
Markus Handellacd16af2021-05-29 11:21:28113 : config_(config),
114 audio_state_(audio_state),
Ranveer Aggarwaldea374a2021-01-23 06:57:19115 source_tracker_(clock),
116 channel_receive_(std::move(channel_receive)) {
Tommidddbbeb2022-05-20 13:21:33117 RTC_LOG(LS_INFO) << "AudioReceiveStreamImpl: " << config.rtp.remote_ssrc;
Fredrik Solenberg8f5787a2018-01-11 12:52:30118 RTC_DCHECK(config.decoder_factory);
Niels Möllerae4237e2018-10-05 09:28:38119 RTC_DCHECK(config.rtcp_send_transport);
Fredrik Solenberg8f5787a2018-01-11 12:52:30120 RTC_DCHECK(audio_state_);
Niels Möller349ade32018-11-16 08:50:42121 RTC_DCHECK(channel_receive_);
solenberg7add0582015-11-20 17:59:34122
Tommi90738dd2021-05-31 15:36:47123 packet_sequence_checker_.Detach();
Tommi02df2eb2021-05-31 10:57:53124
Bjorn A Mellem7a9a0922019-11-26 17:19:40125 RTC_DCHECK(packet_router);
126 // Configure bandwidth estimation.
127 channel_receive_->RegisterReceiverCongestionControlObjects(packet_router);
nisse0f15f922017-06-21 08:05:22128
Ranveer Aggarwaldea374a2021-01-23 06:57:19129 // When output is muted, ChannelReceive will directly notify the source
130 // tracker of "delivered" frames, so RtpReceiver information will continue to
131 // be updated.
132 channel_receive_->SetSourceTracker(&source_tracker_);
133
Markus Handellacd16af2021-05-29 11:21:28134 // Complete configuration.
135 // TODO(solenberg): Config NACK history window (which is a packet count),
136 // using the actual packet size for the configured codec.
137 channel_receive_->SetNACKStatus(config.rtp.nack.rtp_history_ms != 0,
138 config.rtp.nack.rtp_history_ms / 20);
139 channel_receive_->SetReceiveCodecs(config.decoder_map);
Tommi6eda26c2021-06-09 11:46:28140 // `frame_transformer` and `frame_decryptor` have been given to
141 // `channel_receive_` already.
Fredrik Solenberg23fba1f2015-04-29 13:24:01142}
143
Tommidddbbeb2022-05-20 13:21:33144AudioReceiveStreamImpl::~AudioReceiveStreamImpl() {
solenberg3ebbcb52017-01-31 11:58:40145 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Tommidddbbeb2022-05-20 13:21:33146 RTC_LOG(LS_INFO) << "~AudioReceiveStreamImpl: " << remote_ssrc();
Fredrik Solenbergd5247512017-12-18 21:41:03147 Stop();
Niels Möller349ade32018-11-16 08:50:42148 channel_receive_->SetAssociatedSendChannel(nullptr);
Bjorn A Mellem7a9a0922019-11-26 17:19:40149 channel_receive_->ResetReceiverCongestionControlObjects();
pbosa2f30de2015-10-15 12:22:13150}
151
Tommidddbbeb2022-05-20 13:21:33152void AudioReceiveStreamImpl::RegisterWithTransport(
Tommi02df2eb2021-05-31 10:57:53153 RtpStreamReceiverControllerInterface* receiver_controller) {
Tommi90738dd2021-05-31 15:36:47154 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Tommi02df2eb2021-05-31 10:57:53155 RTC_DCHECK(!rtp_stream_receiver_);
156 rtp_stream_receiver_ = receiver_controller->CreateReceiver(
Tommicc50b042022-05-09 10:22:48157 remote_ssrc(), channel_receive_.get());
Tommi02df2eb2021-05-31 10:57:53158}
159
Tommidddbbeb2022-05-20 13:21:33160void AudioReceiveStreamImpl::UnregisterFromTransport() {
Tommi90738dd2021-05-31 15:36:47161 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Tommi02df2eb2021-05-31 10:57:53162 rtp_stream_receiver_.reset();
163}
164
Tommidddbbeb2022-05-20 13:21:33165void AudioReceiveStreamImpl::ReconfigureForTesting(
Tommi3176ef72022-05-22 18:47:28166 const webrtc::AudioReceiveStreamInterface::Config& config) {
Tommi6eda26c2021-06-09 11:46:28167 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Andrey Logvin8a18e5b2021-06-09 10:15:47168
169 // SSRC can't be changed mid-stream.
Tommicc50b042022-05-09 10:22:48170 RTC_DCHECK_EQ(remote_ssrc(), config.rtp.remote_ssrc);
171 RTC_DCHECK_EQ(local_ssrc(), config.rtp.local_ssrc);
Tommi6eda26c2021-06-09 11:46:28172
173 // Configuration parameters which cannot be changed.
174 RTC_DCHECK_EQ(config_.rtcp_send_transport, config.rtcp_send_transport);
175 // Decoder factory cannot be changed because it is configured at
176 // voe::Channel construction time.
177 RTC_DCHECK_EQ(config_.decoder_factory, config.decoder_factory);
Markus Handellacd16af2021-05-29 11:21:28178
179 // TODO(solenberg): Config NACK history window (which is a packet count),
180 // using the actual packet size for the configured codec.
Tommi6eda26c2021-06-09 11:46:28181 RTC_DCHECK_EQ(config_.rtp.nack.rtp_history_ms, config.rtp.nack.rtp_history_ms)
182 << "Use SetUseTransportCcAndNackHistory";
Markus Handellacd16af2021-05-29 11:21:28183
Tommi6eda26c2021-06-09 11:46:28184 RTC_DCHECK(config_.decoder_map == config.decoder_map) << "Use SetDecoderMap";
185 RTC_DCHECK_EQ(config_.frame_transformer, config.frame_transformer)
186 << "Use SetDepacketizerToDecoderFrameTransformer";
Markus Handellacd16af2021-05-29 11:21:28187
188 config_ = config;
Fredrik Solenberg3b903d02018-01-10 14:17:10189}
190
Tommidddbbeb2022-05-20 13:21:33191void AudioReceiveStreamImpl::Start() {
solenberg3ebbcb52017-01-31 11:58:40192 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
aleloi04c07222016-11-22 14:42:53193 if (playing_) {
194 return;
195 }
Niels Möller349ade32018-11-16 08:50:42196 channel_receive_->StartPlayout();
aleloi04c07222016-11-22 14:42:53197 playing_ = true;
Fredrik Solenbergd5247512017-12-18 21:41:03198 audio_state()->AddReceivingStream(this);
solenberg7add0582015-11-20 17:59:34199}
200
Tommidddbbeb2022-05-20 13:21:33201void AudioReceiveStreamImpl::Stop() {
solenberg3ebbcb52017-01-31 11:58:40202 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
aleloi04c07222016-11-22 14:42:53203 if (!playing_) {
204 return;
205 }
Niels Möller349ade32018-11-16 08:50:42206 channel_receive_->StopPlayout();
aleloi04c07222016-11-22 14:42:53207 playing_ = false;
Fredrik Solenbergd5247512017-12-18 21:41:03208 audio_state()->RemoveReceivingStream(this);
solenberg7add0582015-11-20 17:59:34209}
210
Tommidddbbeb2022-05-20 13:21:33211bool AudioReceiveStreamImpl::IsRunning() const {
Tomas Gunnarsson8467cf22021-01-17 13:36:44212 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
213 return playing_;
214}
215
Tommidddbbeb2022-05-20 13:21:33216void AudioReceiveStreamImpl::SetDepacketizerToDecoderFrameTransformer(
Tommi6eda26c2021-06-09 11:46:28217 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
218 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
219 channel_receive_->SetDepacketizerToDecoderFrameTransformer(
220 std::move(frame_transformer));
221}
222
Tommidddbbeb2022-05-20 13:21:33223void AudioReceiveStreamImpl::SetDecoderMap(
Tommi6eda26c2021-06-09 11:46:28224 std::map<int, SdpAudioFormat> decoder_map) {
225 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
226 config_.decoder_map = std::move(decoder_map);
227 channel_receive_->SetReceiveCodecs(config_.decoder_map);
228}
229
Tommia136ed42022-05-30 13:08:13230void AudioReceiveStreamImpl::SetNackHistory(int history_ms) {
Tommi6eda26c2021-06-09 11:46:28231 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
232 RTC_DCHECK_GE(history_ms, 0);
Tommia136ed42022-05-30 13:08:13233
234 if (config_.rtp.nack.rtp_history_ms == history_ms)
235 return;
236
237 config_.rtp.nack.rtp_history_ms = history_ms;
238 // TODO(solenberg): Config NACK history window (which is a packet count),
239 // using the actual packet size for the configured codec.
240 channel_receive_->SetNACKStatus(history_ms != 0, history_ms / 20);
Tommi6eda26c2021-06-09 11:46:28241}
242
Tommidddbbeb2022-05-20 13:21:33243void AudioReceiveStreamImpl::SetNonSenderRttMeasurement(bool enabled) {
Ivo Creusen2562cf02021-09-03 14:51:22244 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
245 config_.enable_non_sender_rtt = enabled;
246 channel_receive_->SetNonSenderRttMeasurement(enabled);
247}
248
Tommidddbbeb2022-05-20 13:21:33249void AudioReceiveStreamImpl::SetFrameDecryptor(
Tommie0972822021-06-14 06:11:10250 rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
251 // TODO(bugs.webrtc.org/11993): This is called via WebRtcAudioReceiveStream,
252 // expect to be called on the network thread.
253 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
254 channel_receive_->SetFrameDecryptor(std::move(frame_decryptor));
255}
256
Tommidddbbeb2022-05-20 13:21:33257void AudioReceiveStreamImpl::SetRtpExtensions(
Tommi3008bcd2021-06-14 18:00:04258 std::vector<RtpExtension> extensions) {
259 // TODO(bugs.webrtc.org/11993): This is called via WebRtcAudioReceiveStream,
260 // expect to be called on the network thread.
261 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
262 config_.rtp.extensions = std::move(extensions);
263}
264
Tommidddbbeb2022-05-20 13:21:33265RtpHeaderExtensionMap AudioReceiveStreamImpl::GetRtpExtensionMap() const {
Tommicf4ed152022-05-09 20:46:57266 return RtpHeaderExtensionMap(config_.rtp.extensions);
267}
268
Tommi3176ef72022-05-22 18:47:28269webrtc::AudioReceiveStreamInterface::Stats AudioReceiveStreamImpl::GetStats(
Niels Möller6b4d9622020-09-14 08:47:50270 bool get_and_clear_legacy_stats) const {
solenberg3ebbcb52017-01-31 11:58:40271 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Tommi3176ef72022-05-22 18:47:28272 webrtc::AudioReceiveStreamInterface::Stats stats;
Tommicc50b042022-05-09 10:22:48273 stats.remote_ssrc = remote_ssrc();
solenberg8b85de22015-11-16 17:48:04274
Niels Möller530ead42018-10-04 12:28:39275 webrtc::CallReceiveStatistics call_stats =
Niels Möller349ade32018-11-16 08:50:42276 channel_receive_->GetRTCPStatistics();
solenbergbd9a77f2017-02-06 20:53:57277 // TODO(solenberg): Don't return here if we can't get the codec - return the
278 // stats we *can* get.
Fredrik Solenbergf693bfa2018-12-11 11:22:10279 auto receive_codec = channel_receive_->GetReceiveCodec();
280 if (!receive_codec) {
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27281 return stats;
282 }
283
Niels Möllerac0a4cb2019-10-09 13:01:33284 stats.payload_bytes_rcvd = call_stats.payload_bytes_rcvd;
285 stats.header_and_padding_bytes_rcvd =
286 call_stats.header_and_padding_bytes_rcvd;
solenberg85a04962015-10-27 10:35:21287 stats.packets_rcvd = call_stats.packetsReceived;
288 stats.packets_lost = call_stats.cumulativeLost;
Jakob Ivarssone54914a2021-07-01 09:16:05289 stats.nacks_sent = call_stats.nacks_sent;
solenberg8b85de22015-11-16 17:48:04290 stats.capture_start_ntp_time_ms = call_stats.capture_start_ntp_time_ms_;
Henrik Boström01738c62019-04-15 15:32:00291 stats.last_packet_received_timestamp_ms =
292 call_stats.last_packet_received_timestamp_ms;
Fredrik Solenbergf693bfa2018-12-11 11:22:10293 stats.codec_name = receive_codec->second.name;
294 stats.codec_payload_type = receive_codec->first;
Fredrik Solenbergf693bfa2018-12-11 11:22:10295 int clockrate_khz = receive_codec->second.clockrate_hz / 1000;
296 if (clockrate_khz > 0) {
297 stats.jitter_ms = call_stats.jitterSamples / clockrate_khz;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27298 }
Niels Möller349ade32018-11-16 08:50:42299 stats.delay_estimate_ms = channel_receive_->GetDelayEstimate();
300 stats.audio_level = channel_receive_->GetSpeechOutputLevelFullRange();
301 stats.total_output_energy = channel_receive_->GetTotalOutputEnergy();
302 stats.total_output_duration = channel_receive_->GetTotalOutputDuration();
Åsa Perssonfcf79cc2019-10-22 13:23:44303 stats.estimated_playout_ntp_timestamp_ms =
304 channel_receive_->GetCurrentEstimatedPlayoutNtpTimestampMs(
305 rtc::TimeMillis());
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27306
solenberg8b85de22015-11-16 17:48:04307 // Get jitter buffer and total delay (alg + jitter + playout) stats.
Niels Möller6b4d9622020-09-14 08:47:50308 auto ns = channel_receive_->GetNetworkStatistics(get_and_clear_legacy_stats);
Minyue Li28a2c632021-07-07 13:53:38309 stats.packets_discarded = ns.packetsDiscarded;
Ivo Creusen8d8ffdb2019-04-30 07:45:21310 stats.fec_packets_received = ns.fecPacketsReceived;
311 stats.fec_packets_discarded = ns.fecPacketsDiscarded;
solenberg8b85de22015-11-16 17:48:04312 stats.jitter_buffer_ms = ns.currentBufferSize;
313 stats.jitter_buffer_preferred_ms = ns.preferredBufferSize;
Steve Anton2dbc69f2017-08-25 00:15:13314 stats.total_samples_received = ns.totalSamplesReceived;
315 stats.concealed_samples = ns.concealedSamples;
Ivo Creusen8d8ffdb2019-04-30 07:45:21316 stats.silent_concealed_samples = ns.silentConcealedSamples;
Gustaf Ullberg9a2e9062017-09-18 07:28:20317 stats.concealment_events = ns.concealmentEvents;
Gustaf Ullbergb0a02072017-10-02 10:00:34318 stats.jitter_buffer_delay_seconds =
319 static_cast<double>(ns.jitterBufferDelayMs) /
320 static_cast<double>(rtc::kNumMillisecsPerSec);
Chen Xing0acffb52019-01-15 14:46:29321 stats.jitter_buffer_emitted_count = ns.jitterBufferEmittedCount;
Artem Titove618cc92020-03-11 10:18:54322 stats.jitter_buffer_target_delay_seconds =
323 static_cast<double>(ns.jitterBufferTargetDelayMs) /
324 static_cast<double>(rtc::kNumMillisecsPerSec);
Ivo Creusen1a84b562022-07-19 14:33:10325 stats.jitter_buffer_minimum_delay_seconds =
326 static_cast<double>(ns.jitterBufferMinimumDelayMs) /
327 static_cast<double>(rtc::kNumMillisecsPerSec);
Ivo Creusen8d8ffdb2019-04-30 07:45:21328 stats.inserted_samples_for_deceleration = ns.insertedSamplesForDeceleration;
329 stats.removed_samples_for_acceleration = ns.removedSamplesForAcceleration;
solenberg8b85de22015-11-16 17:48:04330 stats.expand_rate = Q14ToFloat(ns.currentExpandRate);
331 stats.speech_expand_rate = Q14ToFloat(ns.currentSpeechExpandRate);
332 stats.secondary_decoded_rate = Q14ToFloat(ns.currentSecondaryDecodedRate);
minyue-webrtc0e320ec2017-08-28 11:51:27333 stats.secondary_discarded_rate = Q14ToFloat(ns.currentSecondaryDiscardedRate);
solenberg8b85de22015-11-16 17:48:04334 stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
335 stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
Ruslan Burakov8af88962018-11-22 16:21:10336 stats.jitter_buffer_flushes = ns.packetBufferFlushes;
Jakob Ivarsson352ce5c2018-11-27 11:52:16337 stats.delayed_packet_outage_samples = ns.delayedPacketOutageSamples;
Jakob Ivarsson232b3fd2019-03-06 08:18:40338 stats.relative_packet_arrival_delay_seconds =
339 static_cast<double>(ns.relativePacketArrivalDelayMs) /
340 static_cast<double>(rtc::kNumMillisecsPerSec);
Henrik Lundin44125fa2019-04-29 15:00:46341 stats.interruption_count = ns.interruptionCount;
342 stats.total_interruption_duration_ms = ns.totalInterruptionDurationMs;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27343
Niels Möller349ade32018-11-16 08:50:42344 auto ds = channel_receive_->GetDecodingCallStatistics();
solenberg8b85de22015-11-16 17:48:04345 stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;
346 stats.decoding_calls_to_neteq = ds.calls_to_neteq;
347 stats.decoding_normal = ds.decoded_normal;
Alex Narest5b5d97c2019-08-07 16:15:08348 stats.decoding_plc = ds.decoded_neteq_plc;
349 stats.decoding_codec_plc = ds.decoded_codec_plc;
solenberg8b85de22015-11-16 17:48:04350 stats.decoding_cng = ds.decoded_cng;
351 stats.decoding_plc_cng = ds.decoded_plc_cng;
henrik.lundin63489782016-09-20 08:47:12352 stats.decoding_muted_output = ds.decoded_muted_output;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27353
Alessio Bazzicaf7b1b952021-03-23 16:23:04354 stats.last_sender_report_timestamp_ms =
355 call_stats.last_sender_report_timestamp_ms;
356 stats.last_sender_report_remote_timestamp_ms =
357 call_stats.last_sender_report_remote_timestamp_ms;
358 stats.sender_reports_packets_sent = call_stats.sender_reports_packets_sent;
359 stats.sender_reports_bytes_sent = call_stats.sender_reports_bytes_sent;
360 stats.sender_reports_reports_count = call_stats.sender_reports_reports_count;
Ivo Creusen2562cf02021-09-03 14:51:22361 stats.round_trip_time = call_stats.round_trip_time;
362 stats.round_trip_time_measurements = call_stats.round_trip_time_measurements;
363 stats.total_round_trip_time = call_stats.total_round_trip_time;
Alessio Bazzicaf7b1b952021-03-23 16:23:04364
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27365 return stats;
Fredrik Solenberg04f49312015-06-08 11:04:56366}
367
Tommidddbbeb2022-05-20 13:21:33368void AudioReceiveStreamImpl::SetSink(AudioSinkInterface* sink) {
solenberg3ebbcb52017-01-31 11:58:40369 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 08:50:42370 channel_receive_->SetSink(sink);
Tommif888bb52015-12-12 00:37:01371}
372
Tommidddbbeb2022-05-20 13:21:33373void AudioReceiveStreamImpl::SetGain(float gain) {
solenberg3ebbcb52017-01-31 11:58:40374 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 08:50:42375 channel_receive_->SetChannelOutputVolumeScaling(gain);
solenberg217fb662016-06-17 15:30:54376}
377
Tommidddbbeb2022-05-20 13:21:33378bool AudioReceiveStreamImpl::SetBaseMinimumPlayoutDelayMs(int delay_ms) {
Ruslan Burakov3b50f9f2019-02-06 08:45:56379 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
380 return channel_receive_->SetBaseMinimumPlayoutDelayMs(delay_ms);
381}
382
Tommidddbbeb2022-05-20 13:21:33383int AudioReceiveStreamImpl::GetBaseMinimumPlayoutDelayMs() const {
Ruslan Burakov3b50f9f2019-02-06 08:45:56384 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
385 return channel_receive_->GetBaseMinimumPlayoutDelayMs();
386}
387
Tommidddbbeb2022-05-20 13:21:33388std::vector<RtpSource> AudioReceiveStreamImpl::GetSources() const {
hbos8d609f62017-04-10 14:39:05389 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Chen Xing054e3bb2019-08-02 10:29:26390 return source_tracker_.GetSources();
hbos8d609f62017-04-10 14:39:05391}
392
Tommidddbbeb2022-05-20 13:21:33393AudioMixer::Source::AudioFrameInfo
394AudioReceiveStreamImpl::GetAudioFrameWithInfo(int sample_rate_hz,
395 AudioFrame* audio_frame) {
Chen Xing054e3bb2019-08-02 10:29:26396 AudioMixer::Source::AudioFrameInfo audio_frame_info =
397 channel_receive_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame);
398 if (audio_frame_info != AudioMixer::Source::AudioFrameInfo::kError) {
399 source_tracker_.OnFrameDelivered(audio_frame->packet_infos_);
400 }
401 return audio_frame_info;
solenberg3ebbcb52017-01-31 11:58:40402}
403
Tommidddbbeb2022-05-20 13:21:33404int AudioReceiveStreamImpl::Ssrc() const {
Tommicc50b042022-05-09 10:22:48405 return remote_ssrc();
solenberg3ebbcb52017-01-31 11:58:40406}
407
Tommidddbbeb2022-05-20 13:21:33408int AudioReceiveStreamImpl::PreferredSampleRate() const {
Niels Möller349ade32018-11-16 08:50:42409 return channel_receive_->PreferredSampleRate();
solenberg3ebbcb52017-01-31 11:58:40410}
411
Tommidddbbeb2022-05-20 13:21:33412uint32_t AudioReceiveStreamImpl::id() const {
solenberg3ebbcb52017-01-31 11:58:40413 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Tommicc50b042022-05-09 10:22:48414 return remote_ssrc();
solenberg3ebbcb52017-01-31 11:58:40415}
416
Tommidddbbeb2022-05-20 13:21:33417absl::optional<Syncable::Info> AudioReceiveStreamImpl::GetInfo() const {
Tomas Gunnarsson0f030fd2021-04-01 18:12:04418 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
419 // expect to be called on the network thread.
420 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
421 return channel_receive_->GetSyncInfo();
solenberg3ebbcb52017-01-31 11:58:40422}
423
Tommidddbbeb2022-05-20 13:21:33424bool AudioReceiveStreamImpl::GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp,
425 int64_t* time_ms) const {
solenberg3ebbcb52017-01-31 11:58:40426 // Called on video capture thread.
Åsa Perssonfcf79cc2019-10-22 13:23:44427 return channel_receive_->GetPlayoutRtpTimestamp(rtp_timestamp, time_ms);
428}
429
Tommidddbbeb2022-05-20 13:21:33430void AudioReceiveStreamImpl::SetEstimatedPlayoutNtpTimestampMs(
Åsa Perssonfcf79cc2019-10-22 13:23:44431 int64_t ntp_timestamp_ms,
432 int64_t time_ms) {
433 // Called on video capture thread.
434 channel_receive_->SetEstimatedPlayoutNtpTimestampMs(ntp_timestamp_ms,
435 time_ms);
solenberg3ebbcb52017-01-31 11:58:40436}
437
Tommidddbbeb2022-05-20 13:21:33438bool AudioReceiveStreamImpl::SetMinimumPlayoutDelay(int delay_ms) {
Tomas Gunnarsson0f030fd2021-04-01 18:12:04439 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
440 // expect to be called on the network thread.
441 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 08:50:42442 return channel_receive_->SetMinimumPlayoutDelay(delay_ms);
pbosa2f30de2015-10-15 12:22:13443}
444
Tommidddbbeb2022-05-20 13:21:33445void AudioReceiveStreamImpl::AssociateSendStream(
446 internal::AudioSendStream* send_stream) {
Tommi90738dd2021-05-31 15:36:47447 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Niels Möller349ade32018-11-16 08:50:42448 channel_receive_->SetAssociatedSendChannel(
449 send_stream ? send_stream->GetChannel() : nullptr);
Fredrik Solenberg8f5787a2018-01-11 12:52:30450 associated_send_stream_ = send_stream;
solenberg7602aab2016-11-14 19:30:07451}
452
Tommidddbbeb2022-05-20 13:21:33453void AudioReceiveStreamImpl::DeliverRtcp(const uint8_t* packet, size_t length) {
pbos1ba8d392016-05-02 03:18:34454 // TODO(solenberg): Tests call this function on a network thread, libjingle
455 // calls on the worker thread. We should move towards always using a network
456 // thread. Then this check can be enabled.
Sebastian Janssonc01367d2019-04-08 13:20:44457 // RTC_DCHECK(!thread_checker_.IsCurrent());
Niels Möller8fb1a6a2019-03-05 13:29:42458 channel_receive_->ReceivedRTCPPacket(packet, length);
pbos1ba8d392016-05-02 03:18:34459}
460
Tommidddbbeb2022-05-20 13:21:33461void AudioReceiveStreamImpl::SetSyncGroup(absl::string_view sync_group) {
Tommi55107c82021-06-16 14:31:18462 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Ali Tofigh4d278e22022-03-01 09:32:20463 config_.sync_group = std::string(sync_group);
Tommi55107c82021-06-16 14:31:18464}
465
Tommidddbbeb2022-05-20 13:21:33466void AudioReceiveStreamImpl::SetLocalSsrc(uint32_t local_ssrc) {
Tommi08be9ba2021-06-15 21:01:57467 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
468 // TODO(tommi): Consider storing local_ssrc in one place.
469 config_.rtp.local_ssrc = local_ssrc;
470 channel_receive_->OnLocalSsrcChange(local_ssrc);
471}
472
Tommidddbbeb2022-05-20 13:21:33473uint32_t AudioReceiveStreamImpl::local_ssrc() const {
Tommi08be9ba2021-06-15 21:01:57474 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
475 RTC_DCHECK_EQ(config_.rtp.local_ssrc, channel_receive_->GetLocalSsrc());
476 return config_.rtp.local_ssrc;
477}
478
Tommidddbbeb2022-05-20 13:21:33479const std::string& AudioReceiveStreamImpl::sync_group() const {
Tommicc50b042022-05-09 10:22:48480 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
481 return config_.sync_group;
aleloi04c07222016-11-22 14:42:53482}
483
Tommidddbbeb2022-05-20 13:21:33484const AudioSendStream*
485AudioReceiveStreamImpl::GetAssociatedSendStreamForTesting() const {
Tommi90738dd2021-05-31 15:36:47486 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Fredrik Solenberg8f5787a2018-01-11 12:52:30487 return associated_send_stream_;
Fredrik Solenberg23fba1f2015-04-29 13:24:01488}
aleloi04c07222016-11-22 14:42:53489
Tommidddbbeb2022-05-20 13:21:33490internal::AudioState* AudioReceiveStreamImpl::audio_state() const {
solenberg3ebbcb52017-01-31 11:58:40491 auto* audio_state = static_cast<internal::AudioState*>(audio_state_.get());
492 RTC_DCHECK(audio_state);
493 return audio_state;
494}
Fredrik Solenberg23fba1f2015-04-29 13:24:01495} // namespace webrtc