diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-09-01 22:52:21 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-09-01 22:52:21 +0100 |
| commit | 2b8326dcc766aae7e1c275a6c89050c6aa507f96 (patch) | |
| tree | e0c0fb4b5a7c35e3af91bc43d508a621b7a0315f /src/asset_instance.cc | |
| parent | 8924ad6077ecb84385ecdcd244921af2dc34f9fb (diff) | |
Fill in various AssetInstance bits.
Diffstat (limited to 'src/asset_instance.cc')
| -rw-r--r-- | src/asset_instance.cc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/asset_instance.cc b/src/asset_instance.cc index 6107cfda..f8cf8707 100644 --- a/src/asset_instance.cc +++ b/src/asset_instance.cc @@ -17,14 +17,22 @@ */ +#include <libxml++/libxml++.h> #include <libcxml/cxml.h> #include "asset_instance.h" #include "exceptions.h" using std::bad_cast; +using std::make_pair; +using std::pair; +using std::string; using boost::shared_ptr; +using boost::lexical_cast; +using boost::dynamic_pointer_cast; using namespace libdcp; +#define EQUALS_CHECK(param, what) if (param != other->param) { note (ERROR, what " differ"); return false; } + AssetInstance::AssetInstance (shared_ptr<const cxml::Node> node) { id = node->string_child ("Id"); @@ -41,6 +49,43 @@ AssetInstance::AssetInstance (shared_ptr<const cxml::Node> node) node->done (); } +void +AssetInstance::write_to_cpl (xmlpp::Node* node, bool interop) const +{ + pair<string, string> const attr = cpl_node_attribute (interop); + xmlpp::Element* a = node->add_child (cpl_node_name ()); + if (!attr.first.empty ()) { + a->set_attribute (attr.first, attr.second); + } + a->add_child ("Id")->add_child_text ("urn:uuid:" + id); + a->add_child ("AnnotationText")->add_child_text (annotation_text); + a->add_child ("EditRate")->add_child_text (lexical_cast<string> (edit_rate.numerator) + " 1"); + a->add_child ("IntrinsicDuration")->add_child_text (lexical_cast<string> (intrinsic_duration)); + a->add_child ("EntryPoint")->add_child_text (lexical_cast<string> (entry_point)); + a->add_child ("Duration")->add_child_text (lexical_cast<string> (duration)); + if (!key_id.empty ()) { + a->add_child("KeyId")->add_child_text ("urn:uuid:" + key_id); + } +} + + +bool +AssetInstance::equals (shared_ptr<const AssetInstance> other, EqualityOptions, boost::function<void (NoteType, string)> note) const +{ + EQUALS_CHECK (cpl_node_name(), "CPL asset types"); + + EQUALS_CHECK (id, "CPL asset ids"); + EQUALS_CHECK (annotation_text, "CPL asset annotation texts"); + EQUALS_CHECK (edit_rate, "CPL asset edit rates"); + EQUALS_CHECK (intrinsic_duration, "CPL asset intrinsic durations"); + EQUALS_CHECK (entry_point, "CPL asset entry points"); + EQUALS_CHECK (duration, "CPL asset durations"); + EQUALS_CHECK (key_id, "CPL asset key ids"); + + return true; +} + + Picture::Picture (shared_ptr<const cxml::Node> node) : AssetInstance (node) { @@ -59,3 +104,63 @@ Picture::Picture (shared_ptr<const cxml::Node> node) } } + +void +Picture::write_to_cpl (xmlpp::Node* node, bool interop) const +{ + AssetInstance::write_to_cpl (node, interop); + + xmlpp::Node::NodeList c = node->get_children (); + xmlpp::Node::NodeList::iterator i = c.begin(); + while (i != c.end() && (*i)->get_name() != cpl_node_name ()) { + ++i; + } + + assert (i != c.end ()); + + (*i)->add_child ("FrameRate")->add_child_text (lexical_cast<string> (frame_rate.numerator + " " + frame_rate.denominator)); + if (interop) { + (*i)->add_child ("ScreenAspectRatio")->add_child_text ( + lexical_cast<string> (float (screen_aspect_ratio.numerator) / screen_aspect_ratio.denominator) + ); + } else { + (*i)->add_child ("ScreenAspectRatio")->add_child_text ( + lexical_cast<string> (screen_aspect_ratio.numerator) + " " + + lexical_cast<string> (screen_aspect_ratio.denominator) + ); + } +} + +bool +Picture::equals (shared_ptr<const AssetInstance> other, EqualityOptions, boost::function<void (NoteType, string)> note) const +{ + shared_ptr<const Picture> p = dynamic_pointer_cast<const Picture> (other); + if (!p) { + note (ERROR, "CPL assets differ in type"); + return false; + } + + if (frame_rate != p->frame_rate) { + note (ERROR, "CPL asset frame rates differ"); + return false; + } + + if (screen_aspect_ratio != p->screen_aspect_ratio) { + note (ERROR, "CPL screen aspect ratios differ"); + return false; + } + + return true; +} + +pair<string, string> +MainStereoscopicPicture::cpl_node_attribute (bool interop) const +{ + if (interop) { + return make_pair ("xmlns:msp-cpl", "http://www.digicine.com/schemas/437-Y/2007/Main-Stereo-Picture-CPL"); + } else { + return make_pair ("xmlns:msp-cpl", "http://www.smpte-ra.org/schemas/429-10/2008/Main-Stereo-Picture-CPL"); + } + + return make_pair ("", ""); +} |
