X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=a940b42b8ac134a9be79adb5513d9b3acf4e6acf;hb=refs%2Fheads%2Fcpl-trim;hp=fc821d6c70e55f10a697fb23861e0fcffff9ff2b;hpb=da5e64883d7665353fcf838f6956f2dfb6e8b176;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index fc821d6c7..a940b42b8 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -18,6 +18,7 @@ */ +#include "atmos_decoder.h" #include "player.h" #include "film.h" #include "audio_buffers.h" @@ -96,6 +97,7 @@ Player::Player (shared_ptr film) , _fast (false) , _tolerant (film->tolerant()) , _play_referenced (false) + , _always_trim (false) , _audio_merger (_film->audio_frame_rate()) , _shuffler (0) { @@ -113,6 +115,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _fast (false) , _tolerant (film->tolerant()) , _play_referenced (false) + , _always_trim (false) , _audio_merger (_film->audio_frame_rate()) , _shuffler (0) { @@ -193,12 +196,9 @@ Player::setup_pieces_unlocked () } shared_ptr decoder = decoder_factory (_film, i, _fast, _tolerant, old_decoder); - FrameRateChange frc (_film, i); + DCPOMATIC_ASSERT (decoder); - if (!decoder) { - /* Not something that we can decode; e.g. Atmos content */ - continue; - } + FrameRateChange frc (_film, i); if (decoder->video && _ignore_video) { decoder->video->set_ignore (true); @@ -253,6 +253,10 @@ Player::setup_pieces_unlocked () ++j; } + + if (decoder->atmos) { + decoder->atmos->Data.connect (bind(&Player::atmos, this, weak_ptr(piece), _1)); + } } _stream_states.clear (); @@ -502,6 +506,16 @@ Player::set_play_referenced () setup_pieces_unlocked (); } + +void +Player::set_always_trim () +{ + boost::mutex::scoped_lock lm (_mutex); + _always_trim = true; + setup_pieces_unlocked (); +} + + static void maybe_add_asset (list& a, shared_ptr r, Frame reel_trim_start, Frame reel_trim_end, DCPTime from, int const ffr) { @@ -593,6 +607,7 @@ Player::pass () if (_suspended) { /* We can't pass in this state */ + LOG_DEBUG_PLAYER_NC ("Player is suspended"); return false; } @@ -653,6 +668,7 @@ Player::pass () switch (which) { case CONTENT: { + LOG_DEBUG_PLAYER ("Calling pass() on %1", earliest_content->content->path(0)); earliest_content->done = earliest_content->decoder->pass (); shared_ptr dcp = dynamic_pointer_cast(earliest_content->content); if (dcp && !_play_referenced && dcp->reference_audio()) { @@ -671,6 +687,7 @@ Player::pass () break; case SILENT: { + LOG_DEBUG_PLAYER ("Emit silence for gap at %1", to_string(_silent.position())); DCPTimePeriod period (_silent.period_at_position()); if (_last_audio_time) { /* Sometimes the thing that happened last finishes fractionally before @@ -714,6 +731,7 @@ Player::pass () pull_to = _silent.position(); } + LOG_DEBUG_PLAYER("Emitting audio up to %1", to_string(pull_to)); list, DCPTime> > audio = _audio_merger.pull (pull_to); for (list, DCPTime> >::iterator i = audio.begin(); i != audio.end(); ++i) { if (_last_audio_time && i->second < *_last_audio_time) { @@ -806,6 +824,7 @@ Player::video (weak_ptr wp, ContentVideo video) /* Time of the first frame we will emit */ DCPTime const time = content_video_to_dcp (piece, video.frame); + LOG_DEBUG_PLAYER("Received video frame %1 at %2", video.frame, to_string(time)); /* Discard if it's before the content's period or the last accurate seek. We can't discard if it's after the content's period here as in that case we still need to fill any gap between @@ -910,6 +929,8 @@ Player::audio (weak_ptr wp, AudioStreamPtr stream, ContentAudio content_a /* Compute time in the DCP */ DCPTime time = resampled_audio_to_dcp (piece, content_audio.frame); + LOG_DEBUG_PLAYER("Received audio frame %1 at %2", content_audio.frame, to_string(time)); + /* And the end of this block in the DCP */ DCPTime end = time + DCPTime::from_frames(content_audio.audio->frames(), rfr); @@ -1077,6 +1098,7 @@ void Player::seek (DCPTime time, bool accurate) { boost::mutex::scoped_lock lm (_mutex); + LOG_DEBUG_PLAYER("Seek to %1 (%2accurate)", to_string(time), accurate ? "" : "in"); if (_suspended) { /* We can't seek in this state */ @@ -1270,3 +1292,10 @@ Player::playlist () const return _playlist ? _playlist : _film->playlist(); } + +void +Player::atmos (weak_ptr, ContentAtmos data) +{ + Atmos (data.data, DCPTime::from_frames(data.frame, _film->video_frame_rate()), data.metadata); +} +