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