1 /*
2 * Copyright (c) 2015 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/engine/fake_webrtc_call.h"
12
13 #include <utility>
14
15 #include "absl/algorithm/container.h"
16 #include "absl/strings/string_view.h"
17 #include "api/call/audio_sink.h"
18 #include "media/base/media_channel.h"
19 #include "modules/rtp_rtcp/source/rtp_util.h"
20 #include "rtc_base/checks.h"
21 #include "rtc_base/gunit.h"
22 #include "rtc_base/thread.h"
23 #include "video/config/encoder_stream_factory.h"
24
25 namespace cricket {
26
27 using ::webrtc::ParseRtpSsrc;
28
FakeAudioSendStream(int id,const webrtc::AudioSendStream::Config & config)29 FakeAudioSendStream::FakeAudioSendStream(
30 int id,
31 const webrtc::AudioSendStream::Config& config)
32 : id_(id), config_(config) {}
33
Reconfigure(const webrtc::AudioSendStream::Config & config,webrtc::SetParametersCallback callback)34 void FakeAudioSendStream::Reconfigure(
35 const webrtc::AudioSendStream::Config& config,
36 webrtc::SetParametersCallback callback) {
37 config_ = config;
38 webrtc::InvokeSetParametersCallback(callback, webrtc::RTCError::OK());
39 }
40
GetConfig() const41 const webrtc::AudioSendStream::Config& FakeAudioSendStream::GetConfig() const {
42 return config_;
43 }
44
SetStats(const webrtc::AudioSendStream::Stats & stats)45 void FakeAudioSendStream::SetStats(
46 const webrtc::AudioSendStream::Stats& stats) {
47 stats_ = stats;
48 }
49
50 FakeAudioSendStream::TelephoneEvent
GetLatestTelephoneEvent() const51 FakeAudioSendStream::GetLatestTelephoneEvent() const {
52 return latest_telephone_event_;
53 }
54
SendTelephoneEvent(int payload_type,int payload_frequency,int event,int duration_ms)55 bool FakeAudioSendStream::SendTelephoneEvent(int payload_type,
56 int payload_frequency,
57 int event,
58 int duration_ms) {
59 latest_telephone_event_.payload_type = payload_type;
60 latest_telephone_event_.payload_frequency = payload_frequency;
61 latest_telephone_event_.event_code = event;
62 latest_telephone_event_.duration_ms = duration_ms;
63 return true;
64 }
65
SetMuted(bool muted)66 void FakeAudioSendStream::SetMuted(bool muted) {
67 muted_ = muted;
68 }
69
GetStats() const70 webrtc::AudioSendStream::Stats FakeAudioSendStream::GetStats() const {
71 return stats_;
72 }
73
GetStats(bool) const74 webrtc::AudioSendStream::Stats FakeAudioSendStream::GetStats(
75 bool /*has_remote_tracks*/) const {
76 return stats_;
77 }
78
FakeAudioReceiveStream(int id,const webrtc::AudioReceiveStreamInterface::Config & config)79 FakeAudioReceiveStream::FakeAudioReceiveStream(
80 int id,
81 const webrtc::AudioReceiveStreamInterface::Config& config)
82 : id_(id), config_(config) {}
83
84 const webrtc::AudioReceiveStreamInterface::Config&
GetConfig() const85 FakeAudioReceiveStream::GetConfig() const {
86 return config_;
87 }
88
SetStats(const webrtc::AudioReceiveStreamInterface::Stats & stats)89 void FakeAudioReceiveStream::SetStats(
90 const webrtc::AudioReceiveStreamInterface::Stats& stats) {
91 stats_ = stats;
92 }
93
VerifyLastPacket(const uint8_t * data,size_t length) const94 bool FakeAudioReceiveStream::VerifyLastPacket(const uint8_t* data,
95 size_t length) const {
96 return last_packet_ == rtc::Buffer(data, length);
97 }
98
DeliverRtp(const uint8_t * packet,size_t length,int64_t)99 bool FakeAudioReceiveStream::DeliverRtp(const uint8_t* packet,
100 size_t length,
101 int64_t /* packet_time_us */) {
102 ++received_packets_;
103 last_packet_.SetData(packet, length);
104 return true;
105 }
106
SetDepacketizerToDecoderFrameTransformer(rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)107 void FakeAudioReceiveStream::SetDepacketizerToDecoderFrameTransformer(
108 rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
109 config_.frame_transformer = std::move(frame_transformer);
110 }
111
SetDecoderMap(std::map<int,webrtc::SdpAudioFormat> decoder_map)112 void FakeAudioReceiveStream::SetDecoderMap(
113 std::map<int, webrtc::SdpAudioFormat> decoder_map) {
114 config_.decoder_map = std::move(decoder_map);
115 }
116
SetNackHistory(int history_ms)117 void FakeAudioReceiveStream::SetNackHistory(int history_ms) {
118 config_.rtp.nack.rtp_history_ms = history_ms;
119 }
120
SetNonSenderRttMeasurement(bool enabled)121 void FakeAudioReceiveStream::SetNonSenderRttMeasurement(bool enabled) {
122 config_.enable_non_sender_rtt = enabled;
123 }
124
SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor)125 void FakeAudioReceiveStream::SetFrameDecryptor(
126 rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor) {
127 config_.frame_decryptor = std::move(frame_decryptor);
128 }
129
SetRtpExtensions(std::vector<webrtc::RtpExtension> extensions)130 void FakeAudioReceiveStream::SetRtpExtensions(
131 std::vector<webrtc::RtpExtension> extensions) {
132 config_.rtp.extensions = std::move(extensions);
133 }
134
135 const std::vector<webrtc::RtpExtension>&
GetRtpExtensions() const136 FakeAudioReceiveStream::GetRtpExtensions() const {
137 return config_.rtp.extensions;
138 }
139
GetRtpExtensionMap() const140 webrtc::RtpHeaderExtensionMap FakeAudioReceiveStream::GetRtpExtensionMap()
141 const {
142 return webrtc::RtpHeaderExtensionMap(config_.rtp.extensions);
143 }
144
GetStats(bool get_and_clear_legacy_stats) const145 webrtc::AudioReceiveStreamInterface::Stats FakeAudioReceiveStream::GetStats(
146 bool get_and_clear_legacy_stats) const {
147 return stats_;
148 }
149
SetSink(webrtc::AudioSinkInterface * sink)150 void FakeAudioReceiveStream::SetSink(webrtc::AudioSinkInterface* sink) {
151 sink_ = sink;
152 }
153
SetGain(float gain)154 void FakeAudioReceiveStream::SetGain(float gain) {
155 gain_ = gain;
156 }
157
FakeVideoSendStream(webrtc::VideoSendStream::Config config,webrtc::VideoEncoderConfig encoder_config)158 FakeVideoSendStream::FakeVideoSendStream(
159 webrtc::VideoSendStream::Config config,
160 webrtc::VideoEncoderConfig encoder_config)
161 : sending_(false),
162 config_(std::move(config)),
163 codec_settings_set_(false),
164 resolution_scaling_enabled_(false),
165 framerate_scaling_enabled_(false),
166 source_(nullptr),
167 num_swapped_frames_(0) {
168 RTC_DCHECK(config.encoder_settings.encoder_factory != nullptr);
169 RTC_DCHECK(config.encoder_settings.bitrate_allocator_factory != nullptr);
170 ReconfigureVideoEncoder(std::move(encoder_config));
171 }
172
~FakeVideoSendStream()173 FakeVideoSendStream::~FakeVideoSendStream() {
174 if (source_)
175 source_->RemoveSink(this);
176 }
177
GetConfig() const178 const webrtc::VideoSendStream::Config& FakeVideoSendStream::GetConfig() const {
179 return config_;
180 }
181
GetEncoderConfig() const182 const webrtc::VideoEncoderConfig& FakeVideoSendStream::GetEncoderConfig()
183 const {
184 return encoder_config_;
185 }
186
GetVideoStreams() const187 const std::vector<webrtc::VideoStream>& FakeVideoSendStream::GetVideoStreams()
188 const {
189 return video_streams_;
190 }
191
IsSending() const192 bool FakeVideoSendStream::IsSending() const {
193 return sending_;
194 }
195
GetVp8Settings(webrtc::VideoCodecVP8 * settings) const196 bool FakeVideoSendStream::GetVp8Settings(
197 webrtc::VideoCodecVP8* settings) const {
198 if (!codec_settings_set_) {
199 return false;
200 }
201
202 *settings = codec_specific_settings_.vp8;
203 return true;
204 }
205
GetVp9Settings(webrtc::VideoCodecVP9 * settings) const206 bool FakeVideoSendStream::GetVp9Settings(
207 webrtc::VideoCodecVP9* settings) const {
208 if (!codec_settings_set_) {
209 return false;
210 }
211
212 *settings = codec_specific_settings_.vp9;
213 return true;
214 }
215
GetH264Settings(webrtc::VideoCodecH264 * settings) const216 bool FakeVideoSendStream::GetH264Settings(
217 webrtc::VideoCodecH264* settings) const {
218 if (!codec_settings_set_) {
219 return false;
220 }
221
222 *settings = codec_specific_settings_.h264;
223 return true;
224 }
225
GetNumberOfSwappedFrames() const226 int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
227 return num_swapped_frames_;
228 }
229
GetLastWidth() const230 int FakeVideoSendStream::GetLastWidth() const {
231 return last_frame_->width();
232 }
233
GetLastHeight() const234 int FakeVideoSendStream::GetLastHeight() const {
235 return last_frame_->height();
236 }
237
GetLastTimestamp() const238 int64_t FakeVideoSendStream::GetLastTimestamp() const {
239 RTC_DCHECK(last_frame_->ntp_time_ms() == 0);
240 return last_frame_->render_time_ms();
241 }
242
OnFrame(const webrtc::VideoFrame & frame)243 void FakeVideoSendStream::OnFrame(const webrtc::VideoFrame& frame) {
244 ++num_swapped_frames_;
245 if (!last_frame_ || frame.width() != last_frame_->width() ||
246 frame.height() != last_frame_->height() ||
247 frame.rotation() != last_frame_->rotation()) {
248 if (encoder_config_.video_stream_factory) {
249 // Note: only tests set their own EncoderStreamFactory...
250 video_streams_ =
251 encoder_config_.video_stream_factory->CreateEncoderStreams(
252 frame.width(), frame.height(), encoder_config_);
253 } else {
254 webrtc::VideoEncoder::EncoderInfo encoder_info;
255 rtc::scoped_refptr<
256 webrtc::VideoEncoderConfig::VideoStreamFactoryInterface>
257 factory = rtc::make_ref_counted<cricket::EncoderStreamFactory>(
258 encoder_config_.video_format.name, encoder_config_.max_qp,
259 encoder_config_.content_type ==
260 webrtc::VideoEncoderConfig::ContentType::kScreen,
261 encoder_config_.legacy_conference_mode, encoder_info);
262
263 video_streams_ = factory->CreateEncoderStreams(
264 frame.width(), frame.height(), encoder_config_);
265 }
266 }
267 last_frame_ = frame;
268 }
269
SetStats(const webrtc::VideoSendStream::Stats & stats)270 void FakeVideoSendStream::SetStats(
271 const webrtc::VideoSendStream::Stats& stats) {
272 stats_ = stats;
273 }
274
GetStats()275 webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
276 return stats_;
277 }
278
ReconfigureVideoEncoder(webrtc::VideoEncoderConfig config)279 void FakeVideoSendStream::ReconfigureVideoEncoder(
280 webrtc::VideoEncoderConfig config) {
281 ReconfigureVideoEncoder(std::move(config), nullptr);
282 }
283
ReconfigureVideoEncoder(webrtc::VideoEncoderConfig config,webrtc::SetParametersCallback callback)284 void FakeVideoSendStream::ReconfigureVideoEncoder(
285 webrtc::VideoEncoderConfig config,
286 webrtc::SetParametersCallback callback) {
287 int width, height;
288 if (last_frame_) {
289 width = last_frame_->width();
290 height = last_frame_->height();
291 } else {
292 width = height = 0;
293 }
294 if (config.video_stream_factory) {
295 // Note: only tests set their own EncoderStreamFactory...
296 video_streams_ = config.video_stream_factory->CreateEncoderStreams(
297 width, height, config);
298 } else {
299 webrtc::VideoEncoder::EncoderInfo encoder_info;
300 rtc::scoped_refptr<webrtc::VideoEncoderConfig::VideoStreamFactoryInterface>
301 factory = rtc::make_ref_counted<cricket::EncoderStreamFactory>(
302 config.video_format.name, config.max_qp,
303 config.content_type ==
304 webrtc::VideoEncoderConfig::ContentType::kScreen,
305 config.legacy_conference_mode, encoder_info);
306
307 video_streams_ = factory->CreateEncoderStreams(width, height, config);
308 }
309
310 if (config.encoder_specific_settings != nullptr) {
311 const unsigned char num_temporal_layers = static_cast<unsigned char>(
312 video_streams_.back().num_temporal_layers.value_or(1));
313 if (config_.rtp.payload_name == "VP8") {
314 config.encoder_specific_settings->FillVideoCodecVp8(
315 &codec_specific_settings_.vp8);
316 if (!video_streams_.empty()) {
317 codec_specific_settings_.vp8.numberOfTemporalLayers =
318 num_temporal_layers;
319 }
320 } else if (config_.rtp.payload_name == "VP9") {
321 config.encoder_specific_settings->FillVideoCodecVp9(
322 &codec_specific_settings_.vp9);
323 if (!video_streams_.empty()) {
324 codec_specific_settings_.vp9.numberOfTemporalLayers =
325 num_temporal_layers;
326 }
327 } else if (config_.rtp.payload_name == "H264") {
328 codec_specific_settings_.h264.numberOfTemporalLayers =
329 num_temporal_layers;
330 } else {
331 ADD_FAILURE() << "Unsupported encoder payload: "
332 << config_.rtp.payload_name;
333 }
334 }
335 codec_settings_set_ = config.encoder_specific_settings != nullptr;
336 encoder_config_ = std::move(config);
337 ++num_encoder_reconfigurations_;
338 webrtc::InvokeSetParametersCallback(callback, webrtc::RTCError::OK());
339 }
340
StartPerRtpStream(const std::vector<bool> active_layers)341 void FakeVideoSendStream::StartPerRtpStream(
342 const std::vector<bool> active_layers) {
343 sending_ = false;
344 for (const bool active_layer : active_layers) {
345 if (active_layer) {
346 sending_ = true;
347 break;
348 }
349 }
350 }
351
Start()352 void FakeVideoSendStream::Start() {
353 sending_ = true;
354 }
355
Stop()356 void FakeVideoSendStream::Stop() {
357 sending_ = false;
358 }
359
AddAdaptationResource(rtc::scoped_refptr<webrtc::Resource> resource)360 void FakeVideoSendStream::AddAdaptationResource(
361 rtc::scoped_refptr<webrtc::Resource> resource) {}
362
363 std::vector<rtc::scoped_refptr<webrtc::Resource>>
GetAdaptationResources()364 FakeVideoSendStream::GetAdaptationResources() {
365 return {};
366 }
367
SetSource(rtc::VideoSourceInterface<webrtc::VideoFrame> * source,const webrtc::DegradationPreference & degradation_preference)368 void FakeVideoSendStream::SetSource(
369 rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
370 const webrtc::DegradationPreference& degradation_preference) {
371 if (source_)
372 source_->RemoveSink(this);
373 source_ = source;
374 switch (degradation_preference) {
375 case webrtc::DegradationPreference::MAINTAIN_FRAMERATE:
376 resolution_scaling_enabled_ = true;
377 framerate_scaling_enabled_ = false;
378 break;
379 case webrtc::DegradationPreference::MAINTAIN_RESOLUTION:
380 resolution_scaling_enabled_ = false;
381 framerate_scaling_enabled_ = true;
382 break;
383 case webrtc::DegradationPreference::BALANCED:
384 resolution_scaling_enabled_ = true;
385 framerate_scaling_enabled_ = true;
386 break;
387 case webrtc::DegradationPreference::DISABLED:
388 resolution_scaling_enabled_ = false;
389 framerate_scaling_enabled_ = false;
390 break;
391 }
392 if (source)
393 source->AddOrUpdateSink(this, resolution_scaling_enabled_
394 ? sink_wants_
395 : rtc::VideoSinkWants());
396 }
397
InjectVideoSinkWants(const rtc::VideoSinkWants & wants)398 void FakeVideoSendStream::InjectVideoSinkWants(
399 const rtc::VideoSinkWants& wants) {
400 sink_wants_ = wants;
401 source_->AddOrUpdateSink(this, wants);
402 }
403
FakeVideoReceiveStream(webrtc::VideoReceiveStreamInterface::Config config)404 FakeVideoReceiveStream::FakeVideoReceiveStream(
405 webrtc::VideoReceiveStreamInterface::Config config)
406 : config_(std::move(config)), receiving_(false) {}
407
408 const webrtc::VideoReceiveStreamInterface::Config&
GetConfig() const409 FakeVideoReceiveStream::GetConfig() const {
410 return config_;
411 }
412
IsReceiving() const413 bool FakeVideoReceiveStream::IsReceiving() const {
414 return receiving_;
415 }
416
InjectFrame(const webrtc::VideoFrame & frame)417 void FakeVideoReceiveStream::InjectFrame(const webrtc::VideoFrame& frame) {
418 config_.renderer->OnFrame(frame);
419 }
420
GetStats() const421 webrtc::VideoReceiveStreamInterface::Stats FakeVideoReceiveStream::GetStats()
422 const {
423 return stats_;
424 }
425
SetRtpExtensions(std::vector<webrtc::RtpExtension> extensions)426 void FakeVideoReceiveStream::SetRtpExtensions(
427 std::vector<webrtc::RtpExtension> extensions) {
428 config_.rtp.extensions = std::move(extensions);
429 }
430
GetRtpExtensionMap() const431 webrtc::RtpHeaderExtensionMap FakeVideoReceiveStream::GetRtpExtensionMap()
432 const {
433 return webrtc::RtpHeaderExtensionMap(config_.rtp.extensions);
434 }
435
Start()436 void FakeVideoReceiveStream::Start() {
437 receiving_ = true;
438 }
439
Stop()440 void FakeVideoReceiveStream::Stop() {
441 receiving_ = false;
442 }
443
SetStats(const webrtc::VideoReceiveStreamInterface::Stats & stats)444 void FakeVideoReceiveStream::SetStats(
445 const webrtc::VideoReceiveStreamInterface::Stats& stats) {
446 stats_ = stats;
447 }
448
FakeFlexfecReceiveStream(const webrtc::FlexfecReceiveStream::Config config)449 FakeFlexfecReceiveStream::FakeFlexfecReceiveStream(
450 const webrtc::FlexfecReceiveStream::Config config)
451 : config_(std::move(config)) {}
452
SetRtpExtensions(std::vector<webrtc::RtpExtension> extensions)453 void FakeFlexfecReceiveStream::SetRtpExtensions(
454 std::vector<webrtc::RtpExtension> extensions) {
455 config_.rtp.extensions = std::move(extensions);
456 }
457
GetRtpExtensionMap() const458 webrtc::RtpHeaderExtensionMap FakeFlexfecReceiveStream::GetRtpExtensionMap()
459 const {
460 return webrtc::RtpHeaderExtensionMap(config_.rtp.extensions);
461 }
462
463 const webrtc::FlexfecReceiveStream::Config&
GetConfig() const464 FakeFlexfecReceiveStream::GetConfig() const {
465 return config_;
466 }
467
OnRtpPacket(const webrtc::RtpPacketReceived &)468 void FakeFlexfecReceiveStream::OnRtpPacket(const webrtc::RtpPacketReceived&) {
469 RTC_DCHECK_NOTREACHED() << "Not implemented.";
470 }
471
FakeCall(webrtc::test::ScopedKeyValueConfig * field_trials)472 FakeCall::FakeCall(webrtc::test::ScopedKeyValueConfig* field_trials)
473 : FakeCall(rtc::Thread::Current(), rtc::Thread::Current(), field_trials) {}
474
FakeCall(webrtc::TaskQueueBase * worker_thread,webrtc::TaskQueueBase * network_thread,webrtc::test::ScopedKeyValueConfig * field_trials)475 FakeCall::FakeCall(webrtc::TaskQueueBase* worker_thread,
476 webrtc::TaskQueueBase* network_thread,
477 webrtc::test::ScopedKeyValueConfig* field_trials)
478 : network_thread_(network_thread),
479 worker_thread_(worker_thread),
480 audio_network_state_(webrtc::kNetworkUp),
481 video_network_state_(webrtc::kNetworkUp),
482 num_created_send_streams_(0),
483 num_created_receive_streams_(0),
484 trials_(field_trials ? field_trials : &fallback_trials_) {}
485
~FakeCall()486 FakeCall::~FakeCall() {
487 EXPECT_EQ(0u, video_send_streams_.size());
488 EXPECT_EQ(0u, audio_send_streams_.size());
489 EXPECT_EQ(0u, video_receive_streams_.size());
490 EXPECT_EQ(0u, audio_receive_streams_.size());
491 }
492
GetVideoSendStreams()493 const std::vector<FakeVideoSendStream*>& FakeCall::GetVideoSendStreams() {
494 return video_send_streams_;
495 }
496
GetVideoReceiveStreams()497 const std::vector<FakeVideoReceiveStream*>& FakeCall::GetVideoReceiveStreams() {
498 return video_receive_streams_;
499 }
500
GetVideoReceiveStream(uint32_t ssrc)501 const FakeVideoReceiveStream* FakeCall::GetVideoReceiveStream(uint32_t ssrc) {
502 for (const auto* p : GetVideoReceiveStreams()) {
503 if (p->GetConfig().rtp.remote_ssrc == ssrc) {
504 return p;
505 }
506 }
507 return nullptr;
508 }
509
GetAudioSendStreams()510 const std::vector<FakeAudioSendStream*>& FakeCall::GetAudioSendStreams() {
511 return audio_send_streams_;
512 }
513
GetAudioSendStream(uint32_t ssrc)514 const FakeAudioSendStream* FakeCall::GetAudioSendStream(uint32_t ssrc) {
515 for (const auto* p : GetAudioSendStreams()) {
516 if (p->GetConfig().rtp.ssrc == ssrc) {
517 return p;
518 }
519 }
520 return nullptr;
521 }
522
GetAudioReceiveStreams()523 const std::vector<FakeAudioReceiveStream*>& FakeCall::GetAudioReceiveStreams() {
524 return audio_receive_streams_;
525 }
526
GetAudioReceiveStream(uint32_t ssrc)527 const FakeAudioReceiveStream* FakeCall::GetAudioReceiveStream(uint32_t ssrc) {
528 for (const auto* p : GetAudioReceiveStreams()) {
529 if (p->GetConfig().rtp.remote_ssrc == ssrc) {
530 return p;
531 }
532 }
533 return nullptr;
534 }
535
536 const std::vector<FakeFlexfecReceiveStream*>&
GetFlexfecReceiveStreams()537 FakeCall::GetFlexfecReceiveStreams() {
538 return flexfec_receive_streams_;
539 }
540
GetNetworkState(webrtc::MediaType media) const541 webrtc::NetworkState FakeCall::GetNetworkState(webrtc::MediaType media) const {
542 switch (media) {
543 case webrtc::MediaType::AUDIO:
544 return audio_network_state_;
545 case webrtc::MediaType::VIDEO:
546 return video_network_state_;
547 case webrtc::MediaType::DATA:
548 case webrtc::MediaType::ANY:
549 ADD_FAILURE() << "GetNetworkState called with unknown parameter.";
550 return webrtc::kNetworkDown;
551 }
552 // Even though all the values for the enum class are listed above,the compiler
553 // will emit a warning as the method may be called with a value outside of the
554 // valid enum range, unless this case is also handled.
555 ADD_FAILURE() << "GetNetworkState called with unknown parameter.";
556 return webrtc::kNetworkDown;
557 }
558
CreateAudioSendStream(const webrtc::AudioSendStream::Config & config)559 webrtc::AudioSendStream* FakeCall::CreateAudioSendStream(
560 const webrtc::AudioSendStream::Config& config) {
561 FakeAudioSendStream* fake_stream =
562 new FakeAudioSendStream(next_stream_id_++, config);
563 audio_send_streams_.push_back(fake_stream);
564 ++num_created_send_streams_;
565 return fake_stream;
566 }
567
DestroyAudioSendStream(webrtc::AudioSendStream * send_stream)568 void FakeCall::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) {
569 auto it = absl::c_find(audio_send_streams_,
570 static_cast<FakeAudioSendStream*>(send_stream));
571 if (it == audio_send_streams_.end()) {
572 ADD_FAILURE() << "DestroyAudioSendStream called with unknown parameter.";
573 } else {
574 delete *it;
575 audio_send_streams_.erase(it);
576 }
577 }
578
CreateAudioReceiveStream(const webrtc::AudioReceiveStreamInterface::Config & config)579 webrtc::AudioReceiveStreamInterface* FakeCall::CreateAudioReceiveStream(
580 const webrtc::AudioReceiveStreamInterface::Config& config) {
581 audio_receive_streams_.push_back(
582 new FakeAudioReceiveStream(next_stream_id_++, config));
583 ++num_created_receive_streams_;
584 return audio_receive_streams_.back();
585 }
586
DestroyAudioReceiveStream(webrtc::AudioReceiveStreamInterface * receive_stream)587 void FakeCall::DestroyAudioReceiveStream(
588 webrtc::AudioReceiveStreamInterface* receive_stream) {
589 auto it = absl::c_find(audio_receive_streams_,
590 static_cast<FakeAudioReceiveStream*>(receive_stream));
591 if (it == audio_receive_streams_.end()) {
592 ADD_FAILURE() << "DestroyAudioReceiveStream called with unknown parameter.";
593 } else {
594 delete *it;
595 audio_receive_streams_.erase(it);
596 }
597 }
598
CreateVideoSendStream(webrtc::VideoSendStream::Config config,webrtc::VideoEncoderConfig encoder_config)599 webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
600 webrtc::VideoSendStream::Config config,
601 webrtc::VideoEncoderConfig encoder_config) {
602 FakeVideoSendStream* fake_stream =
603 new FakeVideoSendStream(std::move(config), std::move(encoder_config));
604 video_send_streams_.push_back(fake_stream);
605 ++num_created_send_streams_;
606 return fake_stream;
607 }
608
DestroyVideoSendStream(webrtc::VideoSendStream * send_stream)609 void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
610 auto it = absl::c_find(video_send_streams_,
611 static_cast<FakeVideoSendStream*>(send_stream));
612 if (it == video_send_streams_.end()) {
613 ADD_FAILURE() << "DestroyVideoSendStream called with unknown parameter.";
614 } else {
615 delete *it;
616 video_send_streams_.erase(it);
617 }
618 }
619
CreateVideoReceiveStream(webrtc::VideoReceiveStreamInterface::Config config)620 webrtc::VideoReceiveStreamInterface* FakeCall::CreateVideoReceiveStream(
621 webrtc::VideoReceiveStreamInterface::Config config) {
622 video_receive_streams_.push_back(
623 new FakeVideoReceiveStream(std::move(config)));
624 ++num_created_receive_streams_;
625 return video_receive_streams_.back();
626 }
627
DestroyVideoReceiveStream(webrtc::VideoReceiveStreamInterface * receive_stream)628 void FakeCall::DestroyVideoReceiveStream(
629 webrtc::VideoReceiveStreamInterface* receive_stream) {
630 auto it = absl::c_find(video_receive_streams_,
631 static_cast<FakeVideoReceiveStream*>(receive_stream));
632 if (it == video_receive_streams_.end()) {
633 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown parameter.";
634 } else {
635 delete *it;
636 video_receive_streams_.erase(it);
637 }
638 }
639
CreateFlexfecReceiveStream(const webrtc::FlexfecReceiveStream::Config config)640 webrtc::FlexfecReceiveStream* FakeCall::CreateFlexfecReceiveStream(
641 const webrtc::FlexfecReceiveStream::Config config) {
642 FakeFlexfecReceiveStream* fake_stream =
643 new FakeFlexfecReceiveStream(std::move(config));
644 flexfec_receive_streams_.push_back(fake_stream);
645 ++num_created_receive_streams_;
646 return fake_stream;
647 }
648
DestroyFlexfecReceiveStream(webrtc::FlexfecReceiveStream * receive_stream)649 void FakeCall::DestroyFlexfecReceiveStream(
650 webrtc::FlexfecReceiveStream* receive_stream) {
651 auto it =
652 absl::c_find(flexfec_receive_streams_,
653 static_cast<FakeFlexfecReceiveStream*>(receive_stream));
654 if (it == flexfec_receive_streams_.end()) {
655 ADD_FAILURE()
656 << "DestroyFlexfecReceiveStream called with unknown parameter.";
657 } else {
658 delete *it;
659 flexfec_receive_streams_.erase(it);
660 }
661 }
662
AddAdaptationResource(rtc::scoped_refptr<webrtc::Resource> resource)663 void FakeCall::AddAdaptationResource(
664 rtc::scoped_refptr<webrtc::Resource> resource) {}
665
Receiver()666 webrtc::PacketReceiver* FakeCall::Receiver() {
667 return this;
668 }
669
DeliverPacket(webrtc::MediaType media_type,rtc::CopyOnWriteBuffer packet,int64_t packet_time_us)670 FakeCall::DeliveryStatus FakeCall::DeliverPacket(webrtc::MediaType media_type,
671 rtc::CopyOnWriteBuffer packet,
672 int64_t packet_time_us) {
673 EXPECT_GE(packet.size(), 12u);
674 RTC_DCHECK(media_type == webrtc::MediaType::AUDIO ||
675 media_type == webrtc::MediaType::VIDEO);
676
677 if (!webrtc::IsRtpPacket(packet)) {
678 return DELIVERY_PACKET_ERROR;
679 }
680
681 uint32_t ssrc = ParseRtpSsrc(packet);
682 if (media_type == webrtc::MediaType::VIDEO) {
683 for (auto receiver : video_receive_streams_) {
684 if (receiver->GetConfig().rtp.remote_ssrc == ssrc) {
685 ++delivered_packets_by_ssrc_[ssrc];
686 return DELIVERY_OK;
687 }
688 }
689 }
690 if (media_type == webrtc::MediaType::AUDIO) {
691 for (auto receiver : audio_receive_streams_) {
692 if (receiver->GetConfig().rtp.remote_ssrc == ssrc) {
693 receiver->DeliverRtp(packet.cdata(), packet.size(), packet_time_us);
694 ++delivered_packets_by_ssrc_[ssrc];
695 return DELIVERY_OK;
696 }
697 }
698 }
699 return DELIVERY_UNKNOWN_SSRC;
700 }
701
SetStats(const webrtc::Call::Stats & stats)702 void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
703 stats_ = stats;
704 }
705
GetNumCreatedSendStreams() const706 int FakeCall::GetNumCreatedSendStreams() const {
707 return num_created_send_streams_;
708 }
709
GetNumCreatedReceiveStreams() const710 int FakeCall::GetNumCreatedReceiveStreams() const {
711 return num_created_receive_streams_;
712 }
713
GetStats() const714 webrtc::Call::Stats FakeCall::GetStats() const {
715 return stats_;
716 }
717
network_thread() const718 webrtc::TaskQueueBase* FakeCall::network_thread() const {
719 return network_thread_;
720 }
721
worker_thread() const722 webrtc::TaskQueueBase* FakeCall::worker_thread() const {
723 return worker_thread_;
724 }
725
SignalChannelNetworkState(webrtc::MediaType media,webrtc::NetworkState state)726 void FakeCall::SignalChannelNetworkState(webrtc::MediaType media,
727 webrtc::NetworkState state) {
728 switch (media) {
729 case webrtc::MediaType::AUDIO:
730 audio_network_state_ = state;
731 break;
732 case webrtc::MediaType::VIDEO:
733 video_network_state_ = state;
734 break;
735 case webrtc::MediaType::DATA:
736 case webrtc::MediaType::ANY:
737 ADD_FAILURE()
738 << "SignalChannelNetworkState called with unknown parameter.";
739 }
740 }
741
OnAudioTransportOverheadChanged(int transport_overhead_per_packet)742 void FakeCall::OnAudioTransportOverheadChanged(
743 int transport_overhead_per_packet) {}
744
OnLocalSsrcUpdated(webrtc::AudioReceiveStreamInterface & stream,uint32_t local_ssrc)745 void FakeCall::OnLocalSsrcUpdated(webrtc::AudioReceiveStreamInterface& stream,
746 uint32_t local_ssrc) {
747 auto& fake_stream = static_cast<FakeAudioReceiveStream&>(stream);
748 fake_stream.SetLocalSsrc(local_ssrc);
749 }
750
OnLocalSsrcUpdated(webrtc::VideoReceiveStreamInterface & stream,uint32_t local_ssrc)751 void FakeCall::OnLocalSsrcUpdated(webrtc::VideoReceiveStreamInterface& stream,
752 uint32_t local_ssrc) {
753 auto& fake_stream = static_cast<FakeVideoReceiveStream&>(stream);
754 fake_stream.SetLocalSsrc(local_ssrc);
755 }
756
OnLocalSsrcUpdated(webrtc::FlexfecReceiveStream & stream,uint32_t local_ssrc)757 void FakeCall::OnLocalSsrcUpdated(webrtc::FlexfecReceiveStream& stream,
758 uint32_t local_ssrc) {
759 auto& fake_stream = static_cast<FakeFlexfecReceiveStream&>(stream);
760 fake_stream.SetLocalSsrc(local_ssrc);
761 }
762
OnUpdateSyncGroup(webrtc::AudioReceiveStreamInterface & stream,absl::string_view sync_group)763 void FakeCall::OnUpdateSyncGroup(webrtc::AudioReceiveStreamInterface& stream,
764 absl::string_view sync_group) {
765 auto& fake_stream = static_cast<FakeAudioReceiveStream&>(stream);
766 fake_stream.SetSyncGroup(sync_group);
767 }
768
OnSentPacket(const rtc::SentPacket & sent_packet)769 void FakeCall::OnSentPacket(const rtc::SentPacket& sent_packet) {
770 last_sent_packet_ = sent_packet;
771 if (sent_packet.packet_id >= 0) {
772 last_sent_nonnegative_packet_id_ = sent_packet.packet_id;
773 }
774 }
775
776 } // namespace cricket
777