- list<shared_ptr<DCPVideo> > dcp_video = _player->get_video (p, accurate);
- if (!dcp_video.empty ()) {
- _frame = dcp_video.front()->image (PIX_FMT_BGRA, true);
- _frame = _frame->scale (_frame->size(), Scaler::from_id ("fastbilinear"), PIX_FMT_RGB24, false);
+ list<shared_ptr<PlayerVideo> > pvf;
+ try {
+ pvf = _player->get_video (p, accurate);
+ } catch (exception& e) {
+ error_dialog (this, wxString::Format (_("Could not get video for view (%s)"), std_to_wx(e.what()).data()));
+ }
+
+ if (!pvf.empty ()) {
+ try {
+ _frame = pvf.front()->image (PIX_FMT_RGB24, boost::bind (&Log::dcp_log, _film->log().get(), _1, _2));
+ ImageChanged (pvf.front ());
+
+ dcp::YUVToRGB yuv_to_rgb = dcp::YUV_TO_RGB_REC601;
+ if (pvf.front()->colour_conversion()) {
+ yuv_to_rgb = pvf.front()->colour_conversion().get().yuv_to_rgb();
+ }
+
+ _frame = _frame->scale (_frame->size(), yuv_to_rgb, PIX_FMT_RGB24, false);
+ _position = pvf.front()->time ();
+ _inter_position = pvf.front()->inter_position ();
+ _inter_size = pvf.front()->inter_size ();
+ } catch (dcp::DCPReadError& e) {
+ /* This can happen on the following sequence of events:
+ * - load encrypted DCP
+ * - add KDM
+ * - DCP is examined again, which sets its "playable" flag to 1
+ * - as a side effect of the exam, the viewer is updated using the old pieces
+ * - the DCPDecoder in the old piece gives us an encrypted frame
+ * - then, the pieces are re-made (but too late).
+ *
+ * I hope there's a better way to handle this ...
+ */
+ _frame.reset ();
+ _position = p;
+ }