Merge master.
authorCarl Hetherington <cth@carlh.net>
Mon, 17 Mar 2014 11:25:32 +0000 (11:25 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 17 Mar 2014 11:25:32 +0000 (11:25 +0000)
1  2 
ChangeLog
src/wx/film_viewer.cc

diff --combined ChangeLog
index e70b7373e8d8059f212a3211b9aaddbbf3a6303a,5a99d30ff0a76a1525db6738a009684081a72bc8..2edfe0e121e482b7af60bd004a583fe869787501
+++ b/ChangeLog
@@@ -1,7 -1,9 +1,13 @@@
 +2014-03-07  Carl Hetherington  <cth@carlh.net>
 +
 +      * Add subtitle view.
 +
+ 2014-03-17  Carl Hetherington  <cth@carlh.net>
+       * Improve behaviour of the position slider at the end of films.
+       * Version 1.66.2 released.
  2014-03-17  Carl Hetherington  <cth@carlh.net>
  
        * Improve appearance of config dialog on OS X.
diff --combined src/wx/film_viewer.cc
index 7e1b618119eec5367b0374fa09239886a3f12181,ce5eab00e1db8e8f0bd4bb7e707fe470e59bc7cb..b0bc65750f71ea8e202d973a07792a858c814c13
@@@ -36,7 -36,6 +36,7 @@@
  #include "lib/player.h"
  #include "lib/video_content.h"
  #include "lib/video_decoder.h"
 +#include "lib/timer.h"
  #include "film_viewer.h"
  #include "wx_util.h"
  
@@@ -51,7 -50,7 +51,7 @@@ using std::make_pair
  using boost::shared_ptr;
  using boost::dynamic_pointer_cast;
  using boost::weak_ptr;
 -using libdcp::Size;
 +using dcp::Size;
  
  FilmViewer::FilmViewer (shared_ptr<Film> f, wxWindow* p)
        : wxPanel (p)
@@@ -122,7 -121,7 +122,7 @@@ FilmViewer::set_film (shared_ptr<Film> 
        _frame.reset ();
        
        _slider->SetValue (0);
 -      set_position_text (0);
 +      set_position_text (DCPTime ());
        
        if (!_film) {
                return;
        }
        
        _player->disable_audio ();
 +      _player->set_approximate_size ();
        _player->Video.connect (boost::bind (&FilmViewer::process_video, this, _1, _2, _5));
        _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1));
  
@@@ -174,10 -172,10 +174,10 @@@ FilmViewer::timer (
        
        fetch_next_frame ();
  
 -      Time const len = _film->length ();
 +      DCPTime const len = _film->length ();
  
 -      if (len) {
 -              int const new_slider_position = 4096 * _player->video_position() / len;
 +      if (len.get ()) {
 +              int const new_slider_position = 4096 * _player->video_position().get() / len.get();
                if (new_slider_position != _slider->GetValue()) {
                        _slider->SetValue (new_slider_position);
                }
@@@ -221,14 -219,13 +221,19 @@@ voi
  FilmViewer::slider_moved ()
  {
        if (_film && _player) {
 -              Time t = _slider->GetValue() * _film->length() / 4096;
 -              /* Ensure that we hit the end of the film at the end of the slider */
 -              if (t >= _film->length ()) {
 -                      t = _film->length() - _film->video_frames_to_time (1);
 +              try {
++                      Time t = _slider->GetValue() * _film->length() / 4096;
++                      /* Ensure that we hit the end of the film at the end of the slider */
++                      if (t >= _film->length ()) {
++                              t = _film->length() - _film->video_frames_to_time (1);
++                      }
 +                      _player->seek (DCPTime (_film->length().get() * _slider->GetValue() / 4096), false);
 +                      fetch_next_frame ();
 +              } 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.
 +                      */
                }
 -              _player->seek (t, false);
 -              fetch_next_frame ();
        }
  }
  
@@@ -267,13 -264,6 +272,13 @@@ FilmViewer::calculate_sizes (
        _out_size.width = max (64, _out_size.width);
        _out_size.height = max (64, _out_size.height);
  
 +      /* The player will round its image down to the nearest 4 pixels
 +         to speed up its scale, so do similar here to avoid black borders
 +         around things.  This is a bit of a hack.
 +      */
 +      _out_size.width &= ~3;
 +      _out_size.height &= ~3;
 +
        _player->set_video_container_size (_out_size);
  }
  
@@@ -298,24 -288,20 +303,24 @@@ FilmViewer::check_play_state (
  }
  
  void
 -FilmViewer::process_video (shared_ptr<PlayerImage> image, Eyes eyes, Time t)
 +FilmViewer::process_video (shared_ptr<PlayerImage> image, Eyes eyes, DCPTime t)
  {
        if (eyes == EYES_RIGHT) {
                return;
        }
 -      
 -      _frame = image->image ();
 +
 +      /* Going via BGRA here makes the scaler faster then using RGB24 directly (about
 +         twice on x86 Linux).
 +      */
 +      shared_ptr<Image> im = image->image (PIX_FMT_BGRA, true);
 +      _frame = im->scale (im->size(), Scaler::from_id ("fastbilinear"), PIX_FMT_RGB24, false);
        _got_frame = true;
  
        set_position_text (t);
  }
  
  void
 -FilmViewer::set_position_text (Time t)
 +FilmViewer::set_position_text (DCPTime t)
  {
        if (!_film) {
                _frame_number->SetLabel ("0");
                
        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));
 +      _frame_number->SetLabel (wxString::Format (wxT("%d"), int (rint (t.seconds() * fps)) + 1));
        
 -      double w = static_cast<double>(t) / TIME_HZ;
 +      double w = t.seconds ();
        int const h = (w / 3600);
        w -= h * 3600;
        int const m = (w / 60);
@@@ -398,19 -384,13 +403,19 @@@ FilmViewer::back_clicked (
           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;
 +      DCPTime p = _player->video_position() - DCPTime::from_frames (2, _film->video_frame_rate ());
 +      if (p < DCPTime ()) {
 +              p = DCPTime ();
        }
        
 -      _player->seek (p, true);
 -      fetch_next_frame ();
 +      try {
 +              _player->seek (p, true);
 +              fetch_next_frame ();
 +      } 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.
 +              */
 +      }
  }
  
  void