Extract common code out into kdm_for_screen()
[dcpomatic.git] / src / wx / player_information.cc
index 36fb0e0ca4bfe8fbb76a9a98e1438dabd62d6d14..9a569c00cc127226dd0d3c6c3db76cef9df1d812 100644 (file)
 #include "lib/video_content.h"
 #include "lib/audio_content.h"
 #include "lib/dcp_content.h"
+#include "lib/film.h"
 
 using std::cout;
 using std::string;
 using boost::shared_ptr;
+using boost::weak_ptr;
 using boost::dynamic_pointer_cast;
 using boost::optional;
 
 /* This should be even */
 static int const dcp_lines = 6;
 
-PlayerInformation::PlayerInformation (wxWindow* parent, ControlFilmViewer* viewer)
+PlayerInformation::PlayerInformation (wxWindow* parent, weak_ptr<FilmViewer> viewer)
        : wxPanel (parent)
        , _viewer (viewer)
        , _sizer (new wxBoxSizer (wxHORIZONTAL))
@@ -86,15 +88,29 @@ PlayerInformation::PlayerInformation (wxWindow* parent, ControlFilmViewer* viewe
 void
 PlayerInformation::periodic_update ()
 {
-       checked_set (_dropped, wxString::Format(_("Dropped frames: %d"), _viewer->dropped()));
+       shared_ptr<FilmViewer> fv = _viewer.lock ();
+       if (fv) {
+               wxString s = wxString::Format(_("Dropped frames: %d"), fv->dropped() + fv->errored());
+               if (fv->errored() == 1) {
+                       s += wxString::Format(_(" (%d error)"), fv->errored());
+               } else if (fv->errored() > 1) {
+                       s += wxString::Format(_(" (%d errors)"), fv->errored());
+               }
+               checked_set (_dropped, s);
+       }
 }
 
 void
 PlayerInformation::triggered_update ()
 {
+       shared_ptr<FilmViewer> fv = _viewer.lock ();
+       if (!fv) {
+               return;
+       }
+
        shared_ptr<DCPContent> dcp;
-       if (_viewer->film()) {
-               ContentList content = _viewer->film()->content();
+       if (fv->film()) {
+               ContentList content = fv->film()->content();
                if (content.size() == 1) {
                        dcp = dynamic_pointer_cast<DCPContent>(content.front());
                }
@@ -143,14 +159,14 @@ PlayerInformation::triggered_update ()
 
        string const len = String::compose(
                wx_to_std(_("Length: %1 (%2 frames)")),
-               time_to_hmsf(dcp->full_length(), lrint(*vfr)),
-               dcp->full_length().frames_round(*vfr)
+               time_to_hmsf(dcp->full_length(fv->film()), lrint(*vfr)),
+               dcp->full_length(fv->film()).frames_round(*vfr)
                );
 
        checked_set (_dcp[r++], std_to_wx(len));
 
        dcp::Size decode = dcp->video->size();
-       optional<int> reduction = _viewer->dcp_decode_reduction();
+       optional<int> reduction = fv->dcp_decode_reduction();
        if (reduction) {
                decode.width /= pow(2, *reduction);
                decode.height /= pow(2, *reduction);