1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2004 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 MEDIA_ENGINE_WEBRTC_VOICE_ENGINE_H_ 12*d9f75844SAndroid Build Coastguard Worker #define MEDIA_ENGINE_WEBRTC_VOICE_ENGINE_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <map> 15*d9f75844SAndroid Build Coastguard Worker #include <memory> 16*d9f75844SAndroid Build Coastguard Worker #include <string> 17*d9f75844SAndroid Build Coastguard Worker #include <vector> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "api/audio_codecs/audio_encoder_factory.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/sequence_checker.h" 23*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_factory.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/transport/rtp/rtp_source.h" 26*d9f75844SAndroid Build Coastguard Worker #include "call/audio_state.h" 27*d9f75844SAndroid Build Coastguard Worker #include "call/call.h" 28*d9f75844SAndroid Build Coastguard Worker #include "media/base/media_engine.h" 29*d9f75844SAndroid Build Coastguard Worker #include "media/base/rtp_utils.h" 30*d9f75844SAndroid Build Coastguard Worker #include "modules/async_audio_processing/async_audio_processing.h" 31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h" 32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network_route.h" 33*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/task_queue.h" 34*d9f75844SAndroid Build Coastguard Worker 35*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 36*d9f75844SAndroid Build Coastguard Worker class AudioFrameProcessor; 37*d9f75844SAndroid Build Coastguard Worker } 38*d9f75844SAndroid Build Coastguard Worker 39*d9f75844SAndroid Build Coastguard Worker namespace cricket { 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker class AudioSource; 42*d9f75844SAndroid Build Coastguard Worker class WebRtcVoiceMediaChannel; 43*d9f75844SAndroid Build Coastguard Worker 44*d9f75844SAndroid Build Coastguard Worker // WebRtcVoiceEngine is a class to be used with CompositeMediaEngine. 45*d9f75844SAndroid Build Coastguard Worker // It uses the WebRtc VoiceEngine library for audio handling. 46*d9f75844SAndroid Build Coastguard Worker class WebRtcVoiceEngine final : public VoiceEngineInterface { 47*d9f75844SAndroid Build Coastguard Worker friend class WebRtcVoiceMediaChannel; 48*d9f75844SAndroid Build Coastguard Worker 49*d9f75844SAndroid Build Coastguard Worker public: 50*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceEngine( 51*d9f75844SAndroid Build Coastguard Worker webrtc::TaskQueueFactory* task_queue_factory, 52*d9f75844SAndroid Build Coastguard Worker webrtc::AudioDeviceModule* adm, 53*d9f75844SAndroid Build Coastguard Worker const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory, 54*d9f75844SAndroid Build Coastguard Worker const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory, 55*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer, 56*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing, 57*d9f75844SAndroid Build Coastguard Worker webrtc::AudioFrameProcessor* audio_frame_processor, 58*d9f75844SAndroid Build Coastguard Worker const webrtc::FieldTrialsView& trials); 59*d9f75844SAndroid Build Coastguard Worker 60*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceEngine() = delete; 61*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceEngine(const WebRtcVoiceEngine&) = delete; 62*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceEngine& operator=(const WebRtcVoiceEngine&) = delete; 63*d9f75844SAndroid Build Coastguard Worker 64*d9f75844SAndroid Build Coastguard Worker ~WebRtcVoiceEngine() override; 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard Worker // Does initialization that needs to occur on the worker thread. 67*d9f75844SAndroid Build Coastguard Worker void Init() override; 68*d9f75844SAndroid Build Coastguard Worker 69*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const override; 70*d9f75844SAndroid Build Coastguard Worker VoiceMediaChannel* CreateMediaChannel( 71*d9f75844SAndroid Build Coastguard Worker webrtc::Call* call, 72*d9f75844SAndroid Build Coastguard Worker const MediaConfig& config, 73*d9f75844SAndroid Build Coastguard Worker const AudioOptions& options, 74*d9f75844SAndroid Build Coastguard Worker const webrtc::CryptoOptions& crypto_options) override; 75*d9f75844SAndroid Build Coastguard Worker 76*d9f75844SAndroid Build Coastguard Worker const std::vector<AudioCodec>& send_codecs() const override; 77*d9f75844SAndroid Build Coastguard Worker const std::vector<AudioCodec>& recv_codecs() const override; 78*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpHeaderExtensionCapability> GetRtpHeaderExtensions() 79*d9f75844SAndroid Build Coastguard Worker const override; 80*d9f75844SAndroid Build Coastguard Worker 81*d9f75844SAndroid Build Coastguard Worker // Starts AEC dump using an existing file. A maximum file size in bytes can be 82*d9f75844SAndroid Build Coastguard Worker // specified. When the maximum file size is reached, logging is stopped and 83*d9f75844SAndroid Build Coastguard Worker // the file is closed. If max_size_bytes is set to <= 0, no limit will be 84*d9f75844SAndroid Build Coastguard Worker // used. 85*d9f75844SAndroid Build Coastguard Worker bool StartAecDump(webrtc::FileWrapper file, int64_t max_size_bytes) override; 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker // Stops AEC dump. 88*d9f75844SAndroid Build Coastguard Worker void StopAecDump() override; 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker private: 91*d9f75844SAndroid Build Coastguard Worker // Every option that is "set" will be applied. Every option not "set" will be 92*d9f75844SAndroid Build Coastguard Worker // ignored. This allows us to selectively turn on and off different options 93*d9f75844SAndroid Build Coastguard Worker // easily at any time. 94*d9f75844SAndroid Build Coastguard Worker void ApplyOptions(const AudioOptions& options); 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker int CreateVoEChannel(); 97*d9f75844SAndroid Build Coastguard Worker 98*d9f75844SAndroid Build Coastguard Worker webrtc::TaskQueueFactory* const task_queue_factory_; 99*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::TaskQueue> low_priority_worker_queue_; 100*d9f75844SAndroid Build Coastguard Worker 101*d9f75844SAndroid Build Coastguard Worker webrtc::AudioDeviceModule* adm(); 102*d9f75844SAndroid Build Coastguard Worker webrtc::AudioProcessing* apm() const; 103*d9f75844SAndroid Build Coastguard Worker webrtc::AudioState* audio_state(); 104*d9f75844SAndroid Build Coastguard Worker 105*d9f75844SAndroid Build Coastguard Worker std::vector<AudioCodec> CollectCodecs( 106*d9f75844SAndroid Build Coastguard Worker const std::vector<webrtc::AudioCodecSpec>& specs) const; 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker webrtc::SequenceChecker signal_thread_checker_; 109*d9f75844SAndroid Build Coastguard Worker webrtc::SequenceChecker worker_thread_checker_; 110*d9f75844SAndroid Build Coastguard Worker 111*d9f75844SAndroid Build Coastguard Worker // The audio device module. 112*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioDeviceModule> adm_; 113*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioEncoderFactory> encoder_factory_; 114*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory_; 115*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer_; 116*d9f75844SAndroid Build Coastguard Worker // The audio processing module. 117*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioProcessing> apm_; 118*d9f75844SAndroid Build Coastguard Worker // Asynchronous audio processing. 119*d9f75844SAndroid Build Coastguard Worker webrtc::AudioFrameProcessor* const audio_frame_processor_; 120*d9f75844SAndroid Build Coastguard Worker // The primary instance of WebRtc VoiceEngine. 121*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioState> audio_state_; 122*d9f75844SAndroid Build Coastguard Worker std::vector<AudioCodec> send_codecs_; 123*d9f75844SAndroid Build Coastguard Worker std::vector<AudioCodec> recv_codecs_; 124*d9f75844SAndroid Build Coastguard Worker bool is_dumping_aec_ = false; 125*d9f75844SAndroid Build Coastguard Worker bool initialized_ = false; 126*d9f75844SAndroid Build Coastguard Worker 127*d9f75844SAndroid Build Coastguard Worker // Jitter buffer settings for new streams. 128*d9f75844SAndroid Build Coastguard Worker size_t audio_jitter_buffer_max_packets_ = 200; 129*d9f75844SAndroid Build Coastguard Worker bool audio_jitter_buffer_fast_accelerate_ = false; 130*d9f75844SAndroid Build Coastguard Worker int audio_jitter_buffer_min_delay_ms_ = 0; 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker const bool minimized_remsampling_on_mobile_trial_enabled_; 133*d9f75844SAndroid Build Coastguard Worker }; 134*d9f75844SAndroid Build Coastguard Worker 135*d9f75844SAndroid Build Coastguard Worker // WebRtcVoiceMediaChannel is an implementation of VoiceMediaChannel that uses 136*d9f75844SAndroid Build Coastguard Worker // WebRtc Voice Engine. 137*d9f75844SAndroid Build Coastguard Worker class WebRtcVoiceMediaChannel final : public VoiceMediaChannel, 138*d9f75844SAndroid Build Coastguard Worker public webrtc::Transport { 139*d9f75844SAndroid Build Coastguard Worker public: 140*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine, 141*d9f75844SAndroid Build Coastguard Worker const MediaConfig& config, 142*d9f75844SAndroid Build Coastguard Worker const AudioOptions& options, 143*d9f75844SAndroid Build Coastguard Worker const webrtc::CryptoOptions& crypto_options, 144*d9f75844SAndroid Build Coastguard Worker webrtc::Call* call); 145*d9f75844SAndroid Build Coastguard Worker 146*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceMediaChannel() = delete; 147*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceMediaChannel(const WebRtcVoiceMediaChannel&) = delete; 148*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceMediaChannel& operator=(const WebRtcVoiceMediaChannel&) = delete; 149*d9f75844SAndroid Build Coastguard Worker 150*d9f75844SAndroid Build Coastguard Worker ~WebRtcVoiceMediaChannel() override; 151*d9f75844SAndroid Build Coastguard Worker options()152*d9f75844SAndroid Build Coastguard Worker const AudioOptions& options() const { return options_; } 153*d9f75844SAndroid Build Coastguard Worker 154*d9f75844SAndroid Build Coastguard Worker bool SetSendParameters(const AudioSendParameters& params) override; 155*d9f75844SAndroid Build Coastguard Worker bool SetRecvParameters(const AudioRecvParameters& params) override; 156*d9f75844SAndroid Build Coastguard Worker webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override; 157*d9f75844SAndroid Build Coastguard Worker webrtc::RTCError SetRtpSendParameters( 158*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc, 159*d9f75844SAndroid Build Coastguard Worker const webrtc::RtpParameters& parameters, 160*d9f75844SAndroid Build Coastguard Worker webrtc::SetParametersCallback callback) override; 161*d9f75844SAndroid Build Coastguard Worker webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override; 162*d9f75844SAndroid Build Coastguard Worker webrtc::RtpParameters GetDefaultRtpReceiveParameters() const override; 163*d9f75844SAndroid Build Coastguard Worker 164*d9f75844SAndroid Build Coastguard Worker void SetPlayout(bool playout) override; 165*d9f75844SAndroid Build Coastguard Worker void SetSend(bool send) override; 166*d9f75844SAndroid Build Coastguard Worker bool SetAudioSend(uint32_t ssrc, 167*d9f75844SAndroid Build Coastguard Worker bool enable, 168*d9f75844SAndroid Build Coastguard Worker const AudioOptions* options, 169*d9f75844SAndroid Build Coastguard Worker AudioSource* source) override; 170*d9f75844SAndroid Build Coastguard Worker bool AddSendStream(const StreamParams& sp) override; 171*d9f75844SAndroid Build Coastguard Worker bool RemoveSendStream(uint32_t ssrc) override; 172*d9f75844SAndroid Build Coastguard Worker bool AddRecvStream(const StreamParams& sp) override; 173*d9f75844SAndroid Build Coastguard Worker bool RemoveRecvStream(uint32_t ssrc) override; 174*d9f75844SAndroid Build Coastguard Worker void ResetUnsignaledRecvStream() override; 175*d9f75844SAndroid Build Coastguard Worker void OnDemuxerCriteriaUpdatePending() override; 176*d9f75844SAndroid Build Coastguard Worker void OnDemuxerCriteriaUpdateComplete() override; 177*d9f75844SAndroid Build Coastguard Worker 178*d9f75844SAndroid Build Coastguard Worker // E2EE Frame API 179*d9f75844SAndroid Build Coastguard Worker // Set a frame decryptor to a particular ssrc that will intercept all 180*d9f75844SAndroid Build Coastguard Worker // incoming audio payloads and attempt to decrypt them before forwarding the 181*d9f75844SAndroid Build Coastguard Worker // result. 182*d9f75844SAndroid Build Coastguard Worker void SetFrameDecryptor(uint32_t ssrc, 183*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameDecryptorInterface> 184*d9f75844SAndroid Build Coastguard Worker frame_decryptor) override; 185*d9f75844SAndroid Build Coastguard Worker // Set a frame encryptor to a particular ssrc that will intercept all 186*d9f75844SAndroid Build Coastguard Worker // outgoing audio payloads frames and attempt to encrypt them and forward the 187*d9f75844SAndroid Build Coastguard Worker // result to the packetizer. 188*d9f75844SAndroid Build Coastguard Worker void SetFrameEncryptor(uint32_t ssrc, 189*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameEncryptorInterface> 190*d9f75844SAndroid Build Coastguard Worker frame_encryptor) override; 191*d9f75844SAndroid Build Coastguard Worker 192*d9f75844SAndroid Build Coastguard Worker bool SetOutputVolume(uint32_t ssrc, double volume) override; 193*d9f75844SAndroid Build Coastguard Worker // Applies the new volume to current and future unsignaled streams. 194*d9f75844SAndroid Build Coastguard Worker bool SetDefaultOutputVolume(double volume) override; 195*d9f75844SAndroid Build Coastguard Worker 196*d9f75844SAndroid Build Coastguard Worker bool SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) override; 197*d9f75844SAndroid Build Coastguard Worker absl::optional<int> GetBaseMinimumPlayoutDelayMs( 198*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc) const override; 199*d9f75844SAndroid Build Coastguard Worker 200*d9f75844SAndroid Build Coastguard Worker bool CanInsertDtmf() override; 201*d9f75844SAndroid Build Coastguard Worker bool InsertDtmf(uint32_t ssrc, int event, int duration) override; 202*d9f75844SAndroid Build Coastguard Worker 203*d9f75844SAndroid Build Coastguard Worker void OnPacketReceived(rtc::CopyOnWriteBuffer packet, 204*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us) override; 205*d9f75844SAndroid Build Coastguard Worker void OnPacketSent(const rtc::SentPacket& sent_packet) override; 206*d9f75844SAndroid Build Coastguard Worker void OnNetworkRouteChanged(absl::string_view transport_name, 207*d9f75844SAndroid Build Coastguard Worker const rtc::NetworkRoute& network_route) override; 208*d9f75844SAndroid Build Coastguard Worker void OnReadyToSend(bool ready) override; 209*d9f75844SAndroid Build Coastguard Worker bool GetStats(VoiceMediaInfo* info, bool get_and_clear_legacy_stats) override; 210*d9f75844SAndroid Build Coastguard Worker 211*d9f75844SAndroid Build Coastguard Worker // Set the audio sink for an existing stream. 212*d9f75844SAndroid Build Coastguard Worker void SetRawAudioSink( 213*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc, 214*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::AudioSinkInterface> sink) override; 215*d9f75844SAndroid Build Coastguard Worker // Will set the audio sink on the latest unsignaled stream, future or 216*d9f75844SAndroid Build Coastguard Worker // current. Only one stream at a time will use the sink. 217*d9f75844SAndroid Build Coastguard Worker void SetDefaultRawAudioSink( 218*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::AudioSinkInterface> sink) override; 219*d9f75844SAndroid Build Coastguard Worker 220*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override; 221*d9f75844SAndroid Build Coastguard Worker 222*d9f75844SAndroid Build Coastguard Worker // Sets a frame transformer between encoder and packetizer, to transform 223*d9f75844SAndroid Build Coastguard Worker // encoded frames before sending them out the network. 224*d9f75844SAndroid Build Coastguard Worker void SetEncoderToPacketizerFrameTransformer( 225*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc, 226*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) 227*d9f75844SAndroid Build Coastguard Worker override; 228*d9f75844SAndroid Build Coastguard Worker void SetDepacketizerToDecoderFrameTransformer( 229*d9f75844SAndroid Build Coastguard Worker uint32_t ssrc, 230*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) 231*d9f75844SAndroid Build Coastguard Worker override; 232*d9f75844SAndroid Build Coastguard Worker 233*d9f75844SAndroid Build Coastguard Worker // implements Transport interface 234*d9f75844SAndroid Build Coastguard Worker bool SendRtp(const uint8_t* data, 235*d9f75844SAndroid Build Coastguard Worker size_t len, 236*d9f75844SAndroid Build Coastguard Worker const webrtc::PacketOptions& options) override; 237*d9f75844SAndroid Build Coastguard Worker 238*d9f75844SAndroid Build Coastguard Worker bool SendRtcp(const uint8_t* data, size_t len) override; 239*d9f75844SAndroid Build Coastguard Worker 240*d9f75844SAndroid Build Coastguard Worker private: 241*d9f75844SAndroid Build Coastguard Worker bool SetOptions(const AudioOptions& options); 242*d9f75844SAndroid Build Coastguard Worker bool SetRecvCodecs(const std::vector<AudioCodec>& codecs); 243*d9f75844SAndroid Build Coastguard Worker bool SetSendCodecs(const std::vector<AudioCodec>& codecs); 244*d9f75844SAndroid Build Coastguard Worker bool SetLocalSource(uint32_t ssrc, AudioSource* source); 245*d9f75844SAndroid Build Coastguard Worker bool MuteStream(uint32_t ssrc, bool mute); 246*d9f75844SAndroid Build Coastguard Worker engine()247*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceEngine* engine() { return engine_; } 248*d9f75844SAndroid Build Coastguard Worker int CreateVoEChannel(); 249*d9f75844SAndroid Build Coastguard Worker bool DeleteVoEChannel(int channel); 250*d9f75844SAndroid Build Coastguard Worker bool SetMaxSendBitrate(int bps); 251*d9f75844SAndroid Build Coastguard Worker void SetupRecording(); 252*d9f75844SAndroid Build Coastguard Worker // Check if 'ssrc' is an unsignaled stream, and if so mark it as not being 253*d9f75844SAndroid Build Coastguard Worker // unsignaled anymore (i.e. it is now removed, or signaled), and return true. 254*d9f75844SAndroid Build Coastguard Worker bool MaybeDeregisterUnsignaledRecvStream(uint32_t ssrc); 255*d9f75844SAndroid Build Coastguard Worker 256*d9f75844SAndroid Build Coastguard Worker webrtc::TaskQueueBase* const worker_thread_; 257*d9f75844SAndroid Build Coastguard Worker webrtc::ScopedTaskSafety task_safety_; 258*d9f75844SAndroid Build Coastguard Worker webrtc::SequenceChecker network_thread_checker_; 259*d9f75844SAndroid Build Coastguard Worker 260*d9f75844SAndroid Build Coastguard Worker WebRtcVoiceEngine* const engine_ = nullptr; 261*d9f75844SAndroid Build Coastguard Worker std::vector<AudioCodec> send_codecs_; 262*d9f75844SAndroid Build Coastguard Worker 263*d9f75844SAndroid Build Coastguard Worker // TODO(kwiberg): decoder_map_ and recv_codecs_ store the exact same 264*d9f75844SAndroid Build Coastguard Worker // information, in slightly different formats. Eliminate recv_codecs_. 265*d9f75844SAndroid Build Coastguard Worker std::map<int, webrtc::SdpAudioFormat> decoder_map_; 266*d9f75844SAndroid Build Coastguard Worker std::vector<AudioCodec> recv_codecs_; 267*d9f75844SAndroid Build Coastguard Worker 268*d9f75844SAndroid Build Coastguard Worker int max_send_bitrate_bps_ = 0; 269*d9f75844SAndroid Build Coastguard Worker AudioOptions options_; 270*d9f75844SAndroid Build Coastguard Worker absl::optional<int> dtmf_payload_type_; 271*d9f75844SAndroid Build Coastguard Worker int dtmf_payload_freq_ = -1; 272*d9f75844SAndroid Build Coastguard Worker bool recv_transport_cc_enabled_ = false; 273*d9f75844SAndroid Build Coastguard Worker bool recv_nack_enabled_ = false; 274*d9f75844SAndroid Build Coastguard Worker bool enable_non_sender_rtt_ = false; 275*d9f75844SAndroid Build Coastguard Worker bool playout_ = false; 276*d9f75844SAndroid Build Coastguard Worker bool send_ = false; 277*d9f75844SAndroid Build Coastguard Worker webrtc::Call* const call_ = nullptr; 278*d9f75844SAndroid Build Coastguard Worker 279*d9f75844SAndroid Build Coastguard Worker const MediaConfig::Audio audio_config_; 280*d9f75844SAndroid Build Coastguard Worker 281*d9f75844SAndroid Build Coastguard Worker // Queue of unsignaled SSRCs; oldest at the beginning. 282*d9f75844SAndroid Build Coastguard Worker std::vector<uint32_t> unsignaled_recv_ssrcs_; 283*d9f75844SAndroid Build Coastguard Worker 284*d9f75844SAndroid Build Coastguard Worker // This is a stream param that comes from the remote description, but wasn't 285*d9f75844SAndroid Build Coastguard Worker // signaled with any a=ssrc lines. It holds the information that was signaled 286*d9f75844SAndroid Build Coastguard Worker // before the unsignaled receive stream is created when the first packet is 287*d9f75844SAndroid Build Coastguard Worker // received. 288*d9f75844SAndroid Build Coastguard Worker StreamParams unsignaled_stream_params_; 289*d9f75844SAndroid Build Coastguard Worker 290*d9f75844SAndroid Build Coastguard Worker // Volume for unsignaled streams, which may be set before the stream exists. 291*d9f75844SAndroid Build Coastguard Worker double default_recv_volume_ = 1.0; 292*d9f75844SAndroid Build Coastguard Worker 293*d9f75844SAndroid Build Coastguard Worker // Delay for unsignaled streams, which may be set before the stream exists. 294*d9f75844SAndroid Build Coastguard Worker int default_recv_base_minimum_delay_ms_ = 0; 295*d9f75844SAndroid Build Coastguard Worker 296*d9f75844SAndroid Build Coastguard Worker // Sink for latest unsignaled stream - may be set before the stream exists. 297*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::AudioSinkInterface> default_sink_; 298*d9f75844SAndroid Build Coastguard Worker // Default SSRC to use for RTCP receiver reports in case of no signaled 299*d9f75844SAndroid Build Coastguard Worker // send streams. See: https://code.google.com/p/webrtc/issues/detail?id=4740 300*d9f75844SAndroid Build Coastguard Worker // and https://code.google.com/p/chromium/issues/detail?id=547661 301*d9f75844SAndroid Build Coastguard Worker uint32_t receiver_reports_ssrc_ = 0xFA17FA17u; 302*d9f75844SAndroid Build Coastguard Worker 303*d9f75844SAndroid Build Coastguard Worker class WebRtcAudioSendStream; 304*d9f75844SAndroid Build Coastguard Worker std::map<uint32_t, WebRtcAudioSendStream*> send_streams_; 305*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpExtension> send_rtp_extensions_; 306*d9f75844SAndroid Build Coastguard Worker std::string mid_; 307*d9f75844SAndroid Build Coastguard Worker 308*d9f75844SAndroid Build Coastguard Worker class WebRtcAudioReceiveStream; 309*d9f75844SAndroid Build Coastguard Worker std::map<uint32_t, WebRtcAudioReceiveStream*> recv_streams_; 310*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpExtension> recv_rtp_extensions_; 311*d9f75844SAndroid Build Coastguard Worker 312*d9f75844SAndroid Build Coastguard Worker absl::optional<webrtc::AudioSendStream::Config::SendCodecSpec> 313*d9f75844SAndroid Build Coastguard Worker send_codec_spec_; 314*d9f75844SAndroid Build Coastguard Worker 315*d9f75844SAndroid Build Coastguard Worker // TODO(kwiberg): Per-SSRC codec pair IDs? 316*d9f75844SAndroid Build Coastguard Worker const webrtc::AudioCodecPairId codec_pair_id_ = 317*d9f75844SAndroid Build Coastguard Worker webrtc::AudioCodecPairId::Create(); 318*d9f75844SAndroid Build Coastguard Worker 319*d9f75844SAndroid Build Coastguard Worker // Per peer connection crypto options that last for the lifetime of the peer 320*d9f75844SAndroid Build Coastguard Worker // connection. 321*d9f75844SAndroid Build Coastguard Worker const webrtc::CryptoOptions crypto_options_; 322*d9f75844SAndroid Build Coastguard Worker // Unsignaled streams have an option to have a frame decryptor set on them. 323*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameDecryptorInterface> 324*d9f75844SAndroid Build Coastguard Worker unsignaled_frame_decryptor_; 325*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::FrameTransformerInterface> 326*d9f75844SAndroid Build Coastguard Worker unsignaled_frame_transformer_; 327*d9f75844SAndroid Build Coastguard Worker }; 328*d9f75844SAndroid Build Coastguard Worker } // namespace cricket 329*d9f75844SAndroid Build Coastguard Worker 330*d9f75844SAndroid Build Coastguard Worker #endif // MEDIA_ENGINE_WEBRTC_VOICE_ENGINE_H_ 331