Merge master.
[dcpomatic.git] / src / wx / film_viewer.cc
index e6b8bf8dd06cd37b6d4e67fd41a3f3cec2c3381d..deee65a5fca4dc07f7d401f0234386d9937257cf 100644 (file)
@@ -46,6 +46,7 @@ using std::min;
 using std::max;
 using std::cout;
 using std::list;
+using std::bad_alloc;
 using std::make_pair;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
@@ -127,7 +128,14 @@ FilmViewer::set_film (shared_ptr<Film> f)
                return;
        }
 
-       _player = f->make_player ();
+       try {
+               _player = f->make_player ();
+       } catch (bad_alloc) {
+               error_dialog (this, _("There is not enough free memory to do that."));
+               _film.reset ();
+               return;
+       }
+       
        _player->disable_audio ();
        _player->set_approximate_size ();
        _player->Video.connect (boost::bind (&FilmViewer::process_video, this, _1, _2, _5));
@@ -213,8 +221,14 @@ void
 FilmViewer::slider_moved ()
 {
        if (_film && _player) {
-               _player->seek (_slider->GetValue() * _film->length() / 4096, false);
-               fetch_next_frame ();
+               try {
+                       _player->seek (_slider->GetValue() * _film->length() / 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.
+                       */
+               }
        }
 }
 
@@ -253,6 +267,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);
 }
 
@@ -382,8 +403,14 @@ FilmViewer::back_clicked ()
                p = 0;
        }
        
-       _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