Some comments.
[libdcp.git] / src / picture_asset.cc
index cba5ecefee663bdcbcbd4096abb15fa6fdcce225..2c35e9f9702269feafd082c9ae3acb89036b6c02 100644 (file)
@@ -68,15 +68,45 @@ PictureAsset::PictureAsset (string directory, string mxf_name)
 }
 
 string
-PictureAsset::cpl_node_name () const
+MonoPictureAsset::cpl_node_name () const
 {
        return "MainPicture";
 }
 
+int
+MonoPictureAsset::edit_rate_factor () const
+{
+       return 1;
+}
+
+string
+StereoPictureAsset::cpl_node_name () const
+{
+       return "msp-cpl:MainStereoscopicPicture";
+}
+
+pair<string, string>
+StereoPictureAsset::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 ("", "");
+}
+
+int
+StereoPictureAsset::edit_rate_factor () const
+{
+       return 2;
+}
+
 void
-PictureAsset::write_to_cpl (xmlpp::Node* node) const
+PictureAsset::write_to_cpl (xmlpp::Element* node, bool interop) const
 {
-       MXFAsset::write_to_cpl (node);
+       MXFAsset::write_to_cpl (node, interop);
        
        xmlpp::Node::NodeList c = node->get_children ();
        xmlpp::Node::NodeList::iterator i = c.begin();
@@ -86,8 +116,12 @@ PictureAsset::write_to_cpl (xmlpp::Node* node) const
 
        assert (i != c.end ());
 
-       (*i)->add_child ("FrameRate")->add_child_text (lexical_cast<string> (_edit_rate) + " 1");
-       (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast<string> (_size.width) + " " + lexical_cast<string> (_size.height));
+       (*i)->add_child ("FrameRate")->add_child_text (lexical_cast<string> (_edit_rate * edit_rate_factor ()) + " 1");
+       if (interop) {
+               (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast<string> (float (_size.width) / _size.height));
+       } else {
+               (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast<string> (_size.width) + " " + lexical_cast<string> (_size.height));
+       }
 }
 
 bool
@@ -163,11 +197,12 @@ MonoPictureAsset::MonoPictureAsset (
        int intrinsic_duration,
        bool encrypted,
        Size size,
+       bool interop,
        MXFMetadata const & metadata
        )
        : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, encrypted, size)
 {
-       construct (get_path, metadata);
+       construct (get_path, interop, metadata);
 }
 
 MonoPictureAsset::MonoPictureAsset (
@@ -179,11 +214,12 @@ MonoPictureAsset::MonoPictureAsset (
        int intrinsic_duration,
        bool encrypted,
        Size size,
+       bool interop,
        MXFMetadata const & metadata
        )
        : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, encrypted, size)
 {
-       construct (boost::bind (&MonoPictureAsset::path_from_list, this, _1, files), metadata);
+       construct (boost::bind (&MonoPictureAsset::path_from_list, this, _1, files), interop, metadata);
 }
 
 MonoPictureAsset::MonoPictureAsset (string directory, string mxf_name, int fps, Size size)
@@ -213,7 +249,7 @@ MonoPictureAsset::MonoPictureAsset (string directory, string mxf_name)
 }
 
 void
-MonoPictureAsset::construct (boost::function<string (int)> get_path, MXFMetadata const & metadata)
+MonoPictureAsset::construct (boost::function<string (int)> get_path, bool interop, MXFMetadata const & metadata)
 {
        ASDCP::JP2K::CodestreamParser j2k_parser;
        ASDCP::JP2K::FrameBuffer frame_buffer (4 * Kumu::Megabyte);
@@ -226,7 +262,7 @@ MonoPictureAsset::construct (boost::function<string (int)> get_path, MXFMetadata
        picture_desc.EditRate = ASDCP::Rational (_edit_rate, 1);
        
        ASDCP::WriterInfo writer_info;
-       fill_writer_info (&writer_info, _uuid, metadata);
+       fill_writer_info (&writer_info, _uuid, interop, metadata);
        
        ASDCP::JP2K::MXFWriter mxf_writer;
        if (ASDCP_FAILURE (mxf_writer.OpenWrite (path().string().c_str(), writer_info, picture_desc, 16384, false))) {
@@ -423,11 +459,11 @@ StereoPictureAsset::get_frame (int n) const
        return shared_ptr<const StereoPictureFrame> (new StereoPictureFrame (path().string(), n));
 }
 
-shared_ptr<MonoPictureAssetWriter>
-MonoPictureAsset::start_write (bool overwrite, MXFMetadata const & metadata)
+shared_ptr<PictureAssetWriter>
+MonoPictureAsset::start_write (bool overwrite, bool interop, MXFMetadata const & metadata)
 {
        /* XXX: can't we use shared_ptr here? */
-       return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this, overwrite, metadata));
+       return shared_ptr<MonoPictureAssetWriter> (new MonoPictureAssetWriter (this, overwrite, interop, metadata));
 }
 
 string
@@ -442,10 +478,10 @@ StereoPictureAsset::StereoPictureAsset (string directory, string mxf_name, int f
 
 }
 
-shared_ptr<StereoPictureAssetWriter>
-StereoPictureAsset::start_write (bool overwrite, MXFMetadata const & metadata)
+shared_ptr<PictureAssetWriter>
+StereoPictureAsset::start_write (bool overwrite, bool interop, MXFMetadata const & metadata)
 {
        /* XXX: can't we use shared_ptr here? */
-       return shared_ptr<StereoPictureAssetWriter> (new StereoPictureAssetWriter (this, overwrite, metadata));
+       return shared_ptr<StereoPictureAssetWriter> (new StereoPictureAssetWriter (this, overwrite, interop, metadata));
 }