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