X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fpicture_asset.cc;h=5903b394304b0baf4fdd70ca2c6473f5b651cc1b;hb=30e2f6f873002d16aeae707879ea15c1c63a4323;hp=2ecfa2290896e3ec325f40cde39f1014816e6622;hpb=bfbd64d680a0cbe9867b23088023ae5f9ecc219b;p=libdcp.git diff --git a/src/picture_asset.cc b/src/picture_asset.cc index 2ecfa229..5903b394 100644 --- a/src/picture_asset.cc +++ b/src/picture_asset.cc @@ -54,8 +54,8 @@ using boost::dynamic_pointer_cast; using boost::lexical_cast; using namespace libdcp; -PictureAsset::PictureAsset (string directory, string mxf_name, boost::signals2::signal* progress, int fps, int intrinsic_duration, bool encrypted, Size size) - : MXFAsset (directory, mxf_name, progress, fps, intrinsic_duration, encrypted) +PictureAsset::PictureAsset (string directory, string mxf_name, boost::signals2::signal* progress, int fps, int intrinsic_duration, Size size) + : MXFAsset (directory, mxf_name, progress, fps, intrinsic_duration) , _size (size) { @@ -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 +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 (_edit_rate) + " 1"); - (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast (_size.width) + " " + lexical_cast (_size.height)); + (*i)->add_child ("FrameRate")->add_child_text (lexical_cast (_edit_rate * edit_rate_factor ()) + " 1"); + if (interop) { + (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast (float (_size.width) / _size.height)); + } else { + (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast (_size.width) + " " + lexical_cast (_size.height)); + } } bool @@ -161,13 +195,13 @@ MonoPictureAsset::MonoPictureAsset ( boost::signals2::signal* progress, int fps, int intrinsic_duration, - bool encrypted, Size size, + bool interop, MXFMetadata const & metadata ) - : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, encrypted, size) + : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, size) { - construct (get_path, metadata); + construct (get_path, interop, metadata); } MonoPictureAsset::MonoPictureAsset ( @@ -177,17 +211,17 @@ MonoPictureAsset::MonoPictureAsset ( boost::signals2::signal* progress, int fps, int intrinsic_duration, - bool encrypted, Size size, + bool interop, MXFMetadata const & metadata ) - : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, encrypted, size) + : PictureAsset (directory, mxf_name, progress, fps, intrinsic_duration, 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) - : PictureAsset (directory, mxf_name, 0, fps, 0, false, size) + : PictureAsset (directory, mxf_name, 0, fps, 0, size) { } @@ -213,7 +247,7 @@ MonoPictureAsset::MonoPictureAsset (string directory, string mxf_name) } void -MonoPictureAsset::construct (boost::function get_path, MXFMetadata const & metadata) +MonoPictureAsset::construct (boost::function get_path, bool interop, MXFMetadata const & metadata) { ASDCP::JP2K::CodestreamParser j2k_parser; ASDCP::JP2K::FrameBuffer frame_buffer (4 * Kumu::Megabyte); @@ -226,7 +260,7 @@ MonoPictureAsset::construct (boost::function 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))) { @@ -401,7 +435,7 @@ PictureAsset::frame_buffer_equals ( StereoPictureAsset::StereoPictureAsset (string directory, string mxf_name, int fps, int intrinsic_duration) - : PictureAsset (directory, mxf_name, 0, fps, intrinsic_duration, false, Size (0, 0)) + : PictureAsset (directory, mxf_name, 0, fps, intrinsic_duration, Size (0, 0)) { ASDCP::JP2K::MXFSReader reader; if (ASDCP_FAILURE (reader.OpenRead (path().string().c_str()))) { @@ -423,11 +457,11 @@ StereoPictureAsset::get_frame (int n) const return shared_ptr (new StereoPictureFrame (path().string(), n)); } -shared_ptr -MonoPictureAsset::start_write (bool overwrite, MXFMetadata const & metadata) +shared_ptr +MonoPictureAsset::start_write (bool overwrite, bool interop, MXFMetadata const & metadata) { /* XXX: can't we use shared_ptr here? */ - return shared_ptr (new MonoPictureAssetWriter (this, overwrite, metadata)); + return shared_ptr (new MonoPictureAssetWriter (this, overwrite, interop, metadata)); } string @@ -437,7 +471,15 @@ PictureAsset::key_type () const } StereoPictureAsset::StereoPictureAsset (string directory, string mxf_name, int fps, Size size) - : PictureAsset (directory, mxf_name, 0, fps, 0, false, size) + : PictureAsset (directory, mxf_name, 0, fps, 0, size) { } + +shared_ptr +StereoPictureAsset::start_write (bool overwrite, bool interop, MXFMetadata const & metadata) +{ + /* XXX: can't we use shared_ptr here? */ + return shared_ptr (new StereoPictureAssetWriter (this, overwrite, interop, metadata)); +} +