blob: 4490b19f5a820633397b4b63cdfe73d8e9e3e747 [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"
Benjamin Wright84583f62018-10-04 14:22:34 -070022#include "api/crypto/frameencryptorinterface.h"
Niels Möller530ead42018-10-04 14:28:39 +020023#include "audio/utility/audio_frame_operations.h"
24#include "call/rtp_transport_controller_send_interface.h"
25#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
26#include "logging/rtc_event_log/rtc_event_log.h"
27#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
28#include "modules/pacing/packet_router.h"
29#include "modules/utility/include/process_thread.h"
30#include "rtc_base/checks.h"
31#include "rtc_base/criticalsection.h"
Yves Gerey2e00abc2018-10-05 15:39:24 +020032#include "rtc_base/event.h"
Niels Möller530ead42018-10-04 14:28:39 +020033#include "rtc_base/format_macros.h"
34#include "rtc_base/location.h"
35#include "rtc_base/logging.h"
36#include "rtc_base/rate_limiter.h"
37#include "rtc_base/task_queue.h"
38#include "rtc_base/thread_checker.h"
39#include "rtc_base/timeutils.h"
40#include "system_wrappers/include/field_trial.h"
41#include "system_wrappers/include/metrics.h"
42
43namespace webrtc {
44namespace voe {
45
46namespace {
47
48constexpr int64_t kMaxRetransmissionWindowMs = 1000;
49constexpr int64_t kMinRetransmissionWindowMs = 30;
50
Niels Möller7d76a312018-10-26 12:57:07 +020051MediaTransportEncodedAudioFrame::FrameType
52MediaTransportFrameTypeForWebrtcFrameType(webrtc::FrameType frame_type) {
53 switch (frame_type) {
54 case kAudioFrameSpeech:
55 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
56 break;
57
58 case kAudioFrameCN:
59 return MediaTransportEncodedAudioFrame::FrameType::
60 kDiscontinuousTransmission;
61 break;
62
63 default:
64 RTC_CHECK(false) << "Unexpected frame type=" << frame_type;
65 break;
66 }
67}
68
Niels Möller530ead42018-10-04 14:28:39 +020069} // namespace
70
71const int kTelephoneEventAttenuationdB = 10;
72
73class TransportFeedbackProxy : public TransportFeedbackObserver {
74 public:
75 TransportFeedbackProxy() : feedback_observer_(nullptr) {
76 pacer_thread_.DetachFromThread();
77 network_thread_.DetachFromThread();
78 }
79
80 void SetTransportFeedbackObserver(
81 TransportFeedbackObserver* feedback_observer) {
82 RTC_DCHECK(thread_checker_.CalledOnValidThread());
83 rtc::CritScope lock(&crit_);
84 feedback_observer_ = feedback_observer;
85 }
86
87 // Implements TransportFeedbackObserver.
88 void AddPacket(uint32_t ssrc,
89 uint16_t sequence_number,
90 size_t length,
91 const PacedPacketInfo& pacing_info) override {
92 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
93 rtc::CritScope lock(&crit_);
94 if (feedback_observer_)
95 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
96 }
97
98 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
99 RTC_DCHECK(network_thread_.CalledOnValidThread());
100 rtc::CritScope lock(&crit_);
101 if (feedback_observer_)
102 feedback_observer_->OnTransportFeedback(feedback);
103 }
104
105 private:
106 rtc::CriticalSection crit_;
107 rtc::ThreadChecker thread_checker_;
108 rtc::ThreadChecker pacer_thread_;
109 rtc::ThreadChecker network_thread_;
110 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
111};
112
113class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
114 public:
115 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
116 pacer_thread_.DetachFromThread();
117 }
118
119 void SetSequenceNumberAllocator(
120 TransportSequenceNumberAllocator* seq_num_allocator) {
121 RTC_DCHECK(thread_checker_.CalledOnValidThread());
122 rtc::CritScope lock(&crit_);
123 seq_num_allocator_ = seq_num_allocator;
124 }
125
126 // Implements TransportSequenceNumberAllocator.
127 uint16_t AllocateSequenceNumber() override {
128 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
129 rtc::CritScope lock(&crit_);
130 if (!seq_num_allocator_)
131 return 0;
132 return seq_num_allocator_->AllocateSequenceNumber();
133 }
134
135 private:
136 rtc::CriticalSection crit_;
137 rtc::ThreadChecker thread_checker_;
138 rtc::ThreadChecker pacer_thread_;
139 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
140};
141
142class RtpPacketSenderProxy : public RtpPacketSender {
143 public:
144 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
145
146 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
147 RTC_DCHECK(thread_checker_.CalledOnValidThread());
148 rtc::CritScope lock(&crit_);
149 rtp_packet_sender_ = rtp_packet_sender;
150 }
151
152 // Implements RtpPacketSender.
153 void InsertPacket(Priority priority,
154 uint32_t ssrc,
155 uint16_t sequence_number,
156 int64_t capture_time_ms,
157 size_t bytes,
158 bool retransmission) override {
159 rtc::CritScope lock(&crit_);
160 if (rtp_packet_sender_) {
161 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
162 capture_time_ms, bytes, retransmission);
163 }
164 }
165
166 void SetAccountForAudioPackets(bool account_for_audio) override {
167 RTC_NOTREACHED();
168 }
169
170 private:
171 rtc::ThreadChecker thread_checker_;
172 rtc::CriticalSection crit_;
173 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
174};
175
176class VoERtcpObserver : public RtcpBandwidthObserver {
177 public:
178 explicit VoERtcpObserver(ChannelSend* owner)
179 : owner_(owner), bandwidth_observer_(nullptr) {}
180 virtual ~VoERtcpObserver() {}
181
182 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
183 rtc::CritScope lock(&crit_);
184 bandwidth_observer_ = bandwidth_observer;
185 }
186
187 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
188 rtc::CritScope lock(&crit_);
189 if (bandwidth_observer_) {
190 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
191 }
192 }
193
194 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
195 int64_t rtt,
196 int64_t now_ms) override {
197 {
198 rtc::CritScope lock(&crit_);
199 if (bandwidth_observer_) {
200 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
201 now_ms);
202 }
203 }
204 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
205 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
206 // report for VoiceEngine?
207 if (report_blocks.empty())
208 return;
209
210 int fraction_lost_aggregate = 0;
211 int total_number_of_packets = 0;
212
213 // If receiving multiple report blocks, calculate the weighted average based
214 // on the number of packets a report refers to.
215 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
216 block_it != report_blocks.end(); ++block_it) {
217 // Find the previous extended high sequence number for this remote SSRC,
218 // to calculate the number of RTP packets this report refers to. Ignore if
219 // we haven't seen this SSRC before.
220 std::map<uint32_t, uint32_t>::iterator seq_num_it =
221 extended_max_sequence_number_.find(block_it->source_ssrc);
222 int number_of_packets = 0;
223 if (seq_num_it != extended_max_sequence_number_.end()) {
224 number_of_packets =
225 block_it->extended_highest_sequence_number - seq_num_it->second;
226 }
227 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
228 total_number_of_packets += number_of_packets;
229
230 extended_max_sequence_number_[block_it->source_ssrc] =
231 block_it->extended_highest_sequence_number;
232 }
233 int weighted_fraction_lost = 0;
234 if (total_number_of_packets > 0) {
235 weighted_fraction_lost =
236 (fraction_lost_aggregate + total_number_of_packets / 2) /
237 total_number_of_packets;
238 }
239 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
240 }
241
242 private:
243 ChannelSend* owner_;
244 // Maps remote side ssrc to extended highest sequence number received.
245 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
246 rtc::CriticalSection crit_;
247 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
248};
249
250class ChannelSend::ProcessAndEncodeAudioTask : public rtc::QueuedTask {
251 public:
252 ProcessAndEncodeAudioTask(std::unique_ptr<AudioFrame> audio_frame,
253 ChannelSend* channel)
254 : audio_frame_(std::move(audio_frame)), channel_(channel) {
255 RTC_DCHECK(channel_);
256 }
257
258 private:
259 bool Run() override {
260 RTC_DCHECK_RUN_ON(channel_->encoder_queue_);
261 channel_->ProcessAndEncodeAudioOnTaskQueue(audio_frame_.get());
262 return true;
263 }
264
265 std::unique_ptr<AudioFrame> audio_frame_;
266 ChannelSend* const channel_;
267};
268
269int32_t ChannelSend::SendData(FrameType frameType,
270 uint8_t payloadType,
271 uint32_t timeStamp,
272 const uint8_t* payloadData,
273 size_t payloadSize,
274 const RTPFragmentationHeader* fragmentation) {
275 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200276 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
277
278 if (media_transport() != nullptr) {
279 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload,
280 fragmentation);
281 } else {
282 return SendRtpAudio(frameType, payloadType, timeStamp, payload,
283 fragmentation);
284 }
285}
286
287int32_t ChannelSend::SendRtpAudio(FrameType frameType,
288 uint8_t payloadType,
289 uint32_t timeStamp,
290 rtc::ArrayView<const uint8_t> payload,
291 const RTPFragmentationHeader* fragmentation) {
292 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200293 if (_includeAudioLevelIndication) {
294 // Store current audio level in the RTP/RTCP module.
295 // The level will be used in combination with voice-activity state
296 // (frameType) to add an RTP header extension
297 _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
298 }
299
Benjamin Wright84583f62018-10-04 14:22:34 -0700300 // E2EE Custom Audio Frame Encryption (This is optional).
301 // Keep this buffer around for the lifetime of the send call.
302 rtc::Buffer encrypted_audio_payload;
303 if (frame_encryptor_ != nullptr) {
304 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
305 // Allocate a buffer to hold the maximum possible encrypted payload.
306 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200307 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700308 encrypted_audio_payload.SetSize(max_ciphertext_size);
309
310 // Encrypt the audio payload into the buffer.
311 size_t bytes_written = 0;
312 int encrypt_status = frame_encryptor_->Encrypt(
313 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200314 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
315 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700316 if (encrypt_status != 0) {
317 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
318 << encrypt_status;
319 return -1;
320 }
321 // Resize the buffer to the exact number of bytes actually used.
322 encrypted_audio_payload.SetSize(bytes_written);
323 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200324 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700325 } else if (crypto_options_.sframe.require_frame_encryption) {
326 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
327 << "A frame encryptor is required but one is not set.";
328 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700329 }
330
Niels Möller530ead42018-10-04 14:28:39 +0200331 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
332 // packetization.
333 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Möller7d76a312018-10-26 12:57:07 +0200334 if (!_rtpRtcpModule->SendOutgoingData((FrameType&)frameType, payloadType,
335 timeStamp,
336 // Leaving the time when this frame was
337 // received from the capture device as
338 // undefined for voice for now.
339 -1, payload.data(), payload.size(),
340 fragmentation, nullptr, nullptr)) {
Niels Möller530ead42018-10-04 14:28:39 +0200341 RTC_DLOG(LS_ERROR)
342 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
343 return -1;
344 }
345
346 return 0;
347}
348
Niels Möller7d76a312018-10-26 12:57:07 +0200349int32_t ChannelSend::SendMediaTransportAudio(
350 FrameType frameType,
351 uint8_t payloadType,
352 uint32_t timeStamp,
353 rtc::ArrayView<const uint8_t> payload,
354 const RTPFragmentationHeader* fragmentation) {
355 RTC_DCHECK_RUN_ON(encoder_queue_);
356 // TODO(nisse): Use null _transportPtr for MediaTransport.
357 // RTC_DCHECK(_transportPtr == nullptr);
358 uint64_t channel_id;
359 int sampling_rate_hz;
360 {
361 rtc::CritScope cs(&media_transport_lock_);
362 if (media_transport_payload_type_ != payloadType) {
363 // Payload type is being changed, media_transport_sampling_frequency_,
364 // no longer current.
365 return -1;
366 }
367 sampling_rate_hz = media_transport_sampling_frequency_;
368 channel_id = media_transport_channel_id_;
369 }
370 const MediaTransportEncodedAudioFrame frame(
371 /*sampling_rate_hz=*/sampling_rate_hz,
372
373 // TODO(nisse): Timestamp and sample index are the same for all supported
374 // audio codecs except G722. Refactor audio coding module to only use
375 // sample index, and leave translation to RTP time, when needed, for
376 // RTP-specific code.
377 /*starting_sample_index=*/timeStamp,
378
379 // Sample count isn't conveniently available from the AudioCodingModule,
380 // and needs some refactoring to wire up in a good way. For now, left as
381 // zero.
382 /*sample_count=*/0,
383
384 /*sequence_number=*/media_transport_sequence_number_,
385 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
386 std::vector<uint8_t>(payload.begin(), payload.end()));
387
388 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
389 // channel id.
390 RTCError rtc_error =
391 media_transport()->SendAudioFrame(channel_id, std::move(frame));
392
393 if (!rtc_error.ok()) {
394 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
395 << ToString(rtc_error.type()) << ", "
396 << rtc_error.message();
397 return -1;
398 }
399
400 ++media_transport_sequence_number_;
401
402 return 0;
403}
404
Niels Möller530ead42018-10-04 14:28:39 +0200405bool ChannelSend::SendRtp(const uint8_t* data,
406 size_t len,
407 const PacketOptions& options) {
Niels Möller7d76a312018-10-26 12:57:07 +0200408 // We should not be sending RTP packets if media transport is available.
409 RTC_CHECK(!media_transport());
410
Niels Möller530ead42018-10-04 14:28:39 +0200411 rtc::CritScope cs(&_callbackCritSect);
412
413 if (_transportPtr == NULL) {
414 RTC_DLOG(LS_ERROR)
415 << "ChannelSend::SendPacket() failed to send RTP packet due to"
416 << " invalid transport object";
417 return false;
418 }
419
420 if (!_transportPtr->SendRtp(data, len, options)) {
421 RTC_DLOG(LS_ERROR) << "ChannelSend::SendPacket() RTP transmission failed";
422 return false;
423 }
424 return true;
425}
426
427bool ChannelSend::SendRtcp(const uint8_t* data, size_t len) {
428 rtc::CritScope cs(&_callbackCritSect);
429 if (_transportPtr == NULL) {
430 RTC_DLOG(LS_ERROR)
431 << "ChannelSend::SendRtcp() failed to send RTCP packet due to"
432 << " invalid transport object";
433 return false;
434 }
435
436 int n = _transportPtr->SendRtcp(data, len);
437 if (n < 0) {
438 RTC_DLOG(LS_ERROR) << "ChannelSend::SendRtcp() transmission failed";
439 return false;
440 }
441 return true;
442}
443
444int ChannelSend::PreferredSampleRate() const {
445 // Return the bigger of playout and receive frequency in the ACM.
446 return std::max(audio_coding_->ReceiveFrequency(),
447 audio_coding_->PlayoutFrequency());
448}
449
450ChannelSend::ChannelSend(rtc::TaskQueue* encoder_queue,
451 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200452 MediaTransportInterface* media_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200453 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700454 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700455 FrameEncryptorInterface* frame_encryptor,
456 const webrtc::CryptoOptions& crypto_options)
Niels Möller530ead42018-10-04 14:28:39 +0200457 : event_log_(rtc_event_log),
458 _timeStamp(0), // This is just an offset, RTP module will add it's own
459 // random offset
460 send_sequence_number_(0),
461 _moduleProcessThreadPtr(module_process_thread),
462 _transportPtr(NULL),
463 input_mute_(false),
464 previous_frame_muted_(false),
465 _includeAudioLevelIndication(false),
466 transport_overhead_per_packet_(0),
467 rtp_overhead_per_packet_(0),
468 rtcp_observer_(new VoERtcpObserver(this)),
469 feedback_observer_proxy_(new TransportFeedbackProxy()),
470 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
471 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
472 retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(),
473 kMaxRetransmissionWindowMs)),
474 use_twcc_plr_for_ana_(
475 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Benjamin Wright84583f62018-10-04 14:22:34 -0700476 encoder_queue_(encoder_queue),
Niels Möller7d76a312018-10-26 12:57:07 +0200477 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700478 frame_encryptor_(frame_encryptor),
479 crypto_options_(crypto_options) {
Niels Möller530ead42018-10-04 14:28:39 +0200480 RTC_DCHECK(module_process_thread);
481 RTC_DCHECK(encoder_queue);
482 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
483
484 RtpRtcp::Configuration configuration;
485 configuration.audio = true;
486 configuration.outgoing_transport = this;
487 configuration.overhead_observer = this;
488 configuration.bandwidth_callback = rtcp_observer_.get();
489
490 configuration.paced_sender = rtp_packet_sender_proxy_.get();
491 configuration.transport_sequence_number_allocator =
492 seq_num_allocator_proxy_.get();
493 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
494
495 configuration.event_log = event_log_;
496 configuration.rtt_stats = rtcp_rtt_stats;
497 configuration.retransmission_rate_limiter =
498 retransmission_rate_limiter_.get();
499
500 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
501 _rtpRtcpModule->SetSendingMediaStatus(false);
502 Init();
503}
504
505ChannelSend::~ChannelSend() {
506 Terminate();
507 RTC_DCHECK(!channel_state_.Get().sending);
508}
509
510void ChannelSend::Init() {
511 channel_state_.Reset();
512
513 // --- Add modules to process thread (for periodic schedulation)
514 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
515
516 // --- ACM initialization
517 int error = audio_coding_->InitializeReceiver();
518 RTC_DCHECK_EQ(0, error);
519
520 // --- RTP/RTCP module initialization
521
522 // Ensure that RTCP is enabled by default for the created channel.
523 // Note that, the module will keep generating RTCP until it is explicitly
524 // disabled by the user.
525 // After StopListen (when no sockets exists), RTCP packets will no longer
526 // be transmitted since the Transport object will then be invalid.
527 // RTCP is enabled by default.
528 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
529
530 // --- Register all permanent callbacks
531 error = audio_coding_->RegisterTransportCallback(this);
532 RTC_DCHECK_EQ(0, error);
533}
534
535void ChannelSend::Terminate() {
536 RTC_DCHECK(construction_thread_.CalledOnValidThread());
537 // Must be called on the same thread as Init().
538
539 StopSend();
540
541 // The order to safely shutdown modules in a channel is:
542 // 1. De-register callbacks in modules
543 // 2. De-register modules in process thread
544 // 3. Destroy modules
545 int error = audio_coding_->RegisterTransportCallback(NULL);
546 RTC_DCHECK_EQ(0, error);
547
548 // De-register modules in process thread
549 if (_moduleProcessThreadPtr)
550 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
551
552 // End of modules shutdown
553}
554
555int32_t ChannelSend::StartSend() {
556 if (channel_state_.Get().sending) {
557 return 0;
558 }
559 channel_state_.SetSending(true);
560
561 // Resume the previous sequence number which was reset by StopSend(). This
562 // needs to be done before |sending| is set to true on the RTP/RTCP module.
563 if (send_sequence_number_) {
564 _rtpRtcpModule->SetSequenceNumber(send_sequence_number_);
565 }
566 _rtpRtcpModule->SetSendingMediaStatus(true);
567 if (_rtpRtcpModule->SetSendingStatus(true) != 0) {
568 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to start sending";
569 _rtpRtcpModule->SetSendingMediaStatus(false);
570 rtc::CritScope cs(&_callbackCritSect);
571 channel_state_.SetSending(false);
572 return -1;
573 }
574 {
575 // It is now OK to start posting tasks to the encoder task queue.
576 rtc::CritScope cs(&encoder_queue_lock_);
577 encoder_queue_is_active_ = true;
578 }
579 return 0;
580}
581
582void ChannelSend::StopSend() {
583 if (!channel_state_.Get().sending) {
584 return;
585 }
586 channel_state_.SetSending(false);
587
588 // Post a task to the encoder thread which sets an event when the task is
589 // executed. We know that no more encoding tasks will be added to the task
590 // queue for this channel since sending is now deactivated. It means that,
591 // if we wait for the event to bet set, we know that no more pending tasks
592 // exists and it is therfore guaranteed that the task queue will never try
593 // to acccess and invalid channel object.
594 RTC_DCHECK(encoder_queue_);
595
596 rtc::Event flush(false, false);
597 {
598 // Clear |encoder_queue_is_active_| under lock to prevent any other tasks
599 // than this final "flush task" to be posted on the queue.
600 rtc::CritScope cs(&encoder_queue_lock_);
601 encoder_queue_is_active_ = false;
602 encoder_queue_->PostTask([&flush]() { flush.Set(); });
603 }
604 flush.Wait(rtc::Event::kForever);
605
606 // Store the sequence number to be able to pick up the same sequence for
607 // the next StartSend(). This is needed for restarting device, otherwise
608 // it might cause libSRTP to complain about packets being replayed.
609 // TODO(xians): Remove this workaround after RtpRtcpModule's refactoring
610 // CL is landed. See issue
611 // https://code.google.com/p/webrtc/issues/detail?id=2111 .
612 send_sequence_number_ = _rtpRtcpModule->SequenceNumber();
613
614 // Reset sending SSRC and sequence number and triggers direct transmission
615 // of RTCP BYE
616 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
617 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
618 }
619 _rtpRtcpModule->SetSendingMediaStatus(false);
620}
621
622bool ChannelSend::SetEncoder(int payload_type,
623 std::unique_ptr<AudioEncoder> encoder) {
624 RTC_DCHECK_GE(payload_type, 0);
625 RTC_DCHECK_LE(payload_type, 127);
626 // TODO(ossu): Make CodecInsts up, for now: one for the RTP/RTCP module and
627 // one for for us to keep track of sample rate and number of channels, etc.
628
629 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
630 // as well as some other things, so we collect this info and send it along.
631 CodecInst rtp_codec;
632 rtp_codec.pltype = payload_type;
633 strncpy(rtp_codec.plname, "audio", sizeof(rtp_codec.plname));
634 rtp_codec.plname[sizeof(rtp_codec.plname) - 1] = 0;
635 // Seems unclear if it should be clock rate or sample rate. CodecInst
636 // supposedly carries the sample rate, but only clock rate seems sensible to
637 // send to the RTP/RTCP module.
638 rtp_codec.plfreq = encoder->RtpTimestampRateHz();
639 rtp_codec.pacsize = rtc::CheckedDivExact(
640 static_cast<int>(encoder->Max10MsFramesInAPacket() * rtp_codec.plfreq),
641 100);
642 rtp_codec.channels = encoder->NumChannels();
643 rtp_codec.rate = 0;
644
645 if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
646 _rtpRtcpModule->DeRegisterSendPayload(payload_type);
647 if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
648 RTC_DLOG(LS_ERROR)
649 << "SetEncoder() failed to register codec to RTP/RTCP module";
650 return false;
651 }
652 }
653
Niels Möller7d76a312018-10-26 12:57:07 +0200654 if (media_transport_) {
655 rtc::CritScope cs(&media_transport_lock_);
656 media_transport_payload_type_ = payload_type;
657 // TODO(nisse): Currently broken for G722, since timestamps passed through
658 // encoder use RTP clock rather than sample count, and they differ for G722.
659 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
660 }
Niels Möller530ead42018-10-04 14:28:39 +0200661 audio_coding_->SetEncoder(std::move(encoder));
662 return true;
663}
664
665void ChannelSend::ModifyEncoder(
666 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
667 audio_coding_->ModifyEncoder(modifier);
668}
669
670void ChannelSend::SetBitRate(int bitrate_bps, int64_t probing_interval_ms) {
671 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
672 if (*encoder) {
673 (*encoder)->OnReceivedUplinkBandwidth(bitrate_bps, probing_interval_ms);
674 }
675 });
676 retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200677 configured_bitrate_bps_ = bitrate_bps;
678}
679
680int ChannelSend::GetBitRate() const {
681 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200682}
683
684void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
685 if (!use_twcc_plr_for_ana_)
686 return;
687 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
688 if (*encoder) {
689 (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
690 }
691 });
692}
693
694void ChannelSend::OnRecoverableUplinkPacketLossRate(
695 float recoverable_packet_loss_rate) {
696 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
697 if (*encoder) {
698 (*encoder)->OnReceivedUplinkRecoverablePacketLossFraction(
699 recoverable_packet_loss_rate);
700 }
701 });
702}
703
704void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
705 if (use_twcc_plr_for_ana_)
706 return;
707 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
708 if (*encoder) {
709 (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
710 }
711 });
712}
713
714bool ChannelSend::EnableAudioNetworkAdaptor(const std::string& config_string) {
715 bool success = false;
716 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
717 if (*encoder) {
718 success =
719 (*encoder)->EnableAudioNetworkAdaptor(config_string, event_log_);
720 }
721 });
722 return success;
723}
724
725void ChannelSend::DisableAudioNetworkAdaptor() {
726 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
727 if (*encoder)
728 (*encoder)->DisableAudioNetworkAdaptor();
729 });
730}
731
732void ChannelSend::SetReceiverFrameLengthRange(int min_frame_length_ms,
733 int max_frame_length_ms) {
734 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
735 if (*encoder) {
736 (*encoder)->SetReceiverFrameLengthRange(min_frame_length_ms,
737 max_frame_length_ms);
738 }
739 });
740}
741
742void ChannelSend::RegisterTransport(Transport* transport) {
743 rtc::CritScope cs(&_callbackCritSect);
744 _transportPtr = transport;
745}
746
747int32_t ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
748 // Deliver RTCP packet to RTP/RTCP module for parsing
749 _rtpRtcpModule->IncomingRtcpPacket(data, length);
750
751 int64_t rtt = GetRTT();
752 if (rtt == 0) {
753 // Waiting for valid RTT.
754 return 0;
755 }
756
757 int64_t nack_window_ms = rtt;
758 if (nack_window_ms < kMinRetransmissionWindowMs) {
759 nack_window_ms = kMinRetransmissionWindowMs;
760 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
761 nack_window_ms = kMaxRetransmissionWindowMs;
762 }
763 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
764
765 // Invoke audio encoders OnReceivedRtt().
766 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
767 if (*encoder)
768 (*encoder)->OnReceivedRtt(rtt);
769 });
770
771 return 0;
772}
773
774void ChannelSend::SetInputMute(bool enable) {
775 rtc::CritScope cs(&volume_settings_critsect_);
776 input_mute_ = enable;
777}
778
779bool ChannelSend::InputMute() const {
780 rtc::CritScope cs(&volume_settings_critsect_);
781 return input_mute_;
782}
783
784int ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
785 RTC_DCHECK_LE(0, event);
786 RTC_DCHECK_GE(255, event);
787 RTC_DCHECK_LE(0, duration_ms);
788 RTC_DCHECK_GE(65535, duration_ms);
789 if (!Sending()) {
790 return -1;
791 }
792 if (_rtpRtcpModule->SendTelephoneEventOutband(
793 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
794 RTC_DLOG(LS_ERROR) << "SendTelephoneEventOutband() failed to send event";
795 return -1;
796 }
797 return 0;
798}
799
800int ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
801 int payload_frequency) {
802 RTC_DCHECK_LE(0, payload_type);
803 RTC_DCHECK_GE(127, payload_type);
804 CodecInst codec = {0};
805 codec.pltype = payload_type;
806 codec.plfreq = payload_frequency;
807 memcpy(codec.plname, "telephone-event", 16);
808 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
809 _rtpRtcpModule->DeRegisterSendPayload(codec.pltype);
810 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
811 RTC_DLOG(LS_ERROR)
812 << "SetSendTelephoneEventPayloadType() failed to register "
813 "send payload type";
814 return -1;
815 }
816 }
817 return 0;
818}
819
820int ChannelSend::SetLocalSSRC(unsigned int ssrc) {
821 if (channel_state_.Get().sending) {
822 RTC_DLOG(LS_ERROR) << "SetLocalSSRC() already sending";
823 return -1;
824 }
Niels Möller7d76a312018-10-26 12:57:07 +0200825 if (media_transport_) {
826 rtc::CritScope cs(&media_transport_lock_);
827 media_transport_channel_id_ = ssrc;
828 }
Niels Möller530ead42018-10-04 14:28:39 +0200829 _rtpRtcpModule->SetSSRC(ssrc);
830 return 0;
831}
832
833void ChannelSend::SetMid(const std::string& mid, int extension_id) {
834 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
835 RTC_DCHECK_EQ(0, ret);
836 _rtpRtcpModule->SetMid(mid);
837}
838
839int ChannelSend::SetSendAudioLevelIndicationStatus(bool enable,
840 unsigned char id) {
841 _includeAudioLevelIndication = enable;
842 return SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
843}
844
845void ChannelSend::EnableSendTransportSequenceNumber(int id) {
846 int ret =
847 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
848 RTC_DCHECK_EQ(0, ret);
849}
850
851void ChannelSend::RegisterSenderCongestionControlObjects(
852 RtpTransportControllerSendInterface* transport,
853 RtcpBandwidthObserver* bandwidth_observer) {
854 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
855 TransportFeedbackObserver* transport_feedback_observer =
856 transport->transport_feedback_observer();
857 PacketRouter* packet_router = transport->packet_router();
858
859 RTC_DCHECK(rtp_packet_sender);
860 RTC_DCHECK(transport_feedback_observer);
861 RTC_DCHECK(packet_router);
862 RTC_DCHECK(!packet_router_);
863 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
864 feedback_observer_proxy_->SetTransportFeedbackObserver(
865 transport_feedback_observer);
866 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
867 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
868 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
869 constexpr bool remb_candidate = false;
870 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
871 packet_router_ = packet_router;
872}
873
874void ChannelSend::ResetSenderCongestionControlObjects() {
875 RTC_DCHECK(packet_router_);
876 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
877 rtcp_observer_->SetBandwidthObserver(nullptr);
878 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
879 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
880 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
881 packet_router_ = nullptr;
882 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
883}
884
885void ChannelSend::SetRTCPStatus(bool enable) {
886 _rtpRtcpModule->SetRTCPStatus(enable ? RtcpMode::kCompound : RtcpMode::kOff);
887}
888
889int ChannelSend::SetRTCP_CNAME(const char cName[256]) {
890 if (_rtpRtcpModule->SetCNAME(cName) != 0) {
891 RTC_DLOG(LS_ERROR) << "SetRTCP_CNAME() failed to set RTCP CNAME";
892 return -1;
893 }
894 return 0;
895}
896
897int ChannelSend::GetRemoteRTCPReportBlocks(
898 std::vector<ReportBlock>* report_blocks) {
899 if (report_blocks == NULL) {
900 RTC_DLOG(LS_ERROR) << "GetRemoteRTCPReportBlock()s invalid report_blocks.";
901 return -1;
902 }
903
904 // Get the report blocks from the latest received RTCP Sender or Receiver
905 // Report. Each element in the vector contains the sender's SSRC and a
906 // report block according to RFC 3550.
907 std::vector<RTCPReportBlock> rtcp_report_blocks;
908 if (_rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks) != 0) {
909 return -1;
910 }
911
912 if (rtcp_report_blocks.empty())
913 return 0;
914
915 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
916 for (; it != rtcp_report_blocks.end(); ++it) {
917 ReportBlock report_block;
918 report_block.sender_SSRC = it->sender_ssrc;
919 report_block.source_SSRC = it->source_ssrc;
920 report_block.fraction_lost = it->fraction_lost;
921 report_block.cumulative_num_packets_lost = it->packets_lost;
922 report_block.extended_highest_sequence_number =
923 it->extended_highest_sequence_number;
924 report_block.interarrival_jitter = it->jitter;
925 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
926 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
927 report_blocks->push_back(report_block);
928 }
929 return 0;
930}
931
932int ChannelSend::GetRTPStatistics(CallSendStatistics& stats) {
933 // --- RtcpStatistics
934
935 // --- RTT
936 stats.rttMs = GetRTT();
937
938 // --- Data counters
939
940 size_t bytesSent(0);
941 uint32_t packetsSent(0);
942
943 if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
944 RTC_DLOG(LS_WARNING)
945 << "GetRTPStatistics() failed to retrieve RTP datacounters"
946 << " => output will not be complete";
947 }
948
949 stats.bytesSent = bytesSent;
950 stats.packetsSent = packetsSent;
951
952 return 0;
953}
954
955void ChannelSend::SetNACKStatus(bool enable, int maxNumberOfPackets) {
956 // None of these functions can fail.
957 if (enable)
958 audio_coding_->EnableNack(maxNumberOfPackets);
959 else
960 audio_coding_->DisableNack();
961}
962
963// Called when we are missing one or more packets.
964int ChannelSend::ResendPackets(const uint16_t* sequence_numbers, int length) {
965 return _rtpRtcpModule->SendNACK(sequence_numbers, length);
966}
967
968void ChannelSend::ProcessAndEncodeAudio(
969 std::unique_ptr<AudioFrame> audio_frame) {
970 // Avoid posting any new tasks if sending was already stopped in StopSend().
971 rtc::CritScope cs(&encoder_queue_lock_);
972 if (!encoder_queue_is_active_) {
973 return;
974 }
975 // Profile time between when the audio frame is added to the task queue and
976 // when the task is actually executed.
977 audio_frame->UpdateProfileTimeStamp();
978 encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
979 new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
980}
981
982void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
983 RTC_DCHECK_RUN_ON(encoder_queue_);
984 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
985 RTC_DCHECK_LE(audio_input->num_channels_, 2);
986
987 // Measure time between when the audio frame is added to the task queue and
988 // when the task is actually executed. Goal is to keep track of unwanted
989 // extra latency added by the task queue.
990 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
991 audio_input->ElapsedProfileTimeMs());
992
993 bool is_muted = InputMute();
994 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
995
996 if (_includeAudioLevelIndication) {
997 size_t length =
998 audio_input->samples_per_channel_ * audio_input->num_channels_;
999 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1000 if (is_muted && previous_frame_muted_) {
1001 rms_level_.AnalyzeMuted(length);
1002 } else {
1003 rms_level_.Analyze(
1004 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1005 }
1006 }
1007 previous_frame_muted_ = is_muted;
1008
1009 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1010
1011 // The ACM resamples internally.
1012 audio_input->timestamp_ = _timeStamp;
1013 // This call will trigger AudioPacketizationCallback::SendData if encoding
1014 // is done and payload is ready for packetization and transmission.
1015 // Otherwise, it will return without invoking the callback.
1016 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1017 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1018 return;
1019 }
1020
1021 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1022}
1023
1024void ChannelSend::UpdateOverheadForEncoder() {
1025 size_t overhead_per_packet =
1026 transport_overhead_per_packet_ + rtp_overhead_per_packet_;
1027 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
1028 if (*encoder) {
1029 (*encoder)->OnReceivedOverhead(overhead_per_packet);
1030 }
1031 });
1032}
1033
1034void ChannelSend::SetTransportOverhead(size_t transport_overhead_per_packet) {
1035 rtc::CritScope cs(&overhead_per_packet_lock_);
1036 transport_overhead_per_packet_ = transport_overhead_per_packet;
1037 UpdateOverheadForEncoder();
1038}
1039
1040// TODO(solenberg): Make AudioSendStream an OverheadObserver instead.
1041void ChannelSend::OnOverheadChanged(size_t overhead_bytes_per_packet) {
1042 rtc::CritScope cs(&overhead_per_packet_lock_);
1043 rtp_overhead_per_packet_ = overhead_bytes_per_packet;
1044 UpdateOverheadForEncoder();
1045}
1046
1047ANAStats ChannelSend::GetANAStatistics() const {
1048 return audio_coding_->GetANAStats();
1049}
1050
1051RtpRtcp* ChannelSend::GetRtpRtcp() const {
1052 return _rtpRtcpModule.get();
1053}
1054
1055int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1056 RTPExtensionType type,
1057 unsigned char id) {
1058 int error = 0;
1059 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1060 if (enable) {
1061 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(type, id);
1062 }
1063 return error;
1064}
1065
1066int ChannelSend::GetRtpTimestampRateHz() const {
1067 const auto format = audio_coding_->ReceiveFormat();
1068 // Default to the playout frequency if we've not gotten any packets yet.
1069 // TODO(ossu): Zero clockrate can only happen if we've added an external
1070 // decoder for a format we don't support internally. Remove once that way of
1071 // adding decoders is gone!
1072 return (format && format->clockrate_hz != 0)
1073 ? format->clockrate_hz
1074 : audio_coding_->PlayoutFrequency();
1075}
1076
1077int64_t ChannelSend::GetRTT() const {
1078 RtcpMode method = _rtpRtcpModule->RTCP();
1079 if (method == RtcpMode::kOff) {
1080 return 0;
1081 }
1082 std::vector<RTCPReportBlock> report_blocks;
1083 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1084
1085 if (report_blocks.empty()) {
1086 return 0;
1087 }
1088
1089 int64_t rtt = 0;
1090 int64_t avg_rtt = 0;
1091 int64_t max_rtt = 0;
1092 int64_t min_rtt = 0;
1093 // We don't know in advance the remote ssrc used by the other end's receiver
1094 // reports, so use the SSRC of the first report block for calculating the RTT.
1095 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1096 &min_rtt, &max_rtt) != 0) {
1097 return 0;
1098 }
1099 return rtt;
1100}
1101
Benjamin Wright78410ad2018-10-25 09:52:57 -07001102void ChannelSend::SetFrameEncryptor(
1103 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Benjamin Wright84583f62018-10-04 14:22:34 -07001104 rtc::CritScope cs(&encoder_queue_lock_);
1105 if (encoder_queue_is_active_) {
1106 encoder_queue_->PostTask([this, frame_encryptor]() {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001107 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001108 });
1109 } else {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001110 frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001111 }
1112}
1113
Niels Möller530ead42018-10-04 14:28:39 +02001114} // namespace voe
1115} // namespace webrtc