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 <brandtr@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27929}
This commit is contained in:
Sebastian Jansson
2019-05-13 11:48:40 +02:00
committed by Commit Bot
parent 46ac470d92
commit dab21c6a91
2 changed files with 21 additions and 9 deletions

View File

@ -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

View File

@ -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++;