Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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>( |
|
nisse-webrtc
2017/08/18 11:08:30
Looks odd to me to create the transports from a ta
eladalon
2017/08/18 12:12:38
* The way I understand it, the transports also nee
| |
| 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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::SingleThreadedTaskQueueForTesting* 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::SingleThreadedTaskQueueForTesting* task_queue, |
| 1619 Call* receiver_call) { | |
| 1620 return new test::DirectTransport(task_queue, receiver_call, | |
| 1621 payload_type_map_); | |
| 1567 } | 1622 } |
| 1623 | |
| 1624 test::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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( |
| 2389 test::SingleThreadedTaskQueueForTesting* task_queue) | |
| 2390 : clock_(Clock::GetRealTimeClock()), task_queue_(task_queue) {} | |
| 2317 | 2391 |
| 2318 void OnVideoStreamsCreated( | 2392 void OnVideoStreamsCreated( |
| 2319 VideoSendStream* send_stream, | 2393 VideoSendStream* send_stream, |
| 2320 const std::vector<VideoReceiveStream*>& receive_streams) override { | 2394 const std::vector<VideoReceiveStream*>& receive_streams) override { |
| 2321 RTC_DCHECK_EQ(1, receive_streams.size()); | 2395 RTC_DCHECK_EQ(1, receive_streams.size()); |
| 2322 send_stream_ = send_stream; | 2396 send_stream_ = send_stream; |
| 2323 receive_stream_ = receive_streams[0]; | 2397 receive_stream_ = receive_streams[0]; |
| 2324 } | 2398 } |
| 2325 | 2399 |
| 2326 void PerformTest() override { | 2400 void PerformTest() override { |
| 2327 bool frame_decoded = false; | 2401 bool frame_decoded = false; |
| 2328 int64_t start_time = clock_->TimeInMilliseconds(); | 2402 int64_t start_time = clock_->TimeInMilliseconds(); |
| 2329 while (clock_->TimeInMilliseconds() - start_time <= 5000) { | 2403 while (clock_->TimeInMilliseconds() - start_time <= 5000) { |
| 2330 if (receive_stream_->GetStats().frames_decoded > 0) { | 2404 if (receive_stream_->GetStats().frames_decoded > 0) { |
| 2331 frame_decoded = true; | 2405 frame_decoded = true; |
| 2332 break; | 2406 break; |
| 2333 } | 2407 } |
| 2334 SleepMs(100); | 2408 SleepMs(100); |
| 2335 } | 2409 } |
| 2336 ASSERT_TRUE(frame_decoded); | 2410 ASSERT_TRUE(frame_decoded); |
| 2337 send_stream_->Stop(); | 2411 task_queue_->SendTask([this]() { send_stream_->Stop(); }); |
| 2338 SleepMs(10000); | 2412 SleepMs(10000); |
| 2339 ASSERT_EQ( | 2413 ASSERT_EQ( |
| 2340 1U, receive_stream_->GetStats().rtcp_packet_type_counts.pli_packets); | 2414 1U, receive_stream_->GetStats().rtcp_packet_type_counts.pli_packets); |
| 2341 } | 2415 } |
| 2342 | 2416 |
| 2343 private: | 2417 private: |
| 2344 Clock* clock_; | 2418 Clock* clock_; |
| 2345 VideoSendStream* send_stream_; | 2419 VideoSendStream* send_stream_; |
| 2346 VideoReceiveStream* receive_stream_; | 2420 VideoReceiveStream* receive_stream_; |
| 2347 } test; | 2421 test::SingleThreadedTaskQueueForTesting* const task_queue_; |
| 2422 } test(&task_queue_); | |
| 2348 | 2423 |
| 2349 RunBaseTest(&test); | 2424 RunBaseTest(&test); |
| 2350 } | 2425 } |
| 2351 | 2426 |
| 2352 class ProbingTest : public test::EndToEndTest { | 2427 class ProbingTest : public test::EndToEndTest { |
| 2353 public: | 2428 public: |
| 2354 explicit ProbingTest(int start_bitrate_bps) | 2429 explicit ProbingTest(int start_bitrate_bps) |
| 2355 : clock_(Clock::GetRealTimeClock()), | 2430 : clock_(Clock::GetRealTimeClock()), |
| 2356 start_bitrate_bps_(start_bitrate_bps), | 2431 start_bitrate_bps_(start_bitrate_bps), |
| 2357 state_(0), | 2432 state_(0), |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2422 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) { | 2497 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) { |
| 2423 // Fails on iOS bots: bugs.webrtc.org/7851 | 2498 // Fails on iOS bots: bugs.webrtc.org/7851 |
| 2424 #elif defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR | 2499 #elif defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR |
| 2425 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) { | 2500 TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) { |
| 2426 #else | 2501 #else |
| 2427 TEST_F(EndToEndTest, TriggerMidCallProbing) { | 2502 TEST_F(EndToEndTest, TriggerMidCallProbing) { |
| 2428 #endif | 2503 #endif |
| 2429 | 2504 |
| 2430 class TriggerMidCallProbingTest : public ProbingTest { | 2505 class TriggerMidCallProbingTest : public ProbingTest { |
| 2431 public: | 2506 public: |
| 2432 explicit TriggerMidCallProbingTest(bool* success) | 2507 TriggerMidCallProbingTest( |
| 2433 : ProbingTest(300000), success_(success) {} | 2508 test::SingleThreadedTaskQueueForTesting* task_queue, |
| 2509 bool* success) | |
| 2510 : ProbingTest(300000), success_(success), task_queue_(task_queue) {} | |
| 2434 | 2511 |
| 2435 void PerformTest() override { | 2512 void PerformTest() override { |
| 2436 *success_ = false; | 2513 *success_ = false; |
| 2437 int64_t start_time_ms = clock_->TimeInMilliseconds(); | 2514 int64_t start_time_ms = clock_->TimeInMilliseconds(); |
| 2438 do { | 2515 do { |
| 2439 if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs) | 2516 if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs) |
| 2440 break; | 2517 break; |
| 2441 | 2518 |
| 2442 Call::Stats stats = sender_call_->GetStats(); | 2519 Call::Stats stats = sender_call_->GetStats(); |
| 2443 | 2520 |
| 2444 switch (state_) { | 2521 switch (state_) { |
| 2445 case 0: | 2522 case 0: |
| 2446 if (stats.send_bandwidth_bps > 5 * 300000) { | 2523 if (stats.send_bandwidth_bps > 5 * 300000) { |
| 2447 Call::Config::BitrateConfig bitrate_config; | 2524 Call::Config::BitrateConfig bitrate_config; |
| 2448 bitrate_config.max_bitrate_bps = 100000; | 2525 bitrate_config.max_bitrate_bps = 100000; |
| 2449 sender_call_->SetBitrateConfig(bitrate_config); | 2526 task_queue_->SendTask([this, &bitrate_config]() { |
| 2527 sender_call_->SetBitrateConfig(bitrate_config); | |
| 2528 }); | |
| 2450 ++state_; | 2529 ++state_; |
| 2451 } | 2530 } |
| 2452 break; | 2531 break; |
| 2453 case 1: | 2532 case 1: |
| 2454 if (stats.send_bandwidth_bps < 110000) { | 2533 if (stats.send_bandwidth_bps < 110000) { |
| 2455 Call::Config::BitrateConfig bitrate_config; | 2534 Call::Config::BitrateConfig bitrate_config; |
| 2456 bitrate_config.max_bitrate_bps = 2500000; | 2535 bitrate_config.max_bitrate_bps = 2500000; |
| 2457 sender_call_->SetBitrateConfig(bitrate_config); | 2536 task_queue_->SendTask([this, &bitrate_config]() { |
| 2537 sender_call_->SetBitrateConfig(bitrate_config); | |
| 2538 }); | |
| 2458 ++state_; | 2539 ++state_; |
| 2459 } | 2540 } |
| 2460 break; | 2541 break; |
| 2461 case 2: | 2542 case 2: |
| 2462 // During high cpu load the pacer will not be able to pace packets | 2543 // 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 | 2544 // at the correct speed, but if we go from 110 to 1250 kbps |
| 2464 // in 5 seconds then it is due to probing. | 2545 // in 5 seconds then it is due to probing. |
| 2465 if (stats.send_bandwidth_bps > 1250000) { | 2546 if (stats.send_bandwidth_bps > 1250000) { |
| 2466 *success_ = true; | 2547 *success_ = true; |
| 2467 observation_complete_.Set(); | 2548 observation_complete_.Set(); |
| 2468 } | 2549 } |
| 2469 break; | 2550 break; |
| 2470 } | 2551 } |
| 2471 } while (!observation_complete_.Wait(20)); | 2552 } while (!observation_complete_.Wait(20)); |
| 2472 } | 2553 } |
| 2473 | 2554 |
| 2474 private: | 2555 private: |
| 2475 const int kTimeoutMs = 5000; | 2556 const int kTimeoutMs = 5000; |
| 2476 bool* const success_; | 2557 bool* const success_; |
| 2558 test::SingleThreadedTaskQueueForTesting* const task_queue_; | |
| 2477 }; | 2559 }; |
| 2478 | 2560 |
| 2479 bool success = false; | 2561 bool success = false; |
| 2480 const int kMaxAttempts = 3; | 2562 const int kMaxAttempts = 3; |
| 2481 for (int i = 0; i < kMaxAttempts; ++i) { | 2563 for (int i = 0; i < kMaxAttempts; ++i) { |
| 2482 TriggerMidCallProbingTest test(&success); | 2564 TriggerMidCallProbingTest test(&task_queue_, &success); |
| 2483 RunBaseTest(&test); | 2565 RunBaseTest(&test); |
| 2484 if (success) | 2566 if (success) |
| 2485 return; | 2567 return; |
| 2486 } | 2568 } |
| 2487 EXPECT_TRUE(success) << "Failed to perform mid call probing (" << kMaxAttempts | 2569 EXPECT_TRUE(success) << "Failed to perform mid call probing (" << kMaxAttempts |
| 2488 << " attempts)."; | 2570 << " attempts)."; |
| 2489 } | 2571 } |
| 2490 | 2572 |
| 2491 TEST_F(EndToEndTest, VerifyNackStats) { | 2573 TEST_F(EndToEndTest, VerifyNackStats) { |
| 2492 static const int kPacketNumberToDrop = 200; | 2574 static const int kPacketNumberToDrop = 200; |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2704 const std::unique_ptr<VideoEncoder> vp8_encoder_; | 2786 const std::unique_ptr<VideoEncoder> vp8_encoder_; |
| 2705 Call* sender_call_; | 2787 Call* sender_call_; |
| 2706 Call* receiver_call_; | 2788 Call* receiver_call_; |
| 2707 int64_t start_runtime_ms_; | 2789 int64_t start_runtime_ms_; |
| 2708 int num_frames_received_ GUARDED_BY(&crit_); | 2790 int num_frames_received_ GUARDED_BY(&crit_); |
| 2709 } test(use_rtx, use_red, screenshare); | 2791 } test(use_rtx, use_red, screenshare); |
| 2710 | 2792 |
| 2711 metrics::Reset(); | 2793 metrics::Reset(); |
| 2712 RunBaseTest(&test); | 2794 RunBaseTest(&test); |
| 2713 | 2795 |
| 2714 // Delete the call for Call stats to be reported. | |
| 2715 sender_call_.reset(); | |
| 2716 receiver_call_.reset(); | |
| 2717 | |
| 2718 std::string video_prefix = | 2796 std::string video_prefix = |
| 2719 screenshare ? "WebRTC.Video.Screenshare." : "WebRTC.Video."; | 2797 screenshare ? "WebRTC.Video.Screenshare." : "WebRTC.Video."; |
| 2720 | 2798 |
| 2721 // Verify that stats have been updated once. | 2799 // Verify that stats have been updated once. |
| 2722 EXPECT_EQ(2, metrics::NumSamples("WebRTC.Call.LifetimeInSeconds")); | 2800 EXPECT_EQ(2, metrics::NumSamples("WebRTC.Call.LifetimeInSeconds")); |
| 2723 EXPECT_EQ(1, metrics::NumSamples( | 2801 EXPECT_EQ(1, metrics::NumSamples( |
| 2724 "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds")); | 2802 "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds")); |
| 2725 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.VideoBitrateReceivedInKbps")); | 2803 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.VideoBitrateReceivedInKbps")); |
| 2726 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.RtcpBitrateReceivedInBps")); | 2804 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.RtcpBitrateReceivedInBps")); |
| 2727 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.BitrateReceivedInKbps")); | 2805 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.BitrateReceivedInKbps")); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2874 | 2952 |
| 2875 rtc::CriticalSection crit_; | 2953 rtc::CriticalSection crit_; |
| 2876 int num_frames_received_ GUARDED_BY(&crit_); | 2954 int num_frames_received_ GUARDED_BY(&crit_); |
| 2877 } test; | 2955 } test; |
| 2878 | 2956 |
| 2879 test::ScopedFieldTrials override_field_trials( | 2957 test::ScopedFieldTrials override_field_trials( |
| 2880 "WebRTC-VideoContentTypeExtension/Enabled/"); | 2958 "WebRTC-VideoContentTypeExtension/Enabled/"); |
| 2881 metrics::Reset(); | 2959 metrics::Reset(); |
| 2882 | 2960 |
| 2883 Call::Config send_config(test.GetSenderCallConfig()); | 2961 Call::Config send_config(test.GetSenderCallConfig()); |
| 2884 CreateSenderCall(send_config); | |
| 2885 Call::Config recv_config(test.GetReceiverCallConfig()); | 2962 Call::Config recv_config(test.GetReceiverCallConfig()); |
| 2886 CreateReceiverCall(recv_config); | 2963 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 | 2964 |
| 2895 // Modify send and receive configs. | 2965 task_queue_.SendTask([this, &test, &override_field_trials, &send_config, |
| 2896 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 2966 &recv_config, &encoder_config_with_screenshare]() { |
| 2897 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 2967 CreateSenderCall(send_config); |
| 2898 video_receive_configs_[0].renderer = &test; | 2968 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 | 2969 |
| 2910 CreateVideoStreams(); | 2970 receive_transport_.reset(test.CreateReceiveTransport(&task_queue_)); |
| 2911 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, | 2971 send_transport_.reset( |
| 2912 kDefaultHeight); | 2972 test.CreateSendTransport(&task_queue_, sender_call_.get())); |
| 2913 Start(); | 2973 send_transport_->SetReceiver(receiver_call_->Receiver()); |
| 2974 receive_transport_->SetReceiver(sender_call_->Receiver()); | |
| 2975 | |
| 2976 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | |
| 2977 CreateSendConfig(1, 0, 0, send_transport_.get()); | |
| 2978 CreateMatchingReceiveConfigs(receive_transport_.get()); | |
| 2979 | |
| 2980 // Modify send and receive configs. | |
| 2981 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | |
| 2982 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | |
| 2983 video_receive_configs_[0].renderer = &test; | |
| 2984 // RTT needed for RemoteNtpTimeEstimator for the receive stream. | |
| 2985 video_receive_configs_[0].rtp.rtcp_xr.receiver_reference_time_report = true; | |
| 2986 // Start with realtime video. | |
| 2987 video_encoder_config_.content_type = | |
| 2988 VideoEncoderConfig::ContentType::kRealtimeVideo; | |
| 2989 // Second encoder config for the second part of the test uses screenshare | |
| 2990 encoder_config_with_screenshare = video_encoder_config_.Copy(); | |
| 2991 encoder_config_with_screenshare.content_type = | |
| 2992 VideoEncoderConfig::ContentType::kScreen; | |
| 2993 | |
| 2994 CreateVideoStreams(); | |
| 2995 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, | |
| 2996 kDefaultHeight); | |
| 2997 Start(); | |
| 2998 }); | |
| 2914 | 2999 |
| 2915 test.PerformTest(); | 3000 test.PerformTest(); |
| 2916 | 3001 |
| 2917 // Replace old send stream. | 3002 // Replace old send stream. |
| 2918 sender_call_->DestroyVideoSendStream(video_send_stream_); | 3003 task_queue_.SendTask([this, &encoder_config_with_screenshare]() { |
| 2919 video_send_stream_ = sender_call_->CreateVideoSendStream( | 3004 sender_call_->DestroyVideoSendStream(video_send_stream_); |
| 2920 video_send_config_.Copy(), encoder_config_with_screenshare_.Copy()); | 3005 video_send_stream_ = sender_call_->CreateVideoSendStream( |
| 2921 video_send_stream_->SetSource( | 3006 video_send_config_.Copy(), encoder_config_with_screenshare.Copy()); |
| 2922 frame_generator_capturer_.get(), | 3007 video_send_stream_->SetSource( |
| 2923 VideoSendStream::DegradationPreference::kBalanced); | 3008 frame_generator_capturer_.get(), |
| 2924 video_send_stream_->Start(); | 3009 VideoSendStream::DegradationPreference::kBalanced); |
| 3010 video_send_stream_->Start(); | |
| 3011 }); | |
| 2925 | 3012 |
| 2926 // Continue to run test but now with screenshare. | 3013 // Continue to run test but now with screenshare. |
| 2927 test.PerformTest(); | 3014 test.PerformTest(); |
| 2928 | 3015 |
| 2929 send_transport_->StopSending(); | 3016 task_queue_.SendTask([this]() { |
| 2930 receive_transport_->StopSending(); | 3017 Stop(); |
| 2931 Stop(); | 3018 DestroyStreams(); |
| 2932 DestroyStreams(); | 3019 send_transport_.reset(); |
| 2933 DestroyCalls(); | 3020 receive_transport_.reset(); |
| 2934 // Delete the call for Call stats to be reported. | 3021 DestroyCalls(); |
| 2935 sender_call_.reset(); | 3022 }); |
| 2936 receiver_call_.reset(); | |
| 2937 | 3023 |
| 2938 // Verify that stats have been updated for both screenshare and video. | 3024 // Verify that stats have been updated for both screenshare and video. |
| 2939 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayInMs")); | 3025 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayInMs")); |
| 2940 EXPECT_EQ(1, | 3026 EXPECT_EQ(1, |
| 2941 metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayInMs")); | 3027 metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayInMs")); |
| 2942 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayMaxInMs")); | 3028 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayMaxInMs")); |
| 2943 EXPECT_EQ( | 3029 EXPECT_EQ( |
| 2944 1, metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayMaxInMs")); | 3030 1, metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayMaxInMs")); |
| 2945 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs")); | 3031 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs")); |
| 2946 EXPECT_EQ(1, | 3032 EXPECT_EQ(1, |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3090 VideoEncoderConfig video_encoder_config_all_streams_; | 3176 VideoEncoderConfig video_encoder_config_all_streams_; |
| 3091 } test(kVideoSendSsrcs, num_ssrcs, send_single_ssrc_first); | 3177 } test(kVideoSendSsrcs, num_ssrcs, send_single_ssrc_first); |
| 3092 | 3178 |
| 3093 RunBaseTest(&test); | 3179 RunBaseTest(&test); |
| 3094 } | 3180 } |
| 3095 | 3181 |
| 3096 TEST_F(EndToEndTest, ReportsSetEncoderRates) { | 3182 TEST_F(EndToEndTest, ReportsSetEncoderRates) { |
| 3097 class EncoderRateStatsTest : public test::EndToEndTest, | 3183 class EncoderRateStatsTest : public test::EndToEndTest, |
| 3098 public test::FakeEncoder { | 3184 public test::FakeEncoder { |
| 3099 public: | 3185 public: |
| 3100 EncoderRateStatsTest() | 3186 explicit EncoderRateStatsTest( |
| 3187 test::SingleThreadedTaskQueueForTesting* task_queue) | |
| 3101 : EndToEndTest(kDefaultTimeoutMs), | 3188 : EndToEndTest(kDefaultTimeoutMs), |
| 3102 FakeEncoder(Clock::GetRealTimeClock()), | 3189 FakeEncoder(Clock::GetRealTimeClock()), |
| 3190 task_queue_(task_queue), | |
| 3103 send_stream_(nullptr), | 3191 send_stream_(nullptr), |
| 3104 bitrate_kbps_(0) {} | 3192 bitrate_kbps_(0) {} |
| 3105 | 3193 |
| 3106 void OnVideoStreamsCreated( | 3194 void OnVideoStreamsCreated( |
| 3107 VideoSendStream* send_stream, | 3195 VideoSendStream* send_stream, |
| 3108 const std::vector<VideoReceiveStream*>& receive_streams) override { | 3196 const std::vector<VideoReceiveStream*>& receive_streams) override { |
| 3109 send_stream_ = send_stream; | 3197 send_stream_ = send_stream; |
| 3110 } | 3198 } |
| 3111 | 3199 |
| 3112 void ModifyVideoConfigs( | 3200 void ModifyVideoConfigs( |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 3124 return 0; | 3212 return 0; |
| 3125 rtc::CritScope lock(&crit_); | 3213 rtc::CritScope lock(&crit_); |
| 3126 bitrate_kbps_ = rate_allocation.get_sum_kbps(); | 3214 bitrate_kbps_ = rate_allocation.get_sum_kbps(); |
| 3127 observation_complete_.Set(); | 3215 observation_complete_.Set(); |
| 3128 return 0; | 3216 return 0; |
| 3129 } | 3217 } |
| 3130 | 3218 |
| 3131 void PerformTest() override { | 3219 void PerformTest() override { |
| 3132 ASSERT_TRUE(Wait()) | 3220 ASSERT_TRUE(Wait()) |
| 3133 << "Timed out while waiting for encoder SetRates() call."; | 3221 << "Timed out while waiting for encoder SetRates() call."; |
| 3134 WaitForEncoderTargetBitrateMatchStats(); | 3222 |
| 3135 send_stream_->Stop(); | 3223 task_queue_->SendTask([this]() { |
| 3136 WaitForStatsReportZeroTargetBitrate(); | 3224 WaitForEncoderTargetBitrateMatchStats(); |
| 3137 send_stream_->Start(); | 3225 send_stream_->Stop(); |
| 3138 WaitForEncoderTargetBitrateMatchStats(); | 3226 WaitForStatsReportZeroTargetBitrate(); |
| 3227 send_stream_->Start(); | |
| 3228 WaitForEncoderTargetBitrateMatchStats(); | |
| 3229 }); | |
| 3139 } | 3230 } |
| 3140 | 3231 |
| 3141 void WaitForEncoderTargetBitrateMatchStats() { | 3232 void WaitForEncoderTargetBitrateMatchStats() { |
| 3142 for (int i = 0; i < kDefaultTimeoutMs; ++i) { | 3233 for (int i = 0; i < kDefaultTimeoutMs; ++i) { |
| 3143 VideoSendStream::Stats stats = send_stream_->GetStats(); | 3234 VideoSendStream::Stats stats = send_stream_->GetStats(); |
| 3144 { | 3235 { |
| 3145 rtc::CritScope lock(&crit_); | 3236 rtc::CritScope lock(&crit_); |
| 3146 if ((stats.target_media_bitrate_bps + 500) / 1000 == | 3237 if ((stats.target_media_bitrate_bps + 500) / 1000 == |
| 3147 static_cast<int>(bitrate_kbps_)) { | 3238 static_cast<int>(bitrate_kbps_)) { |
| 3148 return; | 3239 return; |
| 3149 } | 3240 } |
| 3150 } | 3241 } |
| 3151 SleepMs(1); | 3242 SleepMs(1); |
| 3152 } | 3243 } |
| 3153 FAIL() | 3244 FAIL() |
| 3154 << "Timed out waiting for stats reporting the currently set bitrate."; | 3245 << "Timed out waiting for stats reporting the currently set bitrate."; |
| 3155 } | 3246 } |
| 3156 | 3247 |
| 3157 void WaitForStatsReportZeroTargetBitrate() { | 3248 void WaitForStatsReportZeroTargetBitrate() { |
| 3158 for (int i = 0; i < kDefaultTimeoutMs; ++i) { | 3249 for (int i = 0; i < kDefaultTimeoutMs; ++i) { |
| 3159 if (send_stream_->GetStats().target_media_bitrate_bps == 0) { | 3250 if (send_stream_->GetStats().target_media_bitrate_bps == 0) { |
| 3160 return; | 3251 return; |
| 3161 } | 3252 } |
| 3162 SleepMs(1); | 3253 SleepMs(1); |
| 3163 } | 3254 } |
| 3164 FAIL() << "Timed out waiting for stats reporting zero bitrate."; | 3255 FAIL() << "Timed out waiting for stats reporting zero bitrate."; |
| 3165 } | 3256 } |
| 3166 | 3257 |
| 3167 private: | 3258 private: |
| 3259 test::SingleThreadedTaskQueueForTesting* const task_queue_; | |
| 3168 rtc::CriticalSection crit_; | 3260 rtc::CriticalSection crit_; |
| 3169 VideoSendStream* send_stream_; | 3261 VideoSendStream* send_stream_; |
| 3170 uint32_t bitrate_kbps_ GUARDED_BY(crit_); | 3262 uint32_t bitrate_kbps_ GUARDED_BY(crit_); |
| 3171 } test; | 3263 } test(&task_queue_); |
| 3172 | 3264 |
| 3173 RunBaseTest(&test); | 3265 RunBaseTest(&test); |
| 3174 } | 3266 } |
| 3175 | 3267 |
| 3176 TEST_F(EndToEndTest, GetStats) { | 3268 TEST_F(EndToEndTest, GetStats) { |
| 3177 static const int kStartBitrateBps = 3000000; | 3269 static const int kStartBitrateBps = 3000000; |
| 3178 static const int kExpectedRenderDelayMs = 20; | 3270 static const int kExpectedRenderDelayMs = 20; |
| 3179 | 3271 |
| 3180 class ReceiveStreamRenderer : public rtc::VideoSinkInterface<VideoFrame> { | 3272 class ReceiveStreamRenderer : public rtc::VideoSinkInterface<VideoFrame> { |
| 3181 public: | 3273 public: |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3368 } | 3460 } |
| 3369 | 3461 |
| 3370 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) { | 3462 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) { |
| 3371 for (const auto& stat : stats_map) { | 3463 for (const auto& stat : stats_map) { |
| 3372 if (!stat.second) | 3464 if (!stat.second) |
| 3373 return false; | 3465 return false; |
| 3374 } | 3466 } |
| 3375 return true; | 3467 return true; |
| 3376 } | 3468 } |
| 3377 | 3469 |
| 3378 test::PacketTransport* CreateSendTransport(Call* sender_call) override { | 3470 test::PacketTransport* CreateSendTransport( |
| 3471 test::SingleThreadedTaskQueueForTesting* task_queue, | |
| 3472 Call* sender_call) override { | |
| 3379 FakeNetworkPipe::Config network_config; | 3473 FakeNetworkPipe::Config network_config; |
| 3380 network_config.loss_percent = 5; | 3474 network_config.loss_percent = 5; |
| 3381 return new test::PacketTransport(sender_call, this, | 3475 return new test::PacketTransport(task_queue, sender_call, this, |
| 3382 test::PacketTransport::kSender, | 3476 test::PacketTransport::kSender, |
| 3383 payload_type_map_, network_config); | 3477 payload_type_map_, network_config); |
| 3384 } | 3478 } |
| 3385 | 3479 |
| 3386 Call::Config GetSenderCallConfig() override { | 3480 Call::Config GetSenderCallConfig() override { |
| 3387 Call::Config config = EndToEndTest::GetSenderCallConfig(); | 3481 Call::Config config = EndToEndTest::GetSenderCallConfig(); |
| 3388 config.bitrate_config.start_bitrate_bps = kStartBitrateBps; | 3482 config.bitrate_config.start_bitrate_bps = kStartBitrateBps; |
| 3389 return config; | 3483 return config; |
| 3390 } | 3484 } |
| 3391 | 3485 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3476 | 3570 |
| 3477 int64_t time_until_timout_ = stop_time - now; | 3571 int64_t time_until_timout_ = stop_time - now; |
| 3478 if (time_until_timout_ > 0) | 3572 if (time_until_timout_ > 0) |
| 3479 check_stats_event_.Wait(time_until_timout_); | 3573 check_stats_event_.Wait(time_until_timout_); |
| 3480 now = clock->TimeInMilliseconds(); | 3574 now = clock->TimeInMilliseconds(); |
| 3481 } | 3575 } |
| 3482 | 3576 |
| 3483 ADD_FAILURE() << "Timed out waiting for filled stats."; | 3577 ADD_FAILURE() << "Timed out waiting for filled stats."; |
| 3484 for (std::map<std::string, bool>::const_iterator it = | 3578 for (std::map<std::string, bool>::const_iterator it = |
| 3485 receive_stats_filled_.begin(); | 3579 receive_stats_filled_.begin(); |
| 3486 it != receive_stats_filled_.end(); | 3580 it != receive_stats_filled_.end(); ++it) { |
| 3487 ++it) { | |
| 3488 if (!it->second) { | 3581 if (!it->second) { |
| 3489 ADD_FAILURE() << "Missing receive stats: " << it->first; | 3582 ADD_FAILURE() << "Missing receive stats: " << it->first; |
| 3490 } | 3583 } |
| 3491 } | 3584 } |
| 3492 | 3585 |
| 3493 for (std::map<std::string, bool>::const_iterator it = | 3586 for (std::map<std::string, bool>::const_iterator it = |
| 3494 send_stats_filled_.begin(); | 3587 send_stats_filled_.begin(); |
| 3495 it != send_stats_filled_.end(); | 3588 it != send_stats_filled_.end(); ++it) { |
| 3496 ++it) { | |
| 3497 if (!it->second) { | 3589 if (!it->second) { |
| 3498 ADD_FAILURE() << "Missing send stats: " << it->first; | 3590 ADD_FAILURE() << "Missing send stats: " << it->first; |
| 3499 } | 3591 } |
| 3500 } | 3592 } |
| 3501 } | 3593 } |
| 3502 | 3594 |
| 3503 test::DelayedEncoder encoder_; | 3595 test::DelayedEncoder encoder_; |
| 3504 std::vector<VideoReceiveStream*> receive_streams_; | 3596 std::vector<VideoReceiveStream*> receive_streams_; |
| 3505 std::map<std::string, bool> receive_stats_filled_; | 3597 std::map<std::string, bool> receive_stats_filled_; |
| 3506 | 3598 |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3975 SequenceNumberUnwrapper seq_numbers_unwrapper_; | 4067 SequenceNumberUnwrapper seq_numbers_unwrapper_; |
| 3976 std::map<uint32_t, std::list<int64_t>> last_observed_seq_numbers_; | 4068 std::map<uint32_t, std::list<int64_t>> last_observed_seq_numbers_; |
| 3977 std::map<uint32_t, uint32_t> last_observed_timestamp_; | 4069 std::map<uint32_t, uint32_t> last_observed_timestamp_; |
| 3978 std::map<uint32_t, bool> ssrc_is_rtx_; | 4070 std::map<uint32_t, bool> ssrc_is_rtx_; |
| 3979 | 4071 |
| 3980 rtc::CriticalSection crit_; | 4072 rtc::CriticalSection crit_; |
| 3981 size_t ssrcs_to_observe_ GUARDED_BY(crit_); | 4073 size_t ssrcs_to_observe_ GUARDED_BY(crit_); |
| 3982 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); | 4074 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); |
| 3983 } observer(use_rtx); | 4075 } observer(use_rtx); |
| 3984 | 4076 |
| 4077 std::unique_ptr<test::PacketTransport> send_transport; | |
| 4078 std::unique_ptr<test::PacketTransport> receive_transport; | |
| 4079 | |
| 3985 Call::Config config(event_log_.get()); | 4080 Call::Config config(event_log_.get()); |
| 3986 CreateCalls(config, config); | 4081 VideoEncoderConfig one_stream; |
| 3987 | 4082 |
| 3988 test::PacketTransport send_transport( | 4083 task_queue_.SendTask([this, &observer, &send_transport, &receive_transport, |
| 3989 sender_call_.get(), &observer, test::PacketTransport::kSender, | 4084 &config, &one_stream, use_rtx]() { |
| 3990 payload_type_map_, FakeNetworkPipe::Config()); | 4085 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 | 4086 |
| 3997 CreateSendConfig(kNumSsrcs, 0, 0, &send_transport); | 4087 send_transport = rtc::MakeUnique<test::PacketTransport>( |
| 4088 &task_queue_, sender_call_.get(), &observer, | |
| 4089 test::PacketTransport::kSender, payload_type_map_, | |
| 4090 FakeNetworkPipe::Config()); | |
| 4091 receive_transport = rtc::MakeUnique<test::PacketTransport>( | |
| 4092 &task_queue_, nullptr, &observer, test::PacketTransport::kReceiver, | |
| 4093 payload_type_map_, FakeNetworkPipe::Config()); | |
| 4094 send_transport->SetReceiver(receiver_call_->Receiver()); | |
| 4095 receive_transport->SetReceiver(sender_call_->Receiver()); | |
| 3998 | 4096 |
| 3999 if (use_rtx) { | 4097 CreateSendConfig(kNumSsrcs, 0, 0, send_transport.get()); |
| 4000 for (size_t i = 0; i < kNumSsrcs; ++i) { | 4098 |
| 4001 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); | 4099 if (use_rtx) { |
| 4100 for (size_t i = 0; i < kNumSsrcs; ++i) { | |
| 4101 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); | |
| 4102 } | |
| 4103 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; | |
| 4002 } | 4104 } |
| 4003 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; | |
| 4004 } | |
| 4005 | 4105 |
| 4006 video_encoder_config_.video_stream_factory = | 4106 video_encoder_config_.video_stream_factory = |
| 4007 new rtc::RefCountedObject<VideoStreamFactory>(); | 4107 new rtc::RefCountedObject<VideoStreamFactory>(); |
| 4008 // Use the same total bitrates when sending a single stream to avoid lowering | 4108 // Use the same total bitrates when sending a single stream to avoid |
| 4009 // the bitrate estimate and requiring a subsequent rampup. | 4109 // lowering the bitrate estimate and requiring a subsequent rampup. |
| 4010 VideoEncoderConfig one_stream = video_encoder_config_.Copy(); | 4110 one_stream = video_encoder_config_.Copy(); |
| 4011 // one_stream.streams.resize(1); | 4111 // one_stream.streams.resize(1); |
| 4012 one_stream.number_of_streams = 1; | 4112 one_stream.number_of_streams = 1; |
| 4013 CreateMatchingReceiveConfigs(&receive_transport); | 4113 CreateMatchingReceiveConfigs(receive_transport.get()); |
| 4014 | 4114 |
| 4015 CreateVideoStreams(); | 4115 CreateVideoStreams(); |
| 4016 CreateFrameGeneratorCapturer(30, 1280, 720); | 4116 CreateFrameGeneratorCapturer(30, 1280, 720); |
| 4017 | 4117 |
| 4018 Start(); | 4118 Start(); |
| 4119 }); | |
| 4120 | |
| 4019 EXPECT_TRUE(observer.Wait()) | 4121 EXPECT_TRUE(observer.Wait()) |
| 4020 << "Timed out waiting for all SSRCs to send packets."; | 4122 << "Timed out waiting for all SSRCs to send packets."; |
| 4021 | 4123 |
| 4022 // Test stream resetting more than once to make sure that the state doesn't | 4124 // 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). | 4125 // get set once (this could be due to using std::map::insert for instance). |
| 4024 for (size_t i = 0; i < 3; ++i) { | 4126 for (size_t i = 0; i < 3; ++i) { |
| 4025 frame_generator_capturer_->Stop(); | 4127 task_queue_.SendTask([&]() { |
| 4026 sender_call_->DestroyVideoSendStream(video_send_stream_); | 4128 frame_generator_capturer_->Stop(); |
| 4129 sender_call_->DestroyVideoSendStream(video_send_stream_); | |
| 4027 | 4130 |
| 4028 // Re-create VideoSendStream with only one stream. | 4131 // Re-create VideoSendStream with only one stream. |
| 4029 video_send_stream_ = sender_call_->CreateVideoSendStream( | 4132 video_send_stream_ = sender_call_->CreateVideoSendStream( |
| 4030 video_send_config_.Copy(), one_stream.Copy()); | 4133 video_send_config_.Copy(), one_stream.Copy()); |
| 4031 video_send_stream_->Start(); | 4134 video_send_stream_->Start(); |
| 4032 if (provoke_rtcpsr_before_rtp) { | 4135 if (provoke_rtcpsr_before_rtp) { |
| 4033 // Rapid Resync Request forces sending RTCP Sender Report back. | 4136 // Rapid Resync Request forces sending RTCP Sender Report back. |
| 4034 // Using this request speeds up this test because then there is no need | 4137 // Using this request speeds up this test because then there is no need |
| 4035 // to wait for a second for periodic Sender Report. | 4138 // to wait for a second for periodic Sender Report. |
| 4036 rtcp::RapidResyncRequest force_send_sr_back_request; | 4139 rtcp::RapidResyncRequest force_send_sr_back_request; |
| 4037 rtc::Buffer packet = force_send_sr_back_request.Build(); | 4140 rtc::Buffer packet = force_send_sr_back_request.Build(); |
| 4038 static_cast<webrtc::test::DirectTransport&>(receive_transport) | 4141 static_cast<webrtc::test::DirectTransport*>(receive_transport.get()) |
| 4039 .SendRtcp(packet.data(), packet.size()); | 4142 ->SendRtcp(packet.data(), packet.size()); |
| 4040 } | 4143 } |
| 4041 CreateFrameGeneratorCapturer(30, 1280, 720); | 4144 CreateFrameGeneratorCapturer(30, 1280, 720); |
| 4042 frame_generator_capturer_->Start(); | 4145 frame_generator_capturer_->Start(); |
| 4146 }); | |
| 4043 | 4147 |
| 4044 observer.ResetExpectedSsrcs(1); | 4148 observer.ResetExpectedSsrcs(1); |
| 4045 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; | 4149 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; |
| 4046 | 4150 |
| 4047 // Reconfigure back to use all streams. | 4151 // Reconfigure back to use all streams. |
| 4048 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy()); | 4152 task_queue_.SendTask([this]() { |
| 4153 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy()); | |
| 4154 }); | |
| 4049 observer.ResetExpectedSsrcs(kNumSsrcs); | 4155 observer.ResetExpectedSsrcs(kNumSsrcs); |
| 4050 EXPECT_TRUE(observer.Wait()) | 4156 EXPECT_TRUE(observer.Wait()) |
| 4051 << "Timed out waiting for all SSRCs to send packets."; | 4157 << "Timed out waiting for all SSRCs to send packets."; |
| 4052 | 4158 |
| 4053 // Reconfigure down to one stream. | 4159 // Reconfigure down to one stream. |
| 4054 video_send_stream_->ReconfigureVideoEncoder(one_stream.Copy()); | 4160 task_queue_.SendTask([this, &one_stream]() { |
| 4161 video_send_stream_->ReconfigureVideoEncoder(one_stream.Copy()); | |
| 4162 }); | |
| 4055 observer.ResetExpectedSsrcs(1); | 4163 observer.ResetExpectedSsrcs(1); |
| 4056 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; | 4164 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet."; |
| 4057 | 4165 |
| 4058 // Reconfigure back to use all streams. | 4166 // Reconfigure back to use all streams. |
| 4059 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy()); | 4167 task_queue_.SendTask([this]() { |
| 4168 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy()); | |
| 4169 }); | |
| 4060 observer.ResetExpectedSsrcs(kNumSsrcs); | 4170 observer.ResetExpectedSsrcs(kNumSsrcs); |
| 4061 EXPECT_TRUE(observer.Wait()) | 4171 EXPECT_TRUE(observer.Wait()) |
| 4062 << "Timed out waiting for all SSRCs to send packets."; | 4172 << "Timed out waiting for all SSRCs to send packets."; |
| 4063 } | 4173 } |
| 4064 | 4174 |
| 4065 send_transport.StopSending(); | 4175 task_queue_.SendTask([this, &send_transport, &receive_transport]() { |
| 4066 receive_transport.StopSending(); | 4176 Stop(); |
| 4067 | 4177 DestroyStreams(); |
| 4068 Stop(); | 4178 send_transport.reset(); |
| 4069 DestroyStreams(); | 4179 receive_transport.reset(); |
| 4180 DestroyCalls(); | |
| 4181 }); | |
| 4070 } | 4182 } |
| 4071 | 4183 |
| 4072 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { | 4184 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) { |
| 4073 TestRtpStatePreservation(false, false); | 4185 TestRtpStatePreservation(false, false); |
| 4074 } | 4186 } |
| 4075 | 4187 |
| 4076 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { | 4188 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { |
| 4077 TestRtpStatePreservation(true, false); | 4189 TestRtpStatePreservation(true, false); |
| 4078 } | 4190 } |
| 4079 | 4191 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4150 | 4262 |
| 4151 return SEND_PACKET; | 4263 return SEND_PACKET; |
| 4152 } | 4264 } |
| 4153 | 4265 |
| 4154 rtc::Optional<uint16_t> last_observed_sequence_number_ GUARDED_BY(crit_); | 4266 rtc::Optional<uint16_t> last_observed_sequence_number_ GUARDED_BY(crit_); |
| 4155 rtc::Optional<uint32_t> last_observed_timestamp_ GUARDED_BY(crit_); | 4267 rtc::Optional<uint32_t> last_observed_timestamp_ GUARDED_BY(crit_); |
| 4156 size_t num_flexfec_packets_sent_ GUARDED_BY(crit_); | 4268 size_t num_flexfec_packets_sent_ GUARDED_BY(crit_); |
| 4157 rtc::CriticalSection crit_; | 4269 rtc::CriticalSection crit_; |
| 4158 } observer; | 4270 } observer; |
| 4159 | 4271 |
| 4272 constexpr int kFrameMaxWidth = 320; | |
| 4273 constexpr int kFrameMaxHeight = 180; | |
| 4274 constexpr int kFrameRate = 15; | |
| 4275 | |
| 4160 Call::Config config(event_log_.get()); | 4276 Call::Config config(event_log_.get()); |
| 4161 CreateCalls(config, config); | |
| 4162 | 4277 |
| 4163 FakeNetworkPipe::Config lossy_delayed_link; | 4278 std::unique_ptr<test::PacketTransport> send_transport; |
| 4164 lossy_delayed_link.loss_percent = 2; | 4279 std::unique_ptr<test::PacketTransport> receive_transport; |
| 4165 lossy_delayed_link.queue_delay_ms = 50; | 4280 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 | 4281 |
| 4171 FakeNetworkPipe::Config flawless_link; | 4282 task_queue_.SendTask([&]() { |
| 4172 test::PacketTransport receive_transport(nullptr, &observer, | 4283 CreateCalls(config, config); |
| 4173 test::PacketTransport::kReceiver, | |
| 4174 payload_type_map_, flawless_link); | |
| 4175 receive_transport.SetReceiver(sender_call_->Receiver()); | |
| 4176 | 4284 |
| 4177 // For reduced flakyness, we use a real VP8 encoder together with NACK | 4285 FakeNetworkPipe::Config lossy_delayed_link; |
| 4178 // and RTX. | 4286 lossy_delayed_link.loss_percent = 2; |
| 4179 const int kNumVideoStreams = 1; | 4287 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 | 4288 |
| 4190 CreateMatchingReceiveConfigs(&receive_transport); | 4289 send_transport = rtc::MakeUnique<test::PacketTransport>( |
| 4191 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 4290 &task_queue_, sender_call_.get(), &observer, |
| 4192 video_receive_configs_[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; | 4291 test::PacketTransport::kSender, payload_type_map_, lossy_delayed_link); |
| 4193 video_receive_configs_[0].rtp.rtx_payload_types[kVideoSendPayloadType] = | 4292 send_transport->SetReceiver(receiver_call_->Receiver()); |
| 4194 kSendRtxPayloadType; | |
| 4195 | 4293 |
| 4196 // The matching FlexFEC receive config is not created by | 4294 FakeNetworkPipe::Config flawless_link; |
| 4197 // CreateMatchingReceiveConfigs since this is not a test::BaseTest. | 4295 receive_transport = rtc::MakeUnique<test::PacketTransport>( |
| 4198 // Set up the receive config manually instead. | 4296 &task_queue_, nullptr, &observer, test::PacketTransport::kReceiver, |
| 4199 FlexfecReceiveStream::Config flexfec_receive_config(&receive_transport); | 4297 payload_type_map_, flawless_link); |
| 4200 flexfec_receive_config.payload_type = | 4298 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 | 4299 |
| 4212 CreateFlexfecStreams(); | 4300 // For reduced flakyness, we use a real VP8 encoder together with NACK |
| 4213 CreateVideoStreams(); | 4301 // and RTX. |
| 4302 const int kNumVideoStreams = 1; | |
| 4303 const int kNumFlexfecStreams = 1; | |
| 4304 CreateSendConfig(kNumVideoStreams, 0, kNumFlexfecStreams, | |
| 4305 send_transport.get()); | |
| 4306 encoder = rtc::WrapUnique(VP8Encoder::Create()); | |
| 4307 video_send_config_.encoder_settings.encoder = encoder.get(); | |
| 4308 video_send_config_.encoder_settings.payload_name = "VP8"; | |
| 4309 video_send_config_.encoder_settings.payload_type = kVideoSendPayloadType; | |
| 4310 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | |
| 4311 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); | |
| 4312 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; | |
| 4214 | 4313 |
| 4215 // RTCP might be disabled if the network is "down". | 4314 CreateMatchingReceiveConfigs(receive_transport.get()); |
| 4216 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | 4315 video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 4217 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | 4316 video_receive_configs_[0].rtp.rtx_ssrc = kSendRtxSsrcs[0]; |
| 4317 video_receive_configs_[0].rtp.rtx_payload_types[kVideoSendPayloadType] = | |
| 4318 kSendRtxPayloadType; | |
| 4218 | 4319 |
| 4219 const int kFrameMaxWidth = 320; | 4320 // The matching FlexFEC receive config is not created by |
| 4220 const int kFrameMaxHeight = 180; | 4321 // CreateMatchingReceiveConfigs since this is not a test::BaseTest. |
| 4221 const int kFrameRate = 15; | 4322 // Set up the receive config manually instead. |
| 4222 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); | 4323 FlexfecReceiveStream::Config flexfec_receive_config( |
| 4324 receive_transport.get()); | |
| 4325 flexfec_receive_config.payload_type = | |
| 4326 video_send_config_.rtp.flexfec.payload_type; | |
| 4327 flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc; | |
| 4328 flexfec_receive_config.protected_media_ssrcs = | |
| 4329 video_send_config_.rtp.flexfec.protected_media_ssrcs; | |
| 4330 flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc; | |
| 4331 flexfec_receive_config.transport_cc = true; | |
| 4332 flexfec_receive_config.rtp_header_extensions.emplace_back( | |
| 4333 RtpExtension::kTransportSequenceNumberUri, | |
| 4334 test::kTransportSequenceNumberExtensionId); | |
| 4335 flexfec_receive_configs_.push_back(flexfec_receive_config); | |
| 4336 | |
| 4337 CreateFlexfecStreams(); | |
| 4338 CreateVideoStreams(); | |
| 4339 | |
| 4340 // RTCP might be disabled if the network is "down". | |
| 4341 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | |
| 4342 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); | |
| 4343 | |
| 4344 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); | |
| 4345 | |
| 4346 Start(); | |
| 4347 }); | |
| 4223 | 4348 |
| 4224 // Initial test. | 4349 // Initial test. |
| 4225 Start(); | |
| 4226 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; | 4350 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; |
| 4227 | 4351 |
| 4228 // Ensure monotonicity when the VideoSendStream is restarted. | 4352 task_queue_.SendTask([this, &observer]() { |
| 4229 Stop(); | 4353 // Ensure monotonicity when the VideoSendStream is restarted. |
| 4230 observer.ResetPacketCount(); | 4354 Stop(); |
| 4231 Start(); | 4355 observer.ResetPacketCount(); |
| 4356 Start(); | |
| 4357 }); | |
| 4358 | |
| 4232 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; | 4359 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; |
| 4233 | 4360 |
| 4234 // Ensure monotonicity when the VideoSendStream is recreated. | 4361 task_queue_.SendTask([this, &observer]() { |
| 4235 frame_generator_capturer_->Stop(); | 4362 // Ensure monotonicity when the VideoSendStream is recreated. |
| 4236 sender_call_->DestroyVideoSendStream(video_send_stream_); | 4363 frame_generator_capturer_->Stop(); |
| 4237 observer.ResetPacketCount(); | 4364 sender_call_->DestroyVideoSendStream(video_send_stream_); |
| 4238 video_send_stream_ = sender_call_->CreateVideoSendStream( | 4365 observer.ResetPacketCount(); |
| 4239 video_send_config_.Copy(), video_encoder_config_.Copy()); | 4366 video_send_stream_ = sender_call_->CreateVideoSendStream( |
| 4240 video_send_stream_->Start(); | 4367 video_send_config_.Copy(), video_encoder_config_.Copy()); |
| 4241 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); | 4368 video_send_stream_->Start(); |
| 4242 frame_generator_capturer_->Start(); | 4369 CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight); |
| 4370 frame_generator_capturer_->Start(); | |
| 4371 }); | |
| 4372 | |
| 4243 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; | 4373 EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets."; |
| 4244 | 4374 |
| 4245 // Cleanup. | 4375 // Cleanup. |
| 4246 send_transport.StopSending(); | 4376 task_queue_.SendTask([this, &send_transport, &receive_transport]() { |
| 4247 receive_transport.StopSending(); | 4377 Stop(); |
| 4248 Stop(); | 4378 DestroyStreams(); |
| 4249 DestroyStreams(); | 4379 send_transport.reset(); |
| 4380 receive_transport.reset(); | |
| 4381 DestroyCalls(); | |
| 4382 }); | |
| 4250 } | 4383 } |
| 4251 | 4384 |
| 4252 TEST_F(EndToEndTest, RespectsNetworkState) { | 4385 TEST_F(EndToEndTest, RespectsNetworkState) { |
| 4253 // TODO(pbos): Remove accepted downtime packets etc. when signaling network | 4386 // TODO(pbos): Remove accepted downtime packets etc. when signaling network |
| 4254 // down blocks until no more packets will be sent. | 4387 // down blocks until no more packets will be sent. |
| 4255 | 4388 |
| 4256 // Pacer will send from its packet list and then send required padding before | 4389 // 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, | 4390 // checking paused_ again. This should be enough for one round of pacing, |
| 4258 // otherwise increase. | 4391 // otherwise increase. |
| 4259 static const int kNumAcceptedDowntimeRtp = 5; | 4392 static const int kNumAcceptedDowntimeRtp = 5; |
| 4260 // A single RTCP may be in the pipeline. | 4393 // A single RTCP may be in the pipeline. |
| 4261 static const int kNumAcceptedDowntimeRtcp = 1; | 4394 static const int kNumAcceptedDowntimeRtcp = 1; |
| 4262 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder { | 4395 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder { |
| 4263 public: | 4396 public: |
| 4264 NetworkStateTest() | 4397 explicit NetworkStateTest( |
| 4398 test::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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 Loading... | |
| 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::SingleThreadedTaskQueueForTesting* 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 Loading... | |
| 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 |
| OLD | NEW |