Fix DCP playback when an incorrect KDM is added, followed by
[dcpomatic.git] / src / lib / dcp_decoder.cc
index 4b189189e0b61fc395e83658968a1b34cf44947b..ab724cd6c75bbb7a5f02326e15b92f3a964a0322 100644 (file)
@@ -29,6 +29,7 @@
 #include "image.h"
 #include "config.h"
 #include "digester.h"
+#include "frame_interval_checker.h"
 #include <dcp/dcp.h>
 #include <dcp/cpl.h>
 #include <dcp/reel.h>
@@ -125,7 +126,14 @@ DCPDecoder::DCPDecoder (shared_ptr<const Film> film, shared_ptr<const DCPContent
 bool
 DCPDecoder::pass ()
 {
-       if (_reel == _reels.end () || !_dcp_content->can_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<shared_ptr<TextDecoder> >::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<dcp::ReelClosedCaptionAsset> 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
                        );
@@ -437,10 +451,18 @@ DCPDecoder::calculate_lazy_digest (shared_ptr<const DCPContent> c) const
        BOOST_FOREACH (boost::filesystem::path i, c->paths()) {
                d.add (i.string());
        }
-       d.add (static_cast<bool>(_dcp_content->kdm()));
+       if (_dcp_content->kdm()) {
+               d.add(_dcp_content->kdm()->id());
+       }
        d.add (static_cast<bool>(c->cpl()));
        if (c->cpl()) {
                d.add (c->cpl().get());
        }
        return d.get ();
 }
+
+ContentTime
+DCPDecoder::position () const
+{
+       return ContentTime::from_frames(_offset, _dcp_content->active_video_frame_rate(film())) + _next;
+}