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

Side by Side Diff: webrtc/video/end_to_end_tests.cc

Issue 2998923002: Use SingleThreadedTaskQueue in DirectTransport (Closed)
Patch Set: Created 3 years, 4 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
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include <algorithm> 10 #include <algorithm>
(...skipping 21 matching lines...) Expand all
32 #include "webrtc/modules/rtp_rtcp/source/rtp_format.h" 32 #include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
33 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" 33 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
34 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" 34 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
35 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 35 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
36 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 36 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
37 #include "webrtc/modules/video_coding/include/video_coding_defines.h" 37 #include "webrtc/modules/video_coding/include/video_coding_defines.h"
38 #include "webrtc/rtc_base/checks.h" 38 #include "webrtc/rtc_base/checks.h"
39 #include "webrtc/rtc_base/event.h" 39 #include "webrtc/rtc_base/event.h"
40 #include "webrtc/rtc_base/file.h" 40 #include "webrtc/rtc_base/file.h"
41 #include "webrtc/rtc_base/optional.h" 41 #include "webrtc/rtc_base/optional.h"
42 #include "webrtc/rtc_base/ptr_util.h"
42 #include "webrtc/rtc_base/random.h" 43 #include "webrtc/rtc_base/random.h"
43 #include "webrtc/rtc_base/rate_limiter.h" 44 #include "webrtc/rtc_base/rate_limiter.h"
44 #include "webrtc/system_wrappers/include/metrics.h" 45 #include "webrtc/system_wrappers/include/metrics.h"
45 #include "webrtc/system_wrappers/include/metrics_default.h" 46 #include "webrtc/system_wrappers/include/metrics_default.h"
46 #include "webrtc/system_wrappers/include/sleep.h" 47 #include "webrtc/system_wrappers/include/sleep.h"
47 #include "webrtc/test/call_test.h" 48 #include "webrtc/test/call_test.h"
48 #include "webrtc/test/direct_transport.h" 49 #include "webrtc/test/direct_transport.h"
49 #include "webrtc/test/encoder_settings.h" 50 #include "webrtc/test/encoder_settings.h"
50 #include "webrtc/test/fake_decoder.h" 51 #include "webrtc/test/fake_decoder.h"
51 #include "webrtc/test/fake_encoder.h" 52 #include "webrtc/test/fake_encoder.h"
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 void OnFrame(const VideoFrame& video_frame) override { 211 void OnFrame(const VideoFrame& video_frame) override {
211 SleepMs(kRenderDelayMs); 212 SleepMs(kRenderDelayMs);
212 event_.Set(); 213 event_.Set();
213 } 214 }
214 215
215 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } 216 bool Wait() { return event_.Wait(kDefaultTimeoutMs); }
216 217
217 rtc::Event event_; 218 rtc::Event event_;
218 } renderer; 219 } renderer;
219 220
220 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get())); 221 test::FrameForwarder frame_forwarder;
222 std::unique_ptr<test::DirectTransport> sender_transport;
223 std::unique_ptr<test::DirectTransport> receiver_transport;
221 224
222 test::DirectTransport sender_transport(sender_call_.get(), payload_type_map_); 225 task_queue_.SendTask([this, &renderer, &frame_forwarder, &sender_transport,
223 test::DirectTransport receiver_transport(receiver_call_.get(), 226 &receiver_transport]() {
224 payload_type_map_); 227 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
225 sender_transport.SetReceiver(receiver_call_->Receiver());
226 receiver_transport.SetReceiver(sender_call_->Receiver());
227 228
228 CreateSendConfig(1, 0, 0, &sender_transport); 229 sender_transport = rtc::MakeUnique<test::DirectTransport>(
229 CreateMatchingReceiveConfigs(&receiver_transport); 230 &task_queue_, sender_call_.get(), payload_type_map_);
231 receiver_transport = rtc::MakeUnique<test::DirectTransport>(
232 &task_queue_, receiver_call_.get(), payload_type_map_);
233 sender_transport->SetReceiver(receiver_call_->Receiver());
234 receiver_transport->SetReceiver(sender_call_->Receiver());
230 235
231 video_receive_configs_[0].renderer = &renderer; 236 CreateSendConfig(1, 0, 0, sender_transport.get());
237 CreateMatchingReceiveConfigs(receiver_transport.get());
232 238
233 CreateVideoStreams(); 239 video_receive_configs_[0].renderer = &renderer;
234 Start();
235 240
236 // Create frames that are smaller than the send width/height, this is done to 241 CreateVideoStreams();
237 // check that the callbacks are done after processing video. 242 Start();
238 std::unique_ptr<test::FrameGenerator> frame_generator(
239 test::FrameGenerator::CreateSquareGenerator(kWidth, kHeight));
240 test::FrameForwarder frame_forwarder;
241 video_send_stream_->SetSource(
242 &frame_forwarder,
243 VideoSendStream::DegradationPreference::kMaintainFramerate);
244 243
245 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); 244 // Create frames that are smaller than the send width/height, this is done
245 // to check that the callbacks are done after processing video.
246 std::unique_ptr<test::FrameGenerator> frame_generator(
247 test::FrameGenerator::CreateSquareGenerator(kWidth, kHeight));
248 video_send_stream_->SetSource(
249 &frame_forwarder,
250 VideoSendStream::DegradationPreference::kMaintainFramerate);
251
252 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame());
253 });
254
246 EXPECT_TRUE(renderer.Wait()) 255 EXPECT_TRUE(renderer.Wait())
247 << "Timed out while waiting for the frame to render."; 256 << "Timed out while waiting for the frame to render.";
248 257
249 Stop(); 258 task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
250 259 Stop();
251 sender_transport.StopSending(); 260 DestroyStreams();
252 receiver_transport.StopSending(); 261 sender_transport.reset();
253 262 receiver_transport.reset();
254 DestroyStreams(); 263 DestroyCalls();
264 });
255 } 265 }
256 266
257 TEST_F(EndToEndTest, TransmitsFirstFrame) { 267 TEST_F(EndToEndTest, TransmitsFirstFrame) {
258 class Renderer : public rtc::VideoSinkInterface<VideoFrame> { 268 class Renderer : public rtc::VideoSinkInterface<VideoFrame> {
259 public: 269 public:
260 Renderer() : event_(false, false) {} 270 Renderer() : event_(false, false) {}
261 271
262 void OnFrame(const VideoFrame& video_frame) override { event_.Set(); } 272 void OnFrame(const VideoFrame& video_frame) override { event_.Set(); }
263 273
264 bool Wait() { return event_.Wait(kDefaultTimeoutMs); } 274 bool Wait() { return event_.Wait(kDefaultTimeoutMs); }
265 275
266 rtc::Event event_; 276 rtc::Event event_;
267 } renderer; 277 } renderer;
268 278
269 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get())); 279 std::unique_ptr<test::FrameGenerator> frame_generator;
280 test::FrameForwarder frame_forwarder;
270 281
271 test::DirectTransport sender_transport(sender_call_.get(), payload_type_map_); 282 std::unique_ptr<test::DirectTransport> sender_transport;
272 test::DirectTransport receiver_transport(receiver_call_.get(), 283 std::unique_ptr<test::DirectTransport> receiver_transport;
273 payload_type_map_);
274 sender_transport.SetReceiver(receiver_call_->Receiver());
275 receiver_transport.SetReceiver(sender_call_->Receiver());
276 284
277 CreateSendConfig(1, 0, 0, &sender_transport); 285 task_queue_.SendTask([this, &renderer, &frame_generator, &frame_forwarder,
278 CreateMatchingReceiveConfigs(&receiver_transport); 286 &sender_transport, &receiver_transport]() {
279 video_receive_configs_[0].renderer = &renderer; 287 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
280 288
281 CreateVideoStreams(); 289 sender_transport = rtc::MakeUnique<test::DirectTransport>(
282 Start(); 290 &task_queue_, sender_call_.get(), payload_type_map_);
291 receiver_transport = rtc::MakeUnique<test::DirectTransport>(
292 &task_queue_, receiver_call_.get(), payload_type_map_);
293 sender_transport->SetReceiver(receiver_call_->Receiver());
294 receiver_transport->SetReceiver(sender_call_->Receiver());
283 295
284 std::unique_ptr<test::FrameGenerator> frame_generator( 296 CreateSendConfig(1, 0, 0, sender_transport.get());
285 test::FrameGenerator::CreateSquareGenerator(kDefaultWidth, 297 CreateMatchingReceiveConfigs(receiver_transport.get());
286 kDefaultHeight)); 298 video_receive_configs_[0].renderer = &renderer;
287 test::FrameForwarder frame_forwarder; 299
288 video_send_stream_->SetSource( 300 CreateVideoStreams();
289 &frame_forwarder, 301 Start();
290 VideoSendStream::DegradationPreference::kMaintainFramerate); 302
291 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); 303 frame_generator = test::FrameGenerator::CreateSquareGenerator(
304 kDefaultWidth, kDefaultHeight);
305 video_send_stream_->SetSource(
306 &frame_forwarder,
307 VideoSendStream::DegradationPreference::kMaintainFramerate);
308 frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame());
309 });
292 310
293 EXPECT_TRUE(renderer.Wait()) 311 EXPECT_TRUE(renderer.Wait())
294 << "Timed out while waiting for the frame to render."; 312 << "Timed out while waiting for the frame to render.";
295 313
296 Stop(); 314 task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
297 315 Stop();
298 sender_transport.StopSending(); 316 DestroyStreams();
299 receiver_transport.StopSending(); 317 sender_transport.reset();
300 318 receiver_transport.reset();
301 DestroyStreams(); 319 DestroyCalls();
320 });
302 } 321 }
303 322
304 class CodecObserver : public test::EndToEndTest, 323 class CodecObserver : public test::EndToEndTest,
305 public rtc::VideoSinkInterface<VideoFrame> { 324 public rtc::VideoSinkInterface<VideoFrame> {
306 public: 325 public:
307 CodecObserver(int no_frames_to_wait_for, 326 CodecObserver(int no_frames_to_wait_for,
308 VideoRotation rotation_to_test, 327 VideoRotation rotation_to_test,
309 const std::string& payload_name, 328 const std::string& payload_name,
310 webrtc::VideoEncoder* encoder, 329 webrtc::VideoEncoder* encoder,
311 webrtc::VideoDecoder* decoder) 330 webrtc::VideoDecoder* decoder)
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 NackObserver() 552 NackObserver()
534 : EndToEndTest(kLongTimeoutMs), 553 : EndToEndTest(kLongTimeoutMs),
535 local_ssrc_(0), 554 local_ssrc_(0),
536 remote_ssrc_(0), 555 remote_ssrc_(0),
537 receive_transport_(nullptr) {} 556 receive_transport_(nullptr) {}
538 557
539 private: 558 private:
540 size_t GetNumVideoStreams() const override { return 0; } 559 size_t GetNumVideoStreams() const override { return 0; }
541 size_t GetNumAudioStreams() const override { return 1; } 560 size_t GetNumAudioStreams() const override { return 1; }
542 561
543 test::PacketTransport* CreateReceiveTransport() override { 562 test::PacketTransport* CreateReceiveTransport(
563 test::SingleThreadedTaskQueue* task_queue) override {
544 test::PacketTransport* receive_transport = new test::PacketTransport( 564 test::PacketTransport* receive_transport = new test::PacketTransport(
545 nullptr, this, test::PacketTransport::kReceiver, payload_type_map_, 565 task_queue, nullptr, this, test::PacketTransport::kReceiver,
546 FakeNetworkPipe::Config()); 566 payload_type_map_, FakeNetworkPipe::Config());
547 receive_transport_ = receive_transport; 567 receive_transport_ = receive_transport;
548 return receive_transport; 568 return receive_transport;
549 } 569 }
550 570
551 Action OnSendRtp(const uint8_t* packet, size_t length) override { 571 Action OnSendRtp(const uint8_t* packet, size_t length) override {
552 RTPHeader header; 572 RTPHeader header;
553 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 573 EXPECT_TRUE(parser_->Parse(packet, length, &header));
554 574
555 if (!sequence_number_to_retransmit_) { 575 if (!sequence_number_to_retransmit_) {
556 sequence_number_to_retransmit_ = 576 sequence_number_to_retransmit_ =
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 EXPECT_EQ(test::CallTest::kFlexfecSendSsrc, 811 EXPECT_EQ(test::CallTest::kFlexfecSendSsrc,
792 report_blocks[0].source_ssrc()); 812 report_blocks[0].source_ssrc());
793 rtc::CritScope lock(&crit_); 813 rtc::CritScope lock(&crit_);
794 received_flexfec_rtcp_ = true; 814 received_flexfec_rtcp_ = true;
795 } 815 }
796 } 816 }
797 817
798 return SEND_PACKET; 818 return SEND_PACKET;
799 } 819 }
800 820
801 test::PacketTransport* CreateSendTransport(Call* sender_call) override { 821 test::PacketTransport* CreateSendTransport(
822 test::SingleThreadedTaskQueue* task_queue,
823 Call* sender_call) override {
802 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. 824 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
803 const int kNetworkDelayMs = 100; 825 const int kNetworkDelayMs = 100;
804 FakeNetworkPipe::Config config; 826 FakeNetworkPipe::Config config;
805 config.queue_delay_ms = kNetworkDelayMs; 827 config.queue_delay_ms = kNetworkDelayMs;
806 return new test::PacketTransport(sender_call, this, 828 return new test::PacketTransport(task_queue, sender_call, this,
807 test::PacketTransport::kSender, 829 test::PacketTransport::kSender,
808 test::CallTest::payload_type_map_, config); 830 test::CallTest::payload_type_map_, config);
809 } 831 }
810 832
811 void OnFrame(const VideoFrame& video_frame) override { 833 void OnFrame(const VideoFrame& video_frame) override {
812 rtc::CritScope lock(&crit_); 834 rtc::CritScope lock(&crit_);
813 // Rendering frame with timestamp of packet that was dropped -> FEC 835 // Rendering frame with timestamp of packet that was dropped -> FEC
814 // protection worked. 836 // protection worked.
815 auto it = dropped_timestamps_.find(video_frame.timestamp()); 837 auto it = dropped_timestamps_.find(video_frame.timestamp());
816 if (it != dropped_timestamps_.end()) { 838 if (it != dropped_timestamps_.end()) {
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 ulpfec_sequence_number_) == nacks.end()) 992 ulpfec_sequence_number_) == nacks.end())
971 << "Got nack for ULPFEC packet"; 993 << "Got nack for ULPFEC packet";
972 if (!nacks.empty() && 994 if (!nacks.empty() &&
973 IsNewerSequenceNumber(nacks.back(), ulpfec_sequence_number_)) { 995 IsNewerSequenceNumber(nacks.back(), ulpfec_sequence_number_)) {
974 observation_complete_.Set(); 996 observation_complete_.Set();
975 } 997 }
976 } 998 }
977 return SEND_PACKET; 999 return SEND_PACKET;
978 } 1000 }
979 1001
980 test::PacketTransport* CreateSendTransport(Call* sender_call) override { 1002 test::PacketTransport* CreateSendTransport(
1003 test::SingleThreadedTaskQueue* task_queue,
1004 Call* sender_call) override {
981 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. 1005 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
982 // Configure some network delay. 1006 // Configure some network delay.
983 const int kNetworkDelayMs = 50; 1007 const int kNetworkDelayMs = 50;
984 FakeNetworkPipe::Config config; 1008 FakeNetworkPipe::Config config;
985 config.queue_delay_ms = kNetworkDelayMs; 1009 config.queue_delay_ms = kNetworkDelayMs;
986 return new test::PacketTransport(sender_call, this, 1010 return new test::PacketTransport(task_queue, sender_call, this,
987 test::PacketTransport::kSender, 1011 test::PacketTransport::kSender,
988 payload_type_map_, config); 1012 payload_type_map_, config);
989 } 1013 }
990 1014
991 // TODO(holmer): Investigate why we don't send FEC packets when the bitrate 1015 // TODO(holmer): Investigate why we don't send FEC packets when the bitrate
992 // is 10 kbps. 1016 // is 10 kbps.
993 Call::Config GetSenderCallConfig() override { 1017 Call::Config GetSenderCallConfig() override {
994 Call::Config config(event_log_.get()); 1018 Call::Config config(event_log_.get());
995 const int kMinBitrateBps = 30000; 1019 const int kMinBitrateBps = 30000;
996 config.bitrate_config.min_bitrate_bps = kMinBitrateBps; 1020 config.bitrate_config.min_bitrate_bps = kMinBitrateBps;
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status); 1342 EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status);
1319 delivered_packet_.Set(); 1343 delivered_packet_.Set();
1320 return delivery_status; 1344 return delivery_status;
1321 } 1345 }
1322 } 1346 }
1323 1347
1324 PacketReceiver* receiver_; 1348 PacketReceiver* receiver_;
1325 rtc::Event delivered_packet_; 1349 rtc::Event delivered_packet_;
1326 }; 1350 };
1327 1351
1328 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get())); 1352 std::unique_ptr<test::DirectTransport> send_transport;
1353 std::unique_ptr<test::DirectTransport> receive_transport;
1354 std::unique_ptr<PacketInputObserver> input_observer;
1329 1355
1330 test::DirectTransport send_transport(sender_call_.get(), payload_type_map_); 1356 task_queue_.SendTask([this, &send_transport, &receive_transport,
1331 test::DirectTransport receive_transport(receiver_call_.get(), 1357 &input_observer]() {
1332 payload_type_map_); 1358 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
1333 PacketInputObserver input_observer(receiver_call_->Receiver());
1334 send_transport.SetReceiver(&input_observer);
1335 receive_transport.SetReceiver(sender_call_->Receiver());
1336 1359
1337 CreateSendConfig(1, 0, 0, &send_transport); 1360 send_transport = rtc::MakeUnique<test::DirectTransport>(
1338 CreateMatchingReceiveConfigs(&receive_transport); 1361 &task_queue_, sender_call_.get(), payload_type_map_);
1362 receive_transport = rtc::MakeUnique<test::DirectTransport>(
1363 &task_queue_, receiver_call_.get(), payload_type_map_);
1364 input_observer =
1365 rtc::MakeUnique<PacketInputObserver>(receiver_call_->Receiver());
1366 send_transport->SetReceiver(input_observer.get());
1367 receive_transport->SetReceiver(sender_call_->Receiver());
1339 1368
1340 CreateVideoStreams(); 1369 CreateSendConfig(1, 0, 0, send_transport.get());
1341 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, 1370 CreateMatchingReceiveConfigs(receive_transport.get());
1342 kDefaultHeight);
1343 Start();
1344 1371
1345 receiver_call_->DestroyVideoReceiveStream(video_receive_streams_[0]); 1372 CreateVideoStreams();
1346 video_receive_streams_.clear(); 1373 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
1374 kDefaultHeight);
1375 Start();
1376
1377 receiver_call_->DestroyVideoReceiveStream(video_receive_streams_[0]);
1378 video_receive_streams_.clear();
1379 });
1347 1380
1348 // Wait() waits for a received packet. 1381 // Wait() waits for a received packet.
1349 EXPECT_TRUE(input_observer.Wait()); 1382 EXPECT_TRUE(input_observer->Wait());
1350 1383
1351 Stop(); 1384 task_queue_.SendTask([this, &send_transport, &receive_transport]() {
1352 1385 Stop();
1353 DestroyStreams(); 1386 DestroyStreams();
1354 1387 send_transport.reset();
1355 send_transport.StopSending(); 1388 receive_transport.reset();
1356 receive_transport.StopSending(); 1389 DestroyCalls();
1390 });
1357 } 1391 }
1358 1392
1359 void EndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) { 1393 void EndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) {
1360 static const int kNumCompoundRtcpPacketsToObserve = 10; 1394 static const int kNumCompoundRtcpPacketsToObserve = 10;
1361 class RtcpModeObserver : public test::EndToEndTest { 1395 class RtcpModeObserver : public test::EndToEndTest {
1362 public: 1396 public:
1363 explicit RtcpModeObserver(RtcpMode rtcp_mode) 1397 explicit RtcpModeObserver(RtcpMode rtcp_mode)
1364 : EndToEndTest(kDefaultTimeoutMs), 1398 : EndToEndTest(kDefaultTimeoutMs),
1365 rtcp_mode_(rtcp_mode), 1399 rtcp_mode_(rtcp_mode),
1366 sent_rtp_(0), 1400 sent_rtp_(0),
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1453 const uint8_t kVideoPayloadType = 124; 1487 const uint8_t kVideoPayloadType = 124;
1454 const std::map<uint8_t, MediaType> payload_type_map_ = { 1488 const std::map<uint8_t, MediaType> payload_type_map_ = {
1455 {kVideoPayloadType, MediaType::VIDEO}}; 1489 {kVideoPayloadType, MediaType::VIDEO}};
1456 1490
1457 struct CodecSettings { 1491 struct CodecSettings {
1458 uint32_t ssrc; 1492 uint32_t ssrc;
1459 int width; 1493 int width;
1460 int height; 1494 int height;
1461 } codec_settings[kNumStreams]; 1495 } codec_settings[kNumStreams];
1462 1496
1463 MultiStreamTest() { 1497 explicit MultiStreamTest(test::SingleThreadedTaskQueue* task_queue)
1498 : task_queue_(task_queue) {
1464 // TODO(sprang): Cleanup when msvc supports explicit initializers for array. 1499 // TODO(sprang): Cleanup when msvc supports explicit initializers for array.
1465 codec_settings[0] = {1, 640, 480}; 1500 codec_settings[0] = {1, 640, 480};
1466 codec_settings[1] = {2, 320, 240}; 1501 codec_settings[1] = {2, 320, 240};
1467 codec_settings[2] = {3, 240, 160}; 1502 codec_settings[2] = {3, 240, 160};
1468 } 1503 }
1469 1504
1470 virtual ~MultiStreamTest() {} 1505 virtual ~MultiStreamTest() {}
1471 1506
1472 void RunTest() { 1507 void RunTest() {
1473 webrtc::RtcEventLogNullImpl event_log; 1508 webrtc::RtcEventLogNullImpl event_log;
1474 Call::Config config(&event_log); 1509 Call::Config config(&event_log);
1475 std::unique_ptr<Call> sender_call(Call::Create(config)); 1510 std::unique_ptr<Call> sender_call;
1476 std::unique_ptr<Call> receiver_call(Call::Create(config)); 1511 std::unique_ptr<Call> receiver_call;
1477 std::unique_ptr<test::DirectTransport> sender_transport( 1512 std::unique_ptr<test::DirectTransport> sender_transport;
1478 CreateSendTransport(sender_call.get())); 1513 std::unique_ptr<test::DirectTransport> receiver_transport;
1479 std::unique_ptr<test::DirectTransport> receiver_transport(
1480 CreateReceiveTransport(receiver_call.get()));
1481 sender_transport->SetReceiver(receiver_call->Receiver());
1482 receiver_transport->SetReceiver(sender_call->Receiver());
1483
1484 std::unique_ptr<VideoEncoder> encoders[kNumStreams];
1485 for (size_t i = 0; i < kNumStreams; ++i)
1486 encoders[i].reset(VP8Encoder::Create());
1487 1514
1488 VideoSendStream* send_streams[kNumStreams]; 1515 VideoSendStream* send_streams[kNumStreams];
1489 VideoReceiveStream* receive_streams[kNumStreams]; 1516 VideoReceiveStream* receive_streams[kNumStreams];
1490
1491 test::FrameGeneratorCapturer* frame_generators[kNumStreams]; 1517 test::FrameGeneratorCapturer* frame_generators[kNumStreams];
1492 std::vector<std::unique_ptr<VideoDecoder>> allocated_decoders; 1518 std::vector<std::unique_ptr<VideoDecoder>> allocated_decoders;
1493 for (size_t i = 0; i < kNumStreams; ++i) { 1519 std::unique_ptr<VideoEncoder> encoders[kNumStreams];
1494 uint32_t ssrc = codec_settings[i].ssrc;
1495 int width = codec_settings[i].width;
1496 int height = codec_settings[i].height;
1497 1520
1498 VideoSendStream::Config send_config(sender_transport.get()); 1521 task_queue_->SendTask([&]() {
1499 send_config.rtp.ssrcs.push_back(ssrc); 1522 sender_call = rtc::WrapUnique(Call::Create(config));
1500 send_config.encoder_settings.encoder = encoders[i].get(); 1523 receiver_call = rtc::WrapUnique(Call::Create(config));
1501 send_config.encoder_settings.payload_name = "VP8"; 1524 sender_transport =
1502 send_config.encoder_settings.payload_type = kVideoPayloadType; 1525 rtc::WrapUnique(CreateSendTransport(task_queue_, sender_call.get()));
1503 VideoEncoderConfig encoder_config; 1526 receiver_transport = rtc::WrapUnique(
1504 test::FillEncoderConfiguration(1, &encoder_config); 1527 CreateReceiveTransport(task_queue_, receiver_call.get()));
1505 encoder_config.max_bitrate_bps = 100000;
1506 1528
1507 UpdateSendConfig(i, &send_config, &encoder_config, &frame_generators[i]); 1529 sender_transport->SetReceiver(receiver_call->Receiver());
1530 receiver_transport->SetReceiver(sender_call->Receiver());
1508 1531
1509 send_streams[i] = sender_call->CreateVideoSendStream( 1532 for (size_t i = 0; i < kNumStreams; ++i)
1510 send_config.Copy(), encoder_config.Copy()); 1533 encoders[i].reset(VP8Encoder::Create());
1511 send_streams[i]->Start();
1512 1534
1513 VideoReceiveStream::Config receive_config(receiver_transport.get()); 1535 for (size_t i = 0; i < kNumStreams; ++i) {
1514 receive_config.rtp.remote_ssrc = ssrc; 1536 uint32_t ssrc = codec_settings[i].ssrc;
1515 receive_config.rtp.local_ssrc = test::CallTest::kReceiverLocalVideoSsrc; 1537 int width = codec_settings[i].width;
1516 VideoReceiveStream::Decoder decoder = 1538 int height = codec_settings[i].height;
1517 test::CreateMatchingDecoder(send_config.encoder_settings);
1518 allocated_decoders.push_back(
1519 std::unique_ptr<VideoDecoder>(decoder.decoder));
1520 receive_config.decoders.push_back(decoder);
1521 1539
1522 UpdateReceiveConfig(i, &receive_config); 1540 VideoSendStream::Config send_config(sender_transport.get());
1541 send_config.rtp.ssrcs.push_back(ssrc);
1542 send_config.encoder_settings.encoder = encoders[i].get();
1543 send_config.encoder_settings.payload_name = "VP8";
1544 send_config.encoder_settings.payload_type = kVideoPayloadType;
1545 VideoEncoderConfig encoder_config;
1546 test::FillEncoderConfiguration(1, &encoder_config);
1547 encoder_config.max_bitrate_bps = 100000;
1523 1548
1524 receive_streams[i] = 1549 UpdateSendConfig(i, &send_config, &encoder_config,
1525 receiver_call->CreateVideoReceiveStream(std::move(receive_config)); 1550 &frame_generators[i]);
1526 receive_streams[i]->Start();
1527 1551
1528 frame_generators[i] = test::FrameGeneratorCapturer::Create( 1552 send_streams[i] = sender_call->CreateVideoSendStream(
1529 width, height, 30, Clock::GetRealTimeClock()); 1553 send_config.Copy(), encoder_config.Copy());
1530 send_streams[i]->SetSource( 1554 send_streams[i]->Start();
1531 frame_generators[i], 1555
1532 VideoSendStream::DegradationPreference::kMaintainFramerate); 1556 VideoReceiveStream::Config receive_config(receiver_transport.get());
1533 frame_generators[i]->Start(); 1557 receive_config.rtp.remote_ssrc = ssrc;
1534 } 1558 receive_config.rtp.local_ssrc = test::CallTest::kReceiverLocalVideoSsrc;
1559 VideoReceiveStream::Decoder decoder =
1560 test::CreateMatchingDecoder(send_config.encoder_settings);
1561 allocated_decoders.push_back(
1562 std::unique_ptr<VideoDecoder>(decoder.decoder));
1563 receive_config.decoders.push_back(decoder);
1564
1565 UpdateReceiveConfig(i, &receive_config);
1566
1567 receive_streams[i] =
1568 receiver_call->CreateVideoReceiveStream(std::move(receive_config));
1569 receive_streams[i]->Start();
1570
1571 frame_generators[i] = test::FrameGeneratorCapturer::Create(
1572 width, height, 30, Clock::GetRealTimeClock());
1573 send_streams[i]->SetSource(
1574 frame_generators[i],
1575 VideoSendStream::DegradationPreference::kMaintainFramerate);
1576 frame_generators[i]->Start();
1577 }
1578 });
1535 1579
1536 Wait(); 1580 Wait();
1537 1581
1538 for (size_t i = 0; i < kNumStreams; ++i) { 1582 task_queue_->SendTask([&]() {
1539 frame_generators[i]->Stop(); 1583 for (size_t i = 0; i < kNumStreams; ++i) {
1540 sender_call->DestroyVideoSendStream(send_streams[i]); 1584 frame_generators[i]->Stop();
1541 receiver_call->DestroyVideoReceiveStream(receive_streams[i]); 1585 sender_call->DestroyVideoSendStream(send_streams[i]);
1542 delete frame_generators[i]; 1586 receiver_call->DestroyVideoReceiveStream(receive_streams[i]);
1543 } 1587 delete frame_generators[i];
1588 }
1544 1589
1545 sender_transport->StopSending(); 1590 sender_transport.reset();
1546 receiver_transport->StopSending(); 1591 receiver_transport.reset();
1592
1593 sender_call.reset();
1594 receiver_call.reset();
1595 });
1547 } 1596 }
1548 1597
1549 protected: 1598 protected:
1550 virtual void Wait() = 0; 1599 virtual void Wait() = 0;
1551 // Note: frame_generator is a point-to-pointer, since the actual instance 1600 // Note: frame_generator is a point-to-pointer, since the actual instance
1552 // hasn't been created at the time of this call. Only when packets/frames 1601 // hasn't been created at the time of this call. Only when packets/frames
1553 // start flowing should this be dereferenced. 1602 // start flowing should this be dereferenced.
1554 virtual void UpdateSendConfig( 1603 virtual void UpdateSendConfig(
1555 size_t stream_index, 1604 size_t stream_index,
1556 VideoSendStream::Config* send_config, 1605 VideoSendStream::Config* send_config,
1557 VideoEncoderConfig* encoder_config, 1606 VideoEncoderConfig* encoder_config,
1558 test::FrameGeneratorCapturer** frame_generator) {} 1607 test::FrameGeneratorCapturer** frame_generator) {}
1559 virtual void UpdateReceiveConfig(size_t stream_index, 1608 virtual void UpdateReceiveConfig(size_t stream_index,
1560 VideoReceiveStream::Config* receive_config) { 1609 VideoReceiveStream::Config* receive_config) {
1561 } 1610 }
1562 virtual test::DirectTransport* CreateSendTransport(Call* sender_call) { 1611 virtual test::DirectTransport* CreateSendTransport(
1563 return new test::DirectTransport(sender_call, payload_type_map_); 1612 test::SingleThreadedTaskQueue* task_queue,
1613 Call* sender_call) {
1614 return new test::DirectTransport(task_queue, sender_call,
1615 payload_type_map_);
1564 } 1616 }
1565 virtual test::DirectTransport* CreateReceiveTransport(Call* receiver_call) { 1617 virtual test::DirectTransport* CreateReceiveTransport(
1566 return new test::DirectTransport(receiver_call, payload_type_map_); 1618 test::SingleThreadedTaskQueue* task_queue,
1619 Call* receiver_call) {
1620 return new test::DirectTransport(task_queue, receiver_call,
1621 payload_type_map_);
1567 } 1622 }
1623
1624 test::SingleThreadedTaskQueue* const task_queue_;
1568 }; 1625 };
1569 1626
1570 // Each renderer verifies that it receives the expected resolution, and as soon 1627 // Each renderer verifies that it receives the expected resolution, and as soon
1571 // as every renderer has received a frame, the test finishes. 1628 // as every renderer has received a frame, the test finishes.
1572 TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { 1629 TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) {
1573 class VideoOutputObserver : public rtc::VideoSinkInterface<VideoFrame> { 1630 class VideoOutputObserver : public rtc::VideoSinkInterface<VideoFrame> {
1574 public: 1631 public:
1575 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings, 1632 VideoOutputObserver(const MultiStreamTest::CodecSettings& settings,
1576 uint32_t ssrc, 1633 uint32_t ssrc,
1577 test::FrameGeneratorCapturer** frame_generator) 1634 test::FrameGeneratorCapturer** frame_generator)
(...skipping 15 matching lines...) Expand all
1593 1650
1594 private: 1651 private:
1595 const MultiStreamTest::CodecSettings& settings_; 1652 const MultiStreamTest::CodecSettings& settings_;
1596 const uint32_t ssrc_; 1653 const uint32_t ssrc_;
1597 test::FrameGeneratorCapturer** const frame_generator_; 1654 test::FrameGeneratorCapturer** const frame_generator_;
1598 rtc::Event done_; 1655 rtc::Event done_;
1599 }; 1656 };
1600 1657
1601 class Tester : public MultiStreamTest { 1658 class Tester : public MultiStreamTest {
1602 public: 1659 public:
1603 Tester() {} 1660 explicit Tester(test::SingleThreadedTaskQueue* task_queue)
1661 : MultiStreamTest(task_queue) {}
1604 virtual ~Tester() {} 1662 virtual ~Tester() {}
1605 1663
1606 protected: 1664 protected:
1607 void Wait() override { 1665 void Wait() override {
1608 for (const auto& observer : observers_) { 1666 for (const auto& observer : observers_) {
1609 EXPECT_TRUE(observer->Wait()) << "Time out waiting for from on ssrc " 1667 EXPECT_TRUE(observer->Wait()) << "Time out waiting for from on ssrc "
1610 << observer->Ssrc(); 1668 << observer->Ssrc();
1611 } 1669 }
1612 } 1670 }
1613 1671
1614 void UpdateSendConfig( 1672 void UpdateSendConfig(
1615 size_t stream_index, 1673 size_t stream_index,
1616 VideoSendStream::Config* send_config, 1674 VideoSendStream::Config* send_config,
1617 VideoEncoderConfig* encoder_config, 1675 VideoEncoderConfig* encoder_config,
1618 test::FrameGeneratorCapturer** frame_generator) override { 1676 test::FrameGeneratorCapturer** frame_generator) override {
1619 observers_[stream_index].reset(new VideoOutputObserver( 1677 observers_[stream_index].reset(new VideoOutputObserver(
1620 codec_settings[stream_index], send_config->rtp.ssrcs.front(), 1678 codec_settings[stream_index], send_config->rtp.ssrcs.front(),
1621 frame_generator)); 1679 frame_generator));
1622 } 1680 }
1623 1681
1624 void UpdateReceiveConfig( 1682 void UpdateReceiveConfig(
1625 size_t stream_index, 1683 size_t stream_index,
1626 VideoReceiveStream::Config* receive_config) override { 1684 VideoReceiveStream::Config* receive_config) override {
1627 receive_config->renderer = observers_[stream_index].get(); 1685 receive_config->renderer = observers_[stream_index].get();
1628 } 1686 }
1629 1687
1630 private: 1688 private:
1631 std::unique_ptr<VideoOutputObserver> observers_[kNumStreams]; 1689 std::unique_ptr<VideoOutputObserver> observers_[kNumStreams];
1632 } tester; 1690 } tester(&task_queue_);
1633 1691
1634 tester.RunTest(); 1692 tester.RunTest();
1635 } 1693 }
1636 1694
1637 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { 1695 TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) {
1638 static const int kExtensionId = 5; 1696 static const int kExtensionId = 5;
1639 1697
1640 class RtpExtensionHeaderObserver : public test::DirectTransport { 1698 class RtpExtensionHeaderObserver : public test::DirectTransport {
1641 public: 1699 public:
1642 RtpExtensionHeaderObserver( 1700 RtpExtensionHeaderObserver(
1701 test::SingleThreadedTaskQueue* task_queue,
1643 Call* sender_call, 1702 Call* sender_call,
1644 const uint32_t& first_media_ssrc, 1703 const uint32_t& first_media_ssrc,
1645 const std::map<uint32_t, uint32_t>& ssrc_map, 1704 const std::map<uint32_t, uint32_t>& ssrc_map,
1646 const std::map<uint8_t, MediaType>& payload_type_map) 1705 const std::map<uint8_t, MediaType>& payload_type_map)
1647 : DirectTransport(sender_call, payload_type_map), 1706 : DirectTransport(task_queue, sender_call, payload_type_map),
1648 done_(false, false), 1707 done_(false, false),
1649 parser_(RtpHeaderParser::Create()), 1708 parser_(RtpHeaderParser::Create()),
1650 first_media_ssrc_(first_media_ssrc), 1709 first_media_ssrc_(first_media_ssrc),
1651 rtx_to_media_ssrcs_(ssrc_map), 1710 rtx_to_media_ssrcs_(ssrc_map),
1652 padding_observed_(false), 1711 padding_observed_(false),
1653 rtx_padding_observed_(false), 1712 rtx_padding_observed_(false),
1654 retransmit_observed_(false), 1713 retransmit_observed_(false),
1655 started_(false) { 1714 started_(false) {
1656 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, 1715 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
1657 kExtensionId); 1716 kExtensionId);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1752 const uint32_t& first_media_ssrc_; 1811 const uint32_t& first_media_ssrc_;
1753 const std::map<uint32_t, uint32_t>& rtx_to_media_ssrcs_; 1812 const std::map<uint32_t, uint32_t>& rtx_to_media_ssrcs_;
1754 bool padding_observed_; 1813 bool padding_observed_;
1755 bool rtx_padding_observed_; 1814 bool rtx_padding_observed_;
1756 bool retransmit_observed_; 1815 bool retransmit_observed_;
1757 bool started_; 1816 bool started_;
1758 }; 1817 };
1759 1818
1760 class TransportSequenceNumberTester : public MultiStreamTest { 1819 class TransportSequenceNumberTester : public MultiStreamTest {
1761 public: 1820 public:
1762 TransportSequenceNumberTester() 1821 explicit TransportSequenceNumberTester(
1763 : first_media_ssrc_(0), observer_(nullptr) {} 1822 test::SingleThreadedTaskQueue* task_queue)
1823 : MultiStreamTest(task_queue),
1824 first_media_ssrc_(0),
1825 observer_(nullptr) {}
1764 virtual ~TransportSequenceNumberTester() {} 1826 virtual ~TransportSequenceNumberTester() {}
1765 1827
1766 protected: 1828 protected:
1767 void Wait() override { 1829 void Wait() override {
1768 RTC_DCHECK(observer_); 1830 RTC_DCHECK(observer_);
1769 EXPECT_TRUE(observer_->Wait()); 1831 EXPECT_TRUE(observer_->Wait());
1770 } 1832 }
1771 1833
1772 void UpdateSendConfig( 1834 void UpdateSendConfig(
1773 size_t stream_index, 1835 size_t stream_index,
(...skipping 26 matching lines...) Expand all
1800 void UpdateReceiveConfig( 1862 void UpdateReceiveConfig(
1801 size_t stream_index, 1863 size_t stream_index,
1802 VideoReceiveStream::Config* receive_config) override { 1864 VideoReceiveStream::Config* receive_config) override {
1803 receive_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 1865 receive_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
1804 receive_config->rtp.extensions.clear(); 1866 receive_config->rtp.extensions.clear();
1805 receive_config->rtp.extensions.push_back(RtpExtension( 1867 receive_config->rtp.extensions.push_back(RtpExtension(
1806 RtpExtension::kTransportSequenceNumberUri, kExtensionId)); 1868 RtpExtension::kTransportSequenceNumberUri, kExtensionId));
1807 receive_config->renderer = &fake_renderer_; 1869 receive_config->renderer = &fake_renderer_;
1808 } 1870 }
1809 1871
1810 test::DirectTransport* CreateSendTransport(Call* sender_call) override { 1872 test::DirectTransport* CreateSendTransport(
1873 test::SingleThreadedTaskQueue* task_queue,
1874 Call* sender_call) override {
1811 std::map<uint8_t, MediaType> payload_type_map = 1875 std::map<uint8_t, MediaType> payload_type_map =
1812 MultiStreamTest::payload_type_map_; 1876 MultiStreamTest::payload_type_map_;
1813 RTC_DCHECK(payload_type_map.find(kSendRtxPayloadType) == 1877 RTC_DCHECK(payload_type_map.find(kSendRtxPayloadType) ==
1814 payload_type_map.end()); 1878 payload_type_map.end());
1815 payload_type_map[kSendRtxPayloadType] = MediaType::VIDEO; 1879 payload_type_map[kSendRtxPayloadType] = MediaType::VIDEO;
1816 observer_ = 1880 observer_ = new RtpExtensionHeaderObserver(
1817 new RtpExtensionHeaderObserver(sender_call, first_media_ssrc_, 1881 task_queue, sender_call, first_media_ssrc_, rtx_to_media_ssrcs_,
1818 rtx_to_media_ssrcs_, payload_type_map); 1882 payload_type_map);
1819 return observer_; 1883 return observer_;
1820 } 1884 }
1821 1885
1822 private: 1886 private:
1823 test::FakeVideoRenderer fake_renderer_; 1887 test::FakeVideoRenderer fake_renderer_;
1824 uint32_t first_media_ssrc_; 1888 uint32_t first_media_ssrc_;
1825 std::map<uint32_t, uint32_t> rtx_to_media_ssrcs_; 1889 std::map<uint32_t, uint32_t> rtx_to_media_ssrcs_;
1826 RtpExtensionHeaderObserver* observer_; 1890 RtpExtensionHeaderObserver* observer_;
1827 } tester; 1891 } tester(&task_queue_);
1828 1892
1829 tester.RunTest(); 1893 tester.RunTest();
1830 } 1894 }
1831 1895
1832 class TransportFeedbackTester : public test::EndToEndTest { 1896 class TransportFeedbackTester : public test::EndToEndTest {
1833 public: 1897 public:
1834 TransportFeedbackTester(bool feedback_enabled, 1898 TransportFeedbackTester(bool feedback_enabled,
1835 size_t num_video_streams, 1899 size_t num_video_streams,
1836 size_t num_audio_streams) 1900 size_t num_audio_streams)
1837 : EndToEndTest(::webrtc::EndToEndTest::kDefaultTimeoutMs), 1901 : EndToEndTest(::webrtc::EndToEndTest::kDefaultTimeoutMs),
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
2030 2094
2031 private: 2095 private:
2032 std::unique_ptr<uint8_t[]> buffer_; 2096 std::unique_ptr<uint8_t[]> buffer_;
2033 size_t length_; 2097 size_t length_;
2034 FrameType frame_type_; 2098 FrameType frame_type_;
2035 rtc::Event called_; 2099 rtc::Event called_;
2036 }; 2100 };
2037 2101
2038 EncodedFrameTestObserver post_encode_observer; 2102 EncodedFrameTestObserver post_encode_observer;
2039 EncodedFrameTestObserver pre_decode_observer; 2103 EncodedFrameTestObserver pre_decode_observer;
2104 test::FrameForwarder forwarder;
2105 std::unique_ptr<test::FrameGenerator> frame_generator;
2040 2106
2041 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get())); 2107 std::unique_ptr<test::DirectTransport> sender_transport;
2108 std::unique_ptr<test::DirectTransport> receiver_transport;
2042 2109
2043 test::DirectTransport sender_transport(sender_call_.get(), payload_type_map_); 2110 task_queue_.SendTask([&]() {
2044 test::DirectTransport receiver_transport(receiver_call_.get(), 2111 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
2045 payload_type_map_);
2046 sender_transport.SetReceiver(receiver_call_->Receiver());
2047 receiver_transport.SetReceiver(sender_call_->Receiver());
2048 2112
2049 CreateSendConfig(1, 0, 0, &sender_transport); 2113 sender_transport = rtc::MakeUnique<test::DirectTransport>(
2050 CreateMatchingReceiveConfigs(&receiver_transport); 2114 &task_queue_, sender_call_.get(), payload_type_map_);
2051 video_send_config_.post_encode_callback = &post_encode_observer; 2115 receiver_transport = rtc::MakeUnique<test::DirectTransport>(
2052 video_receive_configs_[0].pre_decode_callback = &pre_decode_observer; 2116 &task_queue_, receiver_call_.get(), payload_type_map_);
2117 sender_transport->SetReceiver(receiver_call_->Receiver());
2118 receiver_transport->SetReceiver(sender_call_->Receiver());
2053 2119
2054 CreateVideoStreams(); 2120 CreateSendConfig(1, 0, 0, sender_transport.get());
2055 Start(); 2121 CreateMatchingReceiveConfigs(receiver_transport.get());
2122 video_send_config_.post_encode_callback = &post_encode_observer;
2123 video_receive_configs_[0].pre_decode_callback = &pre_decode_observer;
2056 2124
2057 std::unique_ptr<test::FrameGenerator> frame_generator( 2125 CreateVideoStreams();
2058 test::FrameGenerator::CreateSquareGenerator(kDefaultWidth, 2126 Start();
2059 kDefaultHeight)); 2127
2060 test::FrameForwarder forwarder; 2128 frame_generator = test::FrameGenerator::CreateSquareGenerator(
2061 video_send_stream_->SetSource( 2129 kDefaultWidth, kDefaultHeight);
2062 &forwarder, VideoSendStream::DegradationPreference::kMaintainFramerate); 2130 video_send_stream_->SetSource(
2063 forwarder.IncomingCapturedFrame(*frame_generator->NextFrame()); 2131 &forwarder, VideoSendStream::DegradationPreference::kMaintainFramerate);
2132 forwarder.IncomingCapturedFrame(*frame_generator->NextFrame());
2133 });
2064 2134
2065 EXPECT_TRUE(post_encode_observer.Wait()) 2135 EXPECT_TRUE(post_encode_observer.Wait())
2066 << "Timed out while waiting for send-side encoded-frame callback."; 2136 << "Timed out while waiting for send-side encoded-frame callback.";
2067 2137
2068 EXPECT_TRUE(pre_decode_observer.Wait()) 2138 EXPECT_TRUE(pre_decode_observer.Wait())
2069 << "Timed out while waiting for pre-decode encoded-frame callback."; 2139 << "Timed out while waiting for pre-decode encoded-frame callback.";
2070 2140
2071 post_encode_observer.ExpectEqualFrames(pre_decode_observer); 2141 post_encode_observer.ExpectEqualFrames(pre_decode_observer);
2072 2142
2073 Stop(); 2143 task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
2074 2144 Stop();
2075 sender_transport.StopSending(); 2145 DestroyStreams();
2076 receiver_transport.StopSending(); 2146 sender_transport.reset();
2077 2147 receiver_transport.reset();
2078 DestroyStreams(); 2148 DestroyCalls();
2149 });
2079 } 2150 }
2080 2151
2081 TEST_F(EndToEndTest, ReceiveStreamSendsRemb) { 2152 TEST_F(EndToEndTest, ReceiveStreamSendsRemb) {
2082 class RembObserver : public test::EndToEndTest { 2153 class RembObserver : public test::EndToEndTest {
2083 public: 2154 public:
2084 RembObserver() : EndToEndTest(kDefaultTimeoutMs) {} 2155 RembObserver() : EndToEndTest(kDefaultTimeoutMs) {}
2085 2156
2086 void ModifyVideoConfigs( 2157 void ModifyVideoConfigs(
2087 VideoSendStream::Config* send_config, 2158 VideoSendStream::Config* send_config,
2088 std::vector<VideoReceiveStream::Config>* receive_configs, 2159 std::vector<VideoReceiveStream::Config>* receive_configs,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2196 receive_transport_(nullptr), 2267 receive_transport_(nullptr),
2197 stop_event_(false, false), 2268 stop_event_(false, false),
2198 poller_thread_(&BitrateStatsPollingThread, 2269 poller_thread_(&BitrateStatsPollingThread,
2199 this, 2270 this,
2200 "BitrateStatsPollingThread"), 2271 "BitrateStatsPollingThread"),
2201 state_(kWaitForFirstRampUp), 2272 state_(kWaitForFirstRampUp),
2202 retransmission_rate_limiter_(clock_, 1000) {} 2273 retransmission_rate_limiter_(clock_, 1000) {}
2203 2274
2204 ~BweObserver() {} 2275 ~BweObserver() {}
2205 2276
2206 test::PacketTransport* CreateReceiveTransport() override { 2277 test::PacketTransport* CreateReceiveTransport(
2278 test::SingleThreadedTaskQueue* task_queue) override {
2207 receive_transport_ = new test::PacketTransport( 2279 receive_transport_ = new test::PacketTransport(
2208 nullptr, this, test::PacketTransport::kReceiver, payload_type_map_, 2280 task_queue, nullptr, this, test::PacketTransport::kReceiver,
2209 FakeNetworkPipe::Config()); 2281 payload_type_map_, FakeNetworkPipe::Config());
2210 return receive_transport_; 2282 return receive_transport_;
2211 } 2283 }
2212 2284
2213 Call::Config GetSenderCallConfig() override { 2285 Call::Config GetSenderCallConfig() override {
2214 Call::Config config(event_log_.get()); 2286 Call::Config config(event_log_.get());
2215 // Set a high start bitrate to reduce the test completion time. 2287 // Set a high start bitrate to reduce the test completion time.
2216 config.bitrate_config.start_bitrate_bps = remb_bitrate_bps_; 2288 config.bitrate_config.start_bitrate_bps = remb_bitrate_bps_;
2217 return config; 2289 return config;
2218 } 2290 }
2219 2291
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
2306 TestState state_; 2378 TestState state_;
2307 RateLimiter retransmission_rate_limiter_; 2379 RateLimiter retransmission_rate_limiter_;
2308 } test; 2380 } test;
2309 2381
2310 RunBaseTest(&test); 2382 RunBaseTest(&test);
2311 } 2383 }
2312 2384
2313 TEST_F(EndToEndTest, StopSendingKeyframeRequestsForInactiveStream) { 2385 TEST_F(EndToEndTest, StopSendingKeyframeRequestsForInactiveStream) {
2314 class KeyframeRequestObserver : public test::EndToEndTest { 2386 class KeyframeRequestObserver : public test::EndToEndTest {
2315 public: 2387 public:
2316 KeyframeRequestObserver() : clock_(Clock::GetRealTimeClock()) {} 2388 explicit KeyframeRequestObserver(test::SingleThreadedTaskQueue* task_queue)
2389 : clock_(Clock::GetRealTimeClock()), task_queue_(task_queue) {}
2317 2390
2318 void OnVideoStreamsCreated( 2391 void OnVideoStreamsCreated(
2319 VideoSendStream* send_stream, 2392 VideoSendStream* send_stream,
2320 const std::vector<VideoReceiveStream*>& receive_streams) override { 2393 const std::vector<VideoReceiveStream*>& receive_streams) override {
2321 RTC_DCHECK_EQ(1, receive_streams.size()); 2394 RTC_DCHECK_EQ(1, receive_streams.size());
2322 send_stream_ = send_stream; 2395 send_stream_ = send_stream;
2323 receive_stream_ = receive_streams[0]; 2396 receive_stream_ = receive_streams[0];
2324 } 2397 }
2325 2398
2326 void PerformTest() override { 2399 void PerformTest() override {
2327 bool frame_decoded = false; 2400 bool frame_decoded = false;
2328 int64_t start_time = clock_->TimeInMilliseconds(); 2401 int64_t start_time = clock_->TimeInMilliseconds();
2329 while (clock_->TimeInMilliseconds() - start_time <= 5000) { 2402 while (clock_->TimeInMilliseconds() - start_time <= 5000) {
2330 if (receive_stream_->GetStats().frames_decoded > 0) { 2403 if (receive_stream_->GetStats().frames_decoded > 0) {
2331 frame_decoded = true; 2404 frame_decoded = true;
2332 break; 2405 break;
2333 } 2406 }
2334 SleepMs(100); 2407 SleepMs(100);
2335 } 2408 }
2336 ASSERT_TRUE(frame_decoded); 2409 ASSERT_TRUE(frame_decoded);
2337 send_stream_->Stop(); 2410 task_queue_->SendTask([this]() { send_stream_->Stop(); });
2338 SleepMs(10000); 2411 SleepMs(10000);
2339 ASSERT_EQ( 2412 ASSERT_EQ(
2340 1U, receive_stream_->GetStats().rtcp_packet_type_counts.pli_packets); 2413 1U, receive_stream_->GetStats().rtcp_packet_type_counts.pli_packets);
2341 } 2414 }
2342 2415
2343 private: 2416 private:
2344 Clock* clock_; 2417 Clock* clock_;
2345 VideoSendStream* send_stream_; 2418 VideoSendStream* send_stream_;
2346 VideoReceiveStream* receive_stream_; 2419 VideoReceiveStream* receive_stream_;
2347 } test; 2420 test::SingleThreadedTaskQueue* const task_queue_;
2421 } test(&task_queue_);
2348 2422
2349 RunBaseTest(&test); 2423 RunBaseTest(&test);
2350 } 2424 }
2351 2425
2352 class ProbingTest : public test::EndToEndTest { 2426 class ProbingTest : public test::EndToEndTest {
2353 public: 2427 public:
2354 explicit ProbingTest(int start_bitrate_bps) 2428 explicit ProbingTest(int start_bitrate_bps)
2355 : clock_(Clock::GetRealTimeClock()), 2429 : clock_(Clock::GetRealTimeClock()),
2356 start_bitrate_bps_(start_bitrate_bps), 2430 start_bitrate_bps_(start_bitrate_bps),
2357 state_(0), 2431 state_(0),
(...skipping 11 matching lines...) Expand all
2369 sender_call_ = sender_call; 2443 sender_call_ = sender_call;
2370 } 2444 }
2371 2445
2372 protected: 2446 protected:
2373 Clock* const clock_; 2447 Clock* const clock_;
2374 const int start_bitrate_bps_; 2448 const int start_bitrate_bps_;
2375 int state_; 2449 int state_;
2376 Call* sender_call_; 2450 Call* sender_call_;
2377 }; 2451 };
2378 2452
2379 TEST_F(EndToEndTest, MAYBE_InitialProbing) { 2453 TEST_F(EndToEndTest, InitialProbing) {
2380 class InitialProbingTest : public ProbingTest { 2454 class InitialProbingTest : public ProbingTest {
2381 public: 2455 public:
2382 explicit InitialProbingTest(bool* success) 2456 explicit InitialProbingTest(bool* success)
2383 : ProbingTest(300000), success_(success) { 2457 : ProbingTest(300000), success_(success) {
2384 *success_ = false; 2458 *success_ = false;
2385 } 2459 }
2386 2460
2387 void PerformTest() override { 2461 void PerformTest() override {
2388 int64_t start_time_ms = clock_->TimeInMilliseconds(); 2462 int64_t start_time_ms = clock_->TimeInMilliseconds();
2389 do { 2463 do {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2422 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) { 2496 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) {
2423 // Fails on iOS bots: bugs.webrtc.org/7851 2497 // Fails on iOS bots: bugs.webrtc.org/7851
2424 #elif defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR 2498 #elif defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
2425 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) { 2499 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) {
2426 #else 2500 #else
2427 TEST_F(EndToEndTest, TriggerMidCallProbing) { 2501 TEST_F(EndToEndTest, TriggerMidCallProbing) {
2428 #endif 2502 #endif
2429 2503
2430 class TriggerMidCallProbingTest : public ProbingTest { 2504 class TriggerMidCallProbingTest : public ProbingTest {
2431 public: 2505 public:
2432 explicit TriggerMidCallProbingTest(bool* success) 2506 TriggerMidCallProbingTest(bool* success,
2433 : ProbingTest(300000), success_(success) {} 2507 test::SingleThreadedTaskQueue* task_queue)
2508 : ProbingTest(300000), success_(success), task_queue_(task_queue) {}
2434 2509
2435 void PerformTest() override { 2510 void PerformTest() override {
2436 *success_ = false; 2511 *success_ = false;
2437 int64_t start_time_ms = clock_->TimeInMilliseconds(); 2512 int64_t start_time_ms = clock_->TimeInMilliseconds();
2438 do { 2513 do {
2439 if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs) 2514 if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs)
2440 break; 2515 break;
2441 2516
2442 Call::Stats stats = sender_call_->GetStats(); 2517 Call::Stats stats = sender_call_->GetStats();
2443 2518
2444 switch (state_) { 2519 switch (state_) {
2445 case 0: 2520 case 0:
2446 if (stats.send_bandwidth_bps > 5 * 300000) { 2521 if (stats.send_bandwidth_bps > 5 * 300000) {
2447 Call::Config::BitrateConfig bitrate_config; 2522 Call::Config::BitrateConfig bitrate_config;
2448 bitrate_config.max_bitrate_bps = 100000; 2523 bitrate_config.max_bitrate_bps = 100000;
2449 sender_call_->SetBitrateConfig(bitrate_config); 2524 task_queue_->SendTask([this, &bitrate_config]() {
2525 sender_call_->SetBitrateConfig(bitrate_config);
2526 });
2450 ++state_; 2527 ++state_;
2451 } 2528 }
2452 break; 2529 break;
2453 case 1: 2530 case 1:
2454 if (stats.send_bandwidth_bps < 110000) { 2531 if (stats.send_bandwidth_bps < 110000) {
2455 Call::Config::BitrateConfig bitrate_config; 2532 Call::Config::BitrateConfig bitrate_config;
2456 bitrate_config.max_bitrate_bps = 2500000; 2533 bitrate_config.max_bitrate_bps = 2500000;
2457 sender_call_->SetBitrateConfig(bitrate_config); 2534 task_queue_->SendTask([this, &bitrate_config]() {
2535 sender_call_->SetBitrateConfig(bitrate_config);
2536 });
2458 ++state_; 2537 ++state_;
2459 } 2538 }
2460 break; 2539 break;
2461 case 2: 2540 case 2:
2462 // During high cpu load the pacer will not be able to pace packets 2541 // During high cpu load the pacer will not be able to pace packets
2463 // at the correct speed, but if we go from 110 to 1250 kbps 2542 // at the correct speed, but if we go from 110 to 1250 kbps
2464 // in 5 seconds then it is due to probing. 2543 // in 5 seconds then it is due to probing.
2465 if (stats.send_bandwidth_bps > 1250000) { 2544 if (stats.send_bandwidth_bps > 1250000) {
2466 *success_ = true; 2545 *success_ = true;
2467 observation_complete_.Set(); 2546 observation_complete_.Set();
2468 } 2547 }
2469 break; 2548 break;
2470 } 2549 }
2471 } while (!observation_complete_.Wait(20)); 2550 } while (!observation_complete_.Wait(20));
2472 } 2551 }
2473 2552
2474 private: 2553 private:
2475 const int kTimeoutMs = 5000; 2554 const int kTimeoutMs = 5000;
2476 bool* const success_; 2555 bool* const success_;
2556 test::SingleThreadedTaskQueue* const task_queue_;
2477 }; 2557 };
2478 2558
2479 bool success = false; 2559 bool success = false;
2480 const int kMaxAttempts = 3; 2560 const int kMaxAttempts = 3;
2481 for (int i = 0; i < kMaxAttempts; ++i) { 2561 for (int i = 0; i < kMaxAttempts; ++i) {
2482 TriggerMidCallProbingTest test(&success); 2562 TriggerMidCallProbingTest test(&success, &task_queue_);
2483 RunBaseTest(&test); 2563 RunBaseTest(&test);
2484 if (success) 2564 if (success)
2485 return; 2565 return;
2486 } 2566 }
2487 EXPECT_TRUE(success) << "Failed to perform mid call probing (" << kMaxAttempts 2567 EXPECT_TRUE(success) << "Failed to perform mid call probing (" << kMaxAttempts
2488 << " attempts)."; 2568 << " attempts).";
2489 } 2569 }
2490 2570
2491 TEST_F(EndToEndTest, VerifyNackStats) { 2571 TEST_F(EndToEndTest, VerifyNackStats) {
2492 static const int kPacketNumberToDrop = 200; 2572 static const int kPacketNumberToDrop = 200;
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
2704 const std::unique_ptr<VideoEncoder> vp8_encoder_; 2784 const std::unique_ptr<VideoEncoder> vp8_encoder_;
2705 Call* sender_call_; 2785 Call* sender_call_;
2706 Call* receiver_call_; 2786 Call* receiver_call_;
2707 int64_t start_runtime_ms_; 2787 int64_t start_runtime_ms_;
2708 int num_frames_received_ GUARDED_BY(&crit_); 2788 int num_frames_received_ GUARDED_BY(&crit_);
2709 } test(use_rtx, use_red, screenshare); 2789 } test(use_rtx, use_red, screenshare);
2710 2790
2711 metrics::Reset(); 2791 metrics::Reset();
2712 RunBaseTest(&test); 2792 RunBaseTest(&test);
2713 2793
2714 // Delete the call for Call stats to be reported.
2715 sender_call_.reset();
2716 receiver_call_.reset();
2717
2718 std::string video_prefix = 2794 std::string video_prefix =
2719 screenshare ? "WebRTC.Video.Screenshare." : "WebRTC.Video."; 2795 screenshare ? "WebRTC.Video.Screenshare." : "WebRTC.Video.";
2720 2796
2721 // Verify that stats have been updated once. 2797 // Verify that stats have been updated once.
2722 EXPECT_EQ(2, metrics::NumSamples("WebRTC.Call.LifetimeInSeconds")); 2798 EXPECT_EQ(2, metrics::NumSamples("WebRTC.Call.LifetimeInSeconds"));
2723 EXPECT_EQ(1, metrics::NumSamples( 2799 EXPECT_EQ(1, metrics::NumSamples(
2724 "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds")); 2800 "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds"));
2725 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.VideoBitrateReceivedInKbps")); 2801 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.VideoBitrateReceivedInKbps"));
2726 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.RtcpBitrateReceivedInBps")); 2802 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.RtcpBitrateReceivedInBps"));
2727 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.BitrateReceivedInKbps")); 2803 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.BitrateReceivedInKbps"));
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 2950
2875 rtc::CriticalSection crit_; 2951 rtc::CriticalSection crit_;
2876 int num_frames_received_ GUARDED_BY(&crit_); 2952 int num_frames_received_ GUARDED_BY(&crit_);
2877 } test; 2953 } test;
2878 2954
2879 test::ScopedFieldTrials override_field_trials( 2955 test::ScopedFieldTrials override_field_trials(
2880 "WebRTC-VideoContentTypeExtension/Enabled/"); 2956 "WebRTC-VideoContentTypeExtension/Enabled/");
2881 metrics::Reset(); 2957 metrics::Reset();
2882 2958
2883 Call::Config send_config(test.GetSenderCallConfig()); 2959 Call::Config send_config(test.GetSenderCallConfig());
2884 CreateSenderCall(send_config);
2885 Call::Config recv_config(test.GetReceiverCallConfig()); 2960 Call::Config recv_config(test.GetReceiverCallConfig());
2886 CreateReceiverCall(recv_config); 2961 VideoEncoderConfig encoder_config_with_screenshare;
2887 receive_transport_.reset(test.CreateReceiveTransport());
2888 send_transport_.reset(test.CreateSendTransport(sender_call_.get()));
2889 send_transport_->SetReceiver(receiver_call_->Receiver());
2890 receive_transport_->SetReceiver(sender_call_->Receiver());
2891 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
2892 CreateSendConfig(1, 0, 0, send_transport_.get());
2893 CreateMatchingReceiveConfigs(receive_transport_.get());
2894 2962
2895 // Modify send and receive configs. 2963 task_queue_.SendTask([this, &test, &override_field_trials, &send_config,
2896 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 2964 &recv_config, &encoder_config_with_screenshare]() {
2897 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 2965 CreateSenderCall(send_config);
2898 video_receive_configs_[0].renderer = &test; 2966 CreateReceiverCall(recv_config);
2899 // RTT needed for RemoteNtpTimeEstimator for the receive stream.
2900 video_receive_configs_[0].rtp.rtcp_xr.receiver_reference_time_report = true;
2901 // Start with realtime video.
2902 video_encoder_config_.content_type =
2903 VideoEncoderConfig::ContentType::kRealtimeVideo;
2904 // Second encoder config for the second part of the test uses screenshare
2905 VideoEncoderConfig encoder_config_with_screenshare_ =
2906 video_encoder_config_.Copy();
2907 encoder_config_with_screenshare_.content_type =
2908 VideoEncoderConfig::ContentType::kScreen;
2909 2967
2910 CreateVideoStreams(); 2968 receive_transport_.reset(test.CreateReceiveTransport(&task_queue_));
2911 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, 2969 send_transport_.reset(
2912 kDefaultHeight); 2970 test.CreateSendTransport(&task_queue_, sender_call_.get()));
2913 Start(); 2971 send_transport_->SetReceiver(receiver_call_->Receiver());
2972 receive_transport_->SetReceiver(sender_call_->Receiver());
2973
2974 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
2975 CreateSendConfig(1, 0, 0, send_transport_.get());
2976 CreateMatchingReceiveConfigs(receive_transport_.get());
2977
2978 // Modify send and receive configs.
2979 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
2980 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
2981 video_receive_configs_[0].renderer = &test;
2982 // RTT needed for RemoteNtpTimeEstimator for the receive stream.
2983 video_receive_configs_[0].rtp.rtcp_xr.receiver_reference_time_report = true;
2984 // Start with realtime video.
2985 video_encoder_config_.content_type =
2986 VideoEncoderConfig::ContentType::kRealtimeVideo;
2987 // Second encoder config for the second part of the test uses screenshare
2988 encoder_config_with_screenshare = video_encoder_config_.Copy();
2989 encoder_config_with_screenshare.content_type =
2990 VideoEncoderConfig::ContentType::kScreen;
2991
2992 CreateVideoStreams();
2993 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
2994 kDefaultHeight);
2995 Start();
2996 });
2914 2997
2915 test.PerformTest(); 2998 test.PerformTest();
2916 2999
2917 // Replace old send stream. 3000 // Replace old send stream.
2918 sender_call_->DestroyVideoSendStream(video_send_stream_); 3001 task_queue_.SendTask([this, &encoder_config_with_screenshare]() {
2919 video_send_stream_ = sender_call_->CreateVideoSendStream( 3002 sender_call_->DestroyVideoSendStream(video_send_stream_);
2920 video_send_config_.Copy(), encoder_config_with_screenshare_.Copy()); 3003 video_send_stream_ = sender_call_->CreateVideoSendStream(
2921 video_send_stream_->SetSource( 3004 video_send_config_.Copy(), encoder_config_with_screenshare.Copy());
2922 frame_generator_capturer_.get(), 3005 video_send_stream_->SetSource(
2923 VideoSendStream::DegradationPreference::kBalanced); 3006 frame_generator_capturer_.get(),
2924 video_send_stream_->Start(); 3007 VideoSendStream::DegradationPreference::kBalanced);
3008 video_send_stream_->Start();
3009 });
2925 3010
2926 // Continue to run test but now with screenshare. 3011 // Continue to run test but now with screenshare.
2927 test.PerformTest(); 3012 test.PerformTest();
2928 3013
2929 send_transport_->StopSending(); 3014 task_queue_.SendTask([this]() {
2930 receive_transport_->StopSending(); 3015 Stop();
2931 Stop(); 3016 DestroyStreams();
2932 DestroyStreams(); 3017 send_transport_.reset();
2933 DestroyCalls(); 3018 receive_transport_.reset();
2934 // Delete the call for Call stats to be reported. 3019 DestroyCalls();
2935 sender_call_.reset(); 3020 });
2936 receiver_call_.reset();
2937 3021
2938 // Verify that stats have been updated for both screenshare and video. 3022 // Verify that stats have been updated for both screenshare and video.
2939 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayInMs")); 3023 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayInMs"));
2940 EXPECT_EQ(1, 3024 EXPECT_EQ(1,
2941 metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayInMs")); 3025 metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayInMs"));
2942 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayMaxInMs")); 3026 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayMaxInMs"));
2943 EXPECT_EQ( 3027 EXPECT_EQ(
2944 1, metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayMaxInMs")); 3028 1, metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayMaxInMs"));
2945 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs")); 3029 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs"));
2946 EXPECT_EQ(1, 3030 EXPECT_EQ(1,
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
3090 VideoEncoderConfig video_encoder_config_all_streams_; 3174 VideoEncoderConfig video_encoder_config_all_streams_;
3091 } test(kVideoSendSsrcs, num_ssrcs, send_single_ssrc_first); 3175 } test(kVideoSendSsrcs, num_ssrcs, send_single_ssrc_first);
3092 3176
3093 RunBaseTest(&test); 3177 RunBaseTest(&test);
3094 } 3178 }
3095 3179
3096 TEST_F(EndToEndTest, ReportsSetEncoderRates) { 3180 TEST_F(EndToEndTest, ReportsSetEncoderRates) {
3097 class EncoderRateStatsTest : public test::EndToEndTest, 3181 class EncoderRateStatsTest : public test::EndToEndTest,
3098 public test::FakeEncoder { 3182 public test::FakeEncoder {
3099 public: 3183 public:
3100 EncoderRateStatsTest() 3184 explicit EncoderRateStatsTest(test::SingleThreadedTaskQueue* task_queue)
3101 : EndToEndTest(kDefaultTimeoutMs), 3185 : EndToEndTest(kDefaultTimeoutMs),
3102 FakeEncoder(Clock::GetRealTimeClock()), 3186 FakeEncoder(Clock::GetRealTimeClock()),
3187 task_queue_(task_queue),
3103 send_stream_(nullptr), 3188 send_stream_(nullptr),
3104 bitrate_kbps_(0) {} 3189 bitrate_kbps_(0) {}
3105 3190
3106 void OnVideoStreamsCreated( 3191 void OnVideoStreamsCreated(
3107 VideoSendStream* send_stream, 3192 VideoSendStream* send_stream,
3108 const std::vector<VideoReceiveStream*>& receive_streams) override { 3193 const std::vector<VideoReceiveStream*>& receive_streams) override {
3109 send_stream_ = send_stream; 3194 send_stream_ = send_stream;
3110 } 3195 }
3111 3196
3112 void ModifyVideoConfigs( 3197 void ModifyVideoConfigs(
(...skipping 11 matching lines...) Expand all
3124 return 0; 3209 return 0;
3125 rtc::CritScope lock(&crit_); 3210 rtc::CritScope lock(&crit_);
3126 bitrate_kbps_ = rate_allocation.get_sum_kbps(); 3211 bitrate_kbps_ = rate_allocation.get_sum_kbps();
3127 observation_complete_.Set(); 3212 observation_complete_.Set();
3128 return 0; 3213 return 0;
3129 } 3214 }
3130 3215
3131 void PerformTest() override { 3216 void PerformTest() override {
3132 ASSERT_TRUE(Wait()) 3217 ASSERT_TRUE(Wait())
3133 << "Timed out while waiting for encoder SetRates() call."; 3218 << "Timed out while waiting for encoder SetRates() call.";
3134 WaitForEncoderTargetBitrateMatchStats(); 3219
3135 send_stream_->Stop(); 3220 task_queue_->SendTask([this]() {
3136 WaitForStatsReportZeroTargetBitrate(); 3221 WaitForEncoderTargetBitrateMatchStats();
3137 send_stream_->Start(); 3222 send_stream_->Stop();
3138 WaitForEncoderTargetBitrateMatchStats(); 3223 WaitForStatsReportZeroTargetBitrate();
3224 send_stream_->Start();
3225 WaitForEncoderTargetBitrateMatchStats();
3226 });
3139 } 3227 }
3140 3228
3141 void WaitForEncoderTargetBitrateMatchStats() { 3229 void WaitForEncoderTargetBitrateMatchStats() {
3142 for (int i = 0; i < kDefaultTimeoutMs; ++i) { 3230 for (int i = 0; i < kDefaultTimeoutMs; ++i) {
3143 VideoSendStream::Stats stats = send_stream_->GetStats(); 3231 VideoSendStream::Stats stats = send_stream_->GetStats();
3144 { 3232 {
3145 rtc::CritScope lock(&crit_); 3233 rtc::CritScope lock(&crit_);
3146 if ((stats.target_media_bitrate_bps + 500) / 1000 == 3234 if ((stats.target_media_bitrate_bps + 500) / 1000 ==
3147 static_cast<int>(bitrate_kbps_)) { 3235 static_cast<int>(bitrate_kbps_)) {
3148 return; 3236 return;
3149 } 3237 }
3150 } 3238 }
3151 SleepMs(1); 3239 SleepMs(1);
3152 } 3240 }
3153 FAIL() 3241 FAIL()
3154 << "Timed out waiting for stats reporting the currently set bitrate."; 3242 << "Timed out waiting for stats reporting the currently set bitrate.";
3155 } 3243 }
3156 3244
3157 void WaitForStatsReportZeroTargetBitrate() { 3245 void WaitForStatsReportZeroTargetBitrate() {
3158 for (int i = 0; i < kDefaultTimeoutMs; ++i) { 3246 for (int i = 0; i < kDefaultTimeoutMs; ++i) {
3159 if (send_stream_->GetStats().target_media_bitrate_bps == 0) { 3247 if (send_stream_->GetStats().target_media_bitrate_bps == 0) {
3160 return; 3248 return;
3161 } 3249 }
3162 SleepMs(1); 3250 SleepMs(1);
3163 } 3251 }
3164 FAIL() << "Timed out waiting for stats reporting zero bitrate."; 3252 FAIL() << "Timed out waiting for stats reporting zero bitrate.";
3165 } 3253 }
3166 3254
3167 private: 3255 private:
3256 test::SingleThreadedTaskQueue* const task_queue_;
3168 rtc::CriticalSection crit_; 3257 rtc::CriticalSection crit_;
3169 VideoSendStream* send_stream_; 3258 VideoSendStream* send_stream_;
3170 uint32_t bitrate_kbps_ GUARDED_BY(crit_); 3259 uint32_t bitrate_kbps_ GUARDED_BY(crit_);
3171 } test; 3260 } test(&task_queue_);
3172 3261
3173 RunBaseTest(&test); 3262 RunBaseTest(&test);
3174 } 3263 }
3175 3264
3176 TEST_F(EndToEndTest, GetStats) { 3265 TEST_F(EndToEndTest, DISABLED_GetStats) { // TODO(eladalon): !!! Renable.
3177 static const int kStartBitrateBps = 3000000; 3266 static const int kStartBitrateBps = 3000000;
3178 static const int kExpectedRenderDelayMs = 20; 3267 static const int kExpectedRenderDelayMs = 20;
3179 3268
3180 class ReceiveStreamRenderer : public rtc::VideoSinkInterface<VideoFrame> { 3269 class ReceiveStreamRenderer : public rtc::VideoSinkInterface<VideoFrame> {
3181 public: 3270 public:
3182 ReceiveStreamRenderer() {} 3271 ReceiveStreamRenderer() {}
3183 3272
3184 private: 3273 private:
3185 void OnFrame(const VideoFrame& video_frame) override {} 3274 void OnFrame(const VideoFrame& video_frame) override {}
3186 }; 3275 };
3187 3276
3188 class StatsObserver : public test::EndToEndTest, 3277 class StatsObserver : public test::EndToEndTest,
3189 public rtc::VideoSinkInterface<VideoFrame> { 3278 public rtc::VideoSinkInterface<VideoFrame> {
3190 public: 3279 public:
3191 StatsObserver() 3280 explicit StatsObserver(test::SingleThreadedTaskQueue* task_queue)
3192 : EndToEndTest(kLongTimeoutMs), 3281 : EndToEndTest(kLongTimeoutMs),
3282 task_queue_(task_queue),
3193 encoder_(Clock::GetRealTimeClock(), 10), 3283 encoder_(Clock::GetRealTimeClock(), 10),
3194 send_stream_(nullptr), 3284 send_stream_(nullptr),
3195 expected_send_ssrcs_(), 3285 expected_send_ssrcs_(),
3196 check_stats_event_(false, false) {} 3286 check_stats_event_(false, false) {}
3197 3287
3198 private: 3288 private:
3199 Action OnSendRtp(const uint8_t* packet, size_t length) override { 3289 Action OnSendRtp(const uint8_t* packet, size_t length) override {
3200 // Drop every 25th packet => 4% loss. 3290 // Drop every 25th packet => 4% loss.
3201 static const int kPacketLossFrac = 25; 3291 static const int kPacketLossFrac = 25;
3202 RTPHeader header; 3292 RTPHeader header;
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
3368 } 3458 }
3369 3459
3370 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) { 3460 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) {
3371 for (const auto& stat : stats_map) { 3461 for (const auto& stat : stats_map) {
3372 if (!stat.second) 3462 if (!stat.second)
3373 return false; 3463 return false;
3374 } 3464 }
3375 return true; 3465 return true;
3376 } 3466 }
3377 3467
3378 test::PacketTransport* CreateSendTransport(Call* sender_call) override { 3468 test::PacketTransport* CreateSendTransport(
3469 test::SingleThreadedTaskQueue* task_queue,
3470 Call* sender_call) override {
3379 FakeNetworkPipe::Config network_config; 3471 FakeNetworkPipe::Config network_config;
3380 network_config.loss_percent = 5; 3472 network_config.loss_percent = 5;
3381 return new test::PacketTransport(sender_call, this, 3473 return new test::PacketTransport(task_queue, sender_call, this,
3382 test::PacketTransport::kSender, 3474 test::PacketTransport::kSender,
3383 payload_type_map_, network_config); 3475 payload_type_map_, network_config);
3384 } 3476 }
3385 3477
3386 Call::Config GetSenderCallConfig() override { 3478 Call::Config GetSenderCallConfig() override {
3387 Call::Config config = EndToEndTest::GetSenderCallConfig(); 3479 Call::Config config = EndToEndTest::GetSenderCallConfig();
3388 config.bitrate_config.start_bitrate_bps = kStartBitrateBps; 3480 config.bitrate_config.start_bitrate_bps = kStartBitrateBps;
3389 return config; 3481 return config;
3390 } 3482 }
3391 3483
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
3452 size_t GetNumVideoStreams() const override { return kNumSsrcs; } 3544 size_t GetNumVideoStreams() const override { return kNumSsrcs; }
3453 3545
3454 void OnVideoStreamsCreated( 3546 void OnVideoStreamsCreated(
3455 VideoSendStream* send_stream, 3547 VideoSendStream* send_stream,
3456 const std::vector<VideoReceiveStream*>& receive_streams) override { 3548 const std::vector<VideoReceiveStream*>& receive_streams) override {
3457 send_stream_ = send_stream; 3549 send_stream_ = send_stream;
3458 receive_streams_ = receive_streams; 3550 receive_streams_ = receive_streams;
3459 } 3551 }
3460 3552
3461 void PerformTest() override { 3553 void PerformTest() override {
3462 Clock* clock = Clock::GetRealTimeClock(); 3554 task_queue_->SendTask([this]() {
3463 int64_t now = clock->TimeInMilliseconds(); 3555 Clock* clock = Clock::GetRealTimeClock();
3464 int64_t stop_time = now + test::CallTest::kLongTimeoutMs; 3556 int64_t now = clock->TimeInMilliseconds();
3465 bool receive_ok = false; 3557 int64_t stop_time = now + test::CallTest::kLongTimeoutMs;
3466 bool send_ok = false; 3558 bool receive_ok = false;
3559 bool send_ok = false;
3467 3560
3468 while (now < stop_time) { 3561 while (now < stop_time) {
3469 if (!receive_ok) 3562 if (!receive_ok)
3470 receive_ok = CheckReceiveStats(); 3563 receive_ok = CheckReceiveStats();
3471 if (!send_ok) 3564 if (!send_ok)
3472 send_ok = CheckSendStats(); 3565 send_ok = CheckSendStats();
3473 3566
3474 if (receive_ok && send_ok) 3567 if (receive_ok && send_ok)
3475 return; 3568 return;
3476 3569
3477 int64_t time_until_timout_ = stop_time - now; 3570 int64_t time_until_timout_ = stop_time - now;
3478 if (time_until_timout_ > 0) 3571 if (time_until_timout_ > 0)
3479 check_stats_event_.Wait(time_until_timout_); 3572 check_stats_event_.Wait(time_until_timout_);
3480 now = clock->TimeInMilliseconds(); 3573 now = clock->TimeInMilliseconds();
3481 } 3574 }
3482 3575
3483 ADD_FAILURE() << "Timed out waiting for filled stats."; 3576 ADD_FAILURE() << "Timed out waiting for filled stats.";
3484 for (std::map<std::string, bool>::const_iterator it = 3577 for (std::map<std::string, bool>::const_iterator it =
3485 receive_stats_filled_.begin(); 3578 receive_stats_filled_.begin();
3486 it != receive_stats_filled_.end(); 3579 it != receive_stats_filled_.end(); ++it) {
3487 ++it) { 3580 if (!it->second) {
3488 if (!it->second) { 3581 ADD_FAILURE() << "Missing receive stats: " << it->first;
3489 ADD_FAILURE() << "Missing receive stats: " << it->first; 3582 }
3490 } 3583 }
3491 }
3492 3584
3493 for (std::map<std::string, bool>::const_iterator it = 3585 for (std::map<std::string, bool>::const_iterator it =
3494 send_stats_filled_.begin(); 3586 send_stats_filled_.begin();
3495 it != send_stats_filled_.end(); 3587 it != send_stats_filled_.end(); ++it) {
3496 ++it) { 3588 if (!it->second) {
3497 if (!it->second) { 3589 ADD_FAILURE() << "Missing send stats: " << it->first;
3498 ADD_FAILURE() << "Missing send stats: " << it->first; 3590 }
3499 } 3591 }
3500 } 3592 });
3501 } 3593 }
3502 3594
3595 test::SingleThreadedTaskQueue* const task_queue_;
3503 test::DelayedEncoder encoder_; 3596 test::DelayedEncoder encoder_;
3504 std::vector<VideoReceiveStream*> receive_streams_; 3597 std::vector<VideoReceiveStream*> receive_streams_;
3505 std::map<std::string, bool> receive_stats_filled_; 3598 std::map<std::string, bool> receive_stats_filled_;
3506 3599
3507 VideoSendStream* send_stream_; 3600 VideoSendStream* send_stream_;
3508 std::map<std::string, bool> send_stats_filled_; 3601 std::map<std::string, bool> send_stats_filled_;
3509 3602
3510 std::vector<uint32_t> expected_receive_ssrcs_; 3603 std::vector<uint32_t> expected_receive_ssrcs_;
3511 std::set<uint32_t> expected_send_ssrcs_; 3604 std::set<uint32_t> expected_send_ssrcs_;
3512 std::string expected_cname_; 3605 std::string expected_cname_;
3513 3606
3514 rtc::Event check_stats_event_; 3607 rtc::Event check_stats_event_;
3515 ReceiveStreamRenderer receive_stream_renderer_; 3608 ReceiveStreamRenderer receive_stream_renderer_;
3516 } test; 3609 } test(&task_queue_);
3517 3610
3518 RunBaseTest(&test); 3611 RunBaseTest(&test);
3519 } 3612 }
3520 3613
3521 TEST_F(EndToEndTest, GetTimingFrameInfoReportsTimingFrames) { 3614 TEST_F(EndToEndTest, GetTimingFrameInfoReportsTimingFrames) {
3522 static const int kExtensionId = 5; 3615 static const int kExtensionId = 5;
3523 3616
3524 class StatsObserver : public test::EndToEndTest { 3617 class StatsObserver : public test::EndToEndTest {
3525 public: 3618 public:
3526 StatsObserver() : EndToEndTest(kLongTimeoutMs) {} 3619 StatsObserver() : EndToEndTest(kLongTimeoutMs) {}
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
3975 SequenceNumberUnwrapper seq_numbers_unwrapper_; 4068 SequenceNumberUnwrapper seq_numbers_unwrapper_;
3976 std::map<uint32_t, std::list<int64_t>> last_observed_seq_numbers_; 4069 std::map<uint32_t, std::list<int64_t>> last_observed_seq_numbers_;
3977 std::map<uint32_t, uint32_t> last_observed_timestamp_; 4070 std::map<uint32_t, uint32_t> last_observed_timestamp_;
3978 std::map<uint32_t, bool> ssrc_is_rtx_; 4071 std::map<uint32_t, bool> ssrc_is_rtx_;
3979 4072
3980 rtc::CriticalSection crit_; 4073 rtc::CriticalSection crit_;
3981 size_t ssrcs_to_observe_ GUARDED_BY(crit_); 4074 size_t ssrcs_to_observe_ GUARDED_BY(crit_);
3982 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); 4075 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_);
3983 } observer(use_rtx); 4076 } observer(use_rtx);
3984 4077
4078 std::unique_ptr<test::PacketTransport> send_transport;
4079 std::unique_ptr<test::PacketTransport> receive_transport;
4080
3985 Call::Config config(event_log_.get()); 4081 Call::Config config(event_log_.get());
3986 CreateCalls(config, config); 4082 VideoEncoderConfig one_stream;
3987 4083
3988 test::PacketTransport send_transport( 4084 task_queue_.SendTask([this, &observer, &send_transport, &receive_transport,
3989 sender_call_.get(), &observer, test::PacketTransport::kSender, 4085 &config, &one_stream, use_rtx]() {
3990 payload_type_map_, FakeNetworkPipe::Config()); 4086 CreateCalls(config, config);
3991 test::PacketTransport receive_transport(
3992 nullptr, &observer, test::PacketTransport::kReceiver, payload_type_map_,
3993 FakeNetworkPipe::Config());
3994 send_transport.SetReceiver(receiver_call_->Receiver());
3995 receive_transport.SetReceiver(sender_call_->Receiver());
3996 4087
3997 CreateSendConfig(kNumSsrcs, 0, 0, &send_transport); 4088 send_transport = rtc::MakeUnique<test::PacketTransport>(
4089 &task_queue_, sender_call_.get(), &observer,
4090 test::PacketTransport::kSender, payload_type_map_,
4091 FakeNetworkPipe::Config());
4092 receive_transport = rtc::MakeUnique<test::PacketTransport>(
4093 &task_queue_, nullptr, &observer, test::PacketTransport::kReceiver,
4094 payload_type_map_, FakeNetworkPipe::Config());
4095 send_transport->SetReceiver(receiver_call_->Receiver());
4096 receive_transport->SetReceiver(sender_call_->Receiver());
3998 4097
3999 if (use_rtx) { 4098 CreateSendConfig(kNumSsrcs, 0, 0, send_transport.get());
4000 for (size_t i = 0; i < kNumSsrcs; ++i) { 4099
4001 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); 4100 if (use_rtx) {
4101 for (size_t i = 0; i < kNumSsrcs; ++i) {
4102 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
4103 }
4104 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
4002 } 4105 }
4003 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
4004 }
4005 4106
4006 video_encoder_config_.video_stream_factory = 4107 video_encoder_config_.video_stream_factory =
4007 new rtc::RefCountedObject<VideoStreamFactory>(); 4108 new rtc::RefCountedObject<VideoStreamFactory>();
4008 // Use the same total bitrates when sending a single stream to avoid lowering 4109 // Use the same total bitrates when sending a single stream to avoid
4009 // the bitrate estimate and requiring a subsequent rampup. 4110 // lowering the bitrate estimate and requiring a subsequent rampup.
4010 VideoEncoderConfig one_stream = video_encoder_config_.Copy(); 4111 one_stream = video_encoder_config_.Copy();
4011 // one_stream.streams.resize(1); 4112 // one_stream.streams.resize(1);
4012 one_stream.number_of_streams = 1; 4113 one_stream.number_of_streams = 1;
4013 CreateMatchingReceiveConfigs(&receive_transport); 4114 CreateMatchingReceiveConfigs(receive_transport.get());
4014 4115
4015 CreateVideoStreams(); 4116 CreateVideoStreams();
4016 CreateFrameGeneratorCapturer(30, 1280, 720); 4117 CreateFrameGeneratorCapturer(30, 1280, 720);
4017 4118
4018 Start(); 4119 Start();
4120 });
4121
4019 EXPECT_TRUE(observer.Wait()) 4122 EXPECT_TRUE(observer.Wait())
4020 << "Timed out waiting for all SSRCs to send packets."; 4123 << "Timed out waiting for all SSRCs to send packets.";
4021 4124
4022 // Test stream resetting more than once to make sure that the state doesn't 4125 // Test stream resetting more than once to make sure that the state doesn't
4023 // get set once (this could be due to using std::map::insert for instance). 4126 // get set once (this could be due to using std::map::insert for instance).
4024 for (size_t i = 0; i < 3; ++i) { 4127 for (size_t i = 0; i < 3; ++i) {
4025 frame_generator_capturer_->Stop(); 4128 task_queue_.SendTask([&]() {
4026 sender_call_->DestroyVideoSendStream(video_send_stream_); 4129 frame_generator_capturer_->Stop();
4130 sender_call_->DestroyVideoSendStream(video_send_stream_);
4027 4131
4028 // Re-create VideoSendStream with only one stream. 4132 // Re-create VideoSendStream with only one stream.
4029 video_send_stream_ = sender_call_->CreateVideoSendStream( 4133 video_send_stream_ = sender_call_->CreateVideoSendStream(
4030 video_send_config_.Copy(), one_stream.Copy()); 4134 video_send_config_.Copy(), one_stream.Copy());
4031 video_send_stream_->Start(); 4135 video_send_stream_->Start();
4032 if (provoke_rtcpsr_before_rtp) { 4136 if (provoke_rtcpsr_before_rtp) {
4033 // Rapid Resync Request forces sending RTCP Sender Report back. 4137 // Rapid Resync Request forces sending RTCP Sender Report back.
4034 // Using this request speeds up this test because then there is no need 4138 // Using this request speeds up this test because then there is no need
4035 // to wait for a second for periodic Sender Report. 4139 // to wait for a second for periodic Sender Report.
4036 rtcp::RapidResyncRequest force_send_sr_back_request; 4140 rtcp::RapidResyncRequest force_send_sr_back_request;
4037 rtc::Buffer packet = force_send_sr_back_request.Build(); 4141 rtc::Buffer packet = force_send_sr_back_request.Build();
4038 static_cast<webrtc::test::DirectTransport&>(receive_transport) 4142 static_cast<webrtc::test::DirectTransport*>(receive_transport.get())
4039 .SendRtcp(packet.data(), packet.size()); 4143 ->SendRtcp(packet.data(), packet.size());
4040 } 4144 }
4041 CreateFrameGeneratorCapturer(30, 1280, 720); 4145 CreateFrameGeneratorCapturer(30, 1280, 720);
4042 frame_generator_capturer_->Start(); 4146 frame_generator_capturer_->Start();
4147 });
4043 4148
4044 observer.ResetExpectedSsrcs(1); 4149 observer.ResetExpectedSsrcs(1);
4045 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; 4150 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet.";
4046 4151
4047 // Reconfigure back to use all streams. 4152 // Reconfigure back to use all streams.
4048 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy()); 4153 task_queue_.SendTask([this]() {
4154 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy());
4155 });
4049 observer.ResetExpectedSsrcs(kNumSsrcs); 4156 observer.ResetExpectedSsrcs(kNumSsrcs);
4050 EXPECT_TRUE(observer.Wait()) 4157 EXPECT_TRUE(observer.Wait())
4051 << "Timed out waiting for all SSRCs to send packets."; 4158 << "Timed out waiting for all SSRCs to send packets.";
4052 4159
4053 // Reconfigure down to one stream. 4160 // Reconfigure down to one stream.
4054 video_send_stream_->ReconfigureVideoEncoder(one_stream.Copy()); 4161 task_queue_.SendTask([this, &one_stream]() {
4162 video_send_stream_->ReconfigureVideoEncoder(one_stream.Copy());
4163 });
4055 observer.ResetExpectedSsrcs(1); 4164 observer.ResetExpectedSsrcs(1);
4056 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; 4165 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet.";
4057 4166
4058 // Reconfigure back to use all streams. 4167 // Reconfigure back to use all streams.
4059 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy()); 4168 task_queue_.SendTask([this]() {
4169 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy());
4170 });
4060 observer.ResetExpectedSsrcs(kNumSsrcs); 4171 observer.ResetExpectedSsrcs(kNumSsrcs);
4061 EXPECT_TRUE(observer.Wait()) 4172 EXPECT_TRUE(observer.Wait())
4062 << "Timed out waiting for all SSRCs to send packets."; 4173 << "Timed out waiting for all SSRCs to send packets.";
4063 } 4174 }
4064 4175
4065 send_transport.StopSending(); 4176 task_queue_.SendTask([this, &send_transport, &receive_transport]() {
4066 receive_transport.StopSending(); 4177 Stop();
4067 4178 DestroyStreams();
4068 Stop(); 4179 send_transport.reset();
4069 DestroyStreams(); 4180 receive_transport.reset();
4181 DestroyCalls();
4182 });
4070 } 4183 }
4071 4184
4072 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { 4185 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) {
4073 TestRtpStatePreservation(false, false); 4186 TestRtpStatePreservation(false, false);
4074 } 4187 }
4075 4188
4076 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { 4189 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) {
4077 TestRtpStatePreservation(true, false); 4190 TestRtpStatePreservation(true, false);
4078 } 4191 }
4079 4192
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
4150 4263
4151 return SEND_PACKET; 4264 return SEND_PACKET;
4152 } 4265 }
4153 4266
4154 rtc::Optional<uint16_t> last_observed_sequence_number_ GUARDED_BY(crit_); 4267 rtc::Optional<uint16_t> last_observed_sequence_number_ GUARDED_BY(crit_);
4155 rtc::Optional<uint32_t> last_observed_timestamp_ GUARDED_BY(crit_); 4268 rtc::Optional<uint32_t> last_observed_timestamp_ GUARDED_BY(crit_);
4156 size_t num_flexfec_packets_sent_ GUARDED_BY(crit_); 4269 size_t num_flexfec_packets_sent_ GUARDED_BY(crit_);
4157 rtc::CriticalSection crit_; 4270 rtc::CriticalSection crit_;
4158 } observer; 4271 } observer;
4159 4272
4273 constexpr int kFrameMaxWidth = 320;
4274 constexpr int kFrameMaxHeight = 180;
4275 constexpr int kFrameRate = 15;
4276
4160 Call::Config config(event_log_.get()); 4277 Call::Config config(event_log_.get());
4161 CreateCalls(config, config);
4162 4278
4163 FakeNetworkPipe::Config lossy_delayed_link; 4279 std::unique_ptr<test::PacketTransport> send_transport;
4164 lossy_delayed_link.loss_percent = 2; 4280 std::unique_ptr<test::PacketTransport> receive_transport;
4165 lossy_delayed_link.queue_delay_ms = 50; 4281 std::unique_ptr<VideoEncoder> encoder;
4166 test::PacketTransport send_transport(sender_call_.get(), &observer,
4167 test::PacketTransport::kSender,
4168 payload_type_map_, lossy_delayed_link);
4169 send_transport.SetReceiver(receiver_call_->Receiver());
4170 4282
4171 FakeNetworkPipe::Config flawless_link; 4283 task_queue_.SendTask([&]() {
4172 test::PacketTransport receive_transport(nullptr, &observer, 4284 CreateCalls(config, config);
4173 test::PacketTransport::kReceiver,
4174 payload_type_map_, flawless_link);
4175 receive_transport.SetReceiver(sender_call_->Receiver());
4176 4285
4177 // For reduced flakyness, we use a real VP8 encoder together with NACK 4286 FakeNetworkPipe::Config lossy_delayed_link;
4178 // and RTX. 4287 lossy_delayed_link.loss_percent = 2;
4179 const int kNumVideoStreams = 1; 4288 lossy_delayed_link.queue_delay_ms = 50;
4180 const int kNumFlexfecStreams = 1;
4181 CreateSendConfig(kNumVideoStreams, 0, kNumFlexfecStreams, &send_transport);
4182 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
4183 video_send_config_.encoder_settings.encoder = encoder.get();
4184 video_send_config_.encoder_settings.payload_name = "VP8";
4185 video_send_config_.encoder_settings.payload_type = kVideoSendPayloadType;
4186 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
4187 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
4188 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
4189 4289
4190 CreateMatchingReceiveConfigs(&receive_transport); 4290 send_transport = rtc::MakeUnique<test::PacketTransport>(
4191 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 4291 &task_queue_, sender_call_.get(), &observer,
4192 video_receive_configs_[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; 4292 test::PacketTransport::kSender, payload_type_map_, lossy_delayed_link);
4193 video_receive_configs_[0].rtp.rtx_payload_types[kVideoSendPayloadType] = 4293 send_transport->SetReceiver(receiver_call_->Receiver());
4194 kSendRtxPayloadType;
4195 4294
4196 // The matching FlexFEC receive config is not created by 4295 FakeNetworkPipe::Config flawless_link;
4197 // CreateMatchingReceiveConfigs since this is not a test::BaseTest. 4296 receive_transport = rtc::MakeUnique<test::PacketTransport>(
4198 // Set up the receive config manually instead. 4297 &task_queue_, nullptr, &observer, test::PacketTransport::kReceiver,
4199 FlexfecReceiveStream::Config flexfec_receive_config(&receive_transport); 4298 payload_type_map_, flawless_link);
4200 flexfec_receive_config.payload_type = 4299 receive_transport->SetReceiver(sender_call_->Receiver());
4201 video_send_config_.rtp.flexfec.payload_type;
4202 flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc;
4203 flexfec_receive_config.protected_media_ssrcs =
4204 video_send_config_.rtp.flexfec.protected_media_ssrcs;
4205 flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc;
4206 flexfec_receive_config.transport_cc = true;
4207 flexfec_receive_config.rtp_header_extensions.emplace_back(
4208 RtpExtension::kTransportSequenceNumberUri,
4209 test::kTransportSequenceNumberExtensionId);
4210 flexfec_receive_configs_.push_back(flexfec_receive_config);
4211 4300
4212 CreateFlexfecStreams(); 4301 // For reduced flakyness, we use a real VP8 encoder together with NACK
4213 CreateVideoStreams(); 4302 // and RTX.
4303 const int kNumVideoStreams = 1;
4304 const int kNumFlexfecStreams = 1;
4305 CreateSendConfig(kNumVideoStreams, 0, kNumFlexfecStreams,
4306 send_transport.get());
4307 encoder = rtc::WrapUnique(VP8Encoder::Create());
4308 video_send_config_.encoder_settings.encoder = encoder.get();
4309 video_send_config_.encoder_settings.payload_name = "VP8";
4310 video_send_config_.encoder_settings.payload_type = kVideoSendPayloadType;
4311 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
4312 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
4313 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
4214 4314
4215 // RTCP might be disabled if the network is "down". 4315 CreateMatchingReceiveConfigs(receive_transport.get());
4216 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); 4316 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
4217 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); 4317 video_receive_configs_[0].rtp.rtx_ssrc = kSendRtxSsrcs[0];
4318 video_receive_configs_[0].rtp.rtx_payload_types[kVideoSendPayloadType] =
4319 kSendRtxPayloadType;
4218 4320
4219 const int kFrameMaxWidth = 320; 4321 // The matching FlexFEC receive config is not created by
4220 const int kFrameMaxHeight = 180; 4322 // CreateMatchingReceiveConfigs since this is not a test::BaseTest.
4221 const int kFrameRate = 15; 4323 // Set up the receive config manually instead.
4222 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); 4324 FlexfecReceiveStream::Config flexfec_receive_config(
4325 receive_transport.get());
4326 flexfec_receive_config.payload_type =
4327 video_send_config_.rtp.flexfec.payload_type;
4328 flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc;
4329 flexfec_receive_config.protected_media_ssrcs =
4330 video_send_config_.rtp.flexfec.protected_media_ssrcs;
4331 flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc;
4332 flexfec_receive_config.transport_cc = true;
4333 flexfec_receive_config.rtp_header_extensions.emplace_back(
4334 RtpExtension::kTransportSequenceNumberUri,
4335 test::kTransportSequenceNumberExtensionId);
4336 flexfec_receive_configs_.push_back(flexfec_receive_config);
4337
4338 CreateFlexfecStreams();
4339 CreateVideoStreams();
4340
4341 // RTCP might be disabled if the network is "down".
4342 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
4343 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
4344
4345 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight);
4346
4347 Start();
4348 });
4223 4349
4224 // Initial test. 4350 // Initial test.
4225 Start();
4226 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; 4351 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
4227 4352
4228 // Ensure monotonicity when the VideoSendStream is restarted. 4353 task_queue_.SendTask([this, &observer]() {
4229 Stop(); 4354 // Ensure monotonicity when the VideoSendStream is restarted.
4230 observer.ResetPacketCount(); 4355 Stop();
4231 Start(); 4356 observer.ResetPacketCount();
4357 Start();
4358 });
4359
4232 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; 4360 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
4233 4361
4234 // Ensure monotonicity when the VideoSendStream is recreated. 4362 task_queue_.SendTask([this, &observer]() {
4235 frame_generator_capturer_->Stop(); 4363 // Ensure monotonicity when the VideoSendStream is recreated.
4236 sender_call_->DestroyVideoSendStream(video_send_stream_); 4364 frame_generator_capturer_->Stop();
4237 observer.ResetPacketCount(); 4365 sender_call_->DestroyVideoSendStream(video_send_stream_);
4238 video_send_stream_ = sender_call_->CreateVideoSendStream( 4366 observer.ResetPacketCount();
4239 video_send_config_.Copy(), video_encoder_config_.Copy()); 4367 video_send_stream_ = sender_call_->CreateVideoSendStream(
4240 video_send_stream_->Start(); 4368 video_send_config_.Copy(), video_encoder_config_.Copy());
4241 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); 4369 video_send_stream_->Start();
4242 frame_generator_capturer_->Start(); 4370 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight);
4371 frame_generator_capturer_->Start();
4372 });
4373
4243 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; 4374 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
4244 4375
4245 // Cleanup. 4376 // Cleanup.
4246 send_transport.StopSending(); 4377 task_queue_.SendTask([this, &send_transport, &receive_transport]() {
4247 receive_transport.StopSending(); 4378 Stop();
4248 Stop(); 4379 DestroyStreams();
4249 DestroyStreams(); 4380 send_transport.reset();
4381 receive_transport.reset();
4382 DestroyCalls();
4383 });
4250 } 4384 }
4251 4385
4252 TEST_F(EndToEndTest, RespectsNetworkState) { 4386 TEST_F(EndToEndTest, RespectsNetworkState) {
4253 // TODO(pbos): Remove accepted downtime packets etc. when signaling network 4387 // TODO(pbos): Remove accepted downtime packets etc. when signaling network
4254 // down blocks until no more packets will be sent. 4388 // down blocks until no more packets will be sent.
4255 4389
4256 // Pacer will send from its packet list and then send required padding before 4390 // Pacer will send from its packet list and then send required padding before
4257 // checking paused_ again. This should be enough for one round of pacing, 4391 // checking paused_ again. This should be enough for one round of pacing,
4258 // otherwise increase. 4392 // otherwise increase.
4259 static const int kNumAcceptedDowntimeRtp = 5; 4393 static const int kNumAcceptedDowntimeRtp = 5;
4260 // A single RTCP may be in the pipeline. 4394 // A single RTCP may be in the pipeline.
4261 static const int kNumAcceptedDowntimeRtcp = 1; 4395 static const int kNumAcceptedDowntimeRtcp = 1;
4262 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder { 4396 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder {
4263 public: 4397 public:
4264 NetworkStateTest() 4398 explicit NetworkStateTest(test::SingleThreadedTaskQueue* task_queue)
4265 : EndToEndTest(kDefaultTimeoutMs), 4399 : EndToEndTest(kDefaultTimeoutMs),
4266 FakeEncoder(Clock::GetRealTimeClock()), 4400 FakeEncoder(Clock::GetRealTimeClock()),
4401 task_queue_(task_queue),
4267 encoded_frames_(false, false), 4402 encoded_frames_(false, false),
4268 packet_event_(false, false), 4403 packet_event_(false, false),
4269 sender_call_(nullptr), 4404 sender_call_(nullptr),
4270 receiver_call_(nullptr), 4405 receiver_call_(nullptr),
4271 sender_state_(kNetworkUp), 4406 sender_state_(kNetworkUp),
4272 sender_rtp_(0), 4407 sender_rtp_(0),
4273 sender_padding_(0), 4408 sender_padding_(0),
4274 sender_rtcp_(0), 4409 sender_rtcp_(0),
4275 receiver_rtcp_(0), 4410 receiver_rtcp_(0),
4276 down_frames_(0) {} 4411 down_frames_(0) {}
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
4313 void ModifyVideoConfigs( 4448 void ModifyVideoConfigs(
4314 VideoSendStream::Config* send_config, 4449 VideoSendStream::Config* send_config,
4315 std::vector<VideoReceiveStream::Config>* receive_configs, 4450 std::vector<VideoReceiveStream::Config>* receive_configs,
4316 VideoEncoderConfig* encoder_config) override { 4451 VideoEncoderConfig* encoder_config) override {
4317 send_config->encoder_settings.encoder = this; 4452 send_config->encoder_settings.encoder = this;
4318 } 4453 }
4319 4454
4320 void PerformTest() override { 4455 void PerformTest() override {
4321 EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs)) 4456 EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs))
4322 << "No frames received by the encoder."; 4457 << "No frames received by the encoder.";
4323 // Wait for packets from both sender/receiver.
4324 WaitForPacketsOrSilence(false, false);
4325 4458
4326 // Sender-side network down for audio; there should be no effect on video 4459 task_queue_->SendTask([this]() {
4327 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown); 4460 // Wait for packets from both sender/receiver.
4328 WaitForPacketsOrSilence(false, false); 4461 WaitForPacketsOrSilence(false, false);
4329 4462
4330 // Receiver-side network down for audio; no change expected 4463 // Sender-side network down for audio; there should be no effect on
4331 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown); 4464 // video
4332 WaitForPacketsOrSilence(false, false); 4465 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown);
4466 WaitForPacketsOrSilence(false, false);
4333 4467
4334 // Sender-side network down. 4468 // Receiver-side network down for audio; no change expected
4335 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown); 4469 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO,
4336 { 4470 kNetworkDown);
4337 rtc::CritScope lock(&test_crit_); 4471 WaitForPacketsOrSilence(false, false);
4338 // After network goes down we shouldn't be encoding more frames.
4339 sender_state_ = kNetworkDown;
4340 }
4341 // Wait for receiver-packets and no sender packets.
4342 WaitForPacketsOrSilence(true, false);
4343 4472
4344 // Receiver-side network down. 4473 // Sender-side network down.
4345 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown); 4474 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown);
4346 WaitForPacketsOrSilence(true, true); 4475 {
4476 rtc::CritScope lock(&test_crit_);
4477 // After network goes down we shouldn't be encoding more frames.
4478 sender_state_ = kNetworkDown;
4479 }
4480 // Wait for receiver-packets and no sender packets.
4481 WaitForPacketsOrSilence(true, false);
4347 4482
4348 // Network up for audio for both sides; video is still not expected to 4483 // Receiver-side network down.
4349 // start 4484 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO,
4350 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); 4485 kNetworkDown);
4351 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); 4486 WaitForPacketsOrSilence(true, true);
4352 WaitForPacketsOrSilence(true, true);
4353 4487
4354 // Network back up again for both. 4488 // Network up for audio for both sides; video is still not expected to
4355 { 4489 // start
4356 rtc::CritScope lock(&test_crit_); 4490 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
4357 // It's OK to encode frames again, as we're about to bring up the 4491 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
4358 // network. 4492 WaitForPacketsOrSilence(true, true);
4359 sender_state_ = kNetworkUp;
4360 }
4361 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
4362 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
4363 WaitForPacketsOrSilence(false, false);
4364 4493
4365 // TODO(skvlad): add tests to verify that the audio streams are stopped 4494 // Network back up again for both.
4366 // when the network goes down for audio once the workaround in 4495 {
4367 // paced_sender.cc is removed. 4496 rtc::CritScope lock(&test_crit_);
4497 // It's OK to encode frames again, as we're about to bring up the
4498 // network.
4499 sender_state_ = kNetworkUp;
4500 }
4501 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
4502 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
4503 WaitForPacketsOrSilence(false, false);
4504
4505 // TODO(skvlad): add tests to verify that the audio streams are stopped
4506 // when the network goes down for audio once the workaround in
4507 // paced_sender.cc is removed.
4508 });
4368 } 4509 }
4369 4510
4370 int32_t Encode(const VideoFrame& input_image, 4511 int32_t Encode(const VideoFrame& input_image,
4371 const CodecSpecificInfo* codec_specific_info, 4512 const CodecSpecificInfo* codec_specific_info,
4372 const std::vector<FrameType>* frame_types) override { 4513 const std::vector<FrameType>* frame_types) override {
4373 { 4514 {
4374 rtc::CritScope lock(&test_crit_); 4515 rtc::CritScope lock(&test_crit_);
4375 if (sender_state_ == kNetworkDown) { 4516 if (sender_state_ == kNetworkDown) {
4376 ++down_frames_; 4517 ++down_frames_;
4377 EXPECT_LE(down_frames_, 1) 4518 EXPECT_LE(down_frames_, 1)
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
4427 static_cast<int64_t>(kSilenceTimeoutMs)) { 4568 static_cast<int64_t>(kSilenceTimeoutMs)) {
4428 receiver_done = true; 4569 receiver_done = true;
4429 } 4570 }
4430 } else { 4571 } else {
4431 if (receiver_rtcp_ > initial_receiver_rtcp + kNumAcceptedDowntimeRtcp) 4572 if (receiver_rtcp_ > initial_receiver_rtcp + kNumAcceptedDowntimeRtcp)
4432 receiver_done = true; 4573 receiver_done = true;
4433 } 4574 }
4434 } 4575 }
4435 } 4576 }
4436 4577
4578 test::SingleThreadedTaskQueue* const task_queue_;
4437 rtc::CriticalSection test_crit_; 4579 rtc::CriticalSection test_crit_;
4438 rtc::Event encoded_frames_; 4580 rtc::Event encoded_frames_;
4439 rtc::Event packet_event_; 4581 rtc::Event packet_event_;
4440 Call* sender_call_; 4582 Call* sender_call_;
4441 Call* receiver_call_; 4583 Call* receiver_call_;
4442 NetworkState sender_state_ GUARDED_BY(test_crit_); 4584 NetworkState sender_state_ GUARDED_BY(test_crit_);
4443 int sender_rtp_ GUARDED_BY(test_crit_); 4585 int sender_rtp_ GUARDED_BY(test_crit_);
4444 int sender_padding_ GUARDED_BY(test_crit_); 4586 int sender_padding_ GUARDED_BY(test_crit_);
4445 int sender_rtcp_ GUARDED_BY(test_crit_); 4587 int sender_rtcp_ GUARDED_BY(test_crit_);
4446 int receiver_rtcp_ GUARDED_BY(test_crit_); 4588 int receiver_rtcp_ GUARDED_BY(test_crit_);
4447 int down_frames_ GUARDED_BY(test_crit_); 4589 int down_frames_ GUARDED_BY(test_crit_);
4448 } test; 4590 } test(&task_queue_);
4449 4591
4450 RunBaseTest(&test); 4592 RunBaseTest(&test);
4451 } 4593 }
4452 4594
4453 TEST_F(EndToEndTest, CallReportsRttForSender) { 4595 TEST_F(EndToEndTest, CallReportsRttForSender) {
4454 static const int kSendDelayMs = 30; 4596 static const int kSendDelayMs = 30;
4455 static const int kReceiveDelayMs = 70; 4597 static const int kReceiveDelayMs = 70;
4456 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
4457 4598
4458 FakeNetworkPipe::Config config; 4599 std::unique_ptr<test::DirectTransport> sender_transport;
4459 config.queue_delay_ms = kSendDelayMs; 4600 std::unique_ptr<test::DirectTransport> receiver_transport;
4460 test::DirectTransport sender_transport(config, sender_call_.get(),
4461 payload_type_map_);
4462 config.queue_delay_ms = kReceiveDelayMs;
4463 test::DirectTransport receiver_transport(config, receiver_call_.get(),
4464 payload_type_map_);
4465 sender_transport.SetReceiver(receiver_call_->Receiver());
4466 receiver_transport.SetReceiver(sender_call_->Receiver());
4467 4601
4468 CreateSendConfig(1, 0, 0, &sender_transport); 4602 task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
4469 CreateMatchingReceiveConfigs(&receiver_transport); 4603 FakeNetworkPipe::Config config;
4604 config.queue_delay_ms = kSendDelayMs;
4605 CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
4606 sender_transport = rtc::MakeUnique<test::DirectTransport>(
4607 &task_queue_, config, sender_call_.get(), payload_type_map_);
4608 config.queue_delay_ms = kReceiveDelayMs;
4609 receiver_transport = rtc::MakeUnique<test::DirectTransport>(
4610 &task_queue_, config, receiver_call_.get(), payload_type_map_);
4611 sender_transport->SetReceiver(receiver_call_->Receiver());
4612 receiver_transport->SetReceiver(sender_call_->Receiver());
4470 4613
4471 CreateVideoStreams(); 4614 CreateSendConfig(1, 0, 0, sender_transport.get());
4472 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, 4615 CreateMatchingReceiveConfigs(receiver_transport.get());
4473 kDefaultHeight); 4616
4474 Start(); 4617 CreateVideoStreams();
4618 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
4619 kDefaultHeight);
4620 Start();
4621 });
4475 4622
4476 int64_t start_time_ms = clock_->TimeInMilliseconds(); 4623 int64_t start_time_ms = clock_->TimeInMilliseconds();
4477 while (true) { 4624 while (true) {
4478 Call::Stats stats = sender_call_->GetStats(); 4625 Call::Stats stats = sender_call_->GetStats();
4479 ASSERT_GE(start_time_ms + kDefaultTimeoutMs, 4626 ASSERT_GE(start_time_ms + kDefaultTimeoutMs,
4480 clock_->TimeInMilliseconds()) 4627 clock_->TimeInMilliseconds())
4481 << "No RTT stats before timeout!"; 4628 << "No RTT stats before timeout!";
4482 if (stats.rtt_ms != -1) { 4629 if (stats.rtt_ms != -1) {
4483 // To avoid failures caused by rounding or minor ntp clock adjustments, 4630 // To avoid failures caused by rounding or minor ntp clock adjustments,
4484 // relax expectation by 1ms. 4631 // relax expectation by 1ms.
4485 constexpr int kAllowedErrorMs = 1; 4632 constexpr int kAllowedErrorMs = 1;
4486 EXPECT_GE(stats.rtt_ms, kSendDelayMs + kReceiveDelayMs - kAllowedErrorMs); 4633 EXPECT_GE(stats.rtt_ms, kSendDelayMs + kReceiveDelayMs - kAllowedErrorMs);
4487 break; 4634 break;
4488 } 4635 }
4489 SleepMs(10); 4636 SleepMs(10);
4490 } 4637 }
4491 4638
4492 sender_transport.StopSending(); 4639 task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
4493 receiver_transport.StopSending(); 4640 Stop();
4494 Stop(); 4641 DestroyStreams();
4495 DestroyStreams(); 4642 sender_transport.reset();
4496 DestroyCalls(); 4643 receiver_transport.reset();
4644 DestroyCalls();
4645 });
4497 } 4646 }
4498 4647
4499 void EndToEndTest::VerifyNewVideoSendStreamsRespectNetworkState( 4648 void EndToEndTest::VerifyNewVideoSendStreamsRespectNetworkState(
4500 MediaType network_to_bring_up, 4649 MediaType network_to_bring_up,
4501 VideoEncoder* encoder, 4650 VideoEncoder* encoder,
4502 Transport* transport) { 4651 Transport* transport) {
4503 CreateSenderCall(Call::Config(event_log_.get())); 4652 task_queue_.SendTask([this, network_to_bring_up, encoder, transport]() {
4504 sender_call_->SignalChannelNetworkState(network_to_bring_up, kNetworkUp); 4653 CreateSenderCall(Call::Config(event_log_.get()));
4654 sender_call_->SignalChannelNetworkState(network_to_bring_up, kNetworkUp);
4505 4655
4506 CreateSendConfig(1, 0, 0, transport); 4656 CreateSendConfig(1, 0, 0, transport);
4507 video_send_config_.encoder_settings.encoder = encoder; 4657 video_send_config_.encoder_settings.encoder = encoder;
4508 CreateVideoStreams(); 4658 CreateVideoStreams();
4509 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, 4659 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
4510 kDefaultHeight); 4660 kDefaultHeight);
4511 4661
4512 Start(); 4662 Start();
4663 });
4664
4513 SleepMs(kSilenceTimeoutMs); 4665 SleepMs(kSilenceTimeoutMs);
4514 Stop();
4515 4666
4516 DestroyStreams(); 4667 task_queue_.SendTask([this]() {
4668 Stop();
4669 DestroyStreams();
4670 DestroyCalls();
4671 });
4517 } 4672 }
4518 4673
4519 void EndToEndTest::VerifyNewVideoReceiveStreamsRespectNetworkState( 4674 void EndToEndTest::VerifyNewVideoReceiveStreamsRespectNetworkState(
4520 MediaType network_to_bring_up, 4675 MediaType network_to_bring_up,
4521 Transport* transport) { 4676 Transport* transport) {
4522 Call::Config config(event_log_.get()); 4677 std::unique_ptr<test::DirectTransport> sender_transport;
4523 CreateCalls(config, config);
4524 receiver_call_->SignalChannelNetworkState(network_to_bring_up, kNetworkUp);
4525 4678
4526 test::DirectTransport sender_transport(sender_call_.get(), payload_type_map_); 4679 task_queue_.SendTask([this, &sender_transport, network_to_bring_up,
4527 sender_transport.SetReceiver(receiver_call_->Receiver()); 4680 transport]() {
4528 CreateSendConfig(1, 0, 0, &sender_transport); 4681 Call::Config config(event_log_.get());
4529 CreateMatchingReceiveConfigs(transport); 4682 CreateCalls(config, config);
4530 CreateVideoStreams(); 4683 receiver_call_->SignalChannelNetworkState(network_to_bring_up, kNetworkUp);
4531 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, 4684 sender_transport = rtc::MakeUnique<test::DirectTransport>(
4532 kDefaultHeight); 4685 &task_queue_, sender_call_.get(), payload_type_map_);
4686 sender_transport->SetReceiver(receiver_call_->Receiver());
4687 CreateSendConfig(1, 0, 0, sender_transport.get());
4688 CreateMatchingReceiveConfigs(transport);
4689 CreateVideoStreams();
4690 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
4691 kDefaultHeight);
4692 Start();
4693 });
4533 4694
4534 Start();
4535 SleepMs(kSilenceTimeoutMs); 4695 SleepMs(kSilenceTimeoutMs);
4536 Stop();
4537 4696
4538 sender_transport.StopSending(); 4697 task_queue_.SendTask([this, &sender_transport]() {
4539 4698 Stop();
4540 DestroyStreams(); 4699 DestroyStreams();
4700 sender_transport.reset();
4701 DestroyCalls();
4702 });
4541 } 4703 }
4542 4704
4543 TEST_F(EndToEndTest, NewVideoSendStreamsRespectVideoNetworkDown) { 4705 TEST_F(EndToEndTest, NewVideoSendStreamsRespectVideoNetworkDown) {
4544 class UnusedEncoder : public test::FakeEncoder { 4706 class UnusedEncoder : public test::FakeEncoder {
4545 public: 4707 public:
4546 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {} 4708 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {}
4547 4709
4548 int32_t InitEncode(const VideoCodec* config, 4710 int32_t InitEncode(const VideoCodec* config,
4549 int32_t number_of_cores, 4711 int32_t number_of_cores,
4550 size_t max_payload_size) override { 4712 size_t max_payload_size) override {
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
4840 std::unique_ptr<VideoEncoder> encoder_; 5002 std::unique_ptr<VideoEncoder> encoder_;
4841 std::unique_ptr<VideoDecoder> decoder_; 5003 std::unique_ptr<VideoDecoder> decoder_;
4842 rtc::CriticalSection crit_; 5004 rtc::CriticalSection crit_;
4843 int recorded_frames_ GUARDED_BY(crit_); 5005 int recorded_frames_ GUARDED_BY(crit_);
4844 } test(this); 5006 } test(this);
4845 5007
4846 RunBaseTest(&test); 5008 RunBaseTest(&test);
4847 } 5009 }
4848 5010
4849 } // namespace webrtc 5011 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698