1 /*
2  * libjingle
3  * Copyright 2015 Google Inc.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  *  1. Redistributions of source code must retain the above copyright notice,
9  *     this list of conditions and the following disclaimer.
10  *  2. Redistributions in binary form must reproduce the above copyright notice,
11  *     this list of conditions and the following disclaimer in the documentation
12  *     and/or other materials provided with the distribution.
13  *  3. The name of the author may not be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include "talk/media/webrtc/fakewebrtccall.h"
29 
30 #include <algorithm>
31 #include <utility>
32 
33 #include "talk/media/base/rtputils.h"
34 #include "webrtc/base/checks.h"
35 #include "webrtc/base/gunit.h"
36 #include "webrtc/audio/audio_sink.h"
37 
38 namespace cricket {
FakeAudioSendStream(const webrtc::AudioSendStream::Config & config)39 FakeAudioSendStream::FakeAudioSendStream(
40     const webrtc::AudioSendStream::Config& config) : config_(config) {
41   RTC_DCHECK(config.voe_channel_id != -1);
42 }
43 
44 const webrtc::AudioSendStream::Config&
GetConfig() const45     FakeAudioSendStream::GetConfig() const {
46   return config_;
47 }
48 
SetStats(const webrtc::AudioSendStream::Stats & stats)49 void FakeAudioSendStream::SetStats(
50     const webrtc::AudioSendStream::Stats& stats) {
51   stats_ = stats;
52 }
53 
54 FakeAudioSendStream::TelephoneEvent
GetLatestTelephoneEvent() const55     FakeAudioSendStream::GetLatestTelephoneEvent() const {
56   return latest_telephone_event_;
57 }
58 
SendTelephoneEvent(int payload_type,uint8_t event,uint32_t duration_ms)59 bool FakeAudioSendStream::SendTelephoneEvent(int payload_type, uint8_t event,
60                                              uint32_t duration_ms) {
61   latest_telephone_event_.payload_type = payload_type;
62   latest_telephone_event_.event_code = event;
63   latest_telephone_event_.duration_ms = duration_ms;
64   return true;
65 }
66 
GetStats() const67 webrtc::AudioSendStream::Stats FakeAudioSendStream::GetStats() const {
68   return stats_;
69 }
70 
FakeAudioReceiveStream(const webrtc::AudioReceiveStream::Config & config)71 FakeAudioReceiveStream::FakeAudioReceiveStream(
72     const webrtc::AudioReceiveStream::Config& config)
73     : config_(config), received_packets_(0) {
74   RTC_DCHECK(config.voe_channel_id != -1);
75 }
76 
77 const webrtc::AudioReceiveStream::Config&
GetConfig() const78     FakeAudioReceiveStream::GetConfig() const {
79   return config_;
80 }
81 
SetStats(const webrtc::AudioReceiveStream::Stats & stats)82 void FakeAudioReceiveStream::SetStats(
83     const webrtc::AudioReceiveStream::Stats& stats) {
84   stats_ = stats;
85 }
86 
IncrementReceivedPackets()87 void FakeAudioReceiveStream::IncrementReceivedPackets() {
88   received_packets_++;
89 }
90 
GetStats() const91 webrtc::AudioReceiveStream::Stats FakeAudioReceiveStream::GetStats() const {
92   return stats_;
93 }
94 
SetSink(rtc::scoped_ptr<webrtc::AudioSinkInterface> sink)95 void FakeAudioReceiveStream::SetSink(
96     rtc::scoped_ptr<webrtc::AudioSinkInterface> sink) {
97   sink_ = std::move(sink);
98 }
99 
FakeVideoSendStream(const webrtc::VideoSendStream::Config & config,const webrtc::VideoEncoderConfig & encoder_config)100 FakeVideoSendStream::FakeVideoSendStream(
101     const webrtc::VideoSendStream::Config& config,
102     const webrtc::VideoEncoderConfig& encoder_config)
103     : sending_(false),
104       config_(config),
105       codec_settings_set_(false),
106       num_swapped_frames_(0) {
107   RTC_DCHECK(config.encoder_settings.encoder != NULL);
108   ReconfigureVideoEncoder(encoder_config);
109 }
110 
GetConfig() const111 webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const {
112   return config_;
113 }
114 
GetEncoderConfig() const115 webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const {
116   return encoder_config_;
117 }
118 
GetVideoStreams()119 std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
120   return encoder_config_.streams;
121 }
122 
IsSending() const123 bool FakeVideoSendStream::IsSending() const {
124   return sending_;
125 }
126 
GetVp8Settings(webrtc::VideoCodecVP8 * settings) const127 bool FakeVideoSendStream::GetVp8Settings(
128     webrtc::VideoCodecVP8* settings) const {
129   if (!codec_settings_set_) {
130     return false;
131   }
132 
133   *settings = vpx_settings_.vp8;
134   return true;
135 }
136 
GetVp9Settings(webrtc::VideoCodecVP9 * settings) const137 bool FakeVideoSendStream::GetVp9Settings(
138     webrtc::VideoCodecVP9* settings) const {
139   if (!codec_settings_set_) {
140     return false;
141   }
142 
143   *settings = vpx_settings_.vp9;
144   return true;
145 }
146 
GetNumberOfSwappedFrames() const147 int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
148   return num_swapped_frames_;
149 }
150 
GetLastWidth() const151 int FakeVideoSendStream::GetLastWidth() const {
152   return last_frame_.width();
153 }
154 
GetLastHeight() const155 int FakeVideoSendStream::GetLastHeight() const {
156   return last_frame_.height();
157 }
158 
GetLastTimestamp() const159 int64_t FakeVideoSendStream::GetLastTimestamp() const {
160   RTC_DCHECK(last_frame_.ntp_time_ms() == 0);
161   return last_frame_.render_time_ms();
162 }
163 
IncomingCapturedFrame(const webrtc::VideoFrame & frame)164 void FakeVideoSendStream::IncomingCapturedFrame(
165     const webrtc::VideoFrame& frame) {
166   ++num_swapped_frames_;
167   last_frame_.ShallowCopy(frame);
168 }
169 
SetStats(const webrtc::VideoSendStream::Stats & stats)170 void FakeVideoSendStream::SetStats(
171     const webrtc::VideoSendStream::Stats& stats) {
172   stats_ = stats;
173 }
174 
GetStats()175 webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
176   return stats_;
177 }
178 
ReconfigureVideoEncoder(const webrtc::VideoEncoderConfig & config)179 bool FakeVideoSendStream::ReconfigureVideoEncoder(
180     const webrtc::VideoEncoderConfig& config) {
181   encoder_config_ = config;
182   if (config.encoder_specific_settings != NULL) {
183     if (config_.encoder_settings.payload_name == "VP8") {
184       vpx_settings_.vp8 = *reinterpret_cast<const webrtc::VideoCodecVP8*>(
185                               config.encoder_specific_settings);
186     } else if (config_.encoder_settings.payload_name == "VP9") {
187       vpx_settings_.vp9 = *reinterpret_cast<const webrtc::VideoCodecVP9*>(
188                               config.encoder_specific_settings);
189     } else {
190       ADD_FAILURE() << "Unsupported encoder payload: "
191                     << config_.encoder_settings.payload_name;
192     }
193   }
194   codec_settings_set_ = config.encoder_specific_settings != NULL;
195   return true;
196 }
197 
Input()198 webrtc::VideoCaptureInput* FakeVideoSendStream::Input() {
199   return this;
200 }
201 
Start()202 void FakeVideoSendStream::Start() {
203   sending_ = true;
204 }
205 
Stop()206 void FakeVideoSendStream::Stop() {
207   sending_ = false;
208 }
209 
FakeVideoReceiveStream(const webrtc::VideoReceiveStream::Config & config)210 FakeVideoReceiveStream::FakeVideoReceiveStream(
211     const webrtc::VideoReceiveStream::Config& config)
212     : config_(config), receiving_(false) {
213 }
214 
GetConfig()215 webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
216   return config_;
217 }
218 
IsReceiving() const219 bool FakeVideoReceiveStream::IsReceiving() const {
220   return receiving_;
221 }
222 
InjectFrame(const webrtc::VideoFrame & frame,int time_to_render_ms)223 void FakeVideoReceiveStream::InjectFrame(const webrtc::VideoFrame& frame,
224                                          int time_to_render_ms) {
225   config_.renderer->RenderFrame(frame, time_to_render_ms);
226 }
227 
GetStats() const228 webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
229   return stats_;
230 }
231 
Start()232 void FakeVideoReceiveStream::Start() {
233   receiving_ = true;
234 }
235 
Stop()236 void FakeVideoReceiveStream::Stop() {
237   receiving_ = false;
238 }
239 
SetStats(const webrtc::VideoReceiveStream::Stats & stats)240 void FakeVideoReceiveStream::SetStats(
241     const webrtc::VideoReceiveStream::Stats& stats) {
242   stats_ = stats;
243 }
244 
FakeCall(const webrtc::Call::Config & config)245 FakeCall::FakeCall(const webrtc::Call::Config& config)
246     : config_(config),
247       network_state_(webrtc::kNetworkUp),
248       num_created_send_streams_(0),
249       num_created_receive_streams_(0) {}
250 
~FakeCall()251 FakeCall::~FakeCall() {
252   EXPECT_EQ(0u, video_send_streams_.size());
253   EXPECT_EQ(0u, audio_send_streams_.size());
254   EXPECT_EQ(0u, video_receive_streams_.size());
255   EXPECT_EQ(0u, audio_receive_streams_.size());
256 }
257 
GetConfig() const258 webrtc::Call::Config FakeCall::GetConfig() const {
259   return config_;
260 }
261 
GetVideoSendStreams()262 const std::vector<FakeVideoSendStream*>& FakeCall::GetVideoSendStreams() {
263   return video_send_streams_;
264 }
265 
GetVideoReceiveStreams()266 const std::vector<FakeVideoReceiveStream*>& FakeCall::GetVideoReceiveStreams() {
267   return video_receive_streams_;
268 }
269 
GetAudioSendStreams()270 const std::vector<FakeAudioSendStream*>& FakeCall::GetAudioSendStreams() {
271   return audio_send_streams_;
272 }
273 
GetAudioSendStream(uint32_t ssrc)274 const FakeAudioSendStream* FakeCall::GetAudioSendStream(uint32_t ssrc) {
275   for (const auto* p : GetAudioSendStreams()) {
276     if (p->GetConfig().rtp.ssrc == ssrc) {
277       return p;
278     }
279   }
280   return nullptr;
281 }
282 
GetAudioReceiveStreams()283 const std::vector<FakeAudioReceiveStream*>& FakeCall::GetAudioReceiveStreams() {
284   return audio_receive_streams_;
285 }
286 
GetAudioReceiveStream(uint32_t ssrc)287 const FakeAudioReceiveStream* FakeCall::GetAudioReceiveStream(uint32_t ssrc) {
288   for (const auto* p : GetAudioReceiveStreams()) {
289     if (p->GetConfig().rtp.remote_ssrc == ssrc) {
290       return p;
291     }
292   }
293   return nullptr;
294 }
295 
GetNetworkState() const296 webrtc::NetworkState FakeCall::GetNetworkState() const {
297   return network_state_;
298 }
299 
CreateAudioSendStream(const webrtc::AudioSendStream::Config & config)300 webrtc::AudioSendStream* FakeCall::CreateAudioSendStream(
301     const webrtc::AudioSendStream::Config& config) {
302   FakeAudioSendStream* fake_stream = new FakeAudioSendStream(config);
303   audio_send_streams_.push_back(fake_stream);
304   ++num_created_send_streams_;
305   return fake_stream;
306 }
307 
DestroyAudioSendStream(webrtc::AudioSendStream * send_stream)308 void FakeCall::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) {
309   auto it = std::find(audio_send_streams_.begin(),
310                       audio_send_streams_.end(),
311                       static_cast<FakeAudioSendStream*>(send_stream));
312   if (it == audio_send_streams_.end()) {
313     ADD_FAILURE() << "DestroyAudioSendStream called with unknown paramter.";
314   } else {
315     delete *it;
316     audio_send_streams_.erase(it);
317   }
318 }
319 
CreateAudioReceiveStream(const webrtc::AudioReceiveStream::Config & config)320 webrtc::AudioReceiveStream* FakeCall::CreateAudioReceiveStream(
321     const webrtc::AudioReceiveStream::Config& config) {
322   audio_receive_streams_.push_back(new FakeAudioReceiveStream(config));
323   ++num_created_receive_streams_;
324   return audio_receive_streams_.back();
325 }
326 
DestroyAudioReceiveStream(webrtc::AudioReceiveStream * receive_stream)327 void FakeCall::DestroyAudioReceiveStream(
328     webrtc::AudioReceiveStream* receive_stream) {
329   auto it = std::find(audio_receive_streams_.begin(),
330                       audio_receive_streams_.end(),
331                       static_cast<FakeAudioReceiveStream*>(receive_stream));
332   if (it == audio_receive_streams_.end()) {
333     ADD_FAILURE() << "DestroyAudioReceiveStream called with unknown paramter.";
334   } else {
335     delete *it;
336     audio_receive_streams_.erase(it);
337   }
338 }
339 
CreateVideoSendStream(const webrtc::VideoSendStream::Config & config,const webrtc::VideoEncoderConfig & encoder_config)340 webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
341     const webrtc::VideoSendStream::Config& config,
342     const webrtc::VideoEncoderConfig& encoder_config) {
343   FakeVideoSendStream* fake_stream =
344       new FakeVideoSendStream(config, encoder_config);
345   video_send_streams_.push_back(fake_stream);
346   ++num_created_send_streams_;
347   return fake_stream;
348 }
349 
DestroyVideoSendStream(webrtc::VideoSendStream * send_stream)350 void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
351   auto it = std::find(video_send_streams_.begin(),
352                       video_send_streams_.end(),
353                       static_cast<FakeVideoSendStream*>(send_stream));
354   if (it == video_send_streams_.end()) {
355     ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
356   } else {
357     delete *it;
358     video_send_streams_.erase(it);
359   }
360 }
361 
CreateVideoReceiveStream(const webrtc::VideoReceiveStream::Config & config)362 webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
363     const webrtc::VideoReceiveStream::Config& config) {
364   video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
365   ++num_created_receive_streams_;
366   return video_receive_streams_.back();
367 }
368 
DestroyVideoReceiveStream(webrtc::VideoReceiveStream * receive_stream)369 void FakeCall::DestroyVideoReceiveStream(
370     webrtc::VideoReceiveStream* receive_stream) {
371   auto it = std::find(video_receive_streams_.begin(),
372                       video_receive_streams_.end(),
373                       static_cast<FakeVideoReceiveStream*>(receive_stream));
374   if (it == video_receive_streams_.end()) {
375     ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
376   } else {
377     delete *it;
378     video_receive_streams_.erase(it);
379   }
380 }
381 
Receiver()382 webrtc::PacketReceiver* FakeCall::Receiver() {
383   return this;
384 }
385 
DeliverPacket(webrtc::MediaType media_type,const uint8_t * packet,size_t length,const webrtc::PacketTime & packet_time)386 FakeCall::DeliveryStatus FakeCall::DeliverPacket(
387     webrtc::MediaType media_type,
388     const uint8_t* packet,
389     size_t length,
390     const webrtc::PacketTime& packet_time) {
391   EXPECT_GE(length, 12u);
392   uint32_t ssrc;
393   if (!GetRtpSsrc(packet, length, &ssrc))
394     return DELIVERY_PACKET_ERROR;
395 
396   if (media_type == webrtc::MediaType::ANY ||
397       media_type == webrtc::MediaType::VIDEO) {
398     for (auto receiver : video_receive_streams_) {
399       if (receiver->GetConfig().rtp.remote_ssrc == ssrc)
400         return DELIVERY_OK;
401     }
402   }
403   if (media_type == webrtc::MediaType::ANY ||
404       media_type == webrtc::MediaType::AUDIO) {
405     for (auto receiver : audio_receive_streams_) {
406       if (receiver->GetConfig().rtp.remote_ssrc == ssrc) {
407         receiver->IncrementReceivedPackets();
408         return DELIVERY_OK;
409       }
410     }
411   }
412   return DELIVERY_UNKNOWN_SSRC;
413 }
414 
SetStats(const webrtc::Call::Stats & stats)415 void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
416   stats_ = stats;
417 }
418 
GetNumCreatedSendStreams() const419 int FakeCall::GetNumCreatedSendStreams() const {
420   return num_created_send_streams_;
421 }
422 
GetNumCreatedReceiveStreams() const423 int FakeCall::GetNumCreatedReceiveStreams() const {
424   return num_created_receive_streams_;
425 }
426 
GetStats() const427 webrtc::Call::Stats FakeCall::GetStats() const {
428   return stats_;
429 }
430 
SetBitrateConfig(const webrtc::Call::Config::BitrateConfig & bitrate_config)431 void FakeCall::SetBitrateConfig(
432     const webrtc::Call::Config::BitrateConfig& bitrate_config) {
433   config_.bitrate_config = bitrate_config;
434 }
435 
SignalNetworkState(webrtc::NetworkState state)436 void FakeCall::SignalNetworkState(webrtc::NetworkState state) {
437   network_state_ = state;
438 }
439 
OnSentPacket(const rtc::SentPacket & sent_packet)440 void FakeCall::OnSentPacket(const rtc::SentPacket& sent_packet) {
441   last_sent_packet_ = sent_packet;
442 }
443 }  // namespace cricket
444