X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Freel_asset.cc;h=2457c079c19effde03e2bfcb9263154cb88d0984;hb=099cb53c7a1079b3d3b2bf0c1cf635673a0192fd;hp=caaf3eee45fc14ca6f560899840c1f5ac89aa239;hpb=4946acfd735321e7f0c29ea4b6e371bc9e90a7f6;p=libdcp.git diff --git a/src/reel_asset.cc b/src/reel_asset.cc index caaf3eee..2457c079 100644 --- a/src/reel_asset.cc +++ b/src/reel_asset.cc @@ -68,10 +68,10 @@ ReelAsset::ReelAsset (string id, Fraction edit_rate, int64_t intrinsic_duration, ReelAsset::ReelAsset (shared_ptr node) : Object (remove_urn_uuid (node->string_child ("Id"))) , _intrinsic_duration (node->number_child ("IntrinsicDuration")) - , _duration (node->number_child ("Duration")) + , _duration (node->optional_number_child("Duration")) , _annotation_text (node->optional_string_child ("AnnotationText").get_value_or ("")) , _edit_rate (Fraction (node->string_child ("EditRate"))) - , _entry_point (node->number_child ("EntryPoint")) + , _entry_point (node->optional_number_child("EntryPoint")) { } @@ -79,21 +79,25 @@ ReelAsset::ReelAsset (shared_ptr node) xmlpp::Node* ReelAsset::write_to_cpl_base (xmlpp::Node* node, Standard standard, optional hash) const { - xmlpp::Element* a = node->add_child (cpl_node_name (standard)); - pair const attr = cpl_node_attribute (standard); - if (!attr.first.empty ()) { - a->set_attribute (attr.first, attr.second); - } - pair const ns = cpl_node_namespace (standard); - if (!ns.first.empty ()) { - a->set_namespace_declaration (ns.first, ns.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 (String::compose ("%1 %2", _edit_rate.numerator, _edit_rate.denominator)); - a->add_child("IntrinsicDuration")->add_child_text (raw_convert (_intrinsic_duration)); - a->add_child("EntryPoint")->add_child_text (raw_convert (_entry_point)); - a->add_child("Duration")->add_child_text (raw_convert (_duration)); + xmlpp::Element* a = node->add_child (cpl_node_name (standard)); + pair const attr = cpl_node_attribute (standard); + if (!attr.first.empty ()) { + a->set_attribute (attr.first, attr.second); + } + pair const ns = cpl_node_namespace (standard); + if (!ns.first.empty ()) { + a->set_namespace_declaration (ns.first, ns.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 (String::compose ("%1 %2", _edit_rate.numerator, _edit_rate.denominator)); + a->add_child("IntrinsicDuration")->add_child_text (raw_convert (_intrinsic_duration)); + if (_entry_point) { + a->add_child("EntryPoint")->add_child_text(raw_convert(*_entry_point)); + } + if (_duration) { + a->add_child("Duration")->add_child_text(raw_convert(*_duration)); + } if (hash) { a->add_child("Hash")->add_child_text (hash.get()); } @@ -147,3 +151,14 @@ ReelAsset::asset_equals (shared_ptr other, EqualityOptions opt, return true; } + +/** @return , or - if is not present */ +int64_t +ReelAsset::actual_duration () const +{ + if (_duration) { + return *_duration; + } + + return _intrinsic_duration - _entry_point.get_value_or(0); +}