blob: ef69e732ab46805f2d3011a13d197533852d57d3 [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
Fredrik Solenberg23fba1f2015-04-29 13:24:0136std::string AudioReceiveStream::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 << ", transport_cc: " << (transport_cc ? "on" : "off");
42 ss << ", nack: " << nack.ToString();
Fredrik Solenberg23fba1f2015-04-29 13:24:0143 ss << ", extensions: [";
44 for (size_t i = 0; i < extensions.size(); ++i) {
45 ss << extensions[i].ToString();
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2746 if (i != extensions.size() - 1) {
Fredrik Solenberg23fba1f2015-04-29 13:24:0147 ss << ", ";
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2748 }
Fredrik Solenberg23fba1f2015-04-29 13:24:0149 }
50 ss << ']';
51 ss << '}';
52 return ss.str();
53}
54
55std::string AudioReceiveStream::Config::ToString() const {
Karl Wiberg881f1682018-03-08 14:03:2356 char ss_buf[1024];
57 rtc::SimpleStringBuilder ss(ss_buf);
Fredrik Solenberg23fba1f2015-04-29 13:24:0158 ss << "{rtp: " << rtp.ToString();
solenberg85a04962015-10-27 10:35:2159 ss << ", rtcp_send_transport: "
deadbeef922246a2017-02-26 12:18:1260 << (rtcp_send_transport ? "(Transport)" : "null");
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2761 if (!sync_group.empty()) {
pbos8fc7fa72015-07-15 15:02:5862 ss << ", sync_group: " << sync_group;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:2763 }
Fredrik Solenberg23fba1f2015-04-29 13:24:0164 ss << '}';
65 return ss.str();
66}
67
68namespace internal {
Fredrik Solenberg8f5787a2018-01-11 12:52:3069namespace {
Niels Möller349ade32018-11-16 08:50:4270std::unique_ptr<voe::ChannelReceiveInterface> CreateChannelReceive(
Sebastian Jansson977b3352019-03-04 16:43:3471 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 12:52:3072 webrtc::AudioState* audio_state,
73 ProcessThread* module_process_thread,
Ivo Creusenc3d1f9b2019-11-01 10:47:5174 NetEqFactory* neteq_factory,
Niels Möllerfa4e1852018-08-14 07:43:3475 const webrtc::AudioReceiveStream::Config& config,
76 RtcEventLog* event_log) {
Fredrik Solenberg8f5787a2018-01-11 12:52:3077 RTC_DCHECK(audio_state);
78 internal::AudioState* internal_audio_state =
79 static_cast<internal::AudioState*>(audio_state);
Niels Möller349ade32018-11-16 08:50:4280 return voe::CreateChannelReceive(
Ivo Creusenc3d1f9b2019-11-01 10:47:5181 clock, module_process_thread, neteq_factory,
Bjorn A Mellem7a9a0922019-11-26 17:19:4082 internal_audio_state->audio_device_module(), config.rtcp_send_transport,
83 event_log, config.rtp.local_ssrc, config.rtp.remote_ssrc,
Erik Språng70efdde2019-08-21 11:36:2084 config.jitter_buffer_max_packets, config.jitter_buffer_fast_accelerate,
85 config.jitter_buffer_min_delay_ms,
Jakob Ivarsson53eae872019-01-10 14:58:3686 config.jitter_buffer_enable_rtx_handling, config.decoder_factory,
Marina Ciocea3e9af7f2020-04-01 05:46:1687 config.codec_pair_id, config.frame_decryptor, config.crypto_options,
88 std::move(config.frame_transformer));
Fredrik Solenberg8f5787a2018-01-11 12:52:3089}
90} // namespace
91
92AudioReceiveStream::AudioReceiveStream(
Sebastian Jansson977b3352019-03-04 16:43:3493 Clock* clock,
Fredrik Solenberg8f5787a2018-01-11 12:52:3094 PacketRouter* packet_router,
95 ProcessThread* module_process_thread,
Ivo Creusenc3d1f9b2019-11-01 10:47:5196 NetEqFactory* neteq_factory,
Fredrik Solenberg8f5787a2018-01-11 12:52:3097 const webrtc::AudioReceiveStream::Config& config,
98 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
99 webrtc::RtcEventLog* event_log)
Sebastian Jansson977b3352019-03-04 16:43:34100 : AudioReceiveStream(clock,
Fredrik Solenberg8f5787a2018-01-11 12:52:30101 packet_router,
102 config,
103 audio_state,
104 event_log,
Sebastian Jansson977b3352019-03-04 16:43:34105 CreateChannelReceive(clock,
106 audio_state.get(),
Niels Möller349ade32018-11-16 08:50:42107 module_process_thread,
Ivo Creusenc3d1f9b2019-11-01 10:47:51108 neteq_factory,
Niels Möller349ade32018-11-16 08:50:42109 config,
110 event_log)) {}
Fredrik Solenberg8f5787a2018-01-11 12:52:30111
Fredrik Solenberg23fba1f2015-04-29 13:24:01112AudioReceiveStream::AudioReceiveStream(
Sebastian Jansson977b3352019-03-04 16:43:34113 Clock* clock,
nisse0245da02016-11-30 11:35:20114 PacketRouter* packet_router,
solenberg566ef242015-11-06 23:34:49115 const webrtc::AudioReceiveStream::Config& config,
ivoc14d5dbe2016-07-04 14:06:55116 const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
Fredrik Solenberg8f5787a2018-01-11 12:52:30117 webrtc::RtcEventLog* event_log,
Niels Möller349ade32018-11-16 08:50:42118 std::unique_ptr<voe::ChannelReceiveInterface> channel_receive)
Markus Handellacd16af2021-05-29 11:21:28119 : config_(config),
120 audio_state_(audio_state),
Ranveer Aggarwaldea374a2021-01-23 06:57:19121 source_tracker_(clock),
122 channel_receive_(std::move(channel_receive)) {
Jonas Olsson24ea8222018-01-25 09:14:29123 RTC_LOG(LS_INFO) << "AudioReceiveStream: " << config.rtp.remote_ssrc;
Fredrik Solenberg8f5787a2018-01-11 12:52:30124 RTC_DCHECK(config.decoder_factory);
Niels Möllerae4237e2018-10-05 09:28:38125 RTC_DCHECK(config.rtcp_send_transport);
Fredrik Solenberg8f5787a2018-01-11 12:52:30126 RTC_DCHECK(audio_state_);
Niels Möller349ade32018-11-16 08:50:42127 RTC_DCHECK(channel_receive_);
solenberg7add0582015-11-20 17:59:34128
Tommi02df2eb2021-05-31 10:57:53129 network_thread_checker_.Detach();
130
Bjorn A Mellem7a9a0922019-11-26 17:19:40131 RTC_DCHECK(packet_router);
132 // Configure bandwidth estimation.
133 channel_receive_->RegisterReceiverCongestionControlObjects(packet_router);
nisse0f15f922017-06-21 08:05:22134
Ranveer Aggarwaldea374a2021-01-23 06:57:19135 // When output is muted, ChannelReceive will directly notify the source
136 // tracker of "delivered" frames, so RtpReceiver information will continue to
137 // be updated.
138 channel_receive_->SetSourceTracker(&source_tracker_);
139
Markus Handellacd16af2021-05-29 11:21:28140 // Complete configuration.
141 // TODO(solenberg): Config NACK history window (which is a packet count),
142 // using the actual packet size for the configured codec.
143 channel_receive_->SetNACKStatus(config.rtp.nack.rtp_history_ms != 0,
144 config.rtp.nack.rtp_history_ms / 20);
145 channel_receive_->SetReceiveCodecs(config.decoder_map);
146 channel_receive_->SetDepacketizerToDecoderFrameTransformer(
147 config.frame_transformer);
Fredrik Solenberg23fba1f2015-04-29 13:24:01148}
149
pbosa2f30de2015-10-15 12:22:13150AudioReceiveStream::~AudioReceiveStream() {
solenberg3ebbcb52017-01-31 11:58:40151 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Jonas Olsson24ea8222018-01-25 09:14:29152 RTC_LOG(LS_INFO) << "~AudioReceiveStream: " << config_.rtp.remote_ssrc;
Fredrik Solenbergd5247512017-12-18 21:41:03153 Stop();
Niels Möller349ade32018-11-16 08:50:42154 channel_receive_->SetAssociatedSendChannel(nullptr);
Bjorn A Mellem7a9a0922019-11-26 17:19:40155 channel_receive_->ResetReceiverCongestionControlObjects();
pbosa2f30de2015-10-15 12:22:13156}
157
Tommi02df2eb2021-05-31 10:57:53158void AudioReceiveStream::RegisterWithTransport(
159 RtpStreamReceiverControllerInterface* receiver_controller) {
160 RTC_DCHECK_RUN_ON(&network_thread_checker_);
161 RTC_DCHECK(!rtp_stream_receiver_);
162 rtp_stream_receiver_ = receiver_controller->CreateReceiver(
163 config_.rtp.remote_ssrc, channel_receive_.get());
164}
165
166void AudioReceiveStream::UnregisterFromTransport() {
167 RTC_DCHECK_RUN_ON(&network_thread_checker_);
168 rtp_stream_receiver_.reset();
169}
170
Fredrik Solenberg3b903d02018-01-10 14:17:10171void AudioReceiveStream::Reconfigure(
172 const webrtc::AudioReceiveStream::Config& config) {
Sebastian Janssonc01367d2019-04-08 13:20:44173 RTC_DCHECK(worker_thread_checker_.IsCurrent());
Markus Handellacd16af2021-05-29 11:21:28174
175 // Configuration parameters which cannot be changed.
176 RTC_DCHECK(config_.rtp.remote_ssrc == config.rtp.remote_ssrc);
177 RTC_DCHECK(config_.rtcp_send_transport == config.rtcp_send_transport);
178 // Decoder factory cannot be changed because it is configured at
179 // voe::Channel construction time.
180 RTC_DCHECK(config_.decoder_factory == config.decoder_factory);
181
182 // SSRC can't be changed mid-stream.
183 RTC_DCHECK_EQ(config_.rtp.local_ssrc, config.rtp.local_ssrc);
184 RTC_DCHECK_EQ(config_.rtp.remote_ssrc, config.rtp.remote_ssrc);
185
186 // TODO(solenberg): Config NACK history window (which is a packet count),
187 // using the actual packet size for the configured codec.
188 if (config_.rtp.nack.rtp_history_ms != config.rtp.nack.rtp_history_ms) {
189 channel_receive_->SetNACKStatus(config.rtp.nack.rtp_history_ms != 0,
190 config.rtp.nack.rtp_history_ms / 20);
191 }
192 if (config_.decoder_map != config.decoder_map) {
193 channel_receive_->SetReceiveCodecs(config.decoder_map);
194 }
195
196 if (config_.frame_transformer != config.frame_transformer) {
197 channel_receive_->SetDepacketizerToDecoderFrameTransformer(
198 config.frame_transformer);
199 }
200
201 config_ = config;
Fredrik Solenberg3b903d02018-01-10 14:17:10202}
203
solenberg7add0582015-11-20 17:59:34204void AudioReceiveStream::Start() {
solenberg3ebbcb52017-01-31 11:58:40205 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
aleloi04c07222016-11-22 14:42:53206 if (playing_) {
207 return;
208 }
Niels Möller349ade32018-11-16 08:50:42209 channel_receive_->StartPlayout();
aleloi04c07222016-11-22 14:42:53210 playing_ = true;
Fredrik Solenbergd5247512017-12-18 21:41:03211 audio_state()->AddReceivingStream(this);
solenberg7add0582015-11-20 17:59:34212}
213
214void AudioReceiveStream::Stop() {
solenberg3ebbcb52017-01-31 11:58:40215 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
aleloi04c07222016-11-22 14:42:53216 if (!playing_) {
217 return;
218 }
Niels Möller349ade32018-11-16 08:50:42219 channel_receive_->StopPlayout();
aleloi04c07222016-11-22 14:42:53220 playing_ = false;
Fredrik Solenbergd5247512017-12-18 21:41:03221 audio_state()->RemoveReceivingStream(this);
solenberg7add0582015-11-20 17:59:34222}
223
Tomas Gunnarsson8467cf22021-01-17 13:36:44224bool AudioReceiveStream::IsRunning() const {
225 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
226 return playing_;
227}
228
Niels Möller6b4d9622020-09-14 08:47:50229webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats(
230 bool get_and_clear_legacy_stats) const {
solenberg3ebbcb52017-01-31 11:58:40231 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27232 webrtc::AudioReceiveStream::Stats stats;
233 stats.remote_ssrc = config_.rtp.remote_ssrc;
solenberg8b85de22015-11-16 17:48:04234
Niels Möller530ead42018-10-04 12:28:39235 webrtc::CallReceiveStatistics call_stats =
Niels Möller349ade32018-11-16 08:50:42236 channel_receive_->GetRTCPStatistics();
solenbergbd9a77f2017-02-06 20:53:57237 // TODO(solenberg): Don't return here if we can't get the codec - return the
238 // stats we *can* get.
Fredrik Solenbergf693bfa2018-12-11 11:22:10239 auto receive_codec = channel_receive_->GetReceiveCodec();
240 if (!receive_codec) {
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27241 return stats;
242 }
243
Niels Möllerac0a4cb2019-10-09 13:01:33244 stats.payload_bytes_rcvd = call_stats.payload_bytes_rcvd;
245 stats.header_and_padding_bytes_rcvd =
246 call_stats.header_and_padding_bytes_rcvd;
solenberg85a04962015-10-27 10:35:21247 stats.packets_rcvd = call_stats.packetsReceived;
248 stats.packets_lost = call_stats.cumulativeLost;
solenberg8b85de22015-11-16 17:48:04249 stats.capture_start_ntp_time_ms = call_stats.capture_start_ntp_time_ms_;
Henrik Boström01738c62019-04-15 15:32:00250 stats.last_packet_received_timestamp_ms =
251 call_stats.last_packet_received_timestamp_ms;
Fredrik Solenbergf693bfa2018-12-11 11:22:10252 stats.codec_name = receive_codec->second.name;
253 stats.codec_payload_type = receive_codec->first;
Fredrik Solenbergf693bfa2018-12-11 11:22:10254 int clockrate_khz = receive_codec->second.clockrate_hz / 1000;
255 if (clockrate_khz > 0) {
256 stats.jitter_ms = call_stats.jitterSamples / clockrate_khz;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27257 }
Niels Möller349ade32018-11-16 08:50:42258 stats.delay_estimate_ms = channel_receive_->GetDelayEstimate();
259 stats.audio_level = channel_receive_->GetSpeechOutputLevelFullRange();
260 stats.total_output_energy = channel_receive_->GetTotalOutputEnergy();
261 stats.total_output_duration = channel_receive_->GetTotalOutputDuration();
Åsa Perssonfcf79cc2019-10-22 13:23:44262 stats.estimated_playout_ntp_timestamp_ms =
263 channel_receive_->GetCurrentEstimatedPlayoutNtpTimestampMs(
264 rtc::TimeMillis());
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27265
solenberg8b85de22015-11-16 17:48:04266 // Get jitter buffer and total delay (alg + jitter + playout) stats.
Niels Möller6b4d9622020-09-14 08:47:50267 auto ns = channel_receive_->GetNetworkStatistics(get_and_clear_legacy_stats);
Ivo Creusen8d8ffdb2019-04-30 07:45:21268 stats.fec_packets_received = ns.fecPacketsReceived;
269 stats.fec_packets_discarded = ns.fecPacketsDiscarded;
solenberg8b85de22015-11-16 17:48:04270 stats.jitter_buffer_ms = ns.currentBufferSize;
271 stats.jitter_buffer_preferred_ms = ns.preferredBufferSize;
Steve Anton2dbc69f2017-08-25 00:15:13272 stats.total_samples_received = ns.totalSamplesReceived;
273 stats.concealed_samples = ns.concealedSamples;
Ivo Creusen8d8ffdb2019-04-30 07:45:21274 stats.silent_concealed_samples = ns.silentConcealedSamples;
Gustaf Ullberg9a2e9062017-09-18 07:28:20275 stats.concealment_events = ns.concealmentEvents;
Gustaf Ullbergb0a02072017-10-02 10:00:34276 stats.jitter_buffer_delay_seconds =
277 static_cast<double>(ns.jitterBufferDelayMs) /
278 static_cast<double>(rtc::kNumMillisecsPerSec);
Chen Xing0acffb52019-01-15 14:46:29279 stats.jitter_buffer_emitted_count = ns.jitterBufferEmittedCount;
Artem Titove618cc92020-03-11 10:18:54280 stats.jitter_buffer_target_delay_seconds =
281 static_cast<double>(ns.jitterBufferTargetDelayMs) /
282 static_cast<double>(rtc::kNumMillisecsPerSec);
Ivo Creusen8d8ffdb2019-04-30 07:45:21283 stats.inserted_samples_for_deceleration = ns.insertedSamplesForDeceleration;
284 stats.removed_samples_for_acceleration = ns.removedSamplesForAcceleration;
solenberg8b85de22015-11-16 17:48:04285 stats.expand_rate = Q14ToFloat(ns.currentExpandRate);
286 stats.speech_expand_rate = Q14ToFloat(ns.currentSpeechExpandRate);
287 stats.secondary_decoded_rate = Q14ToFloat(ns.currentSecondaryDecodedRate);
minyue-webrtc0e320ec2017-08-28 11:51:27288 stats.secondary_discarded_rate = Q14ToFloat(ns.currentSecondaryDiscardedRate);
solenberg8b85de22015-11-16 17:48:04289 stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
290 stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
Ruslan Burakov8af88962018-11-22 16:21:10291 stats.jitter_buffer_flushes = ns.packetBufferFlushes;
Jakob Ivarsson352ce5c2018-11-27 11:52:16292 stats.delayed_packet_outage_samples = ns.delayedPacketOutageSamples;
Jakob Ivarsson232b3fd2019-03-06 08:18:40293 stats.relative_packet_arrival_delay_seconds =
294 static_cast<double>(ns.relativePacketArrivalDelayMs) /
295 static_cast<double>(rtc::kNumMillisecsPerSec);
Henrik Lundin44125fa2019-04-29 15:00:46296 stats.interruption_count = ns.interruptionCount;
297 stats.total_interruption_duration_ms = ns.totalInterruptionDurationMs;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27298
Niels Möller349ade32018-11-16 08:50:42299 auto ds = channel_receive_->GetDecodingCallStatistics();
solenberg8b85de22015-11-16 17:48:04300 stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;
301 stats.decoding_calls_to_neteq = ds.calls_to_neteq;
302 stats.decoding_normal = ds.decoded_normal;
Alex Narest5b5d97c2019-08-07 16:15:08303 stats.decoding_plc = ds.decoded_neteq_plc;
304 stats.decoding_codec_plc = ds.decoded_codec_plc;
solenberg8b85de22015-11-16 17:48:04305 stats.decoding_cng = ds.decoded_cng;
306 stats.decoding_plc_cng = ds.decoded_plc_cng;
henrik.lundin63489782016-09-20 08:47:12307 stats.decoding_muted_output = ds.decoded_muted_output;
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27308
Alessio Bazzicaf7b1b952021-03-23 16:23:04309 stats.last_sender_report_timestamp_ms =
310 call_stats.last_sender_report_timestamp_ms;
311 stats.last_sender_report_remote_timestamp_ms =
312 call_stats.last_sender_report_remote_timestamp_ms;
313 stats.sender_reports_packets_sent = call_stats.sender_reports_packets_sent;
314 stats.sender_reports_bytes_sent = call_stats.sender_reports_bytes_sent;
315 stats.sender_reports_reports_count = call_stats.sender_reports_reports_count;
316
Fredrik Solenberg4f4ec0a2015-10-22 08:49:27317 return stats;
Fredrik Solenberg04f49312015-06-08 11:04:56318}
319
Fredrik Solenberg8f5787a2018-01-11 12:52:30320void AudioReceiveStream::SetSink(AudioSinkInterface* sink) {
solenberg3ebbcb52017-01-31 11:58:40321 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 08:50:42322 channel_receive_->SetSink(sink);
Tommif888bb52015-12-12 00:37:01323}
324
solenberg217fb662016-06-17 15:30:54325void AudioReceiveStream::SetGain(float gain) {
solenberg3ebbcb52017-01-31 11:58:40326 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 08:50:42327 channel_receive_->SetChannelOutputVolumeScaling(gain);
solenberg217fb662016-06-17 15:30:54328}
329
Ruslan Burakov3b50f9f2019-02-06 08:45:56330bool AudioReceiveStream::SetBaseMinimumPlayoutDelayMs(int delay_ms) {
331 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
332 return channel_receive_->SetBaseMinimumPlayoutDelayMs(delay_ms);
333}
334
335int AudioReceiveStream::GetBaseMinimumPlayoutDelayMs() const {
336 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
337 return channel_receive_->GetBaseMinimumPlayoutDelayMs();
338}
339
hbos8d609f62017-04-10 14:39:05340std::vector<RtpSource> AudioReceiveStream::GetSources() const {
341 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Chen Xing054e3bb2019-08-02 10:29:26342 return source_tracker_.GetSources();
hbos8d609f62017-04-10 14:39:05343}
344
solenberg3ebbcb52017-01-31 11:58:40345AudioMixer::Source::AudioFrameInfo AudioReceiveStream::GetAudioFrameWithInfo(
346 int sample_rate_hz,
347 AudioFrame* audio_frame) {
Chen Xing054e3bb2019-08-02 10:29:26348 AudioMixer::Source::AudioFrameInfo audio_frame_info =
349 channel_receive_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame);
350 if (audio_frame_info != AudioMixer::Source::AudioFrameInfo::kError) {
351 source_tracker_.OnFrameDelivered(audio_frame->packet_infos_);
352 }
353 return audio_frame_info;
solenberg3ebbcb52017-01-31 11:58:40354}
355
356int AudioReceiveStream::Ssrc() const {
357 return config_.rtp.remote_ssrc;
358}
359
360int AudioReceiveStream::PreferredSampleRate() const {
Niels Möller349ade32018-11-16 08:50:42361 return channel_receive_->PreferredSampleRate();
solenberg3ebbcb52017-01-31 11:58:40362}
363
Åsa Persson74d2b1d2020-02-10 15:33:29364uint32_t AudioReceiveStream::id() const {
solenberg3ebbcb52017-01-31 11:58:40365 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
366 return config_.rtp.remote_ssrc;
367}
368
Danil Chapovalovb9b146c2018-06-15 10:28:07369absl::optional<Syncable::Info> AudioReceiveStream::GetInfo() const {
Tomas Gunnarsson0f030fd2021-04-01 18:12:04370 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
371 // expect to be called on the network thread.
372 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
373 return channel_receive_->GetSyncInfo();
solenberg3ebbcb52017-01-31 11:58:40374}
375
Åsa Perssonfcf79cc2019-10-22 13:23:44376bool AudioReceiveStream::GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp,
377 int64_t* time_ms) const {
solenberg3ebbcb52017-01-31 11:58:40378 // Called on video capture thread.
Åsa Perssonfcf79cc2019-10-22 13:23:44379 return channel_receive_->GetPlayoutRtpTimestamp(rtp_timestamp, time_ms);
380}
381
382void AudioReceiveStream::SetEstimatedPlayoutNtpTimestampMs(
383 int64_t ntp_timestamp_ms,
384 int64_t time_ms) {
385 // Called on video capture thread.
386 channel_receive_->SetEstimatedPlayoutNtpTimestampMs(ntp_timestamp_ms,
387 time_ms);
solenberg3ebbcb52017-01-31 11:58:40388}
389
Ivo Creusenbef7b052020-09-08 14:30:25390bool AudioReceiveStream::SetMinimumPlayoutDelay(int delay_ms) {
Tomas Gunnarsson0f030fd2021-04-01 18:12:04391 // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer,
392 // expect to be called on the network thread.
393 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller349ade32018-11-16 08:50:42394 return channel_receive_->SetMinimumPlayoutDelay(delay_ms);
pbosa2f30de2015-10-15 12:22:13395}
396
solenberg7602aab2016-11-14 19:30:07397void AudioReceiveStream::AssociateSendStream(AudioSendStream* send_stream) {
Tommi02df2eb2021-05-31 10:57:53398 RTC_DCHECK_RUN_ON(&network_thread_checker_);
Niels Möller349ade32018-11-16 08:50:42399 channel_receive_->SetAssociatedSendChannel(
400 send_stream ? send_stream->GetChannel() : nullptr);
Fredrik Solenberg8f5787a2018-01-11 12:52:30401 associated_send_stream_ = send_stream;
solenberg7602aab2016-11-14 19:30:07402}
403
Niels Möller8fb1a6a2019-03-05 13:29:42404void AudioReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) {
pbos1ba8d392016-05-02 03:18:34405 // TODO(solenberg): Tests call this function on a network thread, libjingle
406 // calls on the worker thread. We should move towards always using a network
407 // thread. Then this check can be enabled.
Sebastian Janssonc01367d2019-04-08 13:20:44408 // RTC_DCHECK(!thread_checker_.IsCurrent());
Niels Möller8fb1a6a2019-03-05 13:29:42409 channel_receive_->ReceivedRTCPPacket(packet, length);
pbos1ba8d392016-05-02 03:18:34410}
411
solenberg3ebbcb52017-01-31 11:58:40412const webrtc::AudioReceiveStream::Config& AudioReceiveStream::config() const {
413 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
414 return config_;
aleloi04c07222016-11-22 14:42:53415}
416
Yves Gerey665174f2018-06-19 13:03:05417const AudioSendStream* AudioReceiveStream::GetAssociatedSendStreamForTesting()
418 const {
Tommi02df2eb2021-05-31 10:57:53419 RTC_DCHECK_RUN_ON(&network_thread_checker_);
Fredrik Solenberg8f5787a2018-01-11 12:52:30420 return associated_send_stream_;
Fredrik Solenberg23fba1f2015-04-29 13:24:01421}
aleloi04c07222016-11-22 14:42:53422
solenberg3ebbcb52017-01-31 11:58:40423internal::AudioState* AudioReceiveStream::audio_state() const {
424 auto* audio_state = static_cast<internal::AudioState*>(audio_state_.get());
425 RTC_DCHECK(audio_state);
426 return audio_state;
427}
Fredrik Solenberg23fba1f2015-04-29 13:24:01428} // namespace internal
429} // namespace webrtc