X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=b93bf3f4a7c2756643e47b4cc8e8f0d2a9bcc6b1;hb=969906f2dd6c5c144781861f53e2a0f6baefb9a3;hp=a5538d9a6103120ec69b2543f6ac4d4eff004ff0;hpb=0ea5770b820c31852e6beb52bd0463c8d28257e6;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index a5538d9a6..b93bf3f4a 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -70,7 +70,6 @@ using std::dynamic_pointer_cast; using std::list; using std::make_pair; using std::make_shared; -using std::map; using std::max; using std::min; using std::min; @@ -95,11 +94,12 @@ int const PlayerProperty::DCP_DECODE_REDUCTION = 704; int const PlayerProperty::PLAYBACK_LENGTH = 705; -Player::Player (shared_ptr film) +Player::Player (shared_ptr film, Image::Alignment subtitle_alignment) : _film (film) , _suspended (0) , _tolerant (film->tolerant()) , _audio_merger (_film->audio_frame_rate()) + , _subtitle_alignment (subtitle_alignment) { construct (); } @@ -134,12 +134,6 @@ Player::construct () } -Player::~Player () -{ - delete _shuffler; -} - - void Player::setup_pieces () { @@ -170,8 +164,7 @@ Player::setup_pieces_unlocked () auto old_pieces = _pieces; _pieces.clear (); - delete _shuffler; - _shuffler = new Shuffler(); + _shuffler.reset (new Shuffler()); _shuffler->Video.connect(bind(&Player::video, this, _1, _2)); for (auto i: playlist()->content()) { @@ -226,7 +219,7 @@ Player::setup_pieces_unlocked () if (decoder->video) { if (i->video->frame_type() == VideoFrameType::THREE_D_LEFT || i->video->frame_type() == VideoFrameType::THREE_D_RIGHT) { /* We need a Shuffler to cope with 3D L/R video data arriving out of sequence */ - decoder->video->Data.connect (bind(&Shuffler::video, _shuffler, weak_ptr(piece), _1)); + decoder->video->Data.connect (bind(&Shuffler::video, _shuffler.get(), weak_ptr(piece), _1)); } else { decoder->video->Data.connect (bind(&Player::video, this, weak_ptr(piece), _1)); } @@ -338,7 +331,7 @@ Player::set_video_container_size (dcp::Size s) _video_container_size = s; - _black_image.reset (new Image (AV_PIX_FMT_RGB24, _video_container_size, true)); + _black_image = make_shared(AV_PIX_FMT_RGB24, _video_container_size, Image::Alignment::PADDED); _black_image->make_black (); } @@ -834,13 +827,17 @@ Player::open_subtitles_for_frame (DCPTime time) const return {}; } - return merge (captions); + return merge (captions, _subtitle_alignment); } void Player::video (weak_ptr wp, ContentVideo video) { + if (_suspended) { + return; + } + auto piece = wp.lock (); if (!piece) { return; @@ -923,16 +920,23 @@ Player::video (weak_ptr wp, ContentVideo video) } } + auto const content_video = piece->content->video; + _last_video[wp] = std::make_shared( video.image, - piece->content->video->crop (), - piece->content->video->fade (_film, video.frame), - scale_for_display(piece->content->video->scaled_size(_film->frame_size()), _video_container_size, _film->frame_size()), + content_video->actual_crop(), + content_video->fade (_film, video.frame), + scale_for_display( + content_video->scaled_size(_film->frame_size()), + _video_container_size, + _film->frame_size(), + content_video->pixel_quanta() + ), _video_container_size, video.eyes, video.part, - piece->content->video->colour_conversion(), - piece->content->video->range(), + content_video->colour_conversion(), + content_video->range(), piece->content, video.frame, false @@ -951,6 +955,10 @@ Player::video (weak_ptr wp, ContentVideo video) void Player::audio (weak_ptr wp, AudioStreamPtr stream, ContentAudio content_audio) { + if (_suspended) { + return; + } + DCPOMATIC_ASSERT (content_audio.audio->frames() > 0); auto piece = wp.lock (); @@ -1021,6 +1029,10 @@ Player::audio (weak_ptr wp, AudioStreamPtr stream, ContentAudio content_a void Player::bitmap_text_start (weak_ptr wp, weak_ptr wc, ContentBitmapText subtitle) { + if (_suspended) { + return; + } + auto piece = wp.lock (); auto text = wc.lock (); if (!piece || !text) { @@ -1050,7 +1062,7 @@ Player::bitmap_text_start (weak_ptr wp, weak_ptr wc, C } dcp::Size scaled_size (width, height); - ps.bitmap.push_back (BitmapText(image->scale(scaled_size, dcp::YUVToRGB::REC601, image->pixel_format(), true, _fast), subtitle.sub.rectangle)); + ps.bitmap.push_back (BitmapText(image->scale(scaled_size, dcp::YUVToRGB::REC601, image->pixel_format(), Image::Alignment::PADDED, _fast), subtitle.sub.rectangle)); DCPTime from (content_time_to_dcp (piece, subtitle.from())); _active_texts[static_cast(text->type())].add_from (wc, ps, from); @@ -1060,6 +1072,10 @@ Player::bitmap_text_start (weak_ptr wp, weak_ptr wc, C void Player::plain_text_start (weak_ptr wp, weak_ptr wc, ContentStringText subtitle) { + if (_suspended) { + return; + } + auto piece = wp.lock (); auto text = wc.lock (); if (!piece || !text) { @@ -1105,6 +1121,10 @@ Player::plain_text_start (weak_ptr wp, weak_ptr wc, Co void Player::subtitle_stop (weak_ptr wp, weak_ptr wc, ContentTime to) { + if (_suspended) { + return; + } + auto text = wc.lock (); if (!text) { return; @@ -1199,6 +1219,16 @@ Player::seek (DCPTime time, bool accurate) void Player::emit_video (shared_ptr pv, DCPTime time) { + if (!_film->three_d()) { + if (pv->eyes() == Eyes::LEFT) { + /* Use left-eye images for both eyes... */ + pv->set_eyes (Eyes::BOTH); + } else if (pv->eyes() == Eyes::RIGHT) { + /* ...and discard the right */ + return; + } + } + /* We need a delay to give a little wiggle room to ensure that relevent subtitles arrive at the player before the video that requires them. */ @@ -1344,6 +1374,10 @@ Player::playlist () const void Player::atmos (weak_ptr, ContentAtmos data) { + if (_suspended) { + return; + } + Atmos (data.data, DCPTime::from_frames(data.frame, _film->video_frame_rate()), data.metadata); }