X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=f8373d3fdc1f31655d9bea599396c24c4c880a1c;hb=d62877ae6c4e316e43f4052e4b9ba673610012cf;hp=9cf47950857d9d6ed6b30d5f439be395cceb21fe;hpb=956da4b106e14c49b179176acf6484c479c21094;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 9cf479508..f8373d3fd 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -34,8 +34,10 @@ #include "lib/exceptions.h" #include "lib/examine_content_job.h" #include "lib/filter.h" -#include "lib/playlist.h" +#include "lib/player.h" #include "lib/video_content.h" +#include "lib/ffmpeg_content.h" +#include "lib/imagemagick_content.h" #include "film_viewer.h" #include "wx_util.h" #include "video_decoder.h" @@ -46,6 +48,7 @@ using std::max; using std::cout; using std::list; using boost::shared_ptr; +using boost::dynamic_pointer_cast; using libdcp::Size; FilmViewer::FilmViewer (shared_ptr f, wxWindow* p) @@ -55,7 +58,6 @@ FilmViewer::FilmViewer (shared_ptr f, wxWindow* p) , _play_button (new wxToggleButton (this, wxID_ANY, _("Play"))) , _display_frame_x (0) , _got_frame (false) - , _clear_required (false) { _panel->SetDoubleBuffered (true); #if wxMAJOR_VERSION == 2 && wxMINOR_VERSION >= 9 @@ -98,7 +100,6 @@ FilmViewer::film_changed (Film::Property p) break; case Film::CONTENT: { - setup_player (); calculate_sizes (); get_frame (); _panel->Refresh (); @@ -108,6 +109,10 @@ FilmViewer::film_changed (Film::Property p) case Film::WITH_SUBTITLES: case Film::SUBTITLE_OFFSET: case Film::SUBTITLE_SCALE: + raw_to_display (); + _panel->Refresh (); + _panel->Update (); + break; case Film::SCALER: case Film::FILTERS: case Film::CROP: @@ -118,50 +123,35 @@ FilmViewer::film_changed (Film::Property p) } } -void -FilmViewer::setup_player () -{ - _player = _film->player (); - _player->disable_audio (); - _player->disable_subtitles (); - _player->disable_video_sync (); - _player->Video.connect (bind (&FilmViewer::process_video, this, _1, _2, _3)); -} - -void -FilmViewer::film_content_changed (int p) -{ - if (p == VideoContentProperty::VIDEO_LENGTH || p == VideoContentProperty::VIDEO_SIZE) { - setup_player (); - calculate_sizes (); - get_frame (); - _panel->Refresh (); - _v_sizer->Layout (); - } -} - void FilmViewer::set_film (shared_ptr f) { if (_film == f) { return; } - + _film = f; if (!_film) { return; } + _player = f->player (); + _player->disable_audio (); + _player->disable_video_sync (); + /* Don't disable subtitles here as we may need them, and it's nice to be able to turn them + on and off without needing obtain a new Player. + */ + + _player->Video.connect (bind (&FilmViewer::process_video, this, _1, _2, _3)); + _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1)); - _film->ContentChanged.connect (boost::bind (&FilmViewer::film_content_changed, this, _1)); film_changed (Film::CONTENT); film_changed (Film::FORMAT); film_changed (Film::WITH_SUBTITLES); film_changed (Film::SUBTITLE_OFFSET); film_changed (Film::SUBTITLE_SCALE); - film_changed (Film::SUBTITLE_STREAM); } void @@ -202,11 +192,6 @@ FilmViewer::paint_panel (wxPaintEvent &) { wxPaintDC dc (_panel); - if (_clear_required) { - dc.Clear (); - _clear_required = false; - } - if (!_display_frame || !_film || !_out_size.width || !_out_size.height) { dc.Clear (); return; @@ -228,6 +213,22 @@ FilmViewer::paint_panel (wxPaintEvent &) wxBitmap sub_bitmap (sub); dc.DrawBitmap (sub_bitmap, _display_sub_position.x, _display_sub_position.y); } + + if (_film_size.width < _panel_size.width) { + wxPen p (GetBackgroundColour ()); + wxBrush b (GetBackgroundColour ()); + dc.SetPen (p); + dc.SetBrush (b); + dc.DrawRectangle (_film_size.width, 0, _panel_size.width - _film_size.width, _panel_size.height); + } + + if (_film_size.height < _panel_size.height) { + wxPen p (GetBackgroundColour ()); + wxBrush b (GetBackgroundColour ()); + dc.SetPen (p); + dc.SetBrush (b); + dc.DrawRectangle (0, _film_size.height, _panel_size.width, _panel_size.height - _film_size.height); + } } @@ -276,12 +277,7 @@ FilmViewer::raw_to_display () return; } - libdcp::Size old_size; - if (_display_frame) { - old_size = _display_frame->size(); - } - - boost::shared_ptr input = _raw_frame; + shared_ptr input = _raw_frame; pair const s = Filter::ffmpeg_strings (_film->filters()); if (!s.second.empty ()) { @@ -291,10 +287,6 @@ FilmViewer::raw_to_display () /* Get a compacted image as we have to feed it to wxWidgets */ _display_frame = input->scale_and_convert_to_rgb (_film_size, 0, _film->scaler(), false); - if (old_size != _display_frame->size()) { - _clear_required = true; - } - if (_raw_sub) { /* Our output is already cropped by the decoder, so we need to account for that @@ -400,7 +392,7 @@ FilmViewer::get_frame () _display_frame.reset (); return; } - + try { _got_frame = false; while (!_got_frame) {