Tweaks for more real-life DCPs; beginning of subtitle support.
authorCarl Hetherington <cth@carlh.net>
Sun, 12 Aug 2012 23:10:19 +0000 (00:10 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 12 Aug 2012 23:10:19 +0000 (00:10 +0100)
src/asset_map.cc
src/cpl.cc
src/cpl.h
src/dcp.cc
src/dcp.h
src/xml.cc

index b77c4ac190b012e85b648471d54508d8a1f9b067..3e0a0545a46fae0e9ad11bc55c913bbf8788a8d6 100644 (file)
@@ -26,7 +26,7 @@ Chunk::Chunk (xmlpp::Node const * node)
        : XMLNode (node)
 {
        path = string_node ("Path");
-       volume_index = int64_node ("VolumeIndex");
+       volume_index = optional_int64_node ("VolumeIndex");
        offset = optional_int64_node ("Offset");
        length = optional_int64_node ("Length");
 }
index 9dfe446d9b0dcc675b30e45467d71c62f869f291..137d359f9cf936fb155ffaea203d19897778e10d 100644 (file)
@@ -8,7 +8,7 @@ CPL::CPL (string file)
        : XMLFile (file, "CompositionPlaylist")
 {
        id = string_node ("Id");
-       annotation_text = string_node ("AnnotationText");
+       annotation_text = optional_string_node ("AnnotationText");
        issue_date = string_node ("IssueDate");
        creator = string_node ("Creator");
        content_title_text = string_node ("ContentTitleText");
@@ -46,6 +46,7 @@ CPLAssetList::CPLAssetList (xmlpp::Node const * node)
 {
        main_picture = sub_node<MainPicture> ("MainPicture");
        main_sound = optional_sub_node<MainSound> ("MainSound");
+       main_subtitle = optional_sub_node<MainSubtitle> ("MainSubtitle");
 
        done ();
 }
@@ -91,3 +92,18 @@ MainSound::MainSound (xmlpp::Node const * node)
        
        done ();
 }
+
+MainSubtitle::MainSubtitle (xmlpp::Node const * node)
+       : XMLNode (node)
+{
+       id = string_node ("Id");
+       annotation_text = optional_string_node ("AnnotationText");
+       edit_rate = fraction_node ("EditRate");
+       intrinsic_duration = int64_node ("IntrinsicDuration");
+       entry_point = int64_node ("EntryPoint");
+       duration = int64_node ("Duration");
+
+       ignore_node ("Hash");
+       
+       done ();
+}
index a0426b96d29a2bddfb7a19772e19c37d25fde740..5dd2c37bf342f7e75b5599e7162033db64c97fe0 100644 (file)
--- a/src/cpl.h
+++ b/src/cpl.h
@@ -34,6 +34,20 @@ public:
        int64_t duration;
 };
 
+class MainSubtitle : public XMLNode
+{
+public:
+       MainSubtitle () {}
+       MainSubtitle (xmlpp::Node const * node);
+
+       std::string id;
+       std::string annotation_text;
+       Fraction edit_rate;
+       int64_t intrinsic_duration;
+       int64_t entry_point;
+       int64_t duration;
+};
+
 class CPLAssetList : public XMLNode
 {
 public:
@@ -42,6 +56,7 @@ public:
 
        boost::shared_ptr<MainPicture> main_picture;
        boost::shared_ptr<MainSound> main_sound;
+       boost::shared_ptr<MainSubtitle> main_subtitle;
 };
 
 class Reel : public XMLNode
index 5eadbca6dbdcf45e68ab7049800f8fe07cc29a82..b478f18d1d6aca2e5c56b39c201aed147117d2c3 100644 (file)
@@ -288,9 +288,9 @@ DCP::DCP (string directory)
        _fps = cpl_assets->main_picture->frame_rate.numerator;
        _length = cpl_assets->main_picture->duration;
 
-       string n = cpl_assets->main_picture->annotation_text;
+       string n = pkl->asset_from_id(cpl_assets->main_picture->id)->original_file_name;
        if (n.empty ()) {
-               n = pkl->asset_from_id(cpl_assets->main_picture->id)->original_file_name;
+               n = cpl_assets->main_picture->annotation_text;
        }
 
        _assets.push_back (shared_ptr<PictureAsset> (
@@ -304,9 +304,9 @@ DCP::DCP (string directory)
 
        if (cpl_assets->main_sound) {
 
-               n = cpl_assets->main_sound->annotation_text;
+               n = pkl->asset_from_id(cpl_assets->main_sound->id)->original_file_name;
                if (n.empty ()) {
-                       n = pkl->asset_from_id(cpl_assets->main_sound->id)->original_file_name;
+                       n = cpl_assets->main_sound->annotation_text;
                }
        
                _assets.push_back (shared_ptr<SoundAsset> (
@@ -333,7 +333,7 @@ DCP::scan (Files& files, string directory) const
                        continue;
                }
 
-               if (ends_with (t, ".mxf")) {
+               if (ends_with (t, ".mxf") || ends_with (t, ".ttf")) {
                        continue;
                }
 
@@ -373,6 +373,8 @@ DCP::scan (Files& files, string directory) const
                                throw DCPReadError ("duplicate AssetMaps found");
                        }
                        files.asset_map = t;
+               } else if (root == "DCSubtitle") {
+                       files.subtitles.push_back (t);
                }
        }
 }
index 90369aa54b7f8f29adffac541fd24fa9576efcea..7f62acd14379a685ff37d00000a22c6bdeed947a 100644 (file)
--- a/src/dcp.h
+++ b/src/dcp.h
@@ -149,6 +149,7 @@ private:
                std::string cpl;
                std::string pkl;
                std::string asset_map;
+               std::list<std::string> subtitles;
        };
 
        void scan (Files& files, std::string directory) const;
index 72dfe1bbcf0472acb3687730708965be89767e2a..206cb5f0486ac845039366b2c4ec25f627aea2c1 100644 (file)
@@ -62,9 +62,14 @@ XMLNode::string_node (string name)
        xmlpp::Node* node = xml_node (name);
        
         xmlpp::Node::NodeList c = node->get_children ();
-       if (c.size() != 1) {
+
+       if (c.size() > 1) {
                throw XMLError ("unexpected content in XML node");
        }
+
+       if (c.empty ()) {
+               return "";
+       }
        
         xmlpp::ContentNode const * v = dynamic_cast<xmlpp::ContentNode const *> (c.front());
        if (!v) {