X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=03e8419a091f16b5fa95c7085af4f376824ff5a9;hb=247b3423fcea1d4d20d797b48cdbaafa8dad1ea1;hp=b9d554c686b77ccad5af2fc9a8f463c750340501;hpb=8349f0c97d98c0b7550ff4c76ad25f8f06270d6a;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index b9d554c68..03e8419a0 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -93,15 +93,15 @@ FilmViewer::FilmViewer (shared_ptr f, wxWindow* p) _back_button->SetMinSize (wxSize (32, -1)); _forward_button->SetMinSize (wxSize (32, -1)); - _panel->Connect (wxID_ANY, wxEVT_PAINT, wxPaintEventHandler (FilmViewer::paint_panel), 0, this); - _panel->Connect (wxID_ANY, wxEVT_SIZE, wxSizeEventHandler (FilmViewer::panel_sized), 0, this); - _slider->Connect (wxID_ANY, wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler (FilmViewer::slider_moved), 0, this); - _slider->Connect (wxID_ANY, wxEVT_SCROLL_PAGEUP, wxScrollEventHandler (FilmViewer::slider_moved), 0, this); - _slider->Connect (wxID_ANY, wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler (FilmViewer::slider_moved), 0, this); - _play_button->Connect (wxID_ANY, wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler (FilmViewer::play_clicked), 0, this); - _timer.Connect (wxID_ANY, wxEVT_TIMER, wxTimerEventHandler (FilmViewer::timer), 0, this); - _back_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmViewer::back_clicked), 0, this); - _forward_button->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmViewer::forward_clicked), 0, this); + _panel->Bind (wxEVT_PAINT, boost::bind (&FilmViewer::paint_panel, this)); + _panel->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::panel_sized, this, _1)); + _slider->Bind (wxEVT_SCROLL_THUMBTRACK, boost::bind (&FilmViewer::slider_moved, this)); + _slider->Bind (wxEVT_SCROLL_PAGEUP, boost::bind (&FilmViewer::slider_moved, this)); + _slider->Bind (wxEVT_SCROLL_PAGEDOWN, boost::bind (&FilmViewer::slider_moved, this)); + _play_button->Bind (wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, boost::bind (&FilmViewer::play_clicked, this)); + _timer.Bind (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this)); + _back_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmViewer::back_clicked, this)); + _forward_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmViewer::forward_clicked, this)); set_film (f); @@ -120,8 +120,7 @@ FilmViewer::set_film (shared_ptr f) _film = f; _frame.reset (); - _queue.clear (); - + _slider->SetValue (0); set_position_text (0); @@ -131,11 +130,11 @@ FilmViewer::set_film (shared_ptr f) _player = f->make_player (); _player->disable_audio (); - _player->Video.connect (boost::bind (&FilmViewer::process_video, this, _1, _2, _4)); + _player->Video.connect (boost::bind (&FilmViewer::process_video, this, _1, _2, _5)); _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1)); calculate_sizes (); - fetch_current_frame_again (); + fetch_next_frame (); } void @@ -145,21 +144,21 @@ FilmViewer::fetch_current_frame_again () return; } - /* Player::video_position is the time after the last frame that we received. - We want to see it again, so seek back one frame. + /* We could do this with a seek and a fetch_next_frame, but this is + a shortcut to make it quicker. */ - Time p = _player->video_position() - _film->video_frames_to_time (1); - if (p < 0) { - p = 0; + _got_frame = false; + if (!_player->repeat_last_video ()) { + fetch_next_frame (); } - - _player->seek (p, true); - fetch_next_frame (); + + _panel->Refresh (); + _panel->Update (); } void -FilmViewer::timer (wxTimerEvent &) +FilmViewer::timer () { if (!_player) { return; @@ -179,7 +178,7 @@ FilmViewer::timer (wxTimerEvent &) void -FilmViewer::paint_panel (wxPaintEvent &) +FilmViewer::paint_panel () { wxPaintDC dc (_panel); @@ -213,7 +212,7 @@ FilmViewer::paint_panel (wxPaintEvent &) void -FilmViewer::slider_moved (wxScrollEvent &) +FilmViewer::slider_moved () { if (_film && _player) { _player->seek (_slider->GetValue() * _film->length() / 4096, false); @@ -239,7 +238,7 @@ FilmViewer::calculate_sizes () Ratio const * container = _film->container (); - float const panel_ratio = static_cast (_panel_size.width) / _panel_size.height; + float const panel_ratio = _panel_size.ratio (); float const film_ratio = container ? container->ratio () : 1.78; if (panel_ratio < film_ratio) { @@ -260,7 +259,7 @@ FilmViewer::calculate_sizes () } void -FilmViewer::play_clicked (wxCommandEvent &) +FilmViewer::play_clicked () { check_play_state (); } @@ -268,12 +267,12 @@ FilmViewer::play_clicked (wxCommandEvent &) void FilmViewer::check_play_state () { - if (!_film || _film->dcp_video_frame_rate() == 0) { + if (!_film || _film->video_frame_rate() == 0) { return; } if (_play_button->GetValue()) { - _timer.Start (1000 / _film->dcp_video_frame_rate()); + _timer.Start (1000 / _film->video_frame_rate()); } else { _timer.Stop (); } @@ -286,12 +285,6 @@ FilmViewer::process_video (shared_ptr image, Eyes eyes, Time t) return; } - if (_got_frame) { - /* This is an additional frame emitted by a single pass. Store it. */ - _queue.push_front (make_pair (image, t)); - return; - } - _frame = image; _got_frame = true; @@ -307,7 +300,7 @@ FilmViewer::set_position_text (Time t) return; } - double const fps = _film->dcp_video_frame_rate (); + double const fps = _film->video_frame_rate (); /* Count frame number from 1 ... not sure if this is the best idea */ _frame_number->SetLabel (wxString::Format (wxT("%d"), int (rint (t * fps / TIME_HZ)) + 1)); @@ -335,17 +328,16 @@ FilmViewer::fetch_next_frame () _got_frame = false; - if (!_queue.empty ()) { - process_video (_queue.back().first, EYES_BOTH, _queue.back().second); - _queue.pop_back (); - } else { - try { - while (!_got_frame && !_player->pass ()) {} - } catch (DecodeError& e) { - _play_button->SetValue (false); - check_play_state (); - error_dialog (this, wxString::Format (_("Could not decode video for view (%s)"), std_to_wx(e.what()).data())); - } + try { + while (!_got_frame && !_player->pass ()) {} + } catch (DecodeError& e) { + _play_button->SetValue (false); + check_play_state (); + error_dialog (this, wxString::Format (_("Could not decode video for view (%s)"), std_to_wx(e.what()).data())); + } catch (OpenFileError& e) { + /* There was a problem opening a content file; we'll let this slide as it + probably means a missing content file, which we're already taking care of. + */ } _panel->Refresh (); @@ -373,7 +365,7 @@ FilmViewer::active_jobs_changed (bool a) } void -FilmViewer::back_clicked (wxCommandEvent &) +FilmViewer::back_clicked () { if (!_player) { return; @@ -382,13 +374,18 @@ FilmViewer::back_clicked (wxCommandEvent &) /* Player::video_position is the time after the last frame that we received. We want to see the one before it, so we need to go back 2. */ + + Time p = _player->video_position() - _film->video_frames_to_time (2); + if (p < 0) { + p = 0; + } - _player->seek (_player->video_position() - _film->video_frames_to_time(2), true); + _player->seek (p, true); fetch_next_frame (); } void -FilmViewer::forward_clicked (wxCommandEvent &) +FilmViewer::forward_clicked () { if (!_player) { return;