Fix black borders around the preview in some cases (#2331).
[dcpomatic.git] / src / wx / film_viewer.cc
index f7c50b98aa07cc62b75fcd9916b98c2570ff3980..c56e2f5d26f89a3478e3e2385ddd99ee5dd82dd2 100644 (file)
 #include "lib/util.h"
 #include "lib/video_content.h"
 #include "lib/video_decoder.h"
+#include <dcp/exceptions.h>
+#include <dcp/warnings.h>
 extern "C" {
 #include <libavutil/pixfmt.h>
 }
-#include <dcp/exceptions.h>
+LIBDCP_DISABLE_WARNINGS
 #include <wx/tglbtn.h>
+LIBDCP_ENABLE_WARNINGS
 #include <iomanip>
 
 
@@ -115,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 ()
 {
@@ -225,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 ();
@@ -303,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);
 }
 
@@ -709,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
 {
@@ -792,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 ();
+}
+