blob: e8360cb4a1aa80cc4c4928fd9e43a8314d37c311 [file] [log] [blame]
Niels Möller530ead42018-10-04 14:28:39 +02001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "audio/channel_send.h"
12
13#include <algorithm>
14#include <map>
15#include <memory>
16#include <string>
17#include <utility>
18#include <vector>
19
20#include "absl/memory/memory.h"
21#include "api/array_view.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010022#include "api/call/transport.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "api/crypto/frame_encryptor_interface.h"
Niels Möller530ead42018-10-04 14:28:39 +020024#include "audio/utility/audio_frame_operations.h"
25#include "call/rtp_transport_controller_send_interface.h"
26#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
27#include "logging/rtc_event_log/rtc_event_log.h"
28#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010029#include "modules/audio_coding/include/audio_coding_module.h"
30#include "modules/audio_processing/rms_level.h"
Niels Möller530ead42018-10-04 14:28:39 +020031#include "modules/pacing/packet_router.h"
32#include "modules/utility/include/process_thread.h"
33#include "rtc_base/checks.h"
Yves Gerey2e00abc2018-10-05 15:39:24 +020034#include "rtc_base/event.h"
Niels Möller530ead42018-10-04 14:28:39 +020035#include "rtc_base/format_macros.h"
36#include "rtc_base/location.h"
37#include "rtc_base/logging.h"
Niels Möller26815232018-11-16 09:32:40 +010038#include "rtc_base/numerics/safe_conversions.h"
Niels Möllerdced9f62018-11-19 10:27:07 +010039#include "rtc_base/race_checker.h"
Niels Möller530ead42018-10-04 14:28:39 +020040#include "rtc_base/rate_limiter.h"
41#include "rtc_base/task_queue.h"
42#include "rtc_base/thread_checker.h"
Steve Anton10542f22019-01-11 09:11:00 -080043#include "rtc_base/time_utils.h"
Sebastian Jansson977b3352019-03-04 17:43:34 +010044#include "system_wrappers/include/clock.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
Niels Möller87e2d782019-03-07 10:18:23 +010057MediaTransportFrameTypeForWebrtcFrameType(webrtc::AudioFrameType frame_type) {
Niels Möller7d76a312018-10-26 12:57:07 +020058 switch (frame_type) {
Niels Möllerc936cb62019-03-19 14:10:16 +010059 case AudioFrameType::kAudioFrameSpeech:
Niels Möller7d76a312018-10-26 12:57:07 +020060 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
61 break;
62
Niels Möllerc936cb62019-03-19 14:10:16 +010063 case AudioFrameType::kAudioFrameCN:
Niels Möller7d76a312018-10-26 12:57:07 +020064 return MediaTransportEncodedAudioFrame::FrameType::
65 kDiscontinuousTransmission;
66 break;
67
68 default:
Niels Möllerc936cb62019-03-19 14:10:16 +010069 RTC_CHECK(false) << "Unexpected frame type="
70 << static_cast<int>(frame_type);
Niels Möller7d76a312018-10-26 12:57:07 +020071 break;
72 }
73}
74
Niels Möllerdced9f62018-11-19 10:27:07 +010075class RtpPacketSenderProxy;
76class TransportFeedbackProxy;
77class TransportSequenceNumberProxy;
78class VoERtcpObserver;
79
Benjamin Wright17b050f2019-03-13 17:35:46 -070080class ChannelSend : public ChannelSendInterface,
81 public AudioPacketizationCallback, // receive encoded
82 // packets from the ACM
83 public TargetTransferRateObserver {
Niels Möllerdced9f62018-11-19 10:27:07 +010084 public:
85 // TODO(nisse): Make OnUplinkPacketLossRate public, and delete friend
86 // declaration.
87 friend class VoERtcpObserver;
88
Sebastian Jansson977b3352019-03-04 17:43:34 +010089 ChannelSend(Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +010090 TaskQueueFactory* task_queue_factory,
Niels Möllerdced9f62018-11-19 10:27:07 +010091 ProcessThread* module_process_thread,
92 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -080093 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +010094 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +010095 RtcpRttStats* rtcp_rtt_stats,
96 RtcEventLog* rtc_event_log,
97 FrameEncryptorInterface* frame_encryptor,
98 const webrtc::CryptoOptions& crypto_options,
99 bool extmap_allow_mixed,
100 int rtcp_report_interval_ms);
101
102 ~ChannelSend() override;
103
104 // Send using this encoder, with this payload type.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100105 void SetEncoder(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100106 std::unique_ptr<AudioEncoder> encoder) override;
107 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
108 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100109 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100110
111 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +0100112 void StartSend() override;
113 void StopSend() override;
114
115 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +0100116 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100117 int GetBitrate() const override;
118
119 // Network
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100120 void ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100121
122 // Muting, Volume and Level.
123 void SetInputMute(bool enable) override;
124
125 // Stats.
126 ANAStats GetANAStatistics() const override;
127
128 // Used by AudioSendStream.
129 RtpRtcp* GetRtpRtcp() const override;
130
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100131 void RegisterCngPayloadType(int payload_type, int payload_frequency) override;
132
Niels Möllerdced9f62018-11-19 10:27:07 +0100133 // DTMF.
134 bool SendTelephoneEventOutband(int event, int duration_ms) override;
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100135 void SetSendTelephoneEventPayloadType(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100136 int payload_frequency) override;
137
138 // RTP+RTCP
139 void SetLocalSSRC(uint32_t ssrc) override;
Amit Hilbuch77938e62018-12-21 09:23:38 -0800140 void SetRid(const std::string& rid,
141 int extension_id,
142 int repaired_extension_id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100143 void SetMid(const std::string& mid, int extension_id) override;
144 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
145 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
146 void EnableSendTransportSequenceNumber(int id) override;
147
148 void RegisterSenderCongestionControlObjects(
149 RtpTransportControllerSendInterface* transport,
150 RtcpBandwidthObserver* bandwidth_observer) override;
151 void ResetSenderCongestionControlObjects() override;
152 void SetRTCP_CNAME(absl::string_view c_name) override;
153 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
154 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100155
156 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
157 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
158 // the actual processing of the audio takes place. The processing mainly
159 // consists of encoding and preparing the result for sending by adding it to a
160 // send queue.
161 // The main reason for using a task queue here is to release the native,
162 // OS-specific, audio capture thread as soon as possible to ensure that it
163 // can go back to sleep and be prepared to deliver an new captured audio
164 // packet.
165 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
166
Niels Möllerdced9f62018-11-19 10:27:07 +0100167 // The existence of this function alongside OnUplinkPacketLossRate is
168 // a compromise. We want the encoder to be agnostic of the PLR source, but
169 // we also don't want it to receive conflicting information from TWCC and
170 // from RTCP-XR.
171 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
172
173 void OnRecoverableUplinkPacketLossRate(
174 float recoverable_packet_loss_rate) override;
175
176 int64_t GetRTT() const override;
177
178 // E2EE Custom Audio Frame Encryption
179 void SetFrameEncryptor(
180 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
181
182 private:
Niels Möllerdced9f62018-11-19 10:27:07 +0100183 // From AudioPacketizationCallback in the ACM
Niels Möller87e2d782019-03-07 10:18:23 +0100184 int32_t SendData(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100185 uint8_t payloadType,
186 uint32_t timeStamp,
187 const uint8_t* payloadData,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200188 size_t payloadSize) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100189
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öller87e2d782019-03-07 10:18:23 +0100195 int32_t SendRtpAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100196 uint8_t payloadType,
197 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200198 rtc::ArrayView<const uint8_t> payload)
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100199 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100200
Niels Möller87e2d782019-03-07 10:18:23 +0100201 int32_t SendMediaTransportAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100202 uint8_t payloadType,
203 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200204 rtc::ArrayView<const uint8_t> payload)
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100205 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100206
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.
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100212 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input)
213 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100214
215 void OnReceivedRtt(int64_t rtt_ms);
216
217 void OnTargetTransferRate(TargetTransferRate) override;
218
219 // Thread checkers document and lock usage of some methods on voe::Channel to
220 // specific threads we know about. The goal is to eventually split up
221 // voe::Channel into parts with single-threaded semantics, and thereby reduce
222 // the need for locks.
223 rtc::ThreadChecker worker_thread_checker_;
224 rtc::ThreadChecker module_process_thread_checker_;
225 // Methods accessed from audio and video threads are checked for sequential-
226 // only access. We don't necessarily own and control these threads, so thread
227 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
228 // audio thread to another, but access is still sequential.
229 rtc::RaceChecker audio_thread_race_checker_;
230
Niels Möllerdced9f62018-11-19 10:27:07 +0100231 rtc::CriticalSection volume_settings_critsect_;
232
Niels Möller26e88b02018-11-19 15:08:13 +0100233 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100234
235 RtcEventLog* const event_log_;
236
237 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100238 std::unique_ptr<RTPSenderAudio> rtp_sender_audio_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100239
240 std::unique_ptr<AudioCodingModule> audio_coding_;
241 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
242
Niels Möllerdced9f62018-11-19 10:27:07 +0100243 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100244 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100245 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
246 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
247 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
248 // VoeRTP_RTCP
249 // TODO(henrika): can today be accessed on the main thread and on the
250 // task queue; hence potential race.
251 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800252
Niels Möllerdced9f62018-11-19 10:27:07 +0100253 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100254 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100255
Niels Möller985a1f32018-11-19 16:08:42 +0100256 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
257 nullptr;
258 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
259 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
260 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_sender_proxy_;
261 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100262
263 rtc::ThreadChecker construction_thread_;
264
265 const bool use_twcc_plr_for_ana_;
266
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100267 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_) = false;
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
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100284 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_
285 RTC_GUARDED_BY(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100286 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100287 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100288
289 rtc::CriticalSection bitrate_crit_section_;
290 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100291
292 // Defined last to ensure that there are no running tasks when the other
293 // members are destroyed.
294 rtc::TaskQueue encoder_queue_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100295};
Niels Möller530ead42018-10-04 14:28:39 +0200296
297const int kTelephoneEventAttenuationdB = 10;
298
299class TransportFeedbackProxy : public TransportFeedbackObserver {
300 public:
301 TransportFeedbackProxy() : feedback_observer_(nullptr) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200302 pacer_thread_.Detach();
303 network_thread_.Detach();
Niels Möller530ead42018-10-04 14:28:39 +0200304 }
305
306 void SetTransportFeedbackObserver(
307 TransportFeedbackObserver* feedback_observer) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200308 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200309 rtc::CritScope lock(&crit_);
310 feedback_observer_ = feedback_observer;
311 }
312
313 // Implements TransportFeedbackObserver.
Erik Språng30a276b2019-04-23 12:00:11 +0200314 void OnAddPacket(const RtpPacketSendInfo& packet_info) override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200315 RTC_DCHECK(pacer_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200316 rtc::CritScope lock(&crit_);
317 if (feedback_observer_)
Erik Språng30a276b2019-04-23 12:00:11 +0200318 feedback_observer_->OnAddPacket(packet_info);
Niels Möller530ead42018-10-04 14:28:39 +0200319 }
320
321 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200322 RTC_DCHECK(network_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200323 rtc::CritScope lock(&crit_);
324 if (feedback_observer_)
325 feedback_observer_->OnTransportFeedback(feedback);
326 }
327
328 private:
329 rtc::CriticalSection crit_;
330 rtc::ThreadChecker thread_checker_;
331 rtc::ThreadChecker pacer_thread_;
332 rtc::ThreadChecker network_thread_;
333 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
334};
335
336class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
337 public:
338 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200339 pacer_thread_.Detach();
Niels Möller530ead42018-10-04 14:28:39 +0200340 }
341
342 void SetSequenceNumberAllocator(
343 TransportSequenceNumberAllocator* seq_num_allocator) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200344 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200345 rtc::CritScope lock(&crit_);
346 seq_num_allocator_ = seq_num_allocator;
347 }
348
349 // Implements TransportSequenceNumberAllocator.
350 uint16_t AllocateSequenceNumber() override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200351 RTC_DCHECK(pacer_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200352 rtc::CritScope lock(&crit_);
353 if (!seq_num_allocator_)
354 return 0;
355 return seq_num_allocator_->AllocateSequenceNumber();
356 }
357
358 private:
359 rtc::CriticalSection crit_;
360 rtc::ThreadChecker thread_checker_;
361 rtc::ThreadChecker pacer_thread_;
362 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
363};
364
365class RtpPacketSenderProxy : public RtpPacketSender {
366 public:
367 RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
368
369 void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200370 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200371 rtc::CritScope lock(&crit_);
372 rtp_packet_sender_ = rtp_packet_sender;
373 }
374
375 // Implements RtpPacketSender.
376 void InsertPacket(Priority priority,
377 uint32_t ssrc,
378 uint16_t sequence_number,
379 int64_t capture_time_ms,
380 size_t bytes,
381 bool retransmission) override {
382 rtc::CritScope lock(&crit_);
383 if (rtp_packet_sender_) {
384 rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
385 capture_time_ms, bytes, retransmission);
386 }
387 }
388
389 void SetAccountForAudioPackets(bool account_for_audio) override {
390 RTC_NOTREACHED();
391 }
392
393 private:
394 rtc::ThreadChecker thread_checker_;
395 rtc::CriticalSection crit_;
396 RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
397};
398
399class VoERtcpObserver : public RtcpBandwidthObserver {
400 public:
401 explicit VoERtcpObserver(ChannelSend* owner)
402 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100403 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200404
405 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
406 rtc::CritScope lock(&crit_);
407 bandwidth_observer_ = bandwidth_observer;
408 }
409
410 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
411 rtc::CritScope lock(&crit_);
412 if (bandwidth_observer_) {
413 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
414 }
415 }
416
417 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
418 int64_t rtt,
419 int64_t now_ms) override {
420 {
421 rtc::CritScope lock(&crit_);
422 if (bandwidth_observer_) {
423 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
424 now_ms);
425 }
426 }
427 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
428 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
429 // report for VoiceEngine?
430 if (report_blocks.empty())
431 return;
432
433 int fraction_lost_aggregate = 0;
434 int total_number_of_packets = 0;
435
436 // If receiving multiple report blocks, calculate the weighted average based
437 // on the number of packets a report refers to.
438 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
439 block_it != report_blocks.end(); ++block_it) {
440 // Find the previous extended high sequence number for this remote SSRC,
441 // to calculate the number of RTP packets this report refers to. Ignore if
442 // we haven't seen this SSRC before.
443 std::map<uint32_t, uint32_t>::iterator seq_num_it =
444 extended_max_sequence_number_.find(block_it->source_ssrc);
445 int number_of_packets = 0;
446 if (seq_num_it != extended_max_sequence_number_.end()) {
447 number_of_packets =
448 block_it->extended_highest_sequence_number - seq_num_it->second;
449 }
450 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
451 total_number_of_packets += number_of_packets;
452
453 extended_max_sequence_number_[block_it->source_ssrc] =
454 block_it->extended_highest_sequence_number;
455 }
456 int weighted_fraction_lost = 0;
457 if (total_number_of_packets > 0) {
458 weighted_fraction_lost =
459 (fraction_lost_aggregate + total_number_of_packets / 2) /
460 total_number_of_packets;
461 }
462 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
463 }
464
465 private:
466 ChannelSend* owner_;
467 // Maps remote side ssrc to extended highest sequence number received.
468 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
469 rtc::CriticalSection crit_;
470 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
471};
472
Niels Möller87e2d782019-03-07 10:18:23 +0100473int32_t ChannelSend::SendData(AudioFrameType frameType,
Niels Möller530ead42018-10-04 14:28:39 +0200474 uint8_t payloadType,
475 uint32_t timeStamp,
476 const uint8_t* payloadData,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200477 size_t payloadSize) {
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100478 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200479 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
480
481 if (media_transport() != nullptr) {
Niels Möllerc936cb62019-03-19 14:10:16 +0100482 if (frameType == AudioFrameType::kEmptyFrame) {
Piotr (Peter) Slatala3cdd4d52019-02-28 07:10:56 -0800483 // TODO(bugs.webrtc.org/9719): Media transport Send doesn't support
484 // sending empty frames.
485 return 0;
486 }
487
Niels Möllerc35b6e62019-04-25 16:31:18 +0200488 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload);
Niels Möller7d76a312018-10-26 12:57:07 +0200489 } else {
Niels Möllerc35b6e62019-04-25 16:31:18 +0200490 return SendRtpAudio(frameType, payloadType, timeStamp, payload);
Niels Möller7d76a312018-10-26 12:57:07 +0200491 }
492}
493
Niels Möller87e2d782019-03-07 10:18:23 +0100494int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200495 uint8_t payloadType,
496 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200497 rtc::ArrayView<const uint8_t> payload) {
Niels Möller530ead42018-10-04 14:28:39 +0200498 if (_includeAudioLevelIndication) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100499 // Store current audio level in the RTP sender.
Niels Möller530ead42018-10-04 14:28:39 +0200500 // The level will be used in combination with voice-activity state
501 // (frameType) to add an RTP header extension
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100502 rtp_sender_audio_->SetAudioLevel(rms_level_.Average());
Niels Möller530ead42018-10-04 14:28:39 +0200503 }
504
Benjamin Wright84583f62018-10-04 14:22:34 -0700505 // E2EE Custom Audio Frame Encryption (This is optional).
506 // Keep this buffer around for the lifetime of the send call.
507 rtc::Buffer encrypted_audio_payload;
508 if (frame_encryptor_ != nullptr) {
509 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
510 // Allocate a buffer to hold the maximum possible encrypted payload.
511 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
Niels Möller7d76a312018-10-26 12:57:07 +0200512 cricket::MEDIA_TYPE_AUDIO, payload.size());
Benjamin Wright84583f62018-10-04 14:22:34 -0700513 encrypted_audio_payload.SetSize(max_ciphertext_size);
514
515 // Encrypt the audio payload into the buffer.
516 size_t bytes_written = 0;
517 int encrypt_status = frame_encryptor_->Encrypt(
518 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
Niels Möller7d76a312018-10-26 12:57:07 +0200519 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
520 &bytes_written);
Benjamin Wright84583f62018-10-04 14:22:34 -0700521 if (encrypt_status != 0) {
522 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed encrypt audio payload: "
523 << encrypt_status;
524 return -1;
525 }
526 // Resize the buffer to the exact number of bytes actually used.
527 encrypted_audio_payload.SetSize(bytes_written);
528 // Rewrite the payloadData and size to the new encrypted payload.
Niels Möller7d76a312018-10-26 12:57:07 +0200529 payload = encrypted_audio_payload;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700530 } else if (crypto_options_.sframe.require_frame_encryption) {
531 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
532 << "A frame encryptor is required but one is not set.";
533 return -1;
Benjamin Wright84583f62018-10-04 14:22:34 -0700534 }
535
Niels Möller530ead42018-10-04 14:28:39 +0200536 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
537 // packetization.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100538 if (!_rtpRtcpModule->OnSendingRtpFrame(timeStamp,
539 // Leaving the time when this frame was
540 // received from the capture device as
541 // undefined for voice for now.
542 -1, payloadType,
543 /*force_sender_report=*/false)) {
544 return false;
545 }
546
547 // RTCPSender has it's own copy of the timestamp offset, added in
548 // RTCPSender::BuildSR, hence we must not add the in the offset for the above
549 // call.
550 // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
551 // knowledge of the offset to a single place.
552 const uint32_t rtp_timestamp = timeStamp + _rtpRtcpModule->StartTimestamp();
Niels Möller530ead42018-10-04 14:28:39 +0200553 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100554 if (!rtp_sender_audio_->SendAudio(frameType, payloadType, rtp_timestamp,
555 payload.data(), payload.size())) {
Niels Möller530ead42018-10-04 14:28:39 +0200556 RTC_DLOG(LS_ERROR)
557 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
558 return -1;
559 }
560
561 return 0;
562}
563
Niels Möller7d76a312018-10-26 12:57:07 +0200564int32_t ChannelSend::SendMediaTransportAudio(
Niels Möller87e2d782019-03-07 10:18:23 +0100565 AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200566 uint8_t payloadType,
567 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200568 rtc::ArrayView<const uint8_t> payload) {
Niels Möller7d76a312018-10-26 12:57:07 +0200569 // TODO(nisse): Use null _transportPtr for MediaTransport.
570 // RTC_DCHECK(_transportPtr == nullptr);
571 uint64_t channel_id;
572 int sampling_rate_hz;
573 {
574 rtc::CritScope cs(&media_transport_lock_);
575 if (media_transport_payload_type_ != payloadType) {
576 // Payload type is being changed, media_transport_sampling_frequency_,
577 // no longer current.
578 return -1;
579 }
580 sampling_rate_hz = media_transport_sampling_frequency_;
581 channel_id = media_transport_channel_id_;
582 }
Mirko Bonadei1c546052019-02-04 14:50:38 +0100583 MediaTransportEncodedAudioFrame frame(
Niels Möller7d76a312018-10-26 12:57:07 +0200584 /*sampling_rate_hz=*/sampling_rate_hz,
585
586 // TODO(nisse): Timestamp and sample index are the same for all supported
587 // audio codecs except G722. Refactor audio coding module to only use
588 // sample index, and leave translation to RTP time, when needed, for
589 // RTP-specific code.
590 /*starting_sample_index=*/timeStamp,
591
592 // Sample count isn't conveniently available from the AudioCodingModule,
593 // and needs some refactoring to wire up in a good way. For now, left as
594 // zero.
Benjamin Wright17b050f2019-03-13 17:35:46 -0700595 /*samples_per_channel=*/0,
Niels Möller7d76a312018-10-26 12:57:07 +0200596
597 /*sequence_number=*/media_transport_sequence_number_,
598 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
599 std::vector<uint8_t>(payload.begin(), payload.end()));
600
601 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
602 // channel id.
603 RTCError rtc_error =
604 media_transport()->SendAudioFrame(channel_id, std::move(frame));
605
606 if (!rtc_error.ok()) {
607 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
608 << ToString(rtc_error.type()) << ", "
609 << rtc_error.message();
610 return -1;
611 }
612
613 ++media_transport_sequence_number_;
614
615 return 0;
616}
617
Sebastian Jansson977b3352019-03-04 17:43:34 +0100618ChannelSend::ChannelSend(Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100619 TaskQueueFactory* task_queue_factory,
Niels Möller530ead42018-10-04 14:28:39 +0200620 ProcessThread* module_process_thread,
Niels Möller7d76a312018-10-26 12:57:07 +0200621 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -0800622 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +0100623 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200624 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700625 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700626 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100627 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800628 bool extmap_allow_mixed,
629 int rtcp_report_interval_ms)
Niels Möller530ead42018-10-04 14:28:39 +0200630 : event_log_(rtc_event_log),
631 _timeStamp(0), // This is just an offset, RTP module will add it's own
632 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200633 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200634 input_mute_(false),
635 previous_frame_muted_(false),
636 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200637 rtcp_observer_(new VoERtcpObserver(this)),
638 feedback_observer_proxy_(new TransportFeedbackProxy()),
639 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
640 rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
Sebastian Jansson977b3352019-03-04 17:43:34 +0100641 retransmission_rate_limiter_(
642 new RateLimiter(clock, kMaxRetransmissionWindowMs)),
Niels Möller530ead42018-10-04 14:28:39 +0200643 use_twcc_plr_for_ana_(
644 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Niels Möller7d76a312018-10-26 12:57:07 +0200645 media_transport_(media_transport),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700646 frame_encryptor_(frame_encryptor),
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100647 crypto_options_(crypto_options),
648 encoder_queue_(task_queue_factory->CreateTaskQueue(
649 "AudioEncoder",
650 TaskQueueFactory::Priority::NORMAL)) {
Niels Möller530ead42018-10-04 14:28:39 +0200651 RTC_DCHECK(module_process_thread);
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200652 module_process_thread_checker_.Detach();
Niels Möllerdced9f62018-11-19 10:27:07 +0100653
Niels Möller530ead42018-10-04 14:28:39 +0200654 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
655
656 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800657
658 // We gradually remove codepaths that depend on RTP when using media
659 // transport. All of this logic should be moved to the future
660 // RTPMediaTransport. In this case it means that overhead and bandwidth
661 // observers should not be called when using media transport.
662 if (!media_transport_) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800663 configuration.overhead_observer = overhead_observer;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800664 configuration.bandwidth_callback = rtcp_observer_.get();
665 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
666 }
667
Sebastian Jansson977b3352019-03-04 17:43:34 +0100668 configuration.clock = clock;
Niels Möller530ead42018-10-04 14:28:39 +0200669 configuration.audio = true;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100670 configuration.clock = Clock::GetRealTimeClock();
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100671 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200672
673 configuration.paced_sender = rtp_packet_sender_proxy_.get();
674 configuration.transport_sequence_number_allocator =
675 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200676
677 configuration.event_log = event_log_;
678 configuration.rtt_stats = rtcp_rtt_stats;
679 configuration.retransmission_rate_limiter =
680 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100681 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800682 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200683
Danil Chapovalovc44f6cc2019-03-06 11:31:09 +0100684 _rtpRtcpModule = RtpRtcp::Create(configuration);
Niels Möller530ead42018-10-04 14:28:39 +0200685 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200686
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100687 rtp_sender_audio_ = absl::make_unique<RTPSenderAudio>(
688 configuration.clock, _rtpRtcpModule->RtpSender());
689
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800690 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
691 // callbacks after the audio_coding_ is fully initialized.
692 if (media_transport_) {
693 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
694 media_transport_->AddTargetTransferRateObserver(this);
Niels Möllerd5af4022019-03-05 08:56:48 +0100695 media_transport_->SetAudioOverheadObserver(overhead_observer);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800696 } else {
697 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
698 }
699
Niels Möller530ead42018-10-04 14:28:39 +0200700 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
701
Niels Möller530ead42018-10-04 14:28:39 +0200702 // Ensure that RTCP is enabled by default for the created channel.
703 // Note that, the module will keep generating RTCP until it is explicitly
704 // disabled by the user.
705 // After StopListen (when no sockets exists), RTCP packets will no longer
706 // be transmitted since the Transport object will then be invalid.
707 // RTCP is enabled by default.
708 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
709
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100710 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200711 RTC_DCHECK_EQ(0, error);
712}
713
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100714ChannelSend::~ChannelSend() {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200715 RTC_DCHECK(construction_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200716
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800717 if (media_transport_) {
718 media_transport_->RemoveTargetTransferRateObserver(this);
Niels Möllerd5af4022019-03-05 08:56:48 +0100719 media_transport_->SetAudioOverheadObserver(nullptr);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800720 }
721
Niels Möller530ead42018-10-04 14:28:39 +0200722 StopSend();
Niels Möller530ead42018-10-04 14:28:39 +0200723 int error = audio_coding_->RegisterTransportCallback(NULL);
724 RTC_DCHECK_EQ(0, error);
725
Niels Möller530ead42018-10-04 14:28:39 +0200726 if (_moduleProcessThreadPtr)
727 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200728}
729
Niels Möller26815232018-11-16 09:32:40 +0100730void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100731 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100732 RTC_DCHECK(!sending_);
733 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200734
Niels Möller530ead42018-10-04 14:28:39 +0200735 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100736 int ret = _rtpRtcpModule->SetSendingStatus(true);
737 RTC_DCHECK_EQ(0, ret);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100738 // It is now OK to start processing on the encoder task queue.
739 encoder_queue_.PostTask([this] {
740 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200741 encoder_queue_is_active_ = true;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100742 });
Niels Möller530ead42018-10-04 14:28:39 +0200743}
744
745void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100746 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100747 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200748 return;
749 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100750 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200751
Niels Möllerc572ff32018-11-07 08:43:50 +0100752 rtc::Event flush;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100753 encoder_queue_.PostTask([this, &flush]() {
754 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200755 encoder_queue_is_active_ = false;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100756 flush.Set();
757 });
Niels Möller530ead42018-10-04 14:28:39 +0200758 flush.Wait(rtc::Event::kForever);
759
Niels Möller530ead42018-10-04 14:28:39 +0200760 // Reset sending SSRC and sequence number and triggers direct transmission
761 // of RTCP BYE
762 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
763 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
764 }
765 _rtpRtcpModule->SetSendingMediaStatus(false);
766}
767
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100768void ChannelSend::SetEncoder(int payload_type,
Niels Möller530ead42018-10-04 14:28:39 +0200769 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100770 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200771 RTC_DCHECK_GE(payload_type, 0);
772 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200773
774 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
775 // as well as some other things, so we collect this info and send it along.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100776 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type,
777 encoder->RtpTimestampRateHz());
778 rtp_sender_audio_->RegisterAudioPayload("audio", payload_type,
779 encoder->RtpTimestampRateHz(),
780 encoder->NumChannels(), 0);
Niels Möller530ead42018-10-04 14:28:39 +0200781
Niels Möller7d76a312018-10-26 12:57:07 +0200782 if (media_transport_) {
783 rtc::CritScope cs(&media_transport_lock_);
784 media_transport_payload_type_ = payload_type;
785 // TODO(nisse): Currently broken for G722, since timestamps passed through
786 // encoder use RTP clock rather than sample count, and they differ for G722.
787 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
788 }
Niels Möller530ead42018-10-04 14:28:39 +0200789 audio_coding_->SetEncoder(std::move(encoder));
Niels Möller530ead42018-10-04 14:28:39 +0200790}
791
792void ChannelSend::ModifyEncoder(
793 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800794 // This method can be called on the worker thread, module process thread
795 // or network thread. Audio coding is thread safe, so we do not need to
796 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200797 audio_coding_->ModifyEncoder(modifier);
798}
799
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100800void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
801 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
802 if (*encoder_ptr) {
803 modifier(encoder_ptr->get());
804 } else {
805 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
806 }
807 });
808}
809
Sebastian Jansson254d8692018-11-21 19:19:00 +0100810void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100811 // This method can be called on the worker thread, module process thread
812 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
813 // TODO(solenberg): Figure out a good way to check this or enforce calling
814 // rules.
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200815 // RTC_DCHECK(worker_thread_checker_.IsCurrent() ||
816 // module_process_thread_checker_.IsCurrent());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800817 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100818
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100819 CallEncoder([&](AudioEncoder* encoder) {
820 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200821 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100822 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
823 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200824}
825
Niels Möllerdced9f62018-11-19 10:27:07 +0100826int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800827 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200828 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200829}
830
831void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100832 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200833 if (!use_twcc_plr_for_ana_)
834 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100835 CallEncoder([&](AudioEncoder* encoder) {
836 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200837 });
838}
839
840void ChannelSend::OnRecoverableUplinkPacketLossRate(
841 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100842 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100843 CallEncoder([&](AudioEncoder* encoder) {
844 encoder->OnReceivedUplinkRecoverablePacketLossFraction(
845 recoverable_packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200846 });
847}
848
849void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
850 if (use_twcc_plr_for_ana_)
851 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100852 CallEncoder([&](AudioEncoder* encoder) {
853 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200854 });
855}
856
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100857void ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100858 // May be called on either worker thread or network thread.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800859 if (media_transport_) {
860 // Ignore RTCP packets while media transport is used.
861 // Those packets should not arrive, but we are seeing occasional packets.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100862 return;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800863 }
864
Niels Möller530ead42018-10-04 14:28:39 +0200865 // Deliver RTCP packet to RTP/RTCP module for parsing
866 _rtpRtcpModule->IncomingRtcpPacket(data, length);
867
868 int64_t rtt = GetRTT();
869 if (rtt == 0) {
870 // Waiting for valid RTT.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100871 return;
Niels Möller530ead42018-10-04 14:28:39 +0200872 }
873
874 int64_t nack_window_ms = rtt;
875 if (nack_window_ms < kMinRetransmissionWindowMs) {
876 nack_window_ms = kMinRetransmissionWindowMs;
877 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
878 nack_window_ms = kMaxRetransmissionWindowMs;
879 }
880 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
881
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800882 OnReceivedRtt(rtt);
Niels Möller530ead42018-10-04 14:28:39 +0200883}
884
885void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100886 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200887 rtc::CritScope cs(&volume_settings_critsect_);
888 input_mute_ = enable;
889}
890
891bool ChannelSend::InputMute() const {
892 rtc::CritScope cs(&volume_settings_critsect_);
893 return input_mute_;
894}
895
Niels Möller26815232018-11-16 09:32:40 +0100896bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100897 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200898 RTC_DCHECK_LE(0, event);
899 RTC_DCHECK_GE(255, event);
900 RTC_DCHECK_LE(0, duration_ms);
901 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100902 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100903 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200904 }
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100905 if (rtp_sender_audio_->SendTelephoneEvent(
Niels Möller530ead42018-10-04 14:28:39 +0200906 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100907 RTC_DLOG(LS_ERROR) << "SendTelephoneEvent() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100908 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200909 }
Niels Möller26815232018-11-16 09:32:40 +0100910 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200911}
912
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100913void ChannelSend::RegisterCngPayloadType(int payload_type,
914 int payload_frequency) {
915 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
916 rtp_sender_audio_->RegisterAudioPayload("CN", payload_type, payload_frequency,
917 1, 0);
918}
919
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100920void ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
Niels Möller26815232018-11-16 09:32:40 +0100921 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100922 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200923 RTC_DCHECK_LE(0, payload_type);
924 RTC_DCHECK_GE(127, payload_type);
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100925 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
926 rtp_sender_audio_->RegisterAudioPayload("telephone-event", payload_type,
927 payload_frequency, 0, 0);
Niels Möller530ead42018-10-04 14:28:39 +0200928}
929
Niels Möllerdced9f62018-11-19 10:27:07 +0100930void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100931 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100932 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100933
Niels Möller7d76a312018-10-26 12:57:07 +0200934 if (media_transport_) {
935 rtc::CritScope cs(&media_transport_lock_);
936 media_transport_channel_id_ = ssrc;
937 }
Niels Möller530ead42018-10-04 14:28:39 +0200938 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200939}
940
Amit Hilbuch77938e62018-12-21 09:23:38 -0800941void ChannelSend::SetRid(const std::string& rid,
942 int extension_id,
943 int repaired_extension_id) {
944 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
945 if (extension_id != 0) {
946 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
947 extension_id);
948 RTC_DCHECK_EQ(0, ret);
949 }
950 if (repaired_extension_id != 0) {
951 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
952 repaired_extension_id);
953 RTC_DCHECK_EQ(0, ret);
954 }
955 _rtpRtcpModule->SetRid(rid);
956}
957
Niels Möller530ead42018-10-04 14:28:39 +0200958void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100959 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200960 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
961 RTC_DCHECK_EQ(0, ret);
962 _rtpRtcpModule->SetMid(mid);
963}
964
Johannes Kron9190b822018-10-29 11:22:05 +0100965void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +0100966 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +0100967 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
968}
969
Niels Möller26815232018-11-16 09:32:40 +0100970void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100971 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200972 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +0100973 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
974 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200975}
976
977void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100978 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200979 int ret =
980 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
981 RTC_DCHECK_EQ(0, ret);
982}
983
984void ChannelSend::RegisterSenderCongestionControlObjects(
985 RtpTransportControllerSendInterface* transport,
986 RtcpBandwidthObserver* bandwidth_observer) {
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 RtpPacketSender* rtp_packet_sender = transport->packet_sender();
989 TransportFeedbackObserver* transport_feedback_observer =
990 transport->transport_feedback_observer();
991 PacketRouter* packet_router = transport->packet_router();
992
993 RTC_DCHECK(rtp_packet_sender);
994 RTC_DCHECK(transport_feedback_observer);
995 RTC_DCHECK(packet_router);
996 RTC_DCHECK(!packet_router_);
997 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
998 feedback_observer_proxy_->SetTransportFeedbackObserver(
999 transport_feedback_observer);
1000 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
1001 rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
1002 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
1003 constexpr bool remb_candidate = false;
1004 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
1005 packet_router_ = packet_router;
1006}
1007
1008void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001009 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001010 RTC_DCHECK(packet_router_);
1011 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1012 rtcp_observer_->SetBandwidthObserver(nullptr);
1013 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1014 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1015 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1016 packet_router_ = nullptr;
1017 rtp_packet_sender_proxy_->SetPacketSender(nullptr);
1018}
1019
Niels Möller26815232018-11-16 09:32:40 +01001020void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001021 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001022 // Note: SetCNAME() accepts a c string of length at most 255.
1023 const std::string c_name_limited(c_name.substr(0, 255));
1024 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1025 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001026}
1027
Niels Möller26815232018-11-16 09:32:40 +01001028std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001029 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001030 // Get the report blocks from the latest received RTCP Sender or Receiver
1031 // Report. Each element in the vector contains the sender's SSRC and a
1032 // report block according to RFC 3550.
1033 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001034
Niels Möller26815232018-11-16 09:32:40 +01001035 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1036 RTC_DCHECK_EQ(0, ret);
1037
1038 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001039
1040 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1041 for (; it != rtcp_report_blocks.end(); ++it) {
1042 ReportBlock report_block;
1043 report_block.sender_SSRC = it->sender_ssrc;
1044 report_block.source_SSRC = it->source_ssrc;
1045 report_block.fraction_lost = it->fraction_lost;
1046 report_block.cumulative_num_packets_lost = it->packets_lost;
1047 report_block.extended_highest_sequence_number =
1048 it->extended_highest_sequence_number;
1049 report_block.interarrival_jitter = it->jitter;
1050 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1051 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001052 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001053 }
Niels Möller26815232018-11-16 09:32:40 +01001054 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001055}
1056
Niels Möller26815232018-11-16 09:32:40 +01001057CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001058 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001059 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001060 stats.rttMs = GetRTT();
1061
Henrik Boströmcf96e0f2019-04-17 13:51:53 +02001062 StreamDataCounters rtp_stats;
1063 StreamDataCounters rtx_stats;
1064 _rtpRtcpModule->GetSendStreamDataCounters(&rtp_stats, &rtx_stats);
1065 // TODO(https://crbug.com/webrtc/10525): Bytes sent should only include
1066 // payload bytes, not header and padding bytes.
1067 stats.bytesSent =
1068 rtp_stats.transmitted.payload_bytes +
1069 rtp_stats.transmitted.padding_bytes + rtp_stats.transmitted.header_bytes +
1070 rtx_stats.transmitted.payload_bytes +
1071 rtx_stats.transmitted.padding_bytes + rtx_stats.transmitted.header_bytes;
1072 // TODO(https://crbug.com/webrtc/10555): RTX retransmissions should show up in
1073 // separate outbound-rtp stream objects.
1074 stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
1075 stats.packetsSent =
1076 rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
1077 stats.retransmitted_packets_sent = rtp_stats.retransmitted.packets;
Niels Möller530ead42018-10-04 14:28:39 +02001078
Niels Möller26815232018-11-16 09:32:40 +01001079 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001080}
1081
Niels Möller530ead42018-10-04 14:28:39 +02001082void ChannelSend::ProcessAndEncodeAudio(
1083 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001084 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001085 struct ProcessAndEncodeAudio {
1086 void operator()() {
1087 RTC_DCHECK_RUN_ON(&channel->encoder_queue_);
1088 if (!channel->encoder_queue_is_active_) {
1089 return;
1090 }
1091 channel->ProcessAndEncodeAudioOnTaskQueue(audio_frame.get());
1092 }
1093 std::unique_ptr<AudioFrame> audio_frame;
1094 ChannelSend* const channel;
1095 };
Niels Möller530ead42018-10-04 14:28:39 +02001096 // Profile time between when the audio frame is added to the task queue and
1097 // when the task is actually executed.
1098 audio_frame->UpdateProfileTimeStamp();
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001099 encoder_queue_.PostTask(ProcessAndEncodeAudio{std::move(audio_frame), this});
Niels Möller530ead42018-10-04 14:28:39 +02001100}
1101
1102void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
Niels Möller530ead42018-10-04 14:28:39 +02001103 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
1104 RTC_DCHECK_LE(audio_input->num_channels_, 2);
1105
1106 // Measure time between when the audio frame is added to the task queue and
1107 // when the task is actually executed. Goal is to keep track of unwanted
1108 // extra latency added by the task queue.
1109 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1110 audio_input->ElapsedProfileTimeMs());
1111
1112 bool is_muted = InputMute();
1113 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1114
1115 if (_includeAudioLevelIndication) {
1116 size_t length =
1117 audio_input->samples_per_channel_ * audio_input->num_channels_;
1118 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1119 if (is_muted && previous_frame_muted_) {
1120 rms_level_.AnalyzeMuted(length);
1121 } else {
1122 rms_level_.Analyze(
1123 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1124 }
1125 }
1126 previous_frame_muted_ = is_muted;
1127
1128 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1129
1130 // The ACM resamples internally.
1131 audio_input->timestamp_ = _timeStamp;
1132 // This call will trigger AudioPacketizationCallback::SendData if encoding
1133 // is done and payload is ready for packetization and transmission.
1134 // Otherwise, it will return without invoking the callback.
1135 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1136 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1137 return;
1138 }
1139
1140 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1141}
1142
Niels Möller530ead42018-10-04 14:28:39 +02001143ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001144 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001145 return audio_coding_->GetANAStats();
1146}
1147
1148RtpRtcp* ChannelSend::GetRtpRtcp() const {
Sebastian Janssonc01367d2019-04-08 15:20:44 +02001149 RTC_DCHECK(module_process_thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +02001150 return _rtpRtcpModule.get();
1151}
1152
1153int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1154 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001155 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001156 int error = 0;
1157 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1158 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001159 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1160 // argument. Currently it wants an uint8_t.
1161 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1162 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001163 }
1164 return error;
1165}
1166
Niels Möller530ead42018-10-04 14:28:39 +02001167int64_t ChannelSend::GetRTT() const {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001168 if (media_transport_) {
1169 // GetRTT is generally used in the RTCP codepath, where media transport is
1170 // not present and so it shouldn't be needed. But it's also invoked in
1171 // 'GetStats' method, and for now returning media transport RTT here gives
1172 // us "free" rtt stats for media transport.
1173 auto target_rate = media_transport_->GetLatestTargetTransferRate();
1174 if (target_rate.has_value()) {
1175 return target_rate.value().network_estimate.round_trip_time.ms();
1176 }
1177
1178 return 0;
1179 }
Niels Möller530ead42018-10-04 14:28:39 +02001180 RtcpMode method = _rtpRtcpModule->RTCP();
1181 if (method == RtcpMode::kOff) {
1182 return 0;
1183 }
1184 std::vector<RTCPReportBlock> report_blocks;
1185 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1186
1187 if (report_blocks.empty()) {
1188 return 0;
1189 }
1190
1191 int64_t rtt = 0;
1192 int64_t avg_rtt = 0;
1193 int64_t max_rtt = 0;
1194 int64_t min_rtt = 0;
1195 // We don't know in advance the remote ssrc used by the other end's receiver
1196 // reports, so use the SSRC of the first report block for calculating the RTT.
1197 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1198 &min_rtt, &max_rtt) != 0) {
1199 return 0;
1200 }
1201 return rtt;
1202}
1203
Benjamin Wright78410ad2018-10-25 09:52:57 -07001204void ChannelSend::SetFrameEncryptor(
1205 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001206 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001207 encoder_queue_.PostTask([this, frame_encryptor]() mutable {
1208 RTC_DCHECK_RUN_ON(&encoder_queue_);
Sebastian Jansson7949f212019-03-05 13:41:48 +00001209 frame_encryptor_ = std::move(frame_encryptor);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001210 });
Benjamin Wright84583f62018-10-04 14:22:34 -07001211}
1212
Anton Sukhanov626015d2019-02-04 15:16:06 -08001213// TODO(sukhanov): Consider moving TargetTransferRate observer to
1214// AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
1215// makes sense to consolidate all rate (and overhead) calculation there.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001216void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
1217 RTC_DCHECK(media_transport_);
1218 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1219}
1220
1221void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1222 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +01001223 CallEncoder(
1224 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001225}
1226
Niels Möllerdced9f62018-11-19 10:27:07 +01001227} // namespace
1228
1229std::unique_ptr<ChannelSendInterface> CreateChannelSend(
Sebastian Jansson977b3352019-03-04 17:43:34 +01001230 Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001231 TaskQueueFactory* task_queue_factory,
Niels Möllerdced9f62018-11-19 10:27:07 +01001232 ProcessThread* module_process_thread,
1233 MediaTransportInterface* media_transport,
Anton Sukhanov626015d2019-02-04 15:16:06 -08001234 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +01001235 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001236 RtcpRttStats* rtcp_rtt_stats,
1237 RtcEventLog* rtc_event_log,
1238 FrameEncryptorInterface* frame_encryptor,
1239 const webrtc::CryptoOptions& crypto_options,
1240 bool extmap_allow_mixed,
1241 int rtcp_report_interval_ms) {
1242 return absl::make_unique<ChannelSend>(
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001243 clock, task_queue_factory, module_process_thread, media_transport,
Sebastian Jansson977b3352019-03-04 17:43:34 +01001244 overhead_observer, rtp_transport, rtcp_rtt_stats, rtc_event_log,
1245 frame_encryptor, crypto_options, extmap_allow_mixed,
1246 rtcp_report_interval_ms);
Niels Möllerdced9f62018-11-19 10:27:07 +01001247}
1248
Niels Möller530ead42018-10-04 14:28:39 +02001249} // namespace voe
1250} // namespace webrtc