X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=fee5605da9c3352193610325752a68dbe0ca03ba;hb=6f856af55898f94b45e3be28aa4f7c962de8a398;hp=0a72b5a1da568d43a06c0a27dc25d2d92e8d60d4;hpb=e5b744922fb6aed65ec13f22a9de0c86dd1bd561;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 0a72b5a1d..fee5605da 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -89,6 +89,7 @@ FilmViewer::FilmViewer (wxWindow* p) , _pad_black (false) #ifdef DCPOMATIC_VARIANT_SWAROOP , _in_watermark (false) + , _background_image (false) #endif { #ifndef __WXOSX__ @@ -121,8 +122,9 @@ FilmViewer::set_film (shared_ptr film) } _film = film; - - FilmChanged (); + _video_position = DCPTime (); + _player_video.first.reset (); + _player_video.second = DCPTime (); _frame.reset (); _closed_captions_dialog->clear (); @@ -141,7 +143,7 @@ FilmViewer::set_film (shared_ptr film) if (_dcp_decode_reduction) { _player->set_dcp_decode_reduction (_dcp_decode_reduction); } - } catch (bad_alloc) { + } catch (bad_alloc &) { error_dialog (_panel, _("There is not enough free memory to do that.")); _film.reset (); return; @@ -193,7 +195,7 @@ FilmViewer::recreate_butler () map.set (dcp::RS, 1, 1 / sqrt(2)); // Rs -> Rt } - _butler.reset (new Butler (_player, _film->log(), map, _audio_channels)); + _butler.reset (new Butler(_player, map, _audio_channels, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true)); if (!Config::instance()->sound() && !_audio.isStreamOpen()) { _butler->disable_audio (); } @@ -267,14 +269,11 @@ FilmViewer::display_player_video () * The content's specified colour conversion indicates the colourspace * which the content is in (according to the user). * - * PlayerVideo::image (bound to PlayerVideo::always_rgb) will take the source + * PlayerVideo::image (bound to PlayerVideo::force) will take the source * image and convert it (from whatever the user has said it is) to RGB. */ - _frame = _player_video.first->image ( - bind (&PlayerVideo::always_rgb, _1), - false, true - ); + _frame = _player_video.first->image (bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true); ImageChanged (_player_video.first); @@ -300,6 +299,8 @@ FilmViewer::timer () if (next >= _film->length()) { stop (); + Finished (); + return; } _timer.Start (max ((next.seconds() - time().seconds()) * 1000, 1.0), wxTIMER_ONE_SHOT); @@ -309,21 +310,42 @@ FilmViewer::timer () } } +bool +#ifdef DCPOMATIC_VARIANT_SWAROOP +FilmViewer::maybe_draw_background_image (wxPaintDC& dc) +{ + optional bg = Config::instance()->player_background_image(); + if (bg) { + wxImage image (std_to_wx(bg->string())); + wxBitmap bitmap (image); + dc.DrawBitmap (bitmap, max(0, (_panel_size.width - image.GetSize().GetWidth()) / 2), max(0, (_panel_size.height - image.GetSize().GetHeight()) / 2)); + return true; + } + + return false; +} +#else +FilmViewer::maybe_draw_background_image (wxPaintDC &) +{ + return false; +} +#endif + void FilmViewer::paint_panel () { wxPaintDC dc (_panel); - if (!_frame || !_film || !_out_size.width || !_out_size.height || _out_size != _frame->size()) { - dc.Clear (); #ifdef DCPOMATIC_VARIANT_SWAROOP - optional bg = Config::instance()->player_background_image(); - if (bg) { - wxImage image (std_to_wx(bg->string())); - wxBitmap bitmap (image); - dc.DrawBitmap (bitmap, max(0, (_panel_size.width - image.GetSize().GetWidth()) / 2), max(0, (_panel_size.height - image.GetSize().GetHeight()) / 2)); - } + if (_background_image) { + dc.Clear (); + maybe_draw_background_image (dc); + return; + } #endif + + if (!_out_size.width || !_out_size.height || !_film || !_frame || _out_size != _frame->size()) { + dc.Clear (); return; } @@ -534,7 +556,7 @@ FilmViewer::quick_refresh () return false; } - if (!_player_video.first->reset_metadata (_player->video_container_size(), _film->frame_size())) { + if (!_player_video.first->reset_metadata (_film, _player->video_container_size(), _film->frame_size())) { return false; } @@ -590,7 +612,6 @@ FilmViewer::seek (DCPTime t, bool accurate) } PositionChanged (); - Seeked (position()); } void