1 /*
2  *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "media/base/fake_media_engine.h"
12 
13 #include <memory>
14 #include <utility>
15 
16 #include "absl/algorithm/container.h"
17 #include "absl/strings/match.h"
18 #include "rtc_base/checks.h"
19 
20 namespace cricket {
21 
DtmfInfo(uint32_t ssrc,int event_code,int duration)22 FakeVoiceMediaChannel::DtmfInfo::DtmfInfo(uint32_t ssrc,
23                                           int event_code,
24                                           int duration)
25     : ssrc(ssrc), event_code(event_code), duration(duration) {}
26 
VoiceChannelAudioSink(AudioSource * source)27 FakeVoiceMediaChannel::VoiceChannelAudioSink::VoiceChannelAudioSink(
28     AudioSource* source)
29     : source_(source) {
30   source_->SetSink(this);
31 }
~VoiceChannelAudioSink()32 FakeVoiceMediaChannel::VoiceChannelAudioSink::~VoiceChannelAudioSink() {
33   if (source_) {
34     source_->SetSink(nullptr);
35   }
36 }
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)37 void FakeVoiceMediaChannel::VoiceChannelAudioSink::OnData(
38     const void* audio_data,
39     int bits_per_sample,
40     int sample_rate,
41     size_t number_of_channels,
42     size_t number_of_frames,
43     absl::optional<int64_t> absolute_capture_timestamp_ms) {}
OnClose()44 void FakeVoiceMediaChannel::VoiceChannelAudioSink::OnClose() {
45   source_ = nullptr;
46 }
source() const47 AudioSource* FakeVoiceMediaChannel::VoiceChannelAudioSink::source() const {
48   return source_;
49 }
50 
FakeVoiceMediaChannel(FakeVoiceEngine * engine,const AudioOptions & options)51 FakeVoiceMediaChannel::FakeVoiceMediaChannel(FakeVoiceEngine* engine,
52                                              const AudioOptions& options)
53     : engine_(engine), max_bps_(-1) {
54   output_scalings_[0] = 1.0;  // For default channel.
55   SetOptions(options);
56 }
~FakeVoiceMediaChannel()57 FakeVoiceMediaChannel::~FakeVoiceMediaChannel() {
58   if (engine_) {
59     engine_->UnregisterChannel(this);
60   }
61 }
recv_codecs() const62 const std::vector<AudioCodec>& FakeVoiceMediaChannel::recv_codecs() const {
63   return recv_codecs_;
64 }
send_codecs() const65 const std::vector<AudioCodec>& FakeVoiceMediaChannel::send_codecs() const {
66   return send_codecs_;
67 }
codecs() const68 const std::vector<AudioCodec>& FakeVoiceMediaChannel::codecs() const {
69   return send_codecs();
70 }
71 const std::vector<FakeVoiceMediaChannel::DtmfInfo>&
dtmf_info_queue() const72 FakeVoiceMediaChannel::dtmf_info_queue() const {
73   return dtmf_info_queue_;
74 }
options() const75 const AudioOptions& FakeVoiceMediaChannel::options() const {
76   return options_;
77 }
max_bps() const78 int FakeVoiceMediaChannel::max_bps() const {
79   return max_bps_;
80 }
SetSendParameters(const AudioSendParameters & params)81 bool FakeVoiceMediaChannel::SetSendParameters(
82     const AudioSendParameters& params) {
83   set_send_rtcp_parameters(params.rtcp);
84   return (SetSendCodecs(params.codecs) &&
85           SetSendExtmapAllowMixed(params.extmap_allow_mixed) &&
86           SetSendRtpHeaderExtensions(params.extensions) &&
87           SetMaxSendBandwidth(params.max_bandwidth_bps) &&
88           SetOptions(params.options));
89 }
SetRecvParameters(const AudioRecvParameters & params)90 bool FakeVoiceMediaChannel::SetRecvParameters(
91     const AudioRecvParameters& params) {
92   set_recv_rtcp_parameters(params.rtcp);
93   return (SetRecvCodecs(params.codecs) &&
94           SetRecvRtpHeaderExtensions(params.extensions));
95 }
SetPlayout(bool playout)96 void FakeVoiceMediaChannel::SetPlayout(bool playout) {
97   set_playout(playout);
98 }
SetSend(bool send)99 void FakeVoiceMediaChannel::SetSend(bool send) {
100   set_sending(send);
101 }
SetAudioSend(uint32_t ssrc,bool enable,const AudioOptions * options,AudioSource * source)102 bool FakeVoiceMediaChannel::SetAudioSend(uint32_t ssrc,
103                                          bool enable,
104                                          const AudioOptions* options,
105                                          AudioSource* source) {
106   if (!SetLocalSource(ssrc, source)) {
107     return false;
108   }
109   if (!RtpHelper<VoiceMediaChannel>::MuteStream(ssrc, !enable)) {
110     return false;
111   }
112   if (enable && options) {
113     return SetOptions(*options);
114   }
115   return true;
116 }
HasSource(uint32_t ssrc) const117 bool FakeVoiceMediaChannel::HasSource(uint32_t ssrc) const {
118   return local_sinks_.find(ssrc) != local_sinks_.end();
119 }
AddRecvStream(const StreamParams & sp)120 bool FakeVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
121   if (!RtpHelper<VoiceMediaChannel>::AddRecvStream(sp))
122     return false;
123   output_scalings_[sp.first_ssrc()] = 1.0;
124   output_delays_[sp.first_ssrc()] = 0;
125   return true;
126 }
RemoveRecvStream(uint32_t ssrc)127 bool FakeVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) {
128   if (!RtpHelper<VoiceMediaChannel>::RemoveRecvStream(ssrc))
129     return false;
130   output_scalings_.erase(ssrc);
131   output_delays_.erase(ssrc);
132   return true;
133 }
CanInsertDtmf()134 bool FakeVoiceMediaChannel::CanInsertDtmf() {
135   for (std::vector<AudioCodec>::const_iterator it = send_codecs_.begin();
136        it != send_codecs_.end(); ++it) {
137     // Find the DTMF telephone event "codec".
138     if (absl::EqualsIgnoreCase(it->name, "telephone-event")) {
139       return true;
140     }
141   }
142   return false;
143 }
InsertDtmf(uint32_t ssrc,int event_code,int duration)144 bool FakeVoiceMediaChannel::InsertDtmf(uint32_t ssrc,
145                                        int event_code,
146                                        int duration) {
147   dtmf_info_queue_.push_back(DtmfInfo(ssrc, event_code, duration));
148   return true;
149 }
SetOutputVolume(uint32_t ssrc,double volume)150 bool FakeVoiceMediaChannel::SetOutputVolume(uint32_t ssrc, double volume) {
151   if (output_scalings_.find(ssrc) != output_scalings_.end()) {
152     output_scalings_[ssrc] = volume;
153     return true;
154   }
155   return false;
156 }
SetDefaultOutputVolume(double volume)157 bool FakeVoiceMediaChannel::SetDefaultOutputVolume(double volume) {
158   for (auto& entry : output_scalings_) {
159     entry.second = volume;
160   }
161   return true;
162 }
GetOutputVolume(uint32_t ssrc,double * volume)163 bool FakeVoiceMediaChannel::GetOutputVolume(uint32_t ssrc, double* volume) {
164   if (output_scalings_.find(ssrc) == output_scalings_.end())
165     return false;
166   *volume = output_scalings_[ssrc];
167   return true;
168 }
SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,int delay_ms)169 bool FakeVoiceMediaChannel::SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,
170                                                          int delay_ms) {
171   if (output_delays_.find(ssrc) == output_delays_.end()) {
172     return false;
173   } else {
174     output_delays_[ssrc] = delay_ms;
175     return true;
176   }
177 }
GetBaseMinimumPlayoutDelayMs(uint32_t ssrc) const178 absl::optional<int> FakeVoiceMediaChannel::GetBaseMinimumPlayoutDelayMs(
179     uint32_t ssrc) const {
180   const auto it = output_delays_.find(ssrc);
181   if (it != output_delays_.end()) {
182     return it->second;
183   }
184   return absl::nullopt;
185 }
GetStats(VoiceMediaInfo * info)186 bool FakeVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
187   return false;
188 }
SetRawAudioSink(uint32_t ssrc,std::unique_ptr<webrtc::AudioSinkInterface> sink)189 void FakeVoiceMediaChannel::SetRawAudioSink(
190     uint32_t ssrc,
191     std::unique_ptr<webrtc::AudioSinkInterface> sink) {
192   sink_ = std::move(sink);
193 }
SetDefaultRawAudioSink(std::unique_ptr<webrtc::AudioSinkInterface> sink)194 void FakeVoiceMediaChannel::SetDefaultRawAudioSink(
195     std::unique_ptr<webrtc::AudioSinkInterface> sink) {
196   sink_ = std::move(sink);
197 }
GetSources(uint32_t ssrc) const198 std::vector<webrtc::RtpSource> FakeVoiceMediaChannel::GetSources(
199     uint32_t ssrc) const {
200   return std::vector<webrtc::RtpSource>();
201 }
SetRecvCodecs(const std::vector<AudioCodec> & codecs)202 bool FakeVoiceMediaChannel::SetRecvCodecs(
203     const std::vector<AudioCodec>& codecs) {
204   if (fail_set_recv_codecs()) {
205     // Fake the failure in SetRecvCodecs.
206     return false;
207   }
208   recv_codecs_ = codecs;
209   return true;
210 }
SetSendCodecs(const std::vector<AudioCodec> & codecs)211 bool FakeVoiceMediaChannel::SetSendCodecs(
212     const std::vector<AudioCodec>& codecs) {
213   if (fail_set_send_codecs()) {
214     // Fake the failure in SetSendCodecs.
215     return false;
216   }
217   send_codecs_ = codecs;
218   return true;
219 }
SetMaxSendBandwidth(int bps)220 bool FakeVoiceMediaChannel::SetMaxSendBandwidth(int bps) {
221   max_bps_ = bps;
222   return true;
223 }
SetOptions(const AudioOptions & options)224 bool FakeVoiceMediaChannel::SetOptions(const AudioOptions& options) {
225   // Does a "merge" of current options and set options.
226   options_.SetAll(options);
227   return true;
228 }
SetLocalSource(uint32_t ssrc,AudioSource * source)229 bool FakeVoiceMediaChannel::SetLocalSource(uint32_t ssrc, AudioSource* source) {
230   auto it = local_sinks_.find(ssrc);
231   if (source) {
232     if (it != local_sinks_.end()) {
233       RTC_CHECK(it->second->source() == source);
234     } else {
235       local_sinks_.insert(std::make_pair(
236           ssrc, std::make_unique<VoiceChannelAudioSink>(source)));
237     }
238   } else {
239     if (it != local_sinks_.end()) {
240       local_sinks_.erase(it);
241     }
242   }
243   return true;
244 }
245 
CompareDtmfInfo(const FakeVoiceMediaChannel::DtmfInfo & info,uint32_t ssrc,int event_code,int duration)246 bool CompareDtmfInfo(const FakeVoiceMediaChannel::DtmfInfo& info,
247                      uint32_t ssrc,
248                      int event_code,
249                      int duration) {
250   return (info.duration == duration && info.event_code == event_code &&
251           info.ssrc == ssrc);
252 }
253 
FakeVideoMediaChannel(FakeVideoEngine * engine,const VideoOptions & options)254 FakeVideoMediaChannel::FakeVideoMediaChannel(FakeVideoEngine* engine,
255                                              const VideoOptions& options)
256     : engine_(engine), max_bps_(-1) {
257   SetOptions(options);
258 }
~FakeVideoMediaChannel()259 FakeVideoMediaChannel::~FakeVideoMediaChannel() {
260   if (engine_) {
261     engine_->UnregisterChannel(this);
262   }
263 }
recv_codecs() const264 const std::vector<VideoCodec>& FakeVideoMediaChannel::recv_codecs() const {
265   return recv_codecs_;
266 }
send_codecs() const267 const std::vector<VideoCodec>& FakeVideoMediaChannel::send_codecs() const {
268   return send_codecs_;
269 }
codecs() const270 const std::vector<VideoCodec>& FakeVideoMediaChannel::codecs() const {
271   return send_codecs();
272 }
rendering() const273 bool FakeVideoMediaChannel::rendering() const {
274   return playout();
275 }
options() const276 const VideoOptions& FakeVideoMediaChannel::options() const {
277   return options_;
278 }
279 const std::map<uint32_t, rtc::VideoSinkInterface<webrtc::VideoFrame>*>&
sinks() const280 FakeVideoMediaChannel::sinks() const {
281   return sinks_;
282 }
max_bps() const283 int FakeVideoMediaChannel::max_bps() const {
284   return max_bps_;
285 }
SetSendParameters(const VideoSendParameters & params)286 bool FakeVideoMediaChannel::SetSendParameters(
287     const VideoSendParameters& params) {
288   set_send_rtcp_parameters(params.rtcp);
289   return (SetSendCodecs(params.codecs) &&
290           SetSendExtmapAllowMixed(params.extmap_allow_mixed) &&
291           SetSendRtpHeaderExtensions(params.extensions) &&
292           SetMaxSendBandwidth(params.max_bandwidth_bps));
293 }
SetRecvParameters(const VideoRecvParameters & params)294 bool FakeVideoMediaChannel::SetRecvParameters(
295     const VideoRecvParameters& params) {
296   set_recv_rtcp_parameters(params.rtcp);
297   return (SetRecvCodecs(params.codecs) &&
298           SetRecvRtpHeaderExtensions(params.extensions));
299 }
AddSendStream(const StreamParams & sp)300 bool FakeVideoMediaChannel::AddSendStream(const StreamParams& sp) {
301   return RtpHelper<VideoMediaChannel>::AddSendStream(sp);
302 }
RemoveSendStream(uint32_t ssrc)303 bool FakeVideoMediaChannel::RemoveSendStream(uint32_t ssrc) {
304   return RtpHelper<VideoMediaChannel>::RemoveSendStream(ssrc);
305 }
GetSendCodec(VideoCodec * send_codec)306 bool FakeVideoMediaChannel::GetSendCodec(VideoCodec* send_codec) {
307   if (send_codecs_.empty()) {
308     return false;
309   }
310   *send_codec = send_codecs_[0];
311   return true;
312 }
SetSink(uint32_t ssrc,rtc::VideoSinkInterface<webrtc::VideoFrame> * sink)313 bool FakeVideoMediaChannel::SetSink(
314     uint32_t ssrc,
315     rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
316   auto it = sinks_.find(ssrc);
317   if (it == sinks_.end()) {
318     return false;
319   }
320   it->second = sink;
321   return true;
322 }
SetDefaultSink(rtc::VideoSinkInterface<webrtc::VideoFrame> * sink)323 void FakeVideoMediaChannel::SetDefaultSink(
324     rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {}
HasSink(uint32_t ssrc) const325 bool FakeVideoMediaChannel::HasSink(uint32_t ssrc) const {
326   return sinks_.find(ssrc) != sinks_.end() && sinks_.at(ssrc) != nullptr;
327 }
SetSend(bool send)328 bool FakeVideoMediaChannel::SetSend(bool send) {
329   return set_sending(send);
330 }
SetVideoSend(uint32_t ssrc,const VideoOptions * options,rtc::VideoSourceInterface<webrtc::VideoFrame> * source)331 bool FakeVideoMediaChannel::SetVideoSend(
332     uint32_t ssrc,
333     const VideoOptions* options,
334     rtc::VideoSourceInterface<webrtc::VideoFrame>* source) {
335   if (options) {
336     if (!SetOptions(*options)) {
337       return false;
338     }
339   }
340   sources_[ssrc] = source;
341   return true;
342 }
HasSource(uint32_t ssrc) const343 bool FakeVideoMediaChannel::HasSource(uint32_t ssrc) const {
344   return sources_.find(ssrc) != sources_.end() && sources_.at(ssrc) != nullptr;
345 }
AddRecvStream(const StreamParams & sp)346 bool FakeVideoMediaChannel::AddRecvStream(const StreamParams& sp) {
347   if (!RtpHelper<VideoMediaChannel>::AddRecvStream(sp))
348     return false;
349   sinks_[sp.first_ssrc()] = NULL;
350   output_delays_[sp.first_ssrc()] = 0;
351   return true;
352 }
RemoveRecvStream(uint32_t ssrc)353 bool FakeVideoMediaChannel::RemoveRecvStream(uint32_t ssrc) {
354   if (!RtpHelper<VideoMediaChannel>::RemoveRecvStream(ssrc))
355     return false;
356   sinks_.erase(ssrc);
357   output_delays_.erase(ssrc);
358   return true;
359 }
FillBitrateInfo(BandwidthEstimationInfo * bwe_info)360 void FakeVideoMediaChannel::FillBitrateInfo(BandwidthEstimationInfo* bwe_info) {
361 }
GetStats(VideoMediaInfo * info)362 bool FakeVideoMediaChannel::GetStats(VideoMediaInfo* info) {
363   return false;
364 }
GetSources(uint32_t ssrc) const365 std::vector<webrtc::RtpSource> FakeVideoMediaChannel::GetSources(
366     uint32_t ssrc) const {
367   return {};
368 }
SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,int delay_ms)369 bool FakeVideoMediaChannel::SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,
370                                                          int delay_ms) {
371   if (output_delays_.find(ssrc) == output_delays_.end()) {
372     return false;
373   } else {
374     output_delays_[ssrc] = delay_ms;
375     return true;
376   }
377 }
GetBaseMinimumPlayoutDelayMs(uint32_t ssrc) const378 absl::optional<int> FakeVideoMediaChannel::GetBaseMinimumPlayoutDelayMs(
379     uint32_t ssrc) const {
380   const auto it = output_delays_.find(ssrc);
381   if (it != output_delays_.end()) {
382     return it->second;
383   }
384   return absl::nullopt;
385 }
SetRecvCodecs(const std::vector<VideoCodec> & codecs)386 bool FakeVideoMediaChannel::SetRecvCodecs(
387     const std::vector<VideoCodec>& codecs) {
388   if (fail_set_recv_codecs()) {
389     // Fake the failure in SetRecvCodecs.
390     return false;
391   }
392   recv_codecs_ = codecs;
393   return true;
394 }
SetSendCodecs(const std::vector<VideoCodec> & codecs)395 bool FakeVideoMediaChannel::SetSendCodecs(
396     const std::vector<VideoCodec>& codecs) {
397   if (fail_set_send_codecs()) {
398     // Fake the failure in SetSendCodecs.
399     return false;
400   }
401   send_codecs_ = codecs;
402 
403   return true;
404 }
SetOptions(const VideoOptions & options)405 bool FakeVideoMediaChannel::SetOptions(const VideoOptions& options) {
406   options_ = options;
407   return true;
408 }
409 
SetMaxSendBandwidth(int bps)410 bool FakeVideoMediaChannel::SetMaxSendBandwidth(int bps) {
411   max_bps_ = bps;
412   return true;
413 }
414 
SetRecordableEncodedFrameCallback(uint32_t ssrc,std::function<void (const webrtc::RecordableEncodedFrame &)> callback)415 void FakeVideoMediaChannel::SetRecordableEncodedFrameCallback(
416     uint32_t ssrc,
417     std::function<void(const webrtc::RecordableEncodedFrame&)> callback) {}
418 
ClearRecordableEncodedFrameCallback(uint32_t ssrc)419 void FakeVideoMediaChannel::ClearRecordableEncodedFrameCallback(uint32_t ssrc) {
420 }
421 
GenerateKeyFrame(uint32_t ssrc)422 void FakeVideoMediaChannel::GenerateKeyFrame(uint32_t ssrc) {}
423 
FakeDataMediaChannel(void * unused,const DataOptions & options)424 FakeDataMediaChannel::FakeDataMediaChannel(void* unused,
425                                            const DataOptions& options)
426     : send_blocked_(false), max_bps_(-1) {}
~FakeDataMediaChannel()427 FakeDataMediaChannel::~FakeDataMediaChannel() {}
recv_codecs() const428 const std::vector<DataCodec>& FakeDataMediaChannel::recv_codecs() const {
429   return recv_codecs_;
430 }
send_codecs() const431 const std::vector<DataCodec>& FakeDataMediaChannel::send_codecs() const {
432   return send_codecs_;
433 }
codecs() const434 const std::vector<DataCodec>& FakeDataMediaChannel::codecs() const {
435   return send_codecs();
436 }
max_bps() const437 int FakeDataMediaChannel::max_bps() const {
438   return max_bps_;
439 }
SetSendParameters(const DataSendParameters & params)440 bool FakeDataMediaChannel::SetSendParameters(const DataSendParameters& params) {
441   set_send_rtcp_parameters(params.rtcp);
442   return (SetSendCodecs(params.codecs) &&
443           SetMaxSendBandwidth(params.max_bandwidth_bps));
444 }
SetRecvParameters(const DataRecvParameters & params)445 bool FakeDataMediaChannel::SetRecvParameters(const DataRecvParameters& params) {
446   set_recv_rtcp_parameters(params.rtcp);
447   return SetRecvCodecs(params.codecs);
448 }
SetSend(bool send)449 bool FakeDataMediaChannel::SetSend(bool send) {
450   return set_sending(send);
451 }
SetReceive(bool receive)452 bool FakeDataMediaChannel::SetReceive(bool receive) {
453   set_playout(receive);
454   return true;
455 }
AddRecvStream(const StreamParams & sp)456 bool FakeDataMediaChannel::AddRecvStream(const StreamParams& sp) {
457   if (!RtpHelper<DataMediaChannel>::AddRecvStream(sp))
458     return false;
459   return true;
460 }
RemoveRecvStream(uint32_t ssrc)461 bool FakeDataMediaChannel::RemoveRecvStream(uint32_t ssrc) {
462   if (!RtpHelper<DataMediaChannel>::RemoveRecvStream(ssrc))
463     return false;
464   return true;
465 }
SendData(const SendDataParams & params,const rtc::CopyOnWriteBuffer & payload,SendDataResult * result)466 bool FakeDataMediaChannel::SendData(const SendDataParams& params,
467                                     const rtc::CopyOnWriteBuffer& payload,
468                                     SendDataResult* result) {
469   if (send_blocked_) {
470     *result = SDR_BLOCK;
471     return false;
472   } else {
473     last_sent_data_params_ = params;
474     last_sent_data_ = std::string(payload.data<char>(), payload.size());
475     return true;
476   }
477 }
last_sent_data_params()478 SendDataParams FakeDataMediaChannel::last_sent_data_params() {
479   return last_sent_data_params_;
480 }
last_sent_data()481 std::string FakeDataMediaChannel::last_sent_data() {
482   return last_sent_data_;
483 }
is_send_blocked()484 bool FakeDataMediaChannel::is_send_blocked() {
485   return send_blocked_;
486 }
set_send_blocked(bool blocked)487 void FakeDataMediaChannel::set_send_blocked(bool blocked) {
488   send_blocked_ = blocked;
489 }
SetRecvCodecs(const std::vector<DataCodec> & codecs)490 bool FakeDataMediaChannel::SetRecvCodecs(const std::vector<DataCodec>& codecs) {
491   if (fail_set_recv_codecs()) {
492     // Fake the failure in SetRecvCodecs.
493     return false;
494   }
495   recv_codecs_ = codecs;
496   return true;
497 }
SetSendCodecs(const std::vector<DataCodec> & codecs)498 bool FakeDataMediaChannel::SetSendCodecs(const std::vector<DataCodec>& codecs) {
499   if (fail_set_send_codecs()) {
500     // Fake the failure in SetSendCodecs.
501     return false;
502   }
503   send_codecs_ = codecs;
504   return true;
505 }
SetMaxSendBandwidth(int bps)506 bool FakeDataMediaChannel::SetMaxSendBandwidth(int bps) {
507   max_bps_ = bps;
508   return true;
509 }
510 
FakeVoiceEngine()511 FakeVoiceEngine::FakeVoiceEngine() : fail_create_channel_(false) {
512   // Add a fake audio codec. Note that the name must not be "" as there are
513   // sanity checks against that.
514   SetCodecs({AudioCodec(101, "fake_audio_codec", 0, 0, 1)});
515 }
Init()516 void FakeVoiceEngine::Init() {}
GetAudioState() const517 rtc::scoped_refptr<webrtc::AudioState> FakeVoiceEngine::GetAudioState() const {
518   return rtc::scoped_refptr<webrtc::AudioState>();
519 }
CreateMediaChannel(webrtc::Call * call,const MediaConfig & config,const AudioOptions & options,const webrtc::CryptoOptions & crypto_options)520 VoiceMediaChannel* FakeVoiceEngine::CreateMediaChannel(
521     webrtc::Call* call,
522     const MediaConfig& config,
523     const AudioOptions& options,
524     const webrtc::CryptoOptions& crypto_options) {
525   if (fail_create_channel_) {
526     return nullptr;
527   }
528 
529   FakeVoiceMediaChannel* ch = new FakeVoiceMediaChannel(this, options);
530   channels_.push_back(ch);
531   return ch;
532 }
GetChannel(size_t index)533 FakeVoiceMediaChannel* FakeVoiceEngine::GetChannel(size_t index) {
534   return (channels_.size() > index) ? channels_[index] : NULL;
535 }
UnregisterChannel(VoiceMediaChannel * channel)536 void FakeVoiceEngine::UnregisterChannel(VoiceMediaChannel* channel) {
537   channels_.erase(absl::c_find(channels_, channel));
538 }
send_codecs() const539 const std::vector<AudioCodec>& FakeVoiceEngine::send_codecs() const {
540   return send_codecs_;
541 }
recv_codecs() const542 const std::vector<AudioCodec>& FakeVoiceEngine::recv_codecs() const {
543   return recv_codecs_;
544 }
SetCodecs(const std::vector<AudioCodec> & codecs)545 void FakeVoiceEngine::SetCodecs(const std::vector<AudioCodec>& codecs) {
546   send_codecs_ = codecs;
547   recv_codecs_ = codecs;
548 }
SetRecvCodecs(const std::vector<AudioCodec> & codecs)549 void FakeVoiceEngine::SetRecvCodecs(const std::vector<AudioCodec>& codecs) {
550   recv_codecs_ = codecs;
551 }
SetSendCodecs(const std::vector<AudioCodec> & codecs)552 void FakeVoiceEngine::SetSendCodecs(const std::vector<AudioCodec>& codecs) {
553   send_codecs_ = codecs;
554 }
GetInputLevel()555 int FakeVoiceEngine::GetInputLevel() {
556   return 0;
557 }
StartAecDump(webrtc::FileWrapper file,int64_t max_size_bytes)558 bool FakeVoiceEngine::StartAecDump(webrtc::FileWrapper file,
559                                    int64_t max_size_bytes) {
560   return false;
561 }
StopAecDump()562 void FakeVoiceEngine::StopAecDump() {}
563 
564 std::vector<webrtc::RtpHeaderExtensionCapability>
GetRtpHeaderExtensions() const565 FakeVoiceEngine::GetRtpHeaderExtensions() const {
566   return header_extensions_;
567 }
568 
SetRtpHeaderExtensions(std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions)569 void FakeVoiceEngine::SetRtpHeaderExtensions(
570     std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions) {
571   header_extensions_ = std::move(header_extensions);
572 }
573 
FakeVideoEngine()574 FakeVideoEngine::FakeVideoEngine()
575     : capture_(false), fail_create_channel_(false) {
576   // Add a fake video codec. Note that the name must not be "" as there are
577   // sanity checks against that.
578   send_codecs_.push_back(VideoCodec(0, "fake_video_codec"));
579   recv_codecs_.push_back(VideoCodec(0, "fake_video_codec"));
580 }
SetOptions(const VideoOptions & options)581 bool FakeVideoEngine::SetOptions(const VideoOptions& options) {
582   options_ = options;
583   return true;
584 }
CreateMediaChannel(webrtc::Call * call,const MediaConfig & config,const VideoOptions & options,const webrtc::CryptoOptions & crypto_options,webrtc::VideoBitrateAllocatorFactory * video_bitrate_allocator_factory)585 VideoMediaChannel* FakeVideoEngine::CreateMediaChannel(
586     webrtc::Call* call,
587     const MediaConfig& config,
588     const VideoOptions& options,
589     const webrtc::CryptoOptions& crypto_options,
590     webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory) {
591   if (fail_create_channel_) {
592     return nullptr;
593   }
594 
595   FakeVideoMediaChannel* ch = new FakeVideoMediaChannel(this, options);
596   channels_.emplace_back(ch);
597   return ch;
598 }
GetChannel(size_t index)599 FakeVideoMediaChannel* FakeVideoEngine::GetChannel(size_t index) {
600   return (channels_.size() > index) ? channels_[index] : nullptr;
601 }
UnregisterChannel(VideoMediaChannel * channel)602 void FakeVideoEngine::UnregisterChannel(VideoMediaChannel* channel) {
603   auto it = absl::c_find(channels_, channel);
604   RTC_DCHECK(it != channels_.end());
605   channels_.erase(it);
606 }
send_codecs() const607 std::vector<VideoCodec> FakeVideoEngine::send_codecs() const {
608   return send_codecs_;
609 }
610 
recv_codecs() const611 std::vector<VideoCodec> FakeVideoEngine::recv_codecs() const {
612   return recv_codecs_;
613 }
614 
SetSendCodecs(const std::vector<VideoCodec> & codecs)615 void FakeVideoEngine::SetSendCodecs(const std::vector<VideoCodec>& codecs) {
616   send_codecs_ = codecs;
617 }
618 
SetRecvCodecs(const std::vector<VideoCodec> & codecs)619 void FakeVideoEngine::SetRecvCodecs(const std::vector<VideoCodec>& codecs) {
620   recv_codecs_ = codecs;
621 }
622 
SetCapture(bool capture)623 bool FakeVideoEngine::SetCapture(bool capture) {
624   capture_ = capture;
625   return true;
626 }
627 std::vector<webrtc::RtpHeaderExtensionCapability>
GetRtpHeaderExtensions() const628 FakeVideoEngine::GetRtpHeaderExtensions() const {
629   return header_extensions_;
630 }
SetRtpHeaderExtensions(std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions)631 void FakeVideoEngine::SetRtpHeaderExtensions(
632     std::vector<webrtc::RtpHeaderExtensionCapability> header_extensions) {
633   header_extensions_ = std::move(header_extensions);
634 }
635 
FakeMediaEngine()636 FakeMediaEngine::FakeMediaEngine()
637     : CompositeMediaEngine(std::make_unique<FakeVoiceEngine>(),
638                            std::make_unique<FakeVideoEngine>()),
639       voice_(static_cast<FakeVoiceEngine*>(&voice())),
640       video_(static_cast<FakeVideoEngine*>(&video())) {}
~FakeMediaEngine()641 FakeMediaEngine::~FakeMediaEngine() {}
SetAudioCodecs(const std::vector<AudioCodec> & codecs)642 void FakeMediaEngine::SetAudioCodecs(const std::vector<AudioCodec>& codecs) {
643   voice_->SetCodecs(codecs);
644 }
SetAudioRecvCodecs(const std::vector<AudioCodec> & codecs)645 void FakeMediaEngine::SetAudioRecvCodecs(
646     const std::vector<AudioCodec>& codecs) {
647   voice_->SetRecvCodecs(codecs);
648 }
SetAudioSendCodecs(const std::vector<AudioCodec> & codecs)649 void FakeMediaEngine::SetAudioSendCodecs(
650     const std::vector<AudioCodec>& codecs) {
651   voice_->SetSendCodecs(codecs);
652 }
SetVideoCodecs(const std::vector<VideoCodec> & codecs)653 void FakeMediaEngine::SetVideoCodecs(const std::vector<VideoCodec>& codecs) {
654   video_->SetSendCodecs(codecs);
655   video_->SetRecvCodecs(codecs);
656 }
657 
GetVoiceChannel(size_t index)658 FakeVoiceMediaChannel* FakeMediaEngine::GetVoiceChannel(size_t index) {
659   return voice_->GetChannel(index);
660 }
GetVideoChannel(size_t index)661 FakeVideoMediaChannel* FakeMediaEngine::GetVideoChannel(size_t index) {
662   return video_->GetChannel(index);
663 }
664 
set_fail_create_channel(bool fail)665 void FakeMediaEngine::set_fail_create_channel(bool fail) {
666   voice_->fail_create_channel_ = fail;
667   video_->fail_create_channel_ = fail;
668 }
669 
CreateChannel(const MediaConfig & config)670 DataMediaChannel* FakeDataEngine::CreateChannel(const MediaConfig& config) {
671   FakeDataMediaChannel* ch = new FakeDataMediaChannel(this, DataOptions());
672   channels_.push_back(ch);
673   return ch;
674 }
GetChannel(size_t index)675 FakeDataMediaChannel* FakeDataEngine::GetChannel(size_t index) {
676   return (channels_.size() > index) ? channels_[index] : NULL;
677 }
UnregisterChannel(DataMediaChannel * channel)678 void FakeDataEngine::UnregisterChannel(DataMediaChannel* channel) {
679   channels_.erase(absl::c_find(channels_, channel));
680 }
SetDataCodecs(const std::vector<DataCodec> & data_codecs)681 void FakeDataEngine::SetDataCodecs(const std::vector<DataCodec>& data_codecs) {
682   data_codecs_ = data_codecs;
683 }
data_codecs()684 const std::vector<DataCodec>& FakeDataEngine::data_codecs() {
685   return data_codecs_;
686 }
687 
688 }  // namespace cricket
689