X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=259e2bc16a4a02b5ca078add1d95a8251b4851cb;hp=749e4ceb7c315e73147737c465f2d26e981fba80;hb=2d2af972a53a2c11b95469058803b4eaed2d3c01;hpb=7245e46453a82886739a45bd78fcdf9e8401367c diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 749e4ceb7..259e2bc16 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; @@ -94,6 +88,7 @@ FilmViewer::FilmViewer (wxWindow* p) : _audio (DCPOMATIC_RTAUDIO_API) , _closed_captions_dialog (new ClosedCaptionsDialog(p, this)) { +#if wxCHECK_VERSION(3, 1, 0) switch (Config::instance()->video_view_type()) { case Config::VIDEO_VIEW_OPENGL: _video_view = std::make_shared(this, p); @@ -102,6 +97,9 @@ FilmViewer::FilmViewer (wxWindow* p) _video_view = std::make_shared(this, p); break; } +#else + _video_view = std::make_shared(this, p); +#endif _video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this)); _video_view->TooManyDropped.connect (boost::bind(boost::ref(TooManyDropped))); @@ -169,7 +167,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); @@ -214,6 +212,12 @@ FilmViewer::recreate_butler () return; } +#if wxCHECK_VERSION(3, 1, 0) + auto const j2k_gl_optimised = dynamic_pointer_cast(_video_view) && _optimise_for_j2k; +#else + auto const j2k_gl_optimised = false; +#endif + _butler = std::make_shared( _film, _player, @@ -221,18 +225,15 @@ FilmViewer::recreate_butler () _audio_channels, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, - false, - true + j2k_gl_optimised ? Image::Alignment::COMPACT : Image::Alignment::PADDED, + true, + j2k_gl_optimised ); if (!Config::instance()->sound() && !_audio.isStreamOpen()) { _butler->disable_audio (); } - if (dynamic_pointer_cast(_video_view) && _optimise_for_j2k) { - _butler->set_prepare_only_proxy (true); - } - _closed_captions_dialog->set_butler (_butler); resume (); @@ -282,17 +283,21 @@ FilmViewer::calculate_sizes () auto const container = _film->container (); - auto const view_ratio = float(_video_view->get()->GetSize().x) / _video_view->get()->GetSize().y; + auto const scale = dpi_scale_factor (_video_view->get()); + int const video_view_width = std::round(_video_view->get()->GetSize().x * scale); + int const video_view_height = std::round(_video_view->get()->GetSize().y * scale); + + auto const view_ratio = float(video_view_width) / video_view_height; 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.width = video_view_width; 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.height = video_view_height; out_size.width = lrintf (out_size.height * film_ratio); } @@ -370,7 +375,7 @@ FilmViewer::start () /* Calling start() below may directly result in Stopped being emitted, and if that * happens we want it to come after the Started signal, so do that first. */ - Started (position()); + Started (); _video_view->start (); } @@ -389,7 +394,7 @@ FilmViewer::stop () _playing = false; _video_view->stop (); - Stopped (position()); + Stopped (); _video_view->rethrow (); return true; @@ -648,7 +653,7 @@ int FilmViewer::audio_callback (void* out_p, unsigned int frames) { while (true) { - auto t = _butler->get_audio (reinterpret_cast (out_p), frames); + auto t = _butler->get_audio (Butler::Behaviour::NON_BLOCKING, reinterpret_cast (out_p), frames); if (!t || DCPTime(uncorrected_time() - *t) < one_video_frame()) { /* There was an underrun or this audio is on time; carry on */ break;