blob: 876ee690954b464cb7ef52cd7f7552714783348c [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"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020024#include "api/rtc_event_log/rtc_event_log.h"
Niels Möller530ead42018-10-04 14:28:39 +020025#include "audio/utility/audio_frame_operations.h"
26#include "call/rtp_transport_controller_send_interface.h"
27#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
Niels Möller530ead42018-10-04 14:28:39 +020028#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
Bjorn A Mellemda4f0932019-07-30 08:34:03 -070056// Field trial which controls whether to report standard-compliant bytes
57// sent/received per stream. If enabled, padding and headers are not included
58// in bytes sent or received.
59constexpr char kUseStandardBytesStats[] = "WebRTC-UseStandardBytesStats";
60
Niels Möller7d76a312018-10-26 12:57:07 +020061MediaTransportEncodedAudioFrame::FrameType
Niels Möller87e2d782019-03-07 10:18:23 +010062MediaTransportFrameTypeForWebrtcFrameType(webrtc::AudioFrameType frame_type) {
Niels Möller7d76a312018-10-26 12:57:07 +020063 switch (frame_type) {
Niels Möllerc936cb62019-03-19 14:10:16 +010064 case AudioFrameType::kAudioFrameSpeech:
Niels Möller7d76a312018-10-26 12:57:07 +020065 return MediaTransportEncodedAudioFrame::FrameType::kSpeech;
66 break;
67
Niels Möllerc936cb62019-03-19 14:10:16 +010068 case AudioFrameType::kAudioFrameCN:
Niels Möller7d76a312018-10-26 12:57:07 +020069 return MediaTransportEncodedAudioFrame::FrameType::
70 kDiscontinuousTransmission;
71 break;
72
73 default:
Niels Möllerc936cb62019-03-19 14:10:16 +010074 RTC_CHECK(false) << "Unexpected frame type="
75 << static_cast<int>(frame_type);
Niels Möller7d76a312018-10-26 12:57:07 +020076 break;
77 }
78}
79
Niels Möllerdced9f62018-11-19 10:27:07 +010080class RtpPacketSenderProxy;
81class TransportFeedbackProxy;
82class TransportSequenceNumberProxy;
83class VoERtcpObserver;
84
Benjamin Wright17b050f2019-03-13 17:35:46 -070085class ChannelSend : public ChannelSendInterface,
86 public AudioPacketizationCallback, // receive encoded
87 // packets from the ACM
88 public TargetTransferRateObserver {
Niels Möllerdced9f62018-11-19 10:27:07 +010089 public:
90 // TODO(nisse): Make OnUplinkPacketLossRate public, and delete friend
91 // declaration.
92 friend class VoERtcpObserver;
93
Sebastian Jansson977b3352019-03-04 17:43:34 +010094 ChannelSend(Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +010095 TaskQueueFactory* task_queue_factory,
Niels Möllerdced9f62018-11-19 10:27:07 +010096 ProcessThread* module_process_thread,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070097 const MediaTransportConfig& media_transport_config,
Anton Sukhanov626015d2019-02-04 15:16:06 -080098 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +010099 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +0100100 RtcpRttStats* rtcp_rtt_stats,
101 RtcEventLog* rtc_event_log,
102 FrameEncryptorInterface* frame_encryptor,
103 const webrtc::CryptoOptions& crypto_options,
104 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +0200105 int rtcp_report_interval_ms,
106 uint32_t ssrc);
Niels Möllerdced9f62018-11-19 10:27:07 +0100107
108 ~ChannelSend() override;
109
110 // Send using this encoder, with this payload type.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100111 void SetEncoder(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100112 std::unique_ptr<AudioEncoder> encoder) override;
113 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
114 modifier) override;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100115 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100116
117 // API methods
Niels Möllerdced9f62018-11-19 10:27:07 +0100118 void StartSend() override;
119 void StopSend() override;
120
121 // Codecs
Sebastian Jansson254d8692018-11-21 19:19:00 +0100122 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100123 int GetBitrate() const override;
124
125 // Network
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100126 void ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100127
128 // Muting, Volume and Level.
129 void SetInputMute(bool enable) override;
130
131 // Stats.
132 ANAStats GetANAStatistics() const override;
133
134 // Used by AudioSendStream.
135 RtpRtcp* GetRtpRtcp() const override;
136
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100137 void RegisterCngPayloadType(int payload_type, int payload_frequency) override;
138
Niels Möllerdced9f62018-11-19 10:27:07 +0100139 // DTMF.
140 bool SendTelephoneEventOutband(int event, int duration_ms) override;
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100141 void SetSendTelephoneEventPayloadType(int payload_type,
Niels Möllerdced9f62018-11-19 10:27:07 +0100142 int payload_frequency) override;
143
144 // RTP+RTCP
145 void SetLocalSSRC(uint32_t ssrc) override;
Amit Hilbuch77938e62018-12-21 09:23:38 -0800146 void SetRid(const std::string& rid,
147 int extension_id,
148 int repaired_extension_id) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100149 void SetMid(const std::string& mid, int extension_id) override;
150 void SetExtmapAllowMixed(bool extmap_allow_mixed) override;
151 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
152 void EnableSendTransportSequenceNumber(int id) override;
153
154 void RegisterSenderCongestionControlObjects(
155 RtpTransportControllerSendInterface* transport,
156 RtcpBandwidthObserver* bandwidth_observer) override;
157 void ResetSenderCongestionControlObjects() override;
158 void SetRTCP_CNAME(absl::string_view c_name) override;
159 std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const override;
160 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100161
162 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
163 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
164 // the actual processing of the audio takes place. The processing mainly
165 // consists of encoding and preparing the result for sending by adding it to a
166 // send queue.
167 // The main reason for using a task queue here is to release the native,
168 // OS-specific, audio capture thread as soon as possible to ensure that it
169 // can go back to sleep and be prepared to deliver an new captured audio
170 // packet.
171 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
172
Niels Möllerdced9f62018-11-19 10:27:07 +0100173 // The existence of this function alongside OnUplinkPacketLossRate is
174 // a compromise. We want the encoder to be agnostic of the PLR source, but
175 // we also don't want it to receive conflicting information from TWCC and
176 // from RTCP-XR.
177 void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) override;
178
179 void OnRecoverableUplinkPacketLossRate(
180 float recoverable_packet_loss_rate) override;
181
182 int64_t GetRTT() const override;
183
184 // E2EE Custom Audio Frame Encryption
185 void SetFrameEncryptor(
186 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
187
188 private:
Niels Möllerdced9f62018-11-19 10:27:07 +0100189 // From AudioPacketizationCallback in the ACM
Niels Möller87e2d782019-03-07 10:18:23 +0100190 int32_t SendData(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100191 uint8_t payloadType,
192 uint32_t timeStamp,
193 const uint8_t* payloadData,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200194 size_t payloadSize) override;
Niels Möllerdced9f62018-11-19 10:27:07 +0100195
Niels Möllerdced9f62018-11-19 10:27:07 +0100196 void OnUplinkPacketLossRate(float packet_loss_rate);
197 bool InputMute() const;
198
Niels Möllerdced9f62018-11-19 10:27:07 +0100199 int SetSendRtpHeaderExtension(bool enable, RTPExtensionType type, int id);
200
Niels Möller87e2d782019-03-07 10:18:23 +0100201 int32_t SendRtpAudio(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
Niels Möller87e2d782019-03-07 10:18:23 +0100207 int32_t SendMediaTransportAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 10:27:07 +0100208 uint8_t payloadType,
209 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200210 rtc::ArrayView<const uint8_t> payload)
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100211 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100212
213 // Return media transport or nullptr if using RTP.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700214 MediaTransportInterface* media_transport() {
215 return media_transport_config_.media_transport;
216 }
Niels Möllerdced9f62018-11-19 10:27:07 +0100217
218 // Called on the encoder task queue when a new input audio frame is ready
219 // for encoding.
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100220 void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input)
221 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100222
223 void OnReceivedRtt(int64_t rtt_ms);
224
225 void OnTargetTransferRate(TargetTransferRate) override;
226
227 // Thread checkers document and lock usage of some methods on voe::Channel to
228 // specific threads we know about. The goal is to eventually split up
229 // voe::Channel into parts with single-threaded semantics, and thereby reduce
230 // the need for locks.
231 rtc::ThreadChecker worker_thread_checker_;
232 rtc::ThreadChecker module_process_thread_checker_;
233 // Methods accessed from audio and video threads are checked for sequential-
234 // only access. We don't necessarily own and control these threads, so thread
235 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
236 // audio thread to another, but access is still sequential.
237 rtc::RaceChecker audio_thread_race_checker_;
238
Niels Möllerdced9f62018-11-19 10:27:07 +0100239 rtc::CriticalSection volume_settings_critsect_;
240
Niels Möller26e88b02018-11-19 15:08:13 +0100241 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100242
243 RtcEventLog* const event_log_;
244
245 std::unique_ptr<RtpRtcp> _rtpRtcpModule;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100246 std::unique_ptr<RTPSenderAudio> rtp_sender_audio_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100247
248 std::unique_ptr<AudioCodingModule> audio_coding_;
249 uint32_t _timeStamp RTC_GUARDED_BY(encoder_queue_);
250
Niels Möllerdced9f62018-11-19 10:27:07 +0100251 // uses
Niels Möller985a1f32018-11-19 16:08:42 +0100252 ProcessThread* const _moduleProcessThreadPtr;
Niels Möllerdced9f62018-11-19 10:27:07 +0100253 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
254 bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
255 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_);
256 // VoeRTP_RTCP
257 // TODO(henrika): can today be accessed on the main thread and on the
258 // task queue; hence potential race.
259 bool _includeAudioLevelIndication;
Anton Sukhanov626015d2019-02-04 15:16:06 -0800260
Niels Möllerdced9f62018-11-19 10:27:07 +0100261 // RtcpBandwidthObserver
Niels Möller985a1f32018-11-19 16:08:42 +0100262 const std::unique_ptr<VoERtcpObserver> rtcp_observer_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100263
Niels Möller985a1f32018-11-19 16:08:42 +0100264 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
265 nullptr;
266 const std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
267 const std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
Erik Språng59b86542019-06-23 18:24:46 +0200268 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_pacer_proxy_;
Niels Möller985a1f32018-11-19 16:08:42 +0100269 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100270
271 rtc::ThreadChecker construction_thread_;
272
273 const bool use_twcc_plr_for_ana_;
Bjorn A Mellemda4f0932019-07-30 08:34:03 -0700274 const bool use_standard_bytes_stats_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100275
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100276 bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_) = false;
Niels Möllerdced9f62018-11-19 10:27:07 +0100277
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700278 MediaTransportConfig media_transport_config_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100279 int media_transport_sequence_number_ RTC_GUARDED_BY(encoder_queue_) = 0;
280
281 rtc::CriticalSection media_transport_lock_;
282 // Currently set by SetLocalSSRC.
283 uint64_t media_transport_channel_id_ RTC_GUARDED_BY(&media_transport_lock_) =
284 0;
285 // Cache payload type and sampling frequency from most recent call to
286 // SetEncoder. Needed to set MediaTransportEncodedAudioFrame metadata, and
287 // invalidate on encoder change.
288 int media_transport_payload_type_ RTC_GUARDED_BY(&media_transport_lock_);
289 int media_transport_sampling_frequency_
290 RTC_GUARDED_BY(&media_transport_lock_);
291
292 // E2EE Audio Frame Encryption
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100293 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_
294 RTC_GUARDED_BY(encoder_queue_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100295 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 16:08:42 +0100296 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100297
298 rtc::CriticalSection bitrate_crit_section_;
299 int configured_bitrate_bps_ RTC_GUARDED_BY(bitrate_crit_section_) = 0;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100300
301 // Defined last to ensure that there are no running tasks when the other
302 // members are destroyed.
303 rtc::TaskQueue encoder_queue_;
Niels Möllerdced9f62018-11-19 10:27:07 +0100304};
Niels Möller530ead42018-10-04 14:28:39 +0200305
306const int kTelephoneEventAttenuationdB = 10;
307
308class TransportFeedbackProxy : public TransportFeedbackObserver {
309 public:
310 TransportFeedbackProxy() : feedback_observer_(nullptr) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200311 pacer_thread_.Detach();
312 network_thread_.Detach();
Niels Möller530ead42018-10-04 14:28:39 +0200313 }
314
315 void SetTransportFeedbackObserver(
316 TransportFeedbackObserver* feedback_observer) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200317 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200318 rtc::CritScope lock(&crit_);
319 feedback_observer_ = feedback_observer;
320 }
321
322 // Implements TransportFeedbackObserver.
Erik Språng30a276b2019-04-23 12:00:11 +0200323 void OnAddPacket(const RtpPacketSendInfo& packet_info) override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200324 RTC_DCHECK(pacer_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200325 rtc::CritScope lock(&crit_);
326 if (feedback_observer_)
Erik Språng30a276b2019-04-23 12:00:11 +0200327 feedback_observer_->OnAddPacket(packet_info);
Niels Möller530ead42018-10-04 14:28:39 +0200328 }
329
330 void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200331 RTC_DCHECK(network_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200332 rtc::CritScope lock(&crit_);
333 if (feedback_observer_)
334 feedback_observer_->OnTransportFeedback(feedback);
335 }
336
337 private:
338 rtc::CriticalSection crit_;
339 rtc::ThreadChecker thread_checker_;
340 rtc::ThreadChecker pacer_thread_;
341 rtc::ThreadChecker network_thread_;
342 TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
343};
344
345class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
346 public:
347 TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200348 pacer_thread_.Detach();
Niels Möller530ead42018-10-04 14:28:39 +0200349 }
350
351 void SetSequenceNumberAllocator(
352 TransportSequenceNumberAllocator* seq_num_allocator) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200353 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200354 rtc::CritScope lock(&crit_);
355 seq_num_allocator_ = seq_num_allocator;
356 }
357
358 // Implements TransportSequenceNumberAllocator.
359 uint16_t AllocateSequenceNumber() override {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200360 RTC_DCHECK(pacer_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200361 rtc::CritScope lock(&crit_);
362 if (!seq_num_allocator_)
363 return 0;
364 return seq_num_allocator_->AllocateSequenceNumber();
365 }
366
367 private:
368 rtc::CriticalSection crit_;
369 rtc::ThreadChecker thread_checker_;
370 rtc::ThreadChecker pacer_thread_;
371 TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
372};
373
Erik Språngaa59eca2019-07-24 14:52:55 +0200374class RtpPacketSenderProxy : public RtpPacketSender {
Niels Möller530ead42018-10-04 14:28:39 +0200375 public:
Erik Språng59b86542019-06-23 18:24:46 +0200376 RtpPacketSenderProxy() : rtp_packet_pacer_(nullptr) {}
Niels Möller530ead42018-10-04 14:28:39 +0200377
Erik Språngaa59eca2019-07-24 14:52:55 +0200378 void SetPacketPacer(RtpPacketSender* rtp_packet_pacer) {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200379 RTC_DCHECK(thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200380 rtc::CritScope lock(&crit_);
Erik Språng59b86542019-06-23 18:24:46 +0200381 rtp_packet_pacer_ = rtp_packet_pacer;
382 }
383
384 void EnqueuePacket(std::unique_ptr<RtpPacketToSend> packet) override {
385 rtc::CritScope lock(&crit_);
386 rtp_packet_pacer_->EnqueuePacket(std::move(packet));
Niels Möller530ead42018-10-04 14:28:39 +0200387 }
388
389 // Implements RtpPacketSender.
390 void InsertPacket(Priority priority,
391 uint32_t ssrc,
392 uint16_t sequence_number,
393 int64_t capture_time_ms,
394 size_t bytes,
395 bool retransmission) override {
396 rtc::CritScope lock(&crit_);
Erik Språng59b86542019-06-23 18:24:46 +0200397 if (rtp_packet_pacer_) {
398 rtp_packet_pacer_->InsertPacket(priority, ssrc, sequence_number,
399 capture_time_ms, bytes, retransmission);
Niels Möller530ead42018-10-04 14:28:39 +0200400 }
401 }
402
Niels Möller530ead42018-10-04 14:28:39 +0200403 private:
404 rtc::ThreadChecker thread_checker_;
405 rtc::CriticalSection crit_;
Erik Språngaa59eca2019-07-24 14:52:55 +0200406 RtpPacketSender* rtp_packet_pacer_ RTC_GUARDED_BY(&crit_);
Niels Möller530ead42018-10-04 14:28:39 +0200407};
408
409class VoERtcpObserver : public RtcpBandwidthObserver {
410 public:
411 explicit VoERtcpObserver(ChannelSend* owner)
412 : owner_(owner), bandwidth_observer_(nullptr) {}
Mirko Bonadeife055c12019-01-29 22:53:28 +0100413 ~VoERtcpObserver() override {}
Niels Möller530ead42018-10-04 14:28:39 +0200414
415 void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
416 rtc::CritScope lock(&crit_);
417 bandwidth_observer_ = bandwidth_observer;
418 }
419
420 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
421 rtc::CritScope lock(&crit_);
422 if (bandwidth_observer_) {
423 bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
424 }
425 }
426
427 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
428 int64_t rtt,
429 int64_t now_ms) override {
430 {
431 rtc::CritScope lock(&crit_);
432 if (bandwidth_observer_) {
433 bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
434 now_ms);
435 }
436 }
437 // TODO(mflodman): Do we need to aggregate reports here or can we jut send
438 // what we get? I.e. do we ever get multiple reports bundled into one RTCP
439 // report for VoiceEngine?
440 if (report_blocks.empty())
441 return;
442
443 int fraction_lost_aggregate = 0;
444 int total_number_of_packets = 0;
445
446 // If receiving multiple report blocks, calculate the weighted average based
447 // on the number of packets a report refers to.
448 for (ReportBlockList::const_iterator block_it = report_blocks.begin();
449 block_it != report_blocks.end(); ++block_it) {
450 // Find the previous extended high sequence number for this remote SSRC,
451 // to calculate the number of RTP packets this report refers to. Ignore if
452 // we haven't seen this SSRC before.
453 std::map<uint32_t, uint32_t>::iterator seq_num_it =
454 extended_max_sequence_number_.find(block_it->source_ssrc);
455 int number_of_packets = 0;
456 if (seq_num_it != extended_max_sequence_number_.end()) {
457 number_of_packets =
458 block_it->extended_highest_sequence_number - seq_num_it->second;
459 }
460 fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
461 total_number_of_packets += number_of_packets;
462
463 extended_max_sequence_number_[block_it->source_ssrc] =
464 block_it->extended_highest_sequence_number;
465 }
466 int weighted_fraction_lost = 0;
467 if (total_number_of_packets > 0) {
468 weighted_fraction_lost =
469 (fraction_lost_aggregate + total_number_of_packets / 2) /
470 total_number_of_packets;
471 }
472 owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
473 }
474
475 private:
476 ChannelSend* owner_;
477 // Maps remote side ssrc to extended highest sequence number received.
478 std::map<uint32_t, uint32_t> extended_max_sequence_number_;
479 rtc::CriticalSection crit_;
480 RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
481};
482
Niels Möller87e2d782019-03-07 10:18:23 +0100483int32_t ChannelSend::SendData(AudioFrameType frameType,
Niels Möller530ead42018-10-04 14:28:39 +0200484 uint8_t payloadType,
485 uint32_t timeStamp,
486 const uint8_t* payloadData,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200487 size_t payloadSize) {
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100488 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller7d76a312018-10-26 12:57:07 +0200489 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
490
491 if (media_transport() != nullptr) {
Niels Möllerc936cb62019-03-19 14:10:16 +0100492 if (frameType == AudioFrameType::kEmptyFrame) {
Piotr (Peter) Slatala3cdd4d52019-02-28 07:10:56 -0800493 // TODO(bugs.webrtc.org/9719): Media transport Send doesn't support
494 // sending empty frames.
495 return 0;
496 }
497
Niels Möllerc35b6e62019-04-25 16:31:18 +0200498 return SendMediaTransportAudio(frameType, payloadType, timeStamp, payload);
Niels Möller7d76a312018-10-26 12:57:07 +0200499 } else {
Niels Möllerc35b6e62019-04-25 16:31:18 +0200500 return SendRtpAudio(frameType, payloadType, timeStamp, payload);
Niels Möller7d76a312018-10-26 12:57:07 +0200501 }
502}
503
Niels Möller87e2d782019-03-07 10:18:23 +0100504int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200505 uint8_t payloadType,
506 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200507 rtc::ArrayView<const uint8_t> payload) {
Niels Möller530ead42018-10-04 14:28:39 +0200508 if (_includeAudioLevelIndication) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100509 // Store current audio level in the RTP sender.
Niels Möller530ead42018-10-04 14:28:39 +0200510 // The level will be used in combination with voice-activity state
511 // (frameType) to add an RTP header extension
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100512 rtp_sender_audio_->SetAudioLevel(rms_level_.Average());
Niels Möller530ead42018-10-04 14:28:39 +0200513 }
514
Benjamin Wright84583f62018-10-04 14:22:34 -0700515 // E2EE Custom Audio Frame Encryption (This is optional).
516 // Keep this buffer around for the lifetime of the send call.
517 rtc::Buffer encrypted_audio_payload;
Minyue Li9ab520e2019-05-28 13:27:40 +0200518 // We don't invoke encryptor if payload is empty, which means we are to send
519 // DTMF, or the encoder entered DTX.
520 // TODO(minyue): see whether DTMF packets should be encrypted or not. In
521 // current implementation, they are not.
Minyue Lif48bca72019-06-20 23:37:02 +0200522 if (!payload.empty()) {
523 if (frame_encryptor_ != nullptr) {
524 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
525 // Allocate a buffer to hold the maximum possible encrypted payload.
526 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
527 cricket::MEDIA_TYPE_AUDIO, payload.size());
528 encrypted_audio_payload.SetSize(max_ciphertext_size);
Benjamin Wright84583f62018-10-04 14:22:34 -0700529
Minyue Lif48bca72019-06-20 23:37:02 +0200530 // Encrypt the audio payload into the buffer.
531 size_t bytes_written = 0;
532 int encrypt_status = frame_encryptor_->Encrypt(
533 cricket::MEDIA_TYPE_AUDIO, _rtpRtcpModule->SSRC(),
534 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
535 &bytes_written);
536 if (encrypt_status != 0) {
537 RTC_DLOG(LS_ERROR)
538 << "Channel::SendData() failed encrypt audio payload: "
539 << encrypt_status;
540 return -1;
541 }
542 // Resize the buffer to the exact number of bytes actually used.
543 encrypted_audio_payload.SetSize(bytes_written);
544 // Rewrite the payloadData and size to the new encrypted payload.
545 payload = encrypted_audio_payload;
546 } else if (crypto_options_.sframe.require_frame_encryption) {
547 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
548 << "A frame encryptor is required but one is not set.";
Benjamin Wright84583f62018-10-04 14:22:34 -0700549 return -1;
550 }
Benjamin Wright84583f62018-10-04 14:22:34 -0700551 }
552
Niels Möller530ead42018-10-04 14:28:39 +0200553 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
554 // packetization.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100555 if (!_rtpRtcpModule->OnSendingRtpFrame(timeStamp,
556 // Leaving the time when this frame was
557 // received from the capture device as
558 // undefined for voice for now.
559 -1, payloadType,
560 /*force_sender_report=*/false)) {
561 return false;
562 }
563
564 // RTCPSender has it's own copy of the timestamp offset, added in
565 // RTCPSender::BuildSR, hence we must not add the in the offset for the above
566 // call.
567 // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
568 // knowledge of the offset to a single place.
569 const uint32_t rtp_timestamp = timeStamp + _rtpRtcpModule->StartTimestamp();
Niels Möller530ead42018-10-04 14:28:39 +0200570 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100571 if (!rtp_sender_audio_->SendAudio(frameType, payloadType, rtp_timestamp,
572 payload.data(), payload.size())) {
Niels Möller530ead42018-10-04 14:28:39 +0200573 RTC_DLOG(LS_ERROR)
574 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
575 return -1;
576 }
577
578 return 0;
579}
580
Niels Möller7d76a312018-10-26 12:57:07 +0200581int32_t ChannelSend::SendMediaTransportAudio(
Niels Möller87e2d782019-03-07 10:18:23 +0100582 AudioFrameType frameType,
Niels Möller7d76a312018-10-26 12:57:07 +0200583 uint8_t payloadType,
584 uint32_t timeStamp,
Niels Möllerc35b6e62019-04-25 16:31:18 +0200585 rtc::ArrayView<const uint8_t> payload) {
Niels Möller7d76a312018-10-26 12:57:07 +0200586 // TODO(nisse): Use null _transportPtr for MediaTransport.
587 // RTC_DCHECK(_transportPtr == nullptr);
588 uint64_t channel_id;
589 int sampling_rate_hz;
590 {
591 rtc::CritScope cs(&media_transport_lock_);
592 if (media_transport_payload_type_ != payloadType) {
593 // Payload type is being changed, media_transport_sampling_frequency_,
594 // no longer current.
595 return -1;
596 }
597 sampling_rate_hz = media_transport_sampling_frequency_;
598 channel_id = media_transport_channel_id_;
599 }
Mirko Bonadei1c546052019-02-04 14:50:38 +0100600 MediaTransportEncodedAudioFrame frame(
Niels Möller7d76a312018-10-26 12:57:07 +0200601 /*sampling_rate_hz=*/sampling_rate_hz,
602
603 // TODO(nisse): Timestamp and sample index are the same for all supported
604 // audio codecs except G722. Refactor audio coding module to only use
605 // sample index, and leave translation to RTP time, when needed, for
606 // RTP-specific code.
607 /*starting_sample_index=*/timeStamp,
608
609 // Sample count isn't conveniently available from the AudioCodingModule,
610 // and needs some refactoring to wire up in a good way. For now, left as
611 // zero.
Benjamin Wright17b050f2019-03-13 17:35:46 -0700612 /*samples_per_channel=*/0,
Niels Möller7d76a312018-10-26 12:57:07 +0200613
614 /*sequence_number=*/media_transport_sequence_number_,
615 MediaTransportFrameTypeForWebrtcFrameType(frameType), payloadType,
616 std::vector<uint8_t>(payload.begin(), payload.end()));
617
618 // TODO(nisse): Introduce a MediaTransportSender object bound to a specific
619 // channel id.
620 RTCError rtc_error =
621 media_transport()->SendAudioFrame(channel_id, std::move(frame));
622
623 if (!rtc_error.ok()) {
624 RTC_LOG(LS_ERROR) << "Failed to send frame, rtc_error="
625 << ToString(rtc_error.type()) << ", "
626 << rtc_error.message();
627 return -1;
628 }
629
630 ++media_transport_sequence_number_;
631
632 return 0;
633}
634
Sebastian Jansson977b3352019-03-04 17:43:34 +0100635ChannelSend::ChannelSend(Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100636 TaskQueueFactory* task_queue_factory,
Niels Möller530ead42018-10-04 14:28:39 +0200637 ProcessThread* module_process_thread,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700638 const MediaTransportConfig& media_transport_config,
Anton Sukhanov626015d2019-02-04 15:16:06 -0800639 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +0100640 Transport* rtp_transport,
Niels Möller530ead42018-10-04 14:28:39 +0200641 RtcpRttStats* rtcp_rtt_stats,
Benjamin Wright84583f62018-10-04 14:22:34 -0700642 RtcEventLog* rtc_event_log,
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700643 FrameEncryptorInterface* frame_encryptor,
Johannes Kron9190b822018-10-29 11:22:05 +0100644 const webrtc::CryptoOptions& crypto_options,
Jiawei Ou55718122018-11-09 13:17:39 -0800645 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +0200646 int rtcp_report_interval_ms,
647 uint32_t ssrc)
Niels Möller530ead42018-10-04 14:28:39 +0200648 : event_log_(rtc_event_log),
649 _timeStamp(0), // This is just an offset, RTP module will add it's own
650 // random offset
Niels Möller530ead42018-10-04 14:28:39 +0200651 _moduleProcessThreadPtr(module_process_thread),
Niels Möller530ead42018-10-04 14:28:39 +0200652 input_mute_(false),
653 previous_frame_muted_(false),
654 _includeAudioLevelIndication(false),
Niels Möller530ead42018-10-04 14:28:39 +0200655 rtcp_observer_(new VoERtcpObserver(this)),
656 feedback_observer_proxy_(new TransportFeedbackProxy()),
657 seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
Erik Språng59b86542019-06-23 18:24:46 +0200658 rtp_packet_pacer_proxy_(new RtpPacketSenderProxy()),
Sebastian Jansson977b3352019-03-04 17:43:34 +0100659 retransmission_rate_limiter_(
660 new RateLimiter(clock, kMaxRetransmissionWindowMs)),
Niels Möller530ead42018-10-04 14:28:39 +0200661 use_twcc_plr_for_ana_(
662 webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"),
Bjorn A Mellemda4f0932019-07-30 08:34:03 -0700663 use_standard_bytes_stats_(
664 webrtc::field_trial::IsEnabled(kUseStandardBytesStats)),
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700665 media_transport_config_(media_transport_config),
Benjamin Wrightbfb444c2018-10-15 10:20:24 -0700666 frame_encryptor_(frame_encryptor),
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100667 crypto_options_(crypto_options),
668 encoder_queue_(task_queue_factory->CreateTaskQueue(
669 "AudioEncoder",
670 TaskQueueFactory::Priority::NORMAL)) {
Niels Möller530ead42018-10-04 14:28:39 +0200671 RTC_DCHECK(module_process_thread);
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200672 module_process_thread_checker_.Detach();
Niels Möllerdced9f62018-11-19 10:27:07 +0100673
Niels Möller530ead42018-10-04 14:28:39 +0200674 audio_coding_.reset(AudioCodingModule::Create(AudioCodingModule::Config()));
675
676 RtpRtcp::Configuration configuration;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800677
678 // We gradually remove codepaths that depend on RTP when using media
679 // transport. All of this logic should be moved to the future
680 // RTPMediaTransport. In this case it means that overhead and bandwidth
681 // observers should not be called when using media transport.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700682 if (!media_transport_config.media_transport) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800683 configuration.overhead_observer = overhead_observer;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800684 configuration.bandwidth_callback = rtcp_observer_.get();
685 configuration.transport_feedback_callback = feedback_observer_proxy_.get();
686 }
687
Sebastian Jansson977b3352019-03-04 17:43:34 +0100688 configuration.clock = clock;
Niels Möller530ead42018-10-04 14:28:39 +0200689 configuration.audio = true;
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100690 configuration.clock = Clock::GetRealTimeClock();
Fredrik Solenberg3d2ed192018-12-18 09:18:33 +0100691 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 14:28:39 +0200692
Erik Språng59b86542019-06-23 18:24:46 +0200693 configuration.paced_sender = rtp_packet_pacer_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200694 configuration.transport_sequence_number_allocator =
695 seq_num_allocator_proxy_.get();
Niels Möller530ead42018-10-04 14:28:39 +0200696
697 configuration.event_log = event_log_;
698 configuration.rtt_stats = rtcp_rtt_stats;
699 configuration.retransmission_rate_limiter =
700 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 11:22:05 +0100701 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-15 16:44:37 -0800702 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Niels Möller530ead42018-10-04 14:28:39 +0200703
Erik Språng54d5d2c2019-08-20 17:22:36 +0200704 configuration.local_media_ssrc = ssrc;
Erik Språng4c2c4122019-07-11 15:20:15 +0200705
Danil Chapovalovc44f6cc2019-03-06 11:31:09 +0100706 _rtpRtcpModule = RtpRtcp::Create(configuration);
Niels Möller530ead42018-10-04 14:28:39 +0200707 _rtpRtcpModule->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 14:28:39 +0200708
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100709 rtp_sender_audio_ = absl::make_unique<RTPSenderAudio>(
710 configuration.clock, _rtpRtcpModule->RtpSender());
711
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800712 // We want to invoke the 'TargetRateObserver' and |OnOverheadChanged|
713 // callbacks after the audio_coding_ is fully initialized.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700714 if (media_transport_config.media_transport) {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800715 RTC_DLOG(LS_INFO) << "Setting media_transport_ rate observers.";
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700716 media_transport_config.media_transport->AddTargetTransferRateObserver(this);
717 media_transport_config.media_transport->SetAudioOverheadObserver(
718 overhead_observer);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800719 } else {
720 RTC_DLOG(LS_INFO) << "Not setting media_transport_ rate observers.";
721 }
722
Niels Möller530ead42018-10-04 14:28:39 +0200723 _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
724
Niels Möller530ead42018-10-04 14:28:39 +0200725 // Ensure that RTCP is enabled by default for the created channel.
726 // Note that, the module will keep generating RTCP until it is explicitly
727 // disabled by the user.
728 // After StopListen (when no sockets exists), RTCP packets will no longer
729 // be transmitted since the Transport object will then be invalid.
730 // RTCP is enabled by default.
731 _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
732
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100733 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 14:28:39 +0200734 RTC_DCHECK_EQ(0, error);
735}
736
Fredrik Solenberg645a3af2018-11-16 12:51:15 +0100737ChannelSend::~ChannelSend() {
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200738 RTC_DCHECK(construction_thread_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +0200739
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700740 if (media_transport_config_.media_transport) {
741 media_transport_config_.media_transport->RemoveTargetTransferRateObserver(
742 this);
743 media_transport_config_.media_transport->SetAudioOverheadObserver(nullptr);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800744 }
745
Niels Möller530ead42018-10-04 14:28:39 +0200746 StopSend();
Niels Möller530ead42018-10-04 14:28:39 +0200747 int error = audio_coding_->RegisterTransportCallback(NULL);
748 RTC_DCHECK_EQ(0, error);
749
Niels Möller530ead42018-10-04 14:28:39 +0200750 if (_moduleProcessThreadPtr)
751 _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
Niels Möller530ead42018-10-04 14:28:39 +0200752}
753
Niels Möller26815232018-11-16 09:32:40 +0100754void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100755 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100756 RTC_DCHECK(!sending_);
757 sending_ = true;
Niels Möller530ead42018-10-04 14:28:39 +0200758
Niels Möller530ead42018-10-04 14:28:39 +0200759 _rtpRtcpModule->SetSendingMediaStatus(true);
Niels Möller26815232018-11-16 09:32:40 +0100760 int ret = _rtpRtcpModule->SetSendingStatus(true);
761 RTC_DCHECK_EQ(0, ret);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100762 // It is now OK to start processing on the encoder task queue.
763 encoder_queue_.PostTask([this] {
764 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200765 encoder_queue_is_active_ = true;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100766 });
Niels Möller530ead42018-10-04 14:28:39 +0200767}
768
769void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 15:08:13 +0100770 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100771 if (!sending_) {
Niels Möller530ead42018-10-04 14:28:39 +0200772 return;
773 }
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100774 sending_ = false;
Niels Möller530ead42018-10-04 14:28:39 +0200775
Niels Möllerc572ff32018-11-07 08:43:50 +0100776 rtc::Event flush;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100777 encoder_queue_.PostTask([this, &flush]() {
778 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller530ead42018-10-04 14:28:39 +0200779 encoder_queue_is_active_ = false;
Sebastian Jansson44dd9f22019-03-08 14:50:30 +0100780 flush.Set();
781 });
Niels Möller530ead42018-10-04 14:28:39 +0200782 flush.Wait(rtc::Event::kForever);
783
Niels Möller530ead42018-10-04 14:28:39 +0200784 // Reset sending SSRC and sequence number and triggers direct transmission
785 // of RTCP BYE
786 if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
787 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
788 }
789 _rtpRtcpModule->SetSendingMediaStatus(false);
790}
791
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100792void ChannelSend::SetEncoder(int payload_type,
Niels Möller530ead42018-10-04 14:28:39 +0200793 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 15:08:13 +0100794 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200795 RTC_DCHECK_GE(payload_type, 0);
796 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 14:28:39 +0200797
798 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
799 // as well as some other things, so we collect this info and send it along.
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100800 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type,
801 encoder->RtpTimestampRateHz());
802 rtp_sender_audio_->RegisterAudioPayload("audio", payload_type,
803 encoder->RtpTimestampRateHz(),
804 encoder->NumChannels(), 0);
Niels Möller530ead42018-10-04 14:28:39 +0200805
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700806 if (media_transport_config_.media_transport) {
Niels Möller7d76a312018-10-26 12:57:07 +0200807 rtc::CritScope cs(&media_transport_lock_);
808 media_transport_payload_type_ = payload_type;
809 // TODO(nisse): Currently broken for G722, since timestamps passed through
810 // encoder use RTP clock rather than sample count, and they differ for G722.
811 media_transport_sampling_frequency_ = encoder->RtpTimestampRateHz();
812 }
Niels Möller530ead42018-10-04 14:28:39 +0200813 audio_coding_->SetEncoder(std::move(encoder));
Niels Möller530ead42018-10-04 14:28:39 +0200814}
815
816void ChannelSend::ModifyEncoder(
817 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 15:16:06 -0800818 // This method can be called on the worker thread, module process thread
819 // or network thread. Audio coding is thread safe, so we do not need to
820 // enforce the calling thread.
Niels Möller530ead42018-10-04 14:28:39 +0200821 audio_coding_->ModifyEncoder(modifier);
822}
823
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100824void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
825 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
826 if (*encoder_ptr) {
827 modifier(encoder_ptr->get());
828 } else {
829 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
830 }
831 });
832}
833
Sebastian Jansson254d8692018-11-21 19:19:00 +0100834void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100835 // This method can be called on the worker thread, module process thread
836 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
837 // TODO(solenberg): Figure out a good way to check this or enforce calling
838 // rules.
Sebastian Janssonc01367d2019-04-08 15:20:44 +0200839 // RTC_DCHECK(worker_thread_checker_.IsCurrent() ||
840 // module_process_thread_checker_.IsCurrent());
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800841 rtc::CritScope lock(&bitrate_crit_section_);
Niels Möllerdced9f62018-11-19 10:27:07 +0100842
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100843 CallEncoder([&](AudioEncoder* encoder) {
844 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 14:28:39 +0200845 });
Sebastian Jansson254d8692018-11-21 19:19:00 +0100846 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
847 configured_bitrate_bps_ = update.target_bitrate.bps();
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200848}
849
Niels Möllerdced9f62018-11-19 10:27:07 +0100850int ChannelSend::GetBitrate() const {
Piotr (Peter) Slatala1eebec92018-11-16 09:03:35 -0800851 rtc::CritScope lock(&bitrate_crit_section_);
Sebastian Jansson359d60a2018-10-25 16:22:02 +0200852 return configured_bitrate_bps_;
Niels Möller530ead42018-10-04 14:28:39 +0200853}
854
855void ChannelSend::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100856 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200857 if (!use_twcc_plr_for_ana_)
858 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100859 CallEncoder([&](AudioEncoder* encoder) {
860 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200861 });
862}
863
864void ChannelSend::OnRecoverableUplinkPacketLossRate(
865 float recoverable_packet_loss_rate) {
Niels Möller26e88b02018-11-19 15:08:13 +0100866 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100867 CallEncoder([&](AudioEncoder* encoder) {
868 encoder->OnReceivedUplinkRecoverablePacketLossFraction(
869 recoverable_packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200870 });
871}
872
873void ChannelSend::OnUplinkPacketLossRate(float packet_loss_rate) {
874 if (use_twcc_plr_for_ana_)
875 return;
Sebastian Jansson14a7cf92019-02-13 15:11:42 +0100876 CallEncoder([&](AudioEncoder* encoder) {
877 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 14:28:39 +0200878 });
879}
880
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100881void ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Niels Möllerdced9f62018-11-19 10:27:07 +0100882 // May be called on either worker thread or network thread.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700883 if (media_transport_config_.media_transport) {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800884 // Ignore RTCP packets while media transport is used.
885 // Those packets should not arrive, but we are seeing occasional packets.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100886 return;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800887 }
888
Niels Möller530ead42018-10-04 14:28:39 +0200889 // Deliver RTCP packet to RTP/RTCP module for parsing
890 _rtpRtcpModule->IncomingRtcpPacket(data, length);
891
892 int64_t rtt = GetRTT();
893 if (rtt == 0) {
894 // Waiting for valid RTT.
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100895 return;
Niels Möller530ead42018-10-04 14:28:39 +0200896 }
897
898 int64_t nack_window_ms = rtt;
899 if (nack_window_ms < kMinRetransmissionWindowMs) {
900 nack_window_ms = kMinRetransmissionWindowMs;
901 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
902 nack_window_ms = kMaxRetransmissionWindowMs;
903 }
904 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
905
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800906 OnReceivedRtt(rtt);
Niels Möller530ead42018-10-04 14:28:39 +0200907}
908
909void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 15:08:13 +0100910 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200911 rtc::CritScope cs(&volume_settings_critsect_);
912 input_mute_ = enable;
913}
914
915bool ChannelSend::InputMute() const {
916 rtc::CritScope cs(&volume_settings_critsect_);
917 return input_mute_;
918}
919
Niels Möller26815232018-11-16 09:32:40 +0100920bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 15:08:13 +0100921 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200922 RTC_DCHECK_LE(0, event);
923 RTC_DCHECK_GE(255, event);
924 RTC_DCHECK_LE(0, duration_ms);
925 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100926 if (!sending_) {
Niels Möller26815232018-11-16 09:32:40 +0100927 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200928 }
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100929 if (rtp_sender_audio_->SendTelephoneEvent(
Niels Möller530ead42018-10-04 14:28:39 +0200930 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100931 RTC_DLOG(LS_ERROR) << "SendTelephoneEvent() failed to send event";
Niels Möller26815232018-11-16 09:32:40 +0100932 return false;
Niels Möller530ead42018-10-04 14:28:39 +0200933 }
Niels Möller26815232018-11-16 09:32:40 +0100934 return true;
Niels Möller530ead42018-10-04 14:28:39 +0200935}
936
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100937void ChannelSend::RegisterCngPayloadType(int payload_type,
938 int payload_frequency) {
939 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
940 rtp_sender_audio_->RegisterAudioPayload("CN", payload_type, payload_frequency,
941 1, 0);
942}
943
Niels Möller8fb1a6a2019-03-05 14:29:42 +0100944void ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
Niels Möller26815232018-11-16 09:32:40 +0100945 int payload_frequency) {
Niels Möller26e88b02018-11-19 15:08:13 +0100946 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200947 RTC_DCHECK_LE(0, payload_type);
948 RTC_DCHECK_GE(127, payload_type);
Niels Mölleree5ccbc2019-03-06 16:47:29 +0100949 _rtpRtcpModule->RegisterSendPayloadFrequency(payload_type, payload_frequency);
950 rtp_sender_audio_->RegisterAudioPayload("telephone-event", payload_type,
951 payload_frequency, 0, 0);
Niels Möller530ead42018-10-04 14:28:39 +0200952}
953
Niels Möllerdced9f62018-11-19 10:27:07 +0100954void ChannelSend::SetLocalSSRC(uint32_t ssrc) {
Niels Möller26e88b02018-11-19 15:08:13 +0100955 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 14:13:15 +0100956 RTC_DCHECK(!sending_);
Niels Möller26815232018-11-16 09:32:40 +0100957
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700958 if (media_transport_config_.media_transport) {
Niels Möller7d76a312018-10-26 12:57:07 +0200959 rtc::CritScope cs(&media_transport_lock_);
960 media_transport_channel_id_ = ssrc;
961 }
Niels Möller530ead42018-10-04 14:28:39 +0200962 _rtpRtcpModule->SetSSRC(ssrc);
Niels Möller530ead42018-10-04 14:28:39 +0200963}
964
Amit Hilbuch77938e62018-12-21 09:23:38 -0800965void ChannelSend::SetRid(const std::string& rid,
966 int extension_id,
967 int repaired_extension_id) {
968 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
969 if (extension_id != 0) {
970 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
971 extension_id);
972 RTC_DCHECK_EQ(0, ret);
973 }
974 if (repaired_extension_id != 0) {
975 int ret = SetSendRtpHeaderExtension(!rid.empty(), kRtpExtensionRtpStreamId,
976 repaired_extension_id);
977 RTC_DCHECK_EQ(0, ret);
978 }
979 _rtpRtcpModule->SetRid(rid);
980}
981
Niels Möller530ead42018-10-04 14:28:39 +0200982void ChannelSend::SetMid(const std::string& mid, int extension_id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100983 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200984 int ret = SetSendRtpHeaderExtension(true, kRtpExtensionMid, extension_id);
985 RTC_DCHECK_EQ(0, ret);
986 _rtpRtcpModule->SetMid(mid);
987}
988
Johannes Kron9190b822018-10-29 11:22:05 +0100989void ChannelSend::SetExtmapAllowMixed(bool extmap_allow_mixed) {
Niels Möller26e88b02018-11-19 15:08:13 +0100990 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Johannes Kron9190b822018-10-29 11:22:05 +0100991 _rtpRtcpModule->SetExtmapAllowMixed(extmap_allow_mixed);
992}
993
Niels Möller26815232018-11-16 09:32:40 +0100994void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 15:08:13 +0100995 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +0200996 _includeAudioLevelIndication = enable;
Niels Möller26815232018-11-16 09:32:40 +0100997 int ret = SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
998 RTC_DCHECK_EQ(0, ret);
Niels Möller530ead42018-10-04 14:28:39 +0200999}
1000
1001void ChannelSend::EnableSendTransportSequenceNumber(int id) {
Niels Möller26e88b02018-11-19 15:08:13 +01001002 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001003 int ret =
1004 SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
1005 RTC_DCHECK_EQ(0, ret);
1006}
1007
1008void ChannelSend::RegisterSenderCongestionControlObjects(
1009 RtpTransportControllerSendInterface* transport,
1010 RtcpBandwidthObserver* bandwidth_observer) {
Niels Möller26e88b02018-11-19 15:08:13 +01001011 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Erik Språngaa59eca2019-07-24 14:52:55 +02001012 RtpPacketSender* rtp_packet_pacer = transport->packet_sender();
Niels Möller530ead42018-10-04 14:28:39 +02001013 TransportFeedbackObserver* transport_feedback_observer =
1014 transport->transport_feedback_observer();
1015 PacketRouter* packet_router = transport->packet_router();
1016
Erik Språng59b86542019-06-23 18:24:46 +02001017 RTC_DCHECK(rtp_packet_pacer);
Niels Möller530ead42018-10-04 14:28:39 +02001018 RTC_DCHECK(transport_feedback_observer);
1019 RTC_DCHECK(packet_router);
1020 RTC_DCHECK(!packet_router_);
1021 rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
1022 feedback_observer_proxy_->SetTransportFeedbackObserver(
1023 transport_feedback_observer);
1024 seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
Erik Språng59b86542019-06-23 18:24:46 +02001025 rtp_packet_pacer_proxy_->SetPacketPacer(rtp_packet_pacer);
Niels Möller530ead42018-10-04 14:28:39 +02001026 _rtpRtcpModule->SetStorePacketsStatus(true, 600);
1027 constexpr bool remb_candidate = false;
1028 packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
1029 packet_router_ = packet_router;
1030}
1031
1032void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 15:08:13 +01001033 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001034 RTC_DCHECK(packet_router_);
1035 _rtpRtcpModule->SetStorePacketsStatus(false, 600);
1036 rtcp_observer_->SetBandwidthObserver(nullptr);
1037 feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
1038 seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
1039 packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
1040 packet_router_ = nullptr;
Erik Språng59b86542019-06-23 18:24:46 +02001041 rtp_packet_pacer_proxy_->SetPacketPacer(nullptr);
Niels Möller530ead42018-10-04 14:28:39 +02001042}
1043
Niels Möller26815232018-11-16 09:32:40 +01001044void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 15:08:13 +01001045 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001046 // Note: SetCNAME() accepts a c string of length at most 255.
1047 const std::string c_name_limited(c_name.substr(0, 255));
1048 int ret = _rtpRtcpModule->SetCNAME(c_name_limited.c_str()) != 0;
1049 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 14:28:39 +02001050}
1051
Niels Möller26815232018-11-16 09:32:40 +01001052std::vector<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001053 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001054 // Get the report blocks from the latest received RTCP Sender or Receiver
1055 // Report. Each element in the vector contains the sender's SSRC and a
1056 // report block according to RFC 3550.
1057 std::vector<RTCPReportBlock> rtcp_report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001058
Niels Möller26815232018-11-16 09:32:40 +01001059 int ret = _rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks);
1060 RTC_DCHECK_EQ(0, ret);
1061
1062 std::vector<ReportBlock> report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001063
1064 std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
1065 for (; it != rtcp_report_blocks.end(); ++it) {
1066 ReportBlock report_block;
1067 report_block.sender_SSRC = it->sender_ssrc;
1068 report_block.source_SSRC = it->source_ssrc;
1069 report_block.fraction_lost = it->fraction_lost;
1070 report_block.cumulative_num_packets_lost = it->packets_lost;
1071 report_block.extended_highest_sequence_number =
1072 it->extended_highest_sequence_number;
1073 report_block.interarrival_jitter = it->jitter;
1074 report_block.last_SR_timestamp = it->last_sender_report_timestamp;
1075 report_block.delay_since_last_SR = it->delay_since_last_sender_report;
Niels Möller26815232018-11-16 09:32:40 +01001076 report_blocks.push_back(report_block);
Niels Möller530ead42018-10-04 14:28:39 +02001077 }
Niels Möller26815232018-11-16 09:32:40 +01001078 return report_blocks;
Niels Möller530ead42018-10-04 14:28:39 +02001079}
1080
Niels Möller26815232018-11-16 09:32:40 +01001081CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001082 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 09:32:40 +01001083 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 14:28:39 +02001084 stats.rttMs = GetRTT();
1085
Henrik Boströmcf96e0f2019-04-17 13:51:53 +02001086 StreamDataCounters rtp_stats;
1087 StreamDataCounters rtx_stats;
1088 _rtpRtcpModule->GetSendStreamDataCounters(&rtp_stats, &rtx_stats);
Bjorn A Mellemda4f0932019-07-30 08:34:03 -07001089 if (use_standard_bytes_stats_) {
1090 stats.bytesSent = rtp_stats.transmitted.payload_bytes +
1091 rtx_stats.transmitted.payload_bytes;
1092 } else {
1093 stats.bytesSent = rtp_stats.transmitted.payload_bytes +
1094 rtp_stats.transmitted.padding_bytes +
1095 rtp_stats.transmitted.header_bytes +
1096 rtx_stats.transmitted.payload_bytes +
1097 rtx_stats.transmitted.padding_bytes +
1098 rtx_stats.transmitted.header_bytes;
1099 }
Henrik Boströmcf96e0f2019-04-17 13:51:53 +02001100 // TODO(https://crbug.com/webrtc/10555): RTX retransmissions should show up in
1101 // separate outbound-rtp stream objects.
1102 stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
1103 stats.packetsSent =
1104 rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
1105 stats.retransmitted_packets_sent = rtp_stats.retransmitted.packets;
Henrik Boström6e436d12019-05-27 12:19:33 +02001106 stats.report_block_datas = _rtpRtcpModule->GetLatestReportBlockData();
Niels Möller530ead42018-10-04 14:28:39 +02001107
Niels Möller26815232018-11-16 09:32:40 +01001108 return stats;
Niels Möller530ead42018-10-04 14:28:39 +02001109}
1110
Niels Möller530ead42018-10-04 14:28:39 +02001111void ChannelSend::ProcessAndEncodeAudio(
1112 std::unique_ptr<AudioFrame> audio_frame) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001113 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001114 struct ProcessAndEncodeAudio {
1115 void operator()() {
1116 RTC_DCHECK_RUN_ON(&channel->encoder_queue_);
1117 if (!channel->encoder_queue_is_active_) {
1118 return;
1119 }
1120 channel->ProcessAndEncodeAudioOnTaskQueue(audio_frame.get());
1121 }
1122 std::unique_ptr<AudioFrame> audio_frame;
1123 ChannelSend* const channel;
1124 };
Niels Möller530ead42018-10-04 14:28:39 +02001125 // Profile time between when the audio frame is added to the task queue and
1126 // when the task is actually executed.
1127 audio_frame->UpdateProfileTimeStamp();
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001128 encoder_queue_.PostTask(ProcessAndEncodeAudio{std::move(audio_frame), this});
Niels Möller530ead42018-10-04 14:28:39 +02001129}
1130
1131void ChannelSend::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
Niels Möller530ead42018-10-04 14:28:39 +02001132 RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
henrikad0679bd2019-07-09 15:37:45 +02001133 RTC_DCHECK_LE(audio_input->num_channels_, 8);
Niels Möller530ead42018-10-04 14:28:39 +02001134
1135 // Measure time between when the audio frame is added to the task queue and
1136 // when the task is actually executed. Goal is to keep track of unwanted
1137 // extra latency added by the task queue.
1138 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
1139 audio_input->ElapsedProfileTimeMs());
1140
1141 bool is_muted = InputMute();
1142 AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
1143
1144 if (_includeAudioLevelIndication) {
1145 size_t length =
1146 audio_input->samples_per_channel_ * audio_input->num_channels_;
1147 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
1148 if (is_muted && previous_frame_muted_) {
1149 rms_level_.AnalyzeMuted(length);
1150 } else {
1151 rms_level_.Analyze(
1152 rtc::ArrayView<const int16_t>(audio_input->data(), length));
1153 }
1154 }
1155 previous_frame_muted_ = is_muted;
1156
1157 // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
1158
1159 // The ACM resamples internally.
1160 audio_input->timestamp_ = _timeStamp;
1161 // This call will trigger AudioPacketizationCallback::SendData if encoding
1162 // is done and payload is ready for packetization and transmission.
1163 // Otherwise, it will return without invoking the callback.
1164 if (audio_coding_->Add10MsData(*audio_input) < 0) {
1165 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
1166 return;
1167 }
1168
1169 _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
1170}
1171
Niels Möller530ead42018-10-04 14:28:39 +02001172ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 15:08:13 +01001173 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 14:28:39 +02001174 return audio_coding_->GetANAStats();
1175}
1176
1177RtpRtcp* ChannelSend::GetRtpRtcp() const {
Sebastian Janssonc01367d2019-04-08 15:20:44 +02001178 RTC_DCHECK(module_process_thread_checker_.IsCurrent());
Niels Möller530ead42018-10-04 14:28:39 +02001179 return _rtpRtcpModule.get();
1180}
1181
1182int ChannelSend::SetSendRtpHeaderExtension(bool enable,
1183 RTPExtensionType type,
Niels Möller26815232018-11-16 09:32:40 +01001184 int id) {
Niels Möller530ead42018-10-04 14:28:39 +02001185 int error = 0;
1186 _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
1187 if (enable) {
Niels Möller26815232018-11-16 09:32:40 +01001188 // TODO(nisse): RtpRtcp::RegisterSendRtpHeaderExtension to take an int
1189 // argument. Currently it wants an uint8_t.
1190 error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(
1191 type, rtc::dchecked_cast<uint8_t>(id));
Niels Möller530ead42018-10-04 14:28:39 +02001192 }
1193 return error;
1194}
1195
Niels Möller530ead42018-10-04 14:28:39 +02001196int64_t ChannelSend::GetRTT() const {
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001197 if (media_transport_config_.media_transport) {
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001198 // GetRTT is generally used in the RTCP codepath, where media transport is
1199 // not present and so it shouldn't be needed. But it's also invoked in
1200 // 'GetStats' method, and for now returning media transport RTT here gives
1201 // us "free" rtt stats for media transport.
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001202 auto target_rate =
1203 media_transport_config_.media_transport->GetLatestTargetTransferRate();
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001204 if (target_rate.has_value()) {
1205 return target_rate.value().network_estimate.round_trip_time.ms();
1206 }
1207
1208 return 0;
1209 }
Niels Möller530ead42018-10-04 14:28:39 +02001210 RtcpMode method = _rtpRtcpModule->RTCP();
1211 if (method == RtcpMode::kOff) {
1212 return 0;
1213 }
1214 std::vector<RTCPReportBlock> report_blocks;
1215 _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
1216
1217 if (report_blocks.empty()) {
1218 return 0;
1219 }
1220
1221 int64_t rtt = 0;
1222 int64_t avg_rtt = 0;
1223 int64_t max_rtt = 0;
1224 int64_t min_rtt = 0;
1225 // We don't know in advance the remote ssrc used by the other end's receiver
1226 // reports, so use the SSRC of the first report block for calculating the RTT.
1227 if (_rtpRtcpModule->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt,
1228 &min_rtt, &max_rtt) != 0) {
1229 return 0;
1230 }
1231 return rtt;
1232}
1233
Benjamin Wright78410ad2018-10-25 09:52:57 -07001234void ChannelSend::SetFrameEncryptor(
1235 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 15:08:13 +01001236 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001237 encoder_queue_.PostTask([this, frame_encryptor]() mutable {
1238 RTC_DCHECK_RUN_ON(&encoder_queue_);
Sebastian Jansson7949f212019-03-05 13:41:48 +00001239 frame_encryptor_ = std::move(frame_encryptor);
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001240 });
Benjamin Wright84583f62018-10-04 14:22:34 -07001241}
1242
Anton Sukhanov626015d2019-02-04 15:16:06 -08001243// TODO(sukhanov): Consider moving TargetTransferRate observer to
1244// AudioSendStream. Since AudioSendStream owns encoder and configures ANA, it
1245// makes sense to consolidate all rate (and overhead) calculation there.
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001246void ChannelSend::OnTargetTransferRate(TargetTransferRate rate) {
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001247 RTC_DCHECK(media_transport_config_.media_transport);
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001248 OnReceivedRtt(rate.network_estimate.round_trip_time.ms());
1249}
1250
1251void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
1252 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 15:11:42 +01001253 CallEncoder(
1254 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -08001255}
1256
Niels Möllerdced9f62018-11-19 10:27:07 +01001257} // namespace
1258
1259std::unique_ptr<ChannelSendInterface> CreateChannelSend(
Sebastian Jansson977b3352019-03-04 17:43:34 +01001260 Clock* clock,
Sebastian Jansson44dd9f22019-03-08 14:50:30 +01001261 TaskQueueFactory* task_queue_factory,
Niels Möllerdced9f62018-11-19 10:27:07 +01001262 ProcessThread* module_process_thread,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001263 const MediaTransportConfig& media_transport_config,
Anton Sukhanov626015d2019-02-04 15:16:06 -08001264 OverheadObserver* overhead_observer,
Niels Möllere9771992018-11-26 10:55:07 +01001265 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 10:27:07 +01001266 RtcpRttStats* rtcp_rtt_stats,
1267 RtcEventLog* rtc_event_log,
1268 FrameEncryptorInterface* frame_encryptor,
1269 const webrtc::CryptoOptions& crypto_options,
1270 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +02001271 int rtcp_report_interval_ms,
1272 uint32_t ssrc) {
Niels Möllerdced9f62018-11-19 10:27:07 +01001273 return absl::make_unique<ChannelSend>(
Anton Sukhanov4f08faa2019-05-21 11:12:57 -07001274 clock, task_queue_factory, module_process_thread, media_transport_config,
Sebastian Jansson977b3352019-03-04 17:43:34 +01001275 overhead_observer, rtp_transport, rtcp_rtt_stats, rtc_event_log,
1276 frame_encryptor, crypto_options, extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 15:20:15 +02001277 rtcp_report_interval_ms, ssrc);
Niels Möllerdced9f62018-11-19 10:27:07 +01001278}
1279
Niels Möller530ead42018-10-04 14:28:39 +02001280} // namespace voe
1281} // namespace webrtc