Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index ff0185c198b532fd1c9cd5ac1e6b83329706a7ac..f3c01c1a5832a1a3b283b4b9a7a9580925121082 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -2643,7 +2643,8 @@ |
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.CurrentDelayInMs")); |
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.OnewayDelayInMs")); |
- EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayInMs")); |
+ EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EndToEndDelayInMs")); |
+ EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EndToEndDelayMaxInMs")); |
EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RenderSqrtPixelsPerSecond")); |
EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EncodeTimeInMs")); |
@@ -2681,6 +2682,118 @@ |
metrics::NumSamples("WebRTC.Video.FecBitrateReceivedInKbps")); |
EXPECT_EQ(num_red_samples, |
metrics::NumSamples("WebRTC.Video.ReceivedFecPacketsInPercent")); |
+} |
+ |
+TEST_F(EndToEndTest, ContentTypeSwitches) { |
+ class StatsObserver : public test::BaseTest, |
+ public rtc::VideoSinkInterface<VideoFrame> { |
+ public: |
+ StatsObserver() : BaseTest(kLongTimeoutMs), num_frames_received_(0) {} |
+ |
+ bool ShouldCreateReceivers() const override { return true; } |
+ |
+ void OnFrame(const VideoFrame& video_frame) override { |
+ // The RTT is needed to estimate |ntp_time_ms| which is used by |
+ // end-to-end delay stats. Therefore, start counting received frames once |
+ // |ntp_time_ms| is valid. |
+ if (video_frame.ntp_time_ms() > 0 && |
+ Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() >= |
+ video_frame.ntp_time_ms()) { |
+ rtc::CritScope lock(&crit_); |
+ ++num_frames_received_; |
+ } |
+ } |
+ |
+ Action OnSendRtp(const uint8_t* packet, size_t length) override { |
+ if (MinNumberOfFramesReceived()) |
+ observation_complete_.Set(); |
+ return SEND_PACKET; |
+ } |
+ |
+ bool MinNumberOfFramesReceived() const { |
+ const int kMinRequiredHistogramSamples = 200; |
+ rtc::CritScope lock(&crit_); |
+ return num_frames_received_ > kMinRequiredHistogramSamples; |
+ } |
+ |
+ // May be called several times. |
+ void PerformTest() override { |
+ EXPECT_TRUE(Wait()) << "Timed out waiting for enough packets."; |
+ // Reset frame counter so next PerformTest() call will do something. |
+ { |
+ rtc::CritScope lock(&crit_); |
+ num_frames_received_ = 0; |
+ } |
+ } |
+ |
+ rtc::CriticalSection crit_; |
+ int num_frames_received_ GUARDED_BY(&crit_); |
+ } test; |
+ |
+ metrics::Reset(); |
+ |
+ Call::Config send_config(test.GetSenderCallConfig()); |
+ CreateSenderCall(send_config); |
+ Call::Config recv_config(test.GetReceiverCallConfig()); |
+ CreateReceiverCall(recv_config); |
+ receive_transport_.reset(test.CreateReceiveTransport()); |
+ send_transport_.reset(test.CreateSendTransport(sender_call_.get())); |
+ send_transport_->SetReceiver(receiver_call_->Receiver()); |
+ receive_transport_->SetReceiver(sender_call_->Receiver()); |
+ receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); |
+ CreateSendConfig(1, 0, 0, send_transport_.get()); |
+ CreateMatchingReceiveConfigs(receive_transport_.get()); |
+ |
+ // Modify send and receive configs. |
+ video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
+ video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
+ video_receive_configs_[0].renderer = &test; |
+ // RTT needed for RemoteNtpTimeEstimator for the receive stream. |
+ video_receive_configs_[0].rtp.rtcp_xr.receiver_reference_time_report = true; |
+ // Start with realtime video. |
+ video_encoder_config_.content_type = |
+ VideoEncoderConfig::ContentType::kRealtimeVideo; |
+ // Second encoder config for the second part of the test uses screenshare |
+ VideoEncoderConfig encoder_config_with_screenshare_ = |
+ video_encoder_config_.Copy(); |
+ encoder_config_with_screenshare_.content_type = |
+ VideoEncoderConfig::ContentType::kScreen; |
+ |
+ CreateVideoStreams(); |
+ CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth, |
+ kDefaultHeight); |
+ Start(); |
+ |
+ test.PerformTest(); |
+ |
+ // Replace old send stream. |
+ sender_call_->DestroyVideoSendStream(video_send_stream_); |
+ video_send_stream_ = sender_call_->CreateVideoSendStream( |
+ video_send_config_.Copy(), encoder_config_with_screenshare_.Copy()); |
+ video_send_stream_->SetSource( |
+ frame_generator_capturer_.get(), |
+ VideoSendStream::DegradationPreference::kBalanced); |
+ video_send_stream_->Start(); |
+ |
+ // Continue to run test but now with screenshare. |
+ test.PerformTest(); |
+ |
+ send_transport_->StopSending(); |
+ receive_transport_->StopSending(); |
+ Stop(); |
+ DestroyStreams(); |
+ DestroyCalls(); |
+ // Delete the call for Call stats to be reported. |
+ sender_call_.reset(); |
+ receiver_call_.reset(); |
+ |
+ // Verify that stats have been updated for both screenshare and video. |
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayInMs")); |
+ EXPECT_EQ(1, |
+ metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayInMs")); |
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayMaxInMs")); |
+ EXPECT_EQ( |
+ 1, metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayMaxInMs")); |
} |
TEST_F(EndToEndTest, VerifyHistogramStatsWithRtx) { |