Replace aligned bool with enum Alignment.
[dcpomatic.git] / src / wx / film_viewer.cc
index 8805d1311c0ad9da1b0fd39dee168b4dad8e3369..5609ebf86a77a4cc05e08b2e870a44b274757bc5 100644 (file)
@@ -63,17 +63,11 @@ extern "C" {
 using std::bad_alloc;
 using std::cout;
 using std::dynamic_pointer_cast;
-using std::exception;
-using std::list;
-using std::make_pair;
 using std::make_shared;
 using std::max;
-using std::min;
-using std::pair;
 using std::shared_ptr;
 using std::string;
 using std::vector;
-using std::weak_ptr;
 using boost::optional;
 #if BOOST_VERSION >= 106100
 using namespace boost::placeholders;
@@ -96,15 +90,15 @@ FilmViewer::FilmViewer (wxWindow* p)
 {
        switch (Config::instance()->video_view_type()) {
        case Config::VIDEO_VIEW_OPENGL:
-               _video_view = new GLVideoView (this, p);
+               _video_view = std::make_shared<GLVideoView>(this, p);
                break;
        case Config::VIDEO_VIEW_SIMPLE:
-               _video_view = new SimpleVideoView (this, p);
+               _video_view = std::make_shared<SimpleVideoView>(this, p);
                break;
        }
 
        _video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this));
-       _video_view->TooManyDropped.connect (boost::bind(&FilmViewer::too_many_frames_dropped, this));
+       _video_view->TooManyDropped.connect (boost::bind(boost::ref(TooManyDropped)));
 
        set_film (shared_ptr<Film>());
 
@@ -169,7 +163,7 @@ FilmViewer::set_film (shared_ptr<Film> film)
        }
 
        try {
-               _player = make_shared<Player>(_film);
+               _player = make_shared<Player>(_film, _optimise_for_j2k ? Image::Alignment::COMPACT : Image::Alignment::PADDED);
                _player->set_fast ();
                if (_dcp_decode_reduction) {
                        _player->set_dcp_decode_reduction (_dcp_decode_reduction);
@@ -221,8 +215,9 @@ FilmViewer::recreate_butler ()
                _audio_channels,
                bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24),
                VideoRange::FULL,
-               false,
-               true
+               _optimise_for_j2k ? Image::Alignment::COMPACT : Image::Alignment::PADDED,
+               true,
+               dynamic_pointer_cast<GLVideoView>(_video_view) && _optimise_for_j2k
                );
 
        if (!Config::instance()->sound() && !_audio.isStreamOpen()) {
@@ -281,21 +276,22 @@ FilmViewer::calculate_sizes ()
        auto const view_ratio = float(_video_view->get()->GetSize().x) / _video_view->get()->GetSize().y;
        auto const film_ratio = container ? container->ratio () : 1.78;
 
+       dcp::Size out_size;
        if (view_ratio < film_ratio) {
                /* panel is less widscreen than the film; clamp width */
-               _out_size.width = _video_view->get()->GetSize().x;
-               _out_size.height = lrintf (_out_size.width / film_ratio);
+               out_size.width = _video_view->get()->GetSize().x;
+               out_size.height = lrintf (out_size.width / film_ratio);
        } else {
                /* panel is more widescreen than the film; clamp height */
-               _out_size.height = _video_view->get()->GetSize().y;
-               _out_size.width = lrintf (_out_size.height * film_ratio);
+               out_size.height = _video_view->get()->GetSize().y;
+               out_size.width = lrintf (out_size.height * film_ratio);
        }
 
        /* Catch silly values */
-       _out_size.width = max (64, _out_size.width);
-       _out_size.height = max (64, _out_size.height);
+       out_size.width = max (64, out_size.width);
+       out_size.height = max (64, out_size.height);
 
-       _player->set_video_container_size (_out_size);
+       _player->set_video_container_size (out_size);
 }
 
 
@@ -350,7 +346,15 @@ FilmViewer::start ()
          */
        if (_audio.isStreamOpen()) {
                _audio.setStreamTime (_video_view->position().seconds());
-               _audio.startStream ();
+               try {
+                       _audio.startStream ();
+               } catch (RtAudioError& e) {
+                       _audio_channels = 0;
+                       error_dialog (
+                               _video_view->get(),
+                               _("There was a problem starting audio playback.  Please try another audio output device in Preferences."), std_to_wx(e.what())
+                               );
+               }
        }
 
        _playing = true;
@@ -410,7 +414,8 @@ FilmViewer::player_change (vector<int> properties)
        for (auto i: properties) {
                if (
                        i == VideoContentProperty::CROP ||
-                       i == VideoContentProperty::SCALE ||
+                       i == VideoContentProperty::CUSTOM_RATIO ||
+                       i == VideoContentProperty::CUSTOM_SIZE ||
                        i == VideoContentProperty::FADE_IN ||
                        i == VideoContentProperty::FADE_OUT ||
                        i == VideoContentProperty::COLOUR_CONVERSION ||
@@ -765,20 +770,9 @@ FilmViewer::image_changed (shared_ptr<PlayerVideo> pv)
 
 
 void
-FilmViewer::too_many_frames_dropped ()
+FilmViewer::set_optimise_for_j2k (bool o)
 {
-       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"
-                )
-               );
+       _optimise_for_j2k = o;
+       _video_view->set_optimise_for_j2k (o);
 }
+