Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: webrtc/ortc/ortcfactory_integrationtest.cc

Issue 2675173003: Adding "adapter" ORTC objects on top of ChannelManager/BaseChannel/etc. (Closed)
Patch Set: Adding OrtcFactory unit tests. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright 2017 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 <memory>
12 #include <utility> // For std::pair, std::move.
13
14 #include "webrtc/api/ortc/ortcfactoryinterface.h"
15 #include "webrtc/base/criticalsection.h"
16 #include "webrtc/base/fakenetwork.h"
17 #include "webrtc/base/gunit.h"
18 #include "webrtc/base/physicalsocketserver.h"
19 #include "webrtc/base/virtualsocketserver.h"
20 #include "webrtc/ortc/testrtpparameters.h"
21 #include "webrtc/p2p/base/udptransport.h"
22 #include "webrtc/pc/test/fakeaudiocapturemodule.h"
23 #include "webrtc/pc/test/fakeperiodicvideocapturer.h"
24 #include "webrtc/pc/test/fakevideotrackrenderer.h"
25
26 namespace {
27
28 const int kDefaultTimeout = 10000; // 10 seconds.
29 // Default number of audio/video frames to wait for before considering a test a
30 // success.
31 const int kDefaultNumFrames = 3;
32 const rtc::IPAddress kIPv4LocalHostAddress =
33 rtc::IPAddress(0x7F000001); // 127.0.0.1
34
35 class PacketReceiver : public sigslot::has_slots<> {
36 public:
37 explicit PacketReceiver(rtc::PacketTransportInternal* transport) {
38 transport->SignalReadPacket.connect(this, &PacketReceiver::OnReadPacket);
39 }
40 int packets_read() const {
41 rtc::CritScope cs(&critsec_);
42 return packets_read_;
43 }
44
45 private:
46 void OnReadPacket(rtc::PacketTransportInternal*,
47 const char*,
48 size_t,
49 const rtc::PacketTime&,
50 int) {
51 rtc::CritScope cs(&critsec_);
52 ++packets_read_;
53 }
54
55 int packets_read_ = 0;
56 rtc::CriticalSection critsec_;
57 };
58
59 } // namespace
60
61 namespace webrtc {
62
63 // Used to test that things work end-to-end when using the default
64 // implementations of threads/etc. provided by OrtcFactory, with the exception
65 // of using a virtual network.
66 //
67 // By default, the virtual network manager doesn't enumerate any networks, but
68 // sockets can still be created in this state.
69 class OrtcFactoryIntegrationTest : public testing::Test {
70 public:
71 OrtcFactoryIntegrationTest()
72 : virtual_socket_server_(&physical_socket_server_),
73 network_thread_(&virtual_socket_server_),
74 fake_audio_capture_module1_(FakeAudioCaptureModule::Create()),
75 fake_audio_capture_module2_(FakeAudioCaptureModule::Create()) {
76 // Sockets are bound to the ANY address, so this is needed to tell the
77 // virtual network which address to use in this case.
78 virtual_socket_server_.SetDefaultRoute(kIPv4LocalHostAddress);
79 network_thread_.Start();
80 // Need to create after network thread is started.
81 ortc_factory1_ = OrtcFactoryInterface::Create(
82 &network_thread_, nullptr, &fake_network_manager_,
83 nullptr, fake_audio_capture_module1_)
84 .MoveValue();
85 ortc_factory2_ = OrtcFactoryInterface::Create(
86 &network_thread_, nullptr, &fake_network_manager_,
87 nullptr, fake_audio_capture_module2_)
88 .MoveValue();
89 }
90
91 protected:
92 typedef std::pair<std::unique_ptr<UdpTransportInterface>,
93 std::unique_ptr<UdpTransportInterface>>
94 UdpTransportPair;
95 typedef std::pair<std::unique_ptr<RtpTransportInterface>,
96 std::unique_ptr<RtpTransportInterface>>
97 RtpTransportPair;
98 typedef std::pair<std::unique_ptr<RtpTransportControllerInterface>,
99 std::unique_ptr<RtpTransportControllerInterface>>
100 RtpTransportControllerPair;
101
102 // Helper function that creates one UDP transport each on |ortc_factory1_|
103 // and |ortc_factory2_|, and connects them.
104 UdpTransportPair CreateAndConnectUdpTransportPair() {
105 auto transport1 = ortc_factory1_->CreateUdpTransport(AF_INET).MoveValue();
106 auto transport2 = ortc_factory2_->CreateUdpTransport(AF_INET).MoveValue();
107 transport1->SetRemoteAddress(
108 rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET),
109 transport2->GetLocalAddress().port()));
110 transport2->SetRemoteAddress(
111 rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET),
112 transport1->GetLocalAddress().port()));
113 return {std::move(transport1), std::move(transport2)};
114 }
115
116 // Creates one transport controller each for |ortc_factory1_| and
117 // |ortc_factory2_|.
118 RtpTransportControllerPair CreateRtpTransportControllerPair() {
119 return {ortc_factory1_->CreateRtpTransportController().MoveValue(),
120 ortc_factory2_->CreateRtpTransportController().MoveValue()};
121 }
122
123 // Helper function that creates a pair of RtpTransports between
124 // |ortc_factory1_| and |ortc_factory2_|. Expected to be called with the
125 // result of CreateAndConnectUdpTransportPair. |rtcp_udp_transports| can be
126 // empty if RTCP muxing is used. |transport_controllers| can be empty if
127 // these transports are being created using a default transport controller.
128 RtpTransportPair CreateRtpTransportPair(
129 const RtcpParameters& rtcp_parameters,
130 const UdpTransportPair& rtp_udp_transports,
131 const UdpTransportPair& rtcp_udp_transports,
132 const RtpTransportControllerPair& transport_controllers) {
133 auto transport_result1 = ortc_factory1_->CreateRtpTransport(
134 rtcp_parameters, rtp_udp_transports.first.get(),
135 rtcp_udp_transports.first.get(), transport_controllers.first.get());
136 auto transport_result2 = ortc_factory2_->CreateRtpTransport(
137 rtcp_parameters, rtp_udp_transports.second.get(),
138 rtcp_udp_transports.second.get(), transport_controllers.second.get());
139 return {transport_result1.MoveValue(), transport_result2.MoveValue()};
140 }
141
142 // For convenience when |rtcp_udp_transports| and |transport_controllers|
143 // aren't needed.
144 RtpTransportPair CreateRtpTransportPair(
145 const RtcpParameters& rtcp_parameters,
146 const UdpTransportPair& rtp_udp_transports) {
147 return CreateRtpTransportPair(rtcp_parameters, rtp_udp_transports,
148 UdpTransportPair(),
149 RtpTransportControllerPair());
150 }
151
152 // Ends up using fake audio capture module, which was passed into OrtcFactory
153 // on creation.
154 rtc::scoped_refptr<webrtc::AudioTrackInterface> CreateLocalAudioTrack(
155 const std::string& id,
156 OrtcFactoryInterface* ortc_factory) {
157 // Disable echo cancellation to make test more efficient.
158 cricket::AudioOptions options;
159 options.echo_cancellation.emplace(true);
160 rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
161 ortc_factory->CreateAudioSource(options);
162 return ortc_factory->CreateAudioTrack(id, source);
163 }
164
165 // Stores created capturer in |fake_video_capturers_|.
166 rtc::scoped_refptr<webrtc::VideoTrackInterface>
167 CreateLocalVideoTrackAndFakeCapturer(const std::string& id,
168 OrtcFactoryInterface* ortc_factory) {
169 cricket::FakeVideoCapturer* fake_capturer =
170 new webrtc::FakePeriodicVideoCapturer();
171 fake_video_capturers_.push_back(fake_capturer);
172 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
173 ortc_factory->CreateVideoSource(
174 std::unique_ptr<cricket::VideoCapturer>(fake_capturer));
175 return rtc::scoped_refptr<webrtc::VideoTrackInterface>(
176 ortc_factory->CreateVideoTrack(id, source));
177 }
178
179 rtc::PhysicalSocketServer physical_socket_server_;
180 rtc::VirtualSocketServer virtual_socket_server_;
181 rtc::Thread network_thread_;
182 rtc::FakeNetworkManager fake_network_manager_;
183 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module1_;
184 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module2_;
185 std::unique_ptr<OrtcFactoryInterface> ortc_factory1_;
186 std::unique_ptr<OrtcFactoryInterface> ortc_factory2_;
187 // Actually owned by video tracks.
188 std::vector<cricket::FakeVideoCapturer*> fake_video_capturers_;
189 };
190
191 TEST_F(OrtcFactoryIntegrationTest, EndToEndUdpTransport) {
192 std::unique_ptr<UdpTransportInterface> transport1 =
193 ortc_factory1_->CreateUdpTransport(AF_INET).MoveValue();
194 std::unique_ptr<UdpTransportInterface> transport2 =
195 ortc_factory2_->CreateUdpTransport(AF_INET).MoveValue();
196 // Sockets are bound to the ANY address, so we need to provide the IP address
197 // explicitly.
198 transport1->SetRemoteAddress(
199 rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET),
200 transport2->GetLocalAddress().port()));
201 transport2->SetRemoteAddress(
202 rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET),
203 transport1->GetLocalAddress().port()));
204
205 // TODO(deadbeef): Once there's something (RTP senders/receivers) that can
206 // use UdpTransport end-to-end, use that for this end-to-end test instead of
207 // making assumptions about the implementation.
208 //
209 // For now, this assumes the returned object is a UdpTransportProxy that wraps
210 // a UdpTransport.
211 cricket::UdpTransport* internal_transport1 =
212 static_cast<cricket::UdpTransport*>(transport1->GetInternal());
213 cricket::UdpTransport* internal_transport2 =
214 static_cast<cricket::UdpTransport*>(transport2->GetInternal());
215 PacketReceiver receiver1(internal_transport1);
216 PacketReceiver receiver2(internal_transport2);
217 // Need to call internal "SendPacket" method on network thread.
218 network_thread_.Invoke<void>(
219 RTC_FROM_HERE, [internal_transport1, internal_transport2]() {
220 internal_transport1->SendPacket("foo", sizeof("foo"),
221 rtc::PacketOptions(), 0);
222 internal_transport2->SendPacket("bar", sizeof("bar"),
223 rtc::PacketOptions(), 0);
224 });
225 EXPECT_EQ_WAIT(1, receiver1.packets_read(), kDefaultTimeout);
226 EXPECT_EQ_WAIT(1, receiver2.packets_read(), kDefaultTimeout);
227 }
228
229 // Very basic end-to-end test with a single pair of audio RTP sender and
230 // receiver.
231 //
232 // Uses muxed RTCP, and minimal parameters with a hard-coded config that's
233 // known to work.
234 TEST_F(OrtcFactoryIntegrationTest, BasicOneWayAudioRtpSenderAndReceiver) {
235 auto udp_transports = CreateAndConnectUdpTransportPair();
236 auto rtp_transports =
237 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
238
239 auto sender_result = ortc_factory1_->CreateRtpSender(
240 cricket::MEDIA_TYPE_AUDIO, rtp_transports.first.get());
241 auto receiver_result = ortc_factory2_->CreateRtpReceiver(
242 cricket::MEDIA_TYPE_AUDIO, rtp_transports.second.get());
243 ASSERT_TRUE(sender_result.ok());
244 ASSERT_TRUE(receiver_result.ok());
245 auto sender = sender_result.MoveValue();
246 auto receiver = receiver_result.MoveValue();
247
248 RTCError error =
249 sender->SetTrack(CreateLocalAudioTrack("audio", ortc_factory1_.get()));
250 EXPECT_TRUE(error.ok());
251
252 RtpParameters opus_parameters = MakeMinimalOpusParameters();
253 EXPECT_TRUE(receiver->Receive(opus_parameters).ok());
254 EXPECT_TRUE(sender->Send(opus_parameters).ok());
255 // Sender and receiver are connected and configured; audio frames should be
256 // able to flow at this point.
257 EXPECT_TRUE_WAIT(
258 fake_audio_capture_module2_->frames_received() > kDefaultNumFrames,
259 kDefaultTimeout);
260 }
261
262 // Very basic end-to-end test with a single pair of video RTP sender and
263 // receiver.
264 //
265 // Uses muxed RTCP, and minimal parameters with a hard-coded config that's
266 // known to work.
267 TEST_F(OrtcFactoryIntegrationTest, BasicOneWayVideoRtpSenderAndReceiver) {
268 auto udp_transports = CreateAndConnectUdpTransportPair();
269 auto rtp_transports =
270 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
271
272 auto sender_result = ortc_factory1_->CreateRtpSender(
273 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get());
274 auto receiver_result = ortc_factory2_->CreateRtpReceiver(
275 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get());
276 ASSERT_TRUE(sender_result.ok());
277 ASSERT_TRUE(receiver_result.ok());
278 auto sender = sender_result.MoveValue();
279 auto receiver = receiver_result.MoveValue();
280
281 RTCError error = sender->SetTrack(
282 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get()));
283 EXPECT_TRUE(error.ok());
284
285 RtpParameters vp8_parameters = MakeMinimalVp8Parameters();
286 EXPECT_TRUE(receiver->Receive(vp8_parameters).ok());
287 EXPECT_TRUE(sender->Send(vp8_parameters).ok());
288 FakeVideoTrackRenderer fake_renderer(
289 static_cast<VideoTrackInterface*>(receiver->GetTrack().get()));
290 // Sender and receiver are connected and configured; video frames should be
291 // able to flow at this point.
292 EXPECT_TRUE_WAIT(fake_renderer.num_rendered_frames() > kDefaultNumFrames,
293 kDefaultTimeout);
294 }
295
296 // Test that if the track is changed while sending, the sender seamlessly
297 // transitions to sending it and frames are received end-to-end.
298 //
299 // Only doing this for video, since given that audio is sourced from a single
300 // fake audio capture module, the aduio track is just a dummy object.
301 // TODO(deadbeef): Change this when possible.
302 TEST_F(OrtcFactoryIntegrationTest, SetTrackWhileSending) {
303 auto udp_transports = CreateAndConnectUdpTransportPair();
304 auto rtp_transports =
305 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
306
307 auto sender_result = ortc_factory1_->CreateRtpSender(
308 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get());
309 auto receiver_result = ortc_factory2_->CreateRtpReceiver(
310 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get());
311 ASSERT_TRUE(sender_result.ok());
312 ASSERT_TRUE(receiver_result.ok());
313 auto sender = sender_result.MoveValue();
314 auto receiver = receiver_result.MoveValue();
315
316 RTCError error = sender->SetTrack(
317 CreateLocalVideoTrackAndFakeCapturer("video_1", ortc_factory1_.get()));
318 EXPECT_TRUE(error.ok());
319 RtpParameters vp8_parameters = MakeMinimalVp8Parameters();
320 EXPECT_TRUE(receiver->Receive(vp8_parameters).ok());
321 EXPECT_TRUE(sender->Send(vp8_parameters).ok());
322 FakeVideoTrackRenderer fake_renderer(
323 static_cast<VideoTrackInterface*>(receiver->GetTrack().get()));
324 // Expect for some initial number of frames to be received.
325 EXPECT_TRUE_WAIT(fake_renderer.num_rendered_frames() > kDefaultNumFrames,
326 kDefaultTimeout);
327 // Stop the old capturer, set a new track, and verify new frames are received
328 // from the new track. Stopping the old capturer ensures that we aren't
329 // actually still getting frames from it.
330 fake_video_capturers_[0]->Stop();
331 int prev_num_frames = fake_renderer.num_rendered_frames();
332 error = sender->SetTrack(
333 CreateLocalVideoTrackAndFakeCapturer("video_2", ortc_factory1_.get()));
334 EXPECT_TRUE(error.ok());
335 EXPECT_TRUE_WAIT(
336 fake_renderer.num_rendered_frames() > kDefaultNumFrames + prev_num_frames,
337 kDefaultTimeout);
338 }
339
340 // End-to-end test with two pairs of RTP senders and receivers, for audio and
341 // video.
342 //
343 // Uses muxed RTCP, and minimal parameters with hard-coded configs that are
344 // known to work.
345 TEST_F(OrtcFactoryIntegrationTest,
346 BasicTwoWayAudioVideoRtpSendersAndReceivers) {
347 auto udp_transports = CreateAndConnectUdpTransportPair();
348 auto rtp_transports =
349 CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
350
351 // Create all the senders and receivers (four per endpoint).
352 auto audio_sender_result1 = ortc_factory1_->CreateRtpSender(
353 cricket::MEDIA_TYPE_AUDIO, rtp_transports.first.get());
354 auto video_sender_result1 = ortc_factory1_->CreateRtpSender(
355 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get());
356 auto audio_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
357 cricket::MEDIA_TYPE_AUDIO, rtp_transports.first.get());
358 auto video_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
359 cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get());
360 ASSERT_TRUE(audio_sender_result1.ok());
361 ASSERT_TRUE(video_sender_result1.ok());
362 ASSERT_TRUE(audio_receiver_result1.ok());
363 ASSERT_TRUE(video_receiver_result1.ok());
364 auto audio_sender1 = audio_sender_result1.MoveValue();
365 auto video_sender1 = video_sender_result1.MoveValue();
366 auto audio_receiver1 = audio_receiver_result1.MoveValue();
367 auto video_receiver1 = video_receiver_result1.MoveValue();
368
369 auto audio_sender_result2 = ortc_factory2_->CreateRtpSender(
370 cricket::MEDIA_TYPE_AUDIO, rtp_transports.second.get());
371 auto video_sender_result2 = ortc_factory2_->CreateRtpSender(
372 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get());
373 auto audio_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
374 cricket::MEDIA_TYPE_AUDIO, rtp_transports.second.get());
375 auto video_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
376 cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get());
377 ASSERT_TRUE(audio_sender_result2.ok());
378 ASSERT_TRUE(video_sender_result2.ok());
379 ASSERT_TRUE(audio_receiver_result2.ok());
380 ASSERT_TRUE(video_receiver_result2.ok());
381 auto audio_sender2 = audio_sender_result2.MoveValue();
382 auto video_sender2 = video_sender_result2.MoveValue();
383 auto audio_receiver2 = audio_receiver_result2.MoveValue();
384 auto video_receiver2 = video_receiver_result2.MoveValue();
385
386 // Add fake tracks.
387 RTCError error = audio_sender1->SetTrack(
388 CreateLocalAudioTrack("audio", ortc_factory1_.get()));
389 EXPECT_TRUE(error.ok());
390 error = video_sender1->SetTrack(
391 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get()));
392 EXPECT_TRUE(error.ok());
393 error = audio_sender2->SetTrack(
394 CreateLocalAudioTrack("audio", ortc_factory2_.get()));
395 EXPECT_TRUE(error.ok());
396 error = video_sender2->SetTrack(
397 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory2_.get()));
398 EXPECT_TRUE(error.ok());
399
400 // "sent_X_parameters1" are the parameters that endpoint 1 sends with and
401 // endpoint 2 receives with.
402 RtpParameters sent_opus_parameters1 =
403 MakeMinimalOpusParametersWithSsrc(0xdeadbeef);
404 RtpParameters sent_vp8_parameters1 =
405 MakeMinimalVp8ParametersWithSsrc(0xbaadfeed);
406 RtpParameters sent_opus_parameters2 =
407 MakeMinimalOpusParametersWithSsrc(0x13333337);
408 RtpParameters sent_vp8_parameters2 =
409 MakeMinimalVp8ParametersWithSsrc(0x12345678);
410
411 // Configure the senders' and receivers' parameters.
412 EXPECT_TRUE(audio_receiver1->Receive(sent_opus_parameters2).ok());
413 EXPECT_TRUE(video_receiver1->Receive(sent_vp8_parameters2).ok());
414 EXPECT_TRUE(audio_receiver2->Receive(sent_opus_parameters1).ok());
415 EXPECT_TRUE(video_receiver2->Receive(sent_vp8_parameters1).ok());
416 EXPECT_TRUE(audio_sender1->Send(sent_opus_parameters1).ok());
417 EXPECT_TRUE(video_sender1->Send(sent_vp8_parameters1).ok());
418 EXPECT_TRUE(audio_sender2->Send(sent_opus_parameters2).ok());
419 EXPECT_TRUE(video_sender2->Send(sent_vp8_parameters2).ok());
420
421 FakeVideoTrackRenderer fake_video_renderer1(
422 static_cast<VideoTrackInterface*>(video_receiver1->GetTrack().get()));
423 FakeVideoTrackRenderer fake_video_renderer2(
424 static_cast<VideoTrackInterface*>(video_receiver2->GetTrack().get()));
425
426 // Senders and receivers are connected and configured; audio and video frames
427 // should be able to flow at this point.
428 EXPECT_TRUE_WAIT(
429 fake_audio_capture_module1_->frames_received() > kDefaultNumFrames &&
430 fake_video_renderer1.num_rendered_frames() > kDefaultNumFrames &&
431 fake_audio_capture_module2_->frames_received() > kDefaultNumFrames &&
432 fake_video_renderer2.num_rendered_frames() > kDefaultNumFrames,
433 kDefaultTimeout);
434 }
435
436 // End-to-end test with two pairs of RTP senders and receivers, for audio and
437 // video. Unlike the test above, this attempts to make the parameters as
438 // complex as possible.
439 //
440 // Uses non-muxed RTCP, with separate audio/video transports, and a full set of
441 // parameters, as would normally be used in a PeerConnection.
442 //
443 // TODO(deadbeef): Update this test as more audio/video features become
444 // supported.
445 TEST_F(OrtcFactoryIntegrationTest, FullTwoWayAudioVideoRtpSendersAndReceivers) {
446 // We want four pairs of UDP transports for this test, for audio/video and
447 // RTP/RTCP.
448 auto audio_rtp_udp_transports = CreateAndConnectUdpTransportPair();
449 auto audio_rtcp_udp_transports = CreateAndConnectUdpTransportPair();
450 auto video_rtp_udp_transports = CreateAndConnectUdpTransportPair();
451 auto video_rtcp_udp_transports = CreateAndConnectUdpTransportPair();
452
453 // Since we have multiple RTP transports on each side, we need an RTP
454 // transport controller.
455 auto transport_controllers = CreateRtpTransportControllerPair();
456
457 RtcpParameters audio_rtcp_parameters;
458 audio_rtcp_parameters.mux = false;
459 auto audio_rtp_transports =
460 CreateRtpTransportPair(audio_rtcp_parameters, audio_rtp_udp_transports,
461 audio_rtcp_udp_transports, transport_controllers);
462
463 RtcpParameters video_rtcp_parameters;
464 video_rtcp_parameters.mux = false;
465 video_rtcp_parameters.reduced_size = true;
466 auto video_rtp_transports =
467 CreateRtpTransportPair(video_rtcp_parameters, video_rtp_udp_transports,
468 video_rtcp_udp_transports, transport_controllers);
469
470 // Create all the senders and receivers (four per endpoint).
471 auto audio_sender_result1 = ortc_factory1_->CreateRtpSender(
472 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.first.get());
473 auto video_sender_result1 = ortc_factory1_->CreateRtpSender(
474 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.first.get());
475 auto audio_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
476 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.first.get());
477 auto video_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
478 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.first.get());
479 ASSERT_TRUE(audio_sender_result1.ok());
480 ASSERT_TRUE(video_sender_result1.ok());
481 ASSERT_TRUE(audio_receiver_result1.ok());
482 ASSERT_TRUE(video_receiver_result1.ok());
483 auto audio_sender1 = audio_sender_result1.MoveValue();
484 auto video_sender1 = video_sender_result1.MoveValue();
485 auto audio_receiver1 = audio_receiver_result1.MoveValue();
486 auto video_receiver1 = video_receiver_result1.MoveValue();
487
488 auto audio_sender_result2 = ortc_factory2_->CreateRtpSender(
489 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.second.get());
490 auto video_sender_result2 = ortc_factory2_->CreateRtpSender(
491 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.second.get());
492 auto audio_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
493 cricket::MEDIA_TYPE_AUDIO, audio_rtp_transports.second.get());
494 auto video_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
495 cricket::MEDIA_TYPE_VIDEO, video_rtp_transports.second.get());
496 ASSERT_TRUE(audio_sender_result2.ok());
497 ASSERT_TRUE(video_sender_result2.ok());
498 ASSERT_TRUE(audio_receiver_result2.ok());
499 ASSERT_TRUE(video_receiver_result2.ok());
500 auto audio_sender2 = audio_sender_result2.MoveValue();
501 auto video_sender2 = video_sender_result2.MoveValue();
502 auto audio_receiver2 = audio_receiver_result2.MoveValue();
503 auto video_receiver2 = video_receiver_result2.MoveValue();
504
505 RTCError error = audio_sender1->SetTrack(
506 CreateLocalAudioTrack("audio", ortc_factory1_.get()));
507 EXPECT_TRUE(error.ok());
508 error = video_sender1->SetTrack(
509 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get()));
510 EXPECT_TRUE(error.ok());
511 error = audio_sender2->SetTrack(
512 CreateLocalAudioTrack("audio", ortc_factory2_.get()));
513 EXPECT_TRUE(error.ok());
514 error = video_sender2->SetTrack(
515 CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory2_.get()));
516 EXPECT_TRUE(error.ok());
517
518 // Use different codecs in different directions for extra challenge.
519 RtpParameters opus_send_parameters = MakeFullOpusParameters();
520 RtpParameters isac_send_parameters = MakeFullIsacParameters();
521 RtpParameters vp8_send_parameters = MakeFullVp8Parameters();
522 RtpParameters vp9_send_parameters = MakeFullVp9Parameters();
523
524 // Remove "payload_type" from receive parameters. Receiver will need to
525 // discern the payload type from packets received.
526 RtpParameters opus_receive_parameters = opus_send_parameters;
527 RtpParameters isac_receive_parameters = isac_send_parameters;
528 RtpParameters vp8_receive_parameters = vp8_send_parameters;
529 RtpParameters vp9_receive_parameters = vp9_send_parameters;
530 opus_receive_parameters.encodings[0].codec_payload_type.reset();
531 isac_receive_parameters.encodings[0].codec_payload_type.reset();
532 vp8_receive_parameters.encodings[0].codec_payload_type.reset();
533 vp9_receive_parameters.encodings[0].codec_payload_type.reset();
534
535 // Configure the senders' and receivers' parameters.
536 //
537 // Note: Intentionally, the top codec in the receive parameters does not
538 // match the codec sent by the other side. If "Receive" is called with a list
539 // of codecs, the receiver should be prepared to receive any of them, not
540 // just the one on top.
541 EXPECT_TRUE(audio_receiver1->Receive(opus_receive_parameters).ok());
542 EXPECT_TRUE(video_receiver1->Receive(vp8_receive_parameters).ok());
543 EXPECT_TRUE(audio_receiver2->Receive(isac_receive_parameters).ok());
544 EXPECT_TRUE(video_receiver2->Receive(vp9_receive_parameters).ok());
545 EXPECT_TRUE(audio_sender1->Send(opus_send_parameters).ok());
546 EXPECT_TRUE(video_sender1->Send(vp8_send_parameters).ok());
547 EXPECT_TRUE(audio_sender2->Send(isac_send_parameters).ok());
548 EXPECT_TRUE(video_sender2->Send(vp9_send_parameters).ok());
549
550 FakeVideoTrackRenderer fake_video_renderer1(
551 static_cast<VideoTrackInterface*>(video_receiver1->GetTrack().get()));
552 FakeVideoTrackRenderer fake_video_renderer2(
553 static_cast<VideoTrackInterface*>(video_receiver2->GetTrack().get()));
554
555 // Senders and receivers are connected and configured; audio and video frames
556 // should be able to flow at this point.
557 EXPECT_TRUE_WAIT(
558 fake_audio_capture_module1_->frames_received() > kDefaultNumFrames &&
559 fake_video_renderer1.num_rendered_frames() > kDefaultNumFrames &&
560 fake_audio_capture_module2_->frames_received() > kDefaultNumFrames &&
561 fake_video_renderer2.num_rendered_frames() > kDefaultNumFrames,
562 kDefaultTimeout);
563 }
564
565 // TODO(deadbeef): End-to-end test for multiple senders/receivers of the same
566 // media type, once that's supported. Currently, it is not because the
567 // BaseChannel model relies on there being a single VoiceChannel and
568 // VideoChannel, and these only support a single set of codecs/etc. per
569 // send/receive direction.
570
571 // TODO(deadbeef): End-to-end test for simulcast, once that's supported by this
572 // API.
573
574 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698