Fix display of no-scale mode in the player; the image still has to be scaled for...
[dcpomatic.git] / src / wx / film_viewer.cc
index 0e1fe3ea0ab87baf7453e175c6c30ad204efe0b2..45372d8111f532495d82cd56409aaa22773af1a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -45,6 +45,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;
@@ -126,7 +127,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->Video.connect (boost::bind (&FilmViewer::process_video, this, _1, _2, _5));
        _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1));
@@ -185,9 +193,7 @@ FilmViewer::paint_panel ()
                return;
        }
 
-       shared_ptr<Image> packed_frame (new Image (_frame, false));
-
-       wxImage frame (_out_size.width, _out_size.height, packed_frame->data()[0], true);
+       wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true);
        wxBitmap frame_bitmap (frame);
        dc.DrawBitmap (frame_bitmap, 0, 0);
 
@@ -277,13 +283,13 @@ FilmViewer::check_play_state ()
 }
 
 void
-FilmViewer::process_video (shared_ptr<const Image> image, Eyes eyes, Time t)
+FilmViewer::process_video (shared_ptr<PlayerImage> image, Eyes eyes, Time t)
 {
        if (eyes == EYES_RIGHT) {
                return;
        }
        
-       _frame = image;
+       _frame = image->image ();
        _got_frame = true;
 
        set_position_text (t);
@@ -398,7 +404,7 @@ FilmViewer::player_changed (bool frequent)
        if (frequent) {
                return;
        }
-       
+
        calculate_sizes ();
        fetch_current_frame_again ();
 }