blob: e96ef4afde814ded96f08d5800b7afe2b461755d [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"
Niels Möller26815232018-11-16 09:32:40 +010036#include "rtc_base/numerics/safe_conversions.h"
Niels Möller530ead42018-10-04 14:28:39 +020037#include "rtc_base/rate_limiter.h"
38#include "rtc_base/task_queue.h"
39#include "rtc_base/thread_checker.h"
40#include "rtc_base/timeutils.h"
41#include "system_wrappers/include/field_trial.h"
42#include "system_wrappers/include/metrics.h"
43
44namespace webrtc {
45namespace voe {
46
47namespace {
48
49constexpr int64_t kMaxRetransmissionWindowMs = 1000;
50constexpr int64_t kMinRetransmissionWindowMs = 30;
51
Niels Möller7d76a312018-10-26 12:57:07 +020052MediaTransportEncodedAudioFrame::FrameType
53MediaTransportFrameTypeForWebrtcFrameType(webrtc::FrameType frame_type) {
54 switch (frame_type) {
55 case kAudioFrameSpeech:
56 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
57 break;
58
59 case kAudioFrameCN:
60 return MediaTransportEncodedAudioFrame::FrameType::
61 kDiscontinuousTransmission;
62 break;
63
64 default:
65 RTC_CHECK(false) << "Unexpected frame type=" << frame_type;
66 break;
67 }
68}
69
Niels Möller530ead42018-10-04 14:28:39 +020070} // namespace
71
72const int kTelephoneEventAttenuationdB = 10;
73
74class TransportFeedbackProxy : public TransportFeedbackObserver {
75 public:
76 TransportFeedbackProxy() : feedback_observer_(nullptr) {
77 pacer_thread_.DetachFromThread();
78 network_thread_.DetachFromThread();
79 }
80
81 void SetTransportFeedbackObserver(
82 TransportFeedbackObserver* feedback_observer) {
83 RTC_DCHECK(thread_checker_.CalledOnValidThread());
84 rtc::CritScope lock(&crit_);
85 feedback_observer_ = feedback_observer;
86 }
87
88 // Implements TransportFeedbackObserver.
89 void AddPacket(uint32_t ssrc,
90 uint16_t sequence_number,
91 size_t length,
92 const PacedPacketInfo& pacing_info) override {
93 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
94 rtc::CritScope lock(&crit_);
95 if (feedback_observer_)
96 feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
97 }
98
99 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
100 RTC_DCHECK(network_thread_.CalledOnValidThread());
101 rtc::CritScope lock(&crit_);
102 if (feedback_observer_)
103 feedback_observer_->OnTransportFeedback(feedback);
104 }
105
106 private:
107 rtc::CriticalSection crit_;
108 rtc::ThreadChecker thread_checker_;
109 rtc::ThreadChecker pacer_thread_;
110 rtc::ThreadChecker network_thread_;
111 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
112};
113
114class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
115 public:
116 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
117 pacer_thread_.DetachFromThread();
118 }
119
120 void SetSequenceNumberAllocator(
121 TransportSequenceNumberAllocator* seq_num_allocator) {
122 RTC_DCHECK(thread_checker_.CalledOnValidThread());
123 rtc::CritScope lock(&crit_);
124 seq_num_allocator_ = seq_num_allocator;
125 }
126
127 // Implements TransportSequenceNumberAllocator.
128 uint16_t AllocateSequenceNumber() override {
129 RTC_DCHECK(pacer_thread_.CalledOnValidThread());
130 rtc::CritScope lock(&crit_);
131 if (!seq_num_allocator_)
132 return 0;
133 return seq_num_allocator_->AllocateSequenceNumber();
134 }
135
136 private:
137 rtc::CriticalSection crit_;
138 rtc::ThreadChecker thread_checker_;
139 rtc::ThreadChecker pacer_thread_;
140 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
141};
142
143class RtpPacketSenderProxy : public RtpPacketSender {
144 public:
145 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
146
147 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
148 RTC_DCHECK(thread_checker_.CalledOnValidThread());
149 rtc::CritScope lock(&crit_);
150 rtp_packet_sender_ = rtp_packet_sender;
151 }
152
153 // Implements RtpPacketSender.
154 void InsertPacket(Priority priority,
155 uint32_t ssrc,
156 uint16_t sequence_number,
157 int64_t capture_time_ms,
158 size_t bytes,
159 bool retransmission) override {
160 rtc::CritScope lock(&crit_);
161 if (rtp_packet_sender_) {
162 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
163 capture_time_ms, bytes, retransmission);
164 }
165 }
166
167 void SetAccountForAudioPackets(bool account_for_audio) override {
168 RTC_NOTREACHED();
169 }
170
171 private:
172 rtc::ThreadChecker thread_checker_;
173 rtc::CriticalSection crit_;
174 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
175};
176
177class VoERtcpObserver : public RtcpBandwidthObserver {
178 public:
179 explicit VoERtcpObserver(ChannelSend* owner)
180 : owner_(owner), bandwidth_observer_(nullptr) {}
181 virtual ~VoERtcpObserver() {}
182
183 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
184 rtc::CritScope lock(&crit_);
185 bandwidth_observer_ = bandwidth_observer;
186 }
187
188 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
189 rtc::CritScope lock(&crit_);
190 if (bandwidth_observer_) {
191 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
192 }
193 }
194
195 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
196 int64_t rtt,
197 int64_t now_ms) override {
198 {
199 rtc::CritScope lock(&crit_);
200 if (bandwidth_observer_) {
201 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
202 now_ms);
203 }
204 }
205 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
206 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
207 // report for VoiceEngine?
208 if (report_blocks.empty())
209 return;
210
211 int fraction_lost_aggregate = 0;
212 int total_number_of_packets = 0;
213
214 // If receiving multiple report blocks, calculate the weighted average based
215 // on the number of packets a report refers to.
216 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
217 block_it != report_blocks.end(); ++block_it) {
218 // Find the previous extended high sequence number for this remote SSRC,
219 // to calculate the number of RTP packets this report refers to. Ignore if
220 // we haven't seen this SSRC before.
221 std::map<uint32_t, uint32_t>::iterator seq_num_it =
222 extended_max_sequence_number_.find(block_it->source_ssrc);
223 int number_of_packets = 0;
224 if (seq_num_it != extended_max_sequence_number_.end()) {
225 number_of_packets =
226 block_it->extended_highest_sequence_number - seq_num_it->second;
227 }
228 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
229 total_number_of_packets += number_of_packets;
230
231 extended_max_sequence_number_[block_it->source_ssrc] =
232 block_it->extended_highest_sequence_number;
233 }
234 int weighted_fraction_lost = 0;
235 if (total_number_of_packets > 0) {
236 weighted_fraction_lost =
237 (fraction_lost_aggregate + total_number_of_packets / 2) /
238 total_number_of_packets;
239 }
240 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
241 }
242
243 private:
244 ChannelSend* owner_;
245 // Maps remote side ssrc to extended highest sequence number received.
246 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
247 rtc::CriticalSection crit_;
248 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
249};
250
251class ChannelSend::ProcessAndEncodeAudioTask : public rtc::QueuedTask {
252 public:
253 ProcessAndEncodeAudioTask(std::unique_ptr<AudioFrame> audio_frame,
254 ChannelSend* channel)
255 : audio_frame_(std::move(audio_frame)), channel_(channel) {
256 RTC_DCHECK(channel_);
257 }
258
259 private:
260 bool Run() override {
261 RTC_DCHECK_RUN_ON(channel_->encoder_queue_);
262 channel_->ProcessAndEncodeAudioOnTaskQueue(audio_frame_.get());
263 return true;
264 }
265
266 std::unique_ptr<AudioFrame> audio_frame_;
267 ChannelSend* const channel_;
268};
269
270int32_t ChannelSend::SendData(FrameType frameType,
271 uint8_t payloadType,
272 uint32_t timeStamp,
273 const uint8_t* payloadData,
274 size_t payloadSize,
275 const RTPFragmentationHeader* fragmentation) {
276 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200277 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
278
279 if (media_transport() != nullptr) {
280 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload,
281 fragmentation);
282 } else {
283 return SendRtpAudio(frameType, payloadType, timeStamp, payload,
284 fragmentation);
285 }
286}
287
288int32_t ChannelSend::SendRtpAudio(FrameType frameType,
289 uint8_t payloadType,
290 uint32_t timeStamp,
291 rtc::ArrayView<const uint8_t> payload,
292 const RTPFragmentationHeader* fragmentation) {
293 RTC_DCHECK_RUN_ON(encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200294 if (_includeAudioLevelIndication) {
295 // Store current audio level in the RTP/RTCP module.
296 // The level will be used in combination with voice-activity state
297 // (frameType) to add an RTP header extension
298 _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
299 }
300
Benjamin Wright84583f62018-10-04 14:22:34 -0700301 // E2EE Custom Audio Frame Encryption (This is optional).
302 // Keep this buffer around for the lifetime of the send call.
303 rtc::Buffer encrypted_audio_payload;
304 if (frame_encryptor_ != nullptr) {
305 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
306 // Allocate a buffer to hold the maximum possible encrypted payload.
307 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200308 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700309 encrypted_audio_payload.SetSize(max_ciphertext_size);
310
311 // Encrypt the audio payload into the buffer.
312 size_t bytes_written = 0;
313 int encrypt_status = frame_encryptor_->Encrypt(
314 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200315 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
316 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700317 if (encrypt_status != 0) {
318 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
319 << encrypt_status;
320 return -1;
321 }
322 // Resize the buffer to the exact number of bytes actually used.
323 encrypted_audio_payload.SetSize(bytes_written);
324 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200325 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700326 } else if (crypto_options_.sframe.require_frame_encryption) {
327 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
328 << "A frame encryptor is required but one is not set.";
329 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700330 }
331
Niels Möller530ead42018-10-04 14:28:39 +0200332 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
333 // packetization.
334 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Möller7d76a312018-10-26 12:57:07 +0200335 if (!_rtpRtcpModule->SendOutgoingData((FrameType&)frameType, payloadType,
336 timeStamp,
337 // Leaving the time when this frame was
338 // received from the capture device as
339 // undefined for voice for now.
340 -1, payload.data(), payload.size(),
341 fragmentation, nullptr, nullptr)) {
Niels Möller530ead42018-10-04 14:28:39 +0200342 RTC_DLOG(LS_ERROR)
343 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
344 return -1;
345 }
346
347 return 0;
348}
349
Niels Möller7d76a312018-10-26 12:57:07 +0200350int32_t ChannelSend::SendMediaTransportAudio(
351 FrameType frameType,
352 uint8_t payloadType,
353 uint32_t timeStamp,
354 rtc::ArrayView<const uint8_t> payload,
355 const RTPFragmentationHeader* fragmentation) {
356 RTC_DCHECK_RUN_ON(encoder_queue_);
357 // TODO(nisse): Use null _transportPtr for MediaTransport.
358 // RTC_DCHECK(_transportPtr == nullptr);
359 uint64_t channel_id;
360 int sampling_rate_hz;
361 {
362 rtc::CritScope cs(&media_transport_lock_);
363 if (media_transport_payload_type_ != payloadType) {
364 // Payload type is being changed, media_transport_sampling_frequency_,
365 // no longer current.
366 return -1;
367 }
368 sampling_rate_hz = media_transport_sampling_frequency_;
369 channel_id = media_transport_channel_id_;
370 }
371 const MediaTransportEncodedAudioFrame frame(
372 /*sampling_rate_hz=*/sampling_rate_hz,
373
374 // TODO(nisse): Timestamp and sample index are the same for all supported
375 // audio codecs except G722. Refactor audio coding module to only use
376 // sample index, and leave translation to RTP time, when needed, for
377 // RTP-specific code.
378 /*starting_sample_index=*/timeStamp,
379
380 // Sample count isn't conveniently available from the AudioCodingModule,
381 // and needs some refactoring to wire up in a good way. For now, left as
382 // zero.
383 /*sample_count=*/0,
384
385 /*sequence_number=*/media_transport_sequence_number_,
386 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
387 std::vector<uint8_t>(payload.begin(), payload.end()));
388
389 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
390 // channel id.
391 RTCError rtc_error =
392 media_transport()->SendAudioFrame(channel_id, std::move(frame));
393
394 if (!rtc_error.ok()) {
395 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
396 << ToString(rtc_error.type()) << ", "
397 << rtc_error.message();
398 return -1;
399 }
400
401 ++media_transport_sequence_number_;
402
403 return 0;
404}
405
Niels Möller530ead42018-10-04 14:28:39 +0200406bool ChannelSend::SendRtp(const uint8_t* data,
407 size_t len,
408 const PacketOptions& options) {
Niels Möller7d76a312018-10-26 12:57:07 +0200409 // We should not be sending RTP packets if media transport is available.
410 RTC_CHECK(!media_transport());
411
Niels Möller530ead42018-10-04 14:28:39 +0200412 rtc::CritScope cs(&_callbackCritSect);
413
414 if (_transportPtr == NULL) {
415 RTC_DLOG(LS_ERROR)
416 << "ChannelSend::SendPacket() failed to send RTP packet due to"
417 << " invalid transport object";
418 return false;
419 }
420
421 if (!_transportPtr->SendRtp(data, len, options)) {
422 RTC_DLOG(LS_ERROR) << "ChannelSend::SendPacket() RTP transmission failed";
423 return false;
424 }
425 return true;
426}
427
428bool ChannelSend::SendRtcp(const uint8_t* data, size_t len) {
429 rtc::CritScope cs(&_callbackCritSect);
430 if (_transportPtr == NULL) {
431 RTC_DLOG(LS_ERROR)
432 << "ChannelSend::SendRtcp() failed to send RTCP packet due to"
433 << " invalid transport object";
434 return false;
435 }
436
437 int n = _transportPtr->SendRtcp(data, len);
438 if (n < 0) {
439 RTC_DLOG(LS_ERROR) << "ChannelSend::SendRtcp() transmission failed";
440 return false;
441 }
442 return true;
443}
444
Niels Möller530ead42018-10-04 14:28:39 +0200445ChannelSend::ChannelSend(rtc::TaskQueue* encoder_queue,
446 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200447 MediaTransportInterface* media_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200448 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700449 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700450 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100451 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800452 bool extmap_allow_mixed,
453 int rtcp_report_interval_ms)
Niels Möller530ead42018-10-04 14:28:39 +0200454 : event_log_(rtc_event_log),
455 _timeStamp(0), // This is just an offset, RTP module will add it's own
456 // random offset
457 send_sequence_number_(0),
458 _moduleProcessThreadPtr(module_process_thread),
459 _transportPtr(NULL),
460 input_mute_(false),
461 previous_frame_muted_(false),
462 _includeAudioLevelIndication(false),
463 transport_overhead_per_packet_(0),
464 rtp_overhead_per_packet_(0),
465 rtcp_observer_(new VoERtcpObserver(this)),
466 feedback_observer_proxy_(new TransportFeedbackProxy()),
467 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
468 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
469 retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(),
470 kMaxRetransmissionWindowMs)),
471 use_twcc_plr_for_ana_(
472 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Benjamin Wright84583f62018-10-04 14:22:34 -0700473 encoder_queue_(encoder_queue),
Niels Möller7d76a312018-10-26 12:57:07 +0200474 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700475 frame_encryptor_(frame_encryptor),
476 crypto_options_(crypto_options) {
Niels Möller530ead42018-10-04 14:28:39 +0200477 RTC_DCHECK(module_process_thread);
478 RTC_DCHECK(encoder_queue);
479 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
480
481 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800482
483 // We gradually remove codepaths that depend on RTP when using media
484 // transport. All of this logic should be moved to the future
485 // RTPMediaTransport. In this case it means that overhead and bandwidth
486 // observers should not be called when using media transport.
487 if (!media_transport_) {
488 configuration.overhead_observer = this;
489 configuration.bandwidth_callback = rtcp_observer_.get();
490 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
491 }
492
Niels Möller530ead42018-10-04 14:28:39 +0200493 configuration.audio = true;
494 configuration.outgoing_transport = this;
Niels Möller530ead42018-10-04 14:28:39 +0200495
496 configuration.paced_sender = rtp_packet_sender_proxy_.get();
497 configuration.transport_sequence_number_allocator =
498 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200499
500 configuration.event_log = event_log_;
501 configuration.rtt_stats = rtcp_rtt_stats;
502 configuration.retransmission_rate_limiter =
503 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100504 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou55718122018-11-09 13:17:39 -0800505 configuration.rtcp_interval_config.audio_interval_ms =
506 rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200507
508 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
509 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200510
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800511 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
512 // callbacks after the audio_coding_ is fully initialized.
513 if (media_transport_) {
514 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
515 media_transport_->AddTargetTransferRateObserver(this);
516 OnOverheadChanged(media_transport_->GetAudioPacketOverhead());
517 } else {
518 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
519 }
520
Niels Möller530ead42018-10-04 14:28:39 +0200521 channel_state_.Reset();
522
Niels Möller530ead42018-10-04 14:28:39 +0200523 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
524
Niels Möller530ead42018-10-04 14:28:39 +0200525 int error = audio_coding_->InitializeReceiver();
526 RTC_DCHECK_EQ(0, error);
527
Niels Möller530ead42018-10-04 14:28:39 +0200528 // Ensure that RTCP is enabled by default for the created channel.
529 // Note that, the module will keep generating RTCP until it is explicitly
530 // disabled by the user.
531 // After StopListen (when no sockets exists), RTCP packets will no longer
532 // be transmitted since the Transport object will then be invalid.
533 // RTCP is enabled by default.
534 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
535
Niels Möller530ead42018-10-04 14:28:39 +0200536 error = audio_coding_->RegisterTransportCallback(this);
537 RTC_DCHECK_EQ(0, error);
538}
539
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100540ChannelSend::~ChannelSend() {
Niels Möller530ead42018-10-04 14:28:39 +0200541 RTC_DCHECK(construction_thread_.CalledOnValidThread());
Niels Möller530ead42018-10-04 14:28:39 +0200542
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800543 if (media_transport_) {
544 media_transport_->RemoveTargetTransferRateObserver(this);
545 }
546
Niels Möller530ead42018-10-04 14:28:39 +0200547 StopSend();
548
Niels Möller530ead42018-10-04 14:28:39 +0200549 int error = audio_coding_->RegisterTransportCallback(NULL);
550 RTC_DCHECK_EQ(0, error);
551
Niels Möller530ead42018-10-04 14:28:39 +0200552 if (_moduleProcessThreadPtr)
553 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
554
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100555 RTC_DCHECK(!channel_state_.Get().sending);
Niels Möller530ead42018-10-04 14:28:39 +0200556}
557
Niels Möller26815232018-11-16 09:32:40 +0100558void ChannelSend::StartSend() {
559 RTC_DCHECK(!channel_state_.Get().sending);
Niels Möller530ead42018-10-04 14:28:39 +0200560 channel_state_.SetSending(true);
561
562 // Resume the previous sequence number which was reset by StopSend(). This
563 // needs to be done before |sending| is set to true on the RTP/RTCP module.
564 if (send_sequence_number_) {
565 _rtpRtcpModule->SetSequenceNumber(send_sequence_number_);
566 }
567 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100568 int ret = _rtpRtcpModule->SetSendingStatus(true);
569 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200570 {
571 // It is now OK to start posting tasks to the encoder task queue.
572 rtc::CritScope cs(&encoder_queue_lock_);
573 encoder_queue_is_active_ = true;
574 }
Niels Möller530ead42018-10-04 14:28:39 +0200575}
576
577void ChannelSend::StopSend() {
578 if (!channel_state_.Get().sending) {
579 return;
580 }
581 channel_state_.SetSending(false);
582
583 // Post a task to the encoder thread which sets an event when the task is
584 // executed. We know that no more encoding tasks will be added to the task
585 // queue for this channel since sending is now deactivated. It means that,
586 // if we wait for the event to bet set, we know that no more pending tasks
587 // exists and it is therfore guaranteed that the task queue will never try
588 // to acccess and invalid channel object.
589 RTC_DCHECK(encoder_queue_);
590
Niels Möllerc572ff32018-11-07 08:43:50 +0100591 rtc::Event flush;
Niels Möller530ead42018-10-04 14:28:39 +0200592 {
593 // Clear |encoder_queue_is_active_| under lock to prevent any other tasks
594 // than this final "flush task" to be posted on the queue.
595 rtc::CritScope cs(&encoder_queue_lock_);
596 encoder_queue_is_active_ = false;
597 encoder_queue_->PostTask([&flush]() { flush.Set(); });
598 }
599 flush.Wait(rtc::Event::kForever);
600
601 // Store the sequence number to be able to pick up the same sequence for
602 // the next StartSend(). This is needed for restarting device, otherwise
603 // it might cause libSRTP to complain about packets being replayed.
604 // TODO(xians): Remove this workaround after RtpRtcpModule's refactoring
605 // CL is landed. See issue
606 // https://code.google.com/p/webrtc/issues/detail?id=2111 .
607 send_sequence_number_ = _rtpRtcpModule->SequenceNumber();
608
609 // Reset sending SSRC and sequence number and triggers direct transmission
610 // of RTCP BYE
611 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
612 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
613 }
614 _rtpRtcpModule->SetSendingMediaStatus(false);
615}
616
617bool ChannelSend::SetEncoder(int payload_type,
618 std::unique_ptr<AudioEncoder> encoder) {
619 RTC_DCHECK_GE(payload_type, 0);
620 RTC_DCHECK_LE(payload_type, 127);
621 // TODO(ossu): Make CodecInsts up, for now: one for the RTP/RTCP module and
622 // one for for us to keep track of sample rate and number of channels, etc.
623
624 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
625 // as well as some other things, so we collect this info and send it along.
626 CodecInst rtp_codec;
627 rtp_codec.pltype = payload_type;
628 strncpy(rtp_codec.plname, "audio", sizeof(rtp_codec.plname));
629 rtp_codec.plname[sizeof(rtp_codec.plname) - 1] = 0;
630 // Seems unclear if it should be clock rate or sample rate. CodecInst
631 // supposedly carries the sample rate, but only clock rate seems sensible to
632 // send to the RTP/RTCP module.
633 rtp_codec.plfreq = encoder->RtpTimestampRateHz();
634 rtp_codec.pacsize = rtc::CheckedDivExact(
635 static_cast<int>(encoder->Max10MsFramesInAPacket() * rtp_codec.plfreq),
636 100);
637 rtp_codec.channels = encoder->NumChannels();
638 rtp_codec.rate = 0;
639
640 if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
641 _rtpRtcpModule->DeRegisterSendPayload(payload_type);
642 if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
643 RTC_DLOG(LS_ERROR)
644 << "SetEncoder() failed to register codec to RTP/RTCP module";
645 return false;
646 }
647 }
648
Niels Möller7d76a312018-10-26 12:57:07 +0200649 if (media_transport_) {
650 rtc::CritScope cs(&media_transport_lock_);
651 media_transport_payload_type_ = payload_type;
652 // TODO(nisse): Currently broken for G722, since timestamps passed through
653 // encoder use RTP clock rather than sample count, and they differ for G722.
654 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
655 }
Niels Möller530ead42018-10-04 14:28:39 +0200656 audio_coding_->SetEncoder(std::move(encoder));
657 return true;
658}
659
660void ChannelSend::ModifyEncoder(
661 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
662 audio_coding_->ModifyEncoder(modifier);
663}
664
665void ChannelSend::SetBitRate(int bitrate_bps, int64_t probing_interval_ms) {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800666 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möller530ead42018-10-04 14:28:39 +0200667 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
668 if (*encoder) {
669 (*encoder)->OnReceivedUplinkBandwidth(bitrate_bps, probing_interval_ms);
670 }
671 });
672 retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200673 configured_bitrate_bps_ = bitrate_bps;
674}
675
676int ChannelSend::GetBitRate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800677 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200678 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200679}
680
681void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
682 if (!use_twcc_plr_for_ana_)
683 return;
684 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
685 if (*encoder) {
686 (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
687 }
688 });
689}
690
691void ChannelSend::OnRecoverableUplinkPacketLossRate(
692 float recoverable_packet_loss_rate) {
693 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
694 if (*encoder) {
695 (*encoder)->OnReceivedUplinkRecoverablePacketLossFraction(
696 recoverable_packet_loss_rate);
697 }
698 });
699}
700
701void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
702 if (use_twcc_plr_for_ana_)
703 return;
704 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
705 if (*encoder) {
706 (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
707 }
708 });
709}
710
Niels Möller530ead42018-10-04 14:28:39 +0200711void ChannelSend::RegisterTransport(Transport* transport) {
712 rtc::CritScope cs(&_callbackCritSect);
713 _transportPtr = transport;
714}
715
Niels Möller26815232018-11-16 09:32:40 +0100716// TODO(nisse): Delete always-true return value.
717bool ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800718 if (media_transport_) {
719 // Ignore RTCP packets while media transport is used.
720 // Those packets should not arrive, but we are seeing occasional packets.
721 return 0;
722 }
723
Niels Möller530ead42018-10-04 14:28:39 +0200724 // Deliver RTCP packet to RTP/RTCP module for parsing
725 _rtpRtcpModule->IncomingRtcpPacket(data, length);
726
727 int64_t rtt = GetRTT();
728 if (rtt == 0) {
729 // Waiting for valid RTT.
Niels Möller26815232018-11-16 09:32:40 +0100730 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200731 }
732
733 int64_t nack_window_ms = rtt;
734 if (nack_window_ms < kMinRetransmissionWindowMs) {
735 nack_window_ms = kMinRetransmissionWindowMs;
736 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
737 nack_window_ms = kMaxRetransmissionWindowMs;
738 }
739 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
740
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800741 OnReceivedRtt(rtt);
Niels Möller26815232018-11-16 09:32:40 +0100742 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200743}
744
745void ChannelSend::SetInputMute(bool enable) {
746 rtc::CritScope cs(&volume_settings_critsect_);
747 input_mute_ = enable;
748}
749
750bool ChannelSend::InputMute() const {
751 rtc::CritScope cs(&volume_settings_critsect_);
752 return input_mute_;
753}
754
Niels Möller26815232018-11-16 09:32:40 +0100755bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller530ead42018-10-04 14:28:39 +0200756 RTC_DCHECK_LE(0, event);
757 RTC_DCHECK_GE(255, event);
758 RTC_DCHECK_LE(0, duration_ms);
759 RTC_DCHECK_GE(65535, duration_ms);
760 if (!Sending()) {
Niels Möller26815232018-11-16 09:32:40 +0100761 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200762 }
763 if (_rtpRtcpModule->SendTelephoneEventOutband(
764 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
765 RTC_DLOG(LS_ERROR) << "SendTelephoneEventOutband() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100766 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200767 }
Niels Möller26815232018-11-16 09:32:40 +0100768 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200769}
770
Niels Möller26815232018-11-16 09:32:40 +0100771bool ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
772 int payload_frequency) {
Niels Möller530ead42018-10-04 14:28:39 +0200773 RTC_DCHECK_LE(0, payload_type);
774 RTC_DCHECK_GE(127, payload_type);
775 CodecInst codec = {0};
776 codec.pltype = payload_type;
777 codec.plfreq = payload_frequency;
778 memcpy(codec.plname, "telephone-event", 16);
779 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
780 _rtpRtcpModule->DeRegisterSendPayload(codec.pltype);
781 if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
782 RTC_DLOG(LS_ERROR)
783 << "SetSendTelephoneEventPayloadType() failed to register "
784 "send payload type";
Niels Möller26815232018-11-16 09:32:40 +0100785 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200786 }
787 }
Niels Möller26815232018-11-16 09:32:40 +0100788 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200789}
790
Niels Möller26815232018-11-16 09:32:40 +0100791void ChannelSend::SetLocalSSRC(unsigned int ssrc) {
792 RTC_DCHECK(!channel_state_.Get().sending);
793
Niels Möller7d76a312018-10-26 12:57:07 +0200794 if (media_transport_) {
795 rtc::CritScope cs(&media_transport_lock_);
796 media_transport_channel_id_ = ssrc;
797 }
Niels Möller530ead42018-10-04 14:28:39 +0200798 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200799}
800
801void ChannelSend::SetMid(const std::string& mid, int extension_id) {
802 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
803 RTC_DCHECK_EQ(0, ret);
804 _rtpRtcpModule->SetMid(mid);
805}
806
Johannes Kron9190b822018-10-29 11:22:05 +0100807void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
808 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
809}
810
Niels Möller26815232018-11-16 09:32:40 +0100811void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller530ead42018-10-04 14:28:39 +0200812 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +0100813 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
814 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200815}
816
817void ChannelSend::EnableSendTransportSequenceNumber(int id) {
818 int ret =
819 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
820 RTC_DCHECK_EQ(0, ret);
821}
822
823void ChannelSend::RegisterSenderCongestionControlObjects(
824 RtpTransportControllerSendInterface* transport,
825 RtcpBandwidthObserver* bandwidth_observer) {
826 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
827 TransportFeedbackObserver* transport_feedback_observer =
828 transport->transport_feedback_observer();
829 PacketRouter* packet_router = transport->packet_router();
830
831 RTC_DCHECK(rtp_packet_sender);
832 RTC_DCHECK(transport_feedback_observer);
833 RTC_DCHECK(packet_router);
834 RTC_DCHECK(!packet_router_);
835 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
836 feedback_observer_proxy_->SetTransportFeedbackObserver(
837 transport_feedback_observer);
838 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
839 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
840 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
841 constexpr bool remb_candidate = false;
842 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
843 packet_router_ = packet_router;
844}
845
846void ChannelSend::ResetSenderCongestionControlObjects() {
847 RTC_DCHECK(packet_router_);
848 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
849 rtcp_observer_->SetBandwidthObserver(nullptr);
850 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
851 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
852 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
853 packet_router_ = nullptr;
854 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
855}
856
Niels Möller26815232018-11-16 09:32:40 +0100857void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
858 // Note: SetCNAME() accepts a c string of length at most 255.
859 const std::string c_name_limited(c_name.substr(0, 255));
860 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
861 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +0200862}
863
Niels Möller26815232018-11-16 09:32:40 +0100864std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller530ead42018-10-04 14:28:39 +0200865 // Get the report blocks from the latest received RTCP Sender or Receiver
866 // Report. Each element in the vector contains the sender's SSRC and a
867 // report block according to RFC 3550.
868 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +0200869
Niels Möller26815232018-11-16 09:32:40 +0100870 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
871 RTC_DCHECK_EQ(0, ret);
872
873 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +0200874
875 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
876 for (; it != rtcp_report_blocks.end(); ++it) {
877 ReportBlock report_block;
878 report_block.sender_SSRC = it->sender_ssrc;
879 report_block.source_SSRC = it->source_ssrc;
880 report_block.fraction_lost = it->fraction_lost;
881 report_block.cumulative_num_packets_lost = it->packets_lost;
882 report_block.extended_highest_sequence_number =
883 it->extended_highest_sequence_number;
884 report_block.interarrival_jitter = it->jitter;
885 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
886 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +0100887 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +0200888 }
Niels Möller26815232018-11-16 09:32:40 +0100889 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +0200890}
891
Niels Möller26815232018-11-16 09:32:40 +0100892CallSendStatistics ChannelSend::GetRTCPStatistics() const {
893 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +0200894 stats.rttMs = GetRTT();
895
Niels Möller530ead42018-10-04 14:28:39 +0200896 size_t bytesSent(0);
897 uint32_t packetsSent(0);
898
899 if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
900 RTC_DLOG(LS_WARNING)
901 << "GetRTPStatistics() failed to retrieve RTP datacounters"
902 << " => output will not be complete";
903 }
904
905 stats.bytesSent = bytesSent;
906 stats.packetsSent = packetsSent;
907
Niels Möller26815232018-11-16 09:32:40 +0100908 return stats;
Niels Möller530ead42018-10-04 14:28:39 +0200909}
910
911void ChannelSend::SetNACKStatus(bool enable, int maxNumberOfPackets) {
912 // None of these functions can fail.
913 if (enable)
914 audio_coding_->EnableNack(maxNumberOfPackets);
915 else
916 audio_coding_->DisableNack();
917}
918
919// Called when we are missing one or more packets.
920int ChannelSend::ResendPackets(const uint16_t* sequence_numbers, int length) {
921 return _rtpRtcpModule->SendNACK(sequence_numbers, length);
922}
923
924void ChannelSend::ProcessAndEncodeAudio(
925 std::unique_ptr<AudioFrame> audio_frame) {
926 // Avoid posting any new tasks if sending was already stopped in StopSend().
927 rtc::CritScope cs(&encoder_queue_lock_);
928 if (!encoder_queue_is_active_) {
929 return;
930 }
931 // Profile time between when the audio frame is added to the task queue and
932 // when the task is actually executed.
933 audio_frame->UpdateProfileTimeStamp();
934 encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
935 new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
936}
937
938void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
939 RTC_DCHECK_RUN_ON(encoder_queue_);
940 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
941 RTC_DCHECK_LE(audio_input->num_channels_, 2);
942
943 // Measure time between when the audio frame is added to the task queue and
944 // when the task is actually executed. Goal is to keep track of unwanted
945 // extra latency added by the task queue.
946 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
947 audio_input->ElapsedProfileTimeMs());
948
949 bool is_muted = InputMute();
950 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
951
952 if (_includeAudioLevelIndication) {
953 size_t length =
954 audio_input->samples_per_channel_ * audio_input->num_channels_;
955 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
956 if (is_muted && previous_frame_muted_) {
957 rms_level_.AnalyzeMuted(length);
958 } else {
959 rms_level_.Analyze(
960 rtc::ArrayView<const int16_t>(audio_input->data(), length));
961 }
962 }
963 previous_frame_muted_ = is_muted;
964
965 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
966
967 // The ACM resamples internally.
968 audio_input->timestamp_ = _timeStamp;
969 // This call will trigger AudioPacketizationCallback::SendData if encoding
970 // is done and payload is ready for packetization and transmission.
971 // Otherwise, it will return without invoking the callback.
972 if (audio_coding_->Add10MsData(*audio_input) < 0) {
973 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
974 return;
975 }
976
977 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
978}
979
980void ChannelSend::UpdateOverheadForEncoder() {
981 size_t overhead_per_packet =
982 transport_overhead_per_packet_ + rtp_overhead_per_packet_;
983 audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
984 if (*encoder) {
985 (*encoder)->OnReceivedOverhead(overhead_per_packet);
986 }
987 });
988}
989
990void ChannelSend::SetTransportOverhead(size_t transport_overhead_per_packet) {
991 rtc::CritScope cs(&overhead_per_packet_lock_);
992 transport_overhead_per_packet_ = transport_overhead_per_packet;
993 UpdateOverheadForEncoder();
994}
995
996// TODO(solenberg): Make AudioSendStream an OverheadObserver instead.
997void ChannelSend::OnOverheadChanged(size_t overhead_bytes_per_packet) {
998 rtc::CritScope cs(&overhead_per_packet_lock_);
999 rtp_overhead_per_packet_ = overhead_bytes_per_packet;
1000 UpdateOverheadForEncoder();
1001}
1002
1003ANAStats ChannelSend::GetANAStatistics() const {
1004 return audio_coding_->GetANAStats();
1005}
1006
1007RtpRtcp* ChannelSend::GetRtpRtcp() const {
1008 return _rtpRtcpModule.get();
1009}
1010
1011int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1012 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001013 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001014 int error = 0;
1015 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1016 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001017 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1018 // argument. Currently it wants an uint8_t.
1019 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1020 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001021 }
1022 return error;
1023}
1024
1025int ChannelSend::GetRtpTimestampRateHz() const {
1026 const auto format = audio_coding_->ReceiveFormat();
1027 // Default to the playout frequency if we've not gotten any packets yet.
1028 // TODO(ossu): Zero clockrate can only happen if we've added an external
1029 // decoder for a format we don't support internally. Remove once that way of
1030 // adding decoders is gone!
1031 return (format && format->clockrate_hz != 0)
1032 ? format->clockrate_hz
1033 : audio_coding_->PlayoutFrequency();
1034}
1035
1036int64_t ChannelSend::GetRTT() const {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001037 if (media_transport_) {
1038 // GetRTT is generally used in the RTCP codepath, where media transport is
1039 // not present and so it shouldn't be needed. But it's also invoked in
1040 // 'GetStats' method, and for now returning media transport RTT here gives
1041 // us "free" rtt stats for media transport.
1042 auto target_rate = media_transport_->GetLatestTargetTransferRate();
1043 if (target_rate.has_value()) {
1044 return target_rate.value().network_estimate.round_trip_time.ms();
1045 }
1046
1047 return 0;
1048 }
1049
Niels Möller530ead42018-10-04 14:28:39 +02001050 RtcpMode method = _rtpRtcpModule->RTCP();
1051 if (method == RtcpMode::kOff) {
1052 return 0;
1053 }
1054 std::vector<RTCPReportBlock> report_blocks;
1055 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1056
1057 if (report_blocks.empty()) {
1058 return 0;
1059 }
1060
1061 int64_t rtt = 0;
1062 int64_t avg_rtt = 0;
1063 int64_t max_rtt = 0;
1064 int64_t min_rtt = 0;
1065 // We don't know in advance the remote ssrc used by the other end's receiver
1066 // reports, so use the SSRC of the first report block for calculating the RTT.
1067 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1068 &min_rtt, &max_rtt) != 0) {
1069 return 0;
1070 }
1071 return rtt;
1072}
1073
Benjamin Wright78410ad2018-10-25 09:52:57 -07001074void ChannelSend::SetFrameEncryptor(
1075 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Benjamin Wright84583f62018-10-04 14:22:34 -07001076 rtc::CritScope cs(&encoder_queue_lock_);
1077 if (encoder_queue_is_active_) {
1078 encoder_queue_->PostTask([this, frame_encryptor]() {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001079 this->frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001080 });
1081 } else {
Benjamin Wright78410ad2018-10-25 09:52:57 -07001082 frame_encryptor_ = std::move(frame_encryptor);
Benjamin Wright84583f62018-10-04 14:22:34 -07001083 }
1084}
1085
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001086void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
1087 RTC_DCHECK(media_transport_);
1088 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1089}
1090
1091void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1092 // Invoke audio encoders OnReceivedRtt().
1093 audio_coding_->ModifyEncoder(
1094 [rtt_ms](std::unique_ptr<AudioEncoder>* encoder) {
1095 if (*encoder) {
1096 (*encoder)->OnReceivedRtt(rtt_ms);
1097 }
1098 });
1099}
1100
Niels Möller530ead42018-10-04 14:28:39 +02001101} // namespace voe
1102} // namespace webrtc