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...) 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 3090 matching lines...) Loading... |
3186 VideoEncoderConfig* encoder_config) override { | 3222 VideoEncoderConfig* encoder_config) override { |
3187 send_config->encoder_settings.encoder = this; | 3223 send_config->encoder_settings.encoder = this; |
3188 } | 3224 } |
3189 | 3225 |
3190 void PerformTest() override { | 3226 void PerformTest() override { |
3191 EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs)) | 3227 EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs)) |
3192 << "No frames received by the encoder."; | 3228 << "No frames received by the encoder."; |
3193 // Wait for packets from both sender/receiver. | 3229 // Wait for packets from both sender/receiver. |
3194 WaitForPacketsOrSilence(false, false); | 3230 WaitForPacketsOrSilence(false, false); |
3195 | 3231 |
| 3232 // Sender-side network down for audio; there should be no effect on video |
| 3233 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown); |
| 3234 WaitForPacketsOrSilence(false, false); |
| 3235 |
| 3236 // Receiver-side network down for audio; no change expected |
| 3237 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown); |
| 3238 WaitForPacketsOrSilence(false, false); |
| 3239 |
3196 // Sender-side network down. | 3240 // Sender-side network down. |
3197 sender_call_->SignalNetworkState(kNetworkDown); | 3241 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown); |
3198 { | 3242 { |
3199 rtc::CritScope lock(&test_crit_); | 3243 rtc::CritScope lock(&test_crit_); |
3200 // After network goes down we shouldn't be encoding more frames. | 3244 // After network goes down we shouldn't be encoding more frames. |
3201 sender_state_ = kNetworkDown; | 3245 sender_state_ = kNetworkDown; |
3202 } | 3246 } |
3203 // Wait for receiver-packets and no sender packets. | 3247 // Wait for receiver-packets and no sender packets. |
3204 WaitForPacketsOrSilence(true, false); | 3248 WaitForPacketsOrSilence(true, false); |
3205 | 3249 |
3206 // Receiver-side network down. | 3250 // Receiver-side network down. |
3207 receiver_call_->SignalNetworkState(kNetworkDown); | 3251 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown); |
| 3252 WaitForPacketsOrSilence(true, true); |
| 3253 |
| 3254 // Network up for audio for both sides; video is still not expected to |
| 3255 // start |
| 3256 sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); |
| 3257 receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); |
3208 WaitForPacketsOrSilence(true, true); | 3258 WaitForPacketsOrSilence(true, true); |
3209 | 3259 |
3210 // Network back up again for both. | 3260 // Network back up again for both. |
3211 { | 3261 { |
3212 rtc::CritScope lock(&test_crit_); | 3262 rtc::CritScope lock(&test_crit_); |
3213 // It's OK to encode frames again, as we're about to bring up the | 3263 // It's OK to encode frames again, as we're about to bring up the |
3214 // network. | 3264 // network. |
3215 sender_state_ = kNetworkUp; | 3265 sender_state_ = kNetworkUp; |
3216 } | 3266 } |
3217 sender_call_->SignalNetworkState(kNetworkUp); | 3267 sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); |
3218 receiver_call_->SignalNetworkState(kNetworkUp); | 3268 receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); |
3219 WaitForPacketsOrSilence(false, false); | 3269 WaitForPacketsOrSilence(false, false); |
| 3270 |
| 3271 // TODO(skvlad): add tests to verify that the audio streams are stopped |
| 3272 // when the network goes down for audio once the workaround in |
| 3273 // paced_sender.cc is removed. |
3220 } | 3274 } |
3221 | 3275 |
3222 int32_t Encode(const VideoFrame& input_image, | 3276 int32_t Encode(const VideoFrame& input_image, |
3223 const CodecSpecificInfo* codec_specific_info, | 3277 const CodecSpecificInfo* codec_specific_info, |
3224 const std::vector<FrameType>* frame_types) override { | 3278 const std::vector<FrameType>* frame_types) override { |
3225 { | 3279 { |
3226 rtc::CritScope lock(&test_crit_); | 3280 rtc::CritScope lock(&test_crit_); |
3227 if (sender_state_ == kNetworkDown) { | 3281 if (sender_state_ == kNetworkDown) { |
3228 ++down_frames_; | 3282 ++down_frames_; |
3229 EXPECT_LE(down_frames_, 1) | 3283 EXPECT_LE(down_frames_, 1) |
(...skipping 30 matching lines...) Loading... |
3260 ASSERT_LE(sender_rtp_ - initial_sender_rtp, kNumAcceptedDowntimeRtp) | 3314 ASSERT_LE(sender_rtp_ - initial_sender_rtp, kNumAcceptedDowntimeRtp) |
3261 << "RTP sent during sender-side downtime."; | 3315 << "RTP sent during sender-side downtime."; |
3262 ASSERT_LE(sender_rtcp_ - initial_sender_rtcp, | 3316 ASSERT_LE(sender_rtcp_ - initial_sender_rtcp, |
3263 kNumAcceptedDowntimeRtcp) | 3317 kNumAcceptedDowntimeRtcp) |
3264 << "RTCP sent during sender-side downtime."; | 3318 << "RTCP sent during sender-side downtime."; |
3265 if (time_now_ms - initial_time_ms >= | 3319 if (time_now_ms - initial_time_ms >= |
3266 static_cast<int64_t>(kSilenceTimeoutMs)) { | 3320 static_cast<int64_t>(kSilenceTimeoutMs)) { |
3267 sender_done = true; | 3321 sender_done = true; |
3268 } | 3322 } |
3269 } else { | 3323 } else { |
3270 if (sender_rtp_ > initial_sender_rtp) | 3324 if (sender_rtp_ > initial_sender_rtp + kNumAcceptedDowntimeRtp) |
3271 sender_done = true; | 3325 sender_done = true; |
3272 } | 3326 } |
3273 if (receiver_down) { | 3327 if (receiver_down) { |
3274 ASSERT_LE(receiver_rtcp_ - initial_receiver_rtcp, | 3328 ASSERT_LE(receiver_rtcp_ - initial_receiver_rtcp, |
3275 kNumAcceptedDowntimeRtcp) | 3329 kNumAcceptedDowntimeRtcp) |
3276 << "RTCP sent during receiver-side downtime."; | 3330 << "RTCP sent during receiver-side downtime."; |
3277 if (time_now_ms - initial_time_ms >= | 3331 if (time_now_ms - initial_time_ms >= |
3278 static_cast<int64_t>(kSilenceTimeoutMs)) { | 3332 static_cast<int64_t>(kSilenceTimeoutMs)) { |
3279 receiver_done = true; | 3333 receiver_done = true; |
3280 } | 3334 } |
3281 } else { | 3335 } else { |
3282 if (receiver_rtcp_ > initial_receiver_rtcp) | 3336 if (receiver_rtcp_ > initial_receiver_rtcp + kNumAcceptedDowntimeRtcp) |
3283 receiver_done = true; | 3337 receiver_done = true; |
3284 } | 3338 } |
3285 } | 3339 } |
3286 } | 3340 } |
3287 | 3341 |
3288 rtc::CriticalSection test_crit_; | 3342 rtc::CriticalSection test_crit_; |
3289 rtc::Event encoded_frames_; | 3343 rtc::Event encoded_frames_; |
3290 rtc::Event packet_event_; | 3344 rtc::Event packet_event_; |
3291 Call* sender_call_; | 3345 Call* sender_call_; |
3292 Call* receiver_call_; | 3346 Call* receiver_call_; |
(...skipping 38 matching lines...) Loading... |
3331 EXPECT_GE(stats.rtt_ms, kSendDelayMs + kReceiveDelayMs); | 3385 EXPECT_GE(stats.rtt_ms, kSendDelayMs + kReceiveDelayMs); |
3332 break; | 3386 break; |
3333 } | 3387 } |
3334 SleepMs(10); | 3388 SleepMs(10); |
3335 } | 3389 } |
3336 | 3390 |
3337 Stop(); | 3391 Stop(); |
3338 DestroyStreams(); | 3392 DestroyStreams(); |
3339 } | 3393 } |
3340 | 3394 |
3341 TEST_F(EndToEndTest, NewSendStreamsRespectNetworkDown) { | 3395 void EndToEndTest::VerifyNewVideoSendStreamsRespectNetworkState( |
3342 class UnusedEncoder : public test::FakeEncoder { | 3396 MediaType network_to_bring_down, |
3343 public: | 3397 VideoEncoder* encoder, |
3344 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {} | 3398 Transport* transport) { |
3345 int32_t Encode(const VideoFrame& input_image, | 3399 CreateSenderCall(Call::Config()); |
3346 const CodecSpecificInfo* codec_specific_info, | 3400 sender_call_->SignalChannelNetworkState(network_to_bring_down, kNetworkDown); |
3347 const std::vector<FrameType>* frame_types) override { | |
3348 ADD_FAILURE() << "Unexpected frame encode."; | |
3349 return test::FakeEncoder::Encode( | |
3350 input_image, codec_specific_info, frame_types); | |
3351 } | |
3352 }; | |
3353 | 3401 |
3354 CreateSenderCall(Call::Config()); | 3402 CreateSendConfig(1, 0, transport); |
3355 sender_call_->SignalNetworkState(kNetworkDown); | 3403 video_send_config_.encoder_settings.encoder = encoder; |
3356 | |
3357 UnusedTransport transport; | |
3358 CreateSendConfig(1, 0, &transport); | |
3359 UnusedEncoder unused_encoder; | |
3360 video_send_config_.encoder_settings.encoder = &unused_encoder; | |
3361 CreateVideoStreams(); | 3404 CreateVideoStreams(); |
3362 CreateFrameGeneratorCapturer(); | 3405 CreateFrameGeneratorCapturer(); |
3363 | 3406 |
3364 Start(); | 3407 Start(); |
3365 SleepMs(kSilenceTimeoutMs); | 3408 SleepMs(kSilenceTimeoutMs); |
3366 Stop(); | 3409 Stop(); |
3367 | 3410 |
3368 DestroyStreams(); | 3411 DestroyStreams(); |
3369 } | 3412 } |
3370 | 3413 |
3371 TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { | 3414 void EndToEndTest::VerifyNewVideoReceiveStreamsRespectNetworkState( |
| 3415 MediaType network_to_bring_down, |
| 3416 Transport* transport) { |
3372 CreateCalls(Call::Config(), Call::Config()); | 3417 CreateCalls(Call::Config(), Call::Config()); |
3373 receiver_call_->SignalNetworkState(kNetworkDown); | 3418 receiver_call_->SignalChannelNetworkState(network_to_bring_down, |
| 3419 kNetworkDown); |
3374 | 3420 |
3375 test::DirectTransport sender_transport(sender_call_.get()); | 3421 test::DirectTransport sender_transport(sender_call_.get()); |
3376 sender_transport.SetReceiver(receiver_call_->Receiver()); | 3422 sender_transport.SetReceiver(receiver_call_->Receiver()); |
3377 CreateSendConfig(1, 0, &sender_transport); | 3423 CreateSendConfig(1, 0, &sender_transport); |
3378 UnusedTransport transport; | 3424 CreateMatchingReceiveConfigs(transport); |
3379 CreateMatchingReceiveConfigs(&transport); | |
3380 CreateVideoStreams(); | 3425 CreateVideoStreams(); |
3381 CreateFrameGeneratorCapturer(); | 3426 CreateFrameGeneratorCapturer(); |
3382 | 3427 |
3383 Start(); | 3428 Start(); |
3384 SleepMs(kSilenceTimeoutMs); | 3429 SleepMs(kSilenceTimeoutMs); |
3385 Stop(); | 3430 Stop(); |
3386 | 3431 |
3387 sender_transport.StopSending(); | 3432 sender_transport.StopSending(); |
3388 | 3433 |
3389 DestroyStreams(); | 3434 DestroyStreams(); |
3390 } | 3435 } |
3391 | 3436 |
| 3437 TEST_F(EndToEndTest, NewVideoSendStreamsRespectVideoNetworkDown) { |
| 3438 class UnusedEncoder : public test::FakeEncoder { |
| 3439 public: |
| 3440 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {} |
| 3441 int32_t Encode(const VideoFrame& input_image, |
| 3442 const CodecSpecificInfo* codec_specific_info, |
| 3443 const std::vector<FrameType>* frame_types) override { |
| 3444 ADD_FAILURE() << "Unexpected frame encode."; |
| 3445 return test::FakeEncoder::Encode(input_image, codec_specific_info, |
| 3446 frame_types); |
| 3447 } |
| 3448 }; |
| 3449 |
| 3450 UnusedEncoder unused_encoder; |
| 3451 UnusedTransport unused_transport; |
| 3452 VerifyNewVideoSendStreamsRespectNetworkState( |
| 3453 MediaType::VIDEO, &unused_encoder, &unused_transport); |
| 3454 } |
| 3455 |
| 3456 TEST_F(EndToEndTest, NewVideoSendStreamsIgnoreAudioNetworkDown) { |
| 3457 class RequiredEncoder : public test::FakeEncoder { |
| 3458 public: |
| 3459 RequiredEncoder() |
| 3460 : FakeEncoder(Clock::GetRealTimeClock()), encoded_frame_(false) {} |
| 3461 ~RequiredEncoder() { |
| 3462 if (!encoded_frame_) { |
| 3463 ADD_FAILURE() << "Didn't encode an expected frame"; |
| 3464 } |
| 3465 } |
| 3466 int32_t Encode(const VideoFrame& input_image, |
| 3467 const CodecSpecificInfo* codec_specific_info, |
| 3468 const std::vector<FrameType>* frame_types) override { |
| 3469 encoded_frame_ = true; |
| 3470 return test::FakeEncoder::Encode(input_image, codec_specific_info, |
| 3471 frame_types); |
| 3472 } |
| 3473 |
| 3474 private: |
| 3475 bool encoded_frame_; |
| 3476 }; |
| 3477 |
| 3478 RequiredTransport required_transport(true /*rtp*/, false /*rtcp*/); |
| 3479 RequiredEncoder required_encoder; |
| 3480 VerifyNewVideoSendStreamsRespectNetworkState( |
| 3481 MediaType::AUDIO, &required_encoder, &required_transport); |
| 3482 } |
| 3483 |
| 3484 TEST_F(EndToEndTest, NewVideoReceiveStreamsRespectVideoNetworkDown) { |
| 3485 UnusedTransport transport; |
| 3486 VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::VIDEO, &transport); |
| 3487 } |
| 3488 |
| 3489 TEST_F(EndToEndTest, NewVideoReceiveStreamsIgnoreAudioNetworkDown) { |
| 3490 RequiredTransport transport(false /*rtp*/, true /*rtcp*/); |
| 3491 VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::AUDIO, &transport); |
| 3492 } |
| 3493 |
3392 void VerifyEmptyNackConfig(const NackConfig& config) { | 3494 void VerifyEmptyNackConfig(const NackConfig& config) { |
3393 EXPECT_EQ(0, config.rtp_history_ms) | 3495 EXPECT_EQ(0, config.rtp_history_ms) |
3394 << "Enabling NACK requires rtcp-fb: nack negotiation."; | 3496 << "Enabling NACK requires rtcp-fb: nack negotiation."; |
3395 } | 3497 } |
3396 | 3498 |
3397 void VerifyEmptyFecConfig(const FecConfig& config) { | 3499 void VerifyEmptyFecConfig(const FecConfig& config) { |
3398 EXPECT_EQ(-1, config.ulpfec_payload_type) | 3500 EXPECT_EQ(-1, config.ulpfec_payload_type) |
3399 << "Enabling FEC requires rtpmap: ulpfec negotiation."; | 3501 << "Enabling FEC requires rtpmap: ulpfec negotiation."; |
3400 EXPECT_EQ(-1, config.red_payload_type) | 3502 EXPECT_EQ(-1, config.red_payload_type) |
3401 << "Enabling FEC requires rtpmap: red negotiation."; | 3503 << "Enabling FEC requires rtpmap: red negotiation."; |
(...skipping 98 matching lines...) Loading... |
3500 private: | 3602 private: |
3501 bool video_observed_; | 3603 bool video_observed_; |
3502 bool audio_observed_; | 3604 bool audio_observed_; |
3503 SequenceNumberUnwrapper unwrapper_; | 3605 SequenceNumberUnwrapper unwrapper_; |
3504 std::set<int64_t> received_packet_ids_; | 3606 std::set<int64_t> received_packet_ids_; |
3505 } test; | 3607 } test; |
3506 | 3608 |
3507 RunBaseTest(&test); | 3609 RunBaseTest(&test); |
3508 } | 3610 } |
3509 } // namespace webrtc | 3611 } // namespace webrtc |
OLD | NEW |