Fix black borders around the preview in some cases (#2331).
[dcpomatic.git] / src / wx / film_viewer.cc
index 34ff8dbc46fbfab9dd92d3c555da34d2abc1d1f5..c56e2f5d26f89a3478e3e2385ddd99ee5dd82dd2 100644 (file)
@@ -118,7 +118,7 @@ FilmViewer::~FilmViewer ()
 }
 
 
-/** Ask for ::get() to be called next time we are idle */
+/** Ask for ::idle_handler() to be called next time we are idle */
 void
 FilmViewer::request_idle_display_next_frame ()
 {
@@ -228,13 +228,10 @@ FilmViewer::recreate_butler ()
                VideoRange::FULL,
                j2k_gl_optimised ? Image::Alignment::COMPACT : Image::Alignment::PADDED,
                true,
-               j2k_gl_optimised
+               j2k_gl_optimised,
+               (Config::instance()->sound() && _audio.isStreamOpen()) ? Butler::Audio::ENABLED : Butler::Audio::DISABLED
                );
 
-       if (!Config::instance()->sound() && !_audio.isStreamOpen()) {
-               _butler->disable_audio ();
-       }
-
        _closed_captions_dialog->set_butler (_butler);
 
        resume ();
@@ -306,6 +303,16 @@ FilmViewer::calculate_sizes ()
        out_size.width = max (64, out_size.width);
        out_size.height = max (64, out_size.height);
 
+       /* Make sure the video container sizes are always a multiple of 2 so that
+        * we don't get gaps with subsampled sources (e.g. YUV420)
+        */
+       if (out_size.width % 2) {
+               out_size.width++;
+       }
+       if (out_size.height % 2) {
+               out_size.height++;
+       }
+
        _player->set_video_container_size (out_size);
 }
 
@@ -712,6 +719,13 @@ FilmViewer::dcp_decode_reduction () const
 }
 
 
+optional<ContentTime>
+FilmViewer::position_in_content (shared_ptr<const Content> content) const
+{
+       return _player->dcp_to_content_time (content, position());
+}
+
+
 DCPTime
 FilmViewer::one_video_frame () const
 {
@@ -795,3 +809,21 @@ FilmViewer::set_optimise_for_j2k (bool 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 ();
+}
+