X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=07447d531db7036ed61ef1ef414d18e9cc1f7685;hb=86102d30bf0aad89115bbeb3d8aaa2a27a0aa432;hp=bc0aa3b28c248e71f086d14761429d1407e3205f;hpb=dec5ae11238495c64fffdab37f189d96aed7d636;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index bc0aa3b28..07447d531 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -83,8 +83,9 @@ int const PlayerProperty::PLAYLIST = 701; int const PlayerProperty::FILM_CONTAINER = 702; int const PlayerProperty::FILM_VIDEO_FRAME_RATE = 703; int const PlayerProperty::DCP_DECODE_REDUCTION = 704; +int const PlayerProperty::PLAYBACK_LENGTH = 705; -Player::Player (shared_ptr film, shared_ptr playlist) +Player::Player (shared_ptr film, shared_ptr playlist, DCPTime playback_length) : _film (film) , _playlist (playlist) , _suspended (0) @@ -97,6 +98,7 @@ Player::Player (shared_ptr film, shared_ptr playlist , _play_referenced (false) , _audio_merger (_film->audio_frame_rate()) , _shuffler (0) + , _playback_length (playback_length) { _film_changed_connection = _film->Change.connect (bind (&Player::film_change, this, _1, _2)); /* The butler must hear about this first, so since we are proxying this through to the butler we must @@ -124,16 +126,26 @@ Player::setup_pieces () setup_pieces_unlocked (); } + +void +Player::set_playback_length (DCPTime len) +{ + Change (CHANGE_TYPE_PENDING, PlayerProperty::PLAYBACK_LENGTH, false); + _playback_length = len; + Change (CHANGE_TYPE_DONE, PlayerProperty::PLAYBACK_LENGTH, false); + setup_pieces (); +} + bool -have_video (shared_ptr piece) +have_video (shared_ptr content) { - return piece->decoder && piece->decoder->video; + return static_cast(content->video); } bool -have_audio (shared_ptr piece) +have_audio (shared_ptr content) { - return piece->decoder && piece->decoder->audio; + return static_cast(content->audio); } void @@ -237,15 +249,12 @@ Player::setup_pieces_unlocked () } } - _black = Empty (_film, _pieces, bind(&have_video, _1)); - _silent = Empty (_film, _pieces, bind(&have_audio, _1)); + _black = Empty (_film, _playlist, bind(&have_video, _1), _playback_length); + _silent = Empty (_film, _playlist, bind(&have_audio, _1), _playback_length); _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 @@ -346,7 +355,8 @@ Player::black_player_video_frame (Eyes eyes) const PresetColourConversion::all().front().conversion, VIDEO_RANGE_FULL, boost::weak_ptr(), - boost::optional() + boost::optional(), + false ) ); } @@ -565,15 +575,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 (*_film_length == DCPTime()) { - /* Special case of an empty Film; just give one black frame */ + if (_playback_length == DCPTime()) { + /* Special; just give one black frame */ emit_video (black_player_video_frame(EYES_BOTH), DCPTime()); return true; } @@ -679,7 +688,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 = _playback_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; @@ -850,7 +859,8 @@ Player::video (weak_ptr wp, ContentVideo video) piece->content->video->colour_conversion(), piece->content->video->range(), piece->content, - video.frame + video.frame, + false ) ); @@ -900,9 +910,7 @@ Player::audio (weak_ptr wp, AudioStreamPtr stream, ContentAudio content_a if (remaining_frames == 0) { return; } - shared_ptr cut (new AudioBuffers (content_audio.audio->channels(), remaining_frames)); - cut->copy_from (content_audio.audio.get(), remaining_frames, 0, 0); - content_audio.audio = cut; + content_audio.audio.reset (new AudioBuffers(content_audio.audio, remaining_frames, 0)); } DCPOMATIC_ASSERT (content_audio.audio->frames() > 0); @@ -1195,8 +1203,7 @@ Player::discard_audio (shared_ptr audio, DCPTime time, DCPTi if (remaining_frames <= 0) { return make_pair(shared_ptr(), DCPTime()); } - shared_ptr cut (new AudioBuffers (audio->channels(), remaining_frames)); - cut->copy_from (audio.get(), remaining_frames, discard_frames, 0); + shared_ptr cut (new AudioBuffers(audio, remaining_frames, discard_frames)); return make_pair(cut, time + discard_time); }