xref: /aosp_15_r20/external/webrtc/media/engine/webrtc_voice_engine.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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