X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=c56e2f5d26f89a3478e3e2385ddd99ee5dd82dd2;hp=ac12bea3f6f9870a001e976b20d6f5d0eb1d8e0a;hb=7e39519864cf40256a31fb6d42818c1a02fa2d63;hpb=30c07e4fa2b4eeb3f5e5b21b9ccbc63b28226690 diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index ac12bea3f..c56e2f5d2 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -32,36 +32,37 @@ #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 +#include extern "C" { #include } -#include +LIBDCP_DISABLE_WARNINGS #include -#include +LIBDCP_ENABLE_WARNINGS #include 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 +FilmViewer::position_in_content (shared_ptr 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 crop) +{ + if (crop != _crop_guess) { + _crop_guess = crop; + _video_view->update (); + } +} + + +void +FilmViewer::unset_crop_guess () +{ + _crop_guess = boost::none; + _video_view->update (); +} +