blob: fa69422beb43a17761ae4a71fc02ad6207494339 [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"
Benjamin Wright84583f62018-10-04 14:22:34 -070023#include "api/crypto/frameencryptorinterface.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"
34#include "rtc_base/criticalsection.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"
44#include "rtc_base/timeutils.h"
45#include "system_wrappers/include/field_trial.h"
46#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öller7d76a312018-10-26 12:57:07 +020056MediaTransportEncodedAudioFrame::FrameType
57MediaTransportFrameTypeForWebrtcFrameType(webrtc::FrameType frame_type) {
58 switch (frame_type) {
59 case kAudioFrameSpeech:
60 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
61 break;
62
63 case kAudioFrameCN:
64 return MediaTransportEncodedAudioFrame::FrameType::
65 kDiscontinuousTransmission;
66 break;
67
68 default:
69 RTC_CHECK(false) << "Unexpected frame type=" << frame_type;
70 break;
71 }
72}
73
Niels Möllerdced9f62018-11-19 10:27:07 +010074class RtpPacketSenderProxy;
75class TransportFeedbackProxy;
76class TransportSequenceNumberProxy;
77class VoERtcpObserver;
78
Niels Möllerdced9f62018-11-19 10:27:07 +010079class ChannelSend
80 : public ChannelSendInterface,
Niels Möllerdced9f62018-11-19 10:27:07 +010081 public OverheadObserver,
82 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
90 ChannelSend(rtc::TaskQueue* encoder_queue,
91 ProcessThread* module_process_thread,
92 MediaTransportInterface* media_transport,
Niels Möllere9771992018-11-26 10:55:07 +010093 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +010094 RtcpRttStats* rtcp_rtt_stats,
95 RtcEventLog* rtc_event_log,
96 FrameEncryptorInterface* frame_encryptor,
97 const webrtc::CryptoOptions& crypto_options,
98 bool extmap_allow_mixed,
99 int rtcp_report_interval_ms);
100
101 ~ChannelSend() override;
102
103 // Send using this encoder, with this payload type.
104 bool SetEncoder(int payload_type,
105 std::unique_ptr<AudioEncoder> encoder) override;
106 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
107 modifier) override;
108
109 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +0100110 void StartSend() override;
111 void StopSend() override;
112
113 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +0100114 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100115 int GetBitrate() const override;
116
117 // Network
Niels Möllerdced9f62018-11-19 10:27:07 +0100118 bool ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
119
120 // Muting, Volume and Level.
121 void SetInputMute(bool enable) override;
122
123 // Stats.
124 ANAStats GetANAStatistics() const override;
125
126 // Used by AudioSendStream.
127 RtpRtcp* GetRtpRtcp() const override;
128
129 // DTMF.
130 bool SendTelephoneEventOutband(int event, int duration_ms) override;
131 bool SetSendTelephoneEventPayloadType(int payload_type,
132 int payload_frequency) override;
133
134 // RTP+RTCP
135 void SetLocalSSRC(uint32_t ssrc) override;
Amit Hilbuch77938e62018-12-21 09:23:38 -0800136 void SetRid(const std::string& rid,
137 int extension_id,
138 int repaired_extension_id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100139 void SetMid(const std::string& mid, int extension_id) override;
140 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
141 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
142 void EnableSendTransportSequenceNumber(int id) override;
143
144 void RegisterSenderCongestionControlObjects(
145 RtpTransportControllerSendInterface* transport,
146 RtcpBandwidthObserver* bandwidth_observer) override;
147 void ResetSenderCongestionControlObjects() override;
148 void SetRTCP_CNAME(absl::string_view c_name) override;
149 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
150 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100151
152 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
153 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
154 // the actual processing of the audio takes place. The processing mainly
155 // consists of encoding and preparing the result for sending by adding it to a
156 // send queue.
157 // The main reason for using a task queue here is to release the native,
158 // OS-specific, audio capture thread as soon as possible to ensure that it
159 // can go back to sleep and be prepared to deliver an new captured audio
160 // packet.
161 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
162
163 void SetTransportOverhead(size_t transport_overhead_per_packet) override;
164
165 // The existence of this function alongside OnUplinkPacketLossRate is
166 // a compromise. We want the encoder to be agnostic of the PLR source, but
167 // we also don't want it to receive conflicting information from TWCC and
168 // from RTCP-XR.
169 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
170
171 void OnRecoverableUplinkPacketLossRate(
172 float recoverable_packet_loss_rate) override;
173
174 int64_t GetRTT() const override;
175
176 // E2EE Custom Audio Frame Encryption
177 void SetFrameEncryptor(
178 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
179
180 private:
181 class ProcessAndEncodeAudioTask;
182
183 // From AudioPacketizationCallback in the ACM
184 int32_t SendData(FrameType frameType,
185 uint8_t payloadType,
186 uint32_t timeStamp,
187 const uint8_t* payloadData,
188 size_t payloadSize,
189 const RTPFragmentationHeader* fragmentation) override;
190
Niels Möllerdced9f62018-11-19 10:27:07 +0100191 // From OverheadObserver in the RTP/RTCP module
192 void OnOverheadChanged(size_t overhead_bytes_per_packet) override;
193
194 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
199 void UpdateOverheadForEncoder()
200 RTC_EXCLUSIVE_LOCKS_REQUIRED(overhead_per_packet_lock_);
201
Niels Möllerdced9f62018-11-19 10:27:07 +0100202 int32_t SendRtpAudio(FrameType frameType,
203 uint8_t payloadType,
204 uint32_t timeStamp,
205 rtc::ArrayView<const uint8_t> payload,
206 const RTPFragmentationHeader* fragmentation);
207
208 int32_t SendMediaTransportAudio(FrameType frameType,
209 uint8_t payloadType,
210 uint32_t timeStamp,
211 rtc::ArrayView<const uint8_t> payload,
212 const RTPFragmentationHeader* fragmentation);
213
214 // Return media transport or nullptr if using RTP.
215 MediaTransportInterface* media_transport() { return media_transport_; }
216
217 // Called on the encoder task queue when a new input audio frame is ready
218 // for encoding.
219 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input);
220
221 void OnReceivedRtt(int64_t rtt_ms);
222
223 void OnTargetTransferRate(TargetTransferRate) override;
224
225 // Thread checkers document and lock usage of some methods on voe::Channel to
226 // specific threads we know about. The goal is to eventually split up
227 // voe::Channel into parts with single-threaded semantics, and thereby reduce
228 // the need for locks.
229 rtc::ThreadChecker worker_thread_checker_;
230 rtc::ThreadChecker module_process_thread_checker_;
231 // Methods accessed from audio and video threads are checked for sequential-
232 // only access. We don't necessarily own and control these threads, so thread
233 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
234 // audio thread to another, but access is still sequential.
235 rtc::RaceChecker audio_thread_race_checker_;
236
Niels Möllerdced9f62018-11-19 10:27:07 +0100237 rtc::CriticalSection volume_settings_critsect_;
238
Niels Möller26e88b02018-11-19 15:08:13 +0100239 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100240
241 RtcEventLog* const event_log_;
242
243 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
244
245 std::unique_ptr<AudioCodingModule> audio_coding_;
246 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
247
248 uint16_t send_sequence_number_;
249
250 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100251 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100252 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
253 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
254 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
255 // VoeRTP_RTCP
256 // TODO(henrika): can today be accessed on the main thread and on the
257 // task queue; hence potential race.
258 bool _includeAudioLevelIndication;
259 size_t transport_overhead_per_packet_
260 RTC_GUARDED_BY(overhead_per_packet_lock_);
261 size_t rtp_overhead_per_packet_ RTC_GUARDED_BY(overhead_per_packet_lock_);
262 rtc::CriticalSection overhead_per_packet_lock_;
263 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100264 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100265
Niels Möller985a1f32018-11-19 16:08:42 +0100266 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
267 nullptr;
268 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
269 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
270 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_sender_proxy_;
271 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100272
273 rtc::ThreadChecker construction_thread_;
274
275 const bool use_twcc_plr_for_ana_;
276
277 rtc::CriticalSection encoder_queue_lock_;
278 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_lock_) = false;
Niels Möller985a1f32018-11-19 16:08:42 +0100279 rtc::TaskQueue* const encoder_queue_ = nullptr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100280
281 MediaTransportInterface* const media_transport_;
282 int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
283
284 rtc::CriticalSection media_transport_lock_;
285 // Currently set by SetLocalSSRC.
286 uint64_t media_transport_channel_id_ RTC_GUARDED_BY(&media_transport_lock_) =
287 0;
288 // Cache payload type and sampling frequency from most recent call to
289 // SetEncoder. Needed to set MediaTransportEncodedAudioFrame metadata, and
290 // invalidate on encoder change.
291 int media_transport_payload_type_ RTC_GUARDED_BY(&media_transport_lock_);
292 int media_transport_sampling_frequency_
293 RTC_GUARDED_BY(&media_transport_lock_);
294
295 // E2EE Audio Frame Encryption
296 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_;
297 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100298 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100299
300 rtc::CriticalSection bitrate_crit_section_;
301 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
302};
Niels Möller530ead42018-10-04 14:28:39 +0200303
304const int kTelephoneEventAttenuationdB = 10;
305
306class TransportFeedbackProxy : public TransportFeedbackObserver {
307 public:
308 TransportFeedbackProxy() : feedback_observer_(nullptr) {
309 pacer_thread_.DetachFromThread();
310 network_thread_.DetachFromThread();
311 }
312
313 void SetTransportFeedbackObserver(
314 TransportFeedbackObserver* feedback_observer) {
315 RTC_DCHECK(thread_checker_.CalledOnValidThread());
316 rtc::CritScope lock(&crit_);
317 feedback_observer_ = feedback_observer;
318 }
319
320 // Implements TransportFeedbackObserver.
321 void AddPacket(uint32_t ssrc,
322 uint16_t sequence_number,
323 size_t length,
324 const PacedPacketInfo& pacing_info) override {
325 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
326 rtc::CritScope lock(&crit_);
327 if (feedback_observer_)
328 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
329 }
330
331 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
332 RTC_DCHECK(network_thread_.CalledOnValidThread());
333 rtc::CritScope lock(&crit_);
334 if (feedback_observer_)
335 feedback_observer_->OnTransportFeedback(feedback);
336 }
337
338 private:
339 rtc::CriticalSection crit_;
340 rtc::ThreadChecker thread_checker_;
341 rtc::ThreadChecker pacer_thread_;
342 rtc::ThreadChecker network_thread_;
343 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
344};
345
346class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
347 public:
348 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
349 pacer_thread_.DetachFromThread();
350 }
351
352 void SetSequenceNumberAllocator(
353 TransportSequenceNumberAllocator* seq_num_allocator) {
354 RTC_DCHECK(thread_checker_.CalledOnValidThread());
355 rtc::CritScope lock(&crit_);
356 seq_num_allocator_ = seq_num_allocator;
357 }
358
359 // Implements TransportSequenceNumberAllocator.
360 uint16_t AllocateSequenceNumber() override {
361 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
362 rtc::CritScope lock(&crit_);
363 if (!seq_num_allocator_)
364 return 0;
365 return seq_num_allocator_->AllocateSequenceNumber();
366 }
367
368 private:
369 rtc::CriticalSection crit_;
370 rtc::ThreadChecker thread_checker_;
371 rtc::ThreadChecker pacer_thread_;
372 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
373};
374
375class RtpPacketSenderProxy : public RtpPacketSender {
376 public:
377 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
378
379 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
380 RTC_DCHECK(thread_checker_.CalledOnValidThread());
381 rtc::CritScope lock(&crit_);
382 rtp_packet_sender_ = rtp_packet_sender;
383 }
384
385 // Implements RtpPacketSender.
386 void InsertPacket(Priority priority,
387 uint32_t ssrc,
388 uint16_t sequence_number,
389 int64_t capture_time_ms,
390 size_t bytes,
391 bool retransmission) override {
392 rtc::CritScope lock(&crit_);
393 if (rtp_packet_sender_) {
394 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
395 capture_time_ms, bytes, retransmission);
396 }
397 }
398
399 void SetAccountForAudioPackets(bool account_for_audio) override {
400 RTC_NOTREACHED();
401 }
402
403 private:
404 rtc::ThreadChecker thread_checker_;
405 rtc::CriticalSection crit_;
406 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
407};
408
409class VoERtcpObserver : public RtcpBandwidthObserver {
410 public:
411 explicit VoERtcpObserver(ChannelSend* owner)
412 : owner_(owner), bandwidth_observer_(nullptr) {}
413 virtual ~VoERtcpObserver() {}
414
415 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
416 rtc::CritScope lock(&crit_);
417 bandwidth_observer_ = bandwidth_observer;
418 }
419
420 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
421 rtc::CritScope lock(&crit_);
422 if (bandwidth_observer_) {
423 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
424 }
425 }
426
427 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
428 int64_t rtt,
429 int64_t now_ms) override {
430 {
431 rtc::CritScope lock(&crit_);
432 if (bandwidth_observer_) {
433 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
434 now_ms);
435 }
436 }
437 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
438 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
439 // report for VoiceEngine?
440 if (report_blocks.empty())
441 return;
442
443 int fraction_lost_aggregate = 0;
444 int total_number_of_packets = 0;
445
446 // If receiving multiple report blocks, calculate the weighted average based
447 // on the number of packets a report refers to.
448 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
449 block_it != report_blocks.end(); ++block_it) {
450 // Find the previous extended high sequence number for this remote SSRC,
451 // to calculate the number of RTP packets this report refers to. Ignore if
452 // we haven't seen this SSRC before.
453 std::map<uint32_t, uint32_t>::iterator seq_num_it =
454 extended_max_sequence_number_.find(block_it->source_ssrc);
455 int number_of_packets = 0;
456 if (seq_num_it != extended_max_sequence_number_.end()) {
457 number_of_packets =
458 block_it->extended_highest_sequence_number - seq_num_it->second;
459 }
460 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
461 total_number_of_packets += number_of_packets;
462
463 extended_max_sequence_number_[block_it->source_ssrc] =
464 block_it->extended_highest_sequence_number;
465 }
466 int weighted_fraction_lost = 0;
467 if (total_number_of_packets > 0) {
468 weighted_fraction_lost =
469 (fraction_lost_aggregate + total_number_of_packets / 2) /
470 total_number_of_packets;
471 }
472 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
473 }
474
475 private:
476 ChannelSend* owner_;
477 // Maps remote side ssrc to extended highest sequence number received.
478 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
479 rtc::CriticalSection crit_;
480 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
481};
482
483class ChannelSend::ProcessAndEncodeAudioTask : public rtc::QueuedTask {
484 public:
485 ProcessAndEncodeAudioTask(std::unique_ptr<AudioFrame> audio_frame,
486 ChannelSend* channel)
487 : audio_frame_(std::move(audio_frame)), channel_(channel) {
488 RTC_DCHECK(channel_);
489 }
490
491 private:
492 bool Run() override {
493 RTC_DCHECK_RUN_ON(channel_->encoder_queue_);
494 channel_->ProcessAndEncodeAudioOnTaskQueue(audio_frame_.get());
495 return true;
496 }
497
498 std::unique_ptr<AudioFrame> audio_frame_;
499 ChannelSend* const channel_;
500};
501
502int32_t ChannelSend::SendData(FrameType frameType,
503 uint8_t payloadType,
504 uint32_t timeStamp,
505 const uint8_t* payloadData,
506 size_t payloadSize,
507 const RTPFragmentationHeader* fragmentation) {
508 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200509 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
510
511 if (media_transport() != nullptr) {
512 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload,
513 fragmentation);
514 } else {
515 return SendRtpAudio(frameType, payloadType, timeStamp, payload,
516 fragmentation);
517 }
518}
519
520int32_t ChannelSend::SendRtpAudio(FrameType frameType,
521 uint8_t payloadType,
522 uint32_t timeStamp,
523 rtc::ArrayView<const uint8_t> payload,
524 const RTPFragmentationHeader* fragmentation) {
525 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200526 if (_includeAudioLevelIndication) {
527 // Store current audio level in the RTP/RTCP module.
528 // The level will be used in combination with voice-activity state
529 // (frameType) to add an RTP header extension
530 _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
531 }
532
Benjamin Wright84583f62018-10-04 14:22:34 -0700533 // E2EE Custom Audio Frame Encryption (This is optional).
534 // Keep this buffer around for the lifetime of the send call.
535 rtc::Buffer encrypted_audio_payload;
536 if (frame_encryptor_ != nullptr) {
537 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
538 // Allocate a buffer to hold the maximum possible encrypted payload.
539 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200540 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700541 encrypted_audio_payload.SetSize(max_ciphertext_size);
542
543 // Encrypt the audio payload into the buffer.
544 size_t bytes_written = 0;
545 int encrypt_status = frame_encryptor_->Encrypt(
546 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200547 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
548 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700549 if (encrypt_status != 0) {
550 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
551 << encrypt_status;
552 return -1;
553 }
554 // Resize the buffer to the exact number of bytes actually used.
555 encrypted_audio_payload.SetSize(bytes_written);
556 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200557 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700558 } else if (crypto_options_.sframe.require_frame_encryption) {
559 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
560 << "A frame encryptor is required but one is not set.";
561 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700562 }
563
Niels Möller530ead42018-10-04 14:28:39 +0200564 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
565 // packetization.
566 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Möller7d76a312018-10-26 12:57:07 +0200567 if (!_rtpRtcpModule->SendOutgoingData((FrameType&)frameType, payloadType,
568 timeStamp,
569 // Leaving the time when this frame was
570 // received from the capture device as
571 // undefined for voice for now.
572 -1, payload.data(), payload.size(),
573 fragmentation, nullptr, nullptr)) {
Niels Möller530ead42018-10-04 14:28:39 +0200574 RTC_DLOG(LS_ERROR)
575 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
576 return -1;
577 }
578
579 return 0;
580}
581
Niels Möller7d76a312018-10-26 12:57:07 +0200582int32_t ChannelSend::SendMediaTransportAudio(
583 FrameType frameType,
584 uint8_t payloadType,
585 uint32_t timeStamp,
586 rtc::ArrayView<const uint8_t> payload,
587 const RTPFragmentationHeader* fragmentation) {
588 RTC_DCHECK_RUN_ON(encoder_queue_);
589 // TODO(nisse): Use null _transportPtr for MediaTransport.
590 // RTC_DCHECK(_transportPtr == nullptr);
591 uint64_t channel_id;
592 int sampling_rate_hz;
593 {
594 rtc::CritScope cs(&media_transport_lock_);
595 if (media_transport_payload_type_ != payloadType) {
596 // Payload type is being changed, media_transport_sampling_frequency_,
597 // no longer current.
598 return -1;
599 }
600 sampling_rate_hz = media_transport_sampling_frequency_;
601 channel_id = media_transport_channel_id_;
602 }
603 const MediaTransportEncodedAudioFrame frame(
604 /*sampling_rate_hz=*/sampling_rate_hz,
605
606 // TODO(nisse): Timestamp and sample index are the same for all supported
607 // audio codecs except G722. Refactor audio coding module to only use
608 // sample index, and leave translation to RTP time, when needed, for
609 // RTP-specific code.
610 /*starting_sample_index=*/timeStamp,
611
612 // Sample count isn't conveniently available from the AudioCodingModule,
613 // and needs some refactoring to wire up in a good way. For now, left as
614 // zero.
615 /*sample_count=*/0,
616
617 /*sequence_number=*/media_transport_sequence_number_,
618 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
619 std::vector<uint8_t>(payload.begin(), payload.end()));
620
621 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
622 // channel id.
623 RTCError rtc_error =
624 media_transport()->SendAudioFrame(channel_id, std::move(frame));
625
626 if (!rtc_error.ok()) {
627 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
628 << ToString(rtc_error.type()) << ", "
629 << rtc_error.message();
630 return -1;
631 }
632
633 ++media_transport_sequence_number_;
634
635 return 0;
636}
637
Niels Möller530ead42018-10-04 14:28:39 +0200638ChannelSend::ChannelSend(rtc::TaskQueue* encoder_queue,
639 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200640 MediaTransportInterface* media_transport,
Niels Möllere9771992018-11-26 10:55:07 +0100641 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200642 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700643 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700644 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100645 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800646 bool extmap_allow_mixed,
647 int rtcp_report_interval_ms)
Niels Möller530ead42018-10-04 14:28:39 +0200648 : event_log_(rtc_event_log),
649 _timeStamp(0), // This is just an offset, RTP module will add it's own
650 // random offset
651 send_sequence_number_(0),
652 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200653 input_mute_(false),
654 previous_frame_muted_(false),
655 _includeAudioLevelIndication(false),
656 transport_overhead_per_packet_(0),
657 rtp_overhead_per_packet_(0),
658 rtcp_observer_(new VoERtcpObserver(this)),
659 feedback_observer_proxy_(new TransportFeedbackProxy()),
660 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
661 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
662 retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(),
663 kMaxRetransmissionWindowMs)),
664 use_twcc_plr_for_ana_(
665 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Benjamin Wright84583f62018-10-04 14:22:34 -0700666 encoder_queue_(encoder_queue),
Niels Möller7d76a312018-10-26 12:57:07 +0200667 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700668 frame_encryptor_(frame_encryptor),
669 crypto_options_(crypto_options) {
Niels Möller530ead42018-10-04 14:28:39 +0200670 RTC_DCHECK(module_process_thread);
671 RTC_DCHECK(encoder_queue);
Niels Möllerdced9f62018-11-19 10:27:07 +0100672 module_process_thread_checker_.DetachFromThread();
673
Niels Möller530ead42018-10-04 14:28:39 +0200674 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
675
676 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800677
678 // We gradually remove codepaths that depend on RTP when using media
679 // transport. All of this logic should be moved to the future
680 // RTPMediaTransport. In this case it means that overhead and bandwidth
681 // observers should not be called when using media transport.
682 if (!media_transport_) {
683 configuration.overhead_observer = this;
684 configuration.bandwidth_callback = rtcp_observer_.get();
685 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
686 }
687
Niels Möller530ead42018-10-04 14:28:39 +0200688 configuration.audio = true;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100689 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200690
691 configuration.paced_sender = rtp_packet_sender_proxy_.get();
692 configuration.transport_sequence_number_allocator =
693 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200694
695 configuration.event_log = event_log_;
696 configuration.rtt_stats = rtcp_rtt_stats;
697 configuration.retransmission_rate_limiter =
698 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100699 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800700 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200701
702 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
703 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200704
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800705 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
706 // callbacks after the audio_coding_ is fully initialized.
707 if (media_transport_) {
708 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
709 media_transport_->AddTargetTransferRateObserver(this);
710 OnOverheadChanged(media_transport_->GetAudioPacketOverhead());
711 } else {
712 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
713 }
714
Niels Möller530ead42018-10-04 14:28:39 +0200715 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
716
Niels Möller530ead42018-10-04 14:28:39 +0200717 // Ensure that RTCP is enabled by default for the created channel.
718 // Note that, the module will keep generating RTCP until it is explicitly
719 // disabled by the user.
720 // After StopListen (when no sockets exists), RTCP packets will no longer
721 // be transmitted since the Transport object will then be invalid.
722 // RTCP is enabled by default.
723 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
724
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100725 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200726 RTC_DCHECK_EQ(0, error);
727}
728
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100729ChannelSend::~ChannelSend() {
Niels Möller530ead42018-10-04 14:28:39 +0200730 RTC_DCHECK(construction_thread_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +0200731
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800732 if (media_transport_) {
733 media_transport_->RemoveTargetTransferRateObserver(this);
734 }
735
Niels Möller530ead42018-10-04 14:28:39 +0200736 StopSend();
737
Niels Möller530ead42018-10-04 14:28:39 +0200738 int error = audio_coding_->RegisterTransportCallback(NULL);
739 RTC_DCHECK_EQ(0, error);
740
Niels Möller530ead42018-10-04 14:28:39 +0200741 if (_moduleProcessThreadPtr)
742 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200743}
744
Niels Möller26815232018-11-16 09:32:40 +0100745void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100746 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100747 RTC_DCHECK(!sending_);
748 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200749
750 // Resume the previous sequence number which was reset by StopSend(). This
751 // needs to be done before |sending| is set to true on the RTP/RTCP module.
752 if (send_sequence_number_) {
753 _rtpRtcpModule->SetSequenceNumber(send_sequence_number_);
754 }
755 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100756 int ret = _rtpRtcpModule->SetSendingStatus(true);
757 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200758 {
759 // It is now OK to start posting tasks to the encoder task queue.
760 rtc::CritScope cs(&encoder_queue_lock_);
761 encoder_queue_is_active_ = true;
762 }
Niels Möller530ead42018-10-04 14:28:39 +0200763}
764
765void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100766 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100767 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200768 return;
769 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100770 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200771
772 // Post a task to the encoder thread which sets an event when the task is
773 // executed. We know that no more encoding tasks will be added to the task
774 // queue for this channel since sending is now deactivated. It means that,
775 // if we wait for the event to bet set, we know that no more pending tasks
776 // exists and it is therfore guaranteed that the task queue will never try
777 // to acccess and invalid channel object.
778 RTC_DCHECK(encoder_queue_);
779
Niels Möllerc572ff32018-11-07 08:43:50 +0100780 rtc::Event flush;
Niels Möller530ead42018-10-04 14:28:39 +0200781 {
782 // Clear |encoder_queue_is_active_| under lock to prevent any other tasks
783 // than this final "flush task" to be posted on the queue.
784 rtc::CritScope cs(&encoder_queue_lock_);
785 encoder_queue_is_active_ = false;
786 encoder_queue_->PostTask([&flush]() { flush.Set(); });
787 }
788 flush.Wait(rtc::Event::kForever);
789
790 // Store the sequence number to be able to pick up the same sequence for
791 // the next StartSend(). This is needed for restarting device, otherwise
792 // it might cause libSRTP to complain about packets being replayed.
793 // TODO(xians): Remove this workaround after RtpRtcpModule's refactoring
794 // CL is landed. See issue
795 // https://code.google.com/p/webrtc/issues/detail?id=2111 .
796 send_sequence_number_ = _rtpRtcpModule->SequenceNumber();
797
798 // 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
806bool ChannelSend::SetEncoder(int payload_type,
807 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.
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100814 _rtpRtcpModule->RegisterAudioSendPayload(payload_type,
815 "audio",
816 encoder->RtpTimestampRateHz(),
817 encoder->NumChannels(),
818 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));
828 return true;
829}
830
831void ChannelSend::ModifyEncoder(
832 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Niels Möller26e88b02018-11-19 15:08:13 +0100833 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200834 audio_coding_->ModifyEncoder(modifier);
835}
836
Sebastian Jansson254d8692018-11-21 19:19:00 +0100837void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100838 // This method can be called on the worker thread, module process thread
839 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
840 // TODO(solenberg): Figure out a good way to check this or enforce calling
841 // rules.
842 // RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
843 // module_process_thread_checker_.CalledOnValidThread());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800844 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100845
Niels Möller530ead42018-10-04 14:28:39 +0200846 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
847 if (*encoder) {
Sebastian Jansson254d8692018-11-21 19:19:00 +0100848 (*encoder)->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200849 }
850 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100851 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
852 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200853}
854
Niels Möllerdced9f62018-11-19 10:27:07 +0100855int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800856 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200857 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200858}
859
860void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100861 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200862 if (!use_twcc_plr_for_ana_)
863 return;
864 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
865 if (*encoder) {
866 (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
867 }
868 });
869}
870
871void ChannelSend::OnRecoverableUplinkPacketLossRate(
872 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100873 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200874 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
875 if (*encoder) {
876 (*encoder)->OnReceivedUplinkRecoverablePacketLossFraction(
877 recoverable_packet_loss_rate);
878 }
879 });
880}
881
882void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
883 if (use_twcc_plr_for_ana_)
884 return;
885 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
886 if (*encoder) {
887 (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
888 }
889 });
890}
891
Niels Möller26815232018-11-16 09:32:40 +0100892// TODO(nisse): Delete always-true return value.
893bool ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100894 // May be called on either worker thread or network thread.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800895 if (media_transport_) {
896 // Ignore RTCP packets while media transport is used.
897 // Those packets should not arrive, but we are seeing occasional packets.
898 return 0;
899 }
900
Niels Möller530ead42018-10-04 14:28:39 +0200901 // Deliver RTCP packet to RTP/RTCP module for parsing
902 _rtpRtcpModule->IncomingRtcpPacket(data, length);
903
904 int64_t rtt = GetRTT();
905 if (rtt == 0) {
906 // Waiting for valid RTT.
Niels Möller26815232018-11-16 09:32:40 +0100907 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200908 }
909
910 int64_t nack_window_ms = rtt;
911 if (nack_window_ms < kMinRetransmissionWindowMs) {
912 nack_window_ms = kMinRetransmissionWindowMs;
913 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
914 nack_window_ms = kMaxRetransmissionWindowMs;
915 }
916 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
917
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800918 OnReceivedRtt(rtt);
Niels Möller26815232018-11-16 09:32:40 +0100919 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200920}
921
922void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100923 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200924 rtc::CritScope cs(&volume_settings_critsect_);
925 input_mute_ = enable;
926}
927
928bool ChannelSend::InputMute() const {
929 rtc::CritScope cs(&volume_settings_critsect_);
930 return input_mute_;
931}
932
Niels Möller26815232018-11-16 09:32:40 +0100933bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100934 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200935 RTC_DCHECK_LE(0, event);
936 RTC_DCHECK_GE(255, event);
937 RTC_DCHECK_LE(0, duration_ms);
938 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100939 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100940 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200941 }
942 if (_rtpRtcpModule->SendTelephoneEventOutband(
943 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
944 RTC_DLOG(LS_ERROR) << "SendTelephoneEventOutband() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100945 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200946 }
Niels Möller26815232018-11-16 09:32:40 +0100947 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200948}
949
Niels Möller26815232018-11-16 09:32:40 +0100950bool ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
951 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100952 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200953 RTC_DCHECK_LE(0, payload_type);
954 RTC_DCHECK_GE(127, payload_type);
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100955 _rtpRtcpModule->RegisterAudioSendPayload(payload_type, "telephone-event",
956 payload_frequency, 0, 0);
Niels Möller26815232018-11-16 09:32:40 +0100957 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200958}
959
Niels Möllerdced9f62018-11-19 10:27:07 +0100960void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100961 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100962 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100963
Niels Möller7d76a312018-10-26 12:57:07 +0200964 if (media_transport_) {
965 rtc::CritScope cs(&media_transport_lock_);
966 media_transport_channel_id_ = ssrc;
967 }
Niels Möller530ead42018-10-04 14:28:39 +0200968 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200969}
970
Amit Hilbuch77938e62018-12-21 09:23:38 -0800971void ChannelSend::SetRid(const std::string& rid,
972 int extension_id,
973 int repaired_extension_id) {
974 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
975 if (extension_id != 0) {
976 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
977 extension_id);
978 RTC_DCHECK_EQ(0, ret);
979 }
980 if (repaired_extension_id != 0) {
981 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
982 repaired_extension_id);
983 RTC_DCHECK_EQ(0, ret);
984 }
985 _rtpRtcpModule->SetRid(rid);
986}
987
Niels Möller530ead42018-10-04 14:28:39 +0200988void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100989 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200990 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
991 RTC_DCHECK_EQ(0, ret);
992 _rtpRtcpModule->SetMid(mid);
993}
994
Johannes Kron9190b822018-10-29 11:22:05 +0100995void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +0100996 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +0100997 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
998}
999
Niels Möller26815232018-11-16 09:32:40 +01001000void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +01001001 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001002 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +01001003 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
1004 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +02001005}
1006
1007void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +01001008 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001009 int ret =
1010 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
1011 RTC_DCHECK_EQ(0, ret);
1012}
1013
1014void ChannelSend::RegisterSenderCongestionControlObjects(
1015 RtpTransportControllerSendInterface* transport,
1016 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +01001017 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001018 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
1019 TransportFeedbackObserver* transport_feedback_observer =
1020 transport->transport_feedback_observer();
1021 PacketRouter* packet_router = transport->packet_router();
1022
1023 RTC_DCHECK(rtp_packet_sender);
1024 RTC_DCHECK(transport_feedback_observer);
1025 RTC_DCHECK(packet_router);
1026 RTC_DCHECK(!packet_router_);
1027 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
1028 feedback_observer_proxy_->SetTransportFeedbackObserver(
1029 transport_feedback_observer);
1030 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
1031 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
1032 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
1033 constexpr bool remb_candidate = false;
1034 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
1035 packet_router_ = packet_router;
1036}
1037
1038void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001039 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001040 RTC_DCHECK(packet_router_);
1041 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1042 rtcp_observer_->SetBandwidthObserver(nullptr);
1043 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1044 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1045 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1046 packet_router_ = nullptr;
1047 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
1048}
1049
Niels Möller26815232018-11-16 09:32:40 +01001050void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001051 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001052 // Note: SetCNAME() accepts a c string of length at most 255.
1053 const std::string c_name_limited(c_name.substr(0, 255));
1054 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1055 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001056}
1057
Niels Möller26815232018-11-16 09:32:40 +01001058std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001059 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001060 // Get the report blocks from the latest received RTCP Sender or Receiver
1061 // Report. Each element in the vector contains the sender's SSRC and a
1062 // report block according to RFC 3550.
1063 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001064
Niels Möller26815232018-11-16 09:32:40 +01001065 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1066 RTC_DCHECK_EQ(0, ret);
1067
1068 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001069
1070 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1071 for (; it != rtcp_report_blocks.end(); ++it) {
1072 ReportBlock report_block;
1073 report_block.sender_SSRC = it->sender_ssrc;
1074 report_block.source_SSRC = it->source_ssrc;
1075 report_block.fraction_lost = it->fraction_lost;
1076 report_block.cumulative_num_packets_lost = it->packets_lost;
1077 report_block.extended_highest_sequence_number =
1078 it->extended_highest_sequence_number;
1079 report_block.interarrival_jitter = it->jitter;
1080 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1081 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001082 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001083 }
Niels Möller26815232018-11-16 09:32:40 +01001084 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001085}
1086
Niels Möller26815232018-11-16 09:32:40 +01001087CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001088 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001089 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001090 stats.rttMs = GetRTT();
1091
Niels Möller530ead42018-10-04 14:28:39 +02001092 size_t bytesSent(0);
1093 uint32_t packetsSent(0);
1094
1095 if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
1096 RTC_DLOG(LS_WARNING)
1097 << "GetRTPStatistics() failed to retrieve RTP datacounters"
1098 << " => output will not be complete";
1099 }
1100
1101 stats.bytesSent = bytesSent;
1102 stats.packetsSent = packetsSent;
1103
Niels Möller26815232018-11-16 09:32:40 +01001104 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001105}
1106
Niels Möller530ead42018-10-04 14:28:39 +02001107void ChannelSend::ProcessAndEncodeAudio(
1108 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001109 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001110 // Avoid posting any new tasks if sending was already stopped in StopSend().
1111 rtc::CritScope cs(&encoder_queue_lock_);
1112 if (!encoder_queue_is_active_) {
1113 return;
1114 }
1115 // Profile time between when the audio frame is added to the task queue and
1116 // when the task is actually executed.
1117 audio_frame->UpdateProfileTimeStamp();
1118 encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
1119 new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
1120}
1121
1122void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
1123 RTC_DCHECK_RUN_ON(encoder_queue_);
1124 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
1125 RTC_DCHECK_LE(audio_input->num_channels_, 2);
1126
1127 // Measure time between when the audio frame is added to the task queue and
1128 // when the task is actually executed. Goal is to keep track of unwanted
1129 // extra latency added by the task queue.
1130 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1131 audio_input->ElapsedProfileTimeMs());
1132
1133 bool is_muted = InputMute();
1134 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1135
1136 if (_includeAudioLevelIndication) {
1137 size_t length =
1138 audio_input->samples_per_channel_ * audio_input->num_channels_;
1139 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1140 if (is_muted && previous_frame_muted_) {
1141 rms_level_.AnalyzeMuted(length);
1142 } else {
1143 rms_level_.Analyze(
1144 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1145 }
1146 }
1147 previous_frame_muted_ = is_muted;
1148
1149 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1150
1151 // The ACM resamples internally.
1152 audio_input->timestamp_ = _timeStamp;
1153 // This call will trigger AudioPacketizationCallback::SendData if encoding
1154 // is done and payload is ready for packetization and transmission.
1155 // Otherwise, it will return without invoking the callback.
1156 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1157 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1158 return;
1159 }
1160
1161 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1162}
1163
1164void ChannelSend::UpdateOverheadForEncoder() {
1165 size_t overhead_per_packet =
1166 transport_overhead_per_packet_ + rtp_overhead_per_packet_;
1167 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
1168 if (*encoder) {
1169 (*encoder)->OnReceivedOverhead(overhead_per_packet);
1170 }
1171 });
1172}
1173
1174void ChannelSend::SetTransportOverhead(size_t transport_overhead_per_packet) {
Niels Möller26e88b02018-11-19 15:08:13 +01001175 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001176 rtc::CritScope cs(&overhead_per_packet_lock_);
1177 transport_overhead_per_packet_ = transport_overhead_per_packet;
1178 UpdateOverheadForEncoder();
1179}
1180
1181// TODO(solenberg): Make AudioSendStream an OverheadObserver instead.
1182void ChannelSend::OnOverheadChanged(size_t overhead_bytes_per_packet) {
1183 rtc::CritScope cs(&overhead_per_packet_lock_);
1184 rtp_overhead_per_packet_ = overhead_bytes_per_packet;
1185 UpdateOverheadForEncoder();
1186}
1187
1188ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001189 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001190 return audio_coding_->GetANAStats();
1191}
1192
1193RtpRtcp* ChannelSend::GetRtpRtcp() const {
Niels Möllerdced9f62018-11-19 10:27:07 +01001194 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +02001195 return _rtpRtcpModule.get();
1196}
1197
1198int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1199 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001200 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001201 int error = 0;
1202 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1203 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001204 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1205 // argument. Currently it wants an uint8_t.
1206 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1207 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001208 }
1209 return error;
1210}
1211
Niels Möller530ead42018-10-04 14:28:39 +02001212int64_t ChannelSend::GetRTT() const {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001213 if (media_transport_) {
1214 // GetRTT is generally used in the RTCP codepath, where media transport is
1215 // not present and so it shouldn't be needed. But it's also invoked in
1216 // 'GetStats' method, and for now returning media transport RTT here gives
1217 // us "free" rtt stats for media transport.
1218 auto target_rate = media_transport_->GetLatestTargetTransferRate();
1219 if (target_rate.has_value()) {
1220 return target_rate.value().network_estimate.round_trip_time.ms();
1221 }
1222
1223 return 0;
1224 }
Niels Möller530ead42018-10-04 14:28:39 +02001225 RtcpMode method = _rtpRtcpModule->RTCP();
1226 if (method == RtcpMode::kOff) {
1227 return 0;
1228 }
1229 std::vector<RTCPReportBlock> report_blocks;
1230 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1231
1232 if (report_blocks.empty()) {
1233 return 0;
1234 }
1235
1236 int64_t rtt = 0;
1237 int64_t avg_rtt = 0;
1238 int64_t max_rtt = 0;
1239 int64_t min_rtt = 0;
1240 // We don't know in advance the remote ssrc used by the other end's receiver
1241 // reports, so use the SSRC of the first report block for calculating the RTT.
1242 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1243 &min_rtt, &max_rtt) != 0) {
1244 return 0;
1245 }
1246 return rtt;
1247}
1248
Benjamin Wright78410ad2018-10-25 09:52:57 -07001249void ChannelSend::SetFrameEncryptor(
1250 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001251 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Benjamin Wright84583f62018-10-04 14:22:34 -07001252 rtc::CritScope cs(&encoder_queue_lock_);
1253 if (encoder_queue_is_active_) {
1254 encoder_queue_->PostTask([this, frame_encryptor]() {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001255 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001256 });
1257 } else {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001258 frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001259 }
1260}
1261
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001262void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
1263 RTC_DCHECK(media_transport_);
1264 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1265}
1266
1267void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1268 // Invoke audio encoders OnReceivedRtt().
1269 audio_coding_->ModifyEncoder(
1270 [rtt_ms](std::unique_ptr<AudioEncoder>* encoder) {
1271 if (*encoder) {
1272 (*encoder)->OnReceivedRtt(rtt_ms);
1273 }
1274 });
1275}
1276
Niels Möllerdced9f62018-11-19 10:27:07 +01001277} // namespace
1278
1279std::unique_ptr<ChannelSendInterface> CreateChannelSend(
1280 rtc::TaskQueue* encoder_queue,
1281 ProcessThread* module_process_thread,
1282 MediaTransportInterface* media_transport,
Niels Möllere9771992018-11-26 10:55:07 +01001283 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001284 RtcpRttStats* rtcp_rtt_stats,
1285 RtcEventLog* rtc_event_log,
1286 FrameEncryptorInterface* frame_encryptor,
1287 const webrtc::CryptoOptions& crypto_options,
1288 bool extmap_allow_mixed,
1289 int rtcp_report_interval_ms) {
1290 return absl::make_unique<ChannelSend>(
Niels Möllere9771992018-11-26 10:55:07 +01001291 encoder_queue, module_process_thread, media_transport, rtp_transport,
1292 rtcp_rtt_stats, rtc_event_log, frame_encryptor, crypto_options,
1293 extmap_allow_mixed, rtcp_report_interval_ms);
Niels Möllerdced9f62018-11-19 10:27:07 +01001294}
1295
Niels Möller530ead42018-10-04 14:28:39 +02001296} // namespace voe
1297} // namespace webrtc