blob: 6deb4f1419767c12eac83aaeca3c214d7c60411e [file] [log] [blame]
Niels Möller530ead42018-10-04 14:28:39 +02001/*
2 * Copyright (c) 2012 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
11#include "audio/channel_send.h"
12
13#include <algorithm>
14#include <map>
15#include <memory>
16#include <string>
17#include <utility>
18#include <vector>
19
Niels Möller530ead42018-10-04 14:28:39 +020020#include "api/array_view.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010021#include "api/call/transport.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "api/crypto/frame_encryptor_interface.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020023#include "api/rtc_event_log/rtc_event_log.h"
Artem Titovd15a5752021-02-10 14:31:24 +010024#include "api/sequence_checker.h"
Marina Ciocea65674d82020-03-31 22:41:30 +020025#include "audio/channel_send_frame_transformer_delegate.h"
Niels Möller530ead42018-10-04 14:28:39 +020026#include "audio/utility/audio_frame_operations.h"
27#include "call/rtp_transport_controller_send_interface.h"
28#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
Niels Möller530ead42018-10-04 14:28:39 +020029#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010030#include "modules/audio_coding/include/audio_coding_module.h"
31#include "modules/audio_processing/rms_level.h"
Niels Möller530ead42018-10-04 14:28:39 +020032#include "modules/pacing/packet_router.h"
Tomas Gunnarssonfae05622020-06-03 08:54:39 +020033#include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
Niels Möller530ead42018-10-04 14:28:39 +020034#include "rtc_base/checks.h"
Yves Gerey2e00abc2018-10-05 15:39:24 +020035#include "rtc_base/event.h"
Niels Möller530ead42018-10-04 14:28:39 +020036#include "rtc_base/format_macros.h"
37#include "rtc_base/location.h"
38#include "rtc_base/logging.h"
Niels Möller26815232018-11-16 09:32:40 +010039#include "rtc_base/numerics/safe_conversions.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010040#include "rtc_base/race_checker.h"
Niels Möller530ead42018-10-04 14:28:39 +020041#include "rtc_base/rate_limiter.h"
Markus Handell62872802020-07-06 15:15:07 +020042#include "rtc_base/synchronization/mutex.h"
Niels Möller530ead42018-10-04 14:28:39 +020043#include "rtc_base/task_queue.h"
Steve Anton10542f22019-01-11 09:11:00 -080044#include "rtc_base/time_utils.h"
Sebastian Jansson977b3352019-03-04 17:43:34 +010045#include "system_wrappers/include/clock.h"
Niels Möller530ead42018-10-04 14:28:39 +020046#include "system_wrappers/include/metrics.h"
47
48namespace webrtc {
49namespace voe {
50
51namespace {
52
53constexpr int64_t kMaxRetransmissionWindowMs = 1000;
54constexpr int64_t kMinRetransmissionWindowMs = 30;
55
Niels Möllerdced9f62018-11-19 10:27:07 +010056class RtpPacketSenderProxy;
Niels Möllerdced9f62018-11-19 10:27:07 +010057class TransportSequenceNumberProxy;
58class VoERtcpObserver;
59
Benjamin Wright17b050f2019-03-13 17:35:46 -070060class ChannelSend : public ChannelSendInterface,
Jakob Ivarssone91c9922021-07-06 09:55:43 +020061 public AudioPacketizationCallback, // receive encoded
62 // packets from the ACM
63 public RtcpPacketTypeCounterObserver {
Niels Möllerdced9f62018-11-19 10:27:07 +010064 public:
65 // TODO(nisse): Make OnUplinkPacketLossRate public, and delete friend
66 // declaration.
67 friend class VoERtcpObserver;
68
Sebastian Jansson977b3352019-03-04 17:43:34 +010069 ChannelSend(Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +010070 TaskQueueFactory* task_queue_factory,
Niels Möllere9771992018-11-26 10:55:07 +010071 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +010072 RtcpRttStats* rtcp_rtt_stats,
73 RtcEventLog* rtc_event_log,
74 FrameEncryptorInterface* frame_encryptor,
75 const webrtc::CryptoOptions& crypto_options,
76 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +020077 int rtcp_report_interval_ms,
Marina Ciocead2aa8f92020-03-31 11:29:56 +020078 uint32_t ssrc,
Erik Språng2b4d2f32020-06-29 16:37:44 +020079 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Jonas Orelanda943e732022-03-16 13:50:58 +010080 TransportFeedbackObserver* feedback_observer,
Jonas Orelande62c2f22022-03-29 11:04:48 +020081 const FieldTrialsView& field_trials);
Niels Möllerdced9f62018-11-19 10:27:07 +010082
83 ~ChannelSend() override;
84
85 // Send using this encoder, with this payload type.
Niels Möller8fb1a6a2019-03-05 14:29:42 +010086 void SetEncoder(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +010087 std::unique_ptr<AudioEncoder> encoder) override;
88 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
89 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +010090 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +010091
92 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +010093 void StartSend() override;
94 void StopSend() override;
95
96 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +010097 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Jakob Ivarssonbf087452021-11-11 13:43:49 +010098 int GetTargetBitrate() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +010099
100 // Network
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100101 void ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100102
103 // Muting, Volume and Level.
104 void SetInputMute(bool enable) override;
105
106 // Stats.
107 ANAStats GetANAStatistics() const override;
108
109 // Used by AudioSendStream.
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200110 RtpRtcpInterface* GetRtpRtcp() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100111
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100112 void RegisterCngPayloadType(int payload_type, int payload_frequency) override;
113
Niels Möllerdced9f62018-11-19 10:27:07 +0100114 // DTMF.
115 bool SendTelephoneEventOutband(int event, int duration_ms) override;
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100116 void SetSendTelephoneEventPayloadType(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100117 int payload_frequency) override;
118
119 // RTP+RTCP
Niels Möllerdced9f62018-11-19 10:27:07 +0100120 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100121
122 void RegisterSenderCongestionControlObjects(
123 RtpTransportControllerSendInterface* transport,
124 RtcpBandwidthObserver* bandwidth_observer) override;
125 void ResetSenderCongestionControlObjects() override;
126 void SetRTCP_CNAME(absl::string_view c_name) override;
127 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
128 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100129
130 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
131 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
132 // the actual processing of the audio takes place. The processing mainly
133 // consists of encoding and preparing the result for sending by adding it to a
134 // send queue.
135 // The main reason for using a task queue here is to release the native,
136 // OS-specific, audio capture thread as soon as possible to ensure that it
137 // can go back to sleep and be prepared to deliver an new captured audio
138 // packet.
139 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
140
Niels Möllerdced9f62018-11-19 10:27:07 +0100141 int64_t GetRTT() const override;
142
143 // E2EE Custom Audio Frame Encryption
144 void SetFrameEncryptor(
145 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
146
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200147 // Sets a frame transformer between encoder and packetizer, to transform
148 // encoded frames before sending them out the network.
149 void SetEncoderToPacketizerFrameTransformer(
150 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
151 override;
152
Jakob Ivarssone91c9922021-07-06 09:55:43 +0200153 // RtcpPacketTypeCounterObserver.
154 void RtcpPacketTypesCounterUpdated(
155 uint32_t ssrc,
156 const RtcpPacketTypeCounter& packet_counter) override;
157
Niels Möllerdced9f62018-11-19 10:27:07 +0100158 private:
Niels Möllerdced9f62018-11-19 10:27:07 +0100159 // From AudioPacketizationCallback in the ACM
Niels Möller87e2d782019-03-07 10:18:23 +0100160 int32_t SendData(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100161 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 13:45:50 +0100162 uint32_t rtp_timestamp,
Niels Möllerdced9f62018-11-19 10:27:07 +0100163 const uint8_t* payloadData,
Minyue Liff0e4db2020-01-23 13:45:50 +0100164 size_t payloadSize,
165 int64_t absolute_capture_timestamp_ms) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100166
Niels Möllerdced9f62018-11-19 10:27:07 +0100167 void OnUplinkPacketLossRate(float packet_loss_rate);
168 bool InputMute() const;
169
Niels Möller87e2d782019-03-07 10:18:23 +0100170 int32_t SendRtpAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100171 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 13:45:50 +0100172 uint32_t rtp_timestamp,
173 rtc::ArrayView<const uint8_t> payload,
174 int64_t absolute_capture_timestamp_ms)
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100175 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100176
Niels Möllerdced9f62018-11-19 10:27:07 +0100177 void OnReceivedRtt(int64_t rtt_ms);
178
Marina Ciocea65674d82020-03-31 22:41:30 +0200179 void InitFrameTransformerDelegate(
180 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer);
181
Niels Möllerdced9f62018-11-19 10:27:07 +0100182 // Thread checkers document and lock usage of some methods on voe::Channel to
183 // specific threads we know about. The goal is to eventually split up
184 // voe::Channel into parts with single-threaded semantics, and thereby reduce
185 // the need for locks.
Artem Titovc8421c42021-02-02 10:57:19 +0100186 SequenceChecker worker_thread_checker_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100187 // Methods accessed from audio and video threads are checked for sequential-
188 // only access. We don't necessarily own and control these threads, so thread
189 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
190 // audio thread to another, but access is still sequential.
191 rtc::RaceChecker audio_thread_race_checker_;
192
Markus Handell62872802020-07-06 15:15:07 +0200193 mutable Mutex volume_settings_mutex_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100194
Jakob Ivarssone91c9922021-07-06 09:55:43 +0200195 const uint32_t ssrc_;
Niels Möller26e88b02018-11-19 15:08:13 +0100196 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100197
198 RtcEventLog* const event_log_;
199
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200200 std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100201 std::unique_ptr<RTPSenderAudio> rtp_sender_audio_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100202
203 std::unique_ptr<AudioCodingModule> audio_coding_;
204 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
205
Niels Möllerdced9f62018-11-19 10:27:07 +0100206 // uses
Niels Möllerdced9f62018-11-19 10:27:07 +0100207 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
Markus Handell62872802020-07-06 15:15:07 +0200208 bool input_mute_ RTC_GUARDED_BY(volume_settings_mutex_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100209 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
210 // VoeRTP_RTCP
211 // TODO(henrika): can today be accessed on the main thread and on the
212 // task queue; hence potential race.
213 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800214
Niels Möllerdced9f62018-11-19 10:27:07 +0100215 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100216 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100217
Niels Möller985a1f32018-11-19 16:08:42 +0100218 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
219 nullptr;
Erik Språng2b4d2f32020-06-29 16:37:44 +0200220 TransportFeedbackObserver* const feedback_observer_;
Erik Språng59b86542019-06-23 18:24:46 +0200221 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_pacer_proxy_;
Niels Möller985a1f32018-11-19 16:08:42 +0100222 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100223
Artem Titovc8421c42021-02-02 10:57:19 +0100224 SequenceChecker construction_thread_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100225
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100226 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100227
Niels Möllerdced9f62018-11-19 10:27:07 +0100228 // E2EE Audio Frame Encryption
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100229 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_
230 RTC_GUARDED_BY(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100231 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100232 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100233
Marina Ciocea65674d82020-03-31 22:41:30 +0200234 // Delegates calls to a frame transformer to transform audio, and
235 // receives callbacks with the transformed frames; delegates calls to
236 // ChannelSend::SendRtpAudio to send the transformed audio.
237 rtc::scoped_refptr<ChannelSendFrameTransformerDelegate>
238 frame_transformer_delegate_ RTC_GUARDED_BY(encoder_queue_);
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200239
Minyue Li49dbad02021-01-26 12:50:06 +0100240 const bool fixing_timestamp_stall_;
Jakob Ivarssone91c9922021-07-06 09:55:43 +0200241
242 mutable Mutex rtcp_counter_mutex_;
243 RtcpPacketTypeCounter rtcp_packet_type_counter_
244 RTC_GUARDED_BY(rtcp_counter_mutex_);
Danil Chapovalov8a1a0af2022-04-14 16:51:35 +0200245
246 // Defined last to ensure that there are no running tasks when the other
247 // members are destroyed.
248 rtc::TaskQueue encoder_queue_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100249};
Niels Möller530ead42018-10-04 14:28:39 +0200250
251const int kTelephoneEventAttenuationdB = 10;
252
Erik Språngaa59eca2019-07-24 14:52:55 +0200253class RtpPacketSenderProxy : public RtpPacketSender {
Niels Möller530ead42018-10-04 14:28:39 +0200254 public:
Erik Språng59b86542019-06-23 18:24:46 +0200255 RtpPacketSenderProxy() : rtp_packet_pacer_(nullptr) {}
Niels Möller530ead42018-10-04 14:28:39 +0200256
Erik Språngaa59eca2019-07-24 14:52:55 +0200257 void SetPacketPacer(RtpPacketSender* rtp_packet_pacer) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200258 RTC_DCHECK(thread_checker_.IsCurrent());
Markus Handell62872802020-07-06 15:15:07 +0200259 MutexLock lock(&mutex_);
Erik Språng59b86542019-06-23 18:24:46 +0200260 rtp_packet_pacer_ = rtp_packet_pacer;
261 }
262
Erik Språngea55b082019-10-02 14:57:46 +0200263 void EnqueuePackets(
264 std::vector<std::unique_ptr<RtpPacketToSend>> packets) override {
Markus Handell62872802020-07-06 15:15:07 +0200265 MutexLock lock(&mutex_);
Erik Språngea55b082019-10-02 14:57:46 +0200266 rtp_packet_pacer_->EnqueuePackets(std::move(packets));
Niels Möller530ead42018-10-04 14:28:39 +0200267 }
268
Niels Möller530ead42018-10-04 14:28:39 +0200269 private:
Artem Titovc8421c42021-02-02 10:57:19 +0100270 SequenceChecker thread_checker_;
Markus Handell62872802020-07-06 15:15:07 +0200271 Mutex mutex_;
272 RtpPacketSender* rtp_packet_pacer_ RTC_GUARDED_BY(&mutex_);
Niels Möller530ead42018-10-04 14:28:39 +0200273};
274
275class VoERtcpObserver : public RtcpBandwidthObserver {
276 public:
277 explicit VoERtcpObserver(ChannelSend* owner)
278 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100279 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200280
281 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
Markus Handell62872802020-07-06 15:15:07 +0200282 MutexLock lock(&mutex_);
Niels Möller530ead42018-10-04 14:28:39 +0200283 bandwidth_observer_ = bandwidth_observer;
284 }
285
286 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
Markus Handell62872802020-07-06 15:15:07 +0200287 MutexLock lock(&mutex_);
Niels Möller530ead42018-10-04 14:28:39 +0200288 if (bandwidth_observer_) {
289 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
290 }
291 }
292
293 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
294 int64_t rtt,
295 int64_t now_ms) override {
296 {
Markus Handell62872802020-07-06 15:15:07 +0200297 MutexLock lock(&mutex_);
Niels Möller530ead42018-10-04 14:28:39 +0200298 if (bandwidth_observer_) {
299 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
300 now_ms);
301 }
302 }
303 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
304 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
305 // report for VoiceEngine?
306 if (report_blocks.empty())
307 return;
308
309 int fraction_lost_aggregate = 0;
310 int total_number_of_packets = 0;
311
312 // If receiving multiple report blocks, calculate the weighted average based
313 // on the number of packets a report refers to.
314 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
315 block_it != report_blocks.end(); ++block_it) {
316 // Find the previous extended high sequence number for this remote SSRC,
317 // to calculate the number of RTP packets this report refers to. Ignore if
318 // we haven't seen this SSRC before.
319 std::map<uint32_t, uint32_t>::iterator seq_num_it =
320 extended_max_sequence_number_.find(block_it->source_ssrc);
321 int number_of_packets = 0;
322 if (seq_num_it != extended_max_sequence_number_.end()) {
323 number_of_packets =
324 block_it->extended_highest_sequence_number - seq_num_it->second;
325 }
326 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
327 total_number_of_packets += number_of_packets;
328
329 extended_max_sequence_number_[block_it->source_ssrc] =
330 block_it->extended_highest_sequence_number;
331 }
332 int weighted_fraction_lost = 0;
333 if (total_number_of_packets > 0) {
334 weighted_fraction_lost =
335 (fraction_lost_aggregate + total_number_of_packets / 2) /
336 total_number_of_packets;
337 }
338 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
339 }
340
341 private:
342 ChannelSend* owner_;
343 // Maps remote side ssrc to extended highest sequence number received.
344 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
Markus Handell62872802020-07-06 15:15:07 +0200345 Mutex mutex_;
346 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(mutex_);
Niels Möller530ead42018-10-04 14:28:39 +0200347};
348
Niels Möller87e2d782019-03-07 10:18:23 +0100349int32_t ChannelSend::SendData(AudioFrameType frameType,
Niels Möller530ead42018-10-04 14:28:39 +0200350 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 13:45:50 +0100351 uint32_t rtp_timestamp,
Niels Möller530ead42018-10-04 14:28:39 +0200352 const uint8_t* payloadData,
Minyue Liff0e4db2020-01-23 13:45:50 +0100353 size_t payloadSize,
354 int64_t absolute_capture_timestamp_ms) {
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100355 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200356 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
Marina Ciocea65674d82020-03-31 22:41:30 +0200357 if (frame_transformer_delegate_) {
358 // Asynchronously transform the payload before sending it. After the payload
359 // is transformed, the delegate will call SendRtpAudio to send it.
360 frame_transformer_delegate_->Transform(
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200361 frameType, payloadType, rtp_timestamp, rtp_rtcp_->StartTimestamp(),
Philipp Hanckeb9d46852020-04-14 15:26:05 +0200362 payloadData, payloadSize, absolute_capture_timestamp_ms,
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200363 rtp_rtcp_->SSRC());
Marina Ciocea65674d82020-03-31 22:41:30 +0200364 return 0;
365 }
Minyue Liff0e4db2020-01-23 13:45:50 +0100366 return SendRtpAudio(frameType, payloadType, rtp_timestamp, payload,
367 absolute_capture_timestamp_ms);
Niels Möller7d76a312018-10-26 12:57:07 +0200368}
369
Niels Möller87e2d782019-03-07 10:18:23 +0100370int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200371 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 13:45:50 +0100372 uint32_t rtp_timestamp,
373 rtc::ArrayView<const uint8_t> payload,
374 int64_t absolute_capture_timestamp_ms) {
Niels Möller530ead42018-10-04 14:28:39 +0200375 if (_includeAudioLevelIndication) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100376 // Store current audio level in the RTP sender.
Niels Möller530ead42018-10-04 14:28:39 +0200377 // The level will be used in combination with voice-activity state
378 // (frameType) to add an RTP header extension
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100379 rtp_sender_audio_->SetAudioLevel(rms_level_.Average());
Niels Möller530ead42018-10-04 14:28:39 +0200380 }
381
Benjamin Wright84583f62018-10-04 14:22:34 -0700382 // E2EE Custom Audio Frame Encryption (This is optional).
383 // Keep this buffer around for the lifetime of the send call.
384 rtc::Buffer encrypted_audio_payload;
Minyue Li9ab520e2019-05-28 13:27:40 +0200385 // We don't invoke encryptor if payload is empty, which means we are to send
386 // DTMF, or the encoder entered DTX.
387 // TODO(minyue): see whether DTMF packets should be encrypted or not. In
388 // current implementation, they are not.
Minyue Lif48bca72019-06-20 23:37:02 +0200389 if (!payload.empty()) {
390 if (frame_encryptor_ != nullptr) {
391 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
392 // Allocate a buffer to hold the maximum possible encrypted payload.
393 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
394 cricket::MEDIA_TYPE_AUDIO, payload.size());
395 encrypted_audio_payload.SetSize(max_ciphertext_size);
Benjamin Wright84583f62018-10-04 14:22:34 -0700396
Minyue Lif48bca72019-06-20 23:37:02 +0200397 // Encrypt the audio payload into the buffer.
398 size_t bytes_written = 0;
399 int encrypt_status = frame_encryptor_->Encrypt(
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200400 cricket::MEDIA_TYPE_AUDIO, rtp_rtcp_->SSRC(),
Minyue Lif48bca72019-06-20 23:37:02 +0200401 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
402 &bytes_written);
403 if (encrypt_status != 0) {
404 RTC_DLOG(LS_ERROR)
405 << "Channel::SendData() failed encrypt audio payload: "
406 << encrypt_status;
407 return -1;
408 }
409 // Resize the buffer to the exact number of bytes actually used.
410 encrypted_audio_payload.SetSize(bytes_written);
411 // Rewrite the payloadData and size to the new encrypted payload.
412 payload = encrypted_audio_payload;
413 } else if (crypto_options_.sframe.require_frame_encryption) {
414 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
Jonas Olssonb2b20312020-01-14 12:11:31 +0100415 "A frame encryptor is required but one is not set.";
Benjamin Wright84583f62018-10-04 14:22:34 -0700416 return -1;
417 }
Benjamin Wright84583f62018-10-04 14:22:34 -0700418 }
419
Niels Möller530ead42018-10-04 14:28:39 +0200420 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
421 // packetization.
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200422 if (!rtp_rtcp_->OnSendingRtpFrame(rtp_timestamp,
423 // Leaving the time when this frame was
424 // received from the capture device as
425 // undefined for voice for now.
426 -1, payloadType,
427 /*force_sender_report=*/false)) {
Mirko Bonadeif2c08182019-11-27 08:47:51 +0100428 return -1;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100429 }
430
431 // RTCPSender has it's own copy of the timestamp offset, added in
432 // RTCPSender::BuildSR, hence we must not add the in the offset for the above
433 // call.
434 // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
435 // knowledge of the offset to a single place.
Minyue Liff0e4db2020-01-23 13:45:50 +0100436
Niels Möller530ead42018-10-04 14:28:39 +0200437 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Minyue Liff0e4db2020-01-23 13:45:50 +0100438 if (!rtp_sender_audio_->SendAudio(
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200439 frameType, payloadType, rtp_timestamp + rtp_rtcp_->StartTimestamp(),
440 payload.data(), payload.size(), absolute_capture_timestamp_ms)) {
Niels Möller530ead42018-10-04 14:28:39 +0200441 RTC_DLOG(LS_ERROR)
442 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
443 return -1;
444 }
445
446 return 0;
447}
448
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200449ChannelSend::ChannelSend(
450 Clock* clock,
451 TaskQueueFactory* task_queue_factory,
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200452 Transport* rtp_transport,
453 RtcpRttStats* rtcp_rtt_stats,
454 RtcEventLog* rtc_event_log,
455 FrameEncryptorInterface* frame_encryptor,
456 const webrtc::CryptoOptions& crypto_options,
457 bool extmap_allow_mixed,
458 int rtcp_report_interval_ms,
459 uint32_t ssrc,
Erik Språng2b4d2f32020-06-29 16:37:44 +0200460 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Jonas Orelanda943e732022-03-16 13:50:58 +0100461 TransportFeedbackObserver* feedback_observer,
Jonas Orelande62c2f22022-03-29 11:04:48 +0200462 const FieldTrialsView& field_trials)
Jakob Ivarssone91c9922021-07-06 09:55:43 +0200463 : ssrc_(ssrc),
464 event_log_(rtc_event_log),
Niels Möller530ead42018-10-04 14:28:39 +0200465 _timeStamp(0), // This is just an offset, RTP module will add it's own
466 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200467 input_mute_(false),
468 previous_frame_muted_(false),
469 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200470 rtcp_observer_(new VoERtcpObserver(this)),
Erik Språng2b4d2f32020-06-29 16:37:44 +0200471 feedback_observer_(feedback_observer),
Erik Språng59b86542019-06-23 18:24:46 +0200472 rtp_packet_pacer_proxy_(new RtpPacketSenderProxy()),
Sebastian Jansson977b3352019-03-04 17:43:34 +0100473 retransmission_rate_limiter_(
474 new RateLimiter(clock, kMaxRetransmissionWindowMs)),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700475 frame_encryptor_(frame_encryptor),
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100476 crypto_options_(crypto_options),
Danil Chapovalov8a1a0af2022-04-14 16:51:35 +0200477 fixing_timestamp_stall_(
478 field_trials.IsDisabled("WebRTC-Audio-FixTimestampStall")),
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100479 encoder_queue_(task_queue_factory->CreateTaskQueue(
480 "AudioEncoder",
Danil Chapovalov8a1a0af2022-04-14 16:51:35 +0200481 TaskQueueFactory::Priority::NORMAL)) {
Niels Möller530ead42018-10-04 14:28:39 +0200482 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
483
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200484 RtpRtcpInterface::Configuration configuration;
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800485 configuration.bandwidth_callback = rtcp_observer_.get();
Erik Språng2b4d2f32020-06-29 16:37:44 +0200486 configuration.transport_feedback_callback = feedback_observer_;
Mirko Bonadeif2c08182019-11-27 08:47:51 +0100487 configuration.clock = (clock ? clock : Clock::GetRealTimeClock());
Niels Möller530ead42018-10-04 14:28:39 +0200488 configuration.audio = true;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100489 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200490
Erik Språng59b86542019-06-23 18:24:46 +0200491 configuration.paced_sender = rtp_packet_pacer_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200492
493 configuration.event_log = event_log_;
494 configuration.rtt_stats = rtcp_rtt_stats;
495 configuration.retransmission_rate_limiter =
496 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100497 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800498 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Jakob Ivarssone91c9922021-07-06 09:55:43 +0200499 configuration.rtcp_packet_type_counter_observer = this;
Niels Möller530ead42018-10-04 14:28:39 +0200500
Erik Språng54d5d2c2019-08-20 17:22:36 +0200501 configuration.local_media_ssrc = ssrc;
Erik Språng4c2c4122019-07-11 15:20:15 +0200502
Niels Moller2accc7d2021-01-12 15:54:16 +0000503 rtp_rtcp_ = ModuleRtpRtcpImpl2::Create(configuration);
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200504 rtp_rtcp_->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200505
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200506 rtp_sender_audio_ = std::make_unique<RTPSenderAudio>(configuration.clock,
507 rtp_rtcp_->RtpSender());
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100508
Niels Möller530ead42018-10-04 14:28:39 +0200509 // Ensure that RTCP is enabled by default for the created channel.
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200510 rtp_rtcp_->SetRTCPStatus(RtcpMode::kCompound);
Niels Möller530ead42018-10-04 14:28:39 +0200511
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100512 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200513 RTC_DCHECK_EQ(0, error);
Marina Ciocea65674d82020-03-31 22:41:30 +0200514 if (frame_transformer)
515 InitFrameTransformerDelegate(std::move(frame_transformer));
Niels Möller530ead42018-10-04 14:28:39 +0200516}
517
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100518ChannelSend::~ChannelSend() {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200519 RTC_DCHECK(construction_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200520
Marina Ciocea65674d82020-03-31 22:41:30 +0200521 // Resets the delegate's callback to ChannelSend::SendRtpAudio.
522 if (frame_transformer_delegate_)
523 frame_transformer_delegate_->Reset();
524
Niels Möller530ead42018-10-04 14:28:39 +0200525 StopSend();
Niels Möller530ead42018-10-04 14:28:39 +0200526 int error = audio_coding_->RegisterTransportCallback(NULL);
527 RTC_DCHECK_EQ(0, error);
Niels Möller530ead42018-10-04 14:28:39 +0200528}
529
Niels Möller26815232018-11-16 09:32:40 +0100530void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100531 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100532 RTC_DCHECK(!sending_);
533 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200534
Erik Språng69dd1422021-08-12 16:15:00 +0200535 RTC_DCHECK(packet_router_);
536 packet_router_->AddSendRtpModule(rtp_rtcp_.get(), /*remb_candidate=*/false);
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200537 rtp_rtcp_->SetSendingMediaStatus(true);
538 int ret = rtp_rtcp_->SetSendingStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100539 RTC_DCHECK_EQ(0, ret);
Erik Språng69dd1422021-08-12 16:15:00 +0200540
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100541 // It is now OK to start processing on the encoder task queue.
542 encoder_queue_.PostTask([this] {
543 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200544 encoder_queue_is_active_ = true;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100545 });
Niels Möller530ead42018-10-04 14:28:39 +0200546}
547
548void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100549 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100550 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200551 return;
552 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100553 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200554
Niels Möllerc572ff32018-11-07 08:43:50 +0100555 rtc::Event flush;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100556 encoder_queue_.PostTask([this, &flush]() {
557 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200558 encoder_queue_is_active_ = false;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100559 flush.Set();
560 });
Niels Möller530ead42018-10-04 14:28:39 +0200561 flush.Wait(rtc::Event::kForever);
562
Niels Möller530ead42018-10-04 14:28:39 +0200563 // Reset sending SSRC and sequence number and triggers direct transmission
564 // of RTCP BYE
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200565 if (rtp_rtcp_->SetSendingStatus(false) == -1) {
Niels Möller530ead42018-10-04 14:28:39 +0200566 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
567 }
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200568 rtp_rtcp_->SetSendingMediaStatus(false);
Erik Språng69dd1422021-08-12 16:15:00 +0200569
570 RTC_DCHECK(packet_router_);
571 packet_router_->RemoveSendRtpModule(rtp_rtcp_.get());
Niels Möller530ead42018-10-04 14:28:39 +0200572}
573
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100574void ChannelSend::SetEncoder(int payload_type,
Niels Möller530ead42018-10-04 14:28:39 +0200575 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100576 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200577 RTC_DCHECK_GE(payload_type, 0);
578 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200579
580 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
581 // as well as some other things, so we collect this info and send it along.
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200582 rtp_rtcp_->RegisterSendPayloadFrequency(payload_type,
583 encoder->RtpTimestampRateHz());
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100584 rtp_sender_audio_->RegisterAudioPayload("audio", payload_type,
585 encoder->RtpTimestampRateHz(),
586 encoder->NumChannels(), 0);
Niels Möller530ead42018-10-04 14:28:39 +0200587
588 audio_coding_->SetEncoder(std::move(encoder));
Niels Möller530ead42018-10-04 14:28:39 +0200589}
590
591void ChannelSend::ModifyEncoder(
592 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800593 // This method can be called on the worker thread, module process thread
594 // or network thread. Audio coding is thread safe, so we do not need to
595 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200596 audio_coding_->ModifyEncoder(modifier);
597}
598
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100599void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
600 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
601 if (*encoder_ptr) {
602 modifier(encoder_ptr->get());
603 } else {
604 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
605 }
606 });
607}
608
Sebastian Jansson254d8692018-11-21 19:19:00 +0100609void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100610 // This method can be called on the worker thread, module process thread
611 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
612 // TODO(solenberg): Figure out a good way to check this or enforce calling
613 // rules.
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200614 // RTC_DCHECK(worker_thread_checker_.IsCurrent() ||
615 // module_process_thread_checker_.IsCurrent());
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100616 CallEncoder([&](AudioEncoder* encoder) {
617 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200618 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100619 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200620}
621
Jakob Ivarssonbf087452021-11-11 13:43:49 +0100622int ChannelSend::GetTargetBitrate() const {
623 return audio_coding_->GetTargetBitrate();
Niels Möller530ead42018-10-04 14:28:39 +0200624}
625
Niels Möller530ead42018-10-04 14:28:39 +0200626void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100627 CallEncoder([&](AudioEncoder* encoder) {
628 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200629 });
630}
631
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100632void ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Erik Språng2b4d2f32020-06-29 16:37:44 +0200633 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
634
Niels Möller530ead42018-10-04 14:28:39 +0200635 // Deliver RTCP packet to RTP/RTCP module for parsing
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200636 rtp_rtcp_->IncomingRtcpPacket(data, length);
Niels Möller530ead42018-10-04 14:28:39 +0200637
638 int64_t rtt = GetRTT();
639 if (rtt == 0) {
640 // Waiting for valid RTT.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100641 return;
Niels Möller530ead42018-10-04 14:28:39 +0200642 }
643
644 int64_t nack_window_ms = rtt;
645 if (nack_window_ms < kMinRetransmissionWindowMs) {
646 nack_window_ms = kMinRetransmissionWindowMs;
647 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
648 nack_window_ms = kMaxRetransmissionWindowMs;
649 }
650 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
651
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800652 OnReceivedRtt(rtt);
Niels Möller530ead42018-10-04 14:28:39 +0200653}
654
655void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100656 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Markus Handell62872802020-07-06 15:15:07 +0200657 MutexLock lock(&volume_settings_mutex_);
Niels Möller530ead42018-10-04 14:28:39 +0200658 input_mute_ = enable;
659}
660
661bool ChannelSend::InputMute() const {
Markus Handell62872802020-07-06 15:15:07 +0200662 MutexLock lock(&volume_settings_mutex_);
Niels Möller530ead42018-10-04 14:28:39 +0200663 return input_mute_;
664}
665
Niels Möller26815232018-11-16 09:32:40 +0100666bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100667 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200668 RTC_DCHECK_LE(0, event);
669 RTC_DCHECK_GE(255, event);
670 RTC_DCHECK_LE(0, duration_ms);
671 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100672 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100673 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200674 }
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100675 if (rtp_sender_audio_->SendTelephoneEvent(
Niels Möller530ead42018-10-04 14:28:39 +0200676 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100677 RTC_DLOG(LS_ERROR) << "SendTelephoneEvent() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100678 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200679 }
Niels Möller26815232018-11-16 09:32:40 +0100680 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200681}
682
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100683void ChannelSend::RegisterCngPayloadType(int payload_type,
684 int payload_frequency) {
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200685 rtp_rtcp_->RegisterSendPayloadFrequency(payload_type, payload_frequency);
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100686 rtp_sender_audio_->RegisterAudioPayload("CN", payload_type, payload_frequency,
687 1, 0);
688}
689
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100690void ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
Niels Möller26815232018-11-16 09:32:40 +0100691 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100692 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200693 RTC_DCHECK_LE(0, payload_type);
694 RTC_DCHECK_GE(127, payload_type);
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200695 rtp_rtcp_->RegisterSendPayloadFrequency(payload_type, payload_frequency);
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100696 rtp_sender_audio_->RegisterAudioPayload("telephone-event", payload_type,
697 payload_frequency, 0, 0);
Niels Möller530ead42018-10-04 14:28:39 +0200698}
699
Niels Möller26815232018-11-16 09:32:40 +0100700void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100701 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200702 _includeAudioLevelIndication = enable;
Sebastian Jansson6298b562020-01-14 17:55:19 +0100703 if (enable) {
Danil Chapovalovd0321c52021-09-14 12:58:51 +0200704 rtp_rtcp_->RegisterRtpHeaderExtension(AudioLevel::Uri(), id);
Sebastian Jansson6298b562020-01-14 17:55:19 +0100705 } else {
Danil Chapovalovd0321c52021-09-14 12:58:51 +0200706 rtp_rtcp_->DeregisterSendRtpHeaderExtension(AudioLevel::Uri());
Sebastian Jansson6298b562020-01-14 17:55:19 +0100707 }
Niels Möller530ead42018-10-04 14:28:39 +0200708}
709
710void ChannelSend::RegisterSenderCongestionControlObjects(
711 RtpTransportControllerSendInterface* transport,
712 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +0100713 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Erik Språngaa59eca2019-07-24 14:52:55 +0200714 RtpPacketSender* rtp_packet_pacer = transport->packet_sender();
Niels Möller530ead42018-10-04 14:28:39 +0200715 PacketRouter* packet_router = transport->packet_router();
716
Erik Språng59b86542019-06-23 18:24:46 +0200717 RTC_DCHECK(rtp_packet_pacer);
Niels Möller530ead42018-10-04 14:28:39 +0200718 RTC_DCHECK(packet_router);
719 RTC_DCHECK(!packet_router_);
720 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
Erik Språng59b86542019-06-23 18:24:46 +0200721 rtp_packet_pacer_proxy_->SetPacketPacer(rtp_packet_pacer);
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200722 rtp_rtcp_->SetStorePacketsStatus(true, 600);
Niels Möller530ead42018-10-04 14:28:39 +0200723 packet_router_ = packet_router;
724}
725
726void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +0100727 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200728 RTC_DCHECK(packet_router_);
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200729 rtp_rtcp_->SetStorePacketsStatus(false, 600);
Niels Möller530ead42018-10-04 14:28:39 +0200730 rtcp_observer_->SetBandwidthObserver(nullptr);
Niels Möller530ead42018-10-04 14:28:39 +0200731 packet_router_ = nullptr;
Erik Språng59b86542019-06-23 18:24:46 +0200732 rtp_packet_pacer_proxy_->SetPacketPacer(nullptr);
Niels Möller530ead42018-10-04 14:28:39 +0200733}
734
Niels Möller26815232018-11-16 09:32:40 +0100735void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +0100736 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +0100737 // Note: SetCNAME() accepts a c string of length at most 255.
738 const std::string c_name_limited(c_name.substr(0, 255));
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200739 int ret = rtp_rtcp_->SetCNAME(c_name_limited.c_str()) != 0;
Niels Möller26815232018-11-16 09:32:40 +0100740 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +0200741}
742
Niels Möller26815232018-11-16 09:32:40 +0100743std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +0100744 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200745 // Get the report blocks from the latest received RTCP Sender or Receiver
746 // Report. Each element in the vector contains the sender's SSRC and a
747 // report block according to RFC 3550.
Niels Möller26815232018-11-16 09:32:40 +0100748 std::vector<ReportBlock> report_blocks;
Danil Chapovalov5eda59c2021-02-18 20:53:28 +0100749 for (const ReportBlockData& data : rtp_rtcp_->GetLatestReportBlockData()) {
Niels Möller530ead42018-10-04 14:28:39 +0200750 ReportBlock report_block;
Danil Chapovalov5eda59c2021-02-18 20:53:28 +0100751 report_block.sender_SSRC = data.report_block().sender_ssrc;
752 report_block.source_SSRC = data.report_block().source_ssrc;
753 report_block.fraction_lost = data.report_block().fraction_lost;
754 report_block.cumulative_num_packets_lost = data.report_block().packets_lost;
Niels Möller530ead42018-10-04 14:28:39 +0200755 report_block.extended_highest_sequence_number =
Danil Chapovalov5eda59c2021-02-18 20:53:28 +0100756 data.report_block().extended_highest_sequence_number;
757 report_block.interarrival_jitter = data.report_block().jitter;
758 report_block.last_SR_timestamp =
759 data.report_block().last_sender_report_timestamp;
760 report_block.delay_since_last_SR =
761 data.report_block().delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +0100762 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +0200763 }
Niels Möller26815232018-11-16 09:32:40 +0100764 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +0200765}
766
Niels Möller26815232018-11-16 09:32:40 +0100767CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +0100768 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +0100769 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +0200770 stats.rttMs = GetRTT();
771
Henrik Boströmcf96e0f2019-04-17 13:51:53 +0200772 StreamDataCounters rtp_stats;
773 StreamDataCounters rtx_stats;
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200774 rtp_rtcp_->GetSendStreamDataCounters(&rtp_stats, &rtx_stats);
Niels Möllerac0a4cb2019-10-09 15:01:33 +0200775 stats.payload_bytes_sent =
776 rtp_stats.transmitted.payload_bytes + rtx_stats.transmitted.payload_bytes;
777 stats.header_and_padding_bytes_sent =
778 rtp_stats.transmitted.padding_bytes + rtp_stats.transmitted.header_bytes +
779 rtx_stats.transmitted.padding_bytes + rtx_stats.transmitted.header_bytes;
780
Henrik Boströmcf96e0f2019-04-17 13:51:53 +0200781 // TODO(https://crbug.com/webrtc/10555): RTX retransmissions should show up in
782 // separate outbound-rtp stream objects.
783 stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
784 stats.packetsSent =
785 rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
786 stats.retransmitted_packets_sent = rtp_stats.retransmitted.packets;
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200787 stats.report_block_datas = rtp_rtcp_->GetLatestReportBlockData();
Niels Möller530ead42018-10-04 14:28:39 +0200788
Jakob Ivarssone91c9922021-07-06 09:55:43 +0200789 {
790 MutexLock lock(&rtcp_counter_mutex_);
791 stats.nacks_rcvd = rtcp_packet_type_counter_.nack_packets;
792 }
793
Niels Möller26815232018-11-16 09:32:40 +0100794 return stats;
Niels Möller530ead42018-10-04 14:28:39 +0200795}
796
Jakob Ivarssone91c9922021-07-06 09:55:43 +0200797void ChannelSend::RtcpPacketTypesCounterUpdated(
798 uint32_t ssrc,
799 const RtcpPacketTypeCounter& packet_counter) {
800 if (ssrc != ssrc_) {
801 return;
802 }
803 MutexLock lock(&rtcp_counter_mutex_);
804 rtcp_packet_type_counter_ = packet_counter;
805}
806
Niels Möller530ead42018-10-04 14:28:39 +0200807void ChannelSend::ProcessAndEncodeAudio(
808 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100809 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200810 RTC_DCHECK_GT(audio_frame->samples_per_channel_, 0);
811 RTC_DCHECK_LE(audio_frame->num_channels_, 8);
812
Niels Möller530ead42018-10-04 14:28:39 +0200813 // Profile time between when the audio frame is added to the task queue and
814 // when the task is actually executed.
815 audio_frame->UpdateProfileTimeStamp();
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200816 encoder_queue_.PostTask(
817 [this, audio_frame = std::move(audio_frame)]() mutable {
818 RTC_DCHECK_RUN_ON(&encoder_queue_);
819 if (!encoder_queue_is_active_) {
Minyue Li49dbad02021-01-26 12:50:06 +0100820 if (fixing_timestamp_stall_) {
821 _timeStamp +=
822 static_cast<uint32_t>(audio_frame->samples_per_channel_);
823 }
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200824 return;
825 }
826 // Measure time between when the audio frame is added to the task queue
827 // and when the task is actually executed. Goal is to keep track of
828 // unwanted extra latency added by the task queue.
829 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
830 audio_frame->ElapsedProfileTimeMs());
Niels Möller530ead42018-10-04 14:28:39 +0200831
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200832 bool is_muted = InputMute();
833 AudioFrameOperations::Mute(audio_frame.get(), previous_frame_muted_,
834 is_muted);
Niels Möller530ead42018-10-04 14:28:39 +0200835
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200836 if (_includeAudioLevelIndication) {
837 size_t length =
838 audio_frame->samples_per_channel_ * audio_frame->num_channels_;
839 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
840 if (is_muted && previous_frame_muted_) {
841 rms_level_.AnalyzeMuted(length);
842 } else {
843 rms_level_.Analyze(
844 rtc::ArrayView<const int16_t>(audio_frame->data(), length));
845 }
846 }
847 previous_frame_muted_ = is_muted;
Niels Möller530ead42018-10-04 14:28:39 +0200848
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200849 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
Niels Möller530ead42018-10-04 14:28:39 +0200850
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200851 // The ACM resamples internally.
852 audio_frame->timestamp_ = _timeStamp;
853 // This call will trigger AudioPacketizationCallback::SendData if
854 // encoding is done and payload is ready for packetization and
855 // transmission. Otherwise, it will return without invoking the
856 // callback.
857 if (audio_coding_->Add10MsData(*audio_frame) < 0) {
858 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
859 return;
860 }
Niels Möller530ead42018-10-04 14:28:39 +0200861
Sebastian Janssonee5ec9a2019-09-17 20:34:03 +0200862 _timeStamp += static_cast<uint32_t>(audio_frame->samples_per_channel_);
863 });
Niels Möller530ead42018-10-04 14:28:39 +0200864}
865
Niels Möller530ead42018-10-04 14:28:39 +0200866ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +0100867 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200868 return audio_coding_->GetANAStats();
869}
870
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200871RtpRtcpInterface* ChannelSend::GetRtpRtcp() const {
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +0200872 return rtp_rtcp_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200873}
874
Niels Möller530ead42018-10-04 14:28:39 +0200875int64_t ChannelSend::GetRTT() const {
Danil Chapovalov5eda59c2021-02-18 20:53:28 +0100876 std::vector<ReportBlockData> report_blocks =
877 rtp_rtcp_->GetLatestReportBlockData();
Niels Möller530ead42018-10-04 14:28:39 +0200878 if (report_blocks.empty()) {
879 return 0;
880 }
881
Niels Möller530ead42018-10-04 14:28:39 +0200882 // We don't know in advance the remote ssrc used by the other end's receiver
Danil Chapovalov5eda59c2021-02-18 20:53:28 +0100883 // reports, so use the first report block for the RTT.
884 return report_blocks.front().last_rtt_ms();
Niels Möller530ead42018-10-04 14:28:39 +0200885}
886
Benjamin Wright78410ad2018-10-25 09:52:57 -0700887void ChannelSend::SetFrameEncryptor(
888 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +0100889 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100890 encoder_queue_.PostTask([this, frame_encryptor]() mutable {
891 RTC_DCHECK_RUN_ON(&encoder_queue_);
Sebastian Jansson7949f212019-03-05 13:41:48 +0000892 frame_encryptor_ = std::move(frame_encryptor);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100893 });
Benjamin Wright84583f62018-10-04 14:22:34 -0700894}
895
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200896void ChannelSend::SetEncoderToPacketizerFrameTransformer(
897 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
898 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Marina Ciocea65674d82020-03-31 22:41:30 +0200899 if (!frame_transformer)
900 return;
901
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200902 encoder_queue_.PostTask(
903 [this, frame_transformer = std::move(frame_transformer)]() mutable {
904 RTC_DCHECK_RUN_ON(&encoder_queue_);
Marina Ciocea65674d82020-03-31 22:41:30 +0200905 InitFrameTransformerDelegate(std::move(frame_transformer));
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200906 });
907}
908
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800909void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
910 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100911 CallEncoder(
912 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800913}
914
Marina Ciocea65674d82020-03-31 22:41:30 +0200915void ChannelSend::InitFrameTransformerDelegate(
916 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
917 RTC_DCHECK_RUN_ON(&encoder_queue_);
918 RTC_DCHECK(frame_transformer);
919 RTC_DCHECK(!frame_transformer_delegate_);
920
921 // Pass a callback to ChannelSend::SendRtpAudio, to be called by the delegate
922 // to send the transformed audio.
923 ChannelSendFrameTransformerDelegate::SendFrameCallback send_audio_callback =
924 [this](AudioFrameType frameType, uint8_t payloadType,
925 uint32_t rtp_timestamp, rtc::ArrayView<const uint8_t> payload,
926 int64_t absolute_capture_timestamp_ms) {
927 RTC_DCHECK_RUN_ON(&encoder_queue_);
928 return SendRtpAudio(frameType, payloadType, rtp_timestamp, payload,
929 absolute_capture_timestamp_ms);
930 };
931 frame_transformer_delegate_ =
Tomas Gunnarssonc1d58912021-04-22 19:21:43 +0200932 rtc::make_ref_counted<ChannelSendFrameTransformerDelegate>(
Marina Ciocea65674d82020-03-31 22:41:30 +0200933 std::move(send_audio_callback), std::move(frame_transformer),
934 &encoder_queue_);
935 frame_transformer_delegate_->Init();
936}
937
Niels Möllerdced9f62018-11-19 10:27:07 +0100938} // namespace
939
940std::unique_ptr<ChannelSendInterface> CreateChannelSend(
Sebastian Jansson977b3352019-03-04 17:43:34 +0100941 Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100942 TaskQueueFactory* task_queue_factory,
Niels Möllere9771992018-11-26 10:55:07 +0100943 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +0100944 RtcpRttStats* rtcp_rtt_stats,
945 RtcEventLog* rtc_event_log,
946 FrameEncryptorInterface* frame_encryptor,
947 const webrtc::CryptoOptions& crypto_options,
948 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +0200949 int rtcp_report_interval_ms,
Marina Ciocead2aa8f92020-03-31 11:29:56 +0200950 uint32_t ssrc,
Erik Språng2b4d2f32020-06-29 16:37:44 +0200951 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Jonas Orelanda943e732022-03-16 13:50:58 +0100952 TransportFeedbackObserver* feedback_observer,
Jonas Orelande62c2f22022-03-29 11:04:48 +0200953 const FieldTrialsView& field_trials) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200954 return std::make_unique<ChannelSend>(
Markus Handelleb61b7f2021-06-22 10:46:48 +0200955 clock, task_queue_factory, rtp_transport, rtcp_rtt_stats, rtc_event_log,
956 frame_encryptor, crypto_options, extmap_allow_mixed,
957 rtcp_report_interval_ms, ssrc, std::move(frame_transformer),
Jonas Orelanda943e732022-03-16 13:50:58 +0100958 feedback_observer, field_trials);
Niels Möllerdced9f62018-11-19 10:27:07 +0100959}
960
Niels Möller530ead42018-10-04 14:28:39 +0200961} // namespace voe
962} // namespace webrtc