X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=657c1a8b4ed9e2d168a2ffdbc156b46704824545;hp=1a88505af71b76471c1befef2c046ae3a08cc78a;hb=af0edaf7dcd36c367cb585c98e8413c5347a7386;hpb=1f88a38a2a607c21988a403e76f315444c4be36b diff --git a/src/lib/player.cc b/src/lib/player.cc index 1a88505af..657c1a8b4 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -146,17 +146,13 @@ Player::setup_pieces_unlocked () _shuffler = new Shuffler(); _shuffler->Video.connect(bind(&Player::video, this, _1, _2)); - cout << "SPU " << _playlist->content().size() << ".\n"; - BOOST_FOREACH (shared_ptr i, _playlist->content ()) { if (!i->paths_valid ()) { - cout << "not valid.\n"; continue; } if (_ignore_video && _ignore_audio && i->text.empty()) { - cout << "text only.\n"; /* We're only interested in text and this content has none */ continue; } @@ -169,7 +165,6 @@ Player::setup_pieces_unlocked () } } - cout << " DF " << _tolerant << "\n"; shared_ptr decoder = decoder_factory (_film, i, _fast, _tolerant, old_decoder); FrameRateChange frc (_film, i); @@ -248,6 +243,9 @@ Player::setup_pieces_unlocked () _last_video_time = DCPTime (); _last_video_eyes = EYES_BOTH; _last_audio_time = DCPTime (); + + /* Cached value to save recalculating it on every ::pass */ + _film_length = _film->length (); } void @@ -569,13 +567,14 @@ bool Player::pass () { boost::mutex::scoped_lock lm (_mutex); + DCPOMATIC_ASSERT (_film_length); if (_suspended) { /* We can't pass in this state */ return false; } - if (_playlist->length(_film) == DCPTime()) { + if (*_film_length == DCPTime()) { /* Special case of an empty Film; just give one black frame */ emit_video (black_player_video_frame(EYES_BOTH), DCPTime()); return true; @@ -619,12 +618,12 @@ Player::pass () which = CONTENT; } - if (!_black.done() && (!earliest_time || _black.position() < *earliest_time)) { + if (!_black.done() && !_ignore_video && (!earliest_time || _black.position() < *earliest_time)) { earliest_time = _black.position (); which = BLACK; } - if (!_silent.done() && (!earliest_time || _silent.position() < *earliest_time)) { + if (!_silent.done() && !_ignore_audio && (!earliest_time || _silent.position() < *earliest_time)) { earliest_time = _silent.position (); which = SILENT; } @@ -653,8 +652,16 @@ Player::pass () if (_last_audio_time) { /* Sometimes the thing that happened last finishes fractionally before or after this silence. Bodge the start time of the silence to fix it. + I think this is nothing to worry about since we will just add or + remove a little silence at the end of some content. */ - DCPOMATIC_ASSERT (labs(period.from.get() - _last_audio_time->get()) < 2); + int64_t const error = labs(period.from.get() - _last_audio_time->get()); + /* Let's not worry about less than a frame at 24fps */ + int64_t const too_much_error = DCPTime::from_frames(1, 24).get(); + if (error >= too_much_error) { + _film->log()->log(String::compose("Silence starting before or after last audio by %1", error), LogEntry::TYPE_ERROR); + } + DCPOMATIC_ASSERT (error < too_much_error); period.from = *_last_audio_time; } if (period.duration() > one_video_frame()) { @@ -674,7 +681,7 @@ Player::pass () /* Work out the time before which the audio is definitely all here. This is the earliest last_push_end of one of our streams, or the position of the _silent. */ - DCPTime pull_to = _film->length (); + DCPTime pull_to = *_film_length; for (map::const_iterator i = _stream_states.begin(); i != _stream_states.end(); ++i) { if (!i->second.piece->done && i->second.last_push_end < pull_to) { pull_to = i->second.last_push_end;