Don't crash when loading DCPs with multiple CCAP assets per reel (part of #1516). v2.13.140
authorCarl Hetherington <cth@carlh.net>
Fri, 29 Mar 2019 01:19:44 +0000 (01:19 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 29 Mar 2019 01:19:44 +0000 (01:19 +0000)
src/lib/dcp_content.cc
src/lib/dcp_examiner.cc
src/lib/dcp_examiner.h

index 4c4486a281e77c0be0656fa93cc2c5da80e32dd4..ef877a17fbd438d2159400190ebc91a185774597 100644 (file)
@@ -225,7 +225,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                boost::mutex::scoped_lock lm (_mutex);
                _name = examiner->name ();
                for (int i = 0; i < TEXT_COUNT; ++i) {
-                       if (examiner->has_text(static_cast<TextType>(i))) {
+                       for (int j = 0; j < examiner->text_count(static_cast<TextType>(i)); ++j) {
                                text.push_back (shared_ptr<TextContent>(new TextContent(this, static_cast<TextType>(i), static_cast<TextType>(i))));
                        }
                }
index dfb47f2ebf6d1f009e9476620e4c708ea84591c4..c70d8b2dbc9172966e400ce8451c9a0ed6168493 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -66,7 +66,7 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content)
        shared_ptr<dcp::CPL> cpl;
 
        for (int i = 0; i < TEXT_COUNT; ++i) {
-               _has_text[i] = false;
+               _text_count[i] = 0;
        }
 
        if (content->cpl ()) {
@@ -170,7 +170,7 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content)
                                return;
                        }
 
-                       _has_text[TEXT_OPEN_SUBTITLE] = true;
+                       _text_count[TEXT_OPEN_SUBTITLE] = 1;
                }
 
                BOOST_FOREACH (shared_ptr<dcp::ReelClosedCaptionAsset> j, i->closed_captions()) {
@@ -180,7 +180,7 @@ DCPExaminer::DCPExaminer (shared_ptr<const DCPContent> content)
                                return;
                        }
 
-                       _has_text[TEXT_CLOSED_CAPTION] = true;
+                       _text_count[TEXT_CLOSED_CAPTION]++;
                }
 
                if (i->main_picture()) {
index f54f02c36c005f607de6b8b3720beac8b4a3f2df..199ac39851e4229e57949b33e7cd62043e22f771 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -83,8 +83,11 @@ public:
                return _audio_frame_rate.get_value_or (48000);
        }
 
-       bool has_text (TextType type) const {
-               return _has_text[type];
+       /** @param type TEXT_OPEN_SUBTITLE or TEXT_CLOSED_CAPTION.
+        *  @return Number of assets of this type in this DCP.
+        */
+       int text_count (TextType type) const {
+               return _text_count[type];
        }
 
        bool kdm_valid () const {
@@ -123,7 +126,8 @@ private:
        bool _has_video;
        /** true if this DCP has audio content (but false if it has unresolved references to audio content) */
        bool _has_audio;
-       bool _has_text[TEXT_COUNT];
+       /** number of different assets of each type (OCAP/CCAP) */
+       int _text_count[TEXT_COUNT];
        bool _encrypted;
        bool _needs_assets;
        bool _kdm_valid;