xref: /aosp_15_r20/external/webrtc/media/base/fake_media_engine.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2018 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 #include "media/base/fake_media_engine.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <memory>
14*d9f75844SAndroid Build Coastguard Worker #include <utility>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "absl/algorithm/container.h"
17*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/match.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker namespace cricket {
21*d9f75844SAndroid Build Coastguard Worker using webrtc::TaskQueueBase;
22*d9f75844SAndroid Build Coastguard Worker 
DtmfInfo(uint32_t ssrc,int event_code,int duration)23*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel::DtmfInfo::DtmfInfo(uint32_t ssrc,
24*d9f75844SAndroid Build Coastguard Worker                                           int event_code,
25*d9f75844SAndroid Build Coastguard Worker                                           int duration)
26*d9f75844SAndroid Build Coastguard Worker     : ssrc(ssrc), event_code(event_code), duration(duration) {}
27*d9f75844SAndroid Build Coastguard Worker 
VoiceChannelAudioSink(AudioSource * source)28*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel::VoiceChannelAudioSink::VoiceChannelAudioSink(
29*d9f75844SAndroid Build Coastguard Worker     AudioSource* source)
30*d9f75844SAndroid Build Coastguard Worker     : source_(source) {
31*d9f75844SAndroid Build Coastguard Worker   source_->SetSink(this);
32*d9f75844SAndroid Build Coastguard Worker }
~VoiceChannelAudioSink()33*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel::VoiceChannelAudioSink::~VoiceChannelAudioSink() {
34*d9f75844SAndroid Build Coastguard Worker   if (source_) {
35*d9f75844SAndroid Build Coastguard Worker     source_->SetSink(nullptr);
36*d9f75844SAndroid Build Coastguard Worker   }
37*d9f75844SAndroid Build Coastguard Worker }
OnData(const void * audio_data,int bits_per_sample,int sample_rate,size_t number_of_channels,size_t number_of_frames,absl::optional<int64_t> absolute_capture_timestamp_ms)38*d9f75844SAndroid Build Coastguard Worker void FakeVoiceMediaChannel::VoiceChannelAudioSink::OnData(
39*d9f75844SAndroid Build Coastguard Worker     const void* audio_data,
40*d9f75844SAndroid Build Coastguard Worker     int bits_per_sample,
41*d9f75844SAndroid Build Coastguard Worker     int sample_rate,
42*d9f75844SAndroid Build Coastguard Worker     size_t number_of_channels,
43*d9f75844SAndroid Build Coastguard Worker     size_t number_of_frames,
44*d9f75844SAndroid Build Coastguard Worker     absl::optional<int64_t> absolute_capture_timestamp_ms) {}
OnClose()45*d9f75844SAndroid Build Coastguard Worker void FakeVoiceMediaChannel::VoiceChannelAudioSink::OnClose() {
46*d9f75844SAndroid Build Coastguard Worker   source_ = nullptr;
47*d9f75844SAndroid Build Coastguard Worker }
source() const48*d9f75844SAndroid Build Coastguard Worker AudioSource* FakeVoiceMediaChannel::VoiceChannelAudioSink::source() const {
49*d9f75844SAndroid Build Coastguard Worker   return source_;
50*d9f75844SAndroid Build Coastguard Worker }
51*d9f75844SAndroid Build Coastguard Worker 
FakeVoiceMediaChannel(FakeVoiceEngine * engine,const AudioOptions & options,TaskQueueBase * network_thread)52*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel::FakeVoiceMediaChannel(FakeVoiceEngine* engine,
53*d9f75844SAndroid Build Coastguard Worker                                              const AudioOptions& options,
54*d9f75844SAndroid Build Coastguard Worker                                              TaskQueueBase* network_thread)
55*d9f75844SAndroid Build Coastguard Worker     : RtpHelper<VoiceMediaChannel>(network_thread),
56*d9f75844SAndroid Build Coastguard Worker       engine_(engine),
57*d9f75844SAndroid Build Coastguard Worker       max_bps_(-1) {
58*d9f75844SAndroid Build Coastguard Worker   output_scalings_[0] = 1.0;  // For default channel.
59*d9f75844SAndroid Build Coastguard Worker   SetOptions(options);
60*d9f75844SAndroid Build Coastguard Worker }
~FakeVoiceMediaChannel()61*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel::~FakeVoiceMediaChannel() {
62*d9f75844SAndroid Build Coastguard Worker   if (engine_) {
63*d9f75844SAndroid Build Coastguard Worker     engine_->UnregisterChannel(this);
64*d9f75844SAndroid Build Coastguard Worker   }
65*d9f75844SAndroid Build Coastguard Worker }
recv_codecs() const66*d9f75844SAndroid Build Coastguard Worker const std::vector<AudioCodec>& FakeVoiceMediaChannel::recv_codecs() const {
67*d9f75844SAndroid Build Coastguard Worker   return recv_codecs_;
68*d9f75844SAndroid Build Coastguard Worker }
send_codecs() const69*d9f75844SAndroid Build Coastguard Worker const std::vector<AudioCodec>& FakeVoiceMediaChannel::send_codecs() const {
70*d9f75844SAndroid Build Coastguard Worker   return send_codecs_;
71*d9f75844SAndroid Build Coastguard Worker }
codecs() const72*d9f75844SAndroid Build Coastguard Worker const std::vector<AudioCodec>& FakeVoiceMediaChannel::codecs() const {
73*d9f75844SAndroid Build Coastguard Worker   return send_codecs();
74*d9f75844SAndroid Build Coastguard Worker }
75*d9f75844SAndroid Build Coastguard Worker const std::vector<FakeVoiceMediaChannel::DtmfInfo>&
dtmf_info_queue() const76*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel::dtmf_info_queue() const {
77*d9f75844SAndroid Build Coastguard Worker   return dtmf_info_queue_;
78*d9f75844SAndroid Build Coastguard Worker }
options() const79*d9f75844SAndroid Build Coastguard Worker const AudioOptions& FakeVoiceMediaChannel::options() const {
80*d9f75844SAndroid Build Coastguard Worker   return options_;
81*d9f75844SAndroid Build Coastguard Worker }
max_bps() const82*d9f75844SAndroid Build Coastguard Worker int FakeVoiceMediaChannel::max_bps() const {
83*d9f75844SAndroid Build Coastguard Worker   return max_bps_;
84*d9f75844SAndroid Build Coastguard Worker }
SetSendParameters(const AudioSendParameters & params)85*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetSendParameters(
86*d9f75844SAndroid Build Coastguard Worker     const AudioSendParameters& params) {
87*d9f75844SAndroid Build Coastguard Worker   set_send_rtcp_parameters(params.rtcp);
88*d9f75844SAndroid Build Coastguard Worker   return (SetSendCodecs(params.codecs) &&
89*d9f75844SAndroid Build Coastguard Worker           SetSendExtmapAllowMixed(params.extmap_allow_mixed) &&
90*d9f75844SAndroid Build Coastguard Worker           SetSendRtpHeaderExtensions(params.extensions) &&
91*d9f75844SAndroid Build Coastguard Worker           SetMaxSendBandwidth(params.max_bandwidth_bps) &&
92*d9f75844SAndroid Build Coastguard Worker           SetOptions(params.options));
93*d9f75844SAndroid Build Coastguard Worker }
SetRecvParameters(const AudioRecvParameters & params)94*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetRecvParameters(
95*d9f75844SAndroid Build Coastguard Worker     const AudioRecvParameters& params) {
96*d9f75844SAndroid Build Coastguard Worker   set_recv_rtcp_parameters(params.rtcp);
97*d9f75844SAndroid Build Coastguard Worker   return (SetRecvCodecs(params.codecs) &&
98*d9f75844SAndroid Build Coastguard Worker           SetRecvRtpHeaderExtensions(params.extensions));
99*d9f75844SAndroid Build Coastguard Worker }
SetPlayout(bool playout)100*d9f75844SAndroid Build Coastguard Worker void FakeVoiceMediaChannel::SetPlayout(bool playout) {
101*d9f75844SAndroid Build Coastguard Worker   set_playout(playout);
102*d9f75844SAndroid Build Coastguard Worker }
SetSend(bool send)103*d9f75844SAndroid Build Coastguard Worker void FakeVoiceMediaChannel::SetSend(bool send) {
104*d9f75844SAndroid Build Coastguard Worker   set_sending(send);
105*d9f75844SAndroid Build Coastguard Worker }
SetAudioSend(uint32_t ssrc,bool enable,const AudioOptions * options,AudioSource * source)106*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetAudioSend(uint32_t ssrc,
107*d9f75844SAndroid Build Coastguard Worker                                          bool enable,
108*d9f75844SAndroid Build Coastguard Worker                                          const AudioOptions* options,
109*d9f75844SAndroid Build Coastguard Worker                                          AudioSource* source) {
110*d9f75844SAndroid Build Coastguard Worker   if (!SetLocalSource(ssrc, source)) {
111*d9f75844SAndroid Build Coastguard Worker     return false;
112*d9f75844SAndroid Build Coastguard Worker   }
113*d9f75844SAndroid Build Coastguard Worker   if (!RtpHelper<VoiceMediaChannel>::MuteStream(ssrc, !enable)) {
114*d9f75844SAndroid Build Coastguard Worker     return false;
115*d9f75844SAndroid Build Coastguard Worker   }
116*d9f75844SAndroid Build Coastguard Worker   if (enable && options) {
117*d9f75844SAndroid Build Coastguard Worker     return SetOptions(*options);
118*d9f75844SAndroid Build Coastguard Worker   }
119*d9f75844SAndroid Build Coastguard Worker   return true;
120*d9f75844SAndroid Build Coastguard Worker }
HasSource(uint32_t ssrc) const121*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::HasSource(uint32_t ssrc) const {
122*d9f75844SAndroid Build Coastguard Worker   return local_sinks_.find(ssrc) != local_sinks_.end();
123*d9f75844SAndroid Build Coastguard Worker }
AddRecvStream(const StreamParams & sp)124*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
125*d9f75844SAndroid Build Coastguard Worker   if (!RtpHelper<VoiceMediaChannel>::AddRecvStream(sp))
126*d9f75844SAndroid Build Coastguard Worker     return false;
127*d9f75844SAndroid Build Coastguard Worker   output_scalings_[sp.first_ssrc()] = 1.0;
128*d9f75844SAndroid Build Coastguard Worker   output_delays_[sp.first_ssrc()] = 0;
129*d9f75844SAndroid Build Coastguard Worker   return true;
130*d9f75844SAndroid Build Coastguard Worker }
RemoveRecvStream(uint32_t ssrc)131*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) {
132*d9f75844SAndroid Build Coastguard Worker   if (!RtpHelper<VoiceMediaChannel>::RemoveRecvStream(ssrc))
133*d9f75844SAndroid Build Coastguard Worker     return false;
134*d9f75844SAndroid Build Coastguard Worker   output_scalings_.erase(ssrc);
135*d9f75844SAndroid Build Coastguard Worker   output_delays_.erase(ssrc);
136*d9f75844SAndroid Build Coastguard Worker   return true;
137*d9f75844SAndroid Build Coastguard Worker }
CanInsertDtmf()138*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::CanInsertDtmf() {
139*d9f75844SAndroid Build Coastguard Worker   for (std::vector<AudioCodec>::const_iterator it = send_codecs_.begin();
140*d9f75844SAndroid Build Coastguard Worker        it != send_codecs_.end(); ++it) {
141*d9f75844SAndroid Build Coastguard Worker     // Find the DTMF telephone event "codec".
142*d9f75844SAndroid Build Coastguard Worker     if (absl::EqualsIgnoreCase(it->name, "telephone-event")) {
143*d9f75844SAndroid Build Coastguard Worker       return true;
144*d9f75844SAndroid Build Coastguard Worker     }
145*d9f75844SAndroid Build Coastguard Worker   }
146*d9f75844SAndroid Build Coastguard Worker   return false;
147*d9f75844SAndroid Build Coastguard Worker }
InsertDtmf(uint32_t ssrc,int event_code,int duration)148*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::InsertDtmf(uint32_t ssrc,
149*d9f75844SAndroid Build Coastguard Worker                                        int event_code,
150*d9f75844SAndroid Build Coastguard Worker                                        int duration) {
151*d9f75844SAndroid Build Coastguard Worker   dtmf_info_queue_.push_back(DtmfInfo(ssrc, event_code, duration));
152*d9f75844SAndroid Build Coastguard Worker   return true;
153*d9f75844SAndroid Build Coastguard Worker }
SetOutputVolume(uint32_t ssrc,double volume)154*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetOutputVolume(uint32_t ssrc, double volume) {
155*d9f75844SAndroid Build Coastguard Worker   if (output_scalings_.find(ssrc) != output_scalings_.end()) {
156*d9f75844SAndroid Build Coastguard Worker     output_scalings_[ssrc] = volume;
157*d9f75844SAndroid Build Coastguard Worker     return true;
158*d9f75844SAndroid Build Coastguard Worker   }
159*d9f75844SAndroid Build Coastguard Worker   return false;
160*d9f75844SAndroid Build Coastguard Worker }
SetDefaultOutputVolume(double volume)161*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetDefaultOutputVolume(double volume) {
162*d9f75844SAndroid Build Coastguard Worker   for (auto& entry : output_scalings_) {
163*d9f75844SAndroid Build Coastguard Worker     entry.second = volume;
164*d9f75844SAndroid Build Coastguard Worker   }
165*d9f75844SAndroid Build Coastguard Worker   return true;
166*d9f75844SAndroid Build Coastguard Worker }
GetOutputVolume(uint32_t ssrc,double * volume)167*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::GetOutputVolume(uint32_t ssrc, double* volume) {
168*d9f75844SAndroid Build Coastguard Worker   if (output_scalings_.find(ssrc) == output_scalings_.end())
169*d9f75844SAndroid Build Coastguard Worker     return false;
170*d9f75844SAndroid Build Coastguard Worker   *volume = output_scalings_[ssrc];
171*d9f75844SAndroid Build Coastguard Worker   return true;
172*d9f75844SAndroid Build Coastguard Worker }
SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,int delay_ms)173*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,
174*d9f75844SAndroid Build Coastguard Worker                                                          int delay_ms) {
175*d9f75844SAndroid Build Coastguard Worker   if (output_delays_.find(ssrc) == output_delays_.end()) {
176*d9f75844SAndroid Build Coastguard Worker     return false;
177*d9f75844SAndroid Build Coastguard Worker   } else {
178*d9f75844SAndroid Build Coastguard Worker     output_delays_[ssrc] = delay_ms;
179*d9f75844SAndroid Build Coastguard Worker     return true;
180*d9f75844SAndroid Build Coastguard Worker   }
181*d9f75844SAndroid Build Coastguard Worker }
GetBaseMinimumPlayoutDelayMs(uint32_t ssrc) const182*d9f75844SAndroid Build Coastguard Worker absl::optional<int> FakeVoiceMediaChannel::GetBaseMinimumPlayoutDelayMs(
183*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc) const {
184*d9f75844SAndroid Build Coastguard Worker   const auto it = output_delays_.find(ssrc);
185*d9f75844SAndroid Build Coastguard Worker   if (it != output_delays_.end()) {
186*d9f75844SAndroid Build Coastguard Worker     return it->second;
187*d9f75844SAndroid Build Coastguard Worker   }
188*d9f75844SAndroid Build Coastguard Worker   return absl::nullopt;
189*d9f75844SAndroid Build Coastguard Worker }
GetStats(VoiceMediaInfo * info,bool get_and_clear_legacy_stats)190*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::GetStats(VoiceMediaInfo* info,
191*d9f75844SAndroid Build Coastguard Worker                                      bool get_and_clear_legacy_stats) {
192*d9f75844SAndroid Build Coastguard Worker   return false;
193*d9f75844SAndroid Build Coastguard Worker }
SetRawAudioSink(uint32_t ssrc,std::unique_ptr<webrtc::AudioSinkInterface> sink)194*d9f75844SAndroid Build Coastguard Worker void FakeVoiceMediaChannel::SetRawAudioSink(
195*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc,
196*d9f75844SAndroid Build Coastguard Worker     std::unique_ptr<webrtc::AudioSinkInterface> sink) {
197*d9f75844SAndroid Build Coastguard Worker   sink_ = std::move(sink);
198*d9f75844SAndroid Build Coastguard Worker }
SetDefaultRawAudioSink(std::unique_ptr<webrtc::AudioSinkInterface> sink)199*d9f75844SAndroid Build Coastguard Worker void FakeVoiceMediaChannel::SetDefaultRawAudioSink(
200*d9f75844SAndroid Build Coastguard Worker     std::unique_ptr<webrtc::AudioSinkInterface> sink) {
201*d9f75844SAndroid Build Coastguard Worker   sink_ = std::move(sink);
202*d9f75844SAndroid Build Coastguard Worker }
GetSources(uint32_t ssrc) const203*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpSource> FakeVoiceMediaChannel::GetSources(
204*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc) const {
205*d9f75844SAndroid Build Coastguard Worker   return std::vector<webrtc::RtpSource>();
206*d9f75844SAndroid Build Coastguard Worker }
SetRecvCodecs(const std::vector<AudioCodec> & codecs)207*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetRecvCodecs(
208*d9f75844SAndroid Build Coastguard Worker     const std::vector<AudioCodec>& codecs) {
209*d9f75844SAndroid Build Coastguard Worker   if (fail_set_recv_codecs()) {
210*d9f75844SAndroid Build Coastguard Worker     // Fake the failure in SetRecvCodecs.
211*d9f75844SAndroid Build Coastguard Worker     return false;
212*d9f75844SAndroid Build Coastguard Worker   }
213*d9f75844SAndroid Build Coastguard Worker   recv_codecs_ = codecs;
214*d9f75844SAndroid Build Coastguard Worker   return true;
215*d9f75844SAndroid Build Coastguard Worker }
SetSendCodecs(const std::vector<AudioCodec> & codecs)216*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetSendCodecs(
217*d9f75844SAndroid Build Coastguard Worker     const std::vector<AudioCodec>& codecs) {
218*d9f75844SAndroid Build Coastguard Worker   if (fail_set_send_codecs()) {
219*d9f75844SAndroid Build Coastguard Worker     // Fake the failure in SetSendCodecs.
220*d9f75844SAndroid Build Coastguard Worker     return false;
221*d9f75844SAndroid Build Coastguard Worker   }
222*d9f75844SAndroid Build Coastguard Worker   send_codecs_ = codecs;
223*d9f75844SAndroid Build Coastguard Worker   return true;
224*d9f75844SAndroid Build Coastguard Worker }
SetMaxSendBandwidth(int bps)225*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetMaxSendBandwidth(int bps) {
226*d9f75844SAndroid Build Coastguard Worker   max_bps_ = bps;
227*d9f75844SAndroid Build Coastguard Worker   return true;
228*d9f75844SAndroid Build Coastguard Worker }
SetOptions(const AudioOptions & options)229*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetOptions(const AudioOptions& options) {
230*d9f75844SAndroid Build Coastguard Worker   // Does a "merge" of current options and set options.
231*d9f75844SAndroid Build Coastguard Worker   options_.SetAll(options);
232*d9f75844SAndroid Build Coastguard Worker   return true;
233*d9f75844SAndroid Build Coastguard Worker }
SetLocalSource(uint32_t ssrc,AudioSource * source)234*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceMediaChannel::SetLocalSource(uint32_t ssrc, AudioSource* source) {
235*d9f75844SAndroid Build Coastguard Worker   auto it = local_sinks_.find(ssrc);
236*d9f75844SAndroid Build Coastguard Worker   if (source) {
237*d9f75844SAndroid Build Coastguard Worker     if (it != local_sinks_.end()) {
238*d9f75844SAndroid Build Coastguard Worker       RTC_CHECK(it->second->source() == source);
239*d9f75844SAndroid Build Coastguard Worker     } else {
240*d9f75844SAndroid Build Coastguard Worker       local_sinks_.insert(std::make_pair(
241*d9f75844SAndroid Build Coastguard Worker           ssrc, std::make_unique<VoiceChannelAudioSink>(source)));
242*d9f75844SAndroid Build Coastguard Worker     }
243*d9f75844SAndroid Build Coastguard Worker   } else {
244*d9f75844SAndroid Build Coastguard Worker     if (it != local_sinks_.end()) {
245*d9f75844SAndroid Build Coastguard Worker       local_sinks_.erase(it);
246*d9f75844SAndroid Build Coastguard Worker     }
247*d9f75844SAndroid Build Coastguard Worker   }
248*d9f75844SAndroid Build Coastguard Worker   return true;
249*d9f75844SAndroid Build Coastguard Worker }
250*d9f75844SAndroid Build Coastguard Worker 
CompareDtmfInfo(const FakeVoiceMediaChannel::DtmfInfo & info,uint32_t ssrc,int event_code,int duration)251*d9f75844SAndroid Build Coastguard Worker bool CompareDtmfInfo(const FakeVoiceMediaChannel::DtmfInfo& info,
252*d9f75844SAndroid Build Coastguard Worker                      uint32_t ssrc,
253*d9f75844SAndroid Build Coastguard Worker                      int event_code,
254*d9f75844SAndroid Build Coastguard Worker                      int duration) {
255*d9f75844SAndroid Build Coastguard Worker   return (info.duration == duration && info.event_code == event_code &&
256*d9f75844SAndroid Build Coastguard Worker           info.ssrc == ssrc);
257*d9f75844SAndroid Build Coastguard Worker }
258*d9f75844SAndroid Build Coastguard Worker 
FakeVideoMediaChannel(FakeVideoEngine * engine,const VideoOptions & options,TaskQueueBase * network_thread)259*d9f75844SAndroid Build Coastguard Worker FakeVideoMediaChannel::FakeVideoMediaChannel(FakeVideoEngine* engine,
260*d9f75844SAndroid Build Coastguard Worker                                              const VideoOptions& options,
261*d9f75844SAndroid Build Coastguard Worker                                              TaskQueueBase* network_thread)
262*d9f75844SAndroid Build Coastguard Worker     : RtpHelper<VideoMediaChannel>(network_thread),
263*d9f75844SAndroid Build Coastguard Worker       engine_(engine),
264*d9f75844SAndroid Build Coastguard Worker       max_bps_(-1) {
265*d9f75844SAndroid Build Coastguard Worker   SetOptions(options);
266*d9f75844SAndroid Build Coastguard Worker }
~FakeVideoMediaChannel()267*d9f75844SAndroid Build Coastguard Worker FakeVideoMediaChannel::~FakeVideoMediaChannel() {
268*d9f75844SAndroid Build Coastguard Worker   if (engine_) {
269*d9f75844SAndroid Build Coastguard Worker     engine_->UnregisterChannel(this);
270*d9f75844SAndroid Build Coastguard Worker   }
271*d9f75844SAndroid Build Coastguard Worker }
recv_codecs() const272*d9f75844SAndroid Build Coastguard Worker const std::vector<VideoCodec>& FakeVideoMediaChannel::recv_codecs() const {
273*d9f75844SAndroid Build Coastguard Worker   return recv_codecs_;
274*d9f75844SAndroid Build Coastguard Worker }
send_codecs() const275*d9f75844SAndroid Build Coastguard Worker const std::vector<VideoCodec>& FakeVideoMediaChannel::send_codecs() const {
276*d9f75844SAndroid Build Coastguard Worker   return send_codecs_;
277*d9f75844SAndroid Build Coastguard Worker }
codecs() const278*d9f75844SAndroid Build Coastguard Worker const std::vector<VideoCodec>& FakeVideoMediaChannel::codecs() const {
279*d9f75844SAndroid Build Coastguard Worker   return send_codecs();
280*d9f75844SAndroid Build Coastguard Worker }
rendering() const281*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::rendering() const {
282*d9f75844SAndroid Build Coastguard Worker   return playout();
283*d9f75844SAndroid Build Coastguard Worker }
options() const284*d9f75844SAndroid Build Coastguard Worker const VideoOptions& FakeVideoMediaChannel::options() const {
285*d9f75844SAndroid Build Coastguard Worker   return options_;
286*d9f75844SAndroid Build Coastguard Worker }
287*d9f75844SAndroid Build Coastguard Worker const std::map<uint32_t, rtc::VideoSinkInterface<webrtc::VideoFrame>*>&
sinks() const288*d9f75844SAndroid Build Coastguard Worker FakeVideoMediaChannel::sinks() const {
289*d9f75844SAndroid Build Coastguard Worker   return sinks_;
290*d9f75844SAndroid Build Coastguard Worker }
max_bps() const291*d9f75844SAndroid Build Coastguard Worker int FakeVideoMediaChannel::max_bps() const {
292*d9f75844SAndroid Build Coastguard Worker   return max_bps_;
293*d9f75844SAndroid Build Coastguard Worker }
SetSendParameters(const VideoSendParameters & params)294*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetSendParameters(
295*d9f75844SAndroid Build Coastguard Worker     const VideoSendParameters& params) {
296*d9f75844SAndroid Build Coastguard Worker   set_send_rtcp_parameters(params.rtcp);
297*d9f75844SAndroid Build Coastguard Worker   return (SetSendCodecs(params.codecs) &&
298*d9f75844SAndroid Build Coastguard Worker           SetSendExtmapAllowMixed(params.extmap_allow_mixed) &&
299*d9f75844SAndroid Build Coastguard Worker           SetSendRtpHeaderExtensions(params.extensions) &&
300*d9f75844SAndroid Build Coastguard Worker           SetMaxSendBandwidth(params.max_bandwidth_bps));
301*d9f75844SAndroid Build Coastguard Worker }
SetRecvParameters(const VideoRecvParameters & params)302*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetRecvParameters(
303*d9f75844SAndroid Build Coastguard Worker     const VideoRecvParameters& params) {
304*d9f75844SAndroid Build Coastguard Worker   set_recv_rtcp_parameters(params.rtcp);
305*d9f75844SAndroid Build Coastguard Worker   return (SetRecvCodecs(params.codecs) &&
306*d9f75844SAndroid Build Coastguard Worker           SetRecvRtpHeaderExtensions(params.extensions));
307*d9f75844SAndroid Build Coastguard Worker }
AddSendStream(const StreamParams & sp)308*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::AddSendStream(const StreamParams& sp) {
309*d9f75844SAndroid Build Coastguard Worker   return RtpHelper<VideoMediaChannel>::AddSendStream(sp);
310*d9f75844SAndroid Build Coastguard Worker }
RemoveSendStream(uint32_t ssrc)311*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::RemoveSendStream(uint32_t ssrc) {
312*d9f75844SAndroid Build Coastguard Worker   return RtpHelper<VideoMediaChannel>::RemoveSendStream(ssrc);
313*d9f75844SAndroid Build Coastguard Worker }
GetSendCodec(VideoCodec * send_codec)314*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::GetSendCodec(VideoCodec* send_codec) {
315*d9f75844SAndroid Build Coastguard Worker   if (send_codecs_.empty()) {
316*d9f75844SAndroid Build Coastguard Worker     return false;
317*d9f75844SAndroid Build Coastguard Worker   }
318*d9f75844SAndroid Build Coastguard Worker   *send_codec = send_codecs_[0];
319*d9f75844SAndroid Build Coastguard Worker   return true;
320*d9f75844SAndroid Build Coastguard Worker }
SetSink(uint32_t ssrc,rtc::VideoSinkInterface<webrtc::VideoFrame> * sink)321*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetSink(
322*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc,
323*d9f75844SAndroid Build Coastguard Worker     rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
324*d9f75844SAndroid Build Coastguard Worker   auto it = sinks_.find(ssrc);
325*d9f75844SAndroid Build Coastguard Worker   if (it == sinks_.end()) {
326*d9f75844SAndroid Build Coastguard Worker     return false;
327*d9f75844SAndroid Build Coastguard Worker   }
328*d9f75844SAndroid Build Coastguard Worker   it->second = sink;
329*d9f75844SAndroid Build Coastguard Worker   return true;
330*d9f75844SAndroid Build Coastguard Worker }
SetDefaultSink(rtc::VideoSinkInterface<webrtc::VideoFrame> * sink)331*d9f75844SAndroid Build Coastguard Worker void FakeVideoMediaChannel::SetDefaultSink(
332*d9f75844SAndroid Build Coastguard Worker     rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {}
HasSink(uint32_t ssrc) const333*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::HasSink(uint32_t ssrc) const {
334*d9f75844SAndroid Build Coastguard Worker   return sinks_.find(ssrc) != sinks_.end() && sinks_.at(ssrc) != nullptr;
335*d9f75844SAndroid Build Coastguard Worker }
SetSend(bool send)336*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetSend(bool send) {
337*d9f75844SAndroid Build Coastguard Worker   return set_sending(send);
338*d9f75844SAndroid Build Coastguard Worker }
SetVideoSend(uint32_t ssrc,const VideoOptions * options,rtc::VideoSourceInterface<webrtc::VideoFrame> * source)339*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetVideoSend(
340*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc,
341*d9f75844SAndroid Build Coastguard Worker     const VideoOptions* options,
342*d9f75844SAndroid Build Coastguard Worker     rtc::VideoSourceInterface<webrtc::VideoFrame>* source) {
343*d9f75844SAndroid Build Coastguard Worker   if (options) {
344*d9f75844SAndroid Build Coastguard Worker     if (!SetOptions(*options)) {
345*d9f75844SAndroid Build Coastguard Worker       return false;
346*d9f75844SAndroid Build Coastguard Worker     }
347*d9f75844SAndroid Build Coastguard Worker   }
348*d9f75844SAndroid Build Coastguard Worker   sources_[ssrc] = source;
349*d9f75844SAndroid Build Coastguard Worker   return true;
350*d9f75844SAndroid Build Coastguard Worker }
HasSource(uint32_t ssrc) const351*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::HasSource(uint32_t ssrc) const {
352*d9f75844SAndroid Build Coastguard Worker   return sources_.find(ssrc) != sources_.end() && sources_.at(ssrc) != nullptr;
353*d9f75844SAndroid Build Coastguard Worker }
AddRecvStream(const StreamParams & sp)354*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::AddRecvStream(const StreamParams& sp) {
355*d9f75844SAndroid Build Coastguard Worker   if (!RtpHelper<VideoMediaChannel>::AddRecvStream(sp))
356*d9f75844SAndroid Build Coastguard Worker     return false;
357*d9f75844SAndroid Build Coastguard Worker   sinks_[sp.first_ssrc()] = NULL;
358*d9f75844SAndroid Build Coastguard Worker   output_delays_[sp.first_ssrc()] = 0;
359*d9f75844SAndroid Build Coastguard Worker   return true;
360*d9f75844SAndroid Build Coastguard Worker }
RemoveRecvStream(uint32_t ssrc)361*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::RemoveRecvStream(uint32_t ssrc) {
362*d9f75844SAndroid Build Coastguard Worker   if (!RtpHelper<VideoMediaChannel>::RemoveRecvStream(ssrc))
363*d9f75844SAndroid Build Coastguard Worker     return false;
364*d9f75844SAndroid Build Coastguard Worker   sinks_.erase(ssrc);
365*d9f75844SAndroid Build Coastguard Worker   output_delays_.erase(ssrc);
366*d9f75844SAndroid Build Coastguard Worker   return true;
367*d9f75844SAndroid Build Coastguard Worker }
FillBitrateInfo(BandwidthEstimationInfo * bwe_info)368*d9f75844SAndroid Build Coastguard Worker void FakeVideoMediaChannel::FillBitrateInfo(BandwidthEstimationInfo* bwe_info) {
369*d9f75844SAndroid Build Coastguard Worker }
GetStats(VideoMediaInfo * info)370*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::GetStats(VideoMediaInfo* info) {
371*d9f75844SAndroid Build Coastguard Worker   return false;
372*d9f75844SAndroid Build Coastguard Worker }
GetSources(uint32_t ssrc) const373*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpSource> FakeVideoMediaChannel::GetSources(
374*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc) const {
375*d9f75844SAndroid Build Coastguard Worker   return {};
376*d9f75844SAndroid Build Coastguard Worker }
SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,int delay_ms)377*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,
378*d9f75844SAndroid Build Coastguard Worker                                                          int delay_ms) {
379*d9f75844SAndroid Build Coastguard Worker   if (output_delays_.find(ssrc) == output_delays_.end()) {
380*d9f75844SAndroid Build Coastguard Worker     return false;
381*d9f75844SAndroid Build Coastguard Worker   } else {
382*d9f75844SAndroid Build Coastguard Worker     output_delays_[ssrc] = delay_ms;
383*d9f75844SAndroid Build Coastguard Worker     return true;
384*d9f75844SAndroid Build Coastguard Worker   }
385*d9f75844SAndroid Build Coastguard Worker }
GetBaseMinimumPlayoutDelayMs(uint32_t ssrc) const386*d9f75844SAndroid Build Coastguard Worker absl::optional<int> FakeVideoMediaChannel::GetBaseMinimumPlayoutDelayMs(
387*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc) const {
388*d9f75844SAndroid Build Coastguard Worker   const auto it = output_delays_.find(ssrc);
389*d9f75844SAndroid Build Coastguard Worker   if (it != output_delays_.end()) {
390*d9f75844SAndroid Build Coastguard Worker     return it->second;
391*d9f75844SAndroid Build Coastguard Worker   }
392*d9f75844SAndroid Build Coastguard Worker   return absl::nullopt;
393*d9f75844SAndroid Build Coastguard Worker }
SetRecvCodecs(const std::vector<VideoCodec> & codecs)394*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetRecvCodecs(
395*d9f75844SAndroid Build Coastguard Worker     const std::vector<VideoCodec>& codecs) {
396*d9f75844SAndroid Build Coastguard Worker   if (fail_set_recv_codecs()) {
397*d9f75844SAndroid Build Coastguard Worker     // Fake the failure in SetRecvCodecs.
398*d9f75844SAndroid Build Coastguard Worker     return false;
399*d9f75844SAndroid Build Coastguard Worker   }
400*d9f75844SAndroid Build Coastguard Worker   recv_codecs_ = codecs;
401*d9f75844SAndroid Build Coastguard Worker   return true;
402*d9f75844SAndroid Build Coastguard Worker }
SetSendCodecs(const std::vector<VideoCodec> & codecs)403*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetSendCodecs(
404*d9f75844SAndroid Build Coastguard Worker     const std::vector<VideoCodec>& codecs) {
405*d9f75844SAndroid Build Coastguard Worker   if (fail_set_send_codecs()) {
406*d9f75844SAndroid Build Coastguard Worker     // Fake the failure in SetSendCodecs.
407*d9f75844SAndroid Build Coastguard Worker     return false;
408*d9f75844SAndroid Build Coastguard Worker   }
409*d9f75844SAndroid Build Coastguard Worker   send_codecs_ = codecs;
410*d9f75844SAndroid Build Coastguard Worker 
411*d9f75844SAndroid Build Coastguard Worker   return true;
412*d9f75844SAndroid Build Coastguard Worker }
SetOptions(const VideoOptions & options)413*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetOptions(const VideoOptions& options) {
414*d9f75844SAndroid Build Coastguard Worker   options_ = options;
415*d9f75844SAndroid Build Coastguard Worker   return true;
416*d9f75844SAndroid Build Coastguard Worker }
417*d9f75844SAndroid Build Coastguard Worker 
SetMaxSendBandwidth(int bps)418*d9f75844SAndroid Build Coastguard Worker bool FakeVideoMediaChannel::SetMaxSendBandwidth(int bps) {
419*d9f75844SAndroid Build Coastguard Worker   max_bps_ = bps;
420*d9f75844SAndroid Build Coastguard Worker   return true;
421*d9f75844SAndroid Build Coastguard Worker }
422*d9f75844SAndroid Build Coastguard Worker 
SetRecordableEncodedFrameCallback(uint32_t ssrc,std::function<void (const webrtc::RecordableEncodedFrame &)> callback)423*d9f75844SAndroid Build Coastguard Worker void FakeVideoMediaChannel::SetRecordableEncodedFrameCallback(
424*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc,
425*d9f75844SAndroid Build Coastguard Worker     std::function<void(const webrtc::RecordableEncodedFrame&)> callback) {}
426*d9f75844SAndroid Build Coastguard Worker 
ClearRecordableEncodedFrameCallback(uint32_t ssrc)427*d9f75844SAndroid Build Coastguard Worker void FakeVideoMediaChannel::ClearRecordableEncodedFrameCallback(uint32_t ssrc) {
428*d9f75844SAndroid Build Coastguard Worker }
429*d9f75844SAndroid Build Coastguard Worker 
RequestRecvKeyFrame(uint32_t ssrc)430*d9f75844SAndroid Build Coastguard Worker void FakeVideoMediaChannel::RequestRecvKeyFrame(uint32_t ssrc) {}
GenerateSendKeyFrame(uint32_t ssrc,const std::vector<std::string> & rids)431*d9f75844SAndroid Build Coastguard Worker void FakeVideoMediaChannel::GenerateSendKeyFrame(
432*d9f75844SAndroid Build Coastguard Worker     uint32_t ssrc,
433*d9f75844SAndroid Build Coastguard Worker     const std::vector<std::string>& rids) {}
434*d9f75844SAndroid Build Coastguard Worker 
FakeVoiceEngine()435*d9f75844SAndroid Build Coastguard Worker FakeVoiceEngine::FakeVoiceEngine() : fail_create_channel_(false) {
436*d9f75844SAndroid Build Coastguard Worker   // Add a fake audio codec. Note that the name must not be "" as there are
437*d9f75844SAndroid Build Coastguard Worker   // sanity checks against that.
438*d9f75844SAndroid Build Coastguard Worker   SetCodecs({AudioCodec(101, "fake_audio_codec", 0, 0, 1)});
439*d9f75844SAndroid Build Coastguard Worker }
Init()440*d9f75844SAndroid Build Coastguard Worker void FakeVoiceEngine::Init() {}
GetAudioState() const441*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::AudioState> FakeVoiceEngine::GetAudioState() const {
442*d9f75844SAndroid Build Coastguard Worker   return rtc::scoped_refptr<webrtc::AudioState>();
443*d9f75844SAndroid Build Coastguard Worker }
CreateMediaChannel(webrtc::Call * call,const MediaConfig & config,const AudioOptions & options,const webrtc::CryptoOptions & crypto_options)444*d9f75844SAndroid Build Coastguard Worker VoiceMediaChannel* FakeVoiceEngine::CreateMediaChannel(
445*d9f75844SAndroid Build Coastguard Worker     webrtc::Call* call,
446*d9f75844SAndroid Build Coastguard Worker     const MediaConfig& config,
447*d9f75844SAndroid Build Coastguard Worker     const AudioOptions& options,
448*d9f75844SAndroid Build Coastguard Worker     const webrtc::CryptoOptions& crypto_options) {
449*d9f75844SAndroid Build Coastguard Worker   if (fail_create_channel_) {
450*d9f75844SAndroid Build Coastguard Worker     return nullptr;
451*d9f75844SAndroid Build Coastguard Worker   }
452*d9f75844SAndroid Build Coastguard Worker 
453*d9f75844SAndroid Build Coastguard Worker   FakeVoiceMediaChannel* ch =
454*d9f75844SAndroid Build Coastguard Worker       new FakeVoiceMediaChannel(this, options, call->network_thread());
455*d9f75844SAndroid Build Coastguard Worker   channels_.push_back(ch);
456*d9f75844SAndroid Build Coastguard Worker   return ch;
457*d9f75844SAndroid Build Coastguard Worker }
GetChannel(size_t index)458*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel* FakeVoiceEngine::GetChannel(size_t index) {
459*d9f75844SAndroid Build Coastguard Worker   return (channels_.size() > index) ? channels_[index] : NULL;
460*d9f75844SAndroid Build Coastguard Worker }
UnregisterChannel(VoiceMediaChannel * channel)461*d9f75844SAndroid Build Coastguard Worker void FakeVoiceEngine::UnregisterChannel(VoiceMediaChannel* channel) {
462*d9f75844SAndroid Build Coastguard Worker   channels_.erase(absl::c_find(channels_, channel));
463*d9f75844SAndroid Build Coastguard Worker }
send_codecs() const464*d9f75844SAndroid Build Coastguard Worker const std::vector<AudioCodec>& FakeVoiceEngine::send_codecs() const {
465*d9f75844SAndroid Build Coastguard Worker   return send_codecs_;
466*d9f75844SAndroid Build Coastguard Worker }
recv_codecs() const467*d9f75844SAndroid Build Coastguard Worker const std::vector<AudioCodec>& FakeVoiceEngine::recv_codecs() const {
468*d9f75844SAndroid Build Coastguard Worker   return recv_codecs_;
469*d9f75844SAndroid Build Coastguard Worker }
SetCodecs(const std::vector<AudioCodec> & codecs)470*d9f75844SAndroid Build Coastguard Worker void FakeVoiceEngine::SetCodecs(const std::vector<AudioCodec>& codecs) {
471*d9f75844SAndroid Build Coastguard Worker   send_codecs_ = codecs;
472*d9f75844SAndroid Build Coastguard Worker   recv_codecs_ = codecs;
473*d9f75844SAndroid Build Coastguard Worker }
SetRecvCodecs(const std::vector<AudioCodec> & codecs)474*d9f75844SAndroid Build Coastguard Worker void FakeVoiceEngine::SetRecvCodecs(const std::vector<AudioCodec>& codecs) {
475*d9f75844SAndroid Build Coastguard Worker   recv_codecs_ = codecs;
476*d9f75844SAndroid Build Coastguard Worker }
SetSendCodecs(const std::vector<AudioCodec> & codecs)477*d9f75844SAndroid Build Coastguard Worker void FakeVoiceEngine::SetSendCodecs(const std::vector<AudioCodec>& codecs) {
478*d9f75844SAndroid Build Coastguard Worker   send_codecs_ = codecs;
479*d9f75844SAndroid Build Coastguard Worker }
GetInputLevel()480*d9f75844SAndroid Build Coastguard Worker int FakeVoiceEngine::GetInputLevel() {
481*d9f75844SAndroid Build Coastguard Worker   return 0;
482*d9f75844SAndroid Build Coastguard Worker }
StartAecDump(webrtc::FileWrapper file,int64_t max_size_bytes)483*d9f75844SAndroid Build Coastguard Worker bool FakeVoiceEngine::StartAecDump(webrtc::FileWrapper file,
484*d9f75844SAndroid Build Coastguard Worker                                    int64_t max_size_bytes) {
485*d9f75844SAndroid Build Coastguard Worker   return false;
486*d9f75844SAndroid Build Coastguard Worker }
StopAecDump()487*d9f75844SAndroid Build Coastguard Worker void FakeVoiceEngine::StopAecDump() {}
488*d9f75844SAndroid Build Coastguard Worker 
489*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpHeaderExtensionCapability>
GetRtpHeaderExtensions() const490*d9f75844SAndroid Build Coastguard Worker FakeVoiceEngine::GetRtpHeaderExtensions() const {
491*d9f75844SAndroid Build Coastguard Worker   return header_extensions_;
492*d9f75844SAndroid Build Coastguard Worker }
493*d9f75844SAndroid Build Coastguard Worker 
SetRtpHeaderExtensions(std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions)494*d9f75844SAndroid Build Coastguard Worker void FakeVoiceEngine::SetRtpHeaderExtensions(
495*d9f75844SAndroid Build Coastguard Worker     std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions) {
496*d9f75844SAndroid Build Coastguard Worker   header_extensions_ = std::move(header_extensions);
497*d9f75844SAndroid Build Coastguard Worker }
498*d9f75844SAndroid Build Coastguard Worker 
FakeVideoEngine()499*d9f75844SAndroid Build Coastguard Worker FakeVideoEngine::FakeVideoEngine()
500*d9f75844SAndroid Build Coastguard Worker     : capture_(false), fail_create_channel_(false) {
501*d9f75844SAndroid Build Coastguard Worker   // Add a fake video codec. Note that the name must not be "" as there are
502*d9f75844SAndroid Build Coastguard Worker   // sanity checks against that.
503*d9f75844SAndroid Build Coastguard Worker   send_codecs_.push_back(VideoCodec(0, "fake_video_codec"));
504*d9f75844SAndroid Build Coastguard Worker   recv_codecs_.push_back(VideoCodec(0, "fake_video_codec"));
505*d9f75844SAndroid Build Coastguard Worker }
SetOptions(const VideoOptions & options)506*d9f75844SAndroid Build Coastguard Worker bool FakeVideoEngine::SetOptions(const VideoOptions& options) {
507*d9f75844SAndroid Build Coastguard Worker   options_ = options;
508*d9f75844SAndroid Build Coastguard Worker   return true;
509*d9f75844SAndroid Build Coastguard Worker }
CreateMediaChannel(webrtc::Call * call,const MediaConfig & config,const VideoOptions & options,const webrtc::CryptoOptions & crypto_options,webrtc::VideoBitrateAllocatorFactory * video_bitrate_allocator_factory)510*d9f75844SAndroid Build Coastguard Worker VideoMediaChannel* FakeVideoEngine::CreateMediaChannel(
511*d9f75844SAndroid Build Coastguard Worker     webrtc::Call* call,
512*d9f75844SAndroid Build Coastguard Worker     const MediaConfig& config,
513*d9f75844SAndroid Build Coastguard Worker     const VideoOptions& options,
514*d9f75844SAndroid Build Coastguard Worker     const webrtc::CryptoOptions& crypto_options,
515*d9f75844SAndroid Build Coastguard Worker     webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory) {
516*d9f75844SAndroid Build Coastguard Worker   if (fail_create_channel_) {
517*d9f75844SAndroid Build Coastguard Worker     return nullptr;
518*d9f75844SAndroid Build Coastguard Worker   }
519*d9f75844SAndroid Build Coastguard Worker 
520*d9f75844SAndroid Build Coastguard Worker   FakeVideoMediaChannel* ch =
521*d9f75844SAndroid Build Coastguard Worker       new FakeVideoMediaChannel(this, options, call->network_thread());
522*d9f75844SAndroid Build Coastguard Worker   channels_.emplace_back(ch);
523*d9f75844SAndroid Build Coastguard Worker   return ch;
524*d9f75844SAndroid Build Coastguard Worker }
GetChannel(size_t index)525*d9f75844SAndroid Build Coastguard Worker FakeVideoMediaChannel* FakeVideoEngine::GetChannel(size_t index) {
526*d9f75844SAndroid Build Coastguard Worker   return (channels_.size() > index) ? channels_[index] : nullptr;
527*d9f75844SAndroid Build Coastguard Worker }
UnregisterChannel(VideoMediaChannel * channel)528*d9f75844SAndroid Build Coastguard Worker void FakeVideoEngine::UnregisterChannel(VideoMediaChannel* channel) {
529*d9f75844SAndroid Build Coastguard Worker   auto it = absl::c_find(channels_, channel);
530*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK(it != channels_.end());
531*d9f75844SAndroid Build Coastguard Worker   channels_.erase(it);
532*d9f75844SAndroid Build Coastguard Worker }
send_codecs(bool use_rtx) const533*d9f75844SAndroid Build Coastguard Worker std::vector<VideoCodec> FakeVideoEngine::send_codecs(bool use_rtx) const {
534*d9f75844SAndroid Build Coastguard Worker   return send_codecs_;
535*d9f75844SAndroid Build Coastguard Worker }
536*d9f75844SAndroid Build Coastguard Worker 
recv_codecs(bool use_rtx) const537*d9f75844SAndroid Build Coastguard Worker std::vector<VideoCodec> FakeVideoEngine::recv_codecs(bool use_rtx) const {
538*d9f75844SAndroid Build Coastguard Worker   return recv_codecs_;
539*d9f75844SAndroid Build Coastguard Worker }
540*d9f75844SAndroid Build Coastguard Worker 
SetSendCodecs(const std::vector<VideoCodec> & codecs)541*d9f75844SAndroid Build Coastguard Worker void FakeVideoEngine::SetSendCodecs(const std::vector<VideoCodec>& codecs) {
542*d9f75844SAndroid Build Coastguard Worker   send_codecs_ = codecs;
543*d9f75844SAndroid Build Coastguard Worker }
544*d9f75844SAndroid Build Coastguard Worker 
SetRecvCodecs(const std::vector<VideoCodec> & codecs)545*d9f75844SAndroid Build Coastguard Worker void FakeVideoEngine::SetRecvCodecs(const std::vector<VideoCodec>& codecs) {
546*d9f75844SAndroid Build Coastguard Worker   recv_codecs_ = codecs;
547*d9f75844SAndroid Build Coastguard Worker }
548*d9f75844SAndroid Build Coastguard Worker 
SetCapture(bool capture)549*d9f75844SAndroid Build Coastguard Worker bool FakeVideoEngine::SetCapture(bool capture) {
550*d9f75844SAndroid Build Coastguard Worker   capture_ = capture;
551*d9f75844SAndroid Build Coastguard Worker   return true;
552*d9f75844SAndroid Build Coastguard Worker }
553*d9f75844SAndroid Build Coastguard Worker std::vector<webrtc::RtpHeaderExtensionCapability>
GetRtpHeaderExtensions() const554*d9f75844SAndroid Build Coastguard Worker FakeVideoEngine::GetRtpHeaderExtensions() const {
555*d9f75844SAndroid Build Coastguard Worker   return header_extensions_;
556*d9f75844SAndroid Build Coastguard Worker }
SetRtpHeaderExtensions(std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions)557*d9f75844SAndroid Build Coastguard Worker void FakeVideoEngine::SetRtpHeaderExtensions(
558*d9f75844SAndroid Build Coastguard Worker     std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions) {
559*d9f75844SAndroid Build Coastguard Worker   header_extensions_ = std::move(header_extensions);
560*d9f75844SAndroid Build Coastguard Worker }
561*d9f75844SAndroid Build Coastguard Worker 
FakeMediaEngine()562*d9f75844SAndroid Build Coastguard Worker FakeMediaEngine::FakeMediaEngine()
563*d9f75844SAndroid Build Coastguard Worker     : CompositeMediaEngine(std::make_unique<FakeVoiceEngine>(),
564*d9f75844SAndroid Build Coastguard Worker                            std::make_unique<FakeVideoEngine>()),
565*d9f75844SAndroid Build Coastguard Worker       voice_(static_cast<FakeVoiceEngine*>(&voice())),
566*d9f75844SAndroid Build Coastguard Worker       video_(static_cast<FakeVideoEngine*>(&video())) {}
~FakeMediaEngine()567*d9f75844SAndroid Build Coastguard Worker FakeMediaEngine::~FakeMediaEngine() {}
SetAudioCodecs(const std::vector<AudioCodec> & codecs)568*d9f75844SAndroid Build Coastguard Worker void FakeMediaEngine::SetAudioCodecs(const std::vector<AudioCodec>& codecs) {
569*d9f75844SAndroid Build Coastguard Worker   voice_->SetCodecs(codecs);
570*d9f75844SAndroid Build Coastguard Worker }
SetAudioRecvCodecs(const std::vector<AudioCodec> & codecs)571*d9f75844SAndroid Build Coastguard Worker void FakeMediaEngine::SetAudioRecvCodecs(
572*d9f75844SAndroid Build Coastguard Worker     const std::vector<AudioCodec>& codecs) {
573*d9f75844SAndroid Build Coastguard Worker   voice_->SetRecvCodecs(codecs);
574*d9f75844SAndroid Build Coastguard Worker }
SetAudioSendCodecs(const std::vector<AudioCodec> & codecs)575*d9f75844SAndroid Build Coastguard Worker void FakeMediaEngine::SetAudioSendCodecs(
576*d9f75844SAndroid Build Coastguard Worker     const std::vector<AudioCodec>& codecs) {
577*d9f75844SAndroid Build Coastguard Worker   voice_->SetSendCodecs(codecs);
578*d9f75844SAndroid Build Coastguard Worker }
SetVideoCodecs(const std::vector<VideoCodec> & codecs)579*d9f75844SAndroid Build Coastguard Worker void FakeMediaEngine::SetVideoCodecs(const std::vector<VideoCodec>& codecs) {
580*d9f75844SAndroid Build Coastguard Worker   video_->SetSendCodecs(codecs);
581*d9f75844SAndroid Build Coastguard Worker   video_->SetRecvCodecs(codecs);
582*d9f75844SAndroid Build Coastguard Worker }
583*d9f75844SAndroid Build Coastguard Worker 
GetVoiceChannel(size_t index)584*d9f75844SAndroid Build Coastguard Worker FakeVoiceMediaChannel* FakeMediaEngine::GetVoiceChannel(size_t index) {
585*d9f75844SAndroid Build Coastguard Worker   return voice_->GetChannel(index);
586*d9f75844SAndroid Build Coastguard Worker }
GetVideoChannel(size_t index)587*d9f75844SAndroid Build Coastguard Worker FakeVideoMediaChannel* FakeMediaEngine::GetVideoChannel(size_t index) {
588*d9f75844SAndroid Build Coastguard Worker   return video_->GetChannel(index);
589*d9f75844SAndroid Build Coastguard Worker }
590*d9f75844SAndroid Build Coastguard Worker 
set_fail_create_channel(bool fail)591*d9f75844SAndroid Build Coastguard Worker void FakeMediaEngine::set_fail_create_channel(bool fail) {
592*d9f75844SAndroid Build Coastguard Worker   voice_->fail_create_channel_ = fail;
593*d9f75844SAndroid Build Coastguard Worker   video_->fail_create_channel_ = fail;
594*d9f75844SAndroid Build Coastguard Worker }
595*d9f75844SAndroid Build Coastguard Worker 
596*d9f75844SAndroid Build Coastguard Worker }  // namespace cricket
597