X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=d2e5ed52104b136b136b5c578f08d745ab12c4a9;hp=07447d531db7036ed61ef1ef414d18e9cc1f7685;hb=591ccb82d75070d7cba55995bab23513741ff5cf;hpb=86102d30bf0aad89115bbeb3d8aaa2a27a0aa432 diff --git a/src/lib/player.cc b/src/lib/player.cc index 07447d531..d2e5ed521 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -23,6 +23,7 @@ #include "audio_buffers.h" #include "content_audio.h" #include "dcp_content.h" +#include "dcpomatic_log.h" #include "job.h" #include "image.h" #include "raw_image_proxy.h" @@ -85,9 +86,8 @@ 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, DCPTime playback_length) +Player::Player (shared_ptr film) : _film (film) - , _playlist (playlist) , _suspended (0) , _ignore_video (false) , _ignore_audio (false) @@ -98,14 +98,36 @@ Player::Player (shared_ptr film, shared_ptr playlist , _play_referenced (false) , _audio_merger (_film->audio_frame_rate()) , _shuffler (0) - , _playback_length (playback_length) +{ + construct (); +} + +Player::Player (shared_ptr film, shared_ptr playlist_) + : _film (film) + , _playlist (playlist_) + , _suspended (0) + , _ignore_video (false) + , _ignore_audio (false) + , _ignore_text (false) + , _always_burn_open_subtitles (false) + , _fast (false) + , _tolerant (film->tolerant()) + , _play_referenced (false) + , _audio_merger (_film->audio_frame_rate()) + , _shuffler (0) +{ + construct (); +} + +void +Player::construct () { _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 be first. */ - _playlist_change_connection = _playlist->Change.connect (bind (&Player::playlist_change, this, _1), boost::signals2::at_front); - _playlist_content_change_connection = _playlist->ContentChange.connect (bind(&Player::playlist_content_change, this, _1, _3, _4)); + _playlist_change_connection = playlist()->Change.connect (bind (&Player::playlist_change, this, _1), boost::signals2::at_front); + _playlist_content_change_connection = playlist()->ContentChange.connect (bind(&Player::playlist_content_change, this, _1, _3, _4)); set_video_container_size (_film->frame_size ()); film_change (CHANGE_TYPE_DONE, Film::AUDIO_PROCESSOR); @@ -127,19 +149,10 @@ Player::setup_pieces () } -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 content) { - return static_cast(content->video); + return static_cast(content->video) && content->video->use(); } bool @@ -151,6 +164,8 @@ have_audio (shared_ptr content) void Player::setup_pieces_unlocked () { + _playback_length = _playlist ? _playlist->length(_film) : _film->length(); + list > old_pieces = _pieces; _pieces.clear (); @@ -158,7 +173,7 @@ Player::setup_pieces_unlocked () _shuffler = new Shuffler(); _shuffler->Video.connect(bind(&Player::video, this, _1, _2)); - BOOST_FOREACH (shared_ptr i, _playlist->content ()) { + BOOST_FOREACH (shared_ptr i, playlist()->content()) { if (!i->paths_valid ()) { continue; @@ -249,8 +264,8 @@ Player::setup_pieces_unlocked () } } - _black = Empty (_film, _playlist, bind(&have_video, _1), _playback_length); - _silent = Empty (_film, _playlist, bind(&have_audio, _1), _playback_length); + _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; @@ -507,7 +522,7 @@ Player::get_reel_assets () list a; - BOOST_FOREACH (shared_ptr i, _playlist->content ()) { + BOOST_FOREACH (shared_ptr i, playlist()->content()) { shared_ptr j = dynamic_pointer_cast (i); if (!j) { continue; @@ -650,6 +665,7 @@ Player::pass () break; } case BLACK: + LOG_DEBUG_PLAYER ("Emit black for gap at %1", to_string(_black.position())); emit_video (black_player_video_frame(EYES_BOTH), _black.position()); _black.set_position (_black.position() + one_video_frame()); break; @@ -822,10 +838,12 @@ Player::video (weak_ptr wp, ContentVideo video) } while (j < fill_to || eyes != fill_to_eyes) { if (last != _last_video.end()) { + LOG_DEBUG_PLAYER("Fill using last video at %1 in 3D mode", to_string(j)); shared_ptr copy = last->second->shallow_copy(); copy->set_eyes (eyes); emit_video (copy, j); } else { + LOG_DEBUG_PLAYER("Fill using black at %1 in 3D mode", to_string(j)); emit_video (black_player_video_frame(eyes), j); } if (eyes == EYES_RIGHT) { @@ -850,9 +868,7 @@ Player::video (weak_ptr wp, ContentVideo video) video.image, piece->content->video->crop (), piece->content->video->fade (_film, video.frame), - piece->content->video->scale().size ( - piece->content->video, _video_container_size, _film->frame_size () - ), + scale_for_display(piece->content->video->scaled_size(_film->frame_size()), _video_container_size, _film->frame_size()), _video_container_size, video.eyes, video.part, @@ -1242,3 +1258,11 @@ Player::content_time_to_dcp (shared_ptr content, ContentTime t) /* We couldn't find this content; perhaps things are being changed over */ return optional(); } + + +shared_ptr +Player::playlist () const +{ + return _playlist ? _playlist : _film->playlist(); +} +