+
+/** Called when a player has finished the current film.
+ * May be called from a non-UI thread.
+ */
+void
+FilmViewer::finished ()
+{
+ emit (boost::bind(&FilmViewer::ui_finished, this));
+}
+
+/** Called by finished() in the UI thread */
+void
+FilmViewer::ui_finished ()
+{
+ stop ();
+ Finished ();
+}
+
+int
+FilmViewer::dropped () const
+{
+ return _video_view->dropped ();
+}
+
+
+int
+FilmViewer::errored () const
+{
+ return _video_view->errored ();
+}
+
+
+int
+FilmViewer::gets () const
+{
+ return _video_view->gets ();
+}
+
+
+void
+FilmViewer::image_changed (shared_ptr<PlayerVideo> pv)
+{
+ emit (boost::bind(boost::ref(ImageChanged), pv));
+}
+
+
+void
+FilmViewer::too_many_frames_dropped ()
+{
+ if (!Config::instance()->nagged(Config::NAG_TOO_MANY_DROPPED_FRAMES)) {
+ stop ();
+ }
+
+ NagDialog::maybe_nag (
+ panel(),
+ Config::NAG_TOO_MANY_DROPPED_FRAMES,
+ _("The player is dropping a lot of frames, so playback may not be accurate.\n\n"
+ "<b>This does not necessarily mean that the DCP you are playing is defective!</b>\n\n"
+ "You may be able to improve player performance by:\n"
+ "• choosing 'decode at half resolution' or 'decode at quarter resolution' from the View menu\n"
+ "• using a more powerful computer.\n"
+ )
+ );
+}