blob: 19edf3c088b49e4c5c43cef84955c3753af23ed5 [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
20#include "absl/memory/memory.h"
21#include "api/array_view.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010022#include "api/call/transport.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/frame_encryptor_interface.h"
Niels Möller530ead42018-10-04 14:28:39 +020024#include "audio/utility/audio_frame_operations.h"
25#include "call/rtp_transport_controller_send_interface.h"
26#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
27#include "logging/rtc_event_log/rtc_event_log.h"
28#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010029#include "modules/audio_coding/include/audio_coding_module.h"
30#include "modules/audio_processing/rms_level.h"
Niels Möller530ead42018-10-04 14:28:39 +020031#include "modules/pacing/packet_router.h"
32#include "modules/utility/include/process_thread.h"
33#include "rtc_base/checks.h"
Sebastian Jansson7949f212019-03-05 13:41:48 +000034#include "rtc_base/critical_section.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"
42#include "rtc_base/task_queue.h"
43#include "rtc_base/thread_checker.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/field_trial.h"
47#include "system_wrappers/include/metrics.h"
48
49namespace webrtc {
50namespace voe {
51
52namespace {
53
54constexpr int64_t kMaxRetransmissionWindowMs = 1000;
55constexpr int64_t kMinRetransmissionWindowMs = 30;
56
Niels Möller7d76a312018-10-26 12:57:07 +020057MediaTransportEncodedAudioFrame::FrameType
Niels Möller87e2d782019-03-07 10:18:23 +010058MediaTransportFrameTypeForWebrtcFrameType(webrtc::AudioFrameType frame_type) {
Niels Möller7d76a312018-10-26 12:57:07 +020059 switch (frame_type) {
60 case kAudioFrameSpeech:
61 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
62 break;
63
64 case kAudioFrameCN:
65 return MediaTransportEncodedAudioFrame::FrameType::
66 kDiscontinuousTransmission;
67 break;
68
69 default:
70 RTC_CHECK(false) << "Unexpected frame type=" << frame_type;
71 break;
72 }
73}
74
Niels Möllerdced9f62018-11-19 10:27:07 +010075class RtpPacketSenderProxy;
76class TransportFeedbackProxy;
77class TransportSequenceNumberProxy;
78class VoERtcpObserver;
79
Niels Möllerdced9f62018-11-19 10:27:07 +010080class ChannelSend
81 : public ChannelSendInterface,
Niels Möllerdced9f62018-11-19 10:27:07 +010082 public AudioPacketizationCallback, // receive encoded packets from the
83 // ACM
84 public TargetTransferRateObserver {
85 public:
86 // TODO(nisse): Make OnUplinkPacketLossRate public, and delete friend
87 // declaration.
88 friend class VoERtcpObserver;
89
Sebastian Jansson977b3352019-03-04 17:43:34 +010090 ChannelSend(Clock* clock,
91 rtc::TaskQueue* encoder_queue,
Niels Möllerdced9f62018-11-19 10:27:07 +010092 ProcessThread* module_process_thread,
93 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -080094 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +010095 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +010096 RtcpRttStats* rtcp_rtt_stats,
97 RtcEventLog* rtc_event_log,
98 FrameEncryptorInterface* frame_encryptor,
99 const webrtc::CryptoOptions& crypto_options,
100 bool extmap_allow_mixed,
101 int rtcp_report_interval_ms);
102
103 ~ChannelSend() override;
104
105 // Send using this encoder, with this payload type.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100106 void SetEncoder(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100107 std::unique_ptr<AudioEncoder> encoder) override;
108 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
109 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100110 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100111
112 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +0100113 void StartSend() override;
114 void StopSend() override;
115
116 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +0100117 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100118 int GetBitrate() const override;
119
120 // Network
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100121 void ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100122
123 // Muting, Volume and Level.
124 void SetInputMute(bool enable) override;
125
126 // Stats.
127 ANAStats GetANAStatistics() const override;
128
129 // Used by AudioSendStream.
130 RtpRtcp* GetRtpRtcp() const override;
131
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100132 void RegisterCngPayloadType(int payload_type, int payload_frequency) override;
133
Niels Möllerdced9f62018-11-19 10:27:07 +0100134 // DTMF.
135 bool SendTelephoneEventOutband(int event, int duration_ms) override;
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100136 void SetSendTelephoneEventPayloadType(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100137 int payload_frequency) override;
138
139 // RTP+RTCP
140 void SetLocalSSRC(uint32_t ssrc) override;
Amit Hilbuch77938e62018-12-21 09:23:38 -0800141 void SetRid(const std::string& rid,
142 int extension_id,
143 int repaired_extension_id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100144 void SetMid(const std::string& mid, int extension_id) override;
145 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
146 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
147 void EnableSendTransportSequenceNumber(int id) override;
148
149 void RegisterSenderCongestionControlObjects(
150 RtpTransportControllerSendInterface* transport,
151 RtcpBandwidthObserver* bandwidth_observer) override;
152 void ResetSenderCongestionControlObjects() override;
153 void SetRTCP_CNAME(absl::string_view c_name) override;
154 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
155 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100156
157 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
158 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
159 // the actual processing of the audio takes place. The processing mainly
160 // consists of encoding and preparing the result for sending by adding it to a
161 // send queue.
162 // The main reason for using a task queue here is to release the native,
163 // OS-specific, audio capture thread as soon as possible to ensure that it
164 // can go back to sleep and be prepared to deliver an new captured audio
165 // packet.
166 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
167
Niels Möllerdced9f62018-11-19 10:27:07 +0100168 // The existence of this function alongside OnUplinkPacketLossRate is
169 // a compromise. We want the encoder to be agnostic of the PLR source, but
170 // we also don't want it to receive conflicting information from TWCC and
171 // from RTCP-XR.
172 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
173
174 void OnRecoverableUplinkPacketLossRate(
175 float recoverable_packet_loss_rate) override;
176
177 int64_t GetRTT() const override;
178
179 // E2EE Custom Audio Frame Encryption
180 void SetFrameEncryptor(
181 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
182
183 private:
Sebastian Jansson7949f212019-03-05 13:41:48 +0000184 class ProcessAndEncodeAudioTask;
185
Niels Möllerdced9f62018-11-19 10:27:07 +0100186 // From AudioPacketizationCallback in the ACM
Niels Möller87e2d782019-03-07 10:18:23 +0100187 int32_t SendData(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100188 uint8_t payloadType,
189 uint32_t timeStamp,
190 const uint8_t* payloadData,
191 size_t payloadSize,
192 const RTPFragmentationHeader* fragmentation) override;
193
Niels Möllerdced9f62018-11-19 10:27:07 +0100194 void OnUplinkPacketLossRate(float packet_loss_rate);
195 bool InputMute() const;
196
Niels Möllerdced9f62018-11-19 10:27:07 +0100197 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, int id);
198
Niels Möller87e2d782019-03-07 10:18:23 +0100199 int32_t SendRtpAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100200 uint8_t payloadType,
201 uint32_t timeStamp,
202 rtc::ArrayView<const uint8_t> payload,
203 const RTPFragmentationHeader* fragmentation);
204
Niels Möller87e2d782019-03-07 10:18:23 +0100205 int32_t SendMediaTransportAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100206 uint8_t payloadType,
207 uint32_t timeStamp,
208 rtc::ArrayView<const uint8_t> payload,
209 const RTPFragmentationHeader* fragmentation);
210
211 // Return media transport or nullptr if using RTP.
212 MediaTransportInterface* media_transport() { return media_transport_; }
213
214 // Called on the encoder task queue when a new input audio frame is ready
215 // for encoding.
216 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input);
217
218 void OnReceivedRtt(int64_t rtt_ms);
219
220 void OnTargetTransferRate(TargetTransferRate) override;
221
222 // Thread checkers document and lock usage of some methods on voe::Channel to
223 // specific threads we know about. The goal is to eventually split up
224 // voe::Channel into parts with single-threaded semantics, and thereby reduce
225 // the need for locks.
226 rtc::ThreadChecker worker_thread_checker_;
227 rtc::ThreadChecker module_process_thread_checker_;
228 // Methods accessed from audio and video threads are checked for sequential-
229 // only access. We don't necessarily own and control these threads, so thread
230 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
231 // audio thread to another, but access is still sequential.
232 rtc::RaceChecker audio_thread_race_checker_;
233
Niels Möllerdced9f62018-11-19 10:27:07 +0100234 rtc::CriticalSection volume_settings_critsect_;
235
Niels Möller26e88b02018-11-19 15:08:13 +0100236 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100237
238 RtcEventLog* const event_log_;
239
240 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100241 std::unique_ptr<RTPSenderAudio> rtp_sender_audio_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100242
243 std::unique_ptr<AudioCodingModule> audio_coding_;
244 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
245
Niels Möllerdced9f62018-11-19 10:27:07 +0100246 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100247 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100248 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
249 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
250 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
251 // VoeRTP_RTCP
252 // TODO(henrika): can today be accessed on the main thread and on the
253 // task queue; hence potential race.
254 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800255
Niels Möllerdced9f62018-11-19 10:27:07 +0100256 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100257 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100258
Niels Möller985a1f32018-11-19 16:08:42 +0100259 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
260 nullptr;
261 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
262 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
263 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_sender_proxy_;
264 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100265
266 rtc::ThreadChecker construction_thread_;
267
268 const bool use_twcc_plr_for_ana_;
269
Sebastian Jansson7949f212019-03-05 13:41:48 +0000270 rtc::CriticalSection encoder_queue_lock_;
271 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_lock_) = false;
Niels Möller985a1f32018-11-19 16:08:42 +0100272 rtc::TaskQueue* const encoder_queue_ = nullptr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100273
274 MediaTransportInterface* const media_transport_;
275 int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
276
277 rtc::CriticalSection media_transport_lock_;
278 // Currently set by SetLocalSSRC.
279 uint64_t media_transport_channel_id_ RTC_GUARDED_BY(&media_transport_lock_) =
280 0;
281 // Cache payload type and sampling frequency from most recent call to
282 // SetEncoder. Needed to set MediaTransportEncodedAudioFrame metadata, and
283 // invalidate on encoder change.
284 int media_transport_payload_type_ RTC_GUARDED_BY(&media_transport_lock_);
285 int media_transport_sampling_frequency_
286 RTC_GUARDED_BY(&media_transport_lock_);
287
288 // E2EE Audio Frame Encryption
289 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_;
290 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100291 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100292
293 rtc::CriticalSection bitrate_crit_section_;
294 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
295};
Niels Möller530ead42018-10-04 14:28:39 +0200296
297const int kTelephoneEventAttenuationdB = 10;
298
299class TransportFeedbackProxy : public TransportFeedbackObserver {
300 public:
301 TransportFeedbackProxy() : feedback_observer_(nullptr) {
302 pacer_thread_.DetachFromThread();
303 network_thread_.DetachFromThread();
304 }
305
306 void SetTransportFeedbackObserver(
307 TransportFeedbackObserver* feedback_observer) {
308 RTC_DCHECK(thread_checker_.CalledOnValidThread());
309 rtc::CritScope lock(&crit_);
310 feedback_observer_ = feedback_observer;
311 }
312
313 // Implements TransportFeedbackObserver.
314 void AddPacket(uint32_t ssrc,
315 uint16_t sequence_number,
316 size_t length,
317 const PacedPacketInfo& pacing_info) override {
318 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
319 rtc::CritScope lock(&crit_);
320 if (feedback_observer_)
321 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
322 }
323
324 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
325 RTC_DCHECK(network_thread_.CalledOnValidThread());
326 rtc::CritScope lock(&crit_);
327 if (feedback_observer_)
328 feedback_observer_->OnTransportFeedback(feedback);
329 }
330
331 private:
332 rtc::CriticalSection crit_;
333 rtc::ThreadChecker thread_checker_;
334 rtc::ThreadChecker pacer_thread_;
335 rtc::ThreadChecker network_thread_;
336 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
337};
338
339class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
340 public:
341 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
342 pacer_thread_.DetachFromThread();
343 }
344
345 void SetSequenceNumberAllocator(
346 TransportSequenceNumberAllocator* seq_num_allocator) {
347 RTC_DCHECK(thread_checker_.CalledOnValidThread());
348 rtc::CritScope lock(&crit_);
349 seq_num_allocator_ = seq_num_allocator;
350 }
351
352 // Implements TransportSequenceNumberAllocator.
353 uint16_t AllocateSequenceNumber() override {
354 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
355 rtc::CritScope lock(&crit_);
356 if (!seq_num_allocator_)
357 return 0;
358 return seq_num_allocator_->AllocateSequenceNumber();
359 }
360
361 private:
362 rtc::CriticalSection crit_;
363 rtc::ThreadChecker thread_checker_;
364 rtc::ThreadChecker pacer_thread_;
365 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
366};
367
368class RtpPacketSenderProxy : public RtpPacketSender {
369 public:
370 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
371
372 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
373 RTC_DCHECK(thread_checker_.CalledOnValidThread());
374 rtc::CritScope lock(&crit_);
375 rtp_packet_sender_ = rtp_packet_sender;
376 }
377
378 // Implements RtpPacketSender.
379 void InsertPacket(Priority priority,
380 uint32_t ssrc,
381 uint16_t sequence_number,
382 int64_t capture_time_ms,
383 size_t bytes,
384 bool retransmission) override {
385 rtc::CritScope lock(&crit_);
386 if (rtp_packet_sender_) {
387 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
388 capture_time_ms, bytes, retransmission);
389 }
390 }
391
392 void SetAccountForAudioPackets(bool account_for_audio) override {
393 RTC_NOTREACHED();
394 }
395
396 private:
397 rtc::ThreadChecker thread_checker_;
398 rtc::CriticalSection crit_;
399 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
400};
401
402class VoERtcpObserver : public RtcpBandwidthObserver {
403 public:
404 explicit VoERtcpObserver(ChannelSend* owner)
405 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100406 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200407
408 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
409 rtc::CritScope lock(&crit_);
410 bandwidth_observer_ = bandwidth_observer;
411 }
412
413 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
414 rtc::CritScope lock(&crit_);
415 if (bandwidth_observer_) {
416 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
417 }
418 }
419
420 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
421 int64_t rtt,
422 int64_t now_ms) override {
423 {
424 rtc::CritScope lock(&crit_);
425 if (bandwidth_observer_) {
426 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
427 now_ms);
428 }
429 }
430 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
431 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
432 // report for VoiceEngine?
433 if (report_blocks.empty())
434 return;
435
436 int fraction_lost_aggregate = 0;
437 int total_number_of_packets = 0;
438
439 // If receiving multiple report blocks, calculate the weighted average based
440 // on the number of packets a report refers to.
441 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
442 block_it != report_blocks.end(); ++block_it) {
443 // Find the previous extended high sequence number for this remote SSRC,
444 // to calculate the number of RTP packets this report refers to. Ignore if
445 // we haven't seen this SSRC before.
446 std::map<uint32_t, uint32_t>::iterator seq_num_it =
447 extended_max_sequence_number_.find(block_it->source_ssrc);
448 int number_of_packets = 0;
449 if (seq_num_it != extended_max_sequence_number_.end()) {
450 number_of_packets =
451 block_it->extended_highest_sequence_number - seq_num_it->second;
452 }
453 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
454 total_number_of_packets += number_of_packets;
455
456 extended_max_sequence_number_[block_it->source_ssrc] =
457 block_it->extended_highest_sequence_number;
458 }
459 int weighted_fraction_lost = 0;
460 if (total_number_of_packets > 0) {
461 weighted_fraction_lost =
462 (fraction_lost_aggregate + total_number_of_packets / 2) /
463 total_number_of_packets;
464 }
465 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
466 }
467
468 private:
469 ChannelSend* owner_;
470 // Maps remote side ssrc to extended highest sequence number received.
471 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
472 rtc::CriticalSection crit_;
473 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
474};
475
Sebastian Jansson7949f212019-03-05 13:41:48 +0000476class ChannelSend::ProcessAndEncodeAudioTask : public rtc::QueuedTask {
477 public:
478 ProcessAndEncodeAudioTask(std::unique_ptr<AudioFrame> audio_frame,
479 ChannelSend* channel)
480 : audio_frame_(std::move(audio_frame)), channel_(channel) {
481 RTC_DCHECK(channel_);
482 }
483
484 private:
485 bool Run() override {
486 RTC_DCHECK_RUN_ON(channel_->encoder_queue_);
487 channel_->ProcessAndEncodeAudioOnTaskQueue(audio_frame_.get());
488 return true;
489 }
490
491 std::unique_ptr<AudioFrame> audio_frame_;
492 ChannelSend* const channel_;
493};
494
Niels Möller87e2d782019-03-07 10:18:23 +0100495int32_t ChannelSend::SendData(AudioFrameType frameType,
Niels Möller530ead42018-10-04 14:28:39 +0200496 uint8_t payloadType,
497 uint32_t timeStamp,
498 const uint8_t* payloadData,
499 size_t payloadSize,
500 const RTPFragmentationHeader* fragmentation) {
501 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200502 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
503
504 if (media_transport() != nullptr) {
Piotr (Peter) Slatala3cdd4d52019-02-28 07:10:56 -0800505 if (frameType == kEmptyFrame) {
506 // TODO(bugs.webrtc.org/9719): Media transport Send doesn't support
507 // sending empty frames.
508 return 0;
509 }
510
Niels Möller7d76a312018-10-26 12:57:07 +0200511 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload,
512 fragmentation);
513 } else {
514 return SendRtpAudio(frameType, payloadType, timeStamp, payload,
515 fragmentation);
516 }
517}
518
Niels Möller87e2d782019-03-07 10:18:23 +0100519int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200520 uint8_t payloadType,
521 uint32_t timeStamp,
522 rtc::ArrayView<const uint8_t> payload,
523 const RTPFragmentationHeader* fragmentation) {
524 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200525 if (_includeAudioLevelIndication) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100526 // Store current audio level in the RTP sender.
Niels Möller530ead42018-10-04 14:28:39 +0200527 // The level will be used in combination with voice-activity state
528 // (frameType) to add an RTP header extension
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100529 rtp_sender_audio_->SetAudioLevel(rms_level_.Average());
Niels Möller530ead42018-10-04 14:28:39 +0200530 }
531
Benjamin Wright84583f62018-10-04 14:22:34 -0700532 // E2EE Custom Audio Frame Encryption (This is optional).
533 // Keep this buffer around for the lifetime of the send call.
534 rtc::Buffer encrypted_audio_payload;
535 if (frame_encryptor_ != nullptr) {
536 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
537 // Allocate a buffer to hold the maximum possible encrypted payload.
538 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200539 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700540 encrypted_audio_payload.SetSize(max_ciphertext_size);
541
542 // Encrypt the audio payload into the buffer.
543 size_t bytes_written = 0;
544 int encrypt_status = frame_encryptor_->Encrypt(
545 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200546 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
547 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700548 if (encrypt_status != 0) {
549 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
550 << encrypt_status;
551 return -1;
552 }
553 // Resize the buffer to the exact number of bytes actually used.
554 encrypted_audio_payload.SetSize(bytes_written);
555 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200556 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700557 } else if (crypto_options_.sframe.require_frame_encryption) {
558 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
559 << "A frame encryptor is required but one is not set.";
560 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700561 }
562
Niels Möller530ead42018-10-04 14:28:39 +0200563 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
564 // packetization.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100565 if (!_rtpRtcpModule->OnSendingRtpFrame(timeStamp,
566 // Leaving the time when this frame was
567 // received from the capture device as
568 // undefined for voice for now.
569 -1, payloadType,
570 /*force_sender_report=*/false)) {
571 return false;
572 }
573
574 // RTCPSender has it's own copy of the timestamp offset, added in
575 // RTCPSender::BuildSR, hence we must not add the in the offset for the above
576 // call.
577 // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
578 // knowledge of the offset to a single place.
579 const uint32_t rtp_timestamp = timeStamp + _rtpRtcpModule->StartTimestamp();
Niels Möller530ead42018-10-04 14:28:39 +0200580 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100581 if (!rtp_sender_audio_->SendAudio(frameType, payloadType, rtp_timestamp,
582 payload.data(), payload.size())) {
Niels Möller530ead42018-10-04 14:28:39 +0200583 RTC_DLOG(LS_ERROR)
584 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
585 return -1;
586 }
587
588 return 0;
589}
590
Niels Möller7d76a312018-10-26 12:57:07 +0200591int32_t ChannelSend::SendMediaTransportAudio(
Niels Möller87e2d782019-03-07 10:18:23 +0100592 AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200593 uint8_t payloadType,
594 uint32_t timeStamp,
595 rtc::ArrayView<const uint8_t> payload,
596 const RTPFragmentationHeader* fragmentation) {
597 RTC_DCHECK_RUN_ON(encoder_queue_);
598 // TODO(nisse): Use null _transportPtr for MediaTransport.
599 // RTC_DCHECK(_transportPtr == nullptr);
600 uint64_t channel_id;
601 int sampling_rate_hz;
602 {
603 rtc::CritScope cs(&media_transport_lock_);
604 if (media_transport_payload_type_ != payloadType) {
605 // Payload type is being changed, media_transport_sampling_frequency_,
606 // no longer current.
607 return -1;
608 }
609 sampling_rate_hz = media_transport_sampling_frequency_;
610 channel_id = media_transport_channel_id_;
611 }
Mirko Bonadei1c546052019-02-04 14:50:38 +0100612 MediaTransportEncodedAudioFrame frame(
Niels Möller7d76a312018-10-26 12:57:07 +0200613 /*sampling_rate_hz=*/sampling_rate_hz,
614
615 // TODO(nisse): Timestamp and sample index are the same for all supported
616 // audio codecs except G722. Refactor audio coding module to only use
617 // sample index, and leave translation to RTP time, when needed, for
618 // RTP-specific code.
619 /*starting_sample_index=*/timeStamp,
620
621 // Sample count isn't conveniently available from the AudioCodingModule,
622 // and needs some refactoring to wire up in a good way. For now, left as
623 // zero.
624 /*sample_count=*/0,
625
626 /*sequence_number=*/media_transport_sequence_number_,
627 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
628 std::vector<uint8_t>(payload.begin(), payload.end()));
629
630 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
631 // channel id.
632 RTCError rtc_error =
633 media_transport()->SendAudioFrame(channel_id, std::move(frame));
634
635 if (!rtc_error.ok()) {
636 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
637 << ToString(rtc_error.type()) << ", "
638 << rtc_error.message();
639 return -1;
640 }
641
642 ++media_transport_sequence_number_;
643
644 return 0;
645}
646
Sebastian Jansson977b3352019-03-04 17:43:34 +0100647ChannelSend::ChannelSend(Clock* clock,
648 rtc::TaskQueue* encoder_queue,
Niels Möller530ead42018-10-04 14:28:39 +0200649 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200650 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -0800651 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +0100652 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200653 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700654 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700655 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100656 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800657 bool extmap_allow_mixed,
658 int rtcp_report_interval_ms)
Niels Möller530ead42018-10-04 14:28:39 +0200659 : event_log_(rtc_event_log),
660 _timeStamp(0), // This is just an offset, RTP module will add it's own
661 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200662 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200663 input_mute_(false),
664 previous_frame_muted_(false),
665 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200666 rtcp_observer_(new VoERtcpObserver(this)),
667 feedback_observer_proxy_(new TransportFeedbackProxy()),
668 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
669 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
Sebastian Jansson977b3352019-03-04 17:43:34 +0100670 retransmission_rate_limiter_(
671 new RateLimiter(clock, kMaxRetransmissionWindowMs)),
Niels Möller530ead42018-10-04 14:28:39 +0200672 use_twcc_plr_for_ana_(
673 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Benjamin Wright84583f62018-10-04 14:22:34 -0700674 encoder_queue_(encoder_queue),
Niels Möller7d76a312018-10-26 12:57:07 +0200675 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700676 frame_encryptor_(frame_encryptor),
677 crypto_options_(crypto_options) {
Niels Möller530ead42018-10-04 14:28:39 +0200678 RTC_DCHECK(module_process_thread);
679 RTC_DCHECK(encoder_queue);
Niels Möllerdced9f62018-11-19 10:27:07 +0100680 module_process_thread_checker_.DetachFromThread();
681
Niels Möller530ead42018-10-04 14:28:39 +0200682 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
683
684 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800685
686 // We gradually remove codepaths that depend on RTP when using media
687 // transport. All of this logic should be moved to the future
688 // RTPMediaTransport. In this case it means that overhead and bandwidth
689 // observers should not be called when using media transport.
690 if (!media_transport_) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800691 configuration.overhead_observer = overhead_observer;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800692 configuration.bandwidth_callback = rtcp_observer_.get();
693 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
694 }
695
Sebastian Jansson977b3352019-03-04 17:43:34 +0100696 configuration.clock = clock;
Niels Möller530ead42018-10-04 14:28:39 +0200697 configuration.audio = true;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100698 configuration.clock = Clock::GetRealTimeClock();
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100699 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200700
701 configuration.paced_sender = rtp_packet_sender_proxy_.get();
702 configuration.transport_sequence_number_allocator =
703 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200704
705 configuration.event_log = event_log_;
706 configuration.rtt_stats = rtcp_rtt_stats;
707 configuration.retransmission_rate_limiter =
708 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100709 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800710 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200711
Danil Chapovalovc44f6cc2019-03-06 11:31:09 +0100712 _rtpRtcpModule = RtpRtcp::Create(configuration);
Niels Möller530ead42018-10-04 14:28:39 +0200713 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200714
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100715 rtp_sender_audio_ = absl::make_unique<RTPSenderAudio>(
716 configuration.clock, _rtpRtcpModule->RtpSender());
717
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800718 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
719 // callbacks after the audio_coding_ is fully initialized.
720 if (media_transport_) {
721 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
722 media_transport_->AddTargetTransferRateObserver(this);
Niels Möllerd5af4022019-03-05 08:56:48 +0100723 media_transport_->SetAudioOverheadObserver(overhead_observer);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800724 } else {
725 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
726 }
727
Niels Möller530ead42018-10-04 14:28:39 +0200728 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
729
Niels Möller530ead42018-10-04 14:28:39 +0200730 // Ensure that RTCP is enabled by default for the created channel.
731 // Note that, the module will keep generating RTCP until it is explicitly
732 // disabled by the user.
733 // After StopListen (when no sockets exists), RTCP packets will no longer
734 // be transmitted since the Transport object will then be invalid.
735 // RTCP is enabled by default.
736 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
737
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100738 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200739 RTC_DCHECK_EQ(0, error);
740}
741
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100742ChannelSend::~ChannelSend() {
Niels Möller530ead42018-10-04 14:28:39 +0200743 RTC_DCHECK(construction_thread_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +0200744
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800745 if (media_transport_) {
746 media_transport_->RemoveTargetTransferRateObserver(this);
Niels Möllerd5af4022019-03-05 08:56:48 +0100747 media_transport_->SetAudioOverheadObserver(nullptr);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800748 }
749
Niels Möller530ead42018-10-04 14:28:39 +0200750 StopSend();
Niels Möller530ead42018-10-04 14:28:39 +0200751 int error = audio_coding_->RegisterTransportCallback(NULL);
752 RTC_DCHECK_EQ(0, error);
753
Niels Möller530ead42018-10-04 14:28:39 +0200754 if (_moduleProcessThreadPtr)
755 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200756}
757
Niels Möller26815232018-11-16 09:32:40 +0100758void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100759 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100760 RTC_DCHECK(!sending_);
761 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200762
Niels Möller530ead42018-10-04 14:28:39 +0200763 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100764 int ret = _rtpRtcpModule->SetSendingStatus(true);
765 RTC_DCHECK_EQ(0, ret);
Sebastian Jansson7949f212019-03-05 13:41:48 +0000766 {
767 // It is now OK to start posting tasks to the encoder task queue.
768 rtc::CritScope cs(&encoder_queue_lock_);
Niels Möller530ead42018-10-04 14:28:39 +0200769 encoder_queue_is_active_ = true;
Sebastian Jansson7949f212019-03-05 13:41:48 +0000770 }
Niels Möller530ead42018-10-04 14:28:39 +0200771}
772
773void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100774 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100775 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200776 return;
777 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100778 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200779
780 // Post a task to the encoder thread which sets an event when the task is
781 // executed. We know that no more encoding tasks will be added to the task
782 // queue for this channel since sending is now deactivated. It means that,
783 // if we wait for the event to bet set, we know that no more pending tasks
784 // exists and it is therfore guaranteed that the task queue will never try
785 // to acccess and invalid channel object.
786 RTC_DCHECK(encoder_queue_);
787
Niels Möllerc572ff32018-11-07 08:43:50 +0100788 rtc::Event flush;
Sebastian Jansson7949f212019-03-05 13:41:48 +0000789 {
790 // Clear |encoder_queue_is_active_| under lock to prevent any other tasks
791 // than this final "flush task" to be posted on the queue.
792 rtc::CritScope cs(&encoder_queue_lock_);
Niels Möller530ead42018-10-04 14:28:39 +0200793 encoder_queue_is_active_ = false;
Sebastian Jansson7949f212019-03-05 13:41:48 +0000794 encoder_queue_->PostTask([&flush]() { flush.Set(); });
795 }
Niels Möller530ead42018-10-04 14:28:39 +0200796 flush.Wait(rtc::Event::kForever);
797
Niels Möller530ead42018-10-04 14:28:39 +0200798 // Reset sending SSRC and sequence number and triggers direct transmission
799 // of RTCP BYE
800 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
801 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
802 }
803 _rtpRtcpModule->SetSendingMediaStatus(false);
804}
805
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100806void ChannelSend::SetEncoder(int payload_type,
Niels Möller530ead42018-10-04 14:28:39 +0200807 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100808 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200809 RTC_DCHECK_GE(payload_type, 0);
810 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200811
812 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
813 // as well as some other things, so we collect this info and send it along.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100814 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type,
815 encoder->RtpTimestampRateHz());
816 rtp_sender_audio_->RegisterAudioPayload("audio", payload_type,
817 encoder->RtpTimestampRateHz(),
818 encoder->NumChannels(), 0);
Niels Möller530ead42018-10-04 14:28:39 +0200819
Niels Möller7d76a312018-10-26 12:57:07 +0200820 if (media_transport_) {
821 rtc::CritScope cs(&media_transport_lock_);
822 media_transport_payload_type_ = payload_type;
823 // TODO(nisse): Currently broken for G722, since timestamps passed through
824 // encoder use RTP clock rather than sample count, and they differ for G722.
825 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
826 }
Niels Möller530ead42018-10-04 14:28:39 +0200827 audio_coding_->SetEncoder(std::move(encoder));
Niels Möller530ead42018-10-04 14:28:39 +0200828}
829
830void ChannelSend::ModifyEncoder(
831 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800832 // This method can be called on the worker thread, module process thread
833 // or network thread. Audio coding is thread safe, so we do not need to
834 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200835 audio_coding_->ModifyEncoder(modifier);
836}
837
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100838void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
839 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
840 if (*encoder_ptr) {
841 modifier(encoder_ptr->get());
842 } else {
843 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
844 }
845 });
846}
847
Sebastian Jansson254d8692018-11-21 19:19:00 +0100848void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100849 // This method can be called on the worker thread, module process thread
850 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
851 // TODO(solenberg): Figure out a good way to check this or enforce calling
852 // rules.
853 // RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
854 // module_process_thread_checker_.CalledOnValidThread());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800855 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100856
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100857 CallEncoder([&](AudioEncoder* encoder) {
858 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200859 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100860 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
861 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200862}
863
Niels Möllerdced9f62018-11-19 10:27:07 +0100864int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800865 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200866 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200867}
868
869void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100870 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200871 if (!use_twcc_plr_for_ana_)
872 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100873 CallEncoder([&](AudioEncoder* encoder) {
874 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200875 });
876}
877
878void ChannelSend::OnRecoverableUplinkPacketLossRate(
879 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100880 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100881 CallEncoder([&](AudioEncoder* encoder) {
882 encoder->OnReceivedUplinkRecoverablePacketLossFraction(
883 recoverable_packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200884 });
885}
886
887void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
888 if (use_twcc_plr_for_ana_)
889 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100890 CallEncoder([&](AudioEncoder* encoder) {
891 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200892 });
893}
894
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100895void ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100896 // May be called on either worker thread or network thread.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800897 if (media_transport_) {
898 // Ignore RTCP packets while media transport is used.
899 // Those packets should not arrive, but we are seeing occasional packets.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100900 return;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800901 }
902
Niels Möller530ead42018-10-04 14:28:39 +0200903 // Deliver RTCP packet to RTP/RTCP module for parsing
904 _rtpRtcpModule->IncomingRtcpPacket(data, length);
905
906 int64_t rtt = GetRTT();
907 if (rtt == 0) {
908 // Waiting for valid RTT.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100909 return;
Niels Möller530ead42018-10-04 14:28:39 +0200910 }
911
912 int64_t nack_window_ms = rtt;
913 if (nack_window_ms < kMinRetransmissionWindowMs) {
914 nack_window_ms = kMinRetransmissionWindowMs;
915 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
916 nack_window_ms = kMaxRetransmissionWindowMs;
917 }
918 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
919
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800920 OnReceivedRtt(rtt);
Niels Möller530ead42018-10-04 14:28:39 +0200921}
922
923void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100924 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200925 rtc::CritScope cs(&volume_settings_critsect_);
926 input_mute_ = enable;
927}
928
929bool ChannelSend::InputMute() const {
930 rtc::CritScope cs(&volume_settings_critsect_);
931 return input_mute_;
932}
933
Niels Möller26815232018-11-16 09:32:40 +0100934bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100935 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200936 RTC_DCHECK_LE(0, event);
937 RTC_DCHECK_GE(255, event);
938 RTC_DCHECK_LE(0, duration_ms);
939 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100940 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100941 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200942 }
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100943 if (rtp_sender_audio_->SendTelephoneEvent(
Niels Möller530ead42018-10-04 14:28:39 +0200944 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100945 RTC_DLOG(LS_ERROR) << "SendTelephoneEvent() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100946 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200947 }
Niels Möller26815232018-11-16 09:32:40 +0100948 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200949}
950
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100951void ChannelSend::RegisterCngPayloadType(int payload_type,
952 int payload_frequency) {
953 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
954 rtp_sender_audio_->RegisterAudioPayload("CN", payload_type, payload_frequency,
955 1, 0);
956}
957
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100958void ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
Niels Möller26815232018-11-16 09:32:40 +0100959 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100960 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200961 RTC_DCHECK_LE(0, payload_type);
962 RTC_DCHECK_GE(127, payload_type);
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100963 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
964 rtp_sender_audio_->RegisterAudioPayload("telephone-event", payload_type,
965 payload_frequency, 0, 0);
Niels Möller530ead42018-10-04 14:28:39 +0200966}
967
Niels Möllerdced9f62018-11-19 10:27:07 +0100968void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100969 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100970 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100971
Niels Möller7d76a312018-10-26 12:57:07 +0200972 if (media_transport_) {
973 rtc::CritScope cs(&media_transport_lock_);
974 media_transport_channel_id_ = ssrc;
975 }
Niels Möller530ead42018-10-04 14:28:39 +0200976 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200977}
978
Amit Hilbuch77938e62018-12-21 09:23:38 -0800979void ChannelSend::SetRid(const std::string& rid,
980 int extension_id,
981 int repaired_extension_id) {
982 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
983 if (extension_id != 0) {
984 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
985 extension_id);
986 RTC_DCHECK_EQ(0, ret);
987 }
988 if (repaired_extension_id != 0) {
989 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
990 repaired_extension_id);
991 RTC_DCHECK_EQ(0, ret);
992 }
993 _rtpRtcpModule->SetRid(rid);
994}
995
Niels Möller530ead42018-10-04 14:28:39 +0200996void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100997 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200998 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
999 RTC_DCHECK_EQ(0, ret);
1000 _rtpRtcpModule->SetMid(mid);
1001}
1002
Johannes Kron9190b822018-10-29 11:22:05 +01001003void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +01001004 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +01001005 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
1006}
1007
Niels Möller26815232018-11-16 09:32:40 +01001008void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +01001009 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001010 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +01001011 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
1012 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +02001013}
1014
1015void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +01001016 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001017 int ret =
1018 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
1019 RTC_DCHECK_EQ(0, ret);
1020}
1021
1022void ChannelSend::RegisterSenderCongestionControlObjects(
1023 RtpTransportControllerSendInterface* transport,
1024 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +01001025 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001026 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
1027 TransportFeedbackObserver* transport_feedback_observer =
1028 transport->transport_feedback_observer();
1029 PacketRouter* packet_router = transport->packet_router();
1030
1031 RTC_DCHECK(rtp_packet_sender);
1032 RTC_DCHECK(transport_feedback_observer);
1033 RTC_DCHECK(packet_router);
1034 RTC_DCHECK(!packet_router_);
1035 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
1036 feedback_observer_proxy_->SetTransportFeedbackObserver(
1037 transport_feedback_observer);
1038 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
1039 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
1040 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
1041 constexpr bool remb_candidate = false;
1042 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
1043 packet_router_ = packet_router;
1044}
1045
1046void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001047 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001048 RTC_DCHECK(packet_router_);
1049 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1050 rtcp_observer_->SetBandwidthObserver(nullptr);
1051 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1052 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1053 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1054 packet_router_ = nullptr;
1055 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
1056}
1057
Niels Möller26815232018-11-16 09:32:40 +01001058void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001059 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001060 // Note: SetCNAME() accepts a c string of length at most 255.
1061 const std::string c_name_limited(c_name.substr(0, 255));
1062 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1063 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001064}
1065
Niels Möller26815232018-11-16 09:32:40 +01001066std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001067 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001068 // Get the report blocks from the latest received RTCP Sender or Receiver
1069 // Report. Each element in the vector contains the sender's SSRC and a
1070 // report block according to RFC 3550.
1071 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001072
Niels Möller26815232018-11-16 09:32:40 +01001073 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1074 RTC_DCHECK_EQ(0, ret);
1075
1076 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001077
1078 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1079 for (; it != rtcp_report_blocks.end(); ++it) {
1080 ReportBlock report_block;
1081 report_block.sender_SSRC = it->sender_ssrc;
1082 report_block.source_SSRC = it->source_ssrc;
1083 report_block.fraction_lost = it->fraction_lost;
1084 report_block.cumulative_num_packets_lost = it->packets_lost;
1085 report_block.extended_highest_sequence_number =
1086 it->extended_highest_sequence_number;
1087 report_block.interarrival_jitter = it->jitter;
1088 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1089 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001090 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001091 }
Niels Möller26815232018-11-16 09:32:40 +01001092 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001093}
1094
Niels Möller26815232018-11-16 09:32:40 +01001095CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001096 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001097 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001098 stats.rttMs = GetRTT();
1099
Niels Möller530ead42018-10-04 14:28:39 +02001100 size_t bytesSent(0);
1101 uint32_t packetsSent(0);
1102
1103 if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
1104 RTC_DLOG(LS_WARNING)
1105 << "GetRTPStatistics() failed to retrieve RTP datacounters"
1106 << " => output will not be complete";
1107 }
1108
1109 stats.bytesSent = bytesSent;
1110 stats.packetsSent = packetsSent;
1111
Niels Möller26815232018-11-16 09:32:40 +01001112 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001113}
1114
Niels Möller530ead42018-10-04 14:28:39 +02001115void ChannelSend::ProcessAndEncodeAudio(
1116 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001117 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Jansson7949f212019-03-05 13:41:48 +00001118 // Avoid posting any new tasks if sending was already stopped in StopSend().
1119 rtc::CritScope cs(&encoder_queue_lock_);
1120 if (!encoder_queue_is_active_) {
1121 return;
1122 }
Niels Möller530ead42018-10-04 14:28:39 +02001123 // Profile time between when the audio frame is added to the task queue and
1124 // when the task is actually executed.
1125 audio_frame->UpdateProfileTimeStamp();
Sebastian Jansson7949f212019-03-05 13:41:48 +00001126 encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
1127 new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
Niels Möller530ead42018-10-04 14:28:39 +02001128}
1129
1130void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
1131 RTC_DCHECK_RUN_ON(encoder_queue_);
1132 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
1133 RTC_DCHECK_LE(audio_input->num_channels_, 2);
1134
1135 // Measure time between when the audio frame is added to the task queue and
1136 // when the task is actually executed. Goal is to keep track of unwanted
1137 // extra latency added by the task queue.
1138 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1139 audio_input->ElapsedProfileTimeMs());
1140
1141 bool is_muted = InputMute();
1142 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1143
1144 if (_includeAudioLevelIndication) {
1145 size_t length =
1146 audio_input->samples_per_channel_ * audio_input->num_channels_;
1147 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1148 if (is_muted && previous_frame_muted_) {
1149 rms_level_.AnalyzeMuted(length);
1150 } else {
1151 rms_level_.Analyze(
1152 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1153 }
1154 }
1155 previous_frame_muted_ = is_muted;
1156
1157 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1158
1159 // The ACM resamples internally.
1160 audio_input->timestamp_ = _timeStamp;
1161 // This call will trigger AudioPacketizationCallback::SendData if encoding
1162 // is done and payload is ready for packetization and transmission.
1163 // Otherwise, it will return without invoking the callback.
1164 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1165 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1166 return;
1167 }
1168
1169 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1170}
1171
Niels Möller530ead42018-10-04 14:28:39 +02001172ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001173 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001174 return audio_coding_->GetANAStats();
1175}
1176
1177RtpRtcp* ChannelSend::GetRtpRtcp() const {
Niels Möllerdced9f62018-11-19 10:27:07 +01001178 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +02001179 return _rtpRtcpModule.get();
1180}
1181
1182int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1183 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001184 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001185 int error = 0;
1186 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1187 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001188 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1189 // argument. Currently it wants an uint8_t.
1190 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1191 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001192 }
1193 return error;
1194}
1195
Niels Möller530ead42018-10-04 14:28:39 +02001196int64_t ChannelSend::GetRTT() const {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001197 if (media_transport_) {
1198 // GetRTT is generally used in the RTCP codepath, where media transport is
1199 // not present and so it shouldn't be needed. But it's also invoked in
1200 // 'GetStats' method, and for now returning media transport RTT here gives
1201 // us "free" rtt stats for media transport.
1202 auto target_rate = media_transport_->GetLatestTargetTransferRate();
1203 if (target_rate.has_value()) {
1204 return target_rate.value().network_estimate.round_trip_time.ms();
1205 }
1206
1207 return 0;
1208 }
Niels Möller530ead42018-10-04 14:28:39 +02001209 RtcpMode method = _rtpRtcpModule->RTCP();
1210 if (method == RtcpMode::kOff) {
1211 return 0;
1212 }
1213 std::vector<RTCPReportBlock> report_blocks;
1214 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1215
1216 if (report_blocks.empty()) {
1217 return 0;
1218 }
1219
1220 int64_t rtt = 0;
1221 int64_t avg_rtt = 0;
1222 int64_t max_rtt = 0;
1223 int64_t min_rtt = 0;
1224 // We don't know in advance the remote ssrc used by the other end's receiver
1225 // reports, so use the SSRC of the first report block for calculating the RTT.
1226 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1227 &min_rtt, &max_rtt) != 0) {
1228 return 0;
1229 }
1230 return rtt;
1231}
1232
Benjamin Wright78410ad2018-10-25 09:52:57 -07001233void ChannelSend::SetFrameEncryptor(
1234 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001235 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson7949f212019-03-05 13:41:48 +00001236 rtc::CritScope cs(&encoder_queue_lock_);
1237 if (encoder_queue_is_active_) {
Mirko Bonadei80a86872019-02-04 15:01:43 +01001238 encoder_queue_->PostTask([this, frame_encryptor]() mutable {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001239 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001240 });
1241 } else {
Sebastian Jansson7949f212019-03-05 13:41:48 +00001242 frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001243 }
1244}
1245
Anton Sukhanov626015d2019-02-04 15:16:06 -08001246// TODO(sukhanov): Consider moving TargetTransferRate observer to
1247// AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
1248// makes sense to consolidate all rate (and overhead) calculation there.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001249void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
1250 RTC_DCHECK(media_transport_);
1251 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1252}
1253
1254void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1255 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +01001256 CallEncoder(
1257 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001258}
1259
Niels Möllerdced9f62018-11-19 10:27:07 +01001260} // namespace
1261
1262std::unique_ptr<ChannelSendInterface> CreateChannelSend(
Sebastian Jansson977b3352019-03-04 17:43:34 +01001263 Clock* clock,
Niels Möllerdced9f62018-11-19 10:27:07 +01001264 rtc::TaskQueue* encoder_queue,
1265 ProcessThread* module_process_thread,
1266 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -08001267 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +01001268 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001269 RtcpRttStats* rtcp_rtt_stats,
1270 RtcEventLog* rtc_event_log,
1271 FrameEncryptorInterface* frame_encryptor,
1272 const webrtc::CryptoOptions& crypto_options,
1273 bool extmap_allow_mixed,
1274 int rtcp_report_interval_ms) {
1275 return absl::make_unique<ChannelSend>(
Sebastian Jansson977b3352019-03-04 17:43:34 +01001276 clock, encoder_queue, module_process_thread, media_transport,
1277 overhead_observer, rtp_transport, rtcp_rtt_stats, rtc_event_log,
1278 frame_encryptor, crypto_options, extmap_allow_mixed,
1279 rtcp_report_interval_ms);
Niels Möllerdced9f62018-11-19 10:27:07 +01001280}
1281
Niels Möller530ead42018-10-04 14:28:39 +02001282} // namespace voe
1283} // namespace webrtc