summaryrefslogtreecommitdiff
path: root/src/wx/video_view.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-04-03 23:17:56 +0200
committerCarl Hetherington <cth@carlh.net>2021-04-03 23:17:56 +0200
commita7a8cd74f2f32de8b708c78cc8bc9c0cf17d60f5 (patch)
treecb582fa9ed35e1c7383675761b5955922aef3617 /src/wx/video_view.cc
parent996d8defbb783e5c82ef31a71fb6a06a6a5ab873 (diff)
Show an explanatory message if the player is not performing very well (#1932).
Diffstat (limited to 'src/wx/video_view.cc')
-rw-r--r--src/wx/video_view.cc30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/wx/video_view.cc b/src/wx/video_view.cc
index 5f44c37d6..387d4052f 100644
--- a/src/wx/video_view.cc
+++ b/src/wx/video_view.cc
@@ -25,12 +25,18 @@
#include "lib/butler.h"
#include "lib/dcpomatic_log.h"
#include <boost/optional.hpp>
+#include <sys/time.h>
+
using std::pair;
using std::shared_ptr;
using boost::optional;
+static constexpr int TOO_MANY_DROPPED_FRAMES = 20;
+static constexpr int TOO_MANY_DROPPED_PERIOD = 5.0;
+
+
VideoView::VideoView (FilmViewer* viewer)
: _viewer (viewer)
, _state_timer ("viewer")
@@ -124,6 +130,7 @@ VideoView::start ()
boost::mutex::scoped_lock lm (_mutex);
_dropped = 0;
_errored = 0;
+ gettimeofday(&_dropped_check_period_start, nullptr);
}
@@ -143,3 +150,26 @@ VideoView::reset_metadata (shared_ptr<const Film> film, dcp::Size player_video_c
return true;
}
+
+void
+VideoView::add_dropped ()
+{
+ bool too_many = false;
+
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ ++_dropped;
+ if (_dropped > TOO_MANY_DROPPED_FRAMES) {
+ struct timeval now;
+ gettimeofday (&now, nullptr);
+ double const elapsed = seconds(now) - seconds(_dropped_check_period_start);
+ too_many = elapsed < TOO_MANY_DROPPED_PERIOD;
+ _dropped = 0;
+ _dropped_check_period_start = now;
+ }
+ }
+
+ if (too_many) {
+ emit (boost::bind(boost::ref(TooManyDropped)));
+ }
+}