+ 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::set_optimise_for_j2k (bool o)
+{
+ _optimise_for_j2k = o;
+ _video_view->set_optimise_for_j2k (o);
+}
+
+
+void
+FilmViewer::set_crop_guess (dcpomatic::Rect<float> crop)
+{
+ if (crop != _crop_guess) {
+ _crop_guess = crop;
+ _video_view->update ();
+ }
+}
+
+
+void
+FilmViewer::unset_crop_guess ()
+{
+ _crop_guess = boost::none;
+ _video_view->update ();