blob: 447dabe7617077514d88b93ba4a469e513d4d368 [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,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070092 const MediaTransportConfig& media_transport_config,
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,
Erik Språng4c2c4122019-07-11 15:20:15 +0200100 int rtcp_report_interval_ms,
101 uint32_t ssrc);
Niels Möllerdced9f62018-11-19 10:27:07 +0100102
103 ~ChannelSend() override;
104
105 // Send using this encoder, with this payload type.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100106 void SetEncoder(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100107 std::unique_ptr<AudioEncoder> encoder) override;
108 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
109 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100110 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100111
112 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +0100113 void StartSend() override;
114 void StopSend() override;
115
116 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +0100117 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100118 int GetBitrate() const override;
119
120 // Network
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100121 void ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100122
123 // Muting, Volume and Level.
124 void SetInputMute(bool enable) override;
125
126 // Stats.
127 ANAStats GetANAStatistics() const override;
128
129 // Used by AudioSendStream.
130 RtpRtcp* GetRtpRtcp() const override;
131
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100132 void RegisterCngPayloadType(int payload_type, int payload_frequency) override;
133
Niels Möllerdced9f62018-11-19 10:27:07 +0100134 // DTMF.
135 bool SendTelephoneEventOutband(int event, int duration_ms) override;
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100136 void SetSendTelephoneEventPayloadType(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100137 int payload_frequency) override;
138
139 // RTP+RTCP
140 void SetLocalSSRC(uint32_t ssrc) override;
Amit Hilbuch77938e62018-12-21 09:23:38 -0800141 void SetRid(const std::string& rid,
142 int extension_id,
143 int repaired_extension_id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100144 void SetMid(const std::string& mid, int extension_id) override;
145 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
146 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
147 void EnableSendTransportSequenceNumber(int id) override;
148
149 void RegisterSenderCongestionControlObjects(
150 RtpTransportControllerSendInterface* transport,
151 RtcpBandwidthObserver* bandwidth_observer) override;
152 void ResetSenderCongestionControlObjects() override;
153 void SetRTCP_CNAME(absl::string_view c_name) override;
154 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
155 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100156
157 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
158 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
159 // the actual processing of the audio takes place. The processing mainly
160 // consists of encoding and preparing the result for sending by adding it to a
161 // send queue.
162 // The main reason for using a task queue here is to release the native,
163 // OS-specific, audio capture thread as soon as possible to ensure that it
164 // can go back to sleep and be prepared to deliver an new captured audio
165 // packet.
166 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
167
Niels Möllerdced9f62018-11-19 10:27:07 +0100168 // The existence of this function alongside OnUplinkPacketLossRate is
169 // a compromise. We want the encoder to be agnostic of the PLR source, but
170 // we also don't want it to receive conflicting information from TWCC and
171 // from RTCP-XR.
172 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
173
174 void OnRecoverableUplinkPacketLossRate(
175 float recoverable_packet_loss_rate) override;
176
177 int64_t GetRTT() const override;
178
179 // E2EE Custom Audio Frame Encryption
180 void SetFrameEncryptor(
181 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
182
183 private:
Niels Möllerdced9f62018-11-19 10:27:07 +0100184 // From AudioPacketizationCallback in the ACM
Niels Möller87e2d782019-03-07 10:18:23 +0100185 int32_t SendData(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100186 uint8_t payloadType,
187 uint32_t timeStamp,
188 const uint8_t* payloadData,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200189 size_t payloadSize) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100190
Niels Möllerdced9f62018-11-19 10:27:07 +0100191 void OnUplinkPacketLossRate(float packet_loss_rate);
192 bool InputMute() const;
193
Niels Möllerdced9f62018-11-19 10:27:07 +0100194 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, int id);
195
Niels Möller87e2d782019-03-07 10:18:23 +0100196 int32_t SendRtpAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100197 uint8_t payloadType,
198 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200199 rtc::ArrayView<const uint8_t> payload)
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100200 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100201
Niels Möller87e2d782019-03-07 10:18:23 +0100202 int32_t SendMediaTransportAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100203 uint8_t payloadType,
204 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200205 rtc::ArrayView<const uint8_t> payload)
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100206 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100207
208 // Return media transport or nullptr if using RTP.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700209 MediaTransportInterface* media_transport() {
210 return media_transport_config_.media_transport;
211 }
Niels Möllerdced9f62018-11-19 10:27:07 +0100212
213 // Called on the encoder task queue when a new input audio frame is ready
214 // for encoding.
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100215 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input)
216 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100217
218 void OnReceivedRtt(int64_t rtt_ms);
219
220 void OnTargetTransferRate(TargetTransferRate) override;
221
222 // Thread checkers document and lock usage of some methods on voe::Channel to
223 // specific threads we know about. The goal is to eventually split up
224 // voe::Channel into parts with single-threaded semantics, and thereby reduce
225 // the need for locks.
226 rtc::ThreadChecker worker_thread_checker_;
227 rtc::ThreadChecker module_process_thread_checker_;
228 // Methods accessed from audio and video threads are checked for sequential-
229 // only access. We don't necessarily own and control these threads, so thread
230 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
231 // audio thread to another, but access is still sequential.
232 rtc::RaceChecker audio_thread_race_checker_;
233
Niels Möllerdced9f62018-11-19 10:27:07 +0100234 rtc::CriticalSection volume_settings_critsect_;
235
Niels Möller26e88b02018-11-19 15:08:13 +0100236 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100237
238 RtcEventLog* const event_log_;
239
240 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100241 std::unique_ptr<RTPSenderAudio> rtp_sender_audio_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100242
243 std::unique_ptr<AudioCodingModule> audio_coding_;
244 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
245
Niels Möllerdced9f62018-11-19 10:27:07 +0100246 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100247 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100248 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
249 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
250 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
251 // VoeRTP_RTCP
252 // TODO(henrika): can today be accessed on the main thread and on the
253 // task queue; hence potential race.
254 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800255
Niels Möllerdced9f62018-11-19 10:27:07 +0100256 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100257 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100258
Niels Möller985a1f32018-11-19 16:08:42 +0100259 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
260 nullptr;
261 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
262 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
Erik Språng59b86542019-06-23 18:24:46 +0200263 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_pacer_proxy_;
Niels Möller985a1f32018-11-19 16:08:42 +0100264 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100265
266 rtc::ThreadChecker construction_thread_;
267
268 const bool use_twcc_plr_for_ana_;
269
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100270 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100271
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700272 MediaTransportConfig media_transport_config_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100273 int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
274
275 rtc::CriticalSection media_transport_lock_;
276 // Currently set by SetLocalSSRC.
277 uint64_t media_transport_channel_id_ RTC_GUARDED_BY(&media_transport_lock_) =
278 0;
279 // Cache payload type and sampling frequency from most recent call to
280 // SetEncoder. Needed to set MediaTransportEncodedAudioFrame metadata, and
281 // invalidate on encoder change.
282 int media_transport_payload_type_ RTC_GUARDED_BY(&media_transport_lock_);
283 int media_transport_sampling_frequency_
284 RTC_GUARDED_BY(&media_transport_lock_);
285
286 // E2EE Audio Frame Encryption
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100287 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_
288 RTC_GUARDED_BY(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100289 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100290 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100291
292 rtc::CriticalSection bitrate_crit_section_;
293 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100294
295 // Defined last to ensure that there are no running tasks when the other
296 // members are destroyed.
297 rtc::TaskQueue encoder_queue_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100298};
Niels Möller530ead42018-10-04 14:28:39 +0200299
300const int kTelephoneEventAttenuationdB = 10;
301
302class TransportFeedbackProxy : public TransportFeedbackObserver {
303 public:
304 TransportFeedbackProxy() : feedback_observer_(nullptr) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200305 pacer_thread_.Detach();
306 network_thread_.Detach();
Niels Möller530ead42018-10-04 14:28:39 +0200307 }
308
309 void SetTransportFeedbackObserver(
310 TransportFeedbackObserver* feedback_observer) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200311 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200312 rtc::CritScope lock(&crit_);
313 feedback_observer_ = feedback_observer;
314 }
315
316 // Implements TransportFeedbackObserver.
Erik Språng30a276b2019-04-23 12:00:11 +0200317 void OnAddPacket(const RtpPacketSendInfo& packet_info) override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200318 RTC_DCHECK(pacer_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200319 rtc::CritScope lock(&crit_);
320 if (feedback_observer_)
Erik Språng30a276b2019-04-23 12:00:11 +0200321 feedback_observer_->OnAddPacket(packet_info);
Niels Möller530ead42018-10-04 14:28:39 +0200322 }
323
324 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200325 RTC_DCHECK(network_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200326 rtc::CritScope lock(&crit_);
327 if (feedback_observer_)
328 feedback_observer_->OnTransportFeedback(feedback);
329 }
330
331 private:
332 rtc::CriticalSection crit_;
333 rtc::ThreadChecker thread_checker_;
334 rtc::ThreadChecker pacer_thread_;
335 rtc::ThreadChecker network_thread_;
336 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
337};
338
339class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
340 public:
341 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200342 pacer_thread_.Detach();
Niels Möller530ead42018-10-04 14:28:39 +0200343 }
344
345 void SetSequenceNumberAllocator(
346 TransportSequenceNumberAllocator* seq_num_allocator) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200347 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200348 rtc::CritScope lock(&crit_);
349 seq_num_allocator_ = seq_num_allocator;
350 }
351
352 // Implements TransportSequenceNumberAllocator.
353 uint16_t AllocateSequenceNumber() override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200354 RTC_DCHECK(pacer_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200355 rtc::CritScope lock(&crit_);
356 if (!seq_num_allocator_)
357 return 0;
358 return seq_num_allocator_->AllocateSequenceNumber();
359 }
360
361 private:
362 rtc::CriticalSection crit_;
363 rtc::ThreadChecker thread_checker_;
364 rtc::ThreadChecker pacer_thread_;
365 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
366};
367
Erik Språng59b86542019-06-23 18:24:46 +0200368class RtpPacketSenderProxy : public RtpPacketPacer {
Niels Möller530ead42018-10-04 14:28:39 +0200369 public:
Erik Språng59b86542019-06-23 18:24:46 +0200370 RtpPacketSenderProxy() : rtp_packet_pacer_(nullptr) {}
Niels Möller530ead42018-10-04 14:28:39 +0200371
Erik Språng59b86542019-06-23 18:24:46 +0200372 void SetPacketPacer(RtpPacketPacer* rtp_packet_pacer) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200373 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200374 rtc::CritScope lock(&crit_);
Erik Språng59b86542019-06-23 18:24:46 +0200375 rtp_packet_pacer_ = rtp_packet_pacer;
376 }
377
378 void EnqueuePacket(std::unique_ptr<RtpPacketToSend> packet) override {
379 rtc::CritScope lock(&crit_);
380 rtp_packet_pacer_->EnqueuePacket(std::move(packet));
Niels Möller530ead42018-10-04 14:28:39 +0200381 }
382
383 // Implements RtpPacketSender.
384 void InsertPacket(Priority priority,
385 uint32_t ssrc,
386 uint16_t sequence_number,
387 int64_t capture_time_ms,
388 size_t bytes,
389 bool retransmission) override {
390 rtc::CritScope lock(&crit_);
Erik Språng59b86542019-06-23 18:24:46 +0200391 if (rtp_packet_pacer_) {
392 rtp_packet_pacer_->InsertPacket(priority, ssrc, sequence_number,
393 capture_time_ms, bytes, retransmission);
Niels Möller530ead42018-10-04 14:28:39 +0200394 }
395 }
396
397 void SetAccountForAudioPackets(bool account_for_audio) override {
398 RTC_NOTREACHED();
399 }
400
401 private:
402 rtc::ThreadChecker thread_checker_;
403 rtc::CriticalSection crit_;
Erik Språng59b86542019-06-23 18:24:46 +0200404 RtpPacketPacer* rtp_packet_pacer_ RTC_GUARDED_BY(&crit_);
Niels Möller530ead42018-10-04 14:28:39 +0200405};
406
407class VoERtcpObserver : public RtcpBandwidthObserver {
408 public:
409 explicit VoERtcpObserver(ChannelSend* owner)
410 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100411 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200412
413 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
414 rtc::CritScope lock(&crit_);
415 bandwidth_observer_ = bandwidth_observer;
416 }
417
418 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
419 rtc::CritScope lock(&crit_);
420 if (bandwidth_observer_) {
421 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
422 }
423 }
424
425 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
426 int64_t rtt,
427 int64_t now_ms) override {
428 {
429 rtc::CritScope lock(&crit_);
430 if (bandwidth_observer_) {
431 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
432 now_ms);
433 }
434 }
435 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
436 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
437 // report for VoiceEngine?
438 if (report_blocks.empty())
439 return;
440
441 int fraction_lost_aggregate = 0;
442 int total_number_of_packets = 0;
443
444 // If receiving multiple report blocks, calculate the weighted average based
445 // on the number of packets a report refers to.
446 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
447 block_it != report_blocks.end(); ++block_it) {
448 // Find the previous extended high sequence number for this remote SSRC,
449 // to calculate the number of RTP packets this report refers to. Ignore if
450 // we haven't seen this SSRC before.
451 std::map<uint32_t, uint32_t>::iterator seq_num_it =
452 extended_max_sequence_number_.find(block_it->source_ssrc);
453 int number_of_packets = 0;
454 if (seq_num_it != extended_max_sequence_number_.end()) {
455 number_of_packets =
456 block_it->extended_highest_sequence_number - seq_num_it->second;
457 }
458 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
459 total_number_of_packets += number_of_packets;
460
461 extended_max_sequence_number_[block_it->source_ssrc] =
462 block_it->extended_highest_sequence_number;
463 }
464 int weighted_fraction_lost = 0;
465 if (total_number_of_packets > 0) {
466 weighted_fraction_lost =
467 (fraction_lost_aggregate + total_number_of_packets / 2) /
468 total_number_of_packets;
469 }
470 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
471 }
472
473 private:
474 ChannelSend* owner_;
475 // Maps remote side ssrc to extended highest sequence number received.
476 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
477 rtc::CriticalSection crit_;
478 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
479};
480
Niels Möller87e2d782019-03-07 10:18:23 +0100481int32_t ChannelSend::SendData(AudioFrameType frameType,
Niels Möller530ead42018-10-04 14:28:39 +0200482 uint8_t payloadType,
483 uint32_t timeStamp,
484 const uint8_t* payloadData,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200485 size_t payloadSize) {
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100486 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200487 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
488
489 if (media_transport() != nullptr) {
Niels Möllerc936cb62019-03-19 14:10:16 +0100490 if (frameType == AudioFrameType::kEmptyFrame) {
Piotr (Peter) Slatala3cdd4d52019-02-28 07:10:56 -0800491 // TODO(bugs.webrtc.org/9719): Media transport Send doesn't support
492 // sending empty frames.
493 return 0;
494 }
495
Niels Möllerc35b6e62019-04-25 16:31:18 +0200496 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload);
Niels Möller7d76a312018-10-26 12:57:07 +0200497 } else {
Niels Möllerc35b6e62019-04-25 16:31:18 +0200498 return SendRtpAudio(frameType, payloadType, timeStamp, payload);
Niels Möller7d76a312018-10-26 12:57:07 +0200499 }
500}
501
Niels Möller87e2d782019-03-07 10:18:23 +0100502int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200503 uint8_t payloadType,
504 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200505 rtc::ArrayView<const uint8_t> payload) {
Niels Möller530ead42018-10-04 14:28:39 +0200506 if (_includeAudioLevelIndication) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100507 // Store current audio level in the RTP sender.
Niels Möller530ead42018-10-04 14:28:39 +0200508 // The level will be used in combination with voice-activity state
509 // (frameType) to add an RTP header extension
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100510 rtp_sender_audio_->SetAudioLevel(rms_level_.Average());
Niels Möller530ead42018-10-04 14:28:39 +0200511 }
512
Benjamin Wright84583f62018-10-04 14:22:34 -0700513 // E2EE Custom Audio Frame Encryption (This is optional).
514 // Keep this buffer around for the lifetime of the send call.
515 rtc::Buffer encrypted_audio_payload;
Minyue Li9ab520e2019-05-28 13:27:40 +0200516 // We don't invoke encryptor if payload is empty, which means we are to send
517 // DTMF, or the encoder entered DTX.
518 // TODO(minyue): see whether DTMF packets should be encrypted or not. In
519 // current implementation, they are not.
Minyue Lif48bca72019-06-20 23:37:02 +0200520 if (!payload.empty()) {
521 if (frame_encryptor_ != nullptr) {
522 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
523 // Allocate a buffer to hold the maximum possible encrypted payload.
524 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
525 cricket::MEDIA_TYPE_AUDIO, payload.size());
526 encrypted_audio_payload.SetSize(max_ciphertext_size);
Benjamin Wright84583f62018-10-04 14:22:34 -0700527
Minyue Lif48bca72019-06-20 23:37:02 +0200528 // Encrypt the audio payload into the buffer.
529 size_t bytes_written = 0;
530 int encrypt_status = frame_encryptor_->Encrypt(
531 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
532 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
533 &bytes_written);
534 if (encrypt_status != 0) {
535 RTC_DLOG(LS_ERROR)
536 << "Channel::SendData() failed encrypt audio payload: "
537 << encrypt_status;
538 return -1;
539 }
540 // Resize the buffer to the exact number of bytes actually used.
541 encrypted_audio_payload.SetSize(bytes_written);
542 // Rewrite the payloadData and size to the new encrypted payload.
543 payload = encrypted_audio_payload;
544 } else if (crypto_options_.sframe.require_frame_encryption) {
545 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
546 << "A frame encryptor is required but one is not set.";
Benjamin Wright84583f62018-10-04 14:22:34 -0700547 return -1;
548 }
Benjamin Wright84583f62018-10-04 14:22:34 -0700549 }
550
Niels Möller530ead42018-10-04 14:28:39 +0200551 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
552 // packetization.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100553 if (!_rtpRtcpModule->OnSendingRtpFrame(timeStamp,
554 // Leaving the time when this frame was
555 // received from the capture device as
556 // undefined for voice for now.
557 -1, payloadType,
558 /*force_sender_report=*/false)) {
559 return false;
560 }
561
562 // RTCPSender has it's own copy of the timestamp offset, added in
563 // RTCPSender::BuildSR, hence we must not add the in the offset for the above
564 // call.
565 // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
566 // knowledge of the offset to a single place.
567 const uint32_t rtp_timestamp = timeStamp + _rtpRtcpModule->StartTimestamp();
Niels Möller530ead42018-10-04 14:28:39 +0200568 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100569 if (!rtp_sender_audio_->SendAudio(frameType, payloadType, rtp_timestamp,
570 payload.data(), payload.size())) {
Niels Möller530ead42018-10-04 14:28:39 +0200571 RTC_DLOG(LS_ERROR)
572 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
573 return -1;
574 }
575
576 return 0;
577}
578
Niels Möller7d76a312018-10-26 12:57:07 +0200579int32_t ChannelSend::SendMediaTransportAudio(
Niels Möller87e2d782019-03-07 10:18:23 +0100580 AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200581 uint8_t payloadType,
582 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200583 rtc::ArrayView<const uint8_t> payload) {
Niels Möller7d76a312018-10-26 12:57:07 +0200584 // TODO(nisse): Use null _transportPtr for MediaTransport.
585 // RTC_DCHECK(_transportPtr == nullptr);
586 uint64_t channel_id;
587 int sampling_rate_hz;
588 {
589 rtc::CritScope cs(&media_transport_lock_);
590 if (media_transport_payload_type_ != payloadType) {
591 // Payload type is being changed, media_transport_sampling_frequency_,
592 // no longer current.
593 return -1;
594 }
595 sampling_rate_hz = media_transport_sampling_frequency_;
596 channel_id = media_transport_channel_id_;
597 }
Mirko Bonadei1c546052019-02-04 14:50:38 +0100598 MediaTransportEncodedAudioFrame frame(
Niels Möller7d76a312018-10-26 12:57:07 +0200599 /*sampling_rate_hz=*/sampling_rate_hz,
600
601 // TODO(nisse): Timestamp and sample index are the same for all supported
602 // audio codecs except G722. Refactor audio coding module to only use
603 // sample index, and leave translation to RTP time, when needed, for
604 // RTP-specific code.
605 /*starting_sample_index=*/timeStamp,
606
607 // Sample count isn't conveniently available from the AudioCodingModule,
608 // and needs some refactoring to wire up in a good way. For now, left as
609 // zero.
Benjamin Wright17b050f2019-03-13 17:35:46 -0700610 /*samples_per_channel=*/0,
Niels Möller7d76a312018-10-26 12:57:07 +0200611
612 /*sequence_number=*/media_transport_sequence_number_,
613 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
614 std::vector<uint8_t>(payload.begin(), payload.end()));
615
616 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
617 // channel id.
618 RTCError rtc_error =
619 media_transport()->SendAudioFrame(channel_id, std::move(frame));
620
621 if (!rtc_error.ok()) {
622 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
623 << ToString(rtc_error.type()) << ", "
624 << rtc_error.message();
625 return -1;
626 }
627
628 ++media_transport_sequence_number_;
629
630 return 0;
631}
632
Sebastian Jansson977b3352019-03-04 17:43:34 +0100633ChannelSend::ChannelSend(Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100634 TaskQueueFactory* task_queue_factory,
Niels Möller530ead42018-10-04 14:28:39 +0200635 ProcessThread* module_process_thread,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700636 const MediaTransportConfig& media_transport_config,
Anton Sukhanov626015d2019-02-04 15:16:06 -0800637 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +0100638 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200639 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700640 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700641 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100642 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800643 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +0200644 int rtcp_report_interval_ms,
645 uint32_t ssrc)
Niels Möller530ead42018-10-04 14:28:39 +0200646 : event_log_(rtc_event_log),
647 _timeStamp(0), // This is just an offset, RTP module will add it's own
648 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200649 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200650 input_mute_(false),
651 previous_frame_muted_(false),
652 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200653 rtcp_observer_(new VoERtcpObserver(this)),
654 feedback_observer_proxy_(new TransportFeedbackProxy()),
655 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
Erik Språng59b86542019-06-23 18:24:46 +0200656 rtp_packet_pacer_proxy_(new RtpPacketSenderProxy()),
Sebastian Jansson977b3352019-03-04 17:43:34 +0100657 retransmission_rate_limiter_(
658 new RateLimiter(clock, kMaxRetransmissionWindowMs)),
Niels Möller530ead42018-10-04 14:28:39 +0200659 use_twcc_plr_for_ana_(
660 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700661 media_transport_config_(media_transport_config),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700662 frame_encryptor_(frame_encryptor),
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100663 crypto_options_(crypto_options),
664 encoder_queue_(task_queue_factory->CreateTaskQueue(
665 "AudioEncoder",
666 TaskQueueFactory::Priority::NORMAL)) {
Niels Möller530ead42018-10-04 14:28:39 +0200667 RTC_DCHECK(module_process_thread);
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200668 module_process_thread_checker_.Detach();
Niels Möllerdced9f62018-11-19 10:27:07 +0100669
Niels Möller530ead42018-10-04 14:28:39 +0200670 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
671
672 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800673
674 // We gradually remove codepaths that depend on RTP when using media
675 // transport. All of this logic should be moved to the future
676 // RTPMediaTransport. In this case it means that overhead and bandwidth
677 // observers should not be called when using media transport.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700678 if (!media_transport_config.media_transport) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800679 configuration.overhead_observer = overhead_observer;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800680 configuration.bandwidth_callback = rtcp_observer_.get();
681 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
682 }
683
Sebastian Jansson977b3352019-03-04 17:43:34 +0100684 configuration.clock = clock;
Niels Möller530ead42018-10-04 14:28:39 +0200685 configuration.audio = true;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100686 configuration.clock = Clock::GetRealTimeClock();
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100687 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200688
Erik Språng59b86542019-06-23 18:24:46 +0200689 configuration.paced_sender = rtp_packet_pacer_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200690 configuration.transport_sequence_number_allocator =
691 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200692
693 configuration.event_log = event_log_;
694 configuration.rtt_stats = rtcp_rtt_stats;
695 configuration.retransmission_rate_limiter =
696 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100697 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800698 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200699
Erik Språng4c2c4122019-07-11 15:20:15 +0200700 configuration.media_send_ssrc = ssrc;
701
Danil Chapovalovc44f6cc2019-03-06 11:31:09 +0100702 _rtpRtcpModule = RtpRtcp::Create(configuration);
Niels Möller530ead42018-10-04 14:28:39 +0200703 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200704
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100705 rtp_sender_audio_ = absl::make_unique<RTPSenderAudio>(
706 configuration.clock, _rtpRtcpModule->RtpSender());
707
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800708 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
709 // callbacks after the audio_coding_ is fully initialized.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700710 if (media_transport_config.media_transport) {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800711 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700712 media_transport_config.media_transport->AddTargetTransferRateObserver(this);
713 media_transport_config.media_transport->SetAudioOverheadObserver(
714 overhead_observer);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800715 } else {
716 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
717 }
718
Niels Möller530ead42018-10-04 14:28:39 +0200719 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
720
Niels Möller530ead42018-10-04 14:28:39 +0200721 // Ensure that RTCP is enabled by default for the created channel.
722 // Note that, the module will keep generating RTCP until it is explicitly
723 // disabled by the user.
724 // After StopListen (when no sockets exists), RTCP packets will no longer
725 // be transmitted since the Transport object will then be invalid.
726 // RTCP is enabled by default.
727 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
728
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100729 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200730 RTC_DCHECK_EQ(0, error);
731}
732
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100733ChannelSend::~ChannelSend() {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200734 RTC_DCHECK(construction_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200735
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700736 if (media_transport_config_.media_transport) {
737 media_transport_config_.media_transport->RemoveTargetTransferRateObserver(
738 this);
739 media_transport_config_.media_transport->SetAudioOverheadObserver(nullptr);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800740 }
741
Niels Möller530ead42018-10-04 14:28:39 +0200742 StopSend();
Niels Möller530ead42018-10-04 14:28:39 +0200743 int error = audio_coding_->RegisterTransportCallback(NULL);
744 RTC_DCHECK_EQ(0, error);
745
Niels Möller530ead42018-10-04 14:28:39 +0200746 if (_moduleProcessThreadPtr)
747 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200748}
749
Niels Möller26815232018-11-16 09:32:40 +0100750void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100751 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100752 RTC_DCHECK(!sending_);
753 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200754
Niels Möller530ead42018-10-04 14:28:39 +0200755 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100756 int ret = _rtpRtcpModule->SetSendingStatus(true);
757 RTC_DCHECK_EQ(0, ret);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100758 // It is now OK to start processing on the encoder task queue.
759 encoder_queue_.PostTask([this] {
760 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200761 encoder_queue_is_active_ = true;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100762 });
Niels Möller530ead42018-10-04 14:28:39 +0200763}
764
765void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100766 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100767 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200768 return;
769 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100770 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200771
Niels Möllerc572ff32018-11-07 08:43:50 +0100772 rtc::Event flush;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100773 encoder_queue_.PostTask([this, &flush]() {
774 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200775 encoder_queue_is_active_ = false;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100776 flush.Set();
777 });
Niels Möller530ead42018-10-04 14:28:39 +0200778 flush.Wait(rtc::Event::kForever);
779
Niels Möller530ead42018-10-04 14:28:39 +0200780 // Reset sending SSRC and sequence number and triggers direct transmission
781 // of RTCP BYE
782 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
783 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
784 }
785 _rtpRtcpModule->SetSendingMediaStatus(false);
786}
787
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100788void ChannelSend::SetEncoder(int payload_type,
Niels Möller530ead42018-10-04 14:28:39 +0200789 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100790 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200791 RTC_DCHECK_GE(payload_type, 0);
792 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200793
794 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
795 // as well as some other things, so we collect this info and send it along.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100796 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type,
797 encoder->RtpTimestampRateHz());
798 rtp_sender_audio_->RegisterAudioPayload("audio", payload_type,
799 encoder->RtpTimestampRateHz(),
800 encoder->NumChannels(), 0);
Niels Möller530ead42018-10-04 14:28:39 +0200801
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700802 if (media_transport_config_.media_transport) {
Niels Möller7d76a312018-10-26 12:57:07 +0200803 rtc::CritScope cs(&media_transport_lock_);
804 media_transport_payload_type_ = payload_type;
805 // TODO(nisse): Currently broken for G722, since timestamps passed through
806 // encoder use RTP clock rather than sample count, and they differ for G722.
807 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
808 }
Niels Möller530ead42018-10-04 14:28:39 +0200809 audio_coding_->SetEncoder(std::move(encoder));
Niels Möller530ead42018-10-04 14:28:39 +0200810}
811
812void ChannelSend::ModifyEncoder(
813 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800814 // This method can be called on the worker thread, module process thread
815 // or network thread. Audio coding is thread safe, so we do not need to
816 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200817 audio_coding_->ModifyEncoder(modifier);
818}
819
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100820void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
821 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
822 if (*encoder_ptr) {
823 modifier(encoder_ptr->get());
824 } else {
825 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
826 }
827 });
828}
829
Sebastian Jansson254d8692018-11-21 19:19:00 +0100830void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100831 // This method can be called on the worker thread, module process thread
832 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
833 // TODO(solenberg): Figure out a good way to check this or enforce calling
834 // rules.
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200835 // RTC_DCHECK(worker_thread_checker_.IsCurrent() ||
836 // module_process_thread_checker_.IsCurrent());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800837 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100838
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100839 CallEncoder([&](AudioEncoder* encoder) {
840 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200841 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100842 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
843 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200844}
845
Niels Möllerdced9f62018-11-19 10:27:07 +0100846int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800847 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200848 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200849}
850
851void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100852 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200853 if (!use_twcc_plr_for_ana_)
854 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100855 CallEncoder([&](AudioEncoder* encoder) {
856 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200857 });
858}
859
860void ChannelSend::OnRecoverableUplinkPacketLossRate(
861 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100862 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100863 CallEncoder([&](AudioEncoder* encoder) {
864 encoder->OnReceivedUplinkRecoverablePacketLossFraction(
865 recoverable_packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200866 });
867}
868
869void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
870 if (use_twcc_plr_for_ana_)
871 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100872 CallEncoder([&](AudioEncoder* encoder) {
873 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200874 });
875}
876
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100877void ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100878 // May be called on either worker thread or network thread.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700879 if (media_transport_config_.media_transport) {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800880 // Ignore RTCP packets while media transport is used.
881 // Those packets should not arrive, but we are seeing occasional packets.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100882 return;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800883 }
884
Niels Möller530ead42018-10-04 14:28:39 +0200885 // Deliver RTCP packet to RTP/RTCP module for parsing
886 _rtpRtcpModule->IncomingRtcpPacket(data, length);
887
888 int64_t rtt = GetRTT();
889 if (rtt == 0) {
890 // Waiting for valid RTT.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100891 return;
Niels Möller530ead42018-10-04 14:28:39 +0200892 }
893
894 int64_t nack_window_ms = rtt;
895 if (nack_window_ms < kMinRetransmissionWindowMs) {
896 nack_window_ms = kMinRetransmissionWindowMs;
897 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
898 nack_window_ms = kMaxRetransmissionWindowMs;
899 }
900 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
901
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800902 OnReceivedRtt(rtt);
Niels Möller530ead42018-10-04 14:28:39 +0200903}
904
905void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100906 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200907 rtc::CritScope cs(&volume_settings_critsect_);
908 input_mute_ = enable;
909}
910
911bool ChannelSend::InputMute() const {
912 rtc::CritScope cs(&volume_settings_critsect_);
913 return input_mute_;
914}
915
Niels Möller26815232018-11-16 09:32:40 +0100916bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100917 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200918 RTC_DCHECK_LE(0, event);
919 RTC_DCHECK_GE(255, event);
920 RTC_DCHECK_LE(0, duration_ms);
921 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100922 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100923 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200924 }
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100925 if (rtp_sender_audio_->SendTelephoneEvent(
Niels Möller530ead42018-10-04 14:28:39 +0200926 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100927 RTC_DLOG(LS_ERROR) << "SendTelephoneEvent() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100928 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200929 }
Niels Möller26815232018-11-16 09:32:40 +0100930 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200931}
932
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100933void ChannelSend::RegisterCngPayloadType(int payload_type,
934 int payload_frequency) {
935 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
936 rtp_sender_audio_->RegisterAudioPayload("CN", payload_type, payload_frequency,
937 1, 0);
938}
939
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100940void ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
Niels Möller26815232018-11-16 09:32:40 +0100941 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100942 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200943 RTC_DCHECK_LE(0, payload_type);
944 RTC_DCHECK_GE(127, payload_type);
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100945 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
946 rtp_sender_audio_->RegisterAudioPayload("telephone-event", payload_type,
947 payload_frequency, 0, 0);
Niels Möller530ead42018-10-04 14:28:39 +0200948}
949
Niels Möllerdced9f62018-11-19 10:27:07 +0100950void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100951 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100952 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100953
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700954 if (media_transport_config_.media_transport) {
Niels Möller7d76a312018-10-26 12:57:07 +0200955 rtc::CritScope cs(&media_transport_lock_);
956 media_transport_channel_id_ = ssrc;
957 }
Niels Möller530ead42018-10-04 14:28:39 +0200958 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200959}
960
Amit Hilbuch77938e62018-12-21 09:23:38 -0800961void ChannelSend::SetRid(const std::string& rid,
962 int extension_id,
963 int repaired_extension_id) {
964 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
965 if (extension_id != 0) {
966 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
967 extension_id);
968 RTC_DCHECK_EQ(0, ret);
969 }
970 if (repaired_extension_id != 0) {
971 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
972 repaired_extension_id);
973 RTC_DCHECK_EQ(0, ret);
974 }
975 _rtpRtcpModule->SetRid(rid);
976}
977
Niels Möller530ead42018-10-04 14:28:39 +0200978void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100979 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200980 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
981 RTC_DCHECK_EQ(0, ret);
982 _rtpRtcpModule->SetMid(mid);
983}
984
Johannes Kron9190b822018-10-29 11:22:05 +0100985void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +0100986 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +0100987 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
988}
989
Niels Möller26815232018-11-16 09:32:40 +0100990void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100991 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200992 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +0100993 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
994 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200995}
996
997void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100998 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200999 int ret =
1000 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
1001 RTC_DCHECK_EQ(0, ret);
1002}
1003
1004void ChannelSend::RegisterSenderCongestionControlObjects(
1005 RtpTransportControllerSendInterface* transport,
1006 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +01001007 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Erik Språng59b86542019-06-23 18:24:46 +02001008 RtpPacketPacer* rtp_packet_pacer = transport->packet_sender();
Niels Möller530ead42018-10-04 14:28:39 +02001009 TransportFeedbackObserver* transport_feedback_observer =
1010 transport->transport_feedback_observer();
1011 PacketRouter* packet_router = transport->packet_router();
1012
Erik Språng59b86542019-06-23 18:24:46 +02001013 RTC_DCHECK(rtp_packet_pacer);
Niels Möller530ead42018-10-04 14:28:39 +02001014 RTC_DCHECK(transport_feedback_observer);
1015 RTC_DCHECK(packet_router);
1016 RTC_DCHECK(!packet_router_);
1017 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
1018 feedback_observer_proxy_->SetTransportFeedbackObserver(
1019 transport_feedback_observer);
1020 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
Erik Språng59b86542019-06-23 18:24:46 +02001021 rtp_packet_pacer_proxy_->SetPacketPacer(rtp_packet_pacer);
Niels Möller530ead42018-10-04 14:28:39 +02001022 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
1023 constexpr bool remb_candidate = false;
1024 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
1025 packet_router_ = packet_router;
1026}
1027
1028void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001029 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001030 RTC_DCHECK(packet_router_);
1031 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1032 rtcp_observer_->SetBandwidthObserver(nullptr);
1033 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1034 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1035 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1036 packet_router_ = nullptr;
Erik Språng59b86542019-06-23 18:24:46 +02001037 rtp_packet_pacer_proxy_->SetPacketPacer(nullptr);
Niels Möller530ead42018-10-04 14:28:39 +02001038}
1039
Niels Möller26815232018-11-16 09:32:40 +01001040void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001041 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001042 // Note: SetCNAME() accepts a c string of length at most 255.
1043 const std::string c_name_limited(c_name.substr(0, 255));
1044 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1045 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001046}
1047
Niels Möller26815232018-11-16 09:32:40 +01001048std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001049 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001050 // Get the report blocks from the latest received RTCP Sender or Receiver
1051 // Report. Each element in the vector contains the sender's SSRC and a
1052 // report block according to RFC 3550.
1053 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001054
Niels Möller26815232018-11-16 09:32:40 +01001055 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1056 RTC_DCHECK_EQ(0, ret);
1057
1058 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001059
1060 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1061 for (; it != rtcp_report_blocks.end(); ++it) {
1062 ReportBlock report_block;
1063 report_block.sender_SSRC = it->sender_ssrc;
1064 report_block.source_SSRC = it->source_ssrc;
1065 report_block.fraction_lost = it->fraction_lost;
1066 report_block.cumulative_num_packets_lost = it->packets_lost;
1067 report_block.extended_highest_sequence_number =
1068 it->extended_highest_sequence_number;
1069 report_block.interarrival_jitter = it->jitter;
1070 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1071 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001072 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001073 }
Niels Möller26815232018-11-16 09:32:40 +01001074 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001075}
1076
Niels Möller26815232018-11-16 09:32:40 +01001077CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001078 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001079 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001080 stats.rttMs = GetRTT();
1081
Henrik Boströmcf96e0f2019-04-17 13:51:53 +02001082 StreamDataCounters rtp_stats;
1083 StreamDataCounters rtx_stats;
1084 _rtpRtcpModule->GetSendStreamDataCounters(&rtp_stats, &rtx_stats);
1085 // TODO(https://crbug.com/webrtc/10525): Bytes sent should only include
1086 // payload bytes, not header and padding bytes.
1087 stats.bytesSent =
1088 rtp_stats.transmitted.payload_bytes +
1089 rtp_stats.transmitted.padding_bytes + rtp_stats.transmitted.header_bytes +
1090 rtx_stats.transmitted.payload_bytes +
1091 rtx_stats.transmitted.padding_bytes + rtx_stats.transmitted.header_bytes;
1092 // TODO(https://crbug.com/webrtc/10555): RTX retransmissions should show up in
1093 // separate outbound-rtp stream objects.
1094 stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
1095 stats.packetsSent =
1096 rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
1097 stats.retransmitted_packets_sent = rtp_stats.retransmitted.packets;
Henrik Boström6e436d12019-05-27 12:19:33 +02001098 stats.report_block_datas = _rtpRtcpModule->GetLatestReportBlockData();
Niels Möller530ead42018-10-04 14:28:39 +02001099
Niels Möller26815232018-11-16 09:32:40 +01001100 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001101}
1102
Niels Möller530ead42018-10-04 14:28:39 +02001103void ChannelSend::ProcessAndEncodeAudio(
1104 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001105 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001106 struct ProcessAndEncodeAudio {
1107 void operator()() {
1108 RTC_DCHECK_RUN_ON(&channel->encoder_queue_);
1109 if (!channel->encoder_queue_is_active_) {
1110 return;
1111 }
1112 channel->ProcessAndEncodeAudioOnTaskQueue(audio_frame.get());
1113 }
1114 std::unique_ptr<AudioFrame> audio_frame;
1115 ChannelSend* const channel;
1116 };
Niels Möller530ead42018-10-04 14:28:39 +02001117 // Profile time between when the audio frame is added to the task queue and
1118 // when the task is actually executed.
1119 audio_frame->UpdateProfileTimeStamp();
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001120 encoder_queue_.PostTask(ProcessAndEncodeAudio{std::move(audio_frame), this});
Niels Möller530ead42018-10-04 14:28:39 +02001121}
1122
1123void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
Niels Möller530ead42018-10-04 14:28:39 +02001124 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
henrikad0679bd2019-07-09 15:37:45 +02001125 RTC_DCHECK_LE(audio_input->num_channels_, 8);
Niels Möller530ead42018-10-04 14:28:39 +02001126
1127 // Measure time between when the audio frame is added to the task queue and
1128 // when the task is actually executed. Goal is to keep track of unwanted
1129 // extra latency added by the task queue.
1130 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1131 audio_input->ElapsedProfileTimeMs());
1132
1133 bool is_muted = InputMute();
1134 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1135
1136 if (_includeAudioLevelIndication) {
1137 size_t length =
1138 audio_input->samples_per_channel_ * audio_input->num_channels_;
1139 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1140 if (is_muted && previous_frame_muted_) {
1141 rms_level_.AnalyzeMuted(length);
1142 } else {
1143 rms_level_.Analyze(
1144 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1145 }
1146 }
1147 previous_frame_muted_ = is_muted;
1148
1149 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1150
1151 // The ACM resamples internally.
1152 audio_input->timestamp_ = _timeStamp;
1153 // This call will trigger AudioPacketizationCallback::SendData if encoding
1154 // is done and payload is ready for packetization and transmission.
1155 // Otherwise, it will return without invoking the callback.
1156 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1157 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1158 return;
1159 }
1160
1161 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1162}
1163
Niels Möller530ead42018-10-04 14:28:39 +02001164ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001165 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001166 return audio_coding_->GetANAStats();
1167}
1168
1169RtpRtcp* ChannelSend::GetRtpRtcp() const {
Sebastian Janssonc01367d2019-04-08 15:20:44 +02001170 RTC_DCHECK(module_process_thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +02001171 return _rtpRtcpModule.get();
1172}
1173
1174int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1175 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001176 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001177 int error = 0;
1178 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1179 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001180 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1181 // argument. Currently it wants an uint8_t.
1182 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1183 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001184 }
1185 return error;
1186}
1187
Niels Möller530ead42018-10-04 14:28:39 +02001188int64_t ChannelSend::GetRTT() const {
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001189 if (media_transport_config_.media_transport) {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001190 // GetRTT is generally used in the RTCP codepath, where media transport is
1191 // not present and so it shouldn't be needed. But it's also invoked in
1192 // 'GetStats' method, and for now returning media transport RTT here gives
1193 // us "free" rtt stats for media transport.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001194 auto target_rate =
1195 media_transport_config_.media_transport->GetLatestTargetTransferRate();
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001196 if (target_rate.has_value()) {
1197 return target_rate.value().network_estimate.round_trip_time.ms();
1198 }
1199
1200 return 0;
1201 }
Niels Möller530ead42018-10-04 14:28:39 +02001202 RtcpMode method = _rtpRtcpModule->RTCP();
1203 if (method == RtcpMode::kOff) {
1204 return 0;
1205 }
1206 std::vector<RTCPReportBlock> report_blocks;
1207 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1208
1209 if (report_blocks.empty()) {
1210 return 0;
1211 }
1212
1213 int64_t rtt = 0;
1214 int64_t avg_rtt = 0;
1215 int64_t max_rtt = 0;
1216 int64_t min_rtt = 0;
1217 // We don't know in advance the remote ssrc used by the other end's receiver
1218 // reports, so use the SSRC of the first report block for calculating the RTT.
1219 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1220 &min_rtt, &max_rtt) != 0) {
1221 return 0;
1222 }
1223 return rtt;
1224}
1225
Benjamin Wright78410ad2018-10-25 09:52:57 -07001226void ChannelSend::SetFrameEncryptor(
1227 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001228 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001229 encoder_queue_.PostTask([this, frame_encryptor]() mutable {
1230 RTC_DCHECK_RUN_ON(&encoder_queue_);
Sebastian Jansson7949f212019-03-05 13:41:48 +00001231 frame_encryptor_ = std::move(frame_encryptor);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001232 });
Benjamin Wright84583f62018-10-04 14:22:34 -07001233}
1234
Anton Sukhanov626015d2019-02-04 15:16:06 -08001235// TODO(sukhanov): Consider moving TargetTransferRate observer to
1236// AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
1237// makes sense to consolidate all rate (and overhead) calculation there.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001238void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001239 RTC_DCHECK(media_transport_config_.media_transport);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001240 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1241}
1242
1243void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1244 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +01001245 CallEncoder(
1246 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001247}
1248
Niels Möllerdced9f62018-11-19 10:27:07 +01001249} // namespace
1250
1251std::unique_ptr<ChannelSendInterface> CreateChannelSend(
Sebastian Jansson977b3352019-03-04 17:43:34 +01001252 Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001253 TaskQueueFactory* task_queue_factory,
Niels Möllerdced9f62018-11-19 10:27:07 +01001254 ProcessThread* module_process_thread,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001255 const MediaTransportConfig& media_transport_config,
Anton Sukhanov626015d2019-02-04 15:16:06 -08001256 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +01001257 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001258 RtcpRttStats* rtcp_rtt_stats,
1259 RtcEventLog* rtc_event_log,
1260 FrameEncryptorInterface* frame_encryptor,
1261 const webrtc::CryptoOptions& crypto_options,
1262 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +02001263 int rtcp_report_interval_ms,
1264 uint32_t ssrc) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001265 return absl::make_unique<ChannelSend>(
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001266 clock, task_queue_factory, module_process_thread, media_transport_config,
Sebastian Jansson977b3352019-03-04 17:43:34 +01001267 overhead_observer, rtp_transport, rtcp_rtt_stats, rtc_event_log,
1268 frame_encryptor, crypto_options, extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +02001269 rtcp_report_interval_ms, ssrc);
Niels Möllerdced9f62018-11-19 10:27:07 +01001270}
1271
Niels Möller530ead42018-10-04 14:28:39 +02001272} // namespace voe
1273} // namespace webrtc