xref: /aosp_15_r20/external/webrtc/media/engine/fake_webrtc_call.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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