Fix crash if quick_refresh() fails.
authorCarl Hetherington <cth@carlh.net>
Wed, 28 Feb 2018 00:13:54 +0000 (00:13 +0000)
committerCarl Hetherington <cth@carlh.net>
Wed, 28 Feb 2018 00:13:54 +0000 (00:13 +0000)
src/lib/player_video.cc
src/lib/player_video.h
src/wx/film_viewer.cc
src/wx/film_viewer.h

index c24f9ccaa06b4d70b0b552c62ad4d31876d17c55..8eb39efedca6484e47b50d7fe679cef8d317197e 100644 (file)
@@ -286,17 +286,22 @@ PlayerVideo::shallow_copy () const
                );
 }
 
-/** Re-read crop, fade, inter/out size and colour conversion from our content */
-void
+/** Re-read crop, fade, inter/out size and colour conversion from our content.
+ *  @return true if this was possible, false if not.
+ */
+bool
 PlayerVideo::reset_metadata (dcp::Size video_container_size, dcp::Size film_frame_size)
 {
        shared_ptr<Content> content = _content.lock();
-       DCPOMATIC_ASSERT (content);
-       DCPOMATIC_ASSERT (_video_frame);
+       if (!content || !_video_frame) {
+               return false;
+       }
 
        _crop = content->video->crop();
        _fade = content->video->fade(_video_frame.get());
        _inter_size = content->video->scale().size(content->video, video_container_size, film_frame_size);
        _out_size = video_container_size;
        _colour_conversion = content->video->colour_conversion();
+
+       return true;
 }
index 7cc00f46bb25f4d45dcfb02afdc9342584ff5916..f4bf2a47165be5dbc58b35a3f95e752db7e81ab6 100644 (file)
@@ -71,7 +71,7 @@ public:
        void add_metadata (xmlpp::Node* node) const;
        void send_binary (boost::shared_ptr<Socket> socket) const;
 
-       void reset_metadata (dcp::Size video_container_size, dcp::Size film_frame_size);
+       bool reset_metadata (dcp::Size video_container_size, dcp::Size film_frame_size);
 
        bool has_j2k () const;
        dcp::Data j2k () const;
index 11505e5101e1351699c38d12fcbd291a73dd8fec..ade45d766879ab4030f5dfcdc80fc9ea6b462535 100644 (file)
@@ -446,7 +446,9 @@ FilmViewer::panel_sized (wxSizeEvent& ev)
        _panel_size.height = ev.GetSize().GetHeight();
 
        calculate_sizes ();
-       quick_refresh ();
+       if (!quick_refresh()) {
+               slow_refresh ();
+       }
        update_position_label ();
        update_position_slider ();
 }
@@ -639,6 +641,7 @@ FilmViewer::player_changed (int property, bool frequent)
        }
 
        calculate_sizes ();
+       bool refreshed = false;
        if (
                property == VideoContentProperty::CROP ||
                property == VideoContentProperty::SCALE ||
@@ -648,8 +651,10 @@ FilmViewer::player_changed (int property, bool frequent)
                property == PlayerProperty::VIDEO_CONTAINER_SIZE ||
                property == PlayerProperty::FILM_CONTAINER
                ) {
-               quick_refresh ();
-       } else {
+               refreshed = quick_refresh ();
+       }
+
+       if (!refreshed) {
                slow_refresh ();
        }
        update_position_label ();
@@ -696,16 +701,23 @@ FilmViewer::slow_refresh ()
        seek (_video_position, true);
 }
 
-/** Re-get the current frame quickly by resetting the metadata in the PlayerVideo that we used last time */
-void
+/** Try to re-get the current frame quickly by resetting the metadata
+ *  in the PlayerVideo that we used last time.
+ *  @return true if this was possible, false if not.
+ */
+bool
 FilmViewer::quick_refresh ()
 {
        if (!_player_video.first) {
-               return;
+               return false;
+       }
+
+       if (!_player_video.first->reset_metadata (_player->video_container_size(), _film->frame_size())) {
+               return false;
        }
 
-       _player_video.first->reset_metadata (_player->video_container_size(), _film->frame_size());
        display_player_video ();
+       return true;
 }
 
 void
index f769fd6b97de33bb3eac07536e9c3154e7acb7c2..a41cb310e374ec6b7d5c1cbb7480926af72a4e5a 100644 (file)
@@ -60,7 +60,7 @@ public:
        boost::optional<int> dcp_decode_reduction () const;
 
        void slow_refresh ();
-       void quick_refresh ();
+       bool quick_refresh ();
 
        int dropped () const {
                return _dropped;