X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fplayer.cc;h=10c92c0736eb87385b5d4e0e20f88ba95c473f43;hb=4a5fcd19ca16447ba8b204986a378072a9c730b2;hp=30313d39dd23bb57445cf43ff8a45f7b9c2d8b00;hpb=a8a0dfd1b21de6c0facf965ab119833ff6f790bf;p=dcpomatic.git diff --git a/src/lib/player.cc b/src/lib/player.cc index 30313d39d..10c92c073 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -123,7 +123,7 @@ Player::setup_pieces () continue; } - shared_ptr decoder = decoder_factory (i, _film->log(), _fast); + shared_ptr decoder = decoder_factory (i, _film->log()); FrameRateChange frc (i->active_video_frame_rate(), _film->video_frame_rate()); if (!decoder) { @@ -139,6 +139,15 @@ Player::setup_pieces () decoder->audio->set_ignore (); } + if (decoder->audio && _fast) { + decoder->audio->set_fast (); + } + + shared_ptr dcp = dynamic_pointer_cast (decoder); + if (dcp && _play_referenced) { + dcp->set_decode_referenced (); + } + _pieces.push_back (shared_ptr (new Piece (i, decoder, frc))); } @@ -163,26 +172,41 @@ Player::playlist_content_changed (weak_ptr w, int property, bool freque property == DCPContentProperty::CAN_BE_PLAYED || property == SubtitleContentProperty::COLOUR || property == SubtitleContentProperty::OUTLINE || - property == SubtitleContentProperty::OUTLINE_COLOUR || - property == FFmpegContentProperty::SUBTITLE_STREAM + property == SubtitleContentProperty::SHADOW || + property == SubtitleContentProperty::EFFECT_COLOUR || + property == FFmpegContentProperty::SUBTITLE_STREAM || + property == VideoContentProperty::COLOUR_CONVERSION ) { _have_valid_pieces = false; Changed (frequent); + } else if ( + property == SubtitleContentProperty::LINE_SPACING || + property == SubtitleContentProperty::OUTLINE_WIDTH || + property == SubtitleContentProperty::Y_SCALE + ) { + + /* These changes just need the pieces' decoders to be reset. + It's quite possible that other changes could be handled by + this branch rather than the _have_valid_pieces = false branch + above. This would make things a lot faster. + */ + + reset_pieces (); + Changed (frequent); + } else if ( property == ContentProperty::VIDEO_FRAME_RATE || property == SubtitleContentProperty::USE || property == SubtitleContentProperty::X_OFFSET || property == SubtitleContentProperty::Y_OFFSET || property == SubtitleContentProperty::X_SCALE || - property == SubtitleContentProperty::Y_SCALE || property == SubtitleContentProperty::FONTS || property == VideoContentProperty::CROP || property == VideoContentProperty::SCALE || property == VideoContentProperty::FADE_IN || - property == VideoContentProperty::FADE_OUT || - property == VideoContentProperty::COLOUR_CONVERSION + property == VideoContentProperty::FADE_OUT ) { Changed (frequent); @@ -314,7 +338,7 @@ Player::get_video (DCPTime time, bool accurate) /* Text subtitles (rendered to an image) */ if (!ps.text.empty ()) { - list s = render_subtitles (ps.text, ps.fonts, _video_container_size); + list s = render_subtitles (ps.text, ps.fonts, _video_container_size, time); copy (s.begin (), s.end (), back_inserter (sub_images)); } @@ -567,7 +591,7 @@ Player::get_subtitles (DCPTime time, DCPTime length, bool starting, bool burnt, { list > subs = overlaps (time, time + length, has_subtitle); - PlayerSubtitles ps (time, length); + PlayerSubtitles ps (time); for (list >::const_iterator j = subs.begin(); j != subs.end(); ++j) { if (!(*j)->content->subtitle->use () || (!_always_burn_subtitles && (burnt != (*j)->content->subtitle->burn ()))) { @@ -625,7 +649,7 @@ Player::get_subtitles (DCPTime time, DCPTime length, bool starting, bool burnt, } s.set_in (dcp::Time(content_subtitle_to_dcp (*j, ts.period().from).seconds(), 1000)); s.set_out (dcp::Time(content_subtitle_to_dcp (*j, ts.period().to).seconds(), 1000)); - ps.text.push_back (s); + ps.text.push_back (SubtitleString (s, (*j)->content->subtitle->outline_width())); ps.add_fonts ((*j)->content->subtitle->fonts ()); } } @@ -706,7 +730,7 @@ Player::get_reel_assets () scoped_ptr decoder; try { - decoder.reset (new DCPDecoder (j, _film->log(), false)); + decoder.reset (new DCPDecoder (j, _film->log())); } catch (...) { return a; } @@ -766,3 +790,11 @@ Player::overlaps (DCPTime from, DCPTime to, boost::function va return overlaps; } + +void +Player::reset_pieces () +{ + BOOST_FOREACH (shared_ptr i, _pieces) { + i->decoder->reset (); + } +}