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

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

Issue 1757683002: Make the audio channel communicate network state changes to the call. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Added end-to-end tests for all network states Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include <algorithm> 10 #include <algorithm>
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« webrtc/media/engine/fakewebrtccall.cc ('K') | « webrtc/media/engine/webrtcvoiceengine_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698