blob: d43c7ba8a3173a4ec33b53908a5d0382250a9c8f [file] [log] [blame]
Fredrik Solenbergb6728822015-04-22 15:35:17 +02001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
Fredrik Solenbergb6728822015-04-22 15:35:17 +02003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
Fredrik Solenbergb6728822015-04-22 15:35:17 +02009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "media/engine/fakewebrtccall.h"
Fredrik Solenbergb6728822015-04-22 15:35:17 +020012
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020013#include <algorithm>
Tommif888bb52015-12-12 01:37:01 +010014#include <utility>
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020015
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "api/call/audio_sink.h"
17#include "media/base/rtputils.h"
18#include "rtc_base/checks.h"
19#include "rtc_base/gunit.h"
20#include "rtc_base/platform_file.h"
Fredrik Solenbergb6728822015-04-22 15:35:17 +020021
22namespace cricket {
solenbergc96df772015-10-21 13:01:53 -070023FakeAudioSendStream::FakeAudioSendStream(
solenberg4904fb62017-02-17 12:01:14 -080024 int id, const webrtc::AudioSendStream::Config& config)
25 : id_(id), config_(config) {
solenbergc96df772015-10-21 13:01:53 -070026 RTC_DCHECK(config.voe_channel_id != -1);
27}
28
ossu20a4b3f2017-04-27 02:08:52 -070029void FakeAudioSendStream::Reconfigure(
30 const webrtc::AudioSendStream::Config& config) {
31 config_ = config;
32}
33
Fredrik Solenbergb5727682015-12-04 15:22:19 +010034const webrtc::AudioSendStream::Config&
35 FakeAudioSendStream::GetConfig() const {
36 return config_;
37}
38
solenberg85a04962015-10-27 03:35:21 -070039void FakeAudioSendStream::SetStats(
40 const webrtc::AudioSendStream::Stats& stats) {
41 stats_ = stats;
solenbergc96df772015-10-21 13:01:53 -070042}
43
Fredrik Solenbergb5727682015-12-04 15:22:19 +010044FakeAudioSendStream::TelephoneEvent
45 FakeAudioSendStream::GetLatestTelephoneEvent() const {
46 return latest_telephone_event_;
47}
48
solenbergffbbcac2016-11-17 05:25:37 -080049bool FakeAudioSendStream::SendTelephoneEvent(int payload_type,
50 int payload_frequency, int event,
solenberg8842c3e2016-03-11 03:06:41 -080051 int duration_ms) {
Fredrik Solenbergb5727682015-12-04 15:22:19 +010052 latest_telephone_event_.payload_type = payload_type;
solenbergffbbcac2016-11-17 05:25:37 -080053 latest_telephone_event_.payload_frequency = payload_frequency;
Fredrik Solenbergb5727682015-12-04 15:22:19 +010054 latest_telephone_event_.event_code = event;
55 latest_telephone_event_.duration_ms = duration_ms;
56 return true;
solenbergc96df772015-10-21 13:01:53 -070057}
58
solenberg94218532016-06-16 10:53:22 -070059void FakeAudioSendStream::SetMuted(bool muted) {
60 muted_ = muted;
61}
62
solenberg85a04962015-10-27 03:35:21 -070063webrtc::AudioSendStream::Stats FakeAudioSendStream::GetStats() const {
64 return stats_;
65}
66
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020067FakeAudioReceiveStream::FakeAudioReceiveStream(
solenberg4904fb62017-02-17 12:01:14 -080068 int id, const webrtc::AudioReceiveStream::Config& config)
69 : id_(id), config_(config) {
henrikg91d6ede2015-09-17 00:24:34 -070070 RTC_DCHECK(config.voe_channel_id != -1);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020071}
72
73const webrtc::AudioReceiveStream::Config&
74 FakeAudioReceiveStream::GetConfig() const {
75 return config_;
76}
77
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020078void FakeAudioReceiveStream::SetStats(
79 const webrtc::AudioReceiveStream::Stats& stats) {
80 stats_ = stats;
81}
82
mflodman3d7db262016-04-29 00:57:13 -070083bool FakeAudioReceiveStream::VerifyLastPacket(const uint8_t* data,
84 size_t length) const {
85 return last_packet_ == rtc::Buffer(data, length);
86}
87
88bool FakeAudioReceiveStream::DeliverRtp(const uint8_t* packet,
89 size_t length,
90 const webrtc::PacketTime& packet_time) {
91 ++received_packets_;
92 last_packet_.SetData(packet, length);
93 return true;
94}
95
solenberg85a04962015-10-27 03:35:21 -070096webrtc::AudioReceiveStream::Stats FakeAudioReceiveStream::GetStats() const {
97 return stats_;
98}
99
Tommif888bb52015-12-12 01:37:01 +0100100void FakeAudioReceiveStream::SetSink(
kwibergfffa42b2016-02-23 10:46:32 -0800101 std::unique_ptr<webrtc::AudioSinkInterface> sink) {
kwiberg686a8ef2016-02-26 03:00:35 -0800102 sink_ = std::move(sink);
Tommif888bb52015-12-12 01:37:01 +0100103}
104
solenberg217fb662016-06-17 08:30:54 -0700105void FakeAudioReceiveStream::SetGain(float gain) {
106 gain_ = gain;
107}
108
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200109FakeVideoSendStream::FakeVideoSendStream(
perkj26091b12016-09-01 01:17:40 -0700110 webrtc::VideoSendStream::Config config,
111 webrtc::VideoEncoderConfig encoder_config)
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200112 : sending_(false),
perkj26091b12016-09-01 01:17:40 -0700113 config_(std::move(config)),
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200114 codec_settings_set_(false),
perkj803d97f2016-11-01 11:45:46 -0700115 resolution_scaling_enabled_(false),
sprangc5d62e22017-04-02 23:53:04 -0700116 framerate_scaling_enabled_(false),
perkja49cbd32016-09-16 07:53:41 -0700117 source_(nullptr),
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200118 num_swapped_frames_(0) {
henrikg91d6ede2015-09-17 00:24:34 -0700119 RTC_DCHECK(config.encoder_settings.encoder != NULL);
perkj26091b12016-09-01 01:17:40 -0700120 ReconfigureVideoEncoder(std::move(encoder_config));
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200121}
122
perkja49cbd32016-09-16 07:53:41 -0700123FakeVideoSendStream::~FakeVideoSendStream() {
124 if (source_)
125 source_->RemoveSink(this);
126}
127
perkj26091b12016-09-01 01:17:40 -0700128const webrtc::VideoSendStream::Config& FakeVideoSendStream::GetConfig() const {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200129 return config_;
130}
131
perkj26091b12016-09-01 01:17:40 -0700132const webrtc::VideoEncoderConfig& FakeVideoSendStream::GetEncoderConfig()
133 const {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200134 return encoder_config_;
135}
136
perkjfa10b552016-10-02 23:45:26 -0700137const std::vector<webrtc::VideoStream>& FakeVideoSendStream::GetVideoStreams()
138 const {
139 return video_streams_;
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200140}
141
142bool FakeVideoSendStream::IsSending() const {
143 return sending_;
144}
145
146bool FakeVideoSendStream::GetVp8Settings(
147 webrtc::VideoCodecVP8* settings) const {
148 if (!codec_settings_set_) {
149 return false;
150 }
151
Erik Språng143cec12015-04-28 10:01:41 +0200152 *settings = vpx_settings_.vp8;
153 return true;
154}
155
156bool FakeVideoSendStream::GetVp9Settings(
157 webrtc::VideoCodecVP9* settings) const {
158 if (!codec_settings_set_) {
159 return false;
160 }
161
162 *settings = vpx_settings_.vp9;
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200163 return true;
164}
165
166int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
167 return num_swapped_frames_;
168}
169
170int FakeVideoSendStream::GetLastWidth() const {
nissedf2ceb82016-12-15 06:29:53 -0800171 return last_frame_->width();
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200172}
173
174int FakeVideoSendStream::GetLastHeight() const {
nissedf2ceb82016-12-15 06:29:53 -0800175 return last_frame_->height();
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200176}
177
qiangchenc27d89f2015-07-16 10:27:16 -0700178int64_t FakeVideoSendStream::GetLastTimestamp() const {
nissedf2ceb82016-12-15 06:29:53 -0800179 RTC_DCHECK(last_frame_->ntp_time_ms() == 0);
180 return last_frame_->render_time_ms();
qiangchenc27d89f2015-07-16 10:27:16 -0700181}
182
perkja49cbd32016-09-16 07:53:41 -0700183void FakeVideoSendStream::OnFrame(const webrtc::VideoFrame& frame) {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200184 ++num_swapped_frames_;
nissedf2ceb82016-12-15 06:29:53 -0800185 if (!last_frame_ ||
186 frame.width() != last_frame_->width() ||
187 frame.height() != last_frame_->height() ||
188 frame.rotation() != last_frame_->rotation()) {
perkjfa10b552016-10-02 23:45:26 -0700189 video_streams_ = encoder_config_.video_stream_factory->CreateEncoderStreams(
190 frame.width(), frame.height(), encoder_config_);
191 }
nissedf2ceb82016-12-15 06:29:53 -0800192 last_frame_ = rtc::Optional<webrtc::VideoFrame>(frame);
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200193}
194
195void FakeVideoSendStream::SetStats(
196 const webrtc::VideoSendStream::Stats& stats) {
197 stats_ = stats;
198}
199
200webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
201 return stats_;
202}
203
palmkviste75f2042016-09-28 06:19:48 -0700204void FakeVideoSendStream::EnableEncodedFrameRecording(
205 const std::vector<rtc::PlatformFile>& files,
206 size_t byte_limit) {
207 for (rtc::PlatformFile file : files)
208 rtc::ClosePlatformFile(file);
209}
210
Peter Boström905f8e72016-03-02 16:59:56 +0100211void FakeVideoSendStream::ReconfigureVideoEncoder(
perkj26091b12016-09-01 01:17:40 -0700212 webrtc::VideoEncoderConfig config) {
nissedf2ceb82016-12-15 06:29:53 -0800213 int width, height;
214 if (last_frame_) {
215 width = last_frame_->width();
216 height = last_frame_->height();
217 } else {
218 width = height = 0;
219 }
perkjfa10b552016-10-02 23:45:26 -0700220 video_streams_ = config.video_stream_factory->CreateEncoderStreams(
nissedf2ceb82016-12-15 06:29:53 -0800221 width, height, config);
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200222 if (config.encoder_specific_settings != NULL) {
Erik Språng143cec12015-04-28 10:01:41 +0200223 if (config_.encoder_settings.payload_name == "VP8") {
kthelgason29a44e32016-09-27 03:52:02 -0700224 config.encoder_specific_settings->FillVideoCodecVp8(&vpx_settings_.vp8);
perkjfa10b552016-10-02 23:45:26 -0700225 if (!video_streams_.empty()) {
asaperssonc5dabdd2016-03-21 04:15:50 -0700226 vpx_settings_.vp8.numberOfTemporalLayers = static_cast<unsigned char>(
perkjfa10b552016-10-02 23:45:26 -0700227 video_streams_.back().temporal_layer_thresholds_bps.size() + 1);
asaperssonc5dabdd2016-03-21 04:15:50 -0700228 }
Erik Språng143cec12015-04-28 10:01:41 +0200229 } else if (config_.encoder_settings.payload_name == "VP9") {
kthelgason29a44e32016-09-27 03:52:02 -0700230 config.encoder_specific_settings->FillVideoCodecVp9(&vpx_settings_.vp9);
perkjfa10b552016-10-02 23:45:26 -0700231 if (!video_streams_.empty()) {
asaperssonc5dabdd2016-03-21 04:15:50 -0700232 vpx_settings_.vp9.numberOfTemporalLayers = static_cast<unsigned char>(
perkjfa10b552016-10-02 23:45:26 -0700233 video_streams_.back().temporal_layer_thresholds_bps.size() + 1);
asaperssonc5dabdd2016-03-21 04:15:50 -0700234 }
Erik Språng143cec12015-04-28 10:01:41 +0200235 } else {
236 ADD_FAILURE() << "Unsupported encoder payload: "
237 << config_.encoder_settings.payload_name;
238 }
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200239 }
240 codec_settings_set_ = config.encoder_specific_settings != NULL;
kthelgason29a44e32016-09-27 03:52:02 -0700241 encoder_config_ = std::move(config);
deadbeef119760a2016-04-04 11:43:27 -0700242 ++num_encoder_reconfigurations_;
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200243}
244
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200245void FakeVideoSendStream::Start() {
246 sending_ = true;
247}
248
249void FakeVideoSendStream::Stop() {
250 sending_ = false;
251}
252
perkja49cbd32016-09-16 07:53:41 -0700253void FakeVideoSendStream::SetSource(
perkj803d97f2016-11-01 11:45:46 -0700254 rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
255 const webrtc::VideoSendStream::DegradationPreference&
256 degradation_preference) {
perkja49cbd32016-09-16 07:53:41 -0700257 RTC_DCHECK(source != source_);
258 if (source_)
259 source_->RemoveSink(this);
260 source_ = source;
sprangc5d62e22017-04-02 23:53:04 -0700261 switch (degradation_preference) {
262 case DegradationPreference::kMaintainFramerate:
263 resolution_scaling_enabled_ = true;
264 framerate_scaling_enabled_ = false;
265 break;
266 case DegradationPreference::kMaintainResolution:
267 resolution_scaling_enabled_ = false;
268 framerate_scaling_enabled_ = true;
269 break;
270 case DegradationPreference::kBalanced:
271 resolution_scaling_enabled_ = true;
272 framerate_scaling_enabled_ = true;
273 break;
274 case DegradationPreference::kDegradationDisabled:
275 resolution_scaling_enabled_ = false;
276 framerate_scaling_enabled_ = false;
277 break;
278 }
perkja49cbd32016-09-16 07:53:41 -0700279 if (source)
perkj803d97f2016-11-01 11:45:46 -0700280 source->AddOrUpdateSink(this, resolution_scaling_enabled_
281 ? sink_wants_
282 : rtc::VideoSinkWants());
283}
284
285void FakeVideoSendStream::InjectVideoSinkWants(
286 const rtc::VideoSinkWants& wants) {
287 sink_wants_ = wants;
288 source_->AddOrUpdateSink(this, wants);
perkja49cbd32016-09-16 07:53:41 -0700289}
290
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200291FakeVideoReceiveStream::FakeVideoReceiveStream(
Tommi733b5472016-06-10 17:58:01 +0200292 webrtc::VideoReceiveStream::Config config)
293 : config_(std::move(config)), receiving_(false) {}
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200294
brandtr9d58d942017-02-03 04:43:41 -0800295const webrtc::VideoReceiveStream::Config& FakeVideoReceiveStream::GetConfig()
296 const {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200297 return config_;
298}
299
300bool FakeVideoReceiveStream::IsReceiving() const {
301 return receiving_;
302}
303
nisseeb83a1a2016-03-21 01:27:56 -0700304void FakeVideoReceiveStream::InjectFrame(const webrtc::VideoFrame& frame) {
305 config_.renderer->OnFrame(frame);
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200306}
307
308webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
309 return stats_;
310}
311
312void FakeVideoReceiveStream::Start() {
313 receiving_ = true;
314}
315
316void FakeVideoReceiveStream::Stop() {
317 receiving_ = false;
318}
319
320void FakeVideoReceiveStream::SetStats(
321 const webrtc::VideoReceiveStream::Stats& stats) {
322 stats_ = stats;
323}
324
palmkviste75f2042016-09-28 06:19:48 -0700325void FakeVideoReceiveStream::EnableEncodedFrameRecording(rtc::PlatformFile file,
326 size_t byte_limit) {
327 rtc::ClosePlatformFile(file);
328}
329
eladalonc0d481a2017-08-02 07:39:07 -0700330void FakeVideoReceiveStream::AddSecondarySink(
331 webrtc::RtpPacketSinkInterface* sink) {}
332
333void FakeVideoReceiveStream::RemoveSecondarySink(
334 const webrtc::RtpPacketSinkInterface* sink) {}
335
brandtr468da7c2016-11-22 02:16:47 -0800336FakeFlexfecReceiveStream::FakeFlexfecReceiveStream(
337 const webrtc::FlexfecReceiveStream::Config& config)
Niels Möller2bf9e732017-08-14 11:26:16 +0200338 : config_(config) {}
brandtr468da7c2016-11-22 02:16:47 -0800339
340const webrtc::FlexfecReceiveStream::Config&
341FakeFlexfecReceiveStream::GetConfig() const {
342 return config_;
343}
344
brandtr468da7c2016-11-22 02:16:47 -0800345// TODO(brandtr): Implement when the stats have been designed.
346webrtc::FlexfecReceiveStream::Stats FakeFlexfecReceiveStream::GetStats() const {
347 return webrtc::FlexfecReceiveStream::Stats();
348}
349
eladalonc0d481a2017-08-02 07:39:07 -0700350void FakeFlexfecReceiveStream::OnRtpPacket(const webrtc::RtpPacketReceived&) {
351 RTC_NOTREACHED() << "Not implemented.";
352}
353
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200354FakeCall::FakeCall(const webrtc::Call::Config& config)
355 : config_(config),
skvlad7a43d252016-03-22 15:32:27 -0700356 audio_network_state_(webrtc::kNetworkUp),
357 video_network_state_(webrtc::kNetworkUp),
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200358 num_created_send_streams_(0),
sprangc5d62e22017-04-02 23:53:04 -0700359 num_created_receive_streams_(0),
360 audio_transport_overhead_(0),
361 video_transport_overhead_(0) {}
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200362
363FakeCall::~FakeCall() {
364 EXPECT_EQ(0u, video_send_streams_.size());
solenbergc96df772015-10-21 13:01:53 -0700365 EXPECT_EQ(0u, audio_send_streams_.size());
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200366 EXPECT_EQ(0u, video_receive_streams_.size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200367 EXPECT_EQ(0u, audio_receive_streams_.size());
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200368}
369
370webrtc::Call::Config FakeCall::GetConfig() const {
371 return config_;
372}
373
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200374const std::vector<FakeVideoSendStream*>& FakeCall::GetVideoSendStreams() {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200375 return video_send_streams_;
376}
377
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200378const std::vector<FakeVideoReceiveStream*>& FakeCall::GetVideoReceiveStreams() {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200379 return video_receive_streams_;
380}
381
solenbergc96df772015-10-21 13:01:53 -0700382const std::vector<FakeAudioSendStream*>& FakeCall::GetAudioSendStreams() {
383 return audio_send_streams_;
384}
385
386const FakeAudioSendStream* FakeCall::GetAudioSendStream(uint32_t ssrc) {
387 for (const auto* p : GetAudioSendStreams()) {
388 if (p->GetConfig().rtp.ssrc == ssrc) {
389 return p;
390 }
391 }
392 return nullptr;
393}
394
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200395const std::vector<FakeAudioReceiveStream*>& FakeCall::GetAudioReceiveStreams() {
396 return audio_receive_streams_;
397}
398
399const FakeAudioReceiveStream* FakeCall::GetAudioReceiveStream(uint32_t ssrc) {
solenbergc96df772015-10-21 13:01:53 -0700400 for (const auto* p : GetAudioReceiveStreams()) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200401 if (p->GetConfig().rtp.remote_ssrc == ssrc) {
402 return p;
403 }
404 }
405 return nullptr;
406}
407
brandtr9c3d4c42017-01-23 06:59:13 -0800408const std::vector<FakeFlexfecReceiveStream*>&
brandtr468da7c2016-11-22 02:16:47 -0800409FakeCall::GetFlexfecReceiveStreams() {
410 return flexfec_receive_streams_;
411}
412
skvlad7a43d252016-03-22 15:32:27 -0700413webrtc::NetworkState FakeCall::GetNetworkState(webrtc::MediaType media) const {
414 switch (media) {
415 case webrtc::MediaType::AUDIO:
416 return audio_network_state_;
417 case webrtc::MediaType::VIDEO:
418 return video_network_state_;
419 case webrtc::MediaType::DATA:
420 case webrtc::MediaType::ANY:
421 ADD_FAILURE() << "GetNetworkState called with unknown parameter.";
422 return webrtc::kNetworkDown;
423 }
424 // Even though all the values for the enum class are listed above,the compiler
425 // will emit a warning as the method may be called with a value outside of the
426 // valid enum range, unless this case is also handled.
427 ADD_FAILURE() << "GetNetworkState called with unknown parameter.";
428 return webrtc::kNetworkDown;
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200429}
430
Fredrik Solenberg04f49312015-06-08 13:04:56 +0200431webrtc::AudioSendStream* FakeCall::CreateAudioSendStream(
432 const webrtc::AudioSendStream::Config& config) {
solenberg4904fb62017-02-17 12:01:14 -0800433 FakeAudioSendStream* fake_stream = new FakeAudioSendStream(next_stream_id_++,
434 config);
solenbergc96df772015-10-21 13:01:53 -0700435 audio_send_streams_.push_back(fake_stream);
436 ++num_created_send_streams_;
437 return fake_stream;
Fredrik Solenberg04f49312015-06-08 13:04:56 +0200438}
439
440void FakeCall::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) {
solenbergc96df772015-10-21 13:01:53 -0700441 auto it = std::find(audio_send_streams_.begin(),
442 audio_send_streams_.end(),
443 static_cast<FakeAudioSendStream*>(send_stream));
444 if (it == audio_send_streams_.end()) {
skvlad7a43d252016-03-22 15:32:27 -0700445 ADD_FAILURE() << "DestroyAudioSendStream called with unknown parameter.";
solenbergc96df772015-10-21 13:01:53 -0700446 } else {
447 delete *it;
448 audio_send_streams_.erase(it);
449 }
Fredrik Solenberg04f49312015-06-08 13:04:56 +0200450}
451
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200452webrtc::AudioReceiveStream* FakeCall::CreateAudioReceiveStream(
453 const webrtc::AudioReceiveStream::Config& config) {
solenberg4904fb62017-02-17 12:01:14 -0800454 audio_receive_streams_.push_back(new FakeAudioReceiveStream(next_stream_id_++,
455 config));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200456 ++num_created_receive_streams_;
457 return audio_receive_streams_.back();
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200458}
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200459
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200460void FakeCall::DestroyAudioReceiveStream(
461 webrtc::AudioReceiveStream* receive_stream) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200462 auto it = std::find(audio_receive_streams_.begin(),
463 audio_receive_streams_.end(),
464 static_cast<FakeAudioReceiveStream*>(receive_stream));
465 if (it == audio_receive_streams_.end()) {
skvlad7a43d252016-03-22 15:32:27 -0700466 ADD_FAILURE() << "DestroyAudioReceiveStream called with unknown parameter.";
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200467 } else {
468 delete *it;
469 audio_receive_streams_.erase(it);
470 }
Fredrik Solenberg23fba1f2015-04-29 15:24:01 +0200471}
472
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200473webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
perkj26091b12016-09-01 01:17:40 -0700474 webrtc::VideoSendStream::Config config,
475 webrtc::VideoEncoderConfig encoder_config) {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200476 FakeVideoSendStream* fake_stream =
perkj26091b12016-09-01 01:17:40 -0700477 new FakeVideoSendStream(std::move(config), std::move(encoder_config));
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200478 video_send_streams_.push_back(fake_stream);
479 ++num_created_send_streams_;
480 return fake_stream;
481}
482
483void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200484 auto it = std::find(video_send_streams_.begin(),
485 video_send_streams_.end(),
486 static_cast<FakeVideoSendStream*>(send_stream));
487 if (it == video_send_streams_.end()) {
skvlad7a43d252016-03-22 15:32:27 -0700488 ADD_FAILURE() << "DestroyVideoSendStream called with unknown parameter.";
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200489 } else {
490 delete *it;
491 video_send_streams_.erase(it);
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200492 }
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200493}
494
495webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
Tommi733b5472016-06-10 17:58:01 +0200496 webrtc::VideoReceiveStream::Config config) {
497 video_receive_streams_.push_back(
498 new FakeVideoReceiveStream(std::move(config)));
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200499 ++num_created_receive_streams_;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200500 return video_receive_streams_.back();
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200501}
502
503void FakeCall::DestroyVideoReceiveStream(
504 webrtc::VideoReceiveStream* receive_stream) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200505 auto it = std::find(video_receive_streams_.begin(),
506 video_receive_streams_.end(),
507 static_cast<FakeVideoReceiveStream*>(receive_stream));
508 if (it == video_receive_streams_.end()) {
skvlad7a43d252016-03-22 15:32:27 -0700509 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown parameter.";
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200510 } else {
511 delete *it;
512 video_receive_streams_.erase(it);
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200513 }
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200514}
515
brandtr25445d32016-10-23 23:37:14 -0700516webrtc::FlexfecReceiveStream* FakeCall::CreateFlexfecReceiveStream(
brandtr446fcb62016-12-08 04:14:24 -0800517 const webrtc::FlexfecReceiveStream::Config& config) {
brandtr9c3d4c42017-01-23 06:59:13 -0800518 FakeFlexfecReceiveStream* fake_stream = new FakeFlexfecReceiveStream(config);
519 flexfec_receive_streams_.push_back(fake_stream);
brandtr468da7c2016-11-22 02:16:47 -0800520 ++num_created_receive_streams_;
brandtr9c3d4c42017-01-23 06:59:13 -0800521 return fake_stream;
brandtr25445d32016-10-23 23:37:14 -0700522}
523
524void FakeCall::DestroyFlexfecReceiveStream(
525 webrtc::FlexfecReceiveStream* receive_stream) {
brandtr9c3d4c42017-01-23 06:59:13 -0800526 auto it = std::find(flexfec_receive_streams_.begin(),
527 flexfec_receive_streams_.end(),
528 static_cast<FakeFlexfecReceiveStream*>(receive_stream));
529 if (it == flexfec_receive_streams_.end()) {
530 ADD_FAILURE()
531 << "DestroyFlexfecReceiveStream called with unknown parameter.";
532 } else {
533 delete *it;
534 flexfec_receive_streams_.erase(it);
brandtr468da7c2016-11-22 02:16:47 -0800535 }
brandtr25445d32016-10-23 23:37:14 -0700536}
537
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200538webrtc::PacketReceiver* FakeCall::Receiver() {
539 return this;
540}
541
stefan68786d22015-09-08 05:36:15 -0700542FakeCall::DeliveryStatus FakeCall::DeliverPacket(
543 webrtc::MediaType media_type,
544 const uint8_t* packet,
545 size_t length,
546 const webrtc::PacketTime& packet_time) {
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200547 EXPECT_GE(length, 12u);
nissee5ad5ca2017-03-29 23:57:43 -0700548 RTC_DCHECK(media_type == webrtc::MediaType::AUDIO ||
549 media_type == webrtc::MediaType::VIDEO);
550
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200551 uint32_t ssrc;
552 if (!GetRtpSsrc(packet, length, &ssrc))
553 return DELIVERY_PACKET_ERROR;
554
nissee5ad5ca2017-03-29 23:57:43 -0700555 if (media_type == webrtc::MediaType::VIDEO) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200556 for (auto receiver : video_receive_streams_) {
557 if (receiver->GetConfig().rtp.remote_ssrc == ssrc)
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200558 return DELIVERY_OK;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200559 }
560 }
nissee5ad5ca2017-03-29 23:57:43 -0700561 if (media_type == webrtc::MediaType::AUDIO) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200562 for (auto receiver : audio_receive_streams_) {
563 if (receiver->GetConfig().rtp.remote_ssrc == ssrc) {
mflodman3d7db262016-04-29 00:57:13 -0700564 receiver->DeliverRtp(packet, length, packet_time);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200565 return DELIVERY_OK;
566 }
567 }
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200568 }
569 return DELIVERY_UNKNOWN_SSRC;
570}
571
572void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
573 stats_ = stats;
574}
575
576int FakeCall::GetNumCreatedSendStreams() const {
577 return num_created_send_streams_;
578}
579
580int FakeCall::GetNumCreatedReceiveStreams() const {
581 return num_created_receive_streams_;
582}
583
584webrtc::Call::Stats FakeCall::GetStats() const {
585 return stats_;
586}
587
588void FakeCall::SetBitrateConfig(
589 const webrtc::Call::Config::BitrateConfig& bitrate_config) {
590 config_.bitrate_config = bitrate_config;
591}
592
zstein4b979802017-06-02 14:37:37 -0700593void FakeCall::SetBitrateConfigMask(
594 const webrtc::Call::Config::BitrateConfigMask& mask) {
595 // TODO(zstein): not implemented
596}
597
Alex Narest54d1da12017-10-17 19:49:15 +0200598void FakeCall::SetBitrateAllocationStrategy(
599 std::unique_ptr<rtc::BitrateAllocationStrategy>
600 bitrate_allocation_strategy){
601 // TODO(alexnarest): not implemented
602};
603
skvlad7a43d252016-03-22 15:32:27 -0700604void FakeCall::SignalChannelNetworkState(webrtc::MediaType media,
605 webrtc::NetworkState state) {
606 switch (media) {
607 case webrtc::MediaType::AUDIO:
608 audio_network_state_ = state;
609 break;
610 case webrtc::MediaType::VIDEO:
611 video_network_state_ = state;
612 break;
613 case webrtc::MediaType::DATA:
614 case webrtc::MediaType::ANY:
615 ADD_FAILURE()
616 << "SignalChannelNetworkState called with unknown parameter.";
617 }
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200618}
stefanc1aeaf02015-10-15 07:26:07 -0700619
michaelt79e05882016-11-08 02:50:09 -0800620void FakeCall::OnTransportOverheadChanged(webrtc::MediaType media,
621 int transport_overhead_per_packet) {
622 switch (media) {
623 case webrtc::MediaType::AUDIO:
624 audio_transport_overhead_ = transport_overhead_per_packet;
625 break;
626 case webrtc::MediaType::VIDEO:
627 video_transport_overhead_ = transport_overhead_per_packet;
628 break;
629 case webrtc::MediaType::DATA:
630 case webrtc::MediaType::ANY:
631 ADD_FAILURE()
632 << "SignalChannelNetworkState called with unknown parameter.";
633 }
634}
635
stefanc1aeaf02015-10-15 07:26:07 -0700636void FakeCall::OnSentPacket(const rtc::SentPacket& sent_packet) {
637 last_sent_packet_ = sent_packet;
deadbeef14461d42016-06-15 11:06:57 -0700638 if (sent_packet.packet_id >= 0) {
639 last_sent_nonnegative_packet_id_ = sent_packet.packet_id;
640 }
stefanc1aeaf02015-10-15 07:26:07 -0700641}
deadbeef14461d42016-06-15 11:06:57 -0700642
Fredrik Solenbergb6728822015-04-22 15:35:17 +0200643} // namespace cricket