From dab21c6a91a6a47a098fb580498a07746152f00d Mon Sep 17 00:00:00 2001 From: Sebastian Jansson Date: Mon, 13 May 2019 11:48:40 +0200 Subject: [PATCH] Fix for crash in frame matcher on short runs. The capture time stamp was not set when finalizing a simulation where no frames were delivered, this triggered a DCHECK. Also adding a unit test that would have caught this. Bug: webrtc:10365 Change-Id: I839d1c01dbf260723ed30d3e846efff280d7744f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/136585 Reviewed-by: Rasmus Brandt Commit-Queue: Sebastian Jansson Cr-Commit-Position: refs/heads/master@{#27929} --- test/scenario/stats_collection_unittest.cc | 28 +++++++++++++++------- test/scenario/video_frame_matcher.cc | 2 +- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/test/scenario/stats_collection_unittest.cc b/test/scenario/stats_collection_unittest.cc index b4b31cc62a..2d8fa39caa 100644 --- a/test/scenario/stats_collection_unittest.cc +++ b/test/scenario/stats_collection_unittest.cc @@ -30,14 +30,12 @@ void CreateAnalyzedStream(Scenario* s, {s->CreateSimulationNode(NetworkSimulationConfig())}); auto* video = s->CreateVideoStream(route->forward(), config); auto* audio = s->CreateAudioStream(route->forward(), AudioStreamConfig()); - if (collectors) { - s->Every(TimeDelta::seconds(1), [=] { - collectors->call.AddStats(caller->GetStats()); - collectors->audio_receive.AddStats(audio->receive()->GetStats()); - collectors->video_send.AddStats(video->send()->GetStats(), s->Now()); - collectors->video_receive.AddStats(video->receive()->GetStats()); - }); - } + s->Every(TimeDelta::seconds(1), [=] { + collectors->call.AddStats(caller->GetStats()); + collectors->audio_receive.AddStats(audio->receive()->GetStats()); + collectors->video_send.AddStats(video->send()->GetStats(), s->Now()); + collectors->video_receive.AddStats(video->receive()->GetStats()); + }); } } // namespace @@ -82,5 +80,19 @@ TEST(ScenarioAnalyzerTest, PsnrIsLowWhenNetworkIsBad) { EXPECT_NEAR(stats.audio_receive.stats().jitter_buffer.Mean().ms(), 45, 20); } +TEST(ScenarioAnalyzerTest, CountsCapturedButNotRendered) { + VideoQualityAnalyzer analyzer; + CallStatsCollectors stats; + { + Scenario s; + NetworkSimulationConfig long_delays; + long_delays.delay = TimeDelta::seconds(5); + CreateAnalyzedStream(&s, long_delays, &analyzer, &stats); + // Enough time to send frames but not enough to deliver. + s.RunFor(TimeDelta::ms(100)); + } + EXPECT_GE(analyzer.stats().capture.count, 1); + EXPECT_EQ(analyzer.stats().render.count, 0); +} } // namespace test } // namespace webrtc diff --git a/test/scenario/video_frame_matcher.cc b/test/scenario/video_frame_matcher.cc index 82b3b3e3ee..1a5d4b415e 100644 --- a/test/scenario/video_frame_matcher.cc +++ b/test/scenario/video_frame_matcher.cc @@ -105,9 +105,9 @@ void VideoFrameMatcher::HandleMatch(VideoFrameMatcher::CapturedFrame captured, frame_pair.layer_id = layer_id; frame_pair.captured = captured.frame; frame_pair.capture_id = captured.id; + frame_pair.capture_time = captured.capture_time; if (captured.best_decode) { frame_pair.decode_id = captured.best_decode->id; - frame_pair.capture_time = captured.capture_time; frame_pair.decoded = captured.best_decode->frame; frame_pair.render_time = captured.best_decode->render_time; frame_pair.repeated = captured.best_decode->repeat_count++;