OLD | NEW |
| (Empty) |
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 { | |
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& | |
45 FakeAudioSendStream::GetConfig() const { | |
46 return config_; | |
47 } | |
48 | |
49 void FakeAudioSendStream::SetStats( | |
50 const webrtc::AudioSendStream::Stats& stats) { | |
51 stats_ = stats; | |
52 } | |
53 | |
54 FakeAudioSendStream::TelephoneEvent | |
55 FakeAudioSendStream::GetLatestTelephoneEvent() const { | |
56 return latest_telephone_event_; | |
57 } | |
58 | |
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 | |
67 webrtc::AudioSendStream::Stats FakeAudioSendStream::GetStats() const { | |
68 return stats_; | |
69 } | |
70 | |
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& | |
78 FakeAudioReceiveStream::GetConfig() const { | |
79 return config_; | |
80 } | |
81 | |
82 void FakeAudioReceiveStream::SetStats( | |
83 const webrtc::AudioReceiveStream::Stats& stats) { | |
84 stats_ = stats; | |
85 } | |
86 | |
87 void FakeAudioReceiveStream::IncrementReceivedPackets() { | |
88 received_packets_++; | |
89 } | |
90 | |
91 webrtc::AudioReceiveStream::Stats FakeAudioReceiveStream::GetStats() const { | |
92 return stats_; | |
93 } | |
94 | |
95 void FakeAudioReceiveStream::SetSink( | |
96 rtc::scoped_ptr<webrtc::AudioSinkInterface> sink) { | |
97 sink_ = std::move(sink); | |
98 } | |
99 | |
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 | |
111 webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const { | |
112 return config_; | |
113 } | |
114 | |
115 webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const { | |
116 return encoder_config_; | |
117 } | |
118 | |
119 std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() { | |
120 return encoder_config_.streams; | |
121 } | |
122 | |
123 bool FakeVideoSendStream::IsSending() const { | |
124 return sending_; | |
125 } | |
126 | |
127 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 | |
137 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 | |
147 int FakeVideoSendStream::GetNumberOfSwappedFrames() const { | |
148 return num_swapped_frames_; | |
149 } | |
150 | |
151 int FakeVideoSendStream::GetLastWidth() const { | |
152 return last_frame_.width(); | |
153 } | |
154 | |
155 int FakeVideoSendStream::GetLastHeight() const { | |
156 return last_frame_.height(); | |
157 } | |
158 | |
159 int64_t FakeVideoSendStream::GetLastTimestamp() const { | |
160 RTC_DCHECK(last_frame_.ntp_time_ms() == 0); | |
161 return last_frame_.render_time_ms(); | |
162 } | |
163 | |
164 void FakeVideoSendStream::IncomingCapturedFrame( | |
165 const webrtc::VideoFrame& frame) { | |
166 ++num_swapped_frames_; | |
167 last_frame_.ShallowCopy(frame); | |
168 } | |
169 | |
170 void FakeVideoSendStream::SetStats( | |
171 const webrtc::VideoSendStream::Stats& stats) { | |
172 stats_ = stats; | |
173 } | |
174 | |
175 webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() { | |
176 return stats_; | |
177 } | |
178 | |
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 | |
198 webrtc::VideoCaptureInput* FakeVideoSendStream::Input() { | |
199 return this; | |
200 } | |
201 | |
202 void FakeVideoSendStream::Start() { | |
203 sending_ = true; | |
204 } | |
205 | |
206 void FakeVideoSendStream::Stop() { | |
207 sending_ = false; | |
208 } | |
209 | |
210 FakeVideoReceiveStream::FakeVideoReceiveStream( | |
211 const webrtc::VideoReceiveStream::Config& config) | |
212 : config_(config), receiving_(false) { | |
213 } | |
214 | |
215 webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() { | |
216 return config_; | |
217 } | |
218 | |
219 bool FakeVideoReceiveStream::IsReceiving() const { | |
220 return receiving_; | |
221 } | |
222 | |
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 | |
228 webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const { | |
229 return stats_; | |
230 } | |
231 | |
232 void FakeVideoReceiveStream::Start() { | |
233 receiving_ = true; | |
234 } | |
235 | |
236 void FakeVideoReceiveStream::Stop() { | |
237 receiving_ = false; | |
238 } | |
239 | |
240 void FakeVideoReceiveStream::SetStats( | |
241 const webrtc::VideoReceiveStream::Stats& stats) { | |
242 stats_ = stats; | |
243 } | |
244 | |
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 | |
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 | |
258 webrtc::Call::Config FakeCall::GetConfig() const { | |
259 return config_; | |
260 } | |
261 | |
262 const std::vector<FakeVideoSendStream*>& FakeCall::GetVideoSendStreams() { | |
263 return video_send_streams_; | |
264 } | |
265 | |
266 const std::vector<FakeVideoReceiveStream*>& FakeCall::GetVideoReceiveStreams() { | |
267 return video_receive_streams_; | |
268 } | |
269 | |
270 const std::vector<FakeAudioSendStream*>& FakeCall::GetAudioSendStreams() { | |
271 return audio_send_streams_; | |
272 } | |
273 | |
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 | |
283 const std::vector<FakeAudioReceiveStream*>& FakeCall::GetAudioReceiveStreams() { | |
284 return audio_receive_streams_; | |
285 } | |
286 | |
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 | |
296 webrtc::NetworkState FakeCall::GetNetworkState() const { | |
297 return network_state_; | |
298 } | |
299 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
382 webrtc::PacketReceiver* FakeCall::Receiver() { | |
383 return this; | |
384 } | |
385 | |
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 | |
415 void FakeCall::SetStats(const webrtc::Call::Stats& stats) { | |
416 stats_ = stats; | |
417 } | |
418 | |
419 int FakeCall::GetNumCreatedSendStreams() const { | |
420 return num_created_send_streams_; | |
421 } | |
422 | |
423 int FakeCall::GetNumCreatedReceiveStreams() const { | |
424 return num_created_receive_streams_; | |
425 } | |
426 | |
427 webrtc::Call::Stats FakeCall::GetStats() const { | |
428 return stats_; | |
429 } | |
430 | |
431 void FakeCall::SetBitrateConfig( | |
432 const webrtc::Call::Config::BitrateConfig& bitrate_config) { | |
433 config_.bitrate_config = bitrate_config; | |
434 } | |
435 | |
436 void FakeCall::SignalNetworkState(webrtc::NetworkState state) { | |
437 network_state_ = state; | |
438 } | |
439 | |
440 void FakeCall::OnSentPacket(const rtc::SentPacket& sent_packet) { | |
441 last_sent_packet_ = sent_packet; | |
442 } | |
443 } // namespace cricket | |
OLD | NEW |