summaryrefslogtreecommitdiff
path: root/src/asset_instance.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-09-01 22:52:21 +0100
committerCarl Hetherington <cth@carlh.net>2013-09-01 22:52:21 +0100
commit2b8326dcc766aae7e1c275a6c89050c6aa507f96 (patch)
treee0c0fb4b5a7c35e3af91bc43d508a621b7a0315f /src/asset_instance.cc
parent8924ad6077ecb84385ecdcd244921af2dc34f9fb (diff)
Fill in various AssetInstance bits.
Diffstat (limited to 'src/asset_instance.cc')
-rw-r--r--src/asset_instance.cc105
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 ("", "");
+}