Use AV_ prefixes on some FFmpeg bits.
[dcpomatic.git] / src / wx / film_viewer.cc
index 6f29bcc33b4b40cb045d59067e7d093ba156557f..5cbe884ec8bd43f42daf28da1724a6df0eb185a9 100644 (file)
@@ -54,6 +54,7 @@ using std::exception;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
 using boost::weak_ptr;
+using boost::optional;
 using dcp::Size;
 
 FilmViewer::FilmViewer (wxWindow* p)
@@ -113,7 +114,7 @@ FilmViewer::FilmViewer (wxWindow* p)
        set_film (shared_ptr<Film> ());
 
        JobManager::instance()->ActiveJobsChanged.connect (
-               bind (&FilmViewer::active_jobs_changed, this, _1)
+               bind (&FilmViewer::active_jobs_changed, this, _2)
                );
 
        setup_sensitivity ();
@@ -149,13 +150,15 @@ FilmViewer::set_film (shared_ptr<Film> film)
           in the preview.
        */
        _player->set_always_burn_subtitles (true);
+       _player->set_ignore_audio ();
+       _player->set_play_referenced ();
 
        _film_connection = _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1));
 
        _player_connection = _player->Changed.connect (boost::bind (&FilmViewer::player_changed, this, _1));
 
        calculate_sizes ();
-       get (_position, _last_get_accurate);
+       refresh ();
 
        setup_sensitivity ();
 }
@@ -183,14 +186,15 @@ FilmViewer::get (DCPTime p, bool accurate)
 
        if (!pvf.empty ()) {
                try {
-                       _frame = pvf.front()->image (PIX_FMT_RGB24, boost::bind (&Log::dcp_log, _film->log().get(), _1, _2));
+                       _frame = pvf.front()->image (AV_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);
+                       _frame = _frame->scale (_frame->size(), yuv_to_rgb, AV_PIX_FMT_RGB24, false);
                        _position = pvf.front()->time ();
                        _inter_position = pvf.front()->inter_position ();
                        _inter_size = pvf.front()->inter_size ();
@@ -295,7 +299,7 @@ FilmViewer::panel_sized (wxSizeEvent& ev)
        _panel_size.height = ev.GetSize().GetHeight();
 
        calculate_sizes ();
-       get (_position, _last_get_accurate);
+       refresh ();
        update_position_label ();
        update_position_slider ();
 }
@@ -315,11 +319,11 @@ FilmViewer::calculate_sizes ()
        if (panel_ratio < film_ratio) {
                /* panel is less widscreen than the film; clamp width */
                _out_size.width = _panel_size.width;
-               _out_size.height = rint (_out_size.width / film_ratio);
+               _out_size.height = lrintf (_out_size.width / film_ratio);
        } else {
                /* panel is more widescreen than the film; clamp height */
                _out_size.height = _panel_size.height;
-               _out_size.width = rint (_out_size.height * film_ratio);
+               _out_size.width = lrintf (_out_size.height * film_ratio);
        }
 
        /* Catch silly values */
@@ -378,28 +382,17 @@ FilmViewer::update_position_label ()
 
        double const fps = _film->video_frame_rate ();
        /* Count frame number from 1 ... not sure if this is the best idea */
-       _frame_number->SetLabel (wxString::Format (wxT("%d"), int (rint (_position.seconds() * fps)) + 1));
+       _frame_number->SetLabel (wxString::Format (wxT("%ld"), lrint (_position.seconds() * fps) + 1));
        _timecode->SetLabel (time_to_timecode (_position, fps));
 }
 
 void
-FilmViewer::active_jobs_changed (bool a)
+FilmViewer::active_jobs_changed (optional<string> j)
 {
-       if (a) {
-               list<shared_ptr<Job> > jobs = JobManager::instance()->get ();
-               list<shared_ptr<Job> >::iterator i = jobs.begin ();
-               while (i != jobs.end() && boost::dynamic_pointer_cast<ExamineContentJob> (*i) == 0) {
-                       ++i;
-               }
-
-               if (i == jobs.end() || (*i)->finished()) {
-                       /* no examine content job running, so we're ok to use the viewer */
-                       a = false;
-               }
-       }
-
-       _slider->Enable (!a);
-       _play_button->Enable (!a);
+       /* examine content is the only job which stops the viewer working */
+       bool const a = !j || *j != "examine_content";
+       _slider->Enable (a);
+       _play_button->Enable (a);
 }
 
 void
@@ -418,7 +411,12 @@ FilmViewer::back_clicked ()
 void
 FilmViewer::forward_clicked ()
 {
-       get (_position + DCPTime::from_frames (1, _film->video_frame_rate ()), true);
+       DCPTime p = _position + DCPTime::from_frames (1, _film->video_frame_rate ());
+       if (p >= _film->length ()) {
+               p = _position;
+       }
+
+       get (p, true);
        update_position_label ();
        update_position_slider ();
 }
@@ -431,7 +429,7 @@ FilmViewer::player_changed (bool frequent)
        }
 
        calculate_sizes ();
-       get (_position, _last_get_accurate);
+       refresh ();
        update_position_label ();
        update_position_slider ();
 }
@@ -457,3 +455,10 @@ FilmViewer::film_changed (Film::Property p)
                setup_sensitivity ();
        }
 }
+
+/** Re-get the current frame */
+void
+FilmViewer::refresh ()
+{
+       get (_position, _last_get_accurate);
+}