X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcp_decoder.cc;h=19831185d16203834393335716420998b4a64e84;hb=aa382124eeabcad7a7346d46fb5f931c1364a849;hp=4b189189e0b61fc395e83658968a1b34cf44947b;hpb=96f7dd41a2c8627bc1ea0d24d84142eb04b4ffef;p=dcpomatic.git diff --git a/src/lib/dcp_decoder.cc b/src/lib/dcp_decoder.cc index 4b189189e..19831185d 100644 --- a/src/lib/dcp_decoder.cc +++ b/src/lib/dcp_decoder.cc @@ -29,6 +29,7 @@ #include "image.h" #include "config.h" #include "digester.h" +#include "frame_interval_checker.h" #include #include #include @@ -125,7 +126,14 @@ DCPDecoder::DCPDecoder (shared_ptr film, shared_ptrcan_be_played ()) { + if (!_dcp_content->can_be_played()) { + return true; + } + + if (_reel == _reels.end()) { + if (audio) { + audio->flush (); + } return true; } @@ -223,8 +231,14 @@ void DCPDecoder::pass_texts (ContentTime next, dcp::Size size) { list >::const_iterator decoder = text.begin (); + if (decoder == text.end()) { + /* It's possible that there is now a main subtitle but no TextDecoders, for example if + the CPL has just changed but the TextContent's texts have not been recreated yet. + */ + return; + } + if ((*_reel)->main_subtitle()) { - DCPOMATIC_ASSERT (decoder != text.end ()); pass_texts ( next, (*_reel)->main_subtitle()->asset(), @@ -235,8 +249,8 @@ DCPDecoder::pass_texts (ContentTime next, dcp::Size size) ); ++decoder; } + BOOST_FOREACH (shared_ptr i, (*_reel)->closed_captions()) { - DCPOMATIC_ASSERT (decoder != text.end ()); pass_texts ( next, i->asset(), _dcp_content->reference_text(TEXT_CLOSED_CAPTION), i->entry_point().get_value_or(0), *decoder, size ); @@ -444,3 +458,9 @@ DCPDecoder::calculate_lazy_digest (shared_ptr c) const } return d.get (); } + +ContentTime +DCPDecoder::position () const +{ + return ContentTime::from_frames(_offset, _dcp_content->active_video_frame_rate(film())) + _next; +}