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}
diff --git a/test/scenario/stats_collection_unittest.cc b/test/scenario/stats_collection_unittest.cc
index b4b31cc..2d8fa39 100644
--- a/test/scenario/stats_collection_unittest.cc
+++ b/test/scenario/stats_collection_unittest.cc
@@ -30,14 +30,12 @@
                       {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 @@
   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 82b3b3e..1a5d4b4 100644
--- a/test/scenario/video_frame_matcher.cc
+++ b/test/scenario/video_frame_matcher.cc
@@ -105,9 +105,9 @@
   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++;