X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=c6803b0549383393274acf080cf452057d2d02dd;hb=182b9d2e2feb6545592868606aaf0f0146095481;hp=c04a433698102034f34b818e774f3144dc416d0b;hpb=7b4d4a6c2bc3f5a0f9216fdb8d96bbe952aa49ee;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index c04a43369..c6803b054 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -47,7 +47,6 @@ #include "playlist.h" #include "ratio.h" #include "raw_image_proxy.h" -#include "referenced_reel_asset.h" #include "render_text.h" #include "shuffler.h" #include "text_content.h" @@ -100,7 +99,12 @@ Player::Player (shared_ptr film, Image::Alignment subtitle_alignment : _film (film) , _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()) , _subtitle_alignment (subtitle_alignment) { @@ -113,7 +117,12 @@ Player::Player (shared_ptr film, shared_ptr playlist , _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()) { construct (); @@ -138,14 +147,6 @@ Player::construct () } -void -Player::setup_pieces () -{ - boost::mutex::scoped_lock lm (_mutex); - setup_pieces_unlocked (); -} - - bool have_video (shared_ptr content) { @@ -161,8 +162,10 @@ have_audio (shared_ptr content) void -Player::setup_pieces_unlocked () +Player::setup_pieces () { + boost::mutex::scoped_lock lm (_mutex); + _playback_length = _playlist ? _playlist->length(_film) : _film->length(); auto old_pieces = _pieces; @@ -304,10 +307,9 @@ Player::playlist_content_change (ChangeType type, int property, bool frequent) { if (property == VideoContentProperty::CROP) { if (type == ChangeType::DONE) { - auto const vcs = video_container_size(); boost::mutex::scoped_lock lm (_mutex); for (auto const& i: _delay) { - i.first->reset_metadata (_film, vcs); + i.first->reset_metadata(_film, _video_container_size); } } } else { @@ -335,17 +337,15 @@ Player::set_video_container_size (dcp::Size s) { Change (ChangeType::PENDING, PlayerProperty::VIDEO_CONTAINER_SIZE, false); - { - boost::mutex::scoped_lock lm (_mutex); - - if (s == _video_container_size) { - lm.unlock (); - Change (ChangeType::CANCELLED, PlayerProperty::VIDEO_CONTAINER_SIZE, false); - return; - } + if (s == _video_container_size) { + Change(ChangeType::CANCELLED, PlayerProperty::VIDEO_CONTAINER_SIZE, false); + return; + } - _video_container_size = s; + _video_container_size = s; + { + boost::mutex::scoped_lock lm(_black_image_mutex); _black_image = make_shared(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED); _black_image->make_black (); } @@ -399,6 +399,8 @@ Player::film_change (ChangeType type, Film::Property p) shared_ptr Player::black_player_video_frame (Eyes eyes) const { + boost::mutex::scoped_lock lm(_black_image_mutex); + return std::make_shared ( std::make_shared(_black_image), Crop(), @@ -508,18 +510,16 @@ Player::set_ignore_video () void Player::set_ignore_audio () { - boost::mutex::scoped_lock lm (_mutex); _ignore_audio = true; - setup_pieces_unlocked (); + setup_pieces(); } void Player::set_ignore_text () { - boost::mutex::scoped_lock lm (_mutex); _ignore_text = true; - setup_pieces_unlocked (); + setup_pieces(); } @@ -527,7 +527,6 @@ Player::set_ignore_text () void Player::set_always_burn_open_subtitles () { - boost::mutex::scoped_lock lm (_mutex); _always_burn_open_subtitles = true; } @@ -536,110 +535,16 @@ Player::set_always_burn_open_subtitles () void Player::set_fast () { - boost::mutex::scoped_lock lm (_mutex); _fast = true; - setup_pieces_unlocked (); + setup_pieces(); } void Player::set_play_referenced () { - boost::mutex::scoped_lock lm (_mutex); _play_referenced = 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) -{ - DCPOMATIC_ASSERT (r); - r->set_entry_point (r->entry_point().get_value_or(0) + reel_trim_start); - r->set_duration (r->actual_duration() - reel_trim_start - reel_trim_end); - if (r->actual_duration() > 0) { - a.push_back ( - ReferencedReelAsset(r, DCPTimePeriod(from, from + DCPTime::from_frames(r->actual_duration(), ffr))) - ); - } -} - - -list -Player::get_reel_assets () -{ - /* Does not require a lock on _mutex as it's only called from DCPEncoder */ - - list reel_assets; - - for (auto content: playlist()->content()) { - auto dcp = dynamic_pointer_cast(content); - if (!dcp) { - continue; - } - - if (!dcp->reference_video() && !dcp->reference_audio() && !dcp->reference_text(TextType::OPEN_SUBTITLE) && !dcp->reference_text(TextType::CLOSED_CAPTION)) { - continue; - } - - scoped_ptr decoder; - try { - decoder.reset (new DCPDecoder(_film, dcp, false, false, shared_ptr())); - } catch (...) { - return reel_assets; - } - - auto const frame_rate = _film->video_frame_rate(); - DCPOMATIC_ASSERT (dcp->video_frame_rate()); - /* We should only be referencing if the DCP rate is the same as the film rate */ - DCPOMATIC_ASSERT (std::round(dcp->video_frame_rate().get()) == frame_rate); - - Frame const trim_start = dcp->trim_start().frames_round(frame_rate); - Frame const trim_end = dcp->trim_end().frames_round(frame_rate); - - /* position in the asset from the start */ - int64_t offset_from_start = 0; - /* position i the asset from the end */ - int64_t offset_from_end = 0; - for (auto reel: decoder->reels()) { - /* Assume that main picture duration is the length of the reel */ - offset_from_end += reel->main_picture()->actual_duration(); - } - - for (auto reel: decoder->reels()) { - - /* Assume that main picture duration is the length of the reel */ - int64_t const reel_duration = reel->main_picture()->actual_duration(); - - /* See doc/design/trim_reels.svg */ - Frame const reel_trim_start = min(reel_duration, max(int64_t(0), trim_start - offset_from_start)); - Frame const reel_trim_end = min(reel_duration, max(int64_t(0), reel_duration - (offset_from_end - trim_end))); - - auto const from = content->position() + std::max(DCPTime(), DCPTime::from_frames(offset_from_start - trim_start, frame_rate)); - if (dcp->reference_video()) { - maybe_add_asset (reel_assets, reel->main_picture(), reel_trim_start, reel_trim_end, from, frame_rate); - } - - if (dcp->reference_audio()) { - maybe_add_asset (reel_assets, reel->main_sound(), reel_trim_start, reel_trim_end, from, frame_rate); - } - - if (dcp->reference_text(TextType::OPEN_SUBTITLE)) { - maybe_add_asset (reel_assets, reel->main_subtitle(), reel_trim_start, reel_trim_end, from, frame_rate); - } - - if (dcp->reference_text(TextType::CLOSED_CAPTION)) { - for (auto caption: reel->closed_captions()) { - maybe_add_asset (reel_assets, caption, reel_trim_start, reel_trim_end, from, frame_rate); - } - } - - offset_from_start += reel_duration; - offset_from_end -= reel_duration; - } - } - - return reel_assets; + setup_pieces(); } @@ -654,7 +559,7 @@ Player::pass () return false; } - if (_playback_length == DCPTime()) { + if (_playback_length.load() == DCPTime()) { /* Special; just give one black frame */ emit_video (black_player_video_frame(Eyes::BOTH), DCPTime()); return true; @@ -792,7 +697,7 @@ Player::pass () } } - auto pull_to = _playback_length; + auto pull_to = _playback_length.load(); for (auto const& i: alive_stream_states) { if (!i.second.piece->done && i.second.last_push_end < pull_to) { pull_to = i.second.last_push_end; @@ -865,14 +770,14 @@ Player::open_subtitles_for_frame (DCPTime time) const } /* i.image will already have been scaled to fit _video_container_size */ - dcp::Size scaled_size (i.rectangle.width * _video_container_size.width, i.rectangle.height * _video_container_size.height); + dcp::Size scaled_size (i.rectangle.width * _video_container_size.load().width, i.rectangle.height * _video_container_size.load().height); captions.push_back ( PositionImage ( i.image, Position ( - lrint(_video_container_size.width * i.rectangle.x), - lrint(_video_container_size.height * i.rectangle.y) + lrint(_video_container_size.load().width * i.rectangle.x), + lrint(_video_container_size.load().height * i.rectangle.y) ) ) ); @@ -1135,8 +1040,8 @@ Player::bitmap_text_start (weak_ptr weak_piece, weak_ptr reduction) { Change (ChangeType::PENDING, PlayerProperty::DCP_DECODE_REDUCTION, false); - { - boost::mutex::scoped_lock lm (_mutex); - - if (reduction == _dcp_decode_reduction) { - lm.unlock (); - Change (ChangeType::CANCELLED, PlayerProperty::DCP_DECODE_REDUCTION, false); - return; - } - - _dcp_decode_reduction = reduction; - setup_pieces_unlocked (); + if (reduction == _dcp_decode_reduction.load()) { + Change(ChangeType::CANCELLED, PlayerProperty::DCP_DECODE_REDUCTION, false); + return; } + _dcp_decode_reduction = reduction; + setup_pieces(); + Change (ChangeType::DONE, PlayerProperty::DCP_DECODE_REDUCTION, false); } optional -Player::content_time_to_dcp (shared_ptr content, ContentTime t) +Player::content_time_to_dcp (shared_ptr content, ContentTime t) const { boost::mutex::scoped_lock lm (_mutex); @@ -1445,7 +1345,7 @@ Player::content_time_to_dcp (shared_ptr content, ContentTime t) optional -Player::dcp_to_content_time (shared_ptr content, DCPTime t) +Player::dcp_to_content_time (shared_ptr content, DCPTime t) const { boost::mutex::scoped_lock lm (_mutex);