Extract common code out into kdm_for_screen()
[dcpomatic.git] / src / wx / video_waveform_plot.cc
index 339689a2ebdbdaeea28ef45ab4482ec7520c93b3..c6fa883fa871c227b321dea92819d126998cd922 100644 (file)
 */
 
 #include "video_waveform_plot.h"
-#include "control_film_viewer.h"
+#include "film_viewer.h"
 #include "wx_util.h"
 #include "lib/image.h"
 #include "lib/film.h"
 #include "lib/dcp_video.h"
+#include "lib/player_video.h"
 #include <dcp/locale_convert.h>
 #include <dcp/openjpeg_image.h>
 #include <wx/rawbmp.h>
@@ -43,7 +44,7 @@ int const VideoWaveformPlot::_vertical_margin = 8;
 int const VideoWaveformPlot::_pixel_values = 4096;
 int const VideoWaveformPlot::_x_axis_width = 52;
 
-VideoWaveformPlot::VideoWaveformPlot (wxWindow* parent, weak_ptr<const Film> film, ControlFilmViewer* viewer)
+VideoWaveformPlot::VideoWaveformPlot (wxWindow* parent, weak_ptr<const Film> film, weak_ptr<FilmViewer> viewer)
        : wxPanel (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE)
        , _film (film)
        , _dirty (true)
@@ -55,7 +56,10 @@ VideoWaveformPlot::VideoWaveformPlot (wxWindow* parent, weak_ptr<const Film> fil
        SetDoubleBuffered (true);
 #endif
 
-       _viewer_connection = viewer->ImageChanged.connect (boost::bind (&VideoWaveformPlot::set_image, this, _1));
+       shared_ptr<FilmViewer> fv = viewer.lock ();
+       DCPOMATIC_ASSERT (fv);
+
+       _viewer_connection = fv->ImageChanged.connect (boost::bind (&VideoWaveformPlot::set_image, this, _1));
 
        Bind (wxEVT_PAINT, boost::bind (&VideoWaveformPlot::paint, this));
        Bind (wxEVT_SIZE,  boost::bind (&VideoWaveformPlot::sized, this, _1));
@@ -190,7 +194,11 @@ VideoWaveformPlot::set_image (weak_ptr<PlayerVideo> image)
        }
 
        shared_ptr<PlayerVideo> pv = image.lock ();
-       _image = DCPVideo::convert_to_xyz (pv, boost::bind (&note));
+       DCPOMATIC_ASSERT (pv);
+       /* We must copy the PlayerVideo here as we will call ::image() on it, potentially
+          with a different pixel_format than was used when ::prepare() was called.
+       */
+       _image = DCPVideo::convert_to_xyz (pv->shallow_copy(), boost::bind (&note));
        _dirty = true;
        Refresh ();
 }