blob: f3843812eec6d1c6cfd54aba15fe6574248514e5 [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
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020036std::string AudioReceiveStream::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 << ", transport_cc: " << (transport_cc ? "on" : "off");
42 ss << ", nack: " << nack.ToString();
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020043 ss << ", extensions: [";
44 for (size_t i = 0; i < extensions.size(); ++i) {
45 ss << extensions[i].ToString();
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020046 if (i != extensions.size() - 1) {
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020047 ss << ", ";
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020048 }
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020049 }
50 ss << ']';
51 ss << '}';
52 return ss.str();
53}
54
55std::string AudioReceiveStream::Config::ToString() const {
Karl Wiberg881f1682018-03-08 15:03:23 +010056 char ss_buf[1024];
57 rtc::SimpleStringBuilder ss(ss_buf);
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020058 ss << "{rtp: " << rtp.ToString();
solenberg85a04962015-10-27 03:35:21 -070059 ss << ", rtcp_send_transport: "
deadbeef922246a2017-02-26 04:18:12 -080060 << (rtcp_send_transport ? "(Transport)" : "null");
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020061 if (!sync_group.empty()) {
pbos8fc7fa72015-07-15 08:02:58 -070062 ss << ", sync_group: " << sync_group;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020063 }
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +020064 ss << '}';
65 return ss.str();
66}
67
68namespace internal {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010069namespace {
Niels Möller349ade32018-11-16 09:50:42 +010070std::unique_ptr<voe::ChannelReceiveInterface> CreateChannelReceive(
Sebastian Jansson977b3352019-03-04 17:43:34 +010071 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010072 webrtc::AudioState* audio_state,
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +010073 NetEqFactory* neteq_factory,
Niels Möllerfa4e1852018-08-14 09:43:34 +020074 const webrtc::AudioReceiveStream::Config& config,
75 RtcEventLog* event_log) {
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010076 RTC_DCHECK(audio_state);
77 internal::AudioState* internal_audio_state =
78 static_cast<internal::AudioState*>(audio_state);
Niels Möller349ade32018-11-16 09:50:42 +010079 return voe::CreateChannelReceive(
Markus Handelleb61b7f2021-06-22 10:46:48 +020080 clock, neteq_factory, internal_audio_state->audio_device_module(),
81 config.rtcp_send_transport, event_log, config.rtp.local_ssrc,
82 config.rtp.remote_ssrc, config.jitter_buffer_max_packets,
83 config.jitter_buffer_fast_accelerate, config.jitter_buffer_min_delay_ms,
Jakob Ivarsson53eae872019-01-10 15:58:36 +010084 config.jitter_buffer_enable_rtx_handling, config.decoder_factory,
Tommi6eda26c2021-06-09 13:46:28 +020085 config.codec_pair_id, std::move(config.frame_decryptor),
86 config.crypto_options, std::move(config.frame_transformer));
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010087}
88} // namespace
89
90AudioReceiveStream::AudioReceiveStream(
Sebastian Jansson977b3352019-03-04 17:43:34 +010091 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010092 PacketRouter* packet_router,
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +010093 NetEqFactory* neteq_factory,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010094 const webrtc::AudioReceiveStream::Config& config,
95 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
96 webrtc::RtcEventLog* event_log)
Sebastian Jansson977b3352019-03-04 17:43:34 +010097 : AudioReceiveStream(clock,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010098 packet_router,
99 config,
100 audio_state,
101 event_log,
Sebastian Jansson977b3352019-03-04 17:43:34 +0100102 CreateChannelReceive(clock,
103 audio_state.get(),
Ivo Creusenc3d1f9b2019-11-01 11:47:51 +0100104 neteq_factory,
Niels Möller349ade32018-11-16 09:50:42 +0100105 config,
106 event_log)) {}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100107
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200108AudioReceiveStream::AudioReceiveStream(
Sebastian Jansson977b3352019-03-04 17:43:34 +0100109 Clock* clock,
nisse0245da02016-11-30 03:35:20 -0800110 PacketRouter* packet_router,
solenberg566ef242015-11-06 15:34:49 -0800111 const webrtc::AudioReceiveStream::Config& config,
ivoc14d5dbe2016-07-04 07:06:55 -0700112 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100113 webrtc::RtcEventLog* event_log,
Niels Möller349ade32018-11-16 09:50:42 +0100114 std::unique_ptr<voe::ChannelReceiveInterface> channel_receive)
Markus Handellacd16af2021-05-29 13:21:28 +0200115 : config_(config),
116 audio_state_(audio_state),
Ranveer Aggarwaldea374a2021-01-23 12:27:19 +0530117 source_tracker_(clock),
118 channel_receive_(std::move(channel_receive)) {
Jonas Olsson24ea8222018-01-25 10:14:29 +0100119 RTC_LOG(LS_INFO) << "AudioReceiveStream: " << config.rtp.remote_ssrc;
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100120 RTC_DCHECK(config.decoder_factory);
Niels Möllerae4237e2018-10-05 11:28:38 +0200121 RTC_DCHECK(config.rtcp_send_transport);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100122 RTC_DCHECK(audio_state_);
Niels Möller349ade32018-11-16 09:50:42 +0100123 RTC_DCHECK(channel_receive_);
solenberg7add0582015-11-20 09:59:34 -0800124
Tommi90738dd2021-05-31 17:36:47 +0200125 packet_sequence_checker_.Detach();
Tommi02df2eb2021-05-31 12:57:53 +0200126
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800127 RTC_DCHECK(packet_router);
128 // Configure bandwidth estimation.
129 channel_receive_->RegisterReceiverCongestionControlObjects(packet_router);
nisse0f15f922017-06-21 01:05:22 -0700130
Ranveer Aggarwaldea374a2021-01-23 12:27:19 +0530131 // When output is muted, ChannelReceive will directly notify the source
132 // tracker of "delivered" frames, so RtpReceiver information will continue to
133 // be updated.
134 channel_receive_->SetSourceTracker(&source_tracker_);
135
Markus Handellacd16af2021-05-29 13:21:28 +0200136 // Complete configuration.
137 // TODO(solenberg): Config NACK history window (which is a packet count),
138 // using the actual packet size for the configured codec.
139 channel_receive_->SetNACKStatus(config.rtp.nack.rtp_history_ms != 0,
140 config.rtp.nack.rtp_history_ms / 20);
141 channel_receive_->SetReceiveCodecs(config.decoder_map);
Tommi6eda26c2021-06-09 13:46:28 +0200142 // `frame_transformer` and `frame_decryptor` have been given to
143 // `channel_receive_` already.
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200144}
145
pbosa2f30de2015-10-15 05:22:13 -0700146AudioReceiveStream::~AudioReceiveStream() {
solenberg3ebbcb52017-01-31 03:58:40 -0800147 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Jonas Olsson24ea8222018-01-25 10:14:29 +0100148 RTC_LOG(LS_INFO) << "~AudioReceiveStream: " << config_.rtp.remote_ssrc;
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100149 Stop();
Niels Möller349ade32018-11-16 09:50:42 +0100150 channel_receive_->SetAssociatedSendChannel(nullptr);
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800151 channel_receive_->ResetReceiverCongestionControlObjects();
pbosa2f30de2015-10-15 05:22:13 -0700152}
153
Tommi02df2eb2021-05-31 12:57:53 +0200154void AudioReceiveStream::RegisterWithTransport(
155 RtpStreamReceiverControllerInterface* receiver_controller) {
Tommi90738dd2021-05-31 17:36:47 +0200156 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Tommi02df2eb2021-05-31 12:57:53 +0200157 RTC_DCHECK(!rtp_stream_receiver_);
158 rtp_stream_receiver_ = receiver_controller->CreateReceiver(
159 config_.rtp.remote_ssrc, channel_receive_.get());
160}
161
162void AudioReceiveStream::UnregisterFromTransport() {
Tommi90738dd2021-05-31 17:36:47 +0200163 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Tommi02df2eb2021-05-31 12:57:53 +0200164 rtp_stream_receiver_.reset();
165}
166
Tommi6eda26c2021-06-09 13:46:28 +0200167void AudioReceiveStream::ReconfigureForTesting(
Fredrik Solenberg3b903d02018-01-10 15:17:10 +0100168 const webrtc::AudioReceiveStream::Config& config) {
Tommi6eda26c2021-06-09 13:46:28 +0200169 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Andrey Logvin8a18e5b2021-06-09 10:15:47 +0000170
171 // SSRC can't be changed mid-stream.
Andrey Logvin8a18e5b2021-06-09 10:15:47 +0000172 RTC_DCHECK_EQ(config_.rtp.remote_ssrc, config.rtp.remote_ssrc);
Tommi6eda26c2021-06-09 13:46:28 +0200173 RTC_DCHECK_EQ(config_.rtp.local_ssrc, config.rtp.local_ssrc);
174
175 // Configuration parameters which cannot be changed.
176 RTC_DCHECK_EQ(config_.rtcp_send_transport, config.rtcp_send_transport);
177 // Decoder factory cannot be changed because it is configured at
178 // voe::Channel construction time.
179 RTC_DCHECK_EQ(config_.decoder_factory, config.decoder_factory);
Markus Handellacd16af2021-05-29 13:21:28 +0200180
181 // TODO(solenberg): Config NACK history window (which is a packet count),
182 // using the actual packet size for the configured codec.
Tommi6eda26c2021-06-09 13:46:28 +0200183 RTC_DCHECK_EQ(config_.rtp.nack.rtp_history_ms, config.rtp.nack.rtp_history_ms)
184 << "Use SetUseTransportCcAndNackHistory";
Markus Handellacd16af2021-05-29 13:21:28 +0200185
Tommi6eda26c2021-06-09 13:46:28 +0200186 RTC_DCHECK(config_.decoder_map == config.decoder_map) << "Use SetDecoderMap";
187 RTC_DCHECK_EQ(config_.frame_transformer, config.frame_transformer)
188 << "Use SetDepacketizerToDecoderFrameTransformer";
Markus Handellacd16af2021-05-29 13:21:28 +0200189
190 config_ = config;
Fredrik Solenberg3b903d02018-01-10 15:17:10 +0100191}
192
solenberg7add0582015-11-20 09:59:34 -0800193void AudioReceiveStream::Start() {
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_->StartPlayout();
aleloi04c07222016-11-22 06:42:53 -0800199 playing_ = true;
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100200 audio_state()->AddReceivingStream(this);
solenberg7add0582015-11-20 09:59:34 -0800201}
202
203void AudioReceiveStream::Stop() {
solenberg3ebbcb52017-01-31 03:58:40 -0800204 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
aleloi04c07222016-11-22 06:42:53 -0800205 if (!playing_) {
206 return;
207 }
Niels Möller349ade32018-11-16 09:50:42 +0100208 channel_receive_->StopPlayout();
aleloi04c07222016-11-22 06:42:53 -0800209 playing_ = false;
Fredrik Solenbergd5247512017-12-18 22:41:03 +0100210 audio_state()->RemoveReceivingStream(this);
solenberg7add0582015-11-20 09:59:34 -0800211}
212
Tomas Gunnarsson8467cf22021-01-17 14:36:44 +0100213bool AudioReceiveStream::IsRunning() const {
214 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
215 return playing_;
216}
217
Tommi6eda26c2021-06-09 13:46:28 +0200218void AudioReceiveStream::SetDepacketizerToDecoderFrameTransformer(
219 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
220 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
221 channel_receive_->SetDepacketizerToDecoderFrameTransformer(
222 std::move(frame_transformer));
223}
224
225void AudioReceiveStream::SetDecoderMap(
226 std::map<int, SdpAudioFormat> decoder_map) {
227 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
228 config_.decoder_map = std::move(decoder_map);
229 channel_receive_->SetReceiveCodecs(config_.decoder_map);
230}
231
232void AudioReceiveStream::SetUseTransportCcAndNackHistory(bool use_transport_cc,
233 int history_ms) {
234 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
235 RTC_DCHECK_GE(history_ms, 0);
236 config_.rtp.transport_cc = use_transport_cc;
237 if (config_.rtp.nack.rtp_history_ms != history_ms) {
238 config_.rtp.nack.rtp_history_ms = history_ms;
239 // TODO(solenberg): Config NACK history window (which is a packet count),
240 // using the actual packet size for the configured codec.
241 channel_receive_->SetNACKStatus(history_ms != 0, history_ms / 20);
242 }
243}
244
Tommie0972822021-06-14 08:11:10 +0200245void AudioReceiveStream::SetFrameDecryptor(
246 rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
247 // TODO(bugs.webrtc.org/11993): This is called via WebRtcAudioReceiveStream,
248 // expect to be called on the network thread.
249 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
250 channel_receive_->SetFrameDecryptor(std::move(frame_decryptor));
251}
252
Tommi3008bcd2021-06-14 20:00:04 +0200253void AudioReceiveStream::SetRtpExtensions(
254 std::vector<RtpExtension> extensions) {
255 // TODO(bugs.webrtc.org/11993): This is called via WebRtcAudioReceiveStream,
256 // expect to be called on the network thread.
257 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
258 config_.rtp.extensions = std::move(extensions);
259}
260
Niels Möller6b4d9622020-09-14 10:47:50 +0200261webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats(
262 bool get_and_clear_legacy_stats) const {
solenberg3ebbcb52017-01-31 03:58:40 -0800263 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200264 webrtc::AudioReceiveStream::Stats stats;
265 stats.remote_ssrc = config_.rtp.remote_ssrc;
solenberg8b85de22015-11-16 09:48:04 -0800266
Niels Möller530ead42018-10-04 14:28:39 +0200267 webrtc::CallReceiveStatistics call_stats =
Niels Möller349ade32018-11-16 09:50:42 +0100268 channel_receive_->GetRTCPStatistics();
solenbergbd9a77f2017-02-06 12:53:57 -0800269 // TODO(solenberg): Don't return here if we can't get the codec - return the
270 // stats we *can* get.
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100271 auto receive_codec = channel_receive_->GetReceiveCodec();
272 if (!receive_codec) {
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200273 return stats;
274 }
275
Niels Möllerac0a4cb2019-10-09 15:01:33 +0200276 stats.payload_bytes_rcvd = call_stats.payload_bytes_rcvd;
277 stats.header_and_padding_bytes_rcvd =
278 call_stats.header_and_padding_bytes_rcvd;
solenberg85a04962015-10-27 03:35:21 -0700279 stats.packets_rcvd = call_stats.packetsReceived;
280 stats.packets_lost = call_stats.cumulativeLost;
Jakob Ivarssone54914a2021-07-01 11:16:05 +0200281 stats.nacks_sent = call_stats.nacks_sent;
solenberg8b85de22015-11-16 09:48:04 -0800282 stats.capture_start_ntp_time_ms = call_stats.capture_start_ntp_time_ms_;
Henrik Boström01738c62019-04-15 17:32:00 +0200283 stats.last_packet_received_timestamp_ms =
284 call_stats.last_packet_received_timestamp_ms;
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100285 stats.codec_name = receive_codec->second.name;
286 stats.codec_payload_type = receive_codec->first;
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100287 int clockrate_khz = receive_codec->second.clockrate_hz / 1000;
288 if (clockrate_khz > 0) {
289 stats.jitter_ms = call_stats.jitterSamples / clockrate_khz;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200290 }
Niels Möller349ade32018-11-16 09:50:42 +0100291 stats.delay_estimate_ms = channel_receive_->GetDelayEstimate();
292 stats.audio_level = channel_receive_->GetSpeechOutputLevelFullRange();
293 stats.total_output_energy = channel_receive_->GetTotalOutputEnergy();
294 stats.total_output_duration = channel_receive_->GetTotalOutputDuration();
Åsa Perssonfcf79cc2019-10-22 15:23:44 +0200295 stats.estimated_playout_ntp_timestamp_ms =
296 channel_receive_->GetCurrentEstimatedPlayoutNtpTimestampMs(
297 rtc::TimeMillis());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200298
solenberg8b85de22015-11-16 09:48:04 -0800299 // Get jitter buffer and total delay (alg + jitter + playout) stats.
Niels Möller6b4d9622020-09-14 10:47:50 +0200300 auto ns = channel_receive_->GetNetworkStatistics(get_and_clear_legacy_stats);
Minyue Li28a2c632021-07-07 15:53:38 +0200301 stats.packets_discarded = ns.packetsDiscarded;
Ivo Creusen8d8ffdb2019-04-30 09:45:21 +0200302 stats.fec_packets_received = ns.fecPacketsReceived;
303 stats.fec_packets_discarded = ns.fecPacketsDiscarded;
solenberg8b85de22015-11-16 09:48:04 -0800304 stats.jitter_buffer_ms = ns.currentBufferSize;
305 stats.jitter_buffer_preferred_ms = ns.preferredBufferSize;
Steve Anton2dbc69f2017-08-24 17:15:13 -0700306 stats.total_samples_received = ns.totalSamplesReceived;
307 stats.concealed_samples = ns.concealedSamples;
Ivo Creusen8d8ffdb2019-04-30 09:45:21 +0200308 stats.silent_concealed_samples = ns.silentConcealedSamples;
Gustaf Ullberg9a2e9062017-09-18 09:28:20 +0200309 stats.concealment_events = ns.concealmentEvents;
Gustaf Ullbergb0a02072017-10-02 12:00:34 +0200310 stats.jitter_buffer_delay_seconds =
311 static_cast<double>(ns.jitterBufferDelayMs) /
312 static_cast<double>(rtc::kNumMillisecsPerSec);
Chen Xing0acffb52019-01-15 15:46:29 +0100313 stats.jitter_buffer_emitted_count = ns.jitterBufferEmittedCount;
Artem Titove618cc92020-03-11 11:18:54 +0100314 stats.jitter_buffer_target_delay_seconds =
315 static_cast<double>(ns.jitterBufferTargetDelayMs) /
316 static_cast<double>(rtc::kNumMillisecsPerSec);
Ivo Creusen8d8ffdb2019-04-30 09:45:21 +0200317 stats.inserted_samples_for_deceleration = ns.insertedSamplesForDeceleration;
318 stats.removed_samples_for_acceleration = ns.removedSamplesForAcceleration;
solenberg8b85de22015-11-16 09:48:04 -0800319 stats.expand_rate = Q14ToFloat(ns.currentExpandRate);
320 stats.speech_expand_rate = Q14ToFloat(ns.currentSpeechExpandRate);
321 stats.secondary_decoded_rate = Q14ToFloat(ns.currentSecondaryDecodedRate);
minyue-webrtc0e320ec2017-08-28 13:51:27 +0200322 stats.secondary_discarded_rate = Q14ToFloat(ns.currentSecondaryDiscardedRate);
solenberg8b85de22015-11-16 09:48:04 -0800323 stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
324 stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
Ruslan Burakov8af88962018-11-22 17:21:10 +0100325 stats.jitter_buffer_flushes = ns.packetBufferFlushes;
Jakob Ivarsson352ce5c2018-11-27 12:52:16 +0100326 stats.delayed_packet_outage_samples = ns.delayedPacketOutageSamples;
Jakob Ivarsson232b3fd2019-03-06 09:18:40 +0100327 stats.relative_packet_arrival_delay_seconds =
328 static_cast<double>(ns.relativePacketArrivalDelayMs) /
329 static_cast<double>(rtc::kNumMillisecsPerSec);
Henrik Lundin44125fa2019-04-29 17:00:46 +0200330 stats.interruption_count = ns.interruptionCount;
331 stats.total_interruption_duration_ms = ns.totalInterruptionDurationMs;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200332
Niels Möller349ade32018-11-16 09:50:42 +0100333 auto ds = channel_receive_->GetDecodingCallStatistics();
solenberg8b85de22015-11-16 09:48:04 -0800334 stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;
335 stats.decoding_calls_to_neteq = ds.calls_to_neteq;
336 stats.decoding_normal = ds.decoded_normal;
Alex Narest5b5d97c2019-08-07 18:15:08 +0200337 stats.decoding_plc = ds.decoded_neteq_plc;
338 stats.decoding_codec_plc = ds.decoded_codec_plc;
solenberg8b85de22015-11-16 09:48:04 -0800339 stats.decoding_cng = ds.decoded_cng;
340 stats.decoding_plc_cng = ds.decoded_plc_cng;
henrik.lundin63489782016-09-20 01:47:12 -0700341 stats.decoding_muted_output = ds.decoded_muted_output;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200342
Alessio Bazzicaf7b1b952021-03-23 17:23:04 +0100343 stats.last_sender_report_timestamp_ms =
344 call_stats.last_sender_report_timestamp_ms;
345 stats.last_sender_report_remote_timestamp_ms =
346 call_stats.last_sender_report_remote_timestamp_ms;
347 stats.sender_reports_packets_sent = call_stats.sender_reports_packets_sent;
348 stats.sender_reports_bytes_sent = call_stats.sender_reports_bytes_sent;
349 stats.sender_reports_reports_count = call_stats.sender_reports_reports_count;
350
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200351 return stats;
Fredrik Solenberg04f49312015-06-08 13:04:56 +0200352}
353
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100354void AudioReceiveStream::SetSink(AudioSinkInterface* sink) {
solenberg3ebbcb52017-01-31 03:58:40 -0800355 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100356 channel_receive_->SetSink(sink);
Tommif888bb52015-12-12 01:37:01 +0100357}
358
solenberg217fb662016-06-17 08:30:54 -0700359void AudioReceiveStream::SetGain(float gain) {
solenberg3ebbcb52017-01-31 03:58:40 -0800360 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100361 channel_receive_->SetChannelOutputVolumeScaling(gain);
solenberg217fb662016-06-17 08:30:54 -0700362}
363
Ruslan Burakov3b50f9f2019-02-06 09:45:56 +0100364bool AudioReceiveStream::SetBaseMinimumPlayoutDelayMs(int delay_ms) {
365 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
366 return channel_receive_->SetBaseMinimumPlayoutDelayMs(delay_ms);
367}
368
369int AudioReceiveStream::GetBaseMinimumPlayoutDelayMs() const {
370 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
371 return channel_receive_->GetBaseMinimumPlayoutDelayMs();
372}
373
hbos8d609f62017-04-10 07:39:05 -0700374std::vector<RtpSource> AudioReceiveStream::GetSources() const {
375 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Chen Xing054e3bb2019-08-02 10:29:26 +0000376 return source_tracker_.GetSources();
hbos8d609f62017-04-10 07:39:05 -0700377}
378
solenberg3ebbcb52017-01-31 03:58:40 -0800379AudioMixer::Source::AudioFrameInfo AudioReceiveStream::GetAudioFrameWithInfo(
380 int sample_rate_hz,
381 AudioFrame* audio_frame) {
Chen Xing054e3bb2019-08-02 10:29:26 +0000382 AudioMixer::Source::AudioFrameInfo audio_frame_info =
383 channel_receive_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame);
384 if (audio_frame_info != AudioMixer::Source::AudioFrameInfo::kError) {
385 source_tracker_.OnFrameDelivered(audio_frame->packet_infos_);
386 }
387 return audio_frame_info;
solenberg3ebbcb52017-01-31 03:58:40 -0800388}
389
390int AudioReceiveStream::Ssrc() const {
391 return config_.rtp.remote_ssrc;
392}
393
394int AudioReceiveStream::PreferredSampleRate() const {
Niels Möller349ade32018-11-16 09:50:42 +0100395 return channel_receive_->PreferredSampleRate();
solenberg3ebbcb52017-01-31 03:58:40 -0800396}
397
Åsa Persson74d2b1d2020-02-10 16:33:29 +0100398uint32_t AudioReceiveStream::id() const {
solenberg3ebbcb52017-01-31 03:58:40 -0800399 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
400 return config_.rtp.remote_ssrc;
401}
402
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200403absl::optional<Syncable::Info> AudioReceiveStream::GetInfo() const {
Tomas Gunnarsson0f030fd2021-04-01 20:12:04 +0200404 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
405 // expect to be called on the network thread.
406 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
407 return channel_receive_->GetSyncInfo();
solenberg3ebbcb52017-01-31 03:58:40 -0800408}
409
Åsa Perssonfcf79cc2019-10-22 15:23:44 +0200410bool AudioReceiveStream::GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp,
411 int64_t* time_ms) const {
solenberg3ebbcb52017-01-31 03:58:40 -0800412 // Called on video capture thread.
Åsa Perssonfcf79cc2019-10-22 15:23:44 +0200413 return channel_receive_->GetPlayoutRtpTimestamp(rtp_timestamp, time_ms);
414}
415
416void AudioReceiveStream::SetEstimatedPlayoutNtpTimestampMs(
417 int64_t ntp_timestamp_ms,
418 int64_t time_ms) {
419 // Called on video capture thread.
420 channel_receive_->SetEstimatedPlayoutNtpTimestampMs(ntp_timestamp_ms,
421 time_ms);
solenberg3ebbcb52017-01-31 03:58:40 -0800422}
423
Ivo Creusenbef7b052020-09-08 16:30:25 +0200424bool AudioReceiveStream::SetMinimumPlayoutDelay(int delay_ms) {
Tomas Gunnarsson0f030fd2021-04-01 20:12:04 +0200425 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
426 // expect to be called on the network thread.
427 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100428 return channel_receive_->SetMinimumPlayoutDelay(delay_ms);
pbosa2f30de2015-10-15 05:22:13 -0700429}
430
solenberg7602aab2016-11-14 11:30:07 -0800431void AudioReceiveStream::AssociateSendStream(AudioSendStream* send_stream) {
Tommi90738dd2021-05-31 17:36:47 +0200432 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Niels Möller349ade32018-11-16 09:50:42 +0100433 channel_receive_->SetAssociatedSendChannel(
434 send_stream ? send_stream->GetChannel() : nullptr);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100435 associated_send_stream_ = send_stream;
solenberg7602aab2016-11-14 11:30:07 -0800436}
437
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100438void AudioReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) {
pbos1ba8d392016-05-01 20:18:34 -0700439 // TODO(solenberg): Tests call this function on a network thread, libjingle
440 // calls on the worker thread. We should move towards always using a network
441 // thread. Then this check can be enabled.
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200442 // RTC_DCHECK(!thread_checker_.IsCurrent());
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100443 channel_receive_->ReceivedRTCPPacket(packet, length);
pbos1ba8d392016-05-01 20:18:34 -0700444}
445
Tommi55107c82021-06-16 16:31:18 +0200446void AudioReceiveStream::SetSyncGroup(const std::string& sync_group) {
447 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
448 config_.sync_group = sync_group;
449}
450
Tommi08be9ba2021-06-15 23:01:57 +0200451void AudioReceiveStream::SetLocalSsrc(uint32_t local_ssrc) {
452 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
453 // TODO(tommi): Consider storing local_ssrc in one place.
454 config_.rtp.local_ssrc = local_ssrc;
455 channel_receive_->OnLocalSsrcChange(local_ssrc);
456}
457
458uint32_t AudioReceiveStream::local_ssrc() const {
459 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
460 RTC_DCHECK_EQ(config_.rtp.local_ssrc, channel_receive_->GetLocalSsrc());
461 return config_.rtp.local_ssrc;
462}
463
solenberg3ebbcb52017-01-31 03:58:40 -0800464const webrtc::AudioReceiveStream::Config& AudioReceiveStream::config() const {
465 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
466 return config_;
aleloi04c07222016-11-22 06:42:53 -0800467}
468
Yves Gerey665174f2018-06-19 15:03:05 +0200469const AudioSendStream* AudioReceiveStream::GetAssociatedSendStreamForTesting()
470 const {
Tommi90738dd2021-05-31 17:36:47 +0200471 RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100472 return associated_send_stream_;
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200473}
aleloi04c07222016-11-22 06:42:53 -0800474
solenberg3ebbcb52017-01-31 03:58:40 -0800475internal::AudioState* AudioReceiveStream::audio_state() const {
476 auto* audio_state = static_cast<internal::AudioState*>(audio_state_.get());
477 RTC_DCHECK(audio_state);
478 return audio_state;
479}
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200480} // namespace internal
481} // namespace webrtc