Allow moving-still-image sources to have their frame rate specified.
[dcpomatic.git] / src / lib / player.cc
index f4e181daf302ad1163476ab9cd2c35e13ffd309b..9f859969341fa65a1eacc22d0c3da9b7002387c0 100644 (file)
@@ -144,7 +144,6 @@ Player::pass ()
 {
        if (!_have_valid_pieces) {
                setup_pieces ();
-               _have_valid_pieces = true;
        }
 
        Time earliest_t = TIME_MAX;
@@ -345,10 +344,18 @@ Player::process_audio (weak_ptr<Piece> weak_piece, shared_ptr<const AudioBuffers
        /* Remap channels */
        shared_ptr<AudioBuffers> dcp_mapped (new AudioBuffers (_film->audio_channels(), audio->frames()));
        dcp_mapped->make_silent ();
-       list<pair<int, libdcp::Channel> > map = content->audio_mapping().content_to_dcp ();
-       for (list<pair<int, libdcp::Channel> >::iterator i = map.begin(); i != map.end(); ++i) {
-               if (i->first < audio->channels() && i->second < dcp_mapped->channels()) {
-                       dcp_mapped->accumulate_channel (audio.get(), i->first, i->second);
+
+       AudioMapping map = content->audio_mapping ();
+       for (int i = 0; i < map.content_channels(); ++i) {
+               for (int j = 0; j < _film->audio_channels(); ++j) {
+                       if (map.get (i, static_cast<libdcp::Channel> (j)) > 0) {
+                               dcp_mapped->accumulate_channel (
+                                       audio.get(),
+                                       i,
+                                       static_cast<libdcp::Channel> (j),
+                                       map.get (i, static_cast<libdcp::Channel> (j))
+                                       );
+                       }
                }
        }
 
@@ -376,16 +383,16 @@ void
 Player::flush ()
 {
        TimedAudioBuffers<Time> tb = _audio_merger.flush ();
-       if (tb.audio) {
+       if (_audio && tb.audio) {
                Audio (tb.audio, tb.time);
                _audio_position += _film->audio_frames_to_time (tb.audio->frames ());
        }
 
-       while (_video_position < _audio_position) {
+       while (_video && _video_position < _audio_position) {
                emit_black ();
        }
 
-       while (_audio_position < _video_position) {
+       while (_audio && _audio_position < _video_position) {
                emit_silence (_film->time_to_audio_frames (_video_position - _audio_position));
        }
        
@@ -400,7 +407,6 @@ Player::seek (Time t, bool accurate)
 {
        if (!_have_valid_pieces) {
                setup_pieces ();
-               _have_valid_pieces = true;
        }
 
        if (_pieces.empty ()) {
@@ -492,6 +498,8 @@ Player::setup_pieces ()
 
                _pieces.push_back (piece);
        }
+
+       _have_valid_pieces = true;
 }
 
 void
@@ -504,7 +512,8 @@ Player::content_changed (weak_ptr<Content> w, int property, bool frequent)
 
        if (
                property == ContentProperty::POSITION || property == ContentProperty::LENGTH ||
-               property == ContentProperty::TRIM_START || property == ContentProperty::TRIM_END
+               property == ContentProperty::TRIM_START || property == ContentProperty::TRIM_END ||
+               property == VideoContentProperty::VIDEO_FRAME_TYPE 
                ) {
                
                _have_valid_pieces = false;
@@ -516,8 +525,8 @@ Player::content_changed (weak_ptr<Content> w, int property, bool frequent)
                Changed (frequent);
 
        } else if (
-               property == VideoContentProperty::VIDEO_FRAME_TYPE || property == VideoContentProperty::VIDEO_CROP ||
-               property == VideoContentProperty::VIDEO_RATIO
+               property == VideoContentProperty::VIDEO_CROP || property == VideoContentProperty::VIDEO_RATIO ||
+               property == VideoContentProperty::VIDEO_FRAME_RATE
                ) {
                
                Changed (frequent);
@@ -611,7 +620,7 @@ Player::film_changed (Film::Property p)
           last time we were run.
        */
 
-       if (p == Film::SCALER || p == Film::WITH_SUBTITLES || p == Film::CONTAINER) {
+       if (p == Film::SCALER || p == Film::WITH_SUBTITLES || p == Film::CONTAINER || p == Film::VIDEO_FRAME_RATE) {
                Changed (false);
        }
 }
@@ -684,7 +693,7 @@ Player::update_subtitle ()
 bool
 Player::repeat_last_video ()
 {
-       if (!_last_incoming_video.image) {
+       if (!_last_incoming_video.image || !_have_valid_pieces) {
                return false;
        }