Fix black borders around the preview in some cases (#2331).
[dcpomatic.git] / src / wx / film_viewer.cc
index ac12bea3f6f9870a001e976b20d6f5d0eb1d8e0a..c56e2f5d26f89a3478e3e2385ddd99ee5dd82dd2 100644 (file)
 #include "playhead_to_timecode_dialog.h"
 #include "simple_video_view.h"
 #include "wx_util.h"
-#include "lib/film.h"
-#include "lib/ratio.h"
-#include "lib/util.h"
-#include "lib/job_manager.h"
-#include "lib/image.h"
-#include "lib/exceptions.h"
+#include "lib/butler.h"
+#include "lib/compose.hpp"
+#include "lib/config.h"
+#include "lib/dcpomatic_log.h"
 #include "lib/examine_content_job.h"
+#include "lib/exceptions.h"
+#include "lib/film.h"
 #include "lib/filter.h"
+#include "lib/image.h"
+#include "lib/job_manager.h"
+#include "lib/log.h"
 #include "lib/player.h"
 #include "lib/player_video.h"
+#include "lib/ratio.h"
+#include "lib/text_content.h"
+#include "lib/timer.h"
+#include "lib/util.h"
 #include "lib/video_content.h"
 #include "lib/video_decoder.h"
-#include "lib/timer.h"
-#include "lib/butler.h"
-#include "lib/log.h"
-#include "lib/config.h"
-#include "lib/compose.hpp"
-#include "lib/dcpomatic_log.h"
-#include "lib/text_content.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>
-#include <iostream>
+LIBDCP_ENABLE_WARNINGS
 #include <iomanip>
 
 
 using std::bad_alloc;
-using std::cout;
 using std::dynamic_pointer_cast;
 using std::make_shared;
 using std::max;
@@ -117,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 ()
 {
@@ -223,17 +224,14 @@ FilmViewer::recreate_butler ()
                _player,
                Config::instance()->audio_mapping(_audio_channels),
                _audio_channels,
-               bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24),
+               boost::bind(&PlayerVideo::force, AV_PIX_FMT_RGB24),
                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 ();
@@ -305,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);
 }
 
@@ -711,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
 {
@@ -794,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 ();
+}
+