blob: bb9b2ffcc2e451481c20484b12734c1e3dd19b6d [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"
Steve Anton10542f22019-01-11 09:11:00 -080034#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"
Niels Möller530ead42018-10-04 14:28:39 +020045#include "system_wrappers/include/field_trial.h"
46#include "system_wrappers/include/metrics.h"
47
48namespace webrtc {
49namespace voe {
50
51namespace {
52
53constexpr int64_t kMaxRetransmissionWindowMs = 1000;
54constexpr int64_t kMinRetransmissionWindowMs = 30;
55
Niels Möller7d76a312018-10-26 12:57:07 +020056MediaTransportEncodedAudioFrame::FrameType
57MediaTransportFrameTypeForWebrtcFrameType(webrtc::FrameType frame_type) {
58 switch (frame_type) {
59 case kAudioFrameSpeech:
60 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
61 break;
62
63 case kAudioFrameCN:
64 return MediaTransportEncodedAudioFrame::FrameType::
65 kDiscontinuousTransmission;
66 break;
67
68 default:
69 RTC_CHECK(false) << "Unexpected frame type=" << frame_type;
70 break;
71 }
72}
73
Niels Möllerdced9f62018-11-19 10:27:07 +010074class RtpPacketSenderProxy;
75class TransportFeedbackProxy;
76class TransportSequenceNumberProxy;
77class VoERtcpObserver;
78
Niels Möllerdced9f62018-11-19 10:27:07 +010079class ChannelSend
80 : public ChannelSendInterface,
Niels Möllerdced9f62018-11-19 10:27:07 +010081 public AudioPacketizationCallback, // receive encoded packets from the
82 // ACM
83 public TargetTransferRateObserver {
84 public:
85 // TODO(nisse): Make OnUplinkPacketLossRate public, and delete friend
86 // declaration.
87 friend class VoERtcpObserver;
88
89 ChannelSend(rtc::TaskQueue* encoder_queue,
90 ProcessThread* module_process_thread,
91 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -080092 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +010093 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +010094 RtcpRttStats* rtcp_rtt_stats,
95 RtcEventLog* rtc_event_log,
96 FrameEncryptorInterface* frame_encryptor,
97 const webrtc::CryptoOptions& crypto_options,
98 bool extmap_allow_mixed,
99 int rtcp_report_interval_ms);
100
101 ~ChannelSend() override;
102
103 // Send using this encoder, with this payload type.
104 bool SetEncoder(int payload_type,
105 std::unique_ptr<AudioEncoder> encoder) override;
106 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
107 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100108 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100109
110 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +0100111 void StartSend() override;
112 void StopSend() override;
113
114 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +0100115 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100116 int GetBitrate() const override;
117
118 // Network
Niels Möllerdced9f62018-11-19 10:27:07 +0100119 bool ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
120
121 // Muting, Volume and Level.
122 void SetInputMute(bool enable) override;
123
124 // Stats.
125 ANAStats GetANAStatistics() const override;
126
127 // Used by AudioSendStream.
128 RtpRtcp* GetRtpRtcp() const override;
129
130 // DTMF.
131 bool SendTelephoneEventOutband(int event, int duration_ms) override;
132 bool SetSendTelephoneEventPayloadType(int payload_type,
133 int payload_frequency) override;
134
135 // RTP+RTCP
136 void SetLocalSSRC(uint32_t ssrc) override;
Amit Hilbuch77938e62018-12-21 09:23:38 -0800137 void SetRid(const std::string& rid,
138 int extension_id,
139 int repaired_extension_id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100140 void SetMid(const std::string& mid, int extension_id) override;
141 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
142 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
143 void EnableSendTransportSequenceNumber(int id) override;
144
145 void RegisterSenderCongestionControlObjects(
146 RtpTransportControllerSendInterface* transport,
147 RtcpBandwidthObserver* bandwidth_observer) override;
148 void ResetSenderCongestionControlObjects() override;
149 void SetRTCP_CNAME(absl::string_view c_name) override;
150 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
151 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100152
153 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
154 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
155 // the actual processing of the audio takes place. The processing mainly
156 // consists of encoding and preparing the result for sending by adding it to a
157 // send queue.
158 // The main reason for using a task queue here is to release the native,
159 // OS-specific, audio capture thread as soon as possible to ensure that it
160 // can go back to sleep and be prepared to deliver an new captured audio
161 // packet.
162 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
163
Niels Möllerdced9f62018-11-19 10:27:07 +0100164 // The existence of this function alongside OnUplinkPacketLossRate is
165 // a compromise. We want the encoder to be agnostic of the PLR source, but
166 // we also don't want it to receive conflicting information from TWCC and
167 // from RTCP-XR.
168 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
169
170 void OnRecoverableUplinkPacketLossRate(
171 float recoverable_packet_loss_rate) override;
172
173 int64_t GetRTT() const override;
174
175 // E2EE Custom Audio Frame Encryption
176 void SetFrameEncryptor(
177 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
178
179 private:
180 class ProcessAndEncodeAudioTask;
181
182 // From AudioPacketizationCallback in the ACM
183 int32_t SendData(FrameType frameType,
184 uint8_t payloadType,
185 uint32_t timeStamp,
186 const uint8_t* payloadData,
187 size_t payloadSize,
188 const RTPFragmentationHeader* fragmentation) override;
189
Niels Möllerdced9f62018-11-19 10:27:07 +0100190 void OnUplinkPacketLossRate(float packet_loss_rate);
191 bool InputMute() const;
192
Niels Möllerdced9f62018-11-19 10:27:07 +0100193 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, int id);
194
Niels Möllerdced9f62018-11-19 10:27:07 +0100195 int32_t SendRtpAudio(FrameType frameType,
196 uint8_t payloadType,
197 uint32_t timeStamp,
198 rtc::ArrayView<const uint8_t> payload,
199 const RTPFragmentationHeader* fragmentation);
200
201 int32_t SendMediaTransportAudio(FrameType frameType,
202 uint8_t payloadType,
203 uint32_t timeStamp,
204 rtc::ArrayView<const uint8_t> payload,
205 const RTPFragmentationHeader* fragmentation);
206
207 // Return media transport or nullptr if using RTP.
208 MediaTransportInterface* media_transport() { return media_transport_; }
209
210 // Called on the encoder task queue when a new input audio frame is ready
211 // for encoding.
212 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input);
213
214 void OnReceivedRtt(int64_t rtt_ms);
215
216 void OnTargetTransferRate(TargetTransferRate) override;
217
218 // Thread checkers document and lock usage of some methods on voe::Channel to
219 // specific threads we know about. The goal is to eventually split up
220 // voe::Channel into parts with single-threaded semantics, and thereby reduce
221 // the need for locks.
222 rtc::ThreadChecker worker_thread_checker_;
223 rtc::ThreadChecker module_process_thread_checker_;
224 // Methods accessed from audio and video threads are checked for sequential-
225 // only access. We don't necessarily own and control these threads, so thread
226 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
227 // audio thread to another, but access is still sequential.
228 rtc::RaceChecker audio_thread_race_checker_;
229
Niels Möllerdced9f62018-11-19 10:27:07 +0100230 rtc::CriticalSection volume_settings_critsect_;
231
Niels Möller26e88b02018-11-19 15:08:13 +0100232 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100233
234 RtcEventLog* const event_log_;
235
236 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
237
238 std::unique_ptr<AudioCodingModule> audio_coding_;
239 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
240
Niels Möllerdced9f62018-11-19 10:27:07 +0100241 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100242 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100243 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
244 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
245 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
246 // VoeRTP_RTCP
247 // TODO(henrika): can today be accessed on the main thread and on the
248 // task queue; hence potential race.
249 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800250
Niels Möllerdced9f62018-11-19 10:27:07 +0100251 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100252 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100253
Niels Möller985a1f32018-11-19 16:08:42 +0100254 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
255 nullptr;
256 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
257 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
258 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_sender_proxy_;
259 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100260
261 rtc::ThreadChecker construction_thread_;
262
263 const bool use_twcc_plr_for_ana_;
264
265 rtc::CriticalSection encoder_queue_lock_;
266 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_lock_) = false;
Niels Möller985a1f32018-11-19 16:08:42 +0100267 rtc::TaskQueue* const encoder_queue_ = nullptr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100268
269 MediaTransportInterface* const media_transport_;
270 int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
271
272 rtc::CriticalSection media_transport_lock_;
273 // Currently set by SetLocalSSRC.
274 uint64_t media_transport_channel_id_ RTC_GUARDED_BY(&media_transport_lock_) =
275 0;
276 // Cache payload type and sampling frequency from most recent call to
277 // SetEncoder. Needed to set MediaTransportEncodedAudioFrame metadata, and
278 // invalidate on encoder change.
279 int media_transport_payload_type_ RTC_GUARDED_BY(&media_transport_lock_);
280 int media_transport_sampling_frequency_
281 RTC_GUARDED_BY(&media_transport_lock_);
282
283 // E2EE Audio Frame Encryption
284 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_;
285 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100286 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100287
288 rtc::CriticalSection bitrate_crit_section_;
289 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
290};
Niels Möller530ead42018-10-04 14:28:39 +0200291
292const int kTelephoneEventAttenuationdB = 10;
293
294class TransportFeedbackProxy : public TransportFeedbackObserver {
295 public:
296 TransportFeedbackProxy() : feedback_observer_(nullptr) {
297 pacer_thread_.DetachFromThread();
298 network_thread_.DetachFromThread();
299 }
300
301 void SetTransportFeedbackObserver(
302 TransportFeedbackObserver* feedback_observer) {
303 RTC_DCHECK(thread_checker_.CalledOnValidThread());
304 rtc::CritScope lock(&crit_);
305 feedback_observer_ = feedback_observer;
306 }
307
308 // Implements TransportFeedbackObserver.
309 void AddPacket(uint32_t ssrc,
310 uint16_t sequence_number,
311 size_t length,
312 const PacedPacketInfo& pacing_info) override {
313 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
314 rtc::CritScope lock(&crit_);
315 if (feedback_observer_)
316 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
317 }
318
319 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
320 RTC_DCHECK(network_thread_.CalledOnValidThread());
321 rtc::CritScope lock(&crit_);
322 if (feedback_observer_)
323 feedback_observer_->OnTransportFeedback(feedback);
324 }
325
326 private:
327 rtc::CriticalSection crit_;
328 rtc::ThreadChecker thread_checker_;
329 rtc::ThreadChecker pacer_thread_;
330 rtc::ThreadChecker network_thread_;
331 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
332};
333
334class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
335 public:
336 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
337 pacer_thread_.DetachFromThread();
338 }
339
340 void SetSequenceNumberAllocator(
341 TransportSequenceNumberAllocator* seq_num_allocator) {
342 RTC_DCHECK(thread_checker_.CalledOnValidThread());
343 rtc::CritScope lock(&crit_);
344 seq_num_allocator_ = seq_num_allocator;
345 }
346
347 // Implements TransportSequenceNumberAllocator.
348 uint16_t AllocateSequenceNumber() override {
349 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
350 rtc::CritScope lock(&crit_);
351 if (!seq_num_allocator_)
352 return 0;
353 return seq_num_allocator_->AllocateSequenceNumber();
354 }
355
356 private:
357 rtc::CriticalSection crit_;
358 rtc::ThreadChecker thread_checker_;
359 rtc::ThreadChecker pacer_thread_;
360 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
361};
362
363class RtpPacketSenderProxy : public RtpPacketSender {
364 public:
365 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
366
367 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
368 RTC_DCHECK(thread_checker_.CalledOnValidThread());
369 rtc::CritScope lock(&crit_);
370 rtp_packet_sender_ = rtp_packet_sender;
371 }
372
373 // Implements RtpPacketSender.
374 void InsertPacket(Priority priority,
375 uint32_t ssrc,
376 uint16_t sequence_number,
377 int64_t capture_time_ms,
378 size_t bytes,
379 bool retransmission) override {
380 rtc::CritScope lock(&crit_);
381 if (rtp_packet_sender_) {
382 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
383 capture_time_ms, bytes, retransmission);
384 }
385 }
386
387 void SetAccountForAudioPackets(bool account_for_audio) override {
388 RTC_NOTREACHED();
389 }
390
391 private:
392 rtc::ThreadChecker thread_checker_;
393 rtc::CriticalSection crit_;
394 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
395};
396
397class VoERtcpObserver : public RtcpBandwidthObserver {
398 public:
399 explicit VoERtcpObserver(ChannelSend* owner)
400 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100401 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200402
403 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
404 rtc::CritScope lock(&crit_);
405 bandwidth_observer_ = bandwidth_observer;
406 }
407
408 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
409 rtc::CritScope lock(&crit_);
410 if (bandwidth_observer_) {
411 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
412 }
413 }
414
415 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
416 int64_t rtt,
417 int64_t now_ms) override {
418 {
419 rtc::CritScope lock(&crit_);
420 if (bandwidth_observer_) {
421 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
422 now_ms);
423 }
424 }
425 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
426 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
427 // report for VoiceEngine?
428 if (report_blocks.empty())
429 return;
430
431 int fraction_lost_aggregate = 0;
432 int total_number_of_packets = 0;
433
434 // If receiving multiple report blocks, calculate the weighted average based
435 // on the number of packets a report refers to.
436 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
437 block_it != report_blocks.end(); ++block_it) {
438 // Find the previous extended high sequence number for this remote SSRC,
439 // to calculate the number of RTP packets this report refers to. Ignore if
440 // we haven't seen this SSRC before.
441 std::map<uint32_t, uint32_t>::iterator seq_num_it =
442 extended_max_sequence_number_.find(block_it->source_ssrc);
443 int number_of_packets = 0;
444 if (seq_num_it != extended_max_sequence_number_.end()) {
445 number_of_packets =
446 block_it->extended_highest_sequence_number - seq_num_it->second;
447 }
448 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
449 total_number_of_packets += number_of_packets;
450
451 extended_max_sequence_number_[block_it->source_ssrc] =
452 block_it->extended_highest_sequence_number;
453 }
454 int weighted_fraction_lost = 0;
455 if (total_number_of_packets > 0) {
456 weighted_fraction_lost =
457 (fraction_lost_aggregate + total_number_of_packets / 2) /
458 total_number_of_packets;
459 }
460 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
461 }
462
463 private:
464 ChannelSend* owner_;
465 // Maps remote side ssrc to extended highest sequence number received.
466 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
467 rtc::CriticalSection crit_;
468 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
469};
470
471class ChannelSend::ProcessAndEncodeAudioTask : public rtc::QueuedTask {
472 public:
473 ProcessAndEncodeAudioTask(std::unique_ptr<AudioFrame> audio_frame,
474 ChannelSend* channel)
475 : audio_frame_(std::move(audio_frame)), channel_(channel) {
476 RTC_DCHECK(channel_);
477 }
478
479 private:
480 bool Run() override {
481 RTC_DCHECK_RUN_ON(channel_->encoder_queue_);
482 channel_->ProcessAndEncodeAudioOnTaskQueue(audio_frame_.get());
483 return true;
484 }
485
486 std::unique_ptr<AudioFrame> audio_frame_;
487 ChannelSend* const channel_;
488};
489
490int32_t ChannelSend::SendData(FrameType frameType,
491 uint8_t payloadType,
492 uint32_t timeStamp,
493 const uint8_t* payloadData,
494 size_t payloadSize,
495 const RTPFragmentationHeader* fragmentation) {
496 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200497 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
498
499 if (media_transport() != nullptr) {
Piotr (Peter) Slatala3cdd4d52019-02-28 07:10:56 -0800500 if (frameType == kEmptyFrame) {
501 // TODO(bugs.webrtc.org/9719): Media transport Send doesn't support
502 // sending empty frames.
503 return 0;
504 }
505
Niels Möller7d76a312018-10-26 12:57:07 +0200506 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload,
507 fragmentation);
508 } else {
509 return SendRtpAudio(frameType, payloadType, timeStamp, payload,
510 fragmentation);
511 }
512}
513
514int32_t ChannelSend::SendRtpAudio(FrameType frameType,
515 uint8_t payloadType,
516 uint32_t timeStamp,
517 rtc::ArrayView<const uint8_t> payload,
518 const RTPFragmentationHeader* fragmentation) {
519 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200520 if (_includeAudioLevelIndication) {
521 // Store current audio level in the RTP/RTCP module.
522 // The level will be used in combination with voice-activity state
523 // (frameType) to add an RTP header extension
524 _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
525 }
526
Benjamin Wright84583f62018-10-04 14:22:34 -0700527 // E2EE Custom Audio Frame Encryption (This is optional).
528 // Keep this buffer around for the lifetime of the send call.
529 rtc::Buffer encrypted_audio_payload;
530 if (frame_encryptor_ != nullptr) {
531 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
532 // Allocate a buffer to hold the maximum possible encrypted payload.
533 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200534 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700535 encrypted_audio_payload.SetSize(max_ciphertext_size);
536
537 // Encrypt the audio payload into the buffer.
538 size_t bytes_written = 0;
539 int encrypt_status = frame_encryptor_->Encrypt(
540 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200541 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
542 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700543 if (encrypt_status != 0) {
544 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
545 << encrypt_status;
546 return -1;
547 }
548 // Resize the buffer to the exact number of bytes actually used.
549 encrypted_audio_payload.SetSize(bytes_written);
550 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200551 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700552 } else if (crypto_options_.sframe.require_frame_encryption) {
553 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
554 << "A frame encryptor is required but one is not set.";
555 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700556 }
557
Niels Möller530ead42018-10-04 14:28:39 +0200558 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
559 // packetization.
560 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Möller7d76a312018-10-26 12:57:07 +0200561 if (!_rtpRtcpModule->SendOutgoingData((FrameType&)frameType, payloadType,
562 timeStamp,
563 // Leaving the time when this frame was
564 // received from the capture device as
565 // undefined for voice for now.
566 -1, payload.data(), payload.size(),
567 fragmentation, nullptr, nullptr)) {
Niels Möller530ead42018-10-04 14:28:39 +0200568 RTC_DLOG(LS_ERROR)
569 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
570 return -1;
571 }
572
573 return 0;
574}
575
Niels Möller7d76a312018-10-26 12:57:07 +0200576int32_t ChannelSend::SendMediaTransportAudio(
577 FrameType frameType,
578 uint8_t payloadType,
579 uint32_t timeStamp,
580 rtc::ArrayView<const uint8_t> payload,
581 const RTPFragmentationHeader* fragmentation) {
582 RTC_DCHECK_RUN_ON(encoder_queue_);
583 // TODO(nisse): Use null _transportPtr for MediaTransport.
584 // RTC_DCHECK(_transportPtr == nullptr);
585 uint64_t channel_id;
586 int sampling_rate_hz;
587 {
588 rtc::CritScope cs(&media_transport_lock_);
589 if (media_transport_payload_type_ != payloadType) {
590 // Payload type is being changed, media_transport_sampling_frequency_,
591 // no longer current.
592 return -1;
593 }
594 sampling_rate_hz = media_transport_sampling_frequency_;
595 channel_id = media_transport_channel_id_;
596 }
Mirko Bonadei1c546052019-02-04 14:50:38 +0100597 MediaTransportEncodedAudioFrame frame(
Niels Möller7d76a312018-10-26 12:57:07 +0200598 /*sampling_rate_hz=*/sampling_rate_hz,
599
600 // TODO(nisse): Timestamp and sample index are the same for all supported
601 // audio codecs except G722. Refactor audio coding module to only use
602 // sample index, and leave translation to RTP time, when needed, for
603 // RTP-specific code.
604 /*starting_sample_index=*/timeStamp,
605
606 // Sample count isn't conveniently available from the AudioCodingModule,
607 // and needs some refactoring to wire up in a good way. For now, left as
608 // zero.
609 /*sample_count=*/0,
610
611 /*sequence_number=*/media_transport_sequence_number_,
612 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
613 std::vector<uint8_t>(payload.begin(), payload.end()));
614
615 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
616 // channel id.
617 RTCError rtc_error =
618 media_transport()->SendAudioFrame(channel_id, std::move(frame));
619
620 if (!rtc_error.ok()) {
621 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
622 << ToString(rtc_error.type()) << ", "
623 << rtc_error.message();
624 return -1;
625 }
626
627 ++media_transport_sequence_number_;
628
629 return 0;
630}
631
Niels Möller530ead42018-10-04 14:28:39 +0200632ChannelSend::ChannelSend(rtc::TaskQueue* encoder_queue,
633 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200634 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -0800635 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +0100636 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200637 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700638 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700639 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100640 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800641 bool extmap_allow_mixed,
642 int rtcp_report_interval_ms)
Niels Möller530ead42018-10-04 14:28:39 +0200643 : event_log_(rtc_event_log),
644 _timeStamp(0), // This is just an offset, RTP module will add it's own
645 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200646 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200647 input_mute_(false),
648 previous_frame_muted_(false),
649 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200650 rtcp_observer_(new VoERtcpObserver(this)),
651 feedback_observer_proxy_(new TransportFeedbackProxy()),
652 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
653 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
654 retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(),
655 kMaxRetransmissionWindowMs)),
656 use_twcc_plr_for_ana_(
657 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Benjamin Wright84583f62018-10-04 14:22:34 -0700658 encoder_queue_(encoder_queue),
Niels Möller7d76a312018-10-26 12:57:07 +0200659 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700660 frame_encryptor_(frame_encryptor),
661 crypto_options_(crypto_options) {
Niels Möller530ead42018-10-04 14:28:39 +0200662 RTC_DCHECK(module_process_thread);
663 RTC_DCHECK(encoder_queue);
Niels Möllerdced9f62018-11-19 10:27:07 +0100664 module_process_thread_checker_.DetachFromThread();
665
Niels Möller530ead42018-10-04 14:28:39 +0200666 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
667
668 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800669
670 // We gradually remove codepaths that depend on RTP when using media
671 // transport. All of this logic should be moved to the future
672 // RTPMediaTransport. In this case it means that overhead and bandwidth
673 // observers should not be called when using media transport.
674 if (!media_transport_) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800675 // TODO(sukhanov): Overhead observer is only needed for RTP path, because in
676 // media transport audio overhead is currently considered constant (see
677 // getter MediaTransportInterface::GetAudioPacketOverhead). In the future
678 // when we introduce RTP media transport we should make audio overhead
679 // interface consistent and work for both RTP and non-RTP implementations.
680 configuration.overhead_observer = overhead_observer;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800681 configuration.bandwidth_callback = rtcp_observer_.get();
682 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
683 }
684
Niels Möller530ead42018-10-04 14:28:39 +0200685 configuration.audio = true;
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100686 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200687
688 configuration.paced_sender = rtp_packet_sender_proxy_.get();
689 configuration.transport_sequence_number_allocator =
690 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200691
692 configuration.event_log = event_log_;
693 configuration.rtt_stats = rtcp_rtt_stats;
694 configuration.retransmission_rate_limiter =
695 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100696 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800697 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200698
699 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
700 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200701
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800702 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
703 // callbacks after the audio_coding_ is fully initialized.
704 if (media_transport_) {
705 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
706 media_transport_->AddTargetTransferRateObserver(this);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800707 } else {
708 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
709 }
710
Niels Möller530ead42018-10-04 14:28:39 +0200711 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
712
Niels Möller530ead42018-10-04 14:28:39 +0200713 // Ensure that RTCP is enabled by default for the created channel.
714 // Note that, the module will keep generating RTCP until it is explicitly
715 // disabled by the user.
716 // After StopListen (when no sockets exists), RTCP packets will no longer
717 // be transmitted since the Transport object will then be invalid.
718 // RTCP is enabled by default.
719 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
720
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100721 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200722 RTC_DCHECK_EQ(0, error);
723}
724
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100725ChannelSend::~ChannelSend() {
Niels Möller530ead42018-10-04 14:28:39 +0200726 RTC_DCHECK(construction_thread_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +0200727
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800728 if (media_transport_) {
729 media_transport_->RemoveTargetTransferRateObserver(this);
730 }
731
Niels Möller530ead42018-10-04 14:28:39 +0200732 StopSend();
Niels Möller530ead42018-10-04 14:28:39 +0200733 int error = audio_coding_->RegisterTransportCallback(NULL);
734 RTC_DCHECK_EQ(0, error);
735
Niels Möller530ead42018-10-04 14:28:39 +0200736 if (_moduleProcessThreadPtr)
737 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200738}
739
Niels Möller26815232018-11-16 09:32:40 +0100740void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100741 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100742 RTC_DCHECK(!sending_);
743 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200744
Niels Möller530ead42018-10-04 14:28:39 +0200745 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100746 int ret = _rtpRtcpModule->SetSendingStatus(true);
747 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200748 {
749 // It is now OK to start posting tasks to the encoder task queue.
750 rtc::CritScope cs(&encoder_queue_lock_);
751 encoder_queue_is_active_ = true;
752 }
Niels Möller530ead42018-10-04 14:28:39 +0200753}
754
755void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100756 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100757 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200758 return;
759 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100760 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200761
762 // Post a task to the encoder thread which sets an event when the task is
763 // executed. We know that no more encoding tasks will be added to the task
764 // queue for this channel since sending is now deactivated. It means that,
765 // if we wait for the event to bet set, we know that no more pending tasks
766 // exists and it is therfore guaranteed that the task queue will never try
767 // to acccess and invalid channel object.
768 RTC_DCHECK(encoder_queue_);
769
Niels Möllerc572ff32018-11-07 08:43:50 +0100770 rtc::Event flush;
Niels Möller530ead42018-10-04 14:28:39 +0200771 {
772 // Clear |encoder_queue_is_active_| under lock to prevent any other tasks
773 // than this final "flush task" to be posted on the queue.
774 rtc::CritScope cs(&encoder_queue_lock_);
775 encoder_queue_is_active_ = false;
776 encoder_queue_->PostTask([&flush]() { flush.Set(); });
777 }
778 flush.Wait(rtc::Event::kForever);
779
Niels Möller530ead42018-10-04 14:28:39 +0200780 // Reset sending SSRC and sequence number and triggers direct transmission
781 // of RTCP BYE
782 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
783 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
784 }
785 _rtpRtcpModule->SetSendingMediaStatus(false);
786}
787
788bool ChannelSend::SetEncoder(int payload_type,
789 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100790 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200791 RTC_DCHECK_GE(payload_type, 0);
792 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200793
794 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
795 // as well as some other things, so we collect this info and send it along.
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100796 _rtpRtcpModule->RegisterAudioSendPayload(payload_type,
797 "audio",
798 encoder->RtpTimestampRateHz(),
799 encoder->NumChannels(),
800 0);
Niels Möller530ead42018-10-04 14:28:39 +0200801
Niels Möller7d76a312018-10-26 12:57:07 +0200802 if (media_transport_) {
803 rtc::CritScope cs(&media_transport_lock_);
804 media_transport_payload_type_ = payload_type;
805 // TODO(nisse): Currently broken for G722, since timestamps passed through
806 // encoder use RTP clock rather than sample count, and they differ for G722.
807 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
808 }
Niels Möller530ead42018-10-04 14:28:39 +0200809 audio_coding_->SetEncoder(std::move(encoder));
810 return true;
811}
812
813void ChannelSend::ModifyEncoder(
814 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800815 // This method can be called on the worker thread, module process thread
816 // or network thread. Audio coding is thread safe, so we do not need to
817 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200818 audio_coding_->ModifyEncoder(modifier);
819}
820
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100821void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
822 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
823 if (*encoder_ptr) {
824 modifier(encoder_ptr->get());
825 } else {
826 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
827 }
828 });
829}
830
Sebastian Jansson254d8692018-11-21 19:19:00 +0100831void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100832 // This method can be called on the worker thread, module process thread
833 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
834 // TODO(solenberg): Figure out a good way to check this or enforce calling
835 // rules.
836 // RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
837 // module_process_thread_checker_.CalledOnValidThread());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800838 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100839
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100840 CallEncoder([&](AudioEncoder* encoder) {
841 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200842 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100843 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
844 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200845}
846
Niels Möllerdced9f62018-11-19 10:27:07 +0100847int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800848 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200849 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200850}
851
852void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100853 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200854 if (!use_twcc_plr_for_ana_)
855 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100856 CallEncoder([&](AudioEncoder* encoder) {
857 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200858 });
859}
860
861void ChannelSend::OnRecoverableUplinkPacketLossRate(
862 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100863 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100864 CallEncoder([&](AudioEncoder* encoder) {
865 encoder->OnReceivedUplinkRecoverablePacketLossFraction(
866 recoverable_packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200867 });
868}
869
870void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
871 if (use_twcc_plr_for_ana_)
872 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100873 CallEncoder([&](AudioEncoder* encoder) {
874 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200875 });
876}
877
Niels Möller26815232018-11-16 09:32:40 +0100878// TODO(nisse): Delete always-true return value.
879bool ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100880 // May be called on either worker thread or network thread.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800881 if (media_transport_) {
882 // Ignore RTCP packets while media transport is used.
883 // Those packets should not arrive, but we are seeing occasional packets.
884 return 0;
885 }
886
Niels Möller530ead42018-10-04 14:28:39 +0200887 // Deliver RTCP packet to RTP/RTCP module for parsing
888 _rtpRtcpModule->IncomingRtcpPacket(data, length);
889
890 int64_t rtt = GetRTT();
891 if (rtt == 0) {
892 // Waiting for valid RTT.
Niels Möller26815232018-11-16 09:32:40 +0100893 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200894 }
895
896 int64_t nack_window_ms = rtt;
897 if (nack_window_ms < kMinRetransmissionWindowMs) {
898 nack_window_ms = kMinRetransmissionWindowMs;
899 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
900 nack_window_ms = kMaxRetransmissionWindowMs;
901 }
902 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
903
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800904 OnReceivedRtt(rtt);
Niels Möller26815232018-11-16 09:32:40 +0100905 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200906}
907
908void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100909 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200910 rtc::CritScope cs(&volume_settings_critsect_);
911 input_mute_ = enable;
912}
913
914bool ChannelSend::InputMute() const {
915 rtc::CritScope cs(&volume_settings_critsect_);
916 return input_mute_;
917}
918
Niels Möller26815232018-11-16 09:32:40 +0100919bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100920 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200921 RTC_DCHECK_LE(0, event);
922 RTC_DCHECK_GE(255, event);
923 RTC_DCHECK_LE(0, duration_ms);
924 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100925 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100926 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200927 }
928 if (_rtpRtcpModule->SendTelephoneEventOutband(
929 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
930 RTC_DLOG(LS_ERROR) << "SendTelephoneEventOutband() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100931 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200932 }
Niels Möller26815232018-11-16 09:32:40 +0100933 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200934}
935
Niels Möller26815232018-11-16 09:32:40 +0100936bool ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
937 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100938 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200939 RTC_DCHECK_LE(0, payload_type);
940 RTC_DCHECK_GE(127, payload_type);
Fredrik Solenbergf693bfa2018-12-11 12:22:10 +0100941 _rtpRtcpModule->RegisterAudioSendPayload(payload_type, "telephone-event",
942 payload_frequency, 0, 0);
Niels Möller26815232018-11-16 09:32:40 +0100943 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200944}
945
Niels Möllerdced9f62018-11-19 10:27:07 +0100946void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100947 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100948 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100949
Niels Möller7d76a312018-10-26 12:57:07 +0200950 if (media_transport_) {
951 rtc::CritScope cs(&media_transport_lock_);
952 media_transport_channel_id_ = ssrc;
953 }
Niels Möller530ead42018-10-04 14:28:39 +0200954 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200955}
956
Amit Hilbuch77938e62018-12-21 09:23:38 -0800957void ChannelSend::SetRid(const std::string& rid,
958 int extension_id,
959 int repaired_extension_id) {
960 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
961 if (extension_id != 0) {
962 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
963 extension_id);
964 RTC_DCHECK_EQ(0, ret);
965 }
966 if (repaired_extension_id != 0) {
967 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
968 repaired_extension_id);
969 RTC_DCHECK_EQ(0, ret);
970 }
971 _rtpRtcpModule->SetRid(rid);
972}
973
Niels Möller530ead42018-10-04 14:28:39 +0200974void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100975 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200976 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
977 RTC_DCHECK_EQ(0, ret);
978 _rtpRtcpModule->SetMid(mid);
979}
980
Johannes Kron9190b822018-10-29 11:22:05 +0100981void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +0100982 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +0100983 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
984}
985
Niels Möller26815232018-11-16 09:32:40 +0100986void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100987 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200988 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +0100989 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
990 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200991}
992
993void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100994 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200995 int ret =
996 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
997 RTC_DCHECK_EQ(0, ret);
998}
999
1000void ChannelSend::RegisterSenderCongestionControlObjects(
1001 RtpTransportControllerSendInterface* transport,
1002 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +01001003 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001004 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
1005 TransportFeedbackObserver* transport_feedback_observer =
1006 transport->transport_feedback_observer();
1007 PacketRouter* packet_router = transport->packet_router();
1008
1009 RTC_DCHECK(rtp_packet_sender);
1010 RTC_DCHECK(transport_feedback_observer);
1011 RTC_DCHECK(packet_router);
1012 RTC_DCHECK(!packet_router_);
1013 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
1014 feedback_observer_proxy_->SetTransportFeedbackObserver(
1015 transport_feedback_observer);
1016 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
1017 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
1018 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
1019 constexpr bool remb_candidate = false;
1020 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
1021 packet_router_ = packet_router;
1022}
1023
1024void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001025 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001026 RTC_DCHECK(packet_router_);
1027 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1028 rtcp_observer_->SetBandwidthObserver(nullptr);
1029 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1030 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1031 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1032 packet_router_ = nullptr;
1033 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
1034}
1035
Niels Möller26815232018-11-16 09:32:40 +01001036void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001037 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001038 // Note: SetCNAME() accepts a c string of length at most 255.
1039 const std::string c_name_limited(c_name.substr(0, 255));
1040 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1041 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001042}
1043
Niels Möller26815232018-11-16 09:32:40 +01001044std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001045 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001046 // Get the report blocks from the latest received RTCP Sender or Receiver
1047 // Report. Each element in the vector contains the sender's SSRC and a
1048 // report block according to RFC 3550.
1049 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001050
Niels Möller26815232018-11-16 09:32:40 +01001051 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1052 RTC_DCHECK_EQ(0, ret);
1053
1054 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001055
1056 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1057 for (; it != rtcp_report_blocks.end(); ++it) {
1058 ReportBlock report_block;
1059 report_block.sender_SSRC = it->sender_ssrc;
1060 report_block.source_SSRC = it->source_ssrc;
1061 report_block.fraction_lost = it->fraction_lost;
1062 report_block.cumulative_num_packets_lost = it->packets_lost;
1063 report_block.extended_highest_sequence_number =
1064 it->extended_highest_sequence_number;
1065 report_block.interarrival_jitter = it->jitter;
1066 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1067 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001068 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001069 }
Niels Möller26815232018-11-16 09:32:40 +01001070 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001071}
1072
Niels Möller26815232018-11-16 09:32:40 +01001073CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001074 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001075 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001076 stats.rttMs = GetRTT();
1077
Niels Möller530ead42018-10-04 14:28:39 +02001078 size_t bytesSent(0);
1079 uint32_t packetsSent(0);
1080
1081 if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
1082 RTC_DLOG(LS_WARNING)
1083 << "GetRTPStatistics() failed to retrieve RTP datacounters"
1084 << " => output will not be complete";
1085 }
1086
1087 stats.bytesSent = bytesSent;
1088 stats.packetsSent = packetsSent;
1089
Niels Möller26815232018-11-16 09:32:40 +01001090 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001091}
1092
Niels Möller530ead42018-10-04 14:28:39 +02001093void ChannelSend::ProcessAndEncodeAudio(
1094 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001095 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001096 // Avoid posting any new tasks if sending was already stopped in StopSend().
1097 rtc::CritScope cs(&encoder_queue_lock_);
1098 if (!encoder_queue_is_active_) {
1099 return;
1100 }
1101 // Profile time between when the audio frame is added to the task queue and
1102 // when the task is actually executed.
1103 audio_frame->UpdateProfileTimeStamp();
1104 encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
1105 new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
1106}
1107
1108void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
1109 RTC_DCHECK_RUN_ON(encoder_queue_);
1110 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
1111 RTC_DCHECK_LE(audio_input->num_channels_, 2);
1112
1113 // Measure time between when the audio frame is added to the task queue and
1114 // when the task is actually executed. Goal is to keep track of unwanted
1115 // extra latency added by the task queue.
1116 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1117 audio_input->ElapsedProfileTimeMs());
1118
1119 bool is_muted = InputMute();
1120 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1121
1122 if (_includeAudioLevelIndication) {
1123 size_t length =
1124 audio_input->samples_per_channel_ * audio_input->num_channels_;
1125 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1126 if (is_muted && previous_frame_muted_) {
1127 rms_level_.AnalyzeMuted(length);
1128 } else {
1129 rms_level_.Analyze(
1130 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1131 }
1132 }
1133 previous_frame_muted_ = is_muted;
1134
1135 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1136
1137 // The ACM resamples internally.
1138 audio_input->timestamp_ = _timeStamp;
1139 // This call will trigger AudioPacketizationCallback::SendData if encoding
1140 // is done and payload is ready for packetization and transmission.
1141 // Otherwise, it will return without invoking the callback.
1142 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1143 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1144 return;
1145 }
1146
1147 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1148}
1149
Niels Möller530ead42018-10-04 14:28:39 +02001150ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001151 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001152 return audio_coding_->GetANAStats();
1153}
1154
1155RtpRtcp* ChannelSend::GetRtpRtcp() const {
Niels Möllerdced9f62018-11-19 10:27:07 +01001156 RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +02001157 return _rtpRtcpModule.get();
1158}
1159
1160int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1161 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001162 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001163 int error = 0;
1164 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1165 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001166 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1167 // argument. Currently it wants an uint8_t.
1168 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1169 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001170 }
1171 return error;
1172}
1173
Niels Möller530ead42018-10-04 14:28:39 +02001174int64_t ChannelSend::GetRTT() const {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001175 if (media_transport_) {
1176 // GetRTT is generally used in the RTCP codepath, where media transport is
1177 // not present and so it shouldn't be needed. But it's also invoked in
1178 // 'GetStats' method, and for now returning media transport RTT here gives
1179 // us "free" rtt stats for media transport.
1180 auto target_rate = media_transport_->GetLatestTargetTransferRate();
1181 if (target_rate.has_value()) {
1182 return target_rate.value().network_estimate.round_trip_time.ms();
1183 }
1184
1185 return 0;
1186 }
Niels Möller530ead42018-10-04 14:28:39 +02001187 RtcpMode method = _rtpRtcpModule->RTCP();
1188 if (method == RtcpMode::kOff) {
1189 return 0;
1190 }
1191 std::vector<RTCPReportBlock> report_blocks;
1192 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1193
1194 if (report_blocks.empty()) {
1195 return 0;
1196 }
1197
1198 int64_t rtt = 0;
1199 int64_t avg_rtt = 0;
1200 int64_t max_rtt = 0;
1201 int64_t min_rtt = 0;
1202 // We don't know in advance the remote ssrc used by the other end's receiver
1203 // reports, so use the SSRC of the first report block for calculating the RTT.
1204 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1205 &min_rtt, &max_rtt) != 0) {
1206 return 0;
1207 }
1208 return rtt;
1209}
1210
Benjamin Wright78410ad2018-10-25 09:52:57 -07001211void ChannelSend::SetFrameEncryptor(
1212 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001213 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Benjamin Wright84583f62018-10-04 14:22:34 -07001214 rtc::CritScope cs(&encoder_queue_lock_);
1215 if (encoder_queue_is_active_) {
Mirko Bonadei80a86872019-02-04 15:01:43 +01001216 encoder_queue_->PostTask([this, frame_encryptor]() mutable {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001217 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001218 });
1219 } else {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001220 frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001221 }
1222}
1223
Anton Sukhanov626015d2019-02-04 15:16:06 -08001224// TODO(sukhanov): Consider moving TargetTransferRate observer to
1225// AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
1226// makes sense to consolidate all rate (and overhead) calculation there.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001227void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
1228 RTC_DCHECK(media_transport_);
1229 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1230}
1231
1232void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1233 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +01001234 CallEncoder(
1235 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001236}
1237
Niels Möllerdced9f62018-11-19 10:27:07 +01001238} // namespace
1239
1240std::unique_ptr<ChannelSendInterface> CreateChannelSend(
1241 rtc::TaskQueue* encoder_queue,
1242 ProcessThread* module_process_thread,
1243 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -08001244 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +01001245 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001246 RtcpRttStats* rtcp_rtt_stats,
1247 RtcEventLog* rtc_event_log,
1248 FrameEncryptorInterface* frame_encryptor,
1249 const webrtc::CryptoOptions& crypto_options,
1250 bool extmap_allow_mixed,
1251 int rtcp_report_interval_ms) {
1252 return absl::make_unique<ChannelSend>(
Anton Sukhanov626015d2019-02-04 15:16:06 -08001253 encoder_queue, module_process_thread, media_transport, overhead_observer,
1254 rtp_transport, rtcp_rtt_stats, rtc_event_log, frame_encryptor,
1255 crypto_options, extmap_allow_mixed, rtcp_report_interval_ms);
Niels Möllerdced9f62018-11-19 10:27:07 +01001256}
1257
Niels Möller530ead42018-10-04 14:28:39 +02001258} // namespace voe
1259} // namespace webrtc