Chromium Code Reviews

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 handling for the case where the enum class value is outside of the valid range Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine_unittest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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...)
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...)
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...)
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...)
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...)
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
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine