blob: fccd58b76caa7025531b29d215637359db1f31ce [file] [log] [blame]
Niels Möller530ead42018-10-04 12:28:391/*
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
Niels Möller530ead42018-10-04 12:28:3920#include "api/array_view.h"
Niels Möllerdced9f62018-11-19 09:27:0721#include "api/call/transport.h"
Steve Anton10542f22019-01-11 17:11:0022#include "api/crypto/frame_encryptor_interface.h"
Danil Chapovalov83bbe912019-08-07 10:24:5323#include "api/rtc_event_log/rtc_event_log.h"
Artem Titovd15a5752021-02-10 13:31:2424#include "api/sequence_checker.h"
Marina Ciocea65674d82020-03-31 20:41:3025#include "audio/channel_send_frame_transformer_delegate.h"
Niels Möller530ead42018-10-04 12:28:3926#include "audio/utility/audio_frame_operations.h"
27#include "call/rtp_transport_controller_send_interface.h"
28#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
Niels Möller530ead42018-10-04 12:28:3929#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
Niels Möllerdced9f62018-11-19 09:27:0730#include "modules/audio_coding/include/audio_coding_module.h"
31#include "modules/audio_processing/rms_level.h"
Niels Möller530ead42018-10-04 12:28:3932#include "modules/pacing/packet_router.h"
Tomas Gunnarssonfae05622020-06-03 06:54:3933#include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
Niels Möller530ead42018-10-04 12:28:3934#include "rtc_base/checks.h"
Yves Gerey2e00abc2018-10-05 13:39:2435#include "rtc_base/event.h"
Niels Möller530ead42018-10-04 12:28:3936#include "rtc_base/logging.h"
Niels Möller26815232018-11-16 08:32:4037#include "rtc_base/numerics/safe_conversions.h"
Niels Möllerdced9f62018-11-19 09:27:0738#include "rtc_base/race_checker.h"
Niels Möller530ead42018-10-04 12:28:3939#include "rtc_base/rate_limiter.h"
Markus Handell62872802020-07-06 13:15:0740#include "rtc_base/synchronization/mutex.h"
Niels Möller530ead42018-10-04 12:28:3941#include "rtc_base/task_queue.h"
Steve Anton10542f22019-01-11 17:11:0042#include "rtc_base/time_utils.h"
Olga Sharonova2d0ba282022-09-27 13:22:3443#include "rtc_base/trace_event.h"
Sebastian Jansson977b3352019-03-04 16:43:3444#include "system_wrappers/include/clock.h"
Niels Möller530ead42018-10-04 12:28:3945#include "system_wrappers/include/metrics.h"
46
47namespace webrtc {
48namespace voe {
49
50namespace {
51
52constexpr int64_t kMaxRetransmissionWindowMs = 1000;
53constexpr int64_t kMinRetransmissionWindowMs = 30;
54
Niels Möllerdced9f62018-11-19 09:27:0755class RtpPacketSenderProxy;
Niels Möllerdced9f62018-11-19 09:27:0756class TransportSequenceNumberProxy;
Niels Möllerdced9f62018-11-19 09:27:0757
Benjamin Wright17b050f2019-03-14 00:35:4658class ChannelSend : public ChannelSendInterface,
Jakob Ivarssone91c9922021-07-06 07:55:4359 public AudioPacketizationCallback, // receive encoded
60 // packets from the ACM
Danil Chapovalova2cf8ee2023-05-16 11:26:3361 public RtcpPacketTypeCounterObserver,
62 public ReportBlockDataObserver {
Niels Möllerdced9f62018-11-19 09:27:0763 public:
Sebastian Jansson977b3352019-03-04 16:43:3464 ChannelSend(Clock* clock,
Sebastian Jansson44dd9f22019-03-08 13:50:3065 TaskQueueFactory* task_queue_factory,
Niels Möllere9771992018-11-26 09:55:0766 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 09:27:0767 RtcpRttStats* rtcp_rtt_stats,
68 RtcEventLog* rtc_event_log,
69 FrameEncryptorInterface* frame_encryptor,
70 const webrtc::CryptoOptions& crypto_options,
71 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 13:20:1572 int rtcp_report_interval_ms,
Marina Ciocead2aa8f92020-03-31 09:29:5673 uint32_t ssrc,
Erik Språng2b4d2f32020-06-29 14:37:4474 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Danil Chapovalova2cf8ee2023-05-16 11:26:3375 RtpTransportControllerSendInterface* transport_controller,
Jonas Orelande62c2f22022-03-29 09:04:4876 const FieldTrialsView& field_trials);
Niels Möllerdced9f62018-11-19 09:27:0777
78 ~ChannelSend() override;
79
80 // Send using this encoder, with this payload type.
Niels Möller8fb1a6a2019-03-05 13:29:4281 void SetEncoder(int payload_type,
Niels Möllerdced9f62018-11-19 09:27:0782 std::unique_ptr<AudioEncoder> encoder) override;
83 void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
84 modifier) override;
Sebastian Jansson14a7cf92019-02-13 14:11:4285 void CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) override;
Niels Möllerdced9f62018-11-19 09:27:0786
87 // API methods
Niels Möllerdced9f62018-11-19 09:27:0788 void StartSend() override;
89 void StopSend() override;
90
91 // Codecs
Sebastian Jansson254d8692018-11-21 18:19:0092 void OnBitrateAllocation(BitrateAllocationUpdate update) override;
Jakob Ivarssonbf087452021-11-11 12:43:4993 int GetTargetBitrate() const override;
Niels Möllerdced9f62018-11-19 09:27:0794
95 // Network
Niels Möller8fb1a6a2019-03-05 13:29:4296 void ReceivedRTCPPacket(const uint8_t* data, size_t length) override;
Niels Möllerdced9f62018-11-19 09:27:0797
98 // Muting, Volume and Level.
99 void SetInputMute(bool enable) override;
100
101 // Stats.
102 ANAStats GetANAStatistics() const override;
103
104 // Used by AudioSendStream.
Tomas Gunnarssonf25761d2020-06-03 20:55:33105 RtpRtcpInterface* GetRtpRtcp() const override;
Niels Möllerdced9f62018-11-19 09:27:07106
Niels Mölleree5ccbc2019-03-06 15:47:29107 void RegisterCngPayloadType(int payload_type, int payload_frequency) override;
108
Niels Möllerdced9f62018-11-19 09:27:07109 // DTMF.
110 bool SendTelephoneEventOutband(int event, int duration_ms) override;
Niels Möller8fb1a6a2019-03-05 13:29:42111 void SetSendTelephoneEventPayloadType(int payload_type,
Niels Möllerdced9f62018-11-19 09:27:07112 int payload_frequency) override;
113
114 // RTP+RTCP
Niels Möllerdced9f62018-11-19 09:27:07115 void SetSendAudioLevelIndicationStatus(bool enable, int id) override;
Niels Möllerdced9f62018-11-19 09:27:07116
117 void RegisterSenderCongestionControlObjects(
Danil Chapovalova2cf8ee2023-05-16 11:26:33118 RtpTransportControllerSendInterface* transport) override;
Niels Möllerdced9f62018-11-19 09:27:07119 void ResetSenderCongestionControlObjects() override;
120 void SetRTCP_CNAME(absl::string_view c_name) override;
Danil Chapovalova9b9d4e2023-05-03 11:20:11121 std::vector<ReportBlockData> GetRemoteRTCPReportBlocks() const override;
Niels Möllerdced9f62018-11-19 09:27:07122 CallSendStatistics GetRTCPStatistics() const override;
Niels Möllerdced9f62018-11-19 09:27:07123
124 // ProcessAndEncodeAudio() posts a task on the shared encoder task queue,
125 // which in turn calls (on the queue) ProcessAndEncodeAudioOnTaskQueue() where
126 // the actual processing of the audio takes place. The processing mainly
127 // consists of encoding and preparing the result for sending by adding it to a
128 // send queue.
129 // The main reason for using a task queue here is to release the native,
130 // OS-specific, audio capture thread as soon as possible to ensure that it
131 // can go back to sleep and be prepared to deliver an new captured audio
132 // packet.
133 void ProcessAndEncodeAudio(std::unique_ptr<AudioFrame> audio_frame) override;
134
Niels Möllerdced9f62018-11-19 09:27:07135 int64_t GetRTT() const override;
136
137 // E2EE Custom Audio Frame Encryption
138 void SetFrameEncryptor(
139 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) override;
140
Marina Ciocead2aa8f92020-03-31 09:29:56141 // Sets a frame transformer between encoder and packetizer, to transform
142 // encoded frames before sending them out the network.
143 void SetEncoderToPacketizerFrameTransformer(
144 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
145 override;
146
Jakob Ivarssone91c9922021-07-06 07:55:43147 // RtcpPacketTypeCounterObserver.
148 void RtcpPacketTypesCounterUpdated(
149 uint32_t ssrc,
150 const RtcpPacketTypeCounter& packet_counter) override;
151
Danil Chapovalova2cf8ee2023-05-16 11:26:33152 // ReportBlockDataObserver.
153 void OnReportBlockDataUpdated(ReportBlockData report_block) override;
Niels Mölleree3ad9f2022-07-18 12:56:33154
Niels Möllerdced9f62018-11-19 09:27:07155 private:
Niels Möllerdced9f62018-11-19 09:27:07156 // From AudioPacketizationCallback in the ACM
Niels Möller87e2d782019-03-07 09:18:23157 int32_t SendData(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 09:27:07158 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 12:45:50159 uint32_t rtp_timestamp,
Niels Möllerdced9f62018-11-19 09:27:07160 const uint8_t* payloadData,
Minyue Liff0e4db2020-01-23 12:45:50161 size_t payloadSize,
162 int64_t absolute_capture_timestamp_ms) override;
Niels Möllerdced9f62018-11-19 09:27:07163
Niels Möllerdced9f62018-11-19 09:27:07164 bool InputMute() const;
165
Niels Möller87e2d782019-03-07 09:18:23166 int32_t SendRtpAudio(AudioFrameType frameType,
Niels Möllerdced9f62018-11-19 09:27:07167 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 12:45:50168 uint32_t rtp_timestamp,
169 rtc::ArrayView<const uint8_t> payload,
170 int64_t absolute_capture_timestamp_ms)
Sebastian Jansson44dd9f22019-03-08 13:50:30171 RTC_RUN_ON(encoder_queue_);
Niels Möllerdced9f62018-11-19 09:27:07172
Niels Möllerdced9f62018-11-19 09:27:07173 void OnReceivedRtt(int64_t rtt_ms);
174
Marina Ciocea65674d82020-03-31 20:41:30175 void InitFrameTransformerDelegate(
176 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer);
177
Niels Möllerdced9f62018-11-19 09:27:07178 // Thread checkers document and lock usage of some methods on voe::Channel to
179 // specific threads we know about. The goal is to eventually split up
180 // voe::Channel into parts with single-threaded semantics, and thereby reduce
181 // the need for locks.
Artem Titovc8421c42021-02-02 09:57:19182 SequenceChecker worker_thread_checker_;
Niels Möllerdced9f62018-11-19 09:27:07183 // Methods accessed from audio and video threads are checked for sequential-
184 // only access. We don't necessarily own and control these threads, so thread
185 // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
186 // audio thread to another, but access is still sequential.
187 rtc::RaceChecker audio_thread_race_checker_;
188
Markus Handell62872802020-07-06 13:15:07189 mutable Mutex volume_settings_mutex_;
Niels Möllerdced9f62018-11-19 09:27:07190
Jakob Ivarssone91c9922021-07-06 07:55:43191 const uint32_t ssrc_;
Niels Möller26e88b02018-11-19 14:08:13192 bool sending_ RTC_GUARDED_BY(&worker_thread_checker_) = false;
Niels Möllerdced9f62018-11-19 09:27:07193
194 RtcEventLog* const event_log_;
195
Tomas Gunnarssonf25761d2020-06-03 20:55:33196 std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_;
Niels Mölleree5ccbc2019-03-06 15:47:29197 std::unique_ptr<RTPSenderAudio> rtp_sender_audio_;
Niels Möllerdced9f62018-11-19 09:27:07198
199 std::unique_ptr<AudioCodingModule> audio_coding_;
Niels Möllerdced9f62018-11-19 09:27:07200
Jakob Ivarsson478f3b72023-01-17 14:40:36201 // This is just an offset, RTP module will add its own random offset.
202 uint32_t timestamp_ RTC_GUARDED_BY(audio_thread_race_checker_) = 0;
Jakob Ivarssondb208312023-01-27 14:13:22203 absl::optional<int64_t> last_capture_timestamp_ms_
204 RTC_GUARDED_BY(audio_thread_race_checker_);
Jakob Ivarsson478f3b72023-01-17 14:40:36205
Niels Möllerdced9f62018-11-19 09:27:07206 RmsLevel rms_level_ RTC_GUARDED_BY(encoder_queue_);
Jakob Ivarsson478f3b72023-01-17 14:40:36207 bool input_mute_ RTC_GUARDED_BY(volume_settings_mutex_) = false;
208 bool previous_frame_muted_ RTC_GUARDED_BY(encoder_queue_) = false;
Anton Sukhanov626015d2019-02-04 23:16:06209
Niels Möller985a1f32018-11-19 15:08:42210 PacketRouter* packet_router_ RTC_GUARDED_BY(&worker_thread_checker_) =
211 nullptr;
Erik Språng59b86542019-06-23 16:24:46212 const std::unique_ptr<RtpPacketSenderProxy> rtp_packet_pacer_proxy_;
Niels Möller985a1f32018-11-19 15:08:42213 const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
Niels Möllerdced9f62018-11-19 09:27:07214
Artem Titovc8421c42021-02-02 09:57:19215 SequenceChecker construction_thread_;
Niels Möllerdced9f62018-11-19 09:27:07216
Jakob Ivarsson478f3b72023-01-17 14:40:36217 std::atomic<bool> include_audio_level_indication_ = false;
218 std::atomic<bool> encoder_queue_is_active_ = false;
Jakob Ivarssondb208312023-01-27 14:13:22219 std::atomic<bool> first_frame_ = true;
Niels Möllerdced9f62018-11-19 09:27:07220
Niels Möllerdced9f62018-11-19 09:27:07221 // E2EE Audio Frame Encryption
Sebastian Jansson44dd9f22019-03-08 13:50:30222 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor_
223 RTC_GUARDED_BY(encoder_queue_);
Niels Möllerdced9f62018-11-19 09:27:07224 // E2EE Frame Encryption Options
Niels Möller985a1f32018-11-19 15:08:42225 const webrtc::CryptoOptions crypto_options_;
Niels Möllerdced9f62018-11-19 09:27:07226
Marina Ciocea65674d82020-03-31 20:41:30227 // Delegates calls to a frame transformer to transform audio, and
228 // receives callbacks with the transformed frames; delegates calls to
229 // ChannelSend::SendRtpAudio to send the transformed audio.
230 rtc::scoped_refptr<ChannelSendFrameTransformerDelegate>
231 frame_transformer_delegate_ RTC_GUARDED_BY(encoder_queue_);
Marina Ciocead2aa8f92020-03-31 09:29:56232
Jakob Ivarssone91c9922021-07-06 07:55:43233 mutable Mutex rtcp_counter_mutex_;
234 RtcpPacketTypeCounter rtcp_packet_type_counter_
235 RTC_GUARDED_BY(rtcp_counter_mutex_);
Danil Chapovalov8a1a0af2022-04-14 14:51:35236
237 // Defined last to ensure that there are no running tasks when the other
238 // members are destroyed.
239 rtc::TaskQueue encoder_queue_;
Niels Möllerdced9f62018-11-19 09:27:07240};
Niels Möller530ead42018-10-04 12:28:39241
242const int kTelephoneEventAttenuationdB = 10;
243
Erik Språngaa59eca2019-07-24 12:52:55244class RtpPacketSenderProxy : public RtpPacketSender {
Niels Möller530ead42018-10-04 12:28:39245 public:
Erik Språng59b86542019-06-23 16:24:46246 RtpPacketSenderProxy() : rtp_packet_pacer_(nullptr) {}
Niels Möller530ead42018-10-04 12:28:39247
Erik Språngaa59eca2019-07-24 12:52:55248 void SetPacketPacer(RtpPacketSender* rtp_packet_pacer) {
Sebastian Janssonc01367d2019-04-08 13:20:44249 RTC_DCHECK(thread_checker_.IsCurrent());
Markus Handell62872802020-07-06 13:15:07250 MutexLock lock(&mutex_);
Erik Språng59b86542019-06-23 16:24:46251 rtp_packet_pacer_ = rtp_packet_pacer;
252 }
253
Erik Språngea55b082019-10-02 12:57:46254 void EnqueuePackets(
255 std::vector<std::unique_ptr<RtpPacketToSend>> packets) override {
Markus Handell62872802020-07-06 13:15:07256 MutexLock lock(&mutex_);
Erik Språngea55b082019-10-02 12:57:46257 rtp_packet_pacer_->EnqueuePackets(std::move(packets));
Niels Möller530ead42018-10-04 12:28:39258 }
259
Erik Språng1b11b582022-12-09 20:38:44260 void RemovePacketsForSsrc(uint32_t ssrc) override {
261 MutexLock lock(&mutex_);
262 rtp_packet_pacer_->RemovePacketsForSsrc(ssrc);
263 }
264
Niels Möller530ead42018-10-04 12:28:39265 private:
Artem Titovc8421c42021-02-02 09:57:19266 SequenceChecker thread_checker_;
Markus Handell62872802020-07-06 13:15:07267 Mutex mutex_;
268 RtpPacketSender* rtp_packet_pacer_ RTC_GUARDED_BY(&mutex_);
Niels Möller530ead42018-10-04 12:28:39269};
270
Niels Möller87e2d782019-03-07 09:18:23271int32_t ChannelSend::SendData(AudioFrameType frameType,
Niels Möller530ead42018-10-04 12:28:39272 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 12:45:50273 uint32_t rtp_timestamp,
Niels Möller530ead42018-10-04 12:28:39274 const uint8_t* payloadData,
Minyue Liff0e4db2020-01-23 12:45:50275 size_t payloadSize,
276 int64_t absolute_capture_timestamp_ms) {
Sebastian Jansson44dd9f22019-03-08 13:50:30277 RTC_DCHECK_RUN_ON(&encoder_queue_);
Niels Möller7d76a312018-10-26 10:57:07278 rtc::ArrayView<const uint8_t> payload(payloadData, payloadSize);
Marina Ciocea65674d82020-03-31 20:41:30279 if (frame_transformer_delegate_) {
280 // Asynchronously transform the payload before sending it. After the payload
281 // is transformed, the delegate will call SendRtpAudio to send it.
282 frame_transformer_delegate_->Transform(
Tomas Gunnarssonf25761d2020-06-03 20:55:33283 frameType, payloadType, rtp_timestamp, rtp_rtcp_->StartTimestamp(),
Philipp Hanckeb9d46852020-04-14 13:26:05284 payloadData, payloadSize, absolute_capture_timestamp_ms,
Tomas Gunnarssonf25761d2020-06-03 20:55:33285 rtp_rtcp_->SSRC());
Marina Ciocea65674d82020-03-31 20:41:30286 return 0;
287 }
Minyue Liff0e4db2020-01-23 12:45:50288 return SendRtpAudio(frameType, payloadType, rtp_timestamp, payload,
289 absolute_capture_timestamp_ms);
Niels Möller7d76a312018-10-26 10:57:07290}
291
Niels Möller87e2d782019-03-07 09:18:23292int32_t ChannelSend::SendRtpAudio(AudioFrameType frameType,
Niels Möller7d76a312018-10-26 10:57:07293 uint8_t payloadType,
Minyue Liff0e4db2020-01-23 12:45:50294 uint32_t rtp_timestamp,
295 rtc::ArrayView<const uint8_t> payload,
296 int64_t absolute_capture_timestamp_ms) {
Jakob Ivarsson478f3b72023-01-17 14:40:36297 if (include_audio_level_indication_.load()) {
Niels Mölleree5ccbc2019-03-06 15:47:29298 // Store current audio level in the RTP sender.
Niels Möller530ead42018-10-04 12:28:39299 // The level will be used in combination with voice-activity state
300 // (frameType) to add an RTP header extension
Niels Mölleree5ccbc2019-03-06 15:47:29301 rtp_sender_audio_->SetAudioLevel(rms_level_.Average());
Niels Möller530ead42018-10-04 12:28:39302 }
303
Benjamin Wright84583f62018-10-04 21:22:34304 // E2EE Custom Audio Frame Encryption (This is optional).
305 // Keep this buffer around for the lifetime of the send call.
306 rtc::Buffer encrypted_audio_payload;
Minyue Li9ab520e2019-05-28 11:27:40307 // We don't invoke encryptor if payload is empty, which means we are to send
308 // DTMF, or the encoder entered DTX.
309 // TODO(minyue): see whether DTMF packets should be encrypted or not. In
310 // current implementation, they are not.
Minyue Lif48bca72019-06-20 21:37:02311 if (!payload.empty()) {
312 if (frame_encryptor_ != nullptr) {
313 // TODO(benwright@webrtc.org) - Allocate enough to always encrypt inline.
314 // Allocate a buffer to hold the maximum possible encrypted payload.
315 size_t max_ciphertext_size = frame_encryptor_->GetMaxCiphertextByteSize(
316 cricket::MEDIA_TYPE_AUDIO, payload.size());
317 encrypted_audio_payload.SetSize(max_ciphertext_size);
Benjamin Wright84583f62018-10-04 21:22:34318
Minyue Lif48bca72019-06-20 21:37:02319 // Encrypt the audio payload into the buffer.
320 size_t bytes_written = 0;
321 int encrypt_status = frame_encryptor_->Encrypt(
Tomas Gunnarssonf25761d2020-06-03 20:55:33322 cricket::MEDIA_TYPE_AUDIO, rtp_rtcp_->SSRC(),
Minyue Lif48bca72019-06-20 21:37:02323 /*additional_data=*/nullptr, payload, encrypted_audio_payload,
324 &bytes_written);
325 if (encrypt_status != 0) {
326 RTC_DLOG(LS_ERROR)
327 << "Channel::SendData() failed encrypt audio payload: "
328 << encrypt_status;
329 return -1;
330 }
331 // Resize the buffer to the exact number of bytes actually used.
332 encrypted_audio_payload.SetSize(bytes_written);
333 // Rewrite the payloadData and size to the new encrypted payload.
334 payload = encrypted_audio_payload;
335 } else if (crypto_options_.sframe.require_frame_encryption) {
336 RTC_DLOG(LS_ERROR) << "Channel::SendData() failed sending audio payload: "
Jonas Olssonb2b20312020-01-14 11:11:31337 "A frame encryptor is required but one is not set.";
Benjamin Wright84583f62018-10-04 21:22:34338 return -1;
339 }
Benjamin Wright84583f62018-10-04 21:22:34340 }
341
Niels Möller530ead42018-10-04 12:28:39342 // Push data from ACM to RTP/RTCP-module to deliver audio frame for
343 // packetization.
Tomas Gunnarssonf25761d2020-06-03 20:55:33344 if (!rtp_rtcp_->OnSendingRtpFrame(rtp_timestamp,
345 // Leaving the time when this frame was
346 // received from the capture device as
347 // undefined for voice for now.
348 -1, payloadType,
349 /*force_sender_report=*/false)) {
Mirko Bonadeif2c08182019-11-27 07:47:51350 return -1;
Niels Mölleree5ccbc2019-03-06 15:47:29351 }
352
353 // RTCPSender has it's own copy of the timestamp offset, added in
354 // RTCPSender::BuildSR, hence we must not add the in the offset for the above
355 // call.
356 // TODO(nisse): Delete RTCPSender:timestamp_offset_, and see if we can confine
357 // knowledge of the offset to a single place.
Minyue Liff0e4db2020-01-23 12:45:50358
Niels Möller530ead42018-10-04 12:28:39359 // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
Minyue Liff0e4db2020-01-23 12:45:50360 if (!rtp_sender_audio_->SendAudio(
Tomas Gunnarssonf25761d2020-06-03 20:55:33361 frameType, payloadType, rtp_timestamp + rtp_rtcp_->StartTimestamp(),
362 payload.data(), payload.size(), absolute_capture_timestamp_ms)) {
Niels Möller530ead42018-10-04 12:28:39363 RTC_DLOG(LS_ERROR)
364 << "ChannelSend::SendData() failed to send data to RTP/RTCP module";
365 return -1;
366 }
367
368 return 0;
369}
370
Marina Ciocead2aa8f92020-03-31 09:29:56371ChannelSend::ChannelSend(
372 Clock* clock,
373 TaskQueueFactory* task_queue_factory,
Marina Ciocead2aa8f92020-03-31 09:29:56374 Transport* rtp_transport,
375 RtcpRttStats* rtcp_rtt_stats,
376 RtcEventLog* rtc_event_log,
377 FrameEncryptorInterface* frame_encryptor,
378 const webrtc::CryptoOptions& crypto_options,
379 bool extmap_allow_mixed,
380 int rtcp_report_interval_ms,
381 uint32_t ssrc,
Erik Språng2b4d2f32020-06-29 14:37:44382 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Danil Chapovalova2cf8ee2023-05-16 11:26:33383 RtpTransportControllerSendInterface* transport_controller,
Jonas Orelande62c2f22022-03-29 09:04:48384 const FieldTrialsView& field_trials)
Jakob Ivarssone91c9922021-07-06 07:55:43385 : ssrc_(ssrc),
386 event_log_(rtc_event_log),
Erik Språng59b86542019-06-23 16:24:46387 rtp_packet_pacer_proxy_(new RtpPacketSenderProxy()),
Sebastian Jansson977b3352019-03-04 16:43:34388 retransmission_rate_limiter_(
389 new RateLimiter(clock, kMaxRetransmissionWindowMs)),
Benjamin Wrightbfb444c2018-10-15 17:20:24390 frame_encryptor_(frame_encryptor),
Sebastian Jansson44dd9f22019-03-08 13:50:30391 crypto_options_(crypto_options),
392 encoder_queue_(task_queue_factory->CreateTaskQueue(
393 "AudioEncoder",
Danil Chapovalov8a1a0af2022-04-14 14:51:35394 TaskQueueFactory::Priority::NORMAL)) {
Henrik Lundin84f75692023-02-01 12:07:10395 audio_coding_ = AudioCodingModule::Create();
Niels Möller530ead42018-10-04 12:28:39396
Tomas Gunnarssonf25761d2020-06-03 20:55:33397 RtpRtcpInterface::Configuration configuration;
Danil Chapovalova2cf8ee2023-05-16 11:26:33398 configuration.report_block_data_observer = this;
Danil Chapovalov3e392542023-05-17 11:25:39399 configuration.network_link_rtcp_observer =
400 transport_controller->GetRtcpObserver();
Danil Chapovalova2cf8ee2023-05-16 11:26:33401 configuration.transport_feedback_callback =
402 transport_controller->transport_feedback_observer();
Mirko Bonadeif2c08182019-11-27 07:47:51403 configuration.clock = (clock ? clock : Clock::GetRealTimeClock());
Niels Möller530ead42018-10-04 12:28:39404 configuration.audio = true;
Fredrik Solenberg3d2ed19d2018-12-18 08:18:33405 configuration.outgoing_transport = rtp_transport;
Niels Möller530ead42018-10-04 12:28:39406
Erik Språng59b86542019-06-23 16:24:46407 configuration.paced_sender = rtp_packet_pacer_proxy_.get();
Niels Möller530ead42018-10-04 12:28:39408
409 configuration.event_log = event_log_;
410 configuration.rtt_stats = rtcp_rtt_stats;
411 configuration.retransmission_rate_limiter =
412 retransmission_rate_limiter_.get();
Johannes Kron9190b822018-10-29 10:22:05413 configuration.extmap_allow_mixed = extmap_allow_mixed;
Jiawei Ou8b5d9d82018-11-16 00:44:37414 configuration.rtcp_report_interval_ms = rtcp_report_interval_ms;
Jakob Ivarssone91c9922021-07-06 07:55:43415 configuration.rtcp_packet_type_counter_observer = this;
Niels Möller530ead42018-10-04 12:28:39416
Erik Språng54d5d2c2019-08-20 15:22:36417 configuration.local_media_ssrc = ssrc;
Erik Språng4c2c4122019-07-11 13:20:15418
Niels Moller2accc7d2021-01-12 15:54:16419 rtp_rtcp_ = ModuleRtpRtcpImpl2::Create(configuration);
Tomas Gunnarssonf25761d2020-06-03 20:55:33420 rtp_rtcp_->SetSendingMediaStatus(false);
Niels Möller530ead42018-10-04 12:28:39421
Tomas Gunnarssonf25761d2020-06-03 20:55:33422 rtp_sender_audio_ = std::make_unique<RTPSenderAudio>(configuration.clock,
423 rtp_rtcp_->RtpSender());
Niels Mölleree5ccbc2019-03-06 15:47:29424
Niels Möller530ead42018-10-04 12:28:39425 // Ensure that RTCP is enabled by default for the created channel.
Tomas Gunnarssonf25761d2020-06-03 20:55:33426 rtp_rtcp_->SetRTCPStatus(RtcpMode::kCompound);
Niels Möller530ead42018-10-04 12:28:39427
Fredrik Solenbergeb134842018-11-19 13:13:15428 int error = audio_coding_->RegisterTransportCallback(this);
Niels Möller530ead42018-10-04 12:28:39429 RTC_DCHECK_EQ(0, error);
Marina Ciocea65674d82020-03-31 20:41:30430 if (frame_transformer)
431 InitFrameTransformerDelegate(std::move(frame_transformer));
Niels Möller530ead42018-10-04 12:28:39432}
433
Fredrik Solenberg645a3af2018-11-16 11:51:15434ChannelSend::~ChannelSend() {
Sebastian Janssonc01367d2019-04-08 13:20:44435 RTC_DCHECK(construction_thread_.IsCurrent());
Niels Möller530ead42018-10-04 12:28:39436
Marina Ciocea65674d82020-03-31 20:41:30437 // Resets the delegate's callback to ChannelSend::SendRtpAudio.
438 if (frame_transformer_delegate_)
439 frame_transformer_delegate_->Reset();
440
Niels Möller530ead42018-10-04 12:28:39441 StopSend();
Niels Möller530ead42018-10-04 12:28:39442 int error = audio_coding_->RegisterTransportCallback(NULL);
443 RTC_DCHECK_EQ(0, error);
Niels Möller530ead42018-10-04 12:28:39444}
445
Niels Möller26815232018-11-16 08:32:40446void ChannelSend::StartSend() {
Niels Möller26e88b02018-11-19 14:08:13447 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 13:13:15448 RTC_DCHECK(!sending_);
449 sending_ = true;
Niels Möller530ead42018-10-04 12:28:39450
Erik Språng69dd1422021-08-12 14:15:00451 RTC_DCHECK(packet_router_);
452 packet_router_->AddSendRtpModule(rtp_rtcp_.get(), /*remb_candidate=*/false);
Tomas Gunnarssonf25761d2020-06-03 20:55:33453 rtp_rtcp_->SetSendingMediaStatus(true);
454 int ret = rtp_rtcp_->SetSendingStatus(true);
Niels Möller26815232018-11-16 08:32:40455 RTC_DCHECK_EQ(0, ret);
Erik Språng69dd1422021-08-12 14:15:00456
Sebastian Jansson44dd9f22019-03-08 13:50:30457 // It is now OK to start processing on the encoder task queue.
Jakob Ivarssondb208312023-01-27 14:13:22458 first_frame_.store(true);
Jakob Ivarsson478f3b72023-01-17 14:40:36459 encoder_queue_is_active_.store(true);
Niels Möller530ead42018-10-04 12:28:39460}
461
462void ChannelSend::StopSend() {
Niels Möller26e88b02018-11-19 14:08:13463 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Fredrik Solenbergeb134842018-11-19 13:13:15464 if (!sending_) {
Niels Möller530ead42018-10-04 12:28:39465 return;
466 }
Fredrik Solenbergeb134842018-11-19 13:13:15467 sending_ = false;
Jakob Ivarsson478f3b72023-01-17 14:40:36468 encoder_queue_is_active_.store(false);
Niels Möller530ead42018-10-04 12:28:39469
Jakob Ivarssondcb09ff2023-01-25 19:03:56470 // Wait until all pending encode tasks are executed and clear any remaining
471 // buffers in the encoder.
Niels Möllerc572ff32018-11-07 07:43:50472 rtc::Event flush;
Sebastian Jansson44dd9f22019-03-08 13:50:30473 encoder_queue_.PostTask([this, &flush]() {
474 RTC_DCHECK_RUN_ON(&encoder_queue_);
Jakob Ivarssondcb09ff2023-01-25 19:03:56475 CallEncoder([](AudioEncoder* encoder) { encoder->Reset(); });
Sebastian Jansson44dd9f22019-03-08 13:50:30476 flush.Set();
477 });
Niels Möller530ead42018-10-04 12:28:39478 flush.Wait(rtc::Event::kForever);
479
Niels Möller530ead42018-10-04 12:28:39480 // Reset sending SSRC and sequence number and triggers direct transmission
481 // of RTCP BYE
Tomas Gunnarssonf25761d2020-06-03 20:55:33482 if (rtp_rtcp_->SetSendingStatus(false) == -1) {
Niels Möller530ead42018-10-04 12:28:39483 RTC_DLOG(LS_ERROR) << "StartSend() RTP/RTCP failed to stop sending";
484 }
Tomas Gunnarssonf25761d2020-06-03 20:55:33485 rtp_rtcp_->SetSendingMediaStatus(false);
Erik Språng69dd1422021-08-12 14:15:00486
487 RTC_DCHECK(packet_router_);
488 packet_router_->RemoveSendRtpModule(rtp_rtcp_.get());
Erik Språng1b11b582022-12-09 20:38:44489 rtp_packet_pacer_proxy_->RemovePacketsForSsrc(rtp_rtcp_->SSRC());
Niels Möller530ead42018-10-04 12:28:39490}
491
Niels Möller8fb1a6a2019-03-05 13:29:42492void ChannelSend::SetEncoder(int payload_type,
Niels Möller530ead42018-10-04 12:28:39493 std::unique_ptr<AudioEncoder> encoder) {
Niels Möller26e88b02018-11-19 14:08:13494 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 12:28:39495 RTC_DCHECK_GE(payload_type, 0);
496 RTC_DCHECK_LE(payload_type, 127);
Niels Möller530ead42018-10-04 12:28:39497
498 // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
499 // as well as some other things, so we collect this info and send it along.
Tomas Gunnarssonf25761d2020-06-03 20:55:33500 rtp_rtcp_->RegisterSendPayloadFrequency(payload_type,
501 encoder->RtpTimestampRateHz());
Niels Mölleree5ccbc2019-03-06 15:47:29502 rtp_sender_audio_->RegisterAudioPayload("audio", payload_type,
503 encoder->RtpTimestampRateHz(),
504 encoder->NumChannels(), 0);
Niels Möller530ead42018-10-04 12:28:39505
506 audio_coding_->SetEncoder(std::move(encoder));
Niels Möller530ead42018-10-04 12:28:39507}
508
509void ChannelSend::ModifyEncoder(
510 rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
Anton Sukhanov626015d2019-02-04 23:16:06511 // This method can be called on the worker thread, module process thread
512 // or network thread. Audio coding is thread safe, so we do not need to
513 // enforce the calling thread.
Niels Möller530ead42018-10-04 12:28:39514 audio_coding_->ModifyEncoder(modifier);
515}
516
Sebastian Jansson14a7cf92019-02-13 14:11:42517void ChannelSend::CallEncoder(rtc::FunctionView<void(AudioEncoder*)> modifier) {
518 ModifyEncoder([modifier](std::unique_ptr<AudioEncoder>* encoder_ptr) {
519 if (*encoder_ptr) {
520 modifier(encoder_ptr->get());
521 } else {
522 RTC_DLOG(LS_WARNING) << "Trying to call unset encoder.";
523 }
524 });
525}
526
Sebastian Jansson254d8692018-11-21 18:19:00527void ChannelSend::OnBitrateAllocation(BitrateAllocationUpdate update) {
Niels Möllerdced9f62018-11-19 09:27:07528 // This method can be called on the worker thread, module process thread
529 // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
530 // TODO(solenberg): Figure out a good way to check this or enforce calling
531 // rules.
Sebastian Janssonc01367d2019-04-08 13:20:44532 // RTC_DCHECK(worker_thread_checker_.IsCurrent() ||
533 // module_process_thread_checker_.IsCurrent());
Sebastian Jansson14a7cf92019-02-13 14:11:42534 CallEncoder([&](AudioEncoder* encoder) {
535 encoder->OnReceivedUplinkAllocation(update);
Niels Möller530ead42018-10-04 12:28:39536 });
Sebastian Jansson254d8692018-11-21 18:19:00537 retransmission_rate_limiter_->SetMaxRate(update.target_bitrate.bps());
Sebastian Jansson359d60a2018-10-25 14:22:02538}
539
Jakob Ivarssonbf087452021-11-11 12:43:49540int ChannelSend::GetTargetBitrate() const {
541 return audio_coding_->GetTargetBitrate();
Niels Möller530ead42018-10-04 12:28:39542}
543
Danil Chapovalova2cf8ee2023-05-16 11:26:33544void ChannelSend::OnReportBlockDataUpdated(ReportBlockData report_block) {
545 float packet_loss_rate = report_block.fraction_lost();
Sebastian Jansson14a7cf92019-02-13 14:11:42546 CallEncoder([&](AudioEncoder* encoder) {
547 encoder->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
Niels Möller530ead42018-10-04 12:28:39548 });
549}
550
Niels Möller8fb1a6a2019-03-05 13:29:42551void ChannelSend::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
Erik Språng2b4d2f32020-06-29 14:37:44552 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
553
Niels Möller530ead42018-10-04 12:28:39554 // Deliver RTCP packet to RTP/RTCP module for parsing
Harald Alvestrand1f206b82023-02-01 11:12:46555 rtp_rtcp_->IncomingRtcpPacket(rtc::MakeArrayView(data, length));
Niels Möller530ead42018-10-04 12:28:39556
557 int64_t rtt = GetRTT();
558 if (rtt == 0) {
559 // Waiting for valid RTT.
Niels Möller8fb1a6a2019-03-05 13:29:42560 return;
Niels Möller530ead42018-10-04 12:28:39561 }
562
563 int64_t nack_window_ms = rtt;
564 if (nack_window_ms < kMinRetransmissionWindowMs) {
565 nack_window_ms = kMinRetransmissionWindowMs;
566 } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
567 nack_window_ms = kMaxRetransmissionWindowMs;
568 }
569 retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
570
Piotr (Peter) Slatala179a3922018-11-16 17:57:58571 OnReceivedRtt(rtt);
Niels Möller530ead42018-10-04 12:28:39572}
573
574void ChannelSend::SetInputMute(bool enable) {
Niels Möller26e88b02018-11-19 14:08:13575 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Markus Handell62872802020-07-06 13:15:07576 MutexLock lock(&volume_settings_mutex_);
Niels Möller530ead42018-10-04 12:28:39577 input_mute_ = enable;
578}
579
580bool ChannelSend::InputMute() const {
Markus Handell62872802020-07-06 13:15:07581 MutexLock lock(&volume_settings_mutex_);
Niels Möller530ead42018-10-04 12:28:39582 return input_mute_;
583}
584
Niels Möller26815232018-11-16 08:32:40585bool ChannelSend::SendTelephoneEventOutband(int event, int duration_ms) {
Niels Möller26e88b02018-11-19 14:08:13586 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 12:28:39587 RTC_DCHECK_LE(0, event);
588 RTC_DCHECK_GE(255, event);
589 RTC_DCHECK_LE(0, duration_ms);
590 RTC_DCHECK_GE(65535, duration_ms);
Fredrik Solenbergeb134842018-11-19 13:13:15591 if (!sending_) {
Niels Möller26815232018-11-16 08:32:40592 return false;
Niels Möller530ead42018-10-04 12:28:39593 }
Niels Mölleree5ccbc2019-03-06 15:47:29594 if (rtp_sender_audio_->SendTelephoneEvent(
Niels Möller530ead42018-10-04 12:28:39595 event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
Niels Mölleree5ccbc2019-03-06 15:47:29596 RTC_DLOG(LS_ERROR) << "SendTelephoneEvent() failed to send event";
Niels Möller26815232018-11-16 08:32:40597 return false;
Niels Möller530ead42018-10-04 12:28:39598 }
Niels Möller26815232018-11-16 08:32:40599 return true;
Niels Möller530ead42018-10-04 12:28:39600}
601
Niels Mölleree5ccbc2019-03-06 15:47:29602void ChannelSend::RegisterCngPayloadType(int payload_type,
603 int payload_frequency) {
Tomas Gunnarssonf25761d2020-06-03 20:55:33604 rtp_rtcp_->RegisterSendPayloadFrequency(payload_type, payload_frequency);
Niels Mölleree5ccbc2019-03-06 15:47:29605 rtp_sender_audio_->RegisterAudioPayload("CN", payload_type, payload_frequency,
606 1, 0);
607}
608
Niels Möller8fb1a6a2019-03-05 13:29:42609void ChannelSend::SetSendTelephoneEventPayloadType(int payload_type,
Niels Möller26815232018-11-16 08:32:40610 int payload_frequency) {
Niels Möller26e88b02018-11-19 14:08:13611 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 12:28:39612 RTC_DCHECK_LE(0, payload_type);
613 RTC_DCHECK_GE(127, payload_type);
Tomas Gunnarssonf25761d2020-06-03 20:55:33614 rtp_rtcp_->RegisterSendPayloadFrequency(payload_type, payload_frequency);
Niels Mölleree5ccbc2019-03-06 15:47:29615 rtp_sender_audio_->RegisterAudioPayload("telephone-event", payload_type,
616 payload_frequency, 0, 0);
Niels Möller530ead42018-10-04 12:28:39617}
618
Niels Möller26815232018-11-16 08:32:40619void ChannelSend::SetSendAudioLevelIndicationStatus(bool enable, int id) {
Niels Möller26e88b02018-11-19 14:08:13620 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Jakob Ivarsson478f3b72023-01-17 14:40:36621 include_audio_level_indication_.store(enable);
Sebastian Jansson6298b562020-01-14 16:55:19622 if (enable) {
Danil Chapovalovd0321c52021-09-14 10:58:51623 rtp_rtcp_->RegisterRtpHeaderExtension(AudioLevel::Uri(), id);
Sebastian Jansson6298b562020-01-14 16:55:19624 } else {
Danil Chapovalovd0321c52021-09-14 10:58:51625 rtp_rtcp_->DeregisterSendRtpHeaderExtension(AudioLevel::Uri());
Sebastian Jansson6298b562020-01-14 16:55:19626 }
Niels Möller530ead42018-10-04 12:28:39627}
628
629void ChannelSend::RegisterSenderCongestionControlObjects(
Danil Chapovalova2cf8ee2023-05-16 11:26:33630 RtpTransportControllerSendInterface* transport) {
Niels Möller26e88b02018-11-19 14:08:13631 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Erik Språngaa59eca2019-07-24 12:52:55632 RtpPacketSender* rtp_packet_pacer = transport->packet_sender();
Niels Möller530ead42018-10-04 12:28:39633 PacketRouter* packet_router = transport->packet_router();
634
Erik Språng59b86542019-06-23 16:24:46635 RTC_DCHECK(rtp_packet_pacer);
Niels Möller530ead42018-10-04 12:28:39636 RTC_DCHECK(packet_router);
637 RTC_DCHECK(!packet_router_);
Erik Språng59b86542019-06-23 16:24:46638 rtp_packet_pacer_proxy_->SetPacketPacer(rtp_packet_pacer);
Tomas Gunnarssonf25761d2020-06-03 20:55:33639 rtp_rtcp_->SetStorePacketsStatus(true, 600);
Niels Möller530ead42018-10-04 12:28:39640 packet_router_ = packet_router;
641}
642
643void ChannelSend::ResetSenderCongestionControlObjects() {
Niels Möller26e88b02018-11-19 14:08:13644 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 12:28:39645 RTC_DCHECK(packet_router_);
Tomas Gunnarssonf25761d2020-06-03 20:55:33646 rtp_rtcp_->SetStorePacketsStatus(false, 600);
Niels Möller530ead42018-10-04 12:28:39647 packet_router_ = nullptr;
Erik Språng59b86542019-06-23 16:24:46648 rtp_packet_pacer_proxy_->SetPacketPacer(nullptr);
Niels Möller530ead42018-10-04 12:28:39649}
650
Niels Möller26815232018-11-16 08:32:40651void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) {
Niels Möller26e88b02018-11-19 14:08:13652 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 08:32:40653 // Note: SetCNAME() accepts a c string of length at most 255.
654 const std::string c_name_limited(c_name.substr(0, 255));
Tomas Gunnarssonf25761d2020-06-03 20:55:33655 int ret = rtp_rtcp_->SetCNAME(c_name_limited.c_str()) != 0;
Niels Möller26815232018-11-16 08:32:40656 RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME";
Niels Möller530ead42018-10-04 12:28:39657}
658
Danil Chapovalova9b9d4e2023-05-03 11:20:11659std::vector<ReportBlockData> ChannelSend::GetRemoteRTCPReportBlocks() const {
Niels Möller26e88b02018-11-19 14:08:13660 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 12:28:39661 // Get the report blocks from the latest received RTCP Sender or Receiver
662 // Report. Each element in the vector contains the sender's SSRC and a
663 // report block according to RFC 3550.
Danil Chapovalova9b9d4e2023-05-03 11:20:11664 return rtp_rtcp_->GetLatestReportBlockData();
Niels Möller530ead42018-10-04 12:28:39665}
666
Niels Möller26815232018-11-16 08:32:40667CallSendStatistics ChannelSend::GetRTCPStatistics() const {
Niels Möller26e88b02018-11-19 14:08:13668 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller26815232018-11-16 08:32:40669 CallSendStatistics stats = {0};
Niels Möller530ead42018-10-04 12:28:39670 stats.rttMs = GetRTT();
671
Henrik Boströmcf96e0f2019-04-17 11:51:53672 StreamDataCounters rtp_stats;
673 StreamDataCounters rtx_stats;
Tomas Gunnarssonf25761d2020-06-03 20:55:33674 rtp_rtcp_->GetSendStreamDataCounters(&rtp_stats, &rtx_stats);
Niels Möllerac0a4cb2019-10-09 13:01:33675 stats.payload_bytes_sent =
676 rtp_stats.transmitted.payload_bytes + rtx_stats.transmitted.payload_bytes;
677 stats.header_and_padding_bytes_sent =
678 rtp_stats.transmitted.padding_bytes + rtp_stats.transmitted.header_bytes +
679 rtx_stats.transmitted.padding_bytes + rtx_stats.transmitted.header_bytes;
680
Henrik Boströmcf96e0f2019-04-17 11:51:53681 // TODO(https://crbug.com/webrtc/10555): RTX retransmissions should show up in
682 // separate outbound-rtp stream objects.
683 stats.retransmitted_bytes_sent = rtp_stats.retransmitted.payload_bytes;
684 stats.packetsSent =
685 rtp_stats.transmitted.packets + rtx_stats.transmitted.packets;
Henrik Boströmaebba7b2022-10-26 14:53:03686 stats.total_packet_send_delay = rtp_stats.transmitted.total_packet_delay;
Henrik Boströmcf96e0f2019-04-17 11:51:53687 stats.retransmitted_packets_sent = rtp_stats.retransmitted.packets;
Tomas Gunnarssonf25761d2020-06-03 20:55:33688 stats.report_block_datas = rtp_rtcp_->GetLatestReportBlockData();
Niels Möller530ead42018-10-04 12:28:39689
Jakob Ivarssone91c9922021-07-06 07:55:43690 {
691 MutexLock lock(&rtcp_counter_mutex_);
Philipp Hancke6a7bf102023-04-21 17:32:42692 stats.nacks_received = rtcp_packet_type_counter_.nack_packets;
Jakob Ivarssone91c9922021-07-06 07:55:43693 }
694
Niels Möller26815232018-11-16 08:32:40695 return stats;
Niels Möller530ead42018-10-04 12:28:39696}
697
Jakob Ivarssone91c9922021-07-06 07:55:43698void ChannelSend::RtcpPacketTypesCounterUpdated(
699 uint32_t ssrc,
700 const RtcpPacketTypeCounter& packet_counter) {
701 if (ssrc != ssrc_) {
702 return;
703 }
704 MutexLock lock(&rtcp_counter_mutex_);
705 rtcp_packet_type_counter_ = packet_counter;
706}
707
Niels Möller530ead42018-10-04 12:28:39708void ChannelSend::ProcessAndEncodeAudio(
709 std::unique_ptr<AudioFrame> audio_frame) {
Olga Sharonova2d0ba282022-09-27 13:22:34710 TRACE_EVENT0("webrtc", "ChannelSend::ProcessAndEncodeAudio");
711
Niels Möllerdced9f62018-11-19 09:27:07712 RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
Sebastian Janssonee5ec9a2019-09-17 18:34:03713 RTC_DCHECK_GT(audio_frame->samples_per_channel_, 0);
714 RTC_DCHECK_LE(audio_frame->num_channels_, 8);
715
Jakob Ivarsson478f3b72023-01-17 14:40:36716 if (!encoder_queue_is_active_.load()) {
717 return;
718 }
719
Jakob Ivarssondb208312023-01-27 14:13:22720 // Update `timestamp_` based on the capture timestamp for the first frame
721 // after sending is resumed.
722 if (first_frame_.load()) {
723 first_frame_.store(false);
724 if (last_capture_timestamp_ms_ &&
725 audio_frame->absolute_capture_timestamp_ms()) {
726 int64_t diff_ms = *audio_frame->absolute_capture_timestamp_ms() -
727 *last_capture_timestamp_ms_;
728 // Truncate to whole frames and subtract one since `timestamp_` was
729 // incremented after the last frame.
730 int64_t diff_frames = diff_ms * audio_frame->sample_rate_hz() / 1000 /
731 audio_frame->samples_per_channel() -
732 1;
733 timestamp_ += std::max<int64_t>(
734 diff_frames * audio_frame->samples_per_channel(), 0);
735 }
736 }
737
738 audio_frame->timestamp_ = timestamp_;
739 timestamp_ += audio_frame->samples_per_channel_;
740 last_capture_timestamp_ms_ = audio_frame->absolute_capture_timestamp_ms();
741
Niels Möller530ead42018-10-04 12:28:39742 // Profile time between when the audio frame is added to the task queue and
743 // when the task is actually executed.
744 audio_frame->UpdateProfileTimeStamp();
Sebastian Janssonee5ec9a2019-09-17 18:34:03745 encoder_queue_.PostTask(
746 [this, audio_frame = std::move(audio_frame)]() mutable {
747 RTC_DCHECK_RUN_ON(&encoder_queue_);
Jakob Ivarsson478f3b72023-01-17 14:40:36748 if (!encoder_queue_is_active_.load()) {
Sebastian Janssonee5ec9a2019-09-17 18:34:03749 return;
750 }
751 // Measure time between when the audio frame is added to the task queue
752 // and when the task is actually executed. Goal is to keep track of
753 // unwanted extra latency added by the task queue.
754 RTC_HISTOGRAM_COUNTS_10000("WebRTC.Audio.EncodingTaskQueueLatencyMs",
755 audio_frame->ElapsedProfileTimeMs());
Niels Möller530ead42018-10-04 12:28:39756
Sebastian Janssonee5ec9a2019-09-17 18:34:03757 bool is_muted = InputMute();
758 AudioFrameOperations::Mute(audio_frame.get(), previous_frame_muted_,
759 is_muted);
Niels Möller530ead42018-10-04 12:28:39760
Jakob Ivarsson478f3b72023-01-17 14:40:36761 if (include_audio_level_indication_.load()) {
Sebastian Janssonee5ec9a2019-09-17 18:34:03762 size_t length =
763 audio_frame->samples_per_channel_ * audio_frame->num_channels_;
764 RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
765 if (is_muted && previous_frame_muted_) {
766 rms_level_.AnalyzeMuted(length);
767 } else {
768 rms_level_.Analyze(
769 rtc::ArrayView<const int16_t>(audio_frame->data(), length));
770 }
771 }
772 previous_frame_muted_ = is_muted;
Niels Möller530ead42018-10-04 12:28:39773
Sebastian Janssonee5ec9a2019-09-17 18:34:03774 // This call will trigger AudioPacketizationCallback::SendData if
775 // encoding is done and payload is ready for packetization and
776 // transmission. Otherwise, it will return without invoking the
777 // callback.
778 if (audio_coding_->Add10MsData(*audio_frame) < 0) {
779 RTC_DLOG(LS_ERROR) << "ACM::Add10MsData() failed.";
780 return;
781 }
Sebastian Janssonee5ec9a2019-09-17 18:34:03782 });
Niels Möller530ead42018-10-04 12:28:39783}
784
Niels Möller530ead42018-10-04 12:28:39785ANAStats ChannelSend::GetANAStatistics() const {
Niels Möller26e88b02018-11-19 14:08:13786 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Niels Möller530ead42018-10-04 12:28:39787 return audio_coding_->GetANAStats();
788}
789
Tomas Gunnarssonf25761d2020-06-03 20:55:33790RtpRtcpInterface* ChannelSend::GetRtpRtcp() const {
Tomas Gunnarssonf25761d2020-06-03 20:55:33791 return rtp_rtcp_.get();
Niels Möller530ead42018-10-04 12:28:39792}
793
Niels Möller530ead42018-10-04 12:28:39794int64_t ChannelSend::GetRTT() const {
Danil Chapovalov5eda59c2021-02-18 19:53:28795 std::vector<ReportBlockData> report_blocks =
796 rtp_rtcp_->GetLatestReportBlockData();
Niels Möller530ead42018-10-04 12:28:39797 if (report_blocks.empty()) {
798 return 0;
799 }
800
Niels Möller530ead42018-10-04 12:28:39801 // We don't know in advance the remote ssrc used by the other end's receiver
Danil Chapovalov5eda59c2021-02-18 19:53:28802 // reports, so use the first report block for the RTT.
Danil Chapovalovec2670e2023-04-12 11:11:21803 return report_blocks.front().last_rtt().ms();
Niels Möller530ead42018-10-04 12:28:39804}
805
Benjamin Wright78410ad2018-10-25 16:52:57806void ChannelSend::SetFrameEncryptor(
807 rtc::scoped_refptr<FrameEncryptorInterface> frame_encryptor) {
Niels Möller26e88b02018-11-19 14:08:13808 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Sebastian Jansson44dd9f22019-03-08 13:50:30809 encoder_queue_.PostTask([this, frame_encryptor]() mutable {
810 RTC_DCHECK_RUN_ON(&encoder_queue_);
Sebastian Jansson7949f212019-03-05 13:41:48811 frame_encryptor_ = std::move(frame_encryptor);
Sebastian Jansson44dd9f22019-03-08 13:50:30812 });
Benjamin Wright84583f62018-10-04 21:22:34813}
814
Marina Ciocead2aa8f92020-03-31 09:29:56815void ChannelSend::SetEncoderToPacketizerFrameTransformer(
816 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
817 RTC_DCHECK_RUN_ON(&worker_thread_checker_);
Marina Ciocea65674d82020-03-31 20:41:30818 if (!frame_transformer)
819 return;
820
Marina Ciocead2aa8f92020-03-31 09:29:56821 encoder_queue_.PostTask(
822 [this, frame_transformer = std::move(frame_transformer)]() mutable {
823 RTC_DCHECK_RUN_ON(&encoder_queue_);
Marina Ciocea65674d82020-03-31 20:41:30824 InitFrameTransformerDelegate(std::move(frame_transformer));
Marina Ciocead2aa8f92020-03-31 09:29:56825 });
826}
827
Piotr (Peter) Slatala179a3922018-11-16 17:57:58828void ChannelSend::OnReceivedRtt(int64_t rtt_ms) {
829 // Invoke audio encoders OnReceivedRtt().
Sebastian Jansson14a7cf92019-02-13 14:11:42830 CallEncoder(
831 [rtt_ms](AudioEncoder* encoder) { encoder->OnReceivedRtt(rtt_ms); });
Piotr (Peter) Slatala179a3922018-11-16 17:57:58832}
833
Marina Ciocea65674d82020-03-31 20:41:30834void ChannelSend::InitFrameTransformerDelegate(
835 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
836 RTC_DCHECK_RUN_ON(&encoder_queue_);
837 RTC_DCHECK(frame_transformer);
838 RTC_DCHECK(!frame_transformer_delegate_);
839
840 // Pass a callback to ChannelSend::SendRtpAudio, to be called by the delegate
841 // to send the transformed audio.
842 ChannelSendFrameTransformerDelegate::SendFrameCallback send_audio_callback =
843 [this](AudioFrameType frameType, uint8_t payloadType,
844 uint32_t rtp_timestamp, rtc::ArrayView<const uint8_t> payload,
845 int64_t absolute_capture_timestamp_ms) {
846 RTC_DCHECK_RUN_ON(&encoder_queue_);
847 return SendRtpAudio(frameType, payloadType, rtp_timestamp, payload,
848 absolute_capture_timestamp_ms);
849 };
850 frame_transformer_delegate_ =
Tomas Gunnarssonc1d58912021-04-22 17:21:43851 rtc::make_ref_counted<ChannelSendFrameTransformerDelegate>(
Marina Ciocea65674d82020-03-31 20:41:30852 std::move(send_audio_callback), std::move(frame_transformer),
853 &encoder_queue_);
854 frame_transformer_delegate_->Init();
855}
856
Niels Möllerdced9f62018-11-19 09:27:07857} // namespace
858
859std::unique_ptr<ChannelSendInterface> CreateChannelSend(
Sebastian Jansson977b3352019-03-04 16:43:34860 Clock* clock,
Sebastian Jansson44dd9f22019-03-08 13:50:30861 TaskQueueFactory* task_queue_factory,
Niels Möllere9771992018-11-26 09:55:07862 Transport* rtp_transport,
Niels Möllerdced9f62018-11-19 09:27:07863 RtcpRttStats* rtcp_rtt_stats,
864 RtcEventLog* rtc_event_log,
865 FrameEncryptorInterface* frame_encryptor,
866 const webrtc::CryptoOptions& crypto_options,
867 bool extmap_allow_mixed,
Erik Språng4c2c4122019-07-11 13:20:15868 int rtcp_report_interval_ms,
Marina Ciocead2aa8f92020-03-31 09:29:56869 uint32_t ssrc,
Erik Språng2b4d2f32020-06-29 14:37:44870 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
Danil Chapovalova2cf8ee2023-05-16 11:26:33871 RtpTransportControllerSendInterface* transport_controller,
Jonas Orelande62c2f22022-03-29 09:04:48872 const FieldTrialsView& field_trials) {
Mirko Bonadei317a1f02019-09-17 15:06:18873 return std::make_unique<ChannelSend>(
Markus Handelleb61b7f2021-06-22 08:46:48874 clock, task_queue_factory, rtp_transport, rtcp_rtt_stats, rtc_event_log,
875 frame_encryptor, crypto_options, extmap_allow_mixed,
876 rtcp_report_interval_ms, ssrc, std::move(frame_transformer),
Danil Chapovalova2cf8ee2023-05-16 11:26:33877 transport_controller, field_trials);
Niels Möllerdced9f62018-11-19 09:27:07878}
879
Niels Möller530ead42018-10-04 12:28:39880} // namespace voe
881} // namespace webrtc