X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=fb02f0a0ff41074015ebc9c6b9b939aa5698f6b1;hb=e9c91414ade10f93bb23b33d48d30bf80045d7b1;hp=5102697935b6565b1d1598079acafab871de05cd;hpb=4ef0091b33e12450e5de4e420dfabfa8b110fc35;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 510269793..fb02f0a0f 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -160,15 +160,17 @@ FilmViewer::set_film (shared_ptr film) _video_view->clear (); _closed_captions_dialog->clear (); + destroy_butler(); + if (!_film) { - _player.reset (); - recreate_butler (); + _player = boost::none; + resume(); _video_view->update (); return; } try { - _player = make_shared(_film, _optimise_for_j2k ? Image::Alignment::COMPACT : Image::Alignment::PADDED); + _player.emplace(_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); @@ -176,6 +178,7 @@ FilmViewer::set_film (shared_ptr film) } catch (bad_alloc &) { error_dialog (_video_view->get(), _("There is not enough free memory to do that.")); _film.reset (); + resume(); return; } @@ -195,7 +198,7 @@ FilmViewer::set_film (shared_ptr film) _closed_captions_dialog->update_tracks (_film); - recreate_butler (); + create_butler(); calculate_sizes (); slow_refresh (); @@ -203,38 +206,51 @@ FilmViewer::set_film (shared_ptr film) void -FilmViewer::recreate_butler () +FilmViewer::destroy_butler() { suspend (); _butler.reset (); +} + + +void +FilmViewer::destroy_and_maybe_create_butler() +{ + destroy_butler(); if (!_film) { resume (); return; } + create_butler(); +} + + +void +FilmViewer::create_butler() +{ #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 + DCPOMATIC_ASSERT(_player); + _butler = std::make_shared( _film, - _player, + *_player, Config::instance()->audio_mapping(_audio_channels), _audio_channels, 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 (); @@ -306,6 +322,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); } @@ -467,7 +493,7 @@ FilmViewer::film_change (ChangeType type, Film::Property p) } if (p == Film::Property::AUDIO_CHANNELS) { - recreate_butler (); + destroy_and_maybe_create_butler(); } else if (p == Film::Property::VIDEO_FRAME_RATE) { _video_view->set_video_frame_rate (_film->video_frame_rate()); } else if (p == Film::Property::THREE_D) { @@ -510,6 +536,7 @@ FilmViewer::quick_refresh () void FilmViewer::seek (shared_ptr content, ContentTime t, bool accurate) { + DCPOMATIC_ASSERT(_player); auto dt = _player->content_time_to_dcp (content, t); if (dt) { seek (*dt, accurate); @@ -569,7 +596,7 @@ void FilmViewer::config_changed (Config::Property p) { if (p == Config::AUDIO_MAPPING) { - recreate_butler (); + destroy_and_maybe_create_butler(); return; } @@ -615,11 +642,11 @@ FilmViewer::config_changed (Config::Property p) _("Could not set up audio output. There will be no audio during the preview."), std_to_wx(e.what()) ); } - recreate_butler (); + destroy_and_maybe_create_butler(); } else { _audio_channels = 0; - recreate_butler (); + destroy_and_maybe_create_butler(); } } @@ -715,6 +742,7 @@ FilmViewer::dcp_decode_reduction () const optional FilmViewer::position_in_content (shared_ptr content) const { + DCPOMATIC_ASSERT(_player); return _player->dcp_to_content_time (content, position()); }