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