X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=5609ebf86a77a4cc05e08b2e870a44b274757bc5;hb=3799e91d126d243d41c44dcb0ca1bfa66b53a57e;hp=8805d1311c0ad9da1b0fd39dee168b4dad8e3369;hpb=3339d3bce70afe9ae2ca10e9fcfc4b54b748fbf4;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 8805d1311..5609ebf86 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -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(this, p); break; case Config::VIDEO_VIEW_SIMPLE: - _video_view = new SimpleVideoView (this, p); + _video_view = std::make_shared(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()); @@ -169,7 +163,7 @@ FilmViewer::set_film (shared_ptr film) } try { - _player = make_shared(_film); + _player = make_shared(_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(_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 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 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" - "This does not necessarily mean that the DCP you are playing is defective!\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); } +