blob: 2db4ff713ec8652fa35d6197465f5faad7f669a6 [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"
Yves Gerey2e00abc2018-10-05 15:39:24 +020034#include "rtc_base/event.h"
Niels Möller530ead42018-10-04 14:28:39 +020035#include "rtc_base/format_macros.h"
36#include "rtc_base/location.h"
37#include "rtc_base/logging.h"
Niels Möller26815232018-11-16 09:32:40 +010038#include "rtc_base/numerics/safe_conversions.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010039#include "rtc_base/race_checker.h"
Niels Möller530ead42018-10-04 14:28:39 +020040#include "rtc_base/rate_limiter.h"
41#include "rtc_base/task_queue.h"
42#include "rtc_base/thread_checker.h"
Steve Anton10542f22019-01-11 09:11:00 -080043#include "rtc_base/time_utils.h"
Niels Möller530ead42018-10-04 14:28:39 +020044#include "system_wrappers/include/field_trial.h"
45#include "system_wrappers/include/metrics.h"
46
47namespace webrtc {
48namespace voe {
49
50namespace {
51
52constexpr int64_t kMaxRetransmissionWindowMs = 1000;
53constexpr int64_t kMinRetransmissionWindowMs = 30;
54
Niels Möller7d76a312018-10-26 12:57:07 +020055MediaTransportEncodedAudioFrame::FrameType
56MediaTransportFrameTypeForWebrtcFrameType(webrtc::FrameType frame_type) {
57 switch (frame_type) {
58 case kAudioFrameSpeech:
59 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
60 break;
61
62 case kAudioFrameCN:
63 return MediaTransportEncodedAudioFrame::FrameType::
64 kDiscontinuousTransmission;
65 break;
66
67 default:
68 RTC_CHECK(false) << "Unexpected frame type=" << frame_type;
69 break;
70 }
71}
72
Niels Möllerdced9f62018-11-19 10:27:07 +010073class RtpPacketSenderProxy;
74class TransportFeedbackProxy;
75class TransportSequenceNumberProxy;
76class VoERtcpObserver;
77
Niels Möllerdced9f62018-11-19 10:27:07 +010078class ChannelSend
79 : public ChannelSendInterface,
Niels Möllerdced9f62018-11-19 10:27:07 +010080 public AudioPacketizationCallback, // receive encoded packets from the
81 // ACM
82 public TargetTransferRateObserver {
83 public:
84 // TODO(nisse): Make OnUplinkPacketLossRate public, and delete friend
85 // declaration.
86 friend class VoERtcpObserver;
87
88 ChannelSend(rtc::TaskQueue* encoder_queue,
89 ProcessThread* module_process_thread,
90 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -080091 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +010092 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +010093 RtcpRttStats* rtcp_rtt_stats,
94 RtcEventLog* rtc_event_log,
95 FrameEncryptorInterface* frame_encryptor,
96 const webrtc::CryptoOptions& crypto_options,
97 bool extmap_allow_mixed,
98 int rtcp_report_interval_ms);
99
100 ~ChannelSend() override;
101
102 // Send using this encoder, with this payload type.
103 bool SetEncoder(int payload_type,
104 std::unique_ptr<AudioEncoder> encoder) override;
105 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
106 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100107 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100108
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
Niels Möllerdced9f62018-11-19 10:27:07 +0100163 // The existence of this function alongside OnUplinkPacketLossRate is
164 // a compromise. We want the encoder to be agnostic of the PLR source, but
165 // we also don't want it to receive conflicting information from TWCC and
166 // from RTCP-XR.
167 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
168
169 void OnRecoverableUplinkPacketLossRate(
170 float recoverable_packet_loss_rate) override;
171
172 int64_t GetRTT() const override;
173
174 // E2EE Custom Audio Frame Encryption
175 void SetFrameEncryptor(
176 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
177
178 private:
Niels Möllerdced9f62018-11-19 10:27:07 +0100179 // From AudioPacketizationCallback in the ACM
180 int32_t SendData(FrameType frameType,
181 uint8_t payloadType,
182 uint32_t timeStamp,
183 const uint8_t* payloadData,
184 size_t payloadSize,
185 const RTPFragmentationHeader* fragmentation) override;
186
Niels Möllerdced9f62018-11-19 10:27:07 +0100187 void OnUplinkPacketLossRate(float packet_loss_rate);
188 bool InputMute() const;
189
Niels Möllerdced9f62018-11-19 10:27:07 +0100190 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, int id);
191
Niels Möllerdced9f62018-11-19 10:27:07 +0100192 int32_t SendRtpAudio(FrameType frameType,
193 uint8_t payloadType,
194 uint32_t timeStamp,
195 rtc::ArrayView<const uint8_t> payload,
196 const RTPFragmentationHeader* fragmentation);
197
198 int32_t SendMediaTransportAudio(FrameType frameType,
199 uint8_t payloadType,
200 uint32_t timeStamp,
201 rtc::ArrayView<const uint8_t> payload,
202 const RTPFragmentationHeader* fragmentation);
203
204 // Return media transport or nullptr if using RTP.
205 MediaTransportInterface* media_transport() { return media_transport_; }
206
207 // Called on the encoder task queue when a new input audio frame is ready
208 // for encoding.
209 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input);
210
211 void OnReceivedRtt(int64_t rtt_ms);
212
213 void OnTargetTransferRate(TargetTransferRate) override;
214
215 // Thread checkers document and lock usage of some methods on voe::Channel to
216 // specific threads we know about. The goal is to eventually split up
217 // voe::Channel into parts with single-threaded semantics, and thereby reduce
218 // the need for locks.
219 rtc::ThreadChecker worker_thread_checker_;
220 rtc::ThreadChecker module_process_thread_checker_;
221 // Methods accessed from audio and video threads are checked for sequential-
222 // only access. We don't necessarily own and control these threads, so thread
223 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
224 // audio thread to another, but access is still sequential.
225 rtc::RaceChecker audio_thread_race_checker_;
226
Niels Möllerdced9f62018-11-19 10:27:07 +0100227 rtc::CriticalSection volume_settings_critsect_;
228
Niels Möller26e88b02018-11-19 15:08:13 +0100229 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100230
231 RtcEventLog* const event_log_;
232
233 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
234
235 std::unique_ptr<AudioCodingModule> audio_coding_;
236 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
237
Niels Möllerdced9f62018-11-19 10:27:07 +0100238 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100239 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100240 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
241 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
242 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
243 // VoeRTP_RTCP
244 // TODO(henrika): can today be accessed on the main thread and on the
245 // task queue; hence potential race.
246 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800247
Niels Möllerdced9f62018-11-19 10:27:07 +0100248 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100249 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100250
Niels Möller985a1f32018-11-19 16:08:42 +0100251 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
252 nullptr;
253 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
254 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
255 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_sender_proxy_;
256 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100257
258 rtc::ThreadChecker construction_thread_;
259
260 const bool use_twcc_plr_for_ana_;
261
Sebastian Jansson9b934472019-03-04 18:18:01 +0100262 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_) = false;
Niels Möller985a1f32018-11-19 16:08:42 +0100263 rtc::TaskQueue* const encoder_queue_ = nullptr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100264
265 MediaTransportInterface* const media_transport_;
266 int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
267
268 rtc::CriticalSection media_transport_lock_;
269 // Currently set by SetLocalSSRC.
270 uint64_t media_transport_channel_id_ RTC_GUARDED_BY(&media_transport_lock_) =
271 0;
272 // Cache payload type and sampling frequency from most recent call to
273 // SetEncoder. Needed to set MediaTransportEncodedAudioFrame metadata, and
274 // invalidate on encoder change.
275 int media_transport_payload_type_ RTC_GUARDED_BY(&media_transport_lock_);
276 int media_transport_sampling_frequency_
277 RTC_GUARDED_BY(&media_transport_lock_);
278
279 // E2EE Audio Frame Encryption
280 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_;
281 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100282 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100283
284 rtc::CriticalSection bitrate_crit_section_;
285 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
286};
Niels Möller530ead42018-10-04 14:28:39 +0200287
288const int kTelephoneEventAttenuationdB = 10;
289
290class TransportFeedbackProxy : public TransportFeedbackObserver {
291 public:
292 TransportFeedbackProxy() : feedback_observer_(nullptr) {
293 pacer_thread_.DetachFromThread();
294 network_thread_.DetachFromThread();
295 }
296
297 void SetTransportFeedbackObserver(
298 TransportFeedbackObserver* feedback_observer) {
299 RTC_DCHECK(thread_checker_.CalledOnValidThread());
300 rtc::CritScope lock(&crit_);
301 feedback_observer_ = feedback_observer;
302 }
303
304 // Implements TransportFeedbackObserver.
305 void AddPacket(uint32_t ssrc,
306 uint16_t sequence_number,
307 size_t length,
308 const PacedPacketInfo& pacing_info) override {
309 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
310 rtc::CritScope lock(&crit_);
311 if (feedback_observer_)
312 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
313 }
314
315 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
316 RTC_DCHECK(network_thread_.CalledOnValidThread());
317 rtc::CritScope lock(&crit_);
318 if (feedback_observer_)
319 feedback_observer_->OnTransportFeedback(feedback);
320 }
321
322 private:
323 rtc::CriticalSection crit_;
324 rtc::ThreadChecker thread_checker_;
325 rtc::ThreadChecker pacer_thread_;
326 rtc::ThreadChecker network_thread_;
327 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
328};
329
330class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
331 public:
332 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
333 pacer_thread_.DetachFromThread();
334 }
335
336 void SetSequenceNumberAllocator(
337 TransportSequenceNumberAllocator* seq_num_allocator) {
338 RTC_DCHECK(thread_checker_.CalledOnValidThread());
339 rtc::CritScope lock(&crit_);
340 seq_num_allocator_ = seq_num_allocator;
341 }
342
343 // Implements TransportSequenceNumberAllocator.
344 uint16_t AllocateSequenceNumber() override {
345 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
346 rtc::CritScope lock(&crit_);
347 if (!seq_num_allocator_)
348 return 0;
349 return seq_num_allocator_->AllocateSequenceNumber();
350 }
351
352 private:
353 rtc::CriticalSection crit_;
354 rtc::ThreadChecker thread_checker_;
355 rtc::ThreadChecker pacer_thread_;
356 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
357};
358
359class RtpPacketSenderProxy : public RtpPacketSender {
360 public:
361 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
362
363 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
364 RTC_DCHECK(thread_checker_.CalledOnValidThread());
365 rtc::CritScope lock(&crit_);
366 rtp_packet_sender_ = rtp_packet_sender;
367 }
368
369 // Implements RtpPacketSender.
370 void InsertPacket(Priority priority,
371 uint32_t ssrc,
372 uint16_t sequence_number,
373 int64_t capture_time_ms,
374 size_t bytes,
375 bool retransmission) override {
376 rtc::CritScope lock(&crit_);
377 if (rtp_packet_sender_) {
378 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
379 capture_time_ms, bytes, retransmission);
380 }
381 }
382
383 void SetAccountForAudioPackets(bool account_for_audio) override {
384 RTC_NOTREACHED();
385 }
386
387 private:
388 rtc::ThreadChecker thread_checker_;
389 rtc::CriticalSection crit_;
390 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
391};
392
393class VoERtcpObserver : public RtcpBandwidthObserver {
394 public:
395 explicit VoERtcpObserver(ChannelSend* owner)
396 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100397 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200398
399 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
400 rtc::CritScope lock(&crit_);
401 bandwidth_observer_ = bandwidth_observer;
402 }
403
404 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
405 rtc::CritScope lock(&crit_);
406 if (bandwidth_observer_) {
407 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
408 }
409 }
410
411 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
412 int64_t rtt,
413 int64_t now_ms) override {
414 {
415 rtc::CritScope lock(&crit_);
416 if (bandwidth_observer_) {
417 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
418 now_ms);
419 }
420 }
421 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
422 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
423 // report for VoiceEngine?
424 if (report_blocks.empty())
425 return;
426
427 int fraction_lost_aggregate = 0;
428 int total_number_of_packets = 0;
429
430 // If receiving multiple report blocks, calculate the weighted average based
431 // on the number of packets a report refers to.
432 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
433 block_it != report_blocks.end(); ++block_it) {
434 // Find the previous extended high sequence number for this remote SSRC,
435 // to calculate the number of RTP packets this report refers to. Ignore if
436 // we haven't seen this SSRC before.
437 std::map<uint32_t, uint32_t>::iterator seq_num_it =
438 extended_max_sequence_number_.find(block_it->source_ssrc);
439 int number_of_packets = 0;
440 if (seq_num_it != extended_max_sequence_number_.end()) {
441 number_of_packets =
442 block_it->extended_highest_sequence_number - seq_num_it->second;
443 }
444 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
445 total_number_of_packets += number_of_packets;
446
447 extended_max_sequence_number_[block_it->source_ssrc] =
448 block_it->extended_highest_sequence_number;
449 }
450 int weighted_fraction_lost = 0;
451 if (total_number_of_packets > 0) {
452 weighted_fraction_lost =
453 (fraction_lost_aggregate + total_number_of_packets / 2) /
454 total_number_of_packets;
455 }
456 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
457 }
458
459 private:
460 ChannelSend* owner_;
461 // Maps remote side ssrc to extended highest sequence number received.
462 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
463 rtc::CriticalSection crit_;
464 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
465};
466
Niels Möller530ead42018-10-04 14:28:39 +0200467int32_t ChannelSend::SendData(FrameType frameType,
468 uint8_t payloadType,
469 uint32_t timeStamp,
470 const uint8_t* payloadData,
471 size_t payloadSize,
472 const RTPFragmentationHeader* fragmentation) {
473 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200474 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
475
476 if (media_transport() != nullptr) {
Piotr (Peter) Slatala3cdd4d52019-02-28 07:10:56 -0800477 if (frameType == kEmptyFrame) {
478 // TODO(bugs.webrtc.org/9719): Media transport Send doesn't support
479 // sending empty frames.
480 return 0;
481 }
482
Niels Möller7d76a312018-10-26 12:57:07 +0200483 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload,
484 fragmentation);
485 } else {
486 return SendRtpAudio(frameType, payloadType, timeStamp, payload,
487 fragmentation);
488 }
489}
490
491int32_t ChannelSend::SendRtpAudio(FrameType frameType,
492 uint8_t payloadType,
493 uint32_t timeStamp,
494 rtc::ArrayView<const uint8_t> payload,
495 const RTPFragmentationHeader* fragmentation) {
496 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200497 if (_includeAudioLevelIndication) {
498 // Store current audio level in the RTP/RTCP module.
499 // The level will be used in combination with voice-activity state
500 // (frameType) to add an RTP header extension
501 _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
502 }
503
Benjamin Wright84583f62018-10-04 14:22:34 -0700504 // E2EE Custom Audio Frame Encryption (This is optional).
505 // Keep this buffer around for the lifetime of the send call.
506 rtc::Buffer encrypted_audio_payload;
507 if (frame_encryptor_ != nullptr) {
508 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
509 // Allocate a buffer to hold the maximum possible encrypted payload.
510 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200511 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700512 encrypted_audio_payload.SetSize(max_ciphertext_size);
513
514 // Encrypt the audio payload into the buffer.
515 size_t bytes_written = 0;
516 int encrypt_status = frame_encryptor_->Encrypt(
517 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200518 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
519 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700520 if (encrypt_status != 0) {
521 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
522 << encrypt_status;
523 return -1;
524 }
525 // Resize the buffer to the exact number of bytes actually used.
526 encrypted_audio_payload.SetSize(bytes_written);
527 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200528 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700529 } else if (crypto_options_.sframe.require_frame_encryption) {
530 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
531 << "A frame encryptor is required but one is not set.";
532 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700533 }
534
Niels Möller530ead42018-10-04 14:28:39 +0200535 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
536 // packetization.
537 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Möller7d76a312018-10-26 12:57:07 +0200538 if (!_rtpRtcpModule->SendOutgoingData((FrameType&)frameType, payloadType,
539 timeStamp,
540 // Leaving the time when this frame was
541 // received from the capture device as
542 // undefined for voice for now.
543 -1, payload.data(), payload.size(),
544 fragmentation, nullptr, nullptr)) {
Niels Möller530ead42018-10-04 14:28:39 +0200545 RTC_DLOG(LS_ERROR)
546 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
547 return -1;
548 }
549
550 return 0;
551}
552
Niels Möller7d76a312018-10-26 12:57:07 +0200553int32_t ChannelSend::SendMediaTransportAudio(
554 FrameType frameType,
555 uint8_t payloadType,
556 uint32_t timeStamp,
557 rtc::ArrayView<const uint8_t> payload,
558 const RTPFragmentationHeader* fragmentation) {
559 RTC_DCHECK_RUN_ON(encoder_queue_);
560 // TODO(nisse): Use null _transportPtr for MediaTransport.
561 // RTC_DCHECK(_transportPtr == nullptr);
562 uint64_t channel_id;
563 int sampling_rate_hz;
564 {
565 rtc::CritScope cs(&media_transport_lock_);
566 if (media_transport_payload_type_ != payloadType) {
567 // Payload type is being changed, media_transport_sampling_frequency_,
568 // no longer current.
569 return -1;
570 }
571 sampling_rate_hz = media_transport_sampling_frequency_;
572 channel_id = media_transport_channel_id_;
573 }
Mirko Bonadei1c546052019-02-04 14:50:38 +0100574 MediaTransportEncodedAudioFrame frame(
Niels Möller7d76a312018-10-26 12:57:07 +0200575 /*sampling_rate_hz=*/sampling_rate_hz,
576
577 // TODO(nisse): Timestamp and sample index are the same for all supported
578 // audio codecs except G722. Refactor audio coding module to only use
579 // sample index, and leave translation to RTP time, when needed, for
580 // RTP-specific code.
581 /*starting_sample_index=*/timeStamp,
582
583 // Sample count isn't conveniently available from the AudioCodingModule,
584 // and needs some refactoring to wire up in a good way. For now, left as
585 // zero.
586 /*sample_count=*/0,
587
588 /*sequence_number=*/media_transport_sequence_number_,
589 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
590 std::vector<uint8_t>(payload.begin(), payload.end()));
591
592 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
593 // channel id.
594 RTCError rtc_error =
595 media_transport()->SendAudioFrame(channel_id, std::move(frame));
596
597 if (!rtc_error.ok()) {
598 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
599 << ToString(rtc_error.type()) << ", "
600 << rtc_error.message();
601 return -1;
602 }
603
604 ++media_transport_sequence_number_;
605
606 return 0;
607}
608
Niels Möller530ead42018-10-04 14:28:39 +0200609ChannelSend::ChannelSend(rtc::TaskQueue* encoder_queue,
610 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200611 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -0800612 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +0100613 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200614 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700615 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700616 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100617 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800618 bool extmap_allow_mixed,
619 int rtcp_report_interval_ms)
Niels Möller530ead42018-10-04 14:28:39 +0200620 : event_log_(rtc_event_log),
621 _timeStamp(0), // This is just an offset, RTP module will add it's own
622 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200623 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200624 input_mute_(false),
625 previous_frame_muted_(false),
626 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200627 rtcp_observer_(new VoERtcpObserver(this)),
628 feedback_observer_proxy_(new TransportFeedbackProxy()),
629 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
630 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
631 retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(),
632 kMaxRetransmissionWindowMs)),
633 use_twcc_plr_for_ana_(
634 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Benjamin Wright84583f62018-10-04 14:22:34 -0700635 encoder_queue_(encoder_queue),
Niels Möller7d76a312018-10-26 12:57:07 +0200636 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700637 frame_encryptor_(frame_encryptor),
638 crypto_options_(crypto_options) {
Niels Möller530ead42018-10-04 14:28:39 +0200639 RTC_DCHECK(module_process_thread);
640 RTC_DCHECK(encoder_queue);
Niels Möllerdced9f62018-11-19 10:27:07 +0100641 module_process_thread_checker_.DetachFromThread();
642
Niels Möller530ead42018-10-04 14:28:39 +0200643 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
644
645 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800646
647 // We gradually remove codepaths that depend on RTP when using media
648 // transport. All of this logic should be moved to the future
649 // RTPMediaTransport. In this case it means that overhead and bandwidth
650 // observers should not be called when using media transport.
651 if (!media_transport_) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800652 // TODO(sukhanov): Overhead observer is only needed for RTP path, because in
653 // media transport audio overhead is currently considered constant (see
654 // getter MediaTransportInterface::GetAudioPacketOverhead). In the future
655 // when we introduce RTP media transport we should make audio overhead
656 // interface consistent and work for both RTP and non-RTP implementations.
657 configuration.overhead_observer = overhead_observer;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800658 configuration.bandwidth_callback = rtcp_observer_.get();
659 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
660 }
661
Niels Möller530ead42018-10-04 14:28:39 +0200662 configuration.audio = true;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100663 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200664
665 configuration.paced_sender = rtp_packet_sender_proxy_.get();
666 configuration.transport_sequence_number_allocator =
667 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200668
669 configuration.event_log = event_log_;
670 configuration.rtt_stats = rtcp_rtt_stats;
671 configuration.retransmission_rate_limiter =
672 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100673 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800674 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200675
676 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
677 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200678
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800679 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
680 // callbacks after the audio_coding_ is fully initialized.
681 if (media_transport_) {
682 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
683 media_transport_->AddTargetTransferRateObserver(this);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800684 } else {
685 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
686 }
687
Niels Möller530ead42018-10-04 14:28:39 +0200688 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
689
Niels Möller530ead42018-10-04 14:28:39 +0200690 // Ensure that RTCP is enabled by default for the created channel.
691 // Note that, the module will keep generating RTCP until it is explicitly
692 // disabled by the user.
693 // After StopListen (when no sockets exists), RTCP packets will no longer
694 // be transmitted since the Transport object will then be invalid.
695 // RTCP is enabled by default.
696 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
697
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100698 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200699 RTC_DCHECK_EQ(0, error);
700}
701
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100702ChannelSend::~ChannelSend() {
Niels Möller530ead42018-10-04 14:28:39 +0200703 RTC_DCHECK(construction_thread_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +0200704
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800705 if (media_transport_) {
706 media_transport_->RemoveTargetTransferRateObserver(this);
707 }
708
Niels Möller530ead42018-10-04 14:28:39 +0200709 StopSend();
Niels Möller530ead42018-10-04 14:28:39 +0200710 int error = audio_coding_->RegisterTransportCallback(NULL);
711 RTC_DCHECK_EQ(0, error);
712
Niels Möller530ead42018-10-04 14:28:39 +0200713 if (_moduleProcessThreadPtr)
714 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200715}
716
Niels Möller26815232018-11-16 09:32:40 +0100717void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100718 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100719 RTC_DCHECK(!sending_);
720 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200721
Niels Möller530ead42018-10-04 14:28:39 +0200722 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100723 int ret = _rtpRtcpModule->SetSendingStatus(true);
724 RTC_DCHECK_EQ(0, ret);
Sebastian Jansson9b934472019-03-04 18:18:01 +0100725 // It is now OK to start processing on the encoder task queue.
726 encoder_queue_->PostTask([this] {
727 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200728 encoder_queue_is_active_ = true;
Sebastian Jansson9b934472019-03-04 18:18:01 +0100729 });
Niels Möller530ead42018-10-04 14:28:39 +0200730}
731
732void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100733 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100734 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200735 return;
736 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100737 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200738
739 // Post a task to the encoder thread which sets an event when the task is
740 // executed. We know that no more encoding tasks will be added to the task
741 // queue for this channel since sending is now deactivated. It means that,
742 // if we wait for the event to bet set, we know that no more pending tasks
743 // exists and it is therfore guaranteed that the task queue will never try
744 // to acccess and invalid channel object.
745 RTC_DCHECK(encoder_queue_);
746
Niels Möllerc572ff32018-11-07 08:43:50 +0100747 rtc::Event flush;
Sebastian Jansson9b934472019-03-04 18:18:01 +0100748 encoder_queue_->PostTask([this, &flush]() {
749 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200750 encoder_queue_is_active_ = false;
Sebastian Jansson9b934472019-03-04 18:18:01 +0100751 flush.Set();
752 });
Niels Möller530ead42018-10-04 14:28:39 +0200753 flush.Wait(rtc::Event::kForever);
754
Niels Möller530ead42018-10-04 14:28:39 +0200755 // Reset sending SSRC and sequence number and triggers direct transmission
756 // of RTCP BYE
757 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
758 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
759 }
760 _rtpRtcpModule->SetSendingMediaStatus(false);
761}
762
763bool ChannelSend::SetEncoder(int payload_type,
764 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100765 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200766 RTC_DCHECK_GE(payload_type, 0);
767 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200768
769 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
770 // as well as some other things, so we collect this info and send it along.
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100771 _rtpRtcpModule->RegisterAudioSendPayload(payload_type,
772 "audio",
773 encoder->RtpTimestampRateHz(),
774 encoder->NumChannels(),
775 0);
Niels Möller530ead42018-10-04 14:28:39 +0200776
Niels Möller7d76a312018-10-26 12:57:07 +0200777 if (media_transport_) {
778 rtc::CritScope cs(&media_transport_lock_);
779 media_transport_payload_type_ = payload_type;
780 // TODO(nisse): Currently broken for G722, since timestamps passed through
781 // encoder use RTP clock rather than sample count, and they differ for G722.
782 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
783 }
Niels Möller530ead42018-10-04 14:28:39 +0200784 audio_coding_->SetEncoder(std::move(encoder));
785 return true;
786}
787
788void ChannelSend::ModifyEncoder(
789 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800790 // This method can be called on the worker thread, module process thread
791 // or network thread. Audio coding is thread safe, so we do not need to
792 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200793 audio_coding_->ModifyEncoder(modifier);
794}
795
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100796void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
797 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
798 if (*encoder_ptr) {
799 modifier(encoder_ptr->get());
800 } else {
801 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
802 }
803 });
804}
805
Sebastian Jansson254d8692018-11-21 19:19:00 +0100806void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100807 // This method can be called on the worker thread, module process thread
808 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
809 // TODO(solenberg): Figure out a good way to check this or enforce calling
810 // rules.
811 // RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
812 // module_process_thread_checker_.CalledOnValidThread());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800813 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100814
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100815 CallEncoder([&](AudioEncoder* encoder) {
816 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200817 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100818 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
819 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200820}
821
Niels Möllerdced9f62018-11-19 10:27:07 +0100822int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800823 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200824 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200825}
826
827void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100828 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200829 if (!use_twcc_plr_for_ana_)
830 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100831 CallEncoder([&](AudioEncoder* encoder) {
832 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200833 });
834}
835
836void ChannelSend::OnRecoverableUplinkPacketLossRate(
837 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100838 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100839 CallEncoder([&](AudioEncoder* encoder) {
840 encoder->OnReceivedUplinkRecoverablePacketLossFraction(
841 recoverable_packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200842 });
843}
844
845void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
846 if (use_twcc_plr_for_ana_)
847 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100848 CallEncoder([&](AudioEncoder* encoder) {
849 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200850 });
851}
852
Niels Möller26815232018-11-16 09:32:40 +0100853// TODO(nisse): Delete always-true return value.
854bool ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100855 // May be called on either worker thread or network thread.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800856 if (media_transport_) {
857 // Ignore RTCP packets while media transport is used.
858 // Those packets should not arrive, but we are seeing occasional packets.
859 return 0;
860 }
861
Niels Möller530ead42018-10-04 14:28:39 +0200862 // Deliver RTCP packet to RTP/RTCP module for parsing
863 _rtpRtcpModule->IncomingRtcpPacket(data, length);
864
865 int64_t rtt = GetRTT();
866 if (rtt == 0) {
867 // Waiting for valid RTT.
Niels Möller26815232018-11-16 09:32:40 +0100868 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200869 }
870
871 int64_t nack_window_ms = rtt;
872 if (nack_window_ms < kMinRetransmissionWindowMs) {
873 nack_window_ms = kMinRetransmissionWindowMs;
874 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
875 nack_window_ms = kMaxRetransmissionWindowMs;
876 }
877 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
878
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800879 OnReceivedRtt(rtt);
Niels Möller26815232018-11-16 09:32:40 +0100880 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200881}
882
883void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100884 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200885 rtc::CritScope cs(&volume_settings_critsect_);
886 input_mute_ = enable;
887}
888
889bool ChannelSend::InputMute() const {
890 rtc::CritScope cs(&volume_settings_critsect_);
891 return input_mute_;
892}
893
Niels Möller26815232018-11-16 09:32:40 +0100894bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100895 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200896 RTC_DCHECK_LE(0, event);
897 RTC_DCHECK_GE(255, event);
898 RTC_DCHECK_LE(0, duration_ms);
899 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100900 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100901 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200902 }
903 if (_rtpRtcpModule->SendTelephoneEventOutband(
904 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
905 RTC_DLOG(LS_ERROR) << "SendTelephoneEventOutband() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100906 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200907 }
Niels Möller26815232018-11-16 09:32:40 +0100908 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200909}
910
Niels Möller26815232018-11-16 09:32:40 +0100911bool ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
912 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100913 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200914 RTC_DCHECK_LE(0, payload_type);
915 RTC_DCHECK_GE(127, payload_type);
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100916 _rtpRtcpModule->RegisterAudioSendPayload(payload_type, "telephone-event",
917 payload_frequency, 0, 0);
Niels Möller26815232018-11-16 09:32:40 +0100918 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200919}
920
Niels Möllerdced9f62018-11-19 10:27:07 +0100921void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100922 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100923 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100924
Niels Möller7d76a312018-10-26 12:57:07 +0200925 if (media_transport_) {
926 rtc::CritScope cs(&media_transport_lock_);
927 media_transport_channel_id_ = ssrc;
928 }
Niels Möller530ead42018-10-04 14:28:39 +0200929 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200930}
931
Amit Hilbuch77938e62018-12-21 09:23:38 -0800932void ChannelSend::SetRid(const std::string& rid,
933 int extension_id,
934 int repaired_extension_id) {
935 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
936 if (extension_id != 0) {
937 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
938 extension_id);
939 RTC_DCHECK_EQ(0, ret);
940 }
941 if (repaired_extension_id != 0) {
942 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
943 repaired_extension_id);
944 RTC_DCHECK_EQ(0, ret);
945 }
946 _rtpRtcpModule->SetRid(rid);
947}
948
Niels Möller530ead42018-10-04 14:28:39 +0200949void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100950 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200951 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
952 RTC_DCHECK_EQ(0, ret);
953 _rtpRtcpModule->SetMid(mid);
954}
955
Johannes Kron9190b822018-10-29 11:22:05 +0100956void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +0100957 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +0100958 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
959}
960
Niels Möller26815232018-11-16 09:32:40 +0100961void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100962 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200963 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +0100964 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
965 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200966}
967
968void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100969 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200970 int ret =
971 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
972 RTC_DCHECK_EQ(0, ret);
973}
974
975void ChannelSend::RegisterSenderCongestionControlObjects(
976 RtpTransportControllerSendInterface* transport,
977 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +0100978 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200979 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
980 TransportFeedbackObserver* transport_feedback_observer =
981 transport->transport_feedback_observer();
982 PacketRouter* packet_router = transport->packet_router();
983
984 RTC_DCHECK(rtp_packet_sender);
985 RTC_DCHECK(transport_feedback_observer);
986 RTC_DCHECK(packet_router);
987 RTC_DCHECK(!packet_router_);
988 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
989 feedback_observer_proxy_->SetTransportFeedbackObserver(
990 transport_feedback_observer);
991 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
992 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
993 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
994 constexpr bool remb_candidate = false;
995 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
996 packet_router_ = packet_router;
997}
998
999void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001000 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001001 RTC_DCHECK(packet_router_);
1002 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1003 rtcp_observer_->SetBandwidthObserver(nullptr);
1004 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1005 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1006 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1007 packet_router_ = nullptr;
1008 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
1009}
1010
Niels Möller26815232018-11-16 09:32:40 +01001011void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001012 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001013 // Note: SetCNAME() accepts a c string of length at most 255.
1014 const std::string c_name_limited(c_name.substr(0, 255));
1015 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1016 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001017}
1018
Niels Möller26815232018-11-16 09:32:40 +01001019std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001020 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001021 // Get the report blocks from the latest received RTCP Sender or Receiver
1022 // Report. Each element in the vector contains the sender's SSRC and a
1023 // report block according to RFC 3550.
1024 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001025
Niels Möller26815232018-11-16 09:32:40 +01001026 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1027 RTC_DCHECK_EQ(0, ret);
1028
1029 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001030
1031 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1032 for (; it != rtcp_report_blocks.end(); ++it) {
1033 ReportBlock report_block;
1034 report_block.sender_SSRC = it->sender_ssrc;
1035 report_block.source_SSRC = it->source_ssrc;
1036 report_block.fraction_lost = it->fraction_lost;
1037 report_block.cumulative_num_packets_lost = it->packets_lost;
1038 report_block.extended_highest_sequence_number =
1039 it->extended_highest_sequence_number;
1040 report_block.interarrival_jitter = it->jitter;
1041 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1042 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001043 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001044 }
Niels Möller26815232018-11-16 09:32:40 +01001045 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001046}
1047
Niels Möller26815232018-11-16 09:32:40 +01001048CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001049 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001050 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001051 stats.rttMs = GetRTT();
1052
Niels Möller530ead42018-10-04 14:28:39 +02001053 size_t bytesSent(0);
1054 uint32_t packetsSent(0);
1055
1056 if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
1057 RTC_DLOG(LS_WARNING)
1058 << "GetRTPStatistics() failed to retrieve RTP datacounters"
1059 << " => output will not be complete";
1060 }
1061
1062 stats.bytesSent = bytesSent;
1063 stats.packetsSent = packetsSent;
1064
Niels Möller26815232018-11-16 09:32:40 +01001065 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001066}
1067
Niels Möller530ead42018-10-04 14:28:39 +02001068void ChannelSend::ProcessAndEncodeAudio(
1069 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001070 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Jansson9b934472019-03-04 18:18:01 +01001071 struct ProcessAndEncodeAudio {
1072 void operator()() {
1073 RTC_DCHECK_RUN_ON(channel->encoder_queue_);
1074 if (!channel->encoder_queue_is_active_) {
1075 return;
1076 }
1077 channel->ProcessAndEncodeAudioOnTaskQueue(audio_frame.get());
1078 }
1079 std::unique_ptr<AudioFrame> audio_frame;
1080 ChannelSend* const channel;
1081 };
Niels Möller530ead42018-10-04 14:28:39 +02001082 // Profile time between when the audio frame is added to the task queue and
1083 // when the task is actually executed.
1084 audio_frame->UpdateProfileTimeStamp();
Sebastian Jansson9b934472019-03-04 18:18:01 +01001085 encoder_queue_->PostTask(ProcessAndEncodeAudio{std::move(audio_frame), this});
Niels Möller530ead42018-10-04 14:28:39 +02001086}
1087
1088void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
1089 RTC_DCHECK_RUN_ON(encoder_queue_);
1090 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
1091 RTC_DCHECK_LE(audio_input->num_channels_, 2);
1092
1093 // Measure time between when the audio frame is added to the task queue and
1094 // when the task is actually executed. Goal is to keep track of unwanted
1095 // extra latency added by the task queue.
1096 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1097 audio_input->ElapsedProfileTimeMs());
1098
1099 bool is_muted = InputMute();
1100 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1101
1102 if (_includeAudioLevelIndication) {
1103 size_t length =
1104 audio_input->samples_per_channel_ * audio_input->num_channels_;
1105 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1106 if (is_muted && previous_frame_muted_) {
1107 rms_level_.AnalyzeMuted(length);
1108 } else {
1109 rms_level_.Analyze(
1110 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1111 }
1112 }
1113 previous_frame_muted_ = is_muted;
1114
1115 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1116
1117 // The ACM resamples internally.
1118 audio_input->timestamp_ = _timeStamp;
1119 // This call will trigger AudioPacketizationCallback::SendData if encoding
1120 // is done and payload is ready for packetization and transmission.
1121 // Otherwise, it will return without invoking the callback.
1122 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1123 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1124 return;
1125 }
1126
1127 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1128}
1129
Niels Möller530ead42018-10-04 14:28:39 +02001130ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001131 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001132 return audio_coding_->GetANAStats();
1133}
1134
1135RtpRtcp* ChannelSend::GetRtpRtcp() const {
Niels Möllerdced9f62018-11-19 10:27:07 +01001136 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +02001137 return _rtpRtcpModule.get();
1138}
1139
1140int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1141 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001142 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001143 int error = 0;
1144 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1145 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001146 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1147 // argument. Currently it wants an uint8_t.
1148 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1149 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001150 }
1151 return error;
1152}
1153
Niels Möller530ead42018-10-04 14:28:39 +02001154int64_t ChannelSend::GetRTT() const {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001155 if (media_transport_) {
1156 // GetRTT is generally used in the RTCP codepath, where media transport is
1157 // not present and so it shouldn't be needed. But it's also invoked in
1158 // 'GetStats' method, and for now returning media transport RTT here gives
1159 // us "free" rtt stats for media transport.
1160 auto target_rate = media_transport_->GetLatestTargetTransferRate();
1161 if (target_rate.has_value()) {
1162 return target_rate.value().network_estimate.round_trip_time.ms();
1163 }
1164
1165 return 0;
1166 }
Niels Möller530ead42018-10-04 14:28:39 +02001167 RtcpMode method = _rtpRtcpModule->RTCP();
1168 if (method == RtcpMode::kOff) {
1169 return 0;
1170 }
1171 std::vector<RTCPReportBlock> report_blocks;
1172 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1173
1174 if (report_blocks.empty()) {
1175 return 0;
1176 }
1177
1178 int64_t rtt = 0;
1179 int64_t avg_rtt = 0;
1180 int64_t max_rtt = 0;
1181 int64_t min_rtt = 0;
1182 // We don't know in advance the remote ssrc used by the other end's receiver
1183 // reports, so use the SSRC of the first report block for calculating the RTT.
1184 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1185 &min_rtt, &max_rtt) != 0) {
1186 return 0;
1187 }
1188 return rtt;
1189}
1190
Benjamin Wright78410ad2018-10-25 09:52:57 -07001191void ChannelSend::SetFrameEncryptor(
1192 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001193 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson9b934472019-03-04 18:18:01 +01001194 if (sending_) {
Mirko Bonadei80a86872019-02-04 15:01:43 +01001195 encoder_queue_->PostTask([this, frame_encryptor]() mutable {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001196 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001197 });
1198 } else {
Sebastian Jansson9b934472019-03-04 18:18:01 +01001199 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001200 }
1201}
1202
Anton Sukhanov626015d2019-02-04 15:16:06 -08001203// TODO(sukhanov): Consider moving TargetTransferRate observer to
1204// AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
1205// makes sense to consolidate all rate (and overhead) calculation there.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001206void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
1207 RTC_DCHECK(media_transport_);
1208 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1209}
1210
1211void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1212 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +01001213 CallEncoder(
1214 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001215}
1216
Niels Möllerdced9f62018-11-19 10:27:07 +01001217} // namespace
1218
1219std::unique_ptr<ChannelSendInterface> CreateChannelSend(
1220 rtc::TaskQueue* encoder_queue,
1221 ProcessThread* module_process_thread,
1222 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -08001223 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +01001224 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001225 RtcpRttStats* rtcp_rtt_stats,
1226 RtcEventLog* rtc_event_log,
1227 FrameEncryptorInterface* frame_encryptor,
1228 const webrtc::CryptoOptions& crypto_options,
1229 bool extmap_allow_mixed,
1230 int rtcp_report_interval_ms) {
1231 return absl::make_unique<ChannelSend>(
Anton Sukhanov626015d2019-02-04 15:16:06 -08001232 encoder_queue, module_process_thread, media_transport, overhead_observer,
1233 rtp_transport, rtcp_rtt_stats, rtc_event_log, frame_encryptor,
1234 crypto_options, extmap_allow_mixed, rtcp_report_interval_ms);
Niels Möllerdced9f62018-11-19 10:27:07 +01001235}
1236
Niels Möller530ead42018-10-04 14:28:39 +02001237} // namespace voe
1238} // namespace webrtc