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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 ADD_FAILURE() << "Unexpected RTP sent."; | 69 ADD_FAILURE() << "Unexpected RTP sent."; |
70 return false; | 70 return false; |
71 } | 71 } |
72 | 72 |
73 bool SendRtcp(const uint8_t* packet, size_t length) override { | 73 bool SendRtcp(const uint8_t* packet, size_t length) override { |
74 ADD_FAILURE() << "Unexpected RTCP sent."; | 74 ADD_FAILURE() << "Unexpected RTCP sent."; |
75 return false; | 75 return false; |
76 } | 76 } |
77 }; | 77 }; |
78 | 78 |
| 79 class RequiredTransport : public Transport { |
| 80 public: |
| 81 RequiredTransport(bool rtp_required, bool rtcp_required) |
| 82 : need_rtp_(rtp_required), need_rtcp_(rtcp_required) {} |
| 83 ~RequiredTransport() { |
| 84 if (need_rtp_) { |
| 85 ADD_FAILURE() << "Expected RTP packet not sent."; |
| 86 } |
| 87 if (need_rtcp_) { |
| 88 ADD_FAILURE() << "Expected RTCP packet not sent."; |
| 89 } |
| 90 } |
| 91 |
| 92 private: |
| 93 bool SendRtp(const uint8_t* packet, |
| 94 size_t length, |
| 95 const PacketOptions& options) override { |
| 96 need_rtp_ = false; |
| 97 return true; |
| 98 } |
| 99 |
| 100 bool SendRtcp(const uint8_t* packet, size_t length) override { |
| 101 need_rtcp_ = false; |
| 102 return true; |
| 103 } |
| 104 bool need_rtp_; |
| 105 bool need_rtcp_; |
| 106 }; |
| 107 |
79 void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red); | 108 void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red); |
80 void ReceivesPliAndRecovers(int rtp_history_ms); | 109 void ReceivesPliAndRecovers(int rtp_history_ms); |
81 void RespectsRtcpMode(RtcpMode rtcp_mode); | 110 void RespectsRtcpMode(RtcpMode rtcp_mode); |
82 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); | 111 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); |
83 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); | 112 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); |
84 void TestRtpStatePreservation(bool use_rtx); | 113 void TestRtpStatePreservation(bool use_rtx); |
85 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); | 114 void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare); |
| 115 void VerifyNewVideoSendStreamsRespectNetworkState( |
| 116 MediaType network_to_bring_down, |
| 117 VideoEncoder* encoder, |
| 118 Transport* transport); |
| 119 void VerifyNewVideoReceiveStreamsRespectNetworkState( |
| 120 MediaType network_to_bring_down, |
| 121 Transport* transport); |
86 }; | 122 }; |
87 | 123 |
88 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { | 124 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { |
89 CreateCalls(Call::Config(), Call::Config()); | 125 CreateCalls(Call::Config(), Call::Config()); |
90 | 126 |
91 test::NullTransport transport; | 127 test::NullTransport transport; |
92 CreateSendConfig(1, 0, &transport); | 128 CreateSendConfig(1, 0, &transport); |
93 CreateMatchingReceiveConfigs(&transport); | 129 CreateMatchingReceiveConfigs(&transport); |
94 | 130 |
95 CreateVideoStreams(); | 131 CreateVideoStreams(); |
(...skipping 3116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3212 VideoEncoderConfig* encoder_config) override { | 3248 VideoEncoderConfig* encoder_config) override { |
3213 send_config->encoder_settings.encoder = this; | 3249 send_config->encoder_settings.encoder = this; |
3214 } | 3250 } |
3215 | 3251 |
3216 void PerformTest() override { | 3252 void PerformTest() override { |
3217 EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs)) | 3253 EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs)) |
3218 << "No frames received by the encoder."; | 3254 << "No frames received by the encoder."; |
3219 // Wait for packets from both sender/receiver. | 3255 // Wait for packets from both sender/receiver. |
3220 WaitForPacketsOrSilence(false, false); | 3256 WaitForPacketsOrSilence(false, false); |
3221 | 3257 |
| 3258 // Sender-side network down for audio; there should be no effect on video |
| 3259 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown); |
| 3260 WaitForPacketsOrSilence(false, false); |
| 3261 |
| 3262 // Receiver-side network down for audio; no change expected |
| 3263 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown); |
| 3264 WaitForPacketsOrSilence(false, false); |
| 3265 |
3222 // Sender-side network down. | 3266 // Sender-side network down. |
3223 sender_call_->SignalNetworkState(kNetworkDown); | 3267 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown); |
3224 { | 3268 { |
3225 rtc::CritScope lock(&test_crit_); | 3269 rtc::CritScope lock(&test_crit_); |
3226 // After network goes down we shouldn't be encoding more frames. | 3270 // After network goes down we shouldn't be encoding more frames. |
3227 sender_state_ = kNetworkDown; | 3271 sender_state_ = kNetworkDown; |
3228 } | 3272 } |
3229 // Wait for receiver-packets and no sender packets. | 3273 // Wait for receiver-packets and no sender packets. |
3230 WaitForPacketsOrSilence(true, false); | 3274 WaitForPacketsOrSilence(true, false); |
3231 | 3275 |
3232 // Receiver-side network down. | 3276 // Receiver-side network down. |
3233 receiver_call_->SignalNetworkState(kNetworkDown); | 3277 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown); |
| 3278 WaitForPacketsOrSilence(true, true); |
| 3279 |
| 3280 // Network up for audio for both sides; video is still not expected to |
| 3281 // start |
| 3282 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); |
| 3283 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); |
3234 WaitForPacketsOrSilence(true, true); | 3284 WaitForPacketsOrSilence(true, true); |
3235 | 3285 |
3236 // Network back up again for both. | 3286 // Network back up again for both. |
3237 { | 3287 { |
3238 rtc::CritScope lock(&test_crit_); | 3288 rtc::CritScope lock(&test_crit_); |
3239 // It's OK to encode frames again, as we're about to bring up the | 3289 // It's OK to encode frames again, as we're about to bring up the |
3240 // network. | 3290 // network. |
3241 sender_state_ = kNetworkUp; | 3291 sender_state_ = kNetworkUp; |
3242 } | 3292 } |
3243 sender_call_->SignalNetworkState(kNetworkUp); | 3293 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); |
3244 receiver_call_->SignalNetworkState(kNetworkUp); | 3294 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); |
3245 WaitForPacketsOrSilence(false, false); | 3295 WaitForPacketsOrSilence(false, false); |
| 3296 |
| 3297 // TODO(skvlad): add tests to verify that the audio streams are stopped |
| 3298 // when the network goes down for audio once the workaround in |
| 3299 // paced_sender.cc is removed. |
3246 } | 3300 } |
3247 | 3301 |
3248 int32_t Encode(const VideoFrame& input_image, | 3302 int32_t Encode(const VideoFrame& input_image, |
3249 const CodecSpecificInfo* codec_specific_info, | 3303 const CodecSpecificInfo* codec_specific_info, |
3250 const std::vector<FrameType>* frame_types) override { | 3304 const std::vector<FrameType>* frame_types) override { |
3251 { | 3305 { |
3252 rtc::CritScope lock(&test_crit_); | 3306 rtc::CritScope lock(&test_crit_); |
3253 if (sender_state_ == kNetworkDown) { | 3307 if (sender_state_ == kNetworkDown) { |
3254 ++down_frames_; | 3308 ++down_frames_; |
3255 EXPECT_LE(down_frames_, 1) | 3309 EXPECT_LE(down_frames_, 1) |
(...skipping 30 matching lines...) Expand all Loading... |
3286 ASSERT_LE(sender_rtp_ - initial_sender_rtp, kNumAcceptedDowntimeRtp) | 3340 ASSERT_LE(sender_rtp_ - initial_sender_rtp, kNumAcceptedDowntimeRtp) |
3287 << "RTP sent during sender-side downtime."; | 3341 << "RTP sent during sender-side downtime."; |
3288 ASSERT_LE(sender_rtcp_ - initial_sender_rtcp, | 3342 ASSERT_LE(sender_rtcp_ - initial_sender_rtcp, |
3289 kNumAcceptedDowntimeRtcp) | 3343 kNumAcceptedDowntimeRtcp) |
3290 << "RTCP sent during sender-side downtime."; | 3344 << "RTCP sent during sender-side downtime."; |
3291 if (time_now_ms - initial_time_ms >= | 3345 if (time_now_ms - initial_time_ms >= |
3292 static_cast<int64_t>(kSilenceTimeoutMs)) { | 3346 static_cast<int64_t>(kSilenceTimeoutMs)) { |
3293 sender_done = true; | 3347 sender_done = true; |
3294 } | 3348 } |
3295 } else { | 3349 } else { |
3296 if (sender_rtp_ > initial_sender_rtp) | 3350 if (sender_rtp_ > initial_sender_rtp + kNumAcceptedDowntimeRtp) |
3297 sender_done = true; | 3351 sender_done = true; |
3298 } | 3352 } |
3299 if (receiver_down) { | 3353 if (receiver_down) { |
3300 ASSERT_LE(receiver_rtcp_ - initial_receiver_rtcp, | 3354 ASSERT_LE(receiver_rtcp_ - initial_receiver_rtcp, |
3301 kNumAcceptedDowntimeRtcp) | 3355 kNumAcceptedDowntimeRtcp) |
3302 << "RTCP sent during receiver-side downtime."; | 3356 << "RTCP sent during receiver-side downtime."; |
3303 if (time_now_ms - initial_time_ms >= | 3357 if (time_now_ms - initial_time_ms >= |
3304 static_cast<int64_t>(kSilenceTimeoutMs)) { | 3358 static_cast<int64_t>(kSilenceTimeoutMs)) { |
3305 receiver_done = true; | 3359 receiver_done = true; |
3306 } | 3360 } |
3307 } else { | 3361 } else { |
3308 if (receiver_rtcp_ > initial_receiver_rtcp) | 3362 if (receiver_rtcp_ > initial_receiver_rtcp + kNumAcceptedDowntimeRtcp) |
3309 receiver_done = true; | 3363 receiver_done = true; |
3310 } | 3364 } |
3311 } | 3365 } |
3312 } | 3366 } |
3313 | 3367 |
3314 rtc::CriticalSection test_crit_; | 3368 rtc::CriticalSection test_crit_; |
3315 rtc::Event encoded_frames_; | 3369 rtc::Event encoded_frames_; |
3316 rtc::Event packet_event_; | 3370 rtc::Event packet_event_; |
3317 Call* sender_call_; | 3371 Call* sender_call_; |
3318 Call* receiver_call_; | 3372 Call* receiver_call_; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3357 EXPECT_GE(stats.rtt_ms, kSendDelayMs + kReceiveDelayMs); | 3411 EXPECT_GE(stats.rtt_ms, kSendDelayMs + kReceiveDelayMs); |
3358 break; | 3412 break; |
3359 } | 3413 } |
3360 SleepMs(10); | 3414 SleepMs(10); |
3361 } | 3415 } |
3362 | 3416 |
3363 Stop(); | 3417 Stop(); |
3364 DestroyStreams(); | 3418 DestroyStreams(); |
3365 } | 3419 } |
3366 | 3420 |
3367 TEST_F(EndToEndTest, NewSendStreamsRespectNetworkDown) { | 3421 void EndToEndTest::VerifyNewVideoSendStreamsRespectNetworkState( |
3368 class UnusedEncoder : public test::FakeEncoder { | 3422 MediaType network_to_bring_down, |
3369 public: | 3423 VideoEncoder* encoder, |
3370 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {} | 3424 Transport* transport) { |
3371 int32_t Encode(const VideoFrame& input_image, | 3425 CreateSenderCall(Call::Config()); |
3372 const CodecSpecificInfo* codec_specific_info, | 3426 sender_call_->SignalChannelNetworkState(network_to_bring_down, kNetworkDown); |
3373 const std::vector<FrameType>* frame_types) override { | |
3374 ADD_FAILURE() << "Unexpected frame encode."; | |
3375 return test::FakeEncoder::Encode( | |
3376 input_image, codec_specific_info, frame_types); | |
3377 } | |
3378 }; | |
3379 | 3427 |
3380 CreateSenderCall(Call::Config()); | 3428 CreateSendConfig(1, 0, transport); |
3381 sender_call_->SignalNetworkState(kNetworkDown); | 3429 video_send_config_.encoder_settings.encoder = encoder; |
3382 | |
3383 UnusedTransport transport; | |
3384 CreateSendConfig(1, 0, &transport); | |
3385 UnusedEncoder unused_encoder; | |
3386 video_send_config_.encoder_settings.encoder = &unused_encoder; | |
3387 CreateVideoStreams(); | 3430 CreateVideoStreams(); |
3388 CreateFrameGeneratorCapturer(); | 3431 CreateFrameGeneratorCapturer(); |
3389 | 3432 |
3390 Start(); | 3433 Start(); |
3391 SleepMs(kSilenceTimeoutMs); | 3434 SleepMs(kSilenceTimeoutMs); |
3392 Stop(); | 3435 Stop(); |
3393 | 3436 |
3394 DestroyStreams(); | 3437 DestroyStreams(); |
3395 } | 3438 } |
3396 | 3439 |
3397 TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { | 3440 void EndToEndTest::VerifyNewVideoReceiveStreamsRespectNetworkState( |
| 3441 MediaType network_to_bring_down, |
| 3442 Transport* transport) { |
3398 CreateCalls(Call::Config(), Call::Config()); | 3443 CreateCalls(Call::Config(), Call::Config()); |
3399 receiver_call_->SignalNetworkState(kNetworkDown); | 3444 receiver_call_->SignalChannelNetworkState(network_to_bring_down, |
| 3445 kNetworkDown); |
3400 | 3446 |
3401 test::DirectTransport sender_transport(sender_call_.get()); | 3447 test::DirectTransport sender_transport(sender_call_.get()); |
3402 sender_transport.SetReceiver(receiver_call_->Receiver()); | 3448 sender_transport.SetReceiver(receiver_call_->Receiver()); |
3403 CreateSendConfig(1, 0, &sender_transport); | 3449 CreateSendConfig(1, 0, &sender_transport); |
3404 UnusedTransport transport; | 3450 CreateMatchingReceiveConfigs(transport); |
3405 CreateMatchingReceiveConfigs(&transport); | |
3406 CreateVideoStreams(); | 3451 CreateVideoStreams(); |
3407 CreateFrameGeneratorCapturer(); | 3452 CreateFrameGeneratorCapturer(); |
3408 | 3453 |
3409 Start(); | 3454 Start(); |
3410 SleepMs(kSilenceTimeoutMs); | 3455 SleepMs(kSilenceTimeoutMs); |
3411 Stop(); | 3456 Stop(); |
3412 | 3457 |
3413 sender_transport.StopSending(); | 3458 sender_transport.StopSending(); |
3414 | 3459 |
3415 DestroyStreams(); | 3460 DestroyStreams(); |
3416 } | 3461 } |
3417 | 3462 |
| 3463 TEST_F(EndToEndTest, NewVideoSendStreamsRespectVideoNetworkDown) { |
| 3464 class UnusedEncoder : public test::FakeEncoder { |
| 3465 public: |
| 3466 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {} |
| 3467 int32_t Encode(const VideoFrame& input_image, |
| 3468 const CodecSpecificInfo* codec_specific_info, |
| 3469 const std::vector<FrameType>* frame_types) override { |
| 3470 ADD_FAILURE() << "Unexpected frame encode."; |
| 3471 return test::FakeEncoder::Encode(input_image, codec_specific_info, |
| 3472 frame_types); |
| 3473 } |
| 3474 }; |
| 3475 |
| 3476 UnusedEncoder unused_encoder; |
| 3477 UnusedTransport unused_transport; |
| 3478 VerifyNewVideoSendStreamsRespectNetworkState( |
| 3479 MediaType::VIDEO, &unused_encoder, &unused_transport); |
| 3480 } |
| 3481 |
| 3482 TEST_F(EndToEndTest, NewVideoSendStreamsIgnoreAudioNetworkDown) { |
| 3483 class RequiredEncoder : public test::FakeEncoder { |
| 3484 public: |
| 3485 RequiredEncoder() |
| 3486 : FakeEncoder(Clock::GetRealTimeClock()), encoded_frame_(false) {} |
| 3487 ~RequiredEncoder() { |
| 3488 if (!encoded_frame_) { |
| 3489 ADD_FAILURE() << "Didn't encode an expected frame"; |
| 3490 } |
| 3491 } |
| 3492 int32_t Encode(const VideoFrame& input_image, |
| 3493 const CodecSpecificInfo* codec_specific_info, |
| 3494 const std::vector<FrameType>* frame_types) override { |
| 3495 encoded_frame_ = true; |
| 3496 return test::FakeEncoder::Encode(input_image, codec_specific_info, |
| 3497 frame_types); |
| 3498 } |
| 3499 |
| 3500 private: |
| 3501 bool encoded_frame_; |
| 3502 }; |
| 3503 |
| 3504 RequiredTransport required_transport(true /*rtp*/, false /*rtcp*/); |
| 3505 RequiredEncoder required_encoder; |
| 3506 VerifyNewVideoSendStreamsRespectNetworkState( |
| 3507 MediaType::AUDIO, &required_encoder, &required_transport); |
| 3508 } |
| 3509 |
| 3510 TEST_F(EndToEndTest, NewVideoReceiveStreamsRespectVideoNetworkDown) { |
| 3511 UnusedTransport transport; |
| 3512 VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::VIDEO, &transport); |
| 3513 } |
| 3514 |
| 3515 TEST_F(EndToEndTest, NewVideoReceiveStreamsIgnoreAudioNetworkDown) { |
| 3516 RequiredTransport transport(false /*rtp*/, true /*rtcp*/); |
| 3517 VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::AUDIO, &transport); |
| 3518 } |
| 3519 |
3418 void VerifyEmptyNackConfig(const NackConfig& config) { | 3520 void VerifyEmptyNackConfig(const NackConfig& config) { |
3419 EXPECT_EQ(0, config.rtp_history_ms) | 3521 EXPECT_EQ(0, config.rtp_history_ms) |
3420 << "Enabling NACK requires rtcp-fb: nack negotiation."; | 3522 << "Enabling NACK requires rtcp-fb: nack negotiation."; |
3421 } | 3523 } |
3422 | 3524 |
3423 void VerifyEmptyFecConfig(const FecConfig& config) { | 3525 void VerifyEmptyFecConfig(const FecConfig& config) { |
3424 EXPECT_EQ(-1, config.ulpfec_payload_type) | 3526 EXPECT_EQ(-1, config.ulpfec_payload_type) |
3425 << "Enabling FEC requires rtpmap: ulpfec negotiation."; | 3527 << "Enabling FEC requires rtpmap: ulpfec negotiation."; |
3426 EXPECT_EQ(-1, config.red_payload_type) | 3528 EXPECT_EQ(-1, config.red_payload_type) |
3427 << "Enabling FEC requires rtpmap: red negotiation."; | 3529 << "Enabling FEC requires rtpmap: red negotiation."; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3526 private: | 3628 private: |
3527 bool video_observed_; | 3629 bool video_observed_; |
3528 bool audio_observed_; | 3630 bool audio_observed_; |
3529 SequenceNumberUnwrapper unwrapper_; | 3631 SequenceNumberUnwrapper unwrapper_; |
3530 std::set<int64_t> received_packet_ids_; | 3632 std::set<int64_t> received_packet_ids_; |
3531 } test; | 3633 } test; |
3532 | 3634 |
3533 RunBaseTest(&test); | 3635 RunBaseTest(&test); |
3534 } | 3636 } |
3535 } // namespace webrtc | 3637 } // namespace webrtc |
OLD | NEW |