blob: 0c8be1ff12ce158138d91682b6543f80a9e8496c [file] [log] [blame]
Niels Möller530ead42018-10-04 14:28:39 +02001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "audio/channel_send.h"
12
13#include <algorithm>
14#include <map>
15#include <memory>
16#include <string>
17#include <utility>
18#include <vector>
19
20#include "absl/memory/memory.h"
21#include "api/array_view.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010022#include "api/call/transport.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/frame_encryptor_interface.h"
Niels Möller530ead42018-10-04 14:28:39 +020024#include "audio/utility/audio_frame_operations.h"
25#include "call/rtp_transport_controller_send_interface.h"
26#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
27#include "logging/rtc_event_log/rtc_event_log.h"
28#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010029#include "modules/audio_coding/include/audio_coding_module.h"
30#include "modules/audio_processing/rms_level.h"
Niels Möller530ead42018-10-04 14:28:39 +020031#include "modules/pacing/packet_router.h"
32#include "modules/utility/include/process_thread.h"
33#include "rtc_base/checks.h"
Sebastian Jansson7949f212019-03-05 13:41:48 +000034#include "rtc_base/critical_section.h"
Yves Gerey2e00abc2018-10-05 15:39:24 +020035#include "rtc_base/event.h"
Niels Möller530ead42018-10-04 14:28:39 +020036#include "rtc_base/format_macros.h"
37#include "rtc_base/location.h"
38#include "rtc_base/logging.h"
Niels Möller26815232018-11-16 09:32:40 +010039#include "rtc_base/numerics/safe_conversions.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010040#include "rtc_base/race_checker.h"
Niels Möller530ead42018-10-04 14:28:39 +020041#include "rtc_base/rate_limiter.h"
42#include "rtc_base/task_queue.h"
43#include "rtc_base/thread_checker.h"
Steve Anton10542f22019-01-11 09:11:00 -080044#include "rtc_base/time_utils.h"
Sebastian Jansson977b3352019-03-04 17:43:34 +010045#include "system_wrappers/include/clock.h"
Niels Möller530ead42018-10-04 14:28:39 +020046#include "system_wrappers/include/field_trial.h"
47#include "system_wrappers/include/metrics.h"
48
49namespace webrtc {
50namespace voe {
51
52namespace {
53
54constexpr int64_t kMaxRetransmissionWindowMs = 1000;
55constexpr int64_t kMinRetransmissionWindowMs = 30;
56
Niels Möller7d76a312018-10-26 12:57:07 +020057MediaTransportEncodedAudioFrame::FrameType
58MediaTransportFrameTypeForWebrtcFrameType(webrtc::FrameType frame_type) {
59 switch (frame_type) {
60 case kAudioFrameSpeech:
61 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
62 break;
63
64 case kAudioFrameCN:
65 return MediaTransportEncodedAudioFrame::FrameType::
66 kDiscontinuousTransmission;
67 break;
68
69 default:
70 RTC_CHECK(false) << "Unexpected frame type=" << frame_type;
71 break;
72 }
73}
74
Niels Möllerdced9f62018-11-19 10:27:07 +010075class RtpPacketSenderProxy;
76class TransportFeedbackProxy;
77class TransportSequenceNumberProxy;
78class VoERtcpObserver;
79
Niels Möllerdced9f62018-11-19 10:27:07 +010080class ChannelSend
81 : public ChannelSendInterface,
Niels Möllerdced9f62018-11-19 10:27:07 +010082 public AudioPacketizationCallback, // receive encoded packets from the
83 // ACM
84 public TargetTransferRateObserver {
85 public:
86 // TODO(nisse): Make OnUplinkPacketLossRate public, and delete friend
87 // declaration.
88 friend class VoERtcpObserver;
89
Sebastian Jansson977b3352019-03-04 17:43:34 +010090 ChannelSend(Clock* clock,
91 rtc::TaskQueue* encoder_queue,
Niels Möllerdced9f62018-11-19 10:27:07 +010092 ProcessThread* module_process_thread,
93 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -080094 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +010095 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +010096 RtcpRttStats* rtcp_rtt_stats,
97 RtcEventLog* rtc_event_log,
98 FrameEncryptorInterface* frame_encryptor,
99 const webrtc::CryptoOptions& crypto_options,
100 bool extmap_allow_mixed,
101 int rtcp_report_interval_ms);
102
103 ~ChannelSend() override;
104
105 // Send using this encoder, with this payload type.
106 bool SetEncoder(int payload_type,
107 std::unique_ptr<AudioEncoder> encoder) override;
108 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
109 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100110 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100111
112 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +0100113 void StartSend() override;
114 void StopSend() override;
115
116 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +0100117 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100118 int GetBitrate() const override;
119
120 // Network
Niels Möllerdced9f62018-11-19 10:27:07 +0100121 bool ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
122
123 // Muting, Volume and Level.
124 void SetInputMute(bool enable) override;
125
126 // Stats.
127 ANAStats GetANAStatistics() const override;
128
129 // Used by AudioSendStream.
130 RtpRtcp* GetRtpRtcp() const override;
131
132 // DTMF.
133 bool SendTelephoneEventOutband(int event, int duration_ms) override;
134 bool SetSendTelephoneEventPayloadType(int payload_type,
135 int payload_frequency) override;
136
137 // RTP+RTCP
138 void SetLocalSSRC(uint32_t ssrc) override;
Amit Hilbuch77938e62018-12-21 09:23:38 -0800139 void SetRid(const std::string& rid,
140 int extension_id,
141 int repaired_extension_id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100142 void SetMid(const std::string& mid, int extension_id) override;
143 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
144 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
145 void EnableSendTransportSequenceNumber(int id) override;
146
147 void RegisterSenderCongestionControlObjects(
148 RtpTransportControllerSendInterface* transport,
149 RtcpBandwidthObserver* bandwidth_observer) override;
150 void ResetSenderCongestionControlObjects() override;
151 void SetRTCP_CNAME(absl::string_view c_name) override;
152 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
153 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100154
155 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
156 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
157 // the actual processing of the audio takes place. The processing mainly
158 // consists of encoding and preparing the result for sending by adding it to a
159 // send queue.
160 // The main reason for using a task queue here is to release the native,
161 // OS-specific, audio capture thread as soon as possible to ensure that it
162 // can go back to sleep and be prepared to deliver an new captured audio
163 // packet.
164 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
165
Niels Möllerdced9f62018-11-19 10:27:07 +0100166 // The existence of this function alongside OnUplinkPacketLossRate is
167 // a compromise. We want the encoder to be agnostic of the PLR source, but
168 // we also don't want it to receive conflicting information from TWCC and
169 // from RTCP-XR.
170 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
171
172 void OnRecoverableUplinkPacketLossRate(
173 float recoverable_packet_loss_rate) override;
174
175 int64_t GetRTT() const override;
176
177 // E2EE Custom Audio Frame Encryption
178 void SetFrameEncryptor(
179 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
180
181 private:
Sebastian Jansson7949f212019-03-05 13:41:48 +0000182 class ProcessAndEncodeAudioTask;
183
Niels Möllerdced9f62018-11-19 10:27:07 +0100184 // From AudioPacketizationCallback in the ACM
185 int32_t SendData(FrameType frameType,
186 uint8_t payloadType,
187 uint32_t timeStamp,
188 const uint8_t* payloadData,
189 size_t payloadSize,
190 const RTPFragmentationHeader* fragmentation) override;
191
Niels Möllerdced9f62018-11-19 10:27:07 +0100192 void OnUplinkPacketLossRate(float packet_loss_rate);
193 bool InputMute() const;
194
Niels Möllerdced9f62018-11-19 10:27:07 +0100195 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, int id);
196
Niels Möllerdced9f62018-11-19 10:27:07 +0100197 int32_t SendRtpAudio(FrameType frameType,
198 uint8_t payloadType,
199 uint32_t timeStamp,
200 rtc::ArrayView<const uint8_t> payload,
201 const RTPFragmentationHeader* fragmentation);
202
203 int32_t SendMediaTransportAudio(FrameType frameType,
204 uint8_t payloadType,
205 uint32_t timeStamp,
206 rtc::ArrayView<const uint8_t> payload,
207 const RTPFragmentationHeader* fragmentation);
208
209 // Return media transport or nullptr if using RTP.
210 MediaTransportInterface* media_transport() { return media_transport_; }
211
212 // Called on the encoder task queue when a new input audio frame is ready
213 // for encoding.
214 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input);
215
216 void OnReceivedRtt(int64_t rtt_ms);
217
218 void OnTargetTransferRate(TargetTransferRate) override;
219
220 // Thread checkers document and lock usage of some methods on voe::Channel to
221 // specific threads we know about. The goal is to eventually split up
222 // voe::Channel into parts with single-threaded semantics, and thereby reduce
223 // the need for locks.
224 rtc::ThreadChecker worker_thread_checker_;
225 rtc::ThreadChecker module_process_thread_checker_;
226 // Methods accessed from audio and video threads are checked for sequential-
227 // only access. We don't necessarily own and control these threads, so thread
228 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
229 // audio thread to another, but access is still sequential.
230 rtc::RaceChecker audio_thread_race_checker_;
231
Niels Möllerdced9f62018-11-19 10:27:07 +0100232 rtc::CriticalSection volume_settings_critsect_;
233
Niels Möller26e88b02018-11-19 15:08:13 +0100234 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100235
236 RtcEventLog* const event_log_;
237
238 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
239
240 std::unique_ptr<AudioCodingModule> audio_coding_;
241 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
242
Niels Möllerdced9f62018-11-19 10:27:07 +0100243 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100244 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100245 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
246 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
247 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
248 // VoeRTP_RTCP
249 // TODO(henrika): can today be accessed on the main thread and on the
250 // task queue; hence potential race.
251 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800252
Niels Möllerdced9f62018-11-19 10:27:07 +0100253 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100254 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100255
Niels Möller985a1f32018-11-19 16:08:42 +0100256 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
257 nullptr;
258 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
259 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
260 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_sender_proxy_;
261 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100262
263 rtc::ThreadChecker construction_thread_;
264
265 const bool use_twcc_plr_for_ana_;
266
Sebastian Jansson7949f212019-03-05 13:41:48 +0000267 rtc::CriticalSection encoder_queue_lock_;
268 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_lock_) = false;
Niels Möller985a1f32018-11-19 16:08:42 +0100269 rtc::TaskQueue* const encoder_queue_ = nullptr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100270
271 MediaTransportInterface* const media_transport_;
272 int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
273
274 rtc::CriticalSection media_transport_lock_;
275 // Currently set by SetLocalSSRC.
276 uint64_t media_transport_channel_id_ RTC_GUARDED_BY(&media_transport_lock_) =
277 0;
278 // Cache payload type and sampling frequency from most recent call to
279 // SetEncoder. Needed to set MediaTransportEncodedAudioFrame metadata, and
280 // invalidate on encoder change.
281 int media_transport_payload_type_ RTC_GUARDED_BY(&media_transport_lock_);
282 int media_transport_sampling_frequency_
283 RTC_GUARDED_BY(&media_transport_lock_);
284
285 // E2EE Audio Frame Encryption
286 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_;
287 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100288 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100289
290 rtc::CriticalSection bitrate_crit_section_;
291 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
292};
Niels Möller530ead42018-10-04 14:28:39 +0200293
294const int kTelephoneEventAttenuationdB = 10;
295
296class TransportFeedbackProxy : public TransportFeedbackObserver {
297 public:
298 TransportFeedbackProxy() : feedback_observer_(nullptr) {
299 pacer_thread_.DetachFromThread();
300 network_thread_.DetachFromThread();
301 }
302
303 void SetTransportFeedbackObserver(
304 TransportFeedbackObserver* feedback_observer) {
305 RTC_DCHECK(thread_checker_.CalledOnValidThread());
306 rtc::CritScope lock(&crit_);
307 feedback_observer_ = feedback_observer;
308 }
309
310 // Implements TransportFeedbackObserver.
311 void AddPacket(uint32_t ssrc,
312 uint16_t sequence_number,
313 size_t length,
314 const PacedPacketInfo& pacing_info) override {
315 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
316 rtc::CritScope lock(&crit_);
317 if (feedback_observer_)
318 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
319 }
320
321 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
322 RTC_DCHECK(network_thread_.CalledOnValidThread());
323 rtc::CritScope lock(&crit_);
324 if (feedback_observer_)
325 feedback_observer_->OnTransportFeedback(feedback);
326 }
327
328 private:
329 rtc::CriticalSection crit_;
330 rtc::ThreadChecker thread_checker_;
331 rtc::ThreadChecker pacer_thread_;
332 rtc::ThreadChecker network_thread_;
333 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
334};
335
336class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
337 public:
338 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
339 pacer_thread_.DetachFromThread();
340 }
341
342 void SetSequenceNumberAllocator(
343 TransportSequenceNumberAllocator* seq_num_allocator) {
344 RTC_DCHECK(thread_checker_.CalledOnValidThread());
345 rtc::CritScope lock(&crit_);
346 seq_num_allocator_ = seq_num_allocator;
347 }
348
349 // Implements TransportSequenceNumberAllocator.
350 uint16_t AllocateSequenceNumber() override {
351 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
352 rtc::CritScope lock(&crit_);
353 if (!seq_num_allocator_)
354 return 0;
355 return seq_num_allocator_->AllocateSequenceNumber();
356 }
357
358 private:
359 rtc::CriticalSection crit_;
360 rtc::ThreadChecker thread_checker_;
361 rtc::ThreadChecker pacer_thread_;
362 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
363};
364
365class RtpPacketSenderProxy : public RtpPacketSender {
366 public:
367 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
368
369 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
370 RTC_DCHECK(thread_checker_.CalledOnValidThread());
371 rtc::CritScope lock(&crit_);
372 rtp_packet_sender_ = rtp_packet_sender;
373 }
374
375 // Implements RtpPacketSender.
376 void InsertPacket(Priority priority,
377 uint32_t ssrc,
378 uint16_t sequence_number,
379 int64_t capture_time_ms,
380 size_t bytes,
381 bool retransmission) override {
382 rtc::CritScope lock(&crit_);
383 if (rtp_packet_sender_) {
384 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
385 capture_time_ms, bytes, retransmission);
386 }
387 }
388
389 void SetAccountForAudioPackets(bool account_for_audio) override {
390 RTC_NOTREACHED();
391 }
392
393 private:
394 rtc::ThreadChecker thread_checker_;
395 rtc::CriticalSection crit_;
396 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
397};
398
399class VoERtcpObserver : public RtcpBandwidthObserver {
400 public:
401 explicit VoERtcpObserver(ChannelSend* owner)
402 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100403 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200404
405 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
406 rtc::CritScope lock(&crit_);
407 bandwidth_observer_ = bandwidth_observer;
408 }
409
410 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
411 rtc::CritScope lock(&crit_);
412 if (bandwidth_observer_) {
413 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
414 }
415 }
416
417 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
418 int64_t rtt,
419 int64_t now_ms) override {
420 {
421 rtc::CritScope lock(&crit_);
422 if (bandwidth_observer_) {
423 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
424 now_ms);
425 }
426 }
427 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
428 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
429 // report for VoiceEngine?
430 if (report_blocks.empty())
431 return;
432
433 int fraction_lost_aggregate = 0;
434 int total_number_of_packets = 0;
435
436 // If receiving multiple report blocks, calculate the weighted average based
437 // on the number of packets a report refers to.
438 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
439 block_it != report_blocks.end(); ++block_it) {
440 // Find the previous extended high sequence number for this remote SSRC,
441 // to calculate the number of RTP packets this report refers to. Ignore if
442 // we haven't seen this SSRC before.
443 std::map<uint32_t, uint32_t>::iterator seq_num_it =
444 extended_max_sequence_number_.find(block_it->source_ssrc);
445 int number_of_packets = 0;
446 if (seq_num_it != extended_max_sequence_number_.end()) {
447 number_of_packets =
448 block_it->extended_highest_sequence_number - seq_num_it->second;
449 }
450 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
451 total_number_of_packets += number_of_packets;
452
453 extended_max_sequence_number_[block_it->source_ssrc] =
454 block_it->extended_highest_sequence_number;
455 }
456 int weighted_fraction_lost = 0;
457 if (total_number_of_packets > 0) {
458 weighted_fraction_lost =
459 (fraction_lost_aggregate + total_number_of_packets / 2) /
460 total_number_of_packets;
461 }
462 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
463 }
464
465 private:
466 ChannelSend* owner_;
467 // Maps remote side ssrc to extended highest sequence number received.
468 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
469 rtc::CriticalSection crit_;
470 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
471};
472
Sebastian Jansson7949f212019-03-05 13:41:48 +0000473class ChannelSend::ProcessAndEncodeAudioTask : public rtc::QueuedTask {
474 public:
475 ProcessAndEncodeAudioTask(std::unique_ptr<AudioFrame> audio_frame,
476 ChannelSend* channel)
477 : audio_frame_(std::move(audio_frame)), channel_(channel) {
478 RTC_DCHECK(channel_);
479 }
480
481 private:
482 bool Run() override {
483 RTC_DCHECK_RUN_ON(channel_->encoder_queue_);
484 channel_->ProcessAndEncodeAudioOnTaskQueue(audio_frame_.get());
485 return true;
486 }
487
488 std::unique_ptr<AudioFrame> audio_frame_;
489 ChannelSend* const channel_;
490};
491
Niels Möller530ead42018-10-04 14:28:39 +0200492int32_t ChannelSend::SendData(FrameType frameType,
493 uint8_t payloadType,
494 uint32_t timeStamp,
495 const uint8_t* payloadData,
496 size_t payloadSize,
497 const RTPFragmentationHeader* fragmentation) {
498 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200499 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
500
501 if (media_transport() != nullptr) {
Piotr (Peter) Slatala3cdd4d52019-02-28 07:10:56 -0800502 if (frameType == kEmptyFrame) {
503 // TODO(bugs.webrtc.org/9719): Media transport Send doesn't support
504 // sending empty frames.
505 return 0;
506 }
507
Niels Möller7d76a312018-10-26 12:57:07 +0200508 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload,
509 fragmentation);
510 } else {
511 return SendRtpAudio(frameType, payloadType, timeStamp, payload,
512 fragmentation);
513 }
514}
515
516int32_t ChannelSend::SendRtpAudio(FrameType frameType,
517 uint8_t payloadType,
518 uint32_t timeStamp,
519 rtc::ArrayView<const uint8_t> payload,
520 const RTPFragmentationHeader* fragmentation) {
521 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200522 if (_includeAudioLevelIndication) {
523 // Store current audio level in the RTP/RTCP module.
524 // The level will be used in combination with voice-activity state
525 // (frameType) to add an RTP header extension
526 _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
527 }
528
Benjamin Wright84583f62018-10-04 14:22:34 -0700529 // E2EE Custom Audio Frame Encryption (This is optional).
530 // Keep this buffer around for the lifetime of the send call.
531 rtc::Buffer encrypted_audio_payload;
532 if (frame_encryptor_ != nullptr) {
533 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
534 // Allocate a buffer to hold the maximum possible encrypted payload.
535 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200536 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700537 encrypted_audio_payload.SetSize(max_ciphertext_size);
538
539 // Encrypt the audio payload into the buffer.
540 size_t bytes_written = 0;
541 int encrypt_status = frame_encryptor_->Encrypt(
542 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200543 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
544 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700545 if (encrypt_status != 0) {
546 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
547 << encrypt_status;
548 return -1;
549 }
550 // Resize the buffer to the exact number of bytes actually used.
551 encrypted_audio_payload.SetSize(bytes_written);
552 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200553 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700554 } else if (crypto_options_.sframe.require_frame_encryption) {
555 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
556 << "A frame encryptor is required but one is not set.";
557 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700558 }
559
Niels Möller530ead42018-10-04 14:28:39 +0200560 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
561 // packetization.
562 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Möller7d76a312018-10-26 12:57:07 +0200563 if (!_rtpRtcpModule->SendOutgoingData((FrameType&)frameType, payloadType,
564 timeStamp,
565 // Leaving the time when this frame was
566 // received from the capture device as
567 // undefined for voice for now.
568 -1, payload.data(), payload.size(),
569 fragmentation, nullptr, nullptr)) {
Niels Möller530ead42018-10-04 14:28:39 +0200570 RTC_DLOG(LS_ERROR)
571 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
572 return -1;
573 }
574
575 return 0;
576}
577
Niels Möller7d76a312018-10-26 12:57:07 +0200578int32_t ChannelSend::SendMediaTransportAudio(
579 FrameType frameType,
580 uint8_t payloadType,
581 uint32_t timeStamp,
582 rtc::ArrayView<const uint8_t> payload,
583 const RTPFragmentationHeader* fragmentation) {
584 RTC_DCHECK_RUN_ON(encoder_queue_);
585 // TODO(nisse): Use null _transportPtr for MediaTransport.
586 // RTC_DCHECK(_transportPtr == nullptr);
587 uint64_t channel_id;
588 int sampling_rate_hz;
589 {
590 rtc::CritScope cs(&media_transport_lock_);
591 if (media_transport_payload_type_ != payloadType) {
592 // Payload type is being changed, media_transport_sampling_frequency_,
593 // no longer current.
594 return -1;
595 }
596 sampling_rate_hz = media_transport_sampling_frequency_;
597 channel_id = media_transport_channel_id_;
598 }
Mirko Bonadei1c546052019-02-04 14:50:38 +0100599 MediaTransportEncodedAudioFrame frame(
Niels Möller7d76a312018-10-26 12:57:07 +0200600 /*sampling_rate_hz=*/sampling_rate_hz,
601
602 // TODO(nisse): Timestamp and sample index are the same for all supported
603 // audio codecs except G722. Refactor audio coding module to only use
604 // sample index, and leave translation to RTP time, when needed, for
605 // RTP-specific code.
606 /*starting_sample_index=*/timeStamp,
607
608 // Sample count isn't conveniently available from the AudioCodingModule,
609 // and needs some refactoring to wire up in a good way. For now, left as
610 // zero.
611 /*sample_count=*/0,
612
613 /*sequence_number=*/media_transport_sequence_number_,
614 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
615 std::vector<uint8_t>(payload.begin(), payload.end()));
616
617 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
618 // channel id.
619 RTCError rtc_error =
620 media_transport()->SendAudioFrame(channel_id, std::move(frame));
621
622 if (!rtc_error.ok()) {
623 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
624 << ToString(rtc_error.type()) << ", "
625 << rtc_error.message();
626 return -1;
627 }
628
629 ++media_transport_sequence_number_;
630
631 return 0;
632}
633
Sebastian Jansson977b3352019-03-04 17:43:34 +0100634ChannelSend::ChannelSend(Clock* clock,
635 rtc::TaskQueue* encoder_queue,
Niels Möller530ead42018-10-04 14:28:39 +0200636 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200637 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -0800638 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +0100639 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200640 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700641 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700642 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100643 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800644 bool extmap_allow_mixed,
645 int rtcp_report_interval_ms)
Niels Möller530ead42018-10-04 14:28:39 +0200646 : event_log_(rtc_event_log),
647 _timeStamp(0), // This is just an offset, RTP module will add it's own
648 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200649 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200650 input_mute_(false),
651 previous_frame_muted_(false),
652 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200653 rtcp_observer_(new VoERtcpObserver(this)),
654 feedback_observer_proxy_(new TransportFeedbackProxy()),
655 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
656 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
Sebastian Jansson977b3352019-03-04 17:43:34 +0100657 retransmission_rate_limiter_(
658 new RateLimiter(clock, kMaxRetransmissionWindowMs)),
Niels Möller530ead42018-10-04 14:28:39 +0200659 use_twcc_plr_for_ana_(
660 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Benjamin Wright84583f62018-10-04 14:22:34 -0700661 encoder_queue_(encoder_queue),
Niels Möller7d76a312018-10-26 12:57:07 +0200662 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700663 frame_encryptor_(frame_encryptor),
664 crypto_options_(crypto_options) {
Niels Möller530ead42018-10-04 14:28:39 +0200665 RTC_DCHECK(module_process_thread);
666 RTC_DCHECK(encoder_queue);
Niels Möllerdced9f62018-11-19 10:27:07 +0100667 module_process_thread_checker_.DetachFromThread();
668
Niels Möller530ead42018-10-04 14:28:39 +0200669 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
670
671 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800672
673 // We gradually remove codepaths that depend on RTP when using media
674 // transport. All of this logic should be moved to the future
675 // RTPMediaTransport. In this case it means that overhead and bandwidth
676 // observers should not be called when using media transport.
677 if (!media_transport_) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800678 // TODO(sukhanov): Overhead observer is only needed for RTP path, because in
679 // media transport audio overhead is currently considered constant (see
680 // getter MediaTransportInterface::GetAudioPacketOverhead). In the future
681 // when we introduce RTP media transport we should make audio overhead
682 // interface consistent and work for both RTP and non-RTP implementations.
683 configuration.overhead_observer = overhead_observer;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800684 configuration.bandwidth_callback = rtcp_observer_.get();
685 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
686 }
687
Sebastian Jansson977b3352019-03-04 17:43:34 +0100688 configuration.clock = clock;
Niels Möller530ead42018-10-04 14:28:39 +0200689 configuration.audio = true;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100690 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200691
692 configuration.paced_sender = rtp_packet_sender_proxy_.get();
693 configuration.transport_sequence_number_allocator =
694 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200695
696 configuration.event_log = event_log_;
697 configuration.rtt_stats = rtcp_rtt_stats;
698 configuration.retransmission_rate_limiter =
699 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100700 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800701 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200702
703 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
704 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200705
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800706 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
707 // callbacks after the audio_coding_ is fully initialized.
708 if (media_transport_) {
709 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
710 media_transport_->AddTargetTransferRateObserver(this);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800711 } 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();
Niels Möller530ead42018-10-04 14:28:39 +0200737 int error = audio_coding_->RegisterTransportCallback(NULL);
738 RTC_DCHECK_EQ(0, error);
739
Niels Möller530ead42018-10-04 14:28:39 +0200740 if (_moduleProcessThreadPtr)
741 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200742}
743
Niels Möller26815232018-11-16 09:32:40 +0100744void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100745 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100746 RTC_DCHECK(!sending_);
747 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200748
Niels Möller530ead42018-10-04 14:28:39 +0200749 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100750 int ret = _rtpRtcpModule->SetSendingStatus(true);
751 RTC_DCHECK_EQ(0, ret);
Sebastian Jansson7949f212019-03-05 13:41:48 +0000752 {
753 // It is now OK to start posting tasks to the encoder task queue.
754 rtc::CritScope cs(&encoder_queue_lock_);
Niels Möller530ead42018-10-04 14:28:39 +0200755 encoder_queue_is_active_ = true;
Sebastian Jansson7949f212019-03-05 13:41:48 +0000756 }
Niels Möller530ead42018-10-04 14:28:39 +0200757}
758
759void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100760 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100761 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200762 return;
763 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100764 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200765
766 // Post a task to the encoder thread which sets an event when the task is
767 // executed. We know that no more encoding tasks will be added to the task
768 // queue for this channel since sending is now deactivated. It means that,
769 // if we wait for the event to bet set, we know that no more pending tasks
770 // exists and it is therfore guaranteed that the task queue will never try
771 // to acccess and invalid channel object.
772 RTC_DCHECK(encoder_queue_);
773
Niels Möllerc572ff32018-11-07 08:43:50 +0100774 rtc::Event flush;
Sebastian Jansson7949f212019-03-05 13:41:48 +0000775 {
776 // Clear |encoder_queue_is_active_| under lock to prevent any other tasks
777 // than this final "flush task" to be posted on the queue.
778 rtc::CritScope cs(&encoder_queue_lock_);
Niels Möller530ead42018-10-04 14:28:39 +0200779 encoder_queue_is_active_ = false;
Sebastian Jansson7949f212019-03-05 13:41:48 +0000780 encoder_queue_->PostTask([&flush]() { flush.Set(); });
781 }
Niels Möller530ead42018-10-04 14:28:39 +0200782 flush.Wait(rtc::Event::kForever);
783
Niels Möller530ead42018-10-04 14:28:39 +0200784 // Reset sending SSRC and sequence number and triggers direct transmission
785 // of RTCP BYE
786 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
787 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
788 }
789 _rtpRtcpModule->SetSendingMediaStatus(false);
790}
791
792bool ChannelSend::SetEncoder(int payload_type,
793 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100794 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200795 RTC_DCHECK_GE(payload_type, 0);
796 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200797
798 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
799 // as well as some other things, so we collect this info and send it along.
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100800 _rtpRtcpModule->RegisterAudioSendPayload(payload_type,
801 "audio",
802 encoder->RtpTimestampRateHz(),
803 encoder->NumChannels(),
804 0);
Niels Möller530ead42018-10-04 14:28:39 +0200805
Niels Möller7d76a312018-10-26 12:57:07 +0200806 if (media_transport_) {
807 rtc::CritScope cs(&media_transport_lock_);
808 media_transport_payload_type_ = payload_type;
809 // TODO(nisse): Currently broken for G722, since timestamps passed through
810 // encoder use RTP clock rather than sample count, and they differ for G722.
811 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
812 }
Niels Möller530ead42018-10-04 14:28:39 +0200813 audio_coding_->SetEncoder(std::move(encoder));
814 return true;
815}
816
817void ChannelSend::ModifyEncoder(
818 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800819 // This method can be called on the worker thread, module process thread
820 // or network thread. Audio coding is thread safe, so we do not need to
821 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200822 audio_coding_->ModifyEncoder(modifier);
823}
824
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100825void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
826 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
827 if (*encoder_ptr) {
828 modifier(encoder_ptr->get());
829 } else {
830 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
831 }
832 });
833}
834
Sebastian Jansson254d8692018-11-21 19:19:00 +0100835void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100836 // This method can be called on the worker thread, module process thread
837 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
838 // TODO(solenberg): Figure out a good way to check this or enforce calling
839 // rules.
840 // RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
841 // module_process_thread_checker_.CalledOnValidThread());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800842 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100843
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100844 CallEncoder([&](AudioEncoder* encoder) {
845 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200846 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100847 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
848 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200849}
850
Niels Möllerdced9f62018-11-19 10:27:07 +0100851int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800852 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200853 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200854}
855
856void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100857 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200858 if (!use_twcc_plr_for_ana_)
859 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100860 CallEncoder([&](AudioEncoder* encoder) {
861 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200862 });
863}
864
865void ChannelSend::OnRecoverableUplinkPacketLossRate(
866 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100867 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100868 CallEncoder([&](AudioEncoder* encoder) {
869 encoder->OnReceivedUplinkRecoverablePacketLossFraction(
870 recoverable_packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200871 });
872}
873
874void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
875 if (use_twcc_plr_for_ana_)
876 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100877 CallEncoder([&](AudioEncoder* encoder) {
878 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200879 });
880}
881
Niels Möller26815232018-11-16 09:32:40 +0100882// TODO(nisse): Delete always-true return value.
883bool ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100884 // May be called on either worker thread or network thread.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800885 if (media_transport_) {
886 // Ignore RTCP packets while media transport is used.
887 // Those packets should not arrive, but we are seeing occasional packets.
888 return 0;
889 }
890
Niels Möller530ead42018-10-04 14:28:39 +0200891 // Deliver RTCP packet to RTP/RTCP module for parsing
892 _rtpRtcpModule->IncomingRtcpPacket(data, length);
893
894 int64_t rtt = GetRTT();
895 if (rtt == 0) {
896 // Waiting for valid RTT.
Niels Möller26815232018-11-16 09:32:40 +0100897 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200898 }
899
900 int64_t nack_window_ms = rtt;
901 if (nack_window_ms < kMinRetransmissionWindowMs) {
902 nack_window_ms = kMinRetransmissionWindowMs;
903 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
904 nack_window_ms = kMaxRetransmissionWindowMs;
905 }
906 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
907
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800908 OnReceivedRtt(rtt);
Niels Möller26815232018-11-16 09:32:40 +0100909 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200910}
911
912void ChannelSend::SetInputMute(bool enable) {
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::CritScope cs(&volume_settings_critsect_);
915 input_mute_ = enable;
916}
917
918bool ChannelSend::InputMute() const {
919 rtc::CritScope cs(&volume_settings_critsect_);
920 return input_mute_;
921}
922
Niels Möller26815232018-11-16 09:32:40 +0100923bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100924 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200925 RTC_DCHECK_LE(0, event);
926 RTC_DCHECK_GE(255, event);
927 RTC_DCHECK_LE(0, duration_ms);
928 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100929 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100930 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200931 }
932 if (_rtpRtcpModule->SendTelephoneEventOutband(
933 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
934 RTC_DLOG(LS_ERROR) << "SendTelephoneEventOutband() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100935 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200936 }
Niels Möller26815232018-11-16 09:32:40 +0100937 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200938}
939
Niels Möller26815232018-11-16 09:32:40 +0100940bool ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
941 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100942 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200943 RTC_DCHECK_LE(0, payload_type);
944 RTC_DCHECK_GE(127, payload_type);
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100945 _rtpRtcpModule->RegisterAudioSendPayload(payload_type, "telephone-event",
946 payload_frequency, 0, 0);
Niels Möller26815232018-11-16 09:32:40 +0100947 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200948}
949
Niels Möllerdced9f62018-11-19 10:27:07 +0100950void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100951 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100952 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100953
Niels Möller7d76a312018-10-26 12:57:07 +0200954 if (media_transport_) {
955 rtc::CritScope cs(&media_transport_lock_);
956 media_transport_channel_id_ = ssrc;
957 }
Niels Möller530ead42018-10-04 14:28:39 +0200958 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200959}
960
Amit Hilbuch77938e62018-12-21 09:23:38 -0800961void ChannelSend::SetRid(const std::string& rid,
962 int extension_id,
963 int repaired_extension_id) {
964 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
965 if (extension_id != 0) {
966 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
967 extension_id);
968 RTC_DCHECK_EQ(0, ret);
969 }
970 if (repaired_extension_id != 0) {
971 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
972 repaired_extension_id);
973 RTC_DCHECK_EQ(0, ret);
974 }
975 _rtpRtcpModule->SetRid(rid);
976}
977
Niels Möller530ead42018-10-04 14:28:39 +0200978void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100979 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200980 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
981 RTC_DCHECK_EQ(0, ret);
982 _rtpRtcpModule->SetMid(mid);
983}
984
Johannes Kron9190b822018-10-29 11:22:05 +0100985void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +0100986 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +0100987 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
988}
989
Niels Möller26815232018-11-16 09:32:40 +0100990void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100991 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200992 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +0100993 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
994 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200995}
996
997void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100998 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200999 int ret =
1000 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
1001 RTC_DCHECK_EQ(0, ret);
1002}
1003
1004void ChannelSend::RegisterSenderCongestionControlObjects(
1005 RtpTransportControllerSendInterface* transport,
1006 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +01001007 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001008 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
1009 TransportFeedbackObserver* transport_feedback_observer =
1010 transport->transport_feedback_observer();
1011 PacketRouter* packet_router = transport->packet_router();
1012
1013 RTC_DCHECK(rtp_packet_sender);
1014 RTC_DCHECK(transport_feedback_observer);
1015 RTC_DCHECK(packet_router);
1016 RTC_DCHECK(!packet_router_);
1017 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
1018 feedback_observer_proxy_->SetTransportFeedbackObserver(
1019 transport_feedback_observer);
1020 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
1021 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
1022 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
1023 constexpr bool remb_candidate = false;
1024 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
1025 packet_router_ = packet_router;
1026}
1027
1028void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001029 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001030 RTC_DCHECK(packet_router_);
1031 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1032 rtcp_observer_->SetBandwidthObserver(nullptr);
1033 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1034 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1035 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1036 packet_router_ = nullptr;
1037 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
1038}
1039
Niels Möller26815232018-11-16 09:32:40 +01001040void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001041 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001042 // Note: SetCNAME() accepts a c string of length at most 255.
1043 const std::string c_name_limited(c_name.substr(0, 255));
1044 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1045 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001046}
1047
Niels Möller26815232018-11-16 09:32:40 +01001048std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001049 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001050 // Get the report blocks from the latest received RTCP Sender or Receiver
1051 // Report. Each element in the vector contains the sender's SSRC and a
1052 // report block according to RFC 3550.
1053 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001054
Niels Möller26815232018-11-16 09:32:40 +01001055 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1056 RTC_DCHECK_EQ(0, ret);
1057
1058 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001059
1060 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1061 for (; it != rtcp_report_blocks.end(); ++it) {
1062 ReportBlock report_block;
1063 report_block.sender_SSRC = it->sender_ssrc;
1064 report_block.source_SSRC = it->source_ssrc;
1065 report_block.fraction_lost = it->fraction_lost;
1066 report_block.cumulative_num_packets_lost = it->packets_lost;
1067 report_block.extended_highest_sequence_number =
1068 it->extended_highest_sequence_number;
1069 report_block.interarrival_jitter = it->jitter;
1070 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1071 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001072 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001073 }
Niels Möller26815232018-11-16 09:32:40 +01001074 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001075}
1076
Niels Möller26815232018-11-16 09:32:40 +01001077CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001078 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001079 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001080 stats.rttMs = GetRTT();
1081
Niels Möller530ead42018-10-04 14:28:39 +02001082 size_t bytesSent(0);
1083 uint32_t packetsSent(0);
1084
1085 if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
1086 RTC_DLOG(LS_WARNING)
1087 << "GetRTPStatistics() failed to retrieve RTP datacounters"
1088 << " => output will not be complete";
1089 }
1090
1091 stats.bytesSent = bytesSent;
1092 stats.packetsSent = packetsSent;
1093
Niels Möller26815232018-11-16 09:32:40 +01001094 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001095}
1096
Niels Möller530ead42018-10-04 14:28:39 +02001097void ChannelSend::ProcessAndEncodeAudio(
1098 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001099 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Jansson7949f212019-03-05 13:41:48 +00001100 // Avoid posting any new tasks if sending was already stopped in StopSend().
1101 rtc::CritScope cs(&encoder_queue_lock_);
1102 if (!encoder_queue_is_active_) {
1103 return;
1104 }
Niels Möller530ead42018-10-04 14:28:39 +02001105 // Profile time between when the audio frame is added to the task queue and
1106 // when the task is actually executed.
1107 audio_frame->UpdateProfileTimeStamp();
Sebastian Jansson7949f212019-03-05 13:41:48 +00001108 encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
1109 new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
Niels Möller530ead42018-10-04 14:28:39 +02001110}
1111
1112void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
1113 RTC_DCHECK_RUN_ON(encoder_queue_);
1114 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
1115 RTC_DCHECK_LE(audio_input->num_channels_, 2);
1116
1117 // Measure time between when the audio frame is added to the task queue and
1118 // when the task is actually executed. Goal is to keep track of unwanted
1119 // extra latency added by the task queue.
1120 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1121 audio_input->ElapsedProfileTimeMs());
1122
1123 bool is_muted = InputMute();
1124 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1125
1126 if (_includeAudioLevelIndication) {
1127 size_t length =
1128 audio_input->samples_per_channel_ * audio_input->num_channels_;
1129 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1130 if (is_muted && previous_frame_muted_) {
1131 rms_level_.AnalyzeMuted(length);
1132 } else {
1133 rms_level_.Analyze(
1134 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1135 }
1136 }
1137 previous_frame_muted_ = is_muted;
1138
1139 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1140
1141 // The ACM resamples internally.
1142 audio_input->timestamp_ = _timeStamp;
1143 // This call will trigger AudioPacketizationCallback::SendData if encoding
1144 // is done and payload is ready for packetization and transmission.
1145 // Otherwise, it will return without invoking the callback.
1146 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1147 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1148 return;
1149 }
1150
1151 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1152}
1153
Niels Möller530ead42018-10-04 14:28:39 +02001154ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001155 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001156 return audio_coding_->GetANAStats();
1157}
1158
1159RtpRtcp* ChannelSend::GetRtpRtcp() const {
Niels Möllerdced9f62018-11-19 10:27:07 +01001160 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +02001161 return _rtpRtcpModule.get();
1162}
1163
1164int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1165 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001166 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001167 int error = 0;
1168 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1169 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001170 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1171 // argument. Currently it wants an uint8_t.
1172 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1173 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001174 }
1175 return error;
1176}
1177
Niels Möller530ead42018-10-04 14:28:39 +02001178int64_t ChannelSend::GetRTT() const {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001179 if (media_transport_) {
1180 // GetRTT is generally used in the RTCP codepath, where media transport is
1181 // not present and so it shouldn't be needed. But it's also invoked in
1182 // 'GetStats' method, and for now returning media transport RTT here gives
1183 // us "free" rtt stats for media transport.
1184 auto target_rate = media_transport_->GetLatestTargetTransferRate();
1185 if (target_rate.has_value()) {
1186 return target_rate.value().network_estimate.round_trip_time.ms();
1187 }
1188
1189 return 0;
1190 }
Niels Möller530ead42018-10-04 14:28:39 +02001191 RtcpMode method = _rtpRtcpModule->RTCP();
1192 if (method == RtcpMode::kOff) {
1193 return 0;
1194 }
1195 std::vector<RTCPReportBlock> report_blocks;
1196 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1197
1198 if (report_blocks.empty()) {
1199 return 0;
1200 }
1201
1202 int64_t rtt = 0;
1203 int64_t avg_rtt = 0;
1204 int64_t max_rtt = 0;
1205 int64_t min_rtt = 0;
1206 // We don't know in advance the remote ssrc used by the other end's receiver
1207 // reports, so use the SSRC of the first report block for calculating the RTT.
1208 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1209 &min_rtt, &max_rtt) != 0) {
1210 return 0;
1211 }
1212 return rtt;
1213}
1214
Benjamin Wright78410ad2018-10-25 09:52:57 -07001215void ChannelSend::SetFrameEncryptor(
1216 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001217 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson7949f212019-03-05 13:41:48 +00001218 rtc::CritScope cs(&encoder_queue_lock_);
1219 if (encoder_queue_is_active_) {
Mirko Bonadei80a86872019-02-04 15:01:43 +01001220 encoder_queue_->PostTask([this, frame_encryptor]() mutable {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001221 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001222 });
1223 } else {
Sebastian Jansson7949f212019-03-05 13:41:48 +00001224 frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001225 }
1226}
1227
Anton Sukhanov626015d2019-02-04 15:16:06 -08001228// TODO(sukhanov): Consider moving TargetTransferRate observer to
1229// AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
1230// makes sense to consolidate all rate (and overhead) calculation there.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001231void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
1232 RTC_DCHECK(media_transport_);
1233 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1234}
1235
1236void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1237 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +01001238 CallEncoder(
1239 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001240}
1241
Niels Möllerdced9f62018-11-19 10:27:07 +01001242} // namespace
1243
1244std::unique_ptr<ChannelSendInterface> CreateChannelSend(
Sebastian Jansson977b3352019-03-04 17:43:34 +01001245 Clock* clock,
Niels Möllerdced9f62018-11-19 10:27:07 +01001246 rtc::TaskQueue* encoder_queue,
1247 ProcessThread* module_process_thread,
1248 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -08001249 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +01001250 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001251 RtcpRttStats* rtcp_rtt_stats,
1252 RtcEventLog* rtc_event_log,
1253 FrameEncryptorInterface* frame_encryptor,
1254 const webrtc::CryptoOptions& crypto_options,
1255 bool extmap_allow_mixed,
1256 int rtcp_report_interval_ms) {
1257 return absl::make_unique<ChannelSend>(
Sebastian Jansson977b3352019-03-04 17:43:34 +01001258 clock, encoder_queue, module_process_thread, media_transport,
1259 overhead_observer, rtp_transport, rtcp_rtt_stats, rtc_event_log,
1260 frame_encryptor, crypto_options, extmap_allow_mixed,
1261 rtcp_report_interval_ms);
Niels Möllerdced9f62018-11-19 10:27:07 +01001262}
1263
Niels Möller530ead42018-10-04 14:28:39 +02001264} // namespace voe
1265} // namespace webrtc