: 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");
}
: 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");
{
main_picture = sub_node<MainPicture> ("MainPicture");
main_sound = optional_sub_node<MainSound> ("MainSound");
+ main_subtitle = optional_sub_node<MainSubtitle> ("MainSubtitle");
done ();
}
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 ();
+}
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:
boost::shared_ptr<MainPicture> main_picture;
boost::shared_ptr<MainSound> main_sound;
+ boost::shared_ptr<MainSubtitle> main_subtitle;
};
class Reel : public XMLNode
_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> (
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> (
continue;
}
- if (ends_with (t, ".mxf")) {
+ if (ends_with (t, ".mxf") || ends_with (t, ".ttf")) {
continue;
}
throw DCPReadError ("duplicate AssetMaps found");
}
files.asset_map = t;
+ } else if (root == "DCSubtitle") {
+ files.subtitles.push_back (t);
}
}
}
std::string cpl;
std::string pkl;
std::string asset_map;
+ std::list<std::string> subtitles;
};
void scan (Files& files, std::string directory) const;
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) {