Fix loading of some old metadata versions.
[dcpomatic.git] / src / lib / dcp_content.cc
index ca809df616443c0963e7f5c0dcadfc00dc6bc3ef..d866a6b86c69f03a9593d04b94d8ec1b2a5bca1c 100644 (file)
@@ -30,6 +30,7 @@
 #include "dcp_decoder.h"
 #include "subtitle_content.h"
 #include <dcp/dcp.h>
+#include <dcp/raw_convert.h>
 #include <dcp/exceptions.h>
 #include <dcp/reel_picture_asset.h>
 #include <dcp/reel.h>
@@ -50,6 +51,7 @@ using boost::shared_ptr;
 using boost::scoped_ptr;
 using boost::optional;
 using boost::function;
+using dcp::raw_convert;
 
 int const DCPContentProperty::CAN_BE_PLAYED      = 600;
 int const DCPContentProperty::REFERENCE_VIDEO    = 601;
@@ -83,7 +85,10 @@ DCPContent::DCPContent (shared_ptr<const Film> film, cxml::ConstNodePtr node, in
                AudioStreamPtr (
                        new AudioStream (
                                node->number_child<int> ("AudioFrameRate"),
-                               node->number_child<Frame> ("AudioLength"),
+                               /* AudioLength was not present in some old metadata versions */
+                               node->optional_number_child<Frame>("AudioLength").get_value_or (
+                                       video->length() * node->number_child<int>("AudioFrameRate") / video_frame_rate().get()
+                                       ),
                                AudioMapping (node->node_child ("AudioMapping"), version)
                                )
                        )
@@ -239,14 +244,13 @@ DCPContent::full_length () const
 string
 DCPContent::identifier () const
 {
-       SafeStringStream s;
-       s << Content::identifier() << "_" << video->identifier() << "_";
+       string s = Content::identifier() + "_" + video->identifier() + "_";
        if (subtitle) {
-               s << subtitle->identifier () << " ";
+               s += subtitle->identifier () + " ";
        }
-       s << (_reference_video ? "1" : "0")
-         << (_reference_subtitle ? "1" : "0");
-       return s.str ();
+
+       s += string (_reference_video ? "1" : "0") + string (_reference_subtitle ? "1" : "0");
+       return s;
 }
 
 void