xref: /aosp_15_r20/external/webrtc/audio/audio_send_stream.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef AUDIO_AUDIO_SEND_STREAM_H_
12*d9f75844SAndroid Build Coastguard Worker #define AUDIO_AUDIO_SEND_STREAM_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker #include <utility>
16*d9f75844SAndroid Build Coastguard Worker #include <vector>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "absl/functional/any_invocable.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h"
22*d9f75844SAndroid Build Coastguard Worker #include "audio/audio_level.h"
23*d9f75844SAndroid Build Coastguard Worker #include "audio/channel_send.h"
24*d9f75844SAndroid Build Coastguard Worker #include "call/audio_send_stream.h"
25*d9f75844SAndroid Build Coastguard Worker #include "call/audio_state.h"
26*d9f75844SAndroid Build Coastguard Worker #include "call/bitrate_allocator.h"
27*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
28*d9f75844SAndroid Build Coastguard Worker #include "modules/utility/maybe_worker_thread.h"
29*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/experiments/struct_parameters_parser.h"
30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/race_checker.h"
31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/task_queue.h"
33*d9f75844SAndroid Build Coastguard Worker 
34*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
35*d9f75844SAndroid Build Coastguard Worker class RtcEventLog;
36*d9f75844SAndroid Build Coastguard Worker class RtcpBandwidthObserver;
37*d9f75844SAndroid Build Coastguard Worker class RtcpRttStats;
38*d9f75844SAndroid Build Coastguard Worker class RtpTransportControllerSendInterface;
39*d9f75844SAndroid Build Coastguard Worker 
40*d9f75844SAndroid Build Coastguard Worker struct AudioAllocationConfig {
41*d9f75844SAndroid Build Coastguard Worker   static constexpr char kKey[] = "WebRTC-Audio-Allocation";
42*d9f75844SAndroid Build Coastguard Worker   // Field Trial configured bitrates to use as overrides over default/user
43*d9f75844SAndroid Build Coastguard Worker   // configured bitrate range when audio bitrate allocation is enabled.
44*d9f75844SAndroid Build Coastguard Worker   absl::optional<DataRate> min_bitrate;
45*d9f75844SAndroid Build Coastguard Worker   absl::optional<DataRate> max_bitrate;
46*d9f75844SAndroid Build Coastguard Worker   DataRate priority_bitrate = DataRate::Zero();
47*d9f75844SAndroid Build Coastguard Worker   // By default the priority_bitrate is compensated for packet overhead.
48*d9f75844SAndroid Build Coastguard Worker   // Use this flag to configure a raw value instead.
49*d9f75844SAndroid Build Coastguard Worker   absl::optional<DataRate> priority_bitrate_raw;
50*d9f75844SAndroid Build Coastguard Worker   absl::optional<double> bitrate_priority;
51*d9f75844SAndroid Build Coastguard Worker 
52*d9f75844SAndroid Build Coastguard Worker   std::unique_ptr<StructParametersParser> Parser();
53*d9f75844SAndroid Build Coastguard Worker   explicit AudioAllocationConfig(const FieldTrialsView& field_trials);
54*d9f75844SAndroid Build Coastguard Worker };
55*d9f75844SAndroid Build Coastguard Worker namespace internal {
56*d9f75844SAndroid Build Coastguard Worker class AudioState;
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker class AudioSendStream final : public webrtc::AudioSendStream,
59*d9f75844SAndroid Build Coastguard Worker                               public webrtc::BitrateAllocatorObserver {
60*d9f75844SAndroid Build Coastguard Worker  public:
61*d9f75844SAndroid Build Coastguard Worker   AudioSendStream(Clock* clock,
62*d9f75844SAndroid Build Coastguard Worker                   const webrtc::AudioSendStream::Config& config,
63*d9f75844SAndroid Build Coastguard Worker                   const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
64*d9f75844SAndroid Build Coastguard Worker                   TaskQueueFactory* task_queue_factory,
65*d9f75844SAndroid Build Coastguard Worker                   RtpTransportControllerSendInterface* rtp_transport,
66*d9f75844SAndroid Build Coastguard Worker                   BitrateAllocatorInterface* bitrate_allocator,
67*d9f75844SAndroid Build Coastguard Worker                   RtcEventLog* event_log,
68*d9f75844SAndroid Build Coastguard Worker                   RtcpRttStats* rtcp_rtt_stats,
69*d9f75844SAndroid Build Coastguard Worker                   const absl::optional<RtpState>& suspended_rtp_state,
70*d9f75844SAndroid Build Coastguard Worker                   const FieldTrialsView& field_trials);
71*d9f75844SAndroid Build Coastguard Worker   // For unit tests, which need to supply a mock ChannelSend.
72*d9f75844SAndroid Build Coastguard Worker   AudioSendStream(Clock* clock,
73*d9f75844SAndroid Build Coastguard Worker                   const webrtc::AudioSendStream::Config& config,
74*d9f75844SAndroid Build Coastguard Worker                   const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
75*d9f75844SAndroid Build Coastguard Worker                   TaskQueueFactory* task_queue_factory,
76*d9f75844SAndroid Build Coastguard Worker                   RtpTransportControllerSendInterface* rtp_transport,
77*d9f75844SAndroid Build Coastguard Worker                   BitrateAllocatorInterface* bitrate_allocator,
78*d9f75844SAndroid Build Coastguard Worker                   RtcEventLog* event_log,
79*d9f75844SAndroid Build Coastguard Worker                   const absl::optional<RtpState>& suspended_rtp_state,
80*d9f75844SAndroid Build Coastguard Worker                   std::unique_ptr<voe::ChannelSendInterface> channel_send,
81*d9f75844SAndroid Build Coastguard Worker                   const FieldTrialsView& field_trials);
82*d9f75844SAndroid Build Coastguard Worker 
83*d9f75844SAndroid Build Coastguard Worker   AudioSendStream() = delete;
84*d9f75844SAndroid Build Coastguard Worker   AudioSendStream(const AudioSendStream&) = delete;
85*d9f75844SAndroid Build Coastguard Worker   AudioSendStream& operator=(const AudioSendStream&) = delete;
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker   ~AudioSendStream() override;
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker   // webrtc::AudioSendStream implementation.
90*d9f75844SAndroid Build Coastguard Worker   const webrtc::AudioSendStream::Config& GetConfig() const override;
91*d9f75844SAndroid Build Coastguard Worker   void Reconfigure(const webrtc::AudioSendStream::Config& config,
92*d9f75844SAndroid Build Coastguard Worker                    SetParametersCallback callback) override;
93*d9f75844SAndroid Build Coastguard Worker   void Start() override;
94*d9f75844SAndroid Build Coastguard Worker   void Stop() override;
95*d9f75844SAndroid Build Coastguard Worker   void SendAudioData(std::unique_ptr<AudioFrame> audio_frame) override;
96*d9f75844SAndroid Build Coastguard Worker   bool SendTelephoneEvent(int payload_type,
97*d9f75844SAndroid Build Coastguard Worker                           int payload_frequency,
98*d9f75844SAndroid Build Coastguard Worker                           int event,
99*d9f75844SAndroid Build Coastguard Worker                           int duration_ms) override;
100*d9f75844SAndroid Build Coastguard Worker   void SetMuted(bool muted) override;
101*d9f75844SAndroid Build Coastguard Worker   webrtc::AudioSendStream::Stats GetStats() const override;
102*d9f75844SAndroid Build Coastguard Worker   webrtc::AudioSendStream::Stats GetStats(
103*d9f75844SAndroid Build Coastguard Worker       bool has_remote_tracks) const override;
104*d9f75844SAndroid Build Coastguard Worker 
105*d9f75844SAndroid Build Coastguard Worker   void DeliverRtcp(const uint8_t* packet, size_t length);
106*d9f75844SAndroid Build Coastguard Worker 
107*d9f75844SAndroid Build Coastguard Worker   // Implements BitrateAllocatorObserver.
108*d9f75844SAndroid Build Coastguard Worker   uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override;
109*d9f75844SAndroid Build Coastguard Worker 
110*d9f75844SAndroid Build Coastguard Worker   void SetTransportOverhead(int transport_overhead_per_packet_bytes);
111*d9f75844SAndroid Build Coastguard Worker 
112*d9f75844SAndroid Build Coastguard Worker   RtpState GetRtpState() const;
113*d9f75844SAndroid Build Coastguard Worker   const voe::ChannelSendInterface* GetChannel() const;
114*d9f75844SAndroid Build Coastguard Worker 
115*d9f75844SAndroid Build Coastguard Worker   // Returns combined per-packet overhead.
116*d9f75844SAndroid Build Coastguard Worker   size_t TestOnlyGetPerPacketOverheadBytes() const
117*d9f75844SAndroid Build Coastguard Worker       RTC_LOCKS_EXCLUDED(overhead_per_packet_lock_);
118*d9f75844SAndroid Build Coastguard Worker 
119*d9f75844SAndroid Build Coastguard Worker  private:
120*d9f75844SAndroid Build Coastguard Worker   class TimedTransport;
121*d9f75844SAndroid Build Coastguard Worker   // Constraints including overhead.
122*d9f75844SAndroid Build Coastguard Worker   struct TargetAudioBitrateConstraints {
123*d9f75844SAndroid Build Coastguard Worker     DataRate min;
124*d9f75844SAndroid Build Coastguard Worker     DataRate max;
125*d9f75844SAndroid Build Coastguard Worker   };
126*d9f75844SAndroid Build Coastguard Worker 
127*d9f75844SAndroid Build Coastguard Worker   internal::AudioState* audio_state();
128*d9f75844SAndroid Build Coastguard Worker   const internal::AudioState* audio_state() const;
129*d9f75844SAndroid Build Coastguard Worker 
130*d9f75844SAndroid Build Coastguard Worker   void StoreEncoderProperties(int sample_rate_hz, size_t num_channels)
131*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
132*d9f75844SAndroid Build Coastguard Worker 
133*d9f75844SAndroid Build Coastguard Worker   void ConfigureStream(const Config& new_config,
134*d9f75844SAndroid Build Coastguard Worker                        bool first_time,
135*d9f75844SAndroid Build Coastguard Worker                        SetParametersCallback callback)
136*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
137*d9f75844SAndroid Build Coastguard Worker   bool SetupSendCodec(const Config& new_config)
138*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
139*d9f75844SAndroid Build Coastguard Worker   bool ReconfigureSendCodec(const Config& new_config)
140*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
141*d9f75844SAndroid Build Coastguard Worker   void ReconfigureANA(const Config& new_config)
142*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
143*d9f75844SAndroid Build Coastguard Worker   void ReconfigureCNG(const Config& new_config)
144*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
145*d9f75844SAndroid Build Coastguard Worker   void ReconfigureBitrateObserver(const Config& new_config)
146*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
147*d9f75844SAndroid Build Coastguard Worker 
148*d9f75844SAndroid Build Coastguard Worker   void ConfigureBitrateObserver() RTC_RUN_ON(worker_thread_checker_);
149*d9f75844SAndroid Build Coastguard Worker   void RemoveBitrateObserver() RTC_RUN_ON(worker_thread_checker_);
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker   // Returns bitrate constraints, maybe including overhead when enabled by
152*d9f75844SAndroid Build Coastguard Worker   // field trial.
153*d9f75844SAndroid Build Coastguard Worker   absl::optional<TargetAudioBitrateConstraints> GetMinMaxBitrateConstraints()
154*d9f75844SAndroid Build Coastguard Worker       const RTC_RUN_ON(worker_thread_checker_);
155*d9f75844SAndroid Build Coastguard Worker 
156*d9f75844SAndroid Build Coastguard Worker   // Sets per-packet overhead on encoded (for ANA) based on current known values
157*d9f75844SAndroid Build Coastguard Worker   // of transport and packetization overheads.
158*d9f75844SAndroid Build Coastguard Worker   void UpdateOverheadForEncoder()
159*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(overhead_per_packet_lock_);
160*d9f75844SAndroid Build Coastguard Worker 
161*d9f75844SAndroid Build Coastguard Worker   // Returns combined per-packet overhead.
162*d9f75844SAndroid Build Coastguard Worker   size_t GetPerPacketOverheadBytes() const
163*d9f75844SAndroid Build Coastguard Worker       RTC_EXCLUSIVE_LOCKS_REQUIRED(overhead_per_packet_lock_);
164*d9f75844SAndroid Build Coastguard Worker 
165*d9f75844SAndroid Build Coastguard Worker   void RegisterCngPayloadType(int payload_type, int clockrate_hz)
166*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker   void UpdateCachedTargetAudioBitrateConstraints()
169*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(worker_thread_checker_);
170*d9f75844SAndroid Build Coastguard Worker 
171*d9f75844SAndroid Build Coastguard Worker   Clock* clock_;
172*d9f75844SAndroid Build Coastguard Worker   const FieldTrialsView& field_trials_;
173*d9f75844SAndroid Build Coastguard Worker 
174*d9f75844SAndroid Build Coastguard Worker   SequenceChecker worker_thread_checker_;
175*d9f75844SAndroid Build Coastguard Worker   rtc::RaceChecker audio_capture_race_checker_;
176*d9f75844SAndroid Build Coastguard Worker   MaybeWorkerThread* rtp_transport_queue_;
177*d9f75844SAndroid Build Coastguard Worker 
178*d9f75844SAndroid Build Coastguard Worker   const bool allocate_audio_without_feedback_;
179*d9f75844SAndroid Build Coastguard Worker   const bool force_no_audio_feedback_ = allocate_audio_without_feedback_;
180*d9f75844SAndroid Build Coastguard Worker   const bool enable_audio_alr_probing_;
181*d9f75844SAndroid Build Coastguard Worker   const AudioAllocationConfig allocation_settings_;
182*d9f75844SAndroid Build Coastguard Worker 
183*d9f75844SAndroid Build Coastguard Worker   webrtc::AudioSendStream::Config config_
184*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(worker_thread_checker_);
185*d9f75844SAndroid Build Coastguard Worker   rtc::scoped_refptr<webrtc::AudioState> audio_state_;
186*d9f75844SAndroid Build Coastguard Worker   const std::unique_ptr<voe::ChannelSendInterface> channel_send_;
187*d9f75844SAndroid Build Coastguard Worker   RtcEventLog* const event_log_;
188*d9f75844SAndroid Build Coastguard Worker   const bool use_legacy_overhead_calculation_;
189*d9f75844SAndroid Build Coastguard Worker 
190*d9f75844SAndroid Build Coastguard Worker   int encoder_sample_rate_hz_ RTC_GUARDED_BY(worker_thread_checker_) = 0;
191*d9f75844SAndroid Build Coastguard Worker   size_t encoder_num_channels_ RTC_GUARDED_BY(worker_thread_checker_) = 0;
192*d9f75844SAndroid Build Coastguard Worker   bool sending_ RTC_GUARDED_BY(worker_thread_checker_) = false;
193*d9f75844SAndroid Build Coastguard Worker   mutable Mutex audio_level_lock_;
194*d9f75844SAndroid Build Coastguard Worker   // Keeps track of audio level, total audio energy and total samples duration.
195*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/webrtc-stats/#dom-rtcaudiohandlerstats-totalaudioenergy
196*d9f75844SAndroid Build Coastguard Worker   webrtc::voe::AudioLevel audio_level_ RTC_GUARDED_BY(audio_level_lock_);
197*d9f75844SAndroid Build Coastguard Worker 
198*d9f75844SAndroid Build Coastguard Worker   BitrateAllocatorInterface* const bitrate_allocator_
199*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(rtp_transport_queue_);
200*d9f75844SAndroid Build Coastguard Worker   // Constrains cached to be accessed from `rtp_transport_queue_`.
201*d9f75844SAndroid Build Coastguard Worker   absl::optional<AudioSendStream::TargetAudioBitrateConstraints>
202*d9f75844SAndroid Build Coastguard Worker       cached_constraints_ RTC_GUARDED_BY(rtp_transport_queue_) = absl::nullopt;
203*d9f75844SAndroid Build Coastguard Worker   RtpTransportControllerSendInterface* const rtp_transport_;
204*d9f75844SAndroid Build Coastguard Worker 
205*d9f75844SAndroid Build Coastguard Worker   RtpRtcpInterface* const rtp_rtcp_module_;
206*d9f75844SAndroid Build Coastguard Worker   absl::optional<RtpState> const suspended_rtp_state_;
207*d9f75844SAndroid Build Coastguard Worker 
208*d9f75844SAndroid Build Coastguard Worker   // RFC 5285: Each distinct extension MUST have a unique ID. The value 0 is
209*d9f75844SAndroid Build Coastguard Worker   // reserved for padding and MUST NOT be used as a local identifier.
210*d9f75844SAndroid Build Coastguard Worker   // So it should be safe to use 0 here to indicate "not configured".
211*d9f75844SAndroid Build Coastguard Worker   struct ExtensionIds {
212*d9f75844SAndroid Build Coastguard Worker     int audio_level = 0;
213*d9f75844SAndroid Build Coastguard Worker     int abs_send_time = 0;
214*d9f75844SAndroid Build Coastguard Worker     int abs_capture_time = 0;
215*d9f75844SAndroid Build Coastguard Worker     int transport_sequence_number = 0;
216*d9f75844SAndroid Build Coastguard Worker     int mid = 0;
217*d9f75844SAndroid Build Coastguard Worker     int rid = 0;
218*d9f75844SAndroid Build Coastguard Worker     int repaired_rid = 0;
219*d9f75844SAndroid Build Coastguard Worker   };
220*d9f75844SAndroid Build Coastguard Worker   static ExtensionIds FindExtensionIds(
221*d9f75844SAndroid Build Coastguard Worker       const std::vector<RtpExtension>& extensions);
222*d9f75844SAndroid Build Coastguard Worker   static int TransportSeqNumId(const Config& config);
223*d9f75844SAndroid Build Coastguard Worker 
224*d9f75844SAndroid Build Coastguard Worker   mutable Mutex overhead_per_packet_lock_;
225*d9f75844SAndroid Build Coastguard Worker   size_t overhead_per_packet_ RTC_GUARDED_BY(overhead_per_packet_lock_) = 0;
226*d9f75844SAndroid Build Coastguard Worker 
227*d9f75844SAndroid Build Coastguard Worker   // Current transport overhead (ICE, TURN, etc.)
228*d9f75844SAndroid Build Coastguard Worker   size_t transport_overhead_per_packet_bytes_
229*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(overhead_per_packet_lock_) = 0;
230*d9f75844SAndroid Build Coastguard Worker 
231*d9f75844SAndroid Build Coastguard Worker   bool registered_with_allocator_ RTC_GUARDED_BY(worker_thread_checker_) =
232*d9f75844SAndroid Build Coastguard Worker       false;
233*d9f75844SAndroid Build Coastguard Worker   size_t total_packet_overhead_bytes_ RTC_GUARDED_BY(worker_thread_checker_) =
234*d9f75844SAndroid Build Coastguard Worker       0;
235*d9f75844SAndroid Build Coastguard Worker   absl::optional<std::pair<TimeDelta, TimeDelta>> frame_length_range_
236*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(worker_thread_checker_);
237*d9f75844SAndroid Build Coastguard Worker };
238*d9f75844SAndroid Build Coastguard Worker }  // namespace internal
239*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
240*d9f75844SAndroid Build Coastguard Worker 
241*d9f75844SAndroid Build Coastguard Worker #endif  // AUDIO_AUDIO_SEND_STREAM_H_
242