Check that all image data is present after loading a SMPTE subtitle asset. v1.6.5
authorCarl Hetherington <cth@carlh.net>
Fri, 15 Mar 2019 23:16:00 +0000 (23:16 +0000)
committerCarl Hetherington <cth@carlh.net>
Sat, 16 Mar 2019 00:32:08 +0000 (00:32 +0000)
If we load SMPTE subtitles from a XML file try to load PNG data
from the same directory; this feels like a hack.

src/exceptions.cc
src/exceptions.h
src/smpte_subtitle_asset.cc

index e9cdcef1d99494968b6f491bb4a00e193e75032a..7516d0858577050f1f29ce82d9f57b79d715dd66 100644 (file)
@@ -110,7 +110,7 @@ KDMFormatError::KDMFormatError (std::string message)
 
 }
 
-CertificateChainError::CertificateChainError (std::string message)
+CertificateChainError::CertificateChainError (string message)
        : runtime_error (message)
 {
 
@@ -123,3 +123,9 @@ DCPReadError::DCPReadError (string message, string detail)
 {
 
 }
+
+MissingSubtitleImageError::MissingSubtitleImageError (string id)
+       : runtime_error (String::compose("Could not load image for subtitle %1", id))
+{
+
+}
index 4c54ac787f4aae9f0574871fd602ebe9f03e44e0..65271c1618fc233af9c3ed18710abef97721e90f 100644 (file)
@@ -222,6 +222,12 @@ public:
        CertificateChainError (std::string message);
 };
 
+class MissingSubtitleImageError : public std::runtime_error
+{
+public:
+       MissingSubtitleImageError (std::string id);
+};
+
 }
 
 #endif
index f94067931d8fd3e0bbbbe8c9edfbaf62ddfd8004..ae473071c84d6a281e2aa1244912ca38cd1be234 100644 (file)
@@ -62,6 +62,7 @@ using boost::is_any_of;
 using boost::shared_array;
 using boost::dynamic_pointer_cast;
 using boost::optional;
+using boost::starts_with;
 using namespace dcp;
 
 static string const subtitle_smpte_ns = "http://www.smpte-ra.org/schemas/428-7/2010/DCST";
@@ -116,6 +117,33 @@ SMPTESubtitleAsset::SMPTESubtitleAsset (boost::filesystem::path file)
                                        )
                                );
                }
+
+               /* Try to read PNG files from the same folder that the XML is in; the wisdom of this is
+                  debatable, at best...
+               */
+               BOOST_FOREACH (shared_ptr<Subtitle> i, _subtitles) {
+                       shared_ptr<SubtitleImage> im = dynamic_pointer_cast<SubtitleImage>(i);
+                       if (im && im->png_image().size() == 0) {
+                               /* Even more dubious; allow <id>.png or urn:uuid:<id>.png */
+                               boost::filesystem::path p = file.parent_path() / String::compose("%1.png", im->id());
+                               if (boost::filesystem::is_regular_file(p)) {
+                                       im->read_png_file (p);
+                               } else if (starts_with (im->id(), "urn:uuid:")) {
+                                       p = file.parent_path() / String::compose("%1.png", remove_urn_uuid(im->id()));
+                                       if (boost::filesystem::is_regular_file(p)) {
+                                               im->read_png_file (p);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /* Check that all required image data have been found */
+       BOOST_FOREACH (shared_ptr<Subtitle> i, _subtitles) {
+               shared_ptr<SubtitleImage> im = dynamic_pointer_cast<SubtitleImage>(i);
+               if (im && im->png_image().size() == 0) {
+                       throw MissingSubtitleImageError (im->id());
+               }
        }
 }