From 7394f50d8b5334a17cac37c8956b1b7e8e5e49c8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 13 May 2013 14:45:16 +0100 Subject: Try to move XML bits out into parse/ subdir. --- src/parse/asset_map.cc | 78 ++++++++++++++++++++++++ src/parse/asset_map.h | 81 +++++++++++++++++++++++++ src/parse/cpl.cc | 147 ++++++++++++++++++++++++++++++++++++++++++++ src/parse/cpl.h | 161 +++++++++++++++++++++++++++++++++++++++++++++++++ src/parse/pkl.cc | 51 ++++++++++++++++ src/parse/pkl.h | 60 ++++++++++++++++++ src/parse/subtitle.cc | 135 +++++++++++++++++++++++++++++++++++++++++ src/parse/subtitle.h | 93 ++++++++++++++++++++++++++++ 8 files changed, 806 insertions(+) create mode 100644 src/parse/asset_map.cc create mode 100644 src/parse/asset_map.h create mode 100644 src/parse/cpl.cc create mode 100644 src/parse/cpl.h create mode 100644 src/parse/pkl.cc create mode 100644 src/parse/pkl.h create mode 100644 src/parse/subtitle.cc create mode 100644 src/parse/subtitle.h (limited to 'src/parse') diff --git a/src/parse/asset_map.cc b/src/parse/asset_map.cc new file mode 100644 index 00000000..aedc931e --- /dev/null +++ b/src/parse/asset_map.cc @@ -0,0 +1,78 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/asset_map.cc + * @brief Classes used to parse a AssetMap. + */ + +#include +#include "asset_map.h" +#include "../util.h" +#include "../xml.h" + +using std::string; +using std::list; +using boost::shared_ptr; +using namespace libdcp::parse; + +AssetMap::AssetMap (string file) +{ + cxml::File f (file, "AssetMap"); + + id = f.string_child ("Id"); + creator = f.string_child ("Creator"); + volume_count = f.number_child ("VolumeCount"); + issue_date = f.string_child ("IssueDate"); + issuer = f.string_child ("Issuer"); + assets = type_grand_children (f, "AssetList", "Asset"); +} + +AssetMapAsset::AssetMapAsset (shared_ptr node) +{ + id = node->string_child ("Id"); + packing_list = node->optional_string_child ("PackingList").get_value_or (""); + chunks = type_grand_children (node, "ChunkList", "Chunk"); +} + +Chunk::Chunk (shared_ptr node) +{ + path = node->string_child ("Path"); + + string const prefix = "file://"; + + if (boost::algorithm::starts_with (path, prefix)) { + path = path.substr (prefix.length()); + } + + volume_index = node->optional_number_child ("VolumeIndex").get_value_or (0); + offset = node->optional_number_child ("Offset").get_value_or (0); + length = node->optional_number_child ("Length").get_value_or (0); +} + +shared_ptr +AssetMap::asset_from_id (string id) const +{ + for (list >::const_iterator i = assets.begin (); i != assets.end(); ++i) { + if ((*i)->id == id) { + return *i; + } + } + + return shared_ptr (); +} diff --git a/src/parse/asset_map.h b/src/parse/asset_map.h new file mode 100644 index 00000000..af3e8918 --- /dev/null +++ b/src/parse/asset_map.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/asset_map.h + * @brief Classes used to parse a AssetMap. + */ + +#include +#include +#include + +namespace libdcp { + +namespace parse { + +/** @class Chunk + * @brief A simple parser for and representation of a \ node within an asset map. + */ +class Chunk +{ +public: + Chunk (); + Chunk (boost::shared_ptr node); + + std::string path; + int64_t volume_index; + int64_t offset; + int64_t length; +}; + +/** @class AssetMapAsset + * @brief A simple parser for and representation of an \ node within an asset map. + */ +class AssetMapAsset +{ +public: + AssetMapAsset (); + AssetMapAsset (boost::shared_ptr node); + + std::string id; + std::string packing_list; + std::list > chunks; +}; + +/** @class AssetMap + * @brief A simple parser for and representation of an asset map file. + */ +class AssetMap +{ +public: + AssetMap (std::string file); + + boost::shared_ptr asset_from_id (std::string id) const; + + std::string id; + std::string creator; + int64_t volume_count; + std::string issue_date; + std::string issuer; + std::list > assets; +}; + +} + +} diff --git a/src/parse/cpl.cc b/src/parse/cpl.cc new file mode 100644 index 00000000..c4cf4374 --- /dev/null +++ b/src/parse/cpl.cc @@ -0,0 +1,147 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/cpl_file.cc + * @brief Classes used to parse a CPL. + */ + +#include +#include "cpl.h" +#include "../xml.h" +#include "../util.h" + +using std::string; +using std::bad_cast; +using boost::shared_ptr; +using namespace libdcp::parse; + +CPL::CPL (string file) +{ + cxml::File f (file, "CompositionPlaylist"); + + id = f.string_child ("Id"); + annotation_text = f.optional_string_child ("AnnotationText").get_value_or (""); + issue_date = f.string_child ("IssueDate"); + creator = f.optional_string_child ("Creator").get_value_or (""); + content_title_text = f.string_child ("ContentTitleText"); + content_kind = content_kind_from_string (f.string_child ("ContentKind")); + content_version = optional_type_child (f, "ContentVersion"); + f.ignore_child ("RatingList"); + reels = type_grand_children (f, "ReelList", "Reel"); + + f.ignore_child ("Issuer"); + f.ignore_child ("Signer"); + f.ignore_child ("Signature"); + + f.done (); +} + +ContentVersion::ContentVersion (shared_ptr node) +{ + id = node->optional_string_child ("Id").get_value_or (""); + label_text = node->string_child ("LabelText"); + node->done (); +} + +Reel::Reel (shared_ptr node) +{ + id = node->string_child ("Id"); + asset_list = type_child (node, "AssetList"); + + node->ignore_child ("AnnotationText"); + node->done (); +} + +CPLAssetList::CPLAssetList (shared_ptr node) +{ + main_picture = optional_type_child (node, "MainPicture"); + main_stereoscopic_picture = optional_type_child (node, "MainStereoscopicPicture"); + main_sound = optional_type_child (node, "MainSound"); + main_subtitle = optional_type_child (node, "MainSubtitle"); + + node->done (); +} + +MainPicture::MainPicture (shared_ptr node) + : Picture (node) +{ + +} + +MainStereoscopicPicture::MainStereoscopicPicture (shared_ptr node) + : Picture (node) +{ + +} + +Picture::Picture (shared_ptr node) +{ + id = node->string_child ("Id"); + annotation_text = node->optional_string_child ("AnnotationText").get_value_or (""); + edit_rate = Fraction (node->string_child ("EditRate")); + intrinsic_duration = node->number_child ("IntrinsicDuration"); + entry_point = node->number_child ("EntryPoint"); + duration = node->number_child ("Duration"); + frame_rate = Fraction (node->string_child ("FrameRate")); + try { + screen_aspect_ratio = Fraction (node->string_child ("ScreenAspectRatio")); + } catch (XMLError& e) { + /* Maybe it's not a fraction */ + } + try { + float f = node->number_child ("ScreenAspectRatio"); + screen_aspect_ratio = Fraction (f * 1000, 1000); + } catch (bad_cast& e) { + + } + + node->ignore_child ("Hash"); + + node->done (); +} + +MainSound::MainSound (shared_ptr node) +{ + id = node->string_child ("Id"); + annotation_text = node->optional_string_child ("AnnotationText").get_value_or (""); + edit_rate = Fraction (node->string_child ("EditRate")); + intrinsic_duration = node->number_child ("IntrinsicDuration"); + entry_point = node->number_child ("EntryPoint"); + duration = node->number_child ("Duration"); + + node->ignore_child ("Hash"); + node->ignore_child ("Language"); + + node->done (); +} + +MainSubtitle::MainSubtitle (shared_ptr node) +{ + id = node->string_child ("Id"); + annotation_text = node->optional_string_child ("AnnotationText").get_value_or (""); + edit_rate = Fraction (node->string_child ("EditRate")); + intrinsic_duration = node->number_child ("IntrinsicDuration"); + entry_point = node->number_child ("EntryPoint"); + duration = node->number_child ("Duration"); + + node->ignore_child ("Hash"); + node->ignore_child ("Language"); + + node->done (); +} diff --git a/src/parse/cpl.h b/src/parse/cpl.h new file mode 100644 index 00000000..434a244b --- /dev/null +++ b/src/parse/cpl.h @@ -0,0 +1,161 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/parse/cpl.h + * @brief Classes used to parse a CPL. + */ + +#include +#include +#include +#include "../types.h" + +namespace libdcp { + +namespace parse { + +/** @brief A simple representation of a CPL \ node */ +class Picture +{ +public: + Picture () {} + Picture (boost::shared_ptr node); + + std::string id; + std::string annotation_text; + Fraction edit_rate; + /** Duration of the whole thing */ + int64_t intrinsic_duration; + /** Start point in frames */ + int64_t entry_point; + /** Duration that will actually play */ + int64_t duration; + Fraction frame_rate; + Fraction screen_aspect_ratio; +}; + + +/** @brief A simple parser for and representation of a CPL \ node */ +class MainPicture : public Picture +{ +public: + MainPicture () {} + MainPicture (boost::shared_ptr node); +}; + +/** @brief A simple parser for and representation of a CPL \ node */ +class MainStereoscopicPicture : public Picture +{ +public: + MainStereoscopicPicture () {} + MainStereoscopicPicture (boost::shared_ptr node); +}; + +/** @brief A simple parser for and representation of a CPL \ node */ +class MainSound +{ +public: + MainSound () {} + MainSound (boost::shared_ptr node); + + std::string id; + std::string annotation_text; + Fraction edit_rate; + int64_t intrinsic_duration; + int64_t entry_point; + int64_t duration; +}; + +/** @brief A simple parser for and representation of a CPL \ node */ +class MainSubtitle +{ +public: + MainSubtitle () {} + MainSubtitle (boost::shared_ptr node); + + std::string id; + std::string annotation_text; + Fraction edit_rate; + int64_t intrinsic_duration; + int64_t entry_point; + int64_t duration; +}; + +/** @brief A simple parser for and representation of a CPL \ node */ +class CPLAssetList +{ +public: + CPLAssetList () {} + CPLAssetList (boost::shared_ptr node); + + boost::shared_ptr main_picture; + boost::shared_ptr main_stereoscopic_picture; + boost::shared_ptr main_sound; + boost::shared_ptr main_subtitle; +}; + +/** @brief A simple parser for and representation of a CPL \ node */ +class Reel +{ +public: + Reel () {} + Reel (boost::shared_ptr node); + + std::string id; + boost::shared_ptr asset_list; +}; + + +/** @brief A simple parser for and representation of a CPL \ node */ +class ContentVersion +{ +public: + ContentVersion () {} + ContentVersion (boost::shared_ptr node); + + std::string id; + std::string label_text; +}; + +/** @class CPL + * @brief Class to parse a CPL + * + * This class is used to parse XML CPL files. It is rarely necessary + * for the caller to use it outside libdcp. + */ +class CPL +{ +public: + /** Parse a CPL XML file into our member variables */ + CPL (std::string file); + + std::string id; + std::string annotation_text; + std::string issue_date; + std::string creator; + std::string content_title_text; + ContentKind content_kind; + boost::shared_ptr content_version; + std::list > reels; +}; + +} + +} + diff --git a/src/parse/pkl.cc b/src/parse/pkl.cc new file mode 100644 index 00000000..d790cfe4 --- /dev/null +++ b/src/parse/pkl.cc @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/pkl_file.cc + * @brief Classes used to parse a PKL. + */ + +#include +#include "pkl.h" + +using namespace std; +using namespace boost; +using namespace libdcp::parse; + +PKL::PKL (string file) +{ + cxml::File f (file, "PackingList"); + + id = f.string_child ("Id"); + annotation_text = f.optional_string_child ("AnnotationText").get_value_or (""); + issue_date = f.string_child ("IssueDate"); + issuer = f.string_child ("Issuer"); + creator = f.string_child ("Creator"); + assets = type_grand_children (f, "AssetList", "Asset"); +} + +PKLAsset::PKLAsset (boost::shared_ptr node) +{ + id = node->string_child ("Id"); + annotation_text = node->optional_string_child ("AnnotationText").get_value_or (""); + hash = node->string_child ("Hash"); + size = node->number_child ("Size"); + type = node->string_child ("Type"); + original_file_name = node->optional_string_child ("OriginalFileName").get_value_or (""); +} diff --git a/src/parse/pkl.h b/src/parse/pkl.h new file mode 100644 index 00000000..13d87fa1 --- /dev/null +++ b/src/parse/pkl.h @@ -0,0 +1,60 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file src/parse/pkl.h + * @brief Classes used to parse a PKL + */ + +#include +#include "../xml.h" + +namespace libdcp { + +namespace parse { + +class PKLAsset +{ +public: + PKLAsset () {} + PKLAsset (boost::shared_ptr); + + std::string id; + std::string annotation_text; + std::string hash; + int64_t size; + std::string type; + std::string original_file_name; +}; + +class PKL +{ +public: + PKL (std::string file); + + std::string id; + std::string annotation_text; + std::string issue_date; + std::string issuer; + std::string creator; + std::list > assets; +}; + +} + +} diff --git a/src/parse/subtitle.cc b/src/parse/subtitle.cc new file mode 100644 index 00000000..471d62b7 --- /dev/null +++ b/src/parse/subtitle.cc @@ -0,0 +1,135 @@ +/* + Copyright (C) 2012-2013 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include "subtitle.h" +#include "../types.h" + +using std::string; +using std::list; +using boost::shared_ptr; +using boost::optional; +using boost::lexical_cast; +using namespace libdcp; +using namespace libdcp::parse; + +Font::Font (shared_ptr node) +{ + text = node->content (); + + id = node->optional_string_attribute ("Id").get_value_or (""); + size = node->optional_number_attribute ("Size").get_value_or (0); + italic = node->optional_bool_attribute ("Italic").get_value_or (false); + optional c = node->optional_string_attribute ("Color"); + if (c) { + color = Color (c.get ()); + } + optional const e = node->optional_string_attribute ("Effect"); + if (e) { + effect = string_to_effect (e.get ()); + } + c = node->optional_string_attribute ( "EffectColor"); + if (c) { + effect_color = Color (c.get ()); + } + subtitle_nodes = type_children (node, "Subtitle"); + font_nodes = type_children (node, "Font"); + text_nodes = type_children (node, "Text"); +} + +Font::Font (list > const & font_nodes) + : size (0) + , italic (false) + , color ("FFFFFFFF") + , effect_color ("FFFFFFFF") +{ + for (list >::const_iterator i = font_nodes.begin(); i != font_nodes.end(); ++i) { + if (!(*i)->id.empty ()) { + id = (*i)->id; + } + if ((*i)->size != 0) { + size = (*i)->size; + } + if ((*i)->italic) { + italic = (*i)->italic.get (); + } + if ((*i)->color) { + color = (*i)->color.get (); + } + if ((*i)->effect) { + effect = (*i)->effect.get (); + } + if ((*i)->effect_color) { + effect_color = (*i)->effect_color.get (); + } + } +} + +LoadFont::LoadFont (shared_ptr node) +{ + id = node->string_attribute ("Id"); + uri = node->string_attribute ("URI"); +} + + +Subtitle::Subtitle (shared_ptr node) +{ + in = Time (node->string_attribute ("TimeIn")); + out = Time (node->string_attribute ("TimeOut")); + font_nodes = type_children (node, "Font"); + text_nodes = type_children (node, "Text"); + fade_up_time = fade_time (node, "FadeUpTime"); + fade_down_time = fade_time (node, "FadeDownTime"); +} + +Time +Subtitle::fade_time (shared_ptr node, string name) +{ + string const u = node->optional_string_attribute (name).get_value_or (""); + Time t; + + if (u.empty ()) { + t = Time (0, 0, 0, 20); + } else if (u.find (":") != string::npos) { + t = Time (u); + } else { + t = Time (0, 0, 0, lexical_cast (u)); + } + + if (t > Time (0, 0, 8, 0)) { + t = Time (0, 0, 8, 0); + } + + return t; +} + +Text::Text (shared_ptr node) + : v_align (CENTER) +{ + text = node->content (); + v_position = node->number_attribute ("VPosition"); + optional v = node->optional_string_attribute ("VAlign"); + if (v) { + v_align = string_to_valign (v.get ()); + } + + font_nodes = type_children (node, "Font"); +} + diff --git a/src/parse/subtitle.h b/src/parse/subtitle.h new file mode 100644 index 00000000..34321545 --- /dev/null +++ b/src/parse/subtitle.h @@ -0,0 +1,93 @@ +/* + Copyright (C) 2012 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "../xml.h" +#include "../dcp_time.h" +#include "../types.h" + +namespace libdcp +{ + +namespace parse +{ + +class Font; + +class Text +{ +public: + Text () {} + Text (boost::shared_ptr node); + + float v_position; + VAlign v_align; + std::string text; + std::list > font_nodes; +}; + +class Subtitle +{ +public: + Subtitle () {} + Subtitle (boost::shared_ptr node); + + Time in; + Time out; + Time fade_up_time; + Time fade_down_time; + std::list > font_nodes; + std::list > text_nodes; + +private: + Time fade_time (boost::shared_ptr, std::string name); +}; + +class Font +{ +public: + Font () {} + Font (boost::shared_ptr node); + Font (std::list > const & font_nodes); + + std::string text; + std::string id; + int size; + boost::optional italic; + boost::optional color; + boost::optional effect; + boost::optional effect_color; + + std::list > subtitle_nodes; + std::list > font_nodes; + std::list > text_nodes; +}; + +class LoadFont +{ +public: + LoadFont () {} + LoadFont (boost::shared_ptr node); + + std::string id; + std::string uri; +}; + +} + +} -- cgit v1.2.3