]> git.sesse.net Git - nageru/commitdiff
Drop frames if the player runs too far behind.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 27 Sep 2018 19:02:56 +0000 (21:02 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 27 Sep 2018 19:02:56 +0000 (21:02 +0200)
player.cpp

index 1eea8d706c883d07a6d0592131cc8e7e6a8e15ab..1e57ded102df14eff8fbd69f7a544fed77e9a5bf 100644 (file)
@@ -97,6 +97,13 @@ void Player::thread_func(bool also_output_to_stream)
                        int64_t in_pts = lrint(in_pts_origin + TIMEBASE * frameno * speed / output_framerate);
                        pts = lrint(out_pts);
 
+                       steady_clock::duration time_behind = steady_clock::now() - next_frame_start;
+                       if (time_behind >= milliseconds(200)) {
+                               fprintf(stderr, "WARNING: %ld ms behind, dropping a frame (no matter the type).\n",
+                                       lrint(1e3 * duration<double>(time_behind).count()));
+                               continue;
+                       }
+
                        int64_t in_pts_lower, in_pts_upper;
 
                        // Find the frame immediately before and after this point.
@@ -171,6 +178,12 @@ void Player::thread_func(bool also_output_to_stream)
                                continue;
                        }
 
+                       if (time_behind >= milliseconds(100)) {
+                               fprintf(stderr, "WARNING: %ld ms behind, dropping an interpolated frame.\n",
+                                       lrint(1e3 * duration<double>(time_behind).count()));
+                               continue;
+                       }
+
                        double alpha = double(in_pts - in_pts_lower) / (in_pts_upper - in_pts_lower);
 
                        if (video_stream == nullptr) {