picture->set_entry_point (p->entry_point);
picture->set_duration (p->duration);
+ picture->set_key_id (p->key_id);
} catch (MXFFileError) {
if (require_mxfs) {
throw;
picture->set_entry_point (p->entry_point);
picture->set_duration (p->duration);
+ picture->set_key_id (p->key_id);
} catch (MXFFileError) {
if (require_mxfs) {
sound->set_entry_point ((*i)->asset_list->main_sound->entry_point);
sound->set_duration ((*i)->asset_list->main_sound->duration);
+ sound->set_key_id ((*i)->asset_list->main_sound->key_id);
} catch (MXFFileError) {
if (require_mxfs) {
throw;
return doc;
}
+
+/** @return true if we have any encrypted content */
+bool
+CPL::encrypted () const
+{
+ for (list<shared_ptr<const Reel> >::const_iterator i = _reels.begin(); i != _reels.end(); ++i) {
+ if ((*i)->encrypted ()) {
+ return true;
+ }
+ }
+
+ return false;
+}
}
std::list<boost::shared_ptr<const Asset> > assets () const;
+
+ bool encrypted () const;
bool equals (CPL const & other, EqualityOptions options, boost::function<void (NoteType, std::string)> note) const;
a.unique ();
return a;
}
+
+bool
+DCP::encrypted () const
+{
+ for (list<shared_ptr<const CPL> >::const_iterator i = _cpls.begin(); i != _cpls.end(); ++i) {
+ if ((*i)->encrypted ()) {
+ return true;
+ }
+ }
+
+ return false;
+}
return _cpls;
}
+ bool encrypted () const;
+
/** Emitted with a parameter between 0 and 1 to indicate progress
* for long jobs.
*/
#include <iostream>
#include <fstream>
#include <boost/filesystem.hpp>
+#include <boost/lexical_cast.hpp>
#include <libxml++/nodes/element.h>
#include "AS_DCP.h"
#include "KM_prng.h"
using std::string;
using std::list;
using boost::shared_ptr;
+using boost::lexical_cast;
using boost::dynamic_pointer_cast;
using namespace libdcp;
typed_key_id->add_child("KeyType")->add_child_text(key_type ());
typed_key_id->add_child("KeyId")->add_child_text("urn:uuid:" + _key_id);
}
+
+void
+MXFAsset::write_to_cpl (xmlpp::Node* node) const
+{
+ xmlpp::Node* a = node->add_child (cpl_node_name ());
+ a->add_child ("Id")->add_child_text ("urn:uuid:" + _uuid);
+ a->add_child ("AnnotationText")->add_child_text (_file_name);
+ a->add_child ("EditRate")->add_child_text (lexical_cast<string> (_edit_rate) + " 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 (_encrypted) {
+ a->add_child("KeyId")->add_child_text ("urn:uuid:" + _key_id);
+ }
+}
virtual bool equals (boost::shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, std::string)> note) const;
+ virtual void write_to_cpl (xmlpp::Node *) const;
+
/** Fill in a ADSCP::WriteInfo struct.
* @param w struct to fill in.
* @param uuid uuid to use.
void fill_writer_info (ASDCP::WriterInfo* w, std::string uuid, MXFMetadata const & metadata);
void add_typed_key_id (xmlpp::Element *) const;
+
+ void set_key_id (std::string k) {
+ _key_id = k;
+ }
+
+ bool encrypted () const {
+ return !_key_id.empty ();
+ }
protected:
virtual std::string key_type () const = 0;
+ virtual std::string cpl_node_name () const = 0;
/** Signal to emit to report progress, or 0 */
boost::signals2::signal<void (float)>* _progress;
}
+ key_id = node->optional_string_child ("KeyId").get_value_or ("");
+
node->ignore_child ("Hash");
node->done ();
intrinsic_duration = node->number_child<int64_t> ("IntrinsicDuration");
entry_point = node->number_child<int64_t> ("EntryPoint");
duration = node->number_child<int64_t> ("Duration");
-
+ key_id = node->optional_string_child ("KeyId").get_value_or ("");
+
node->ignore_child ("Hash");
node->ignore_child ("Language");
int64_t duration;
Fraction frame_rate;
Fraction screen_aspect_ratio;
+ std::string key_id;
};
int64_t intrinsic_duration;
int64_t entry_point;
int64_t duration;
+ std::string key_id;
};
/** @brief A simple parser for and representation of a CPL \<MainSubtitle\> node */
}
+string
+PictureAsset::cpl_node_name () const
+{
+ return "MainPicture";
+}
+
void
PictureAsset::write_to_cpl (xmlpp::Node* node) const
{
- xmlpp::Node* mp = node->add_child ("MainPicture");
- mp->add_child ("Id")->add_child_text ("urn:uuid:" + _uuid);
- mp->add_child ("AnnotationText")->add_child_text (_file_name);
- mp->add_child ("EditRate")->add_child_text (lexical_cast<string> (_edit_rate) + " 1");
- mp->add_child ("IntrinsicDuration")->add_child_text (lexical_cast<string> (_intrinsic_duration));
- mp->add_child ("EntryPoint")->add_child_text (lexical_cast<string> (_entry_point));
- mp->add_child ("Duration")->add_child_text (lexical_cast<string> (_duration));
- if (_encrypted) {
- mp->add_child("KeyId")->add_child_text("urn:uuid:" + _key_id);
- }
- mp->add_child ("FrameRate")->add_child_text (lexical_cast<string> (_edit_rate) + " 1");
- mp->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast<string> (_size.width) + " " + lexical_cast<string> (_size.height));
+ MXFAsset::write_to_cpl (node);
+
+ 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> (_edit_rate) + " 1");
+ (*i)->add_child ("ScreenAspectRatio")->add_child_text (lexical_cast<string> (_size.width) + " " + lexical_cast<string> (_size.height));
}
bool
*/
PictureAsset (std::string directory, std::string mxf_name, boost::signals2::signal<void (float)>* progress, int fps, int intrinsic_duration, bool encrypted, Size);
- /** Write details of this asset to a CPL XML node.
- * @param node Node.
- */
- void write_to_cpl (xmlpp::Node* node) const;
-
bool equals (boost::shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, std::string)> note) const;
Size size () const {
return _size;
}
+ void write_to_cpl (xmlpp::Node *) const;
+
protected:
- std::string key_type () const;
-
bool frame_buffer_equals (
int frame, EqualityOptions opt, boost::function<void (NoteType, std::string)> note,
uint8_t const * data_A, unsigned int size_A, uint8_t const * data_B, unsigned int size_B
/** picture size in pixels */
Size _size;
+
+private:
+ std::string key_type () const;
+ std::string cpl_node_name () const;
};
class MonoPictureAsset;
return true;
}
+bool
+Reel::encrypted () const
+{
+ return ((_main_picture && _main_picture->encrypted ()) || (_main_sound && _main_sound->encrypted ()));
+}
+
void write_to_cpl (xmlpp::Node *) const;
+ bool encrypted () const;
+
bool equals (boost::shared_ptr<const Reel> other, EqualityOptions opt, boost::function<void (NoteType, std::string)> notes) const;
private:
}
}
-void
-SoundAsset::write_to_cpl (xmlpp::Node* node) const
+string
+SoundAsset::cpl_node_name () const
{
- xmlpp::Node* ms = node->add_child ("MainSound");
- ms->add_child ("Id")->add_child_text ("urn:uuid:" + _uuid);
- ms->add_child ("AnnotationText")->add_child_text (_file_name);
- ms->add_child ("EditRate")->add_child_text (lexical_cast<string> (_edit_rate) + " 1");
- ms->add_child ("IntrinsicDuration")->add_child_text (lexical_cast<string> (_intrinsic_duration));
- ms->add_child ("EntryPoint")->add_child_text (lexical_cast<string> (_entry_point));
- ms->add_child ("Duration")->add_child_text (lexical_cast<string> (_duration));
- if (_encrypted) {
- ms->add_child("KeyId")->add_child_text("urn:uuid:" + _key_id);
- }
+ return "MainSound";
}
bool
boost::shared_ptr<SoundAssetWriter> start_write (MXFMetadata const & metadata = MXFMetadata ());
- /** Write details of this asset to a CPL XML node.
- * @param node Node.
- */
- void write_to_cpl (xmlpp::Node* node) const;
bool equals (boost::shared_ptr<const Asset> other, EqualityOptions opt, boost::function<void (NoteType, std::string)> note) const;
std::string key_type () const;
void construct (boost::function<std::string (Channel)> get_path, MXFMetadata const &);
std::string path_from_channel (Channel channel, std::vector<std::string> const & files);
+ std::string cpl_node_name () const;
/** Number of channels in the asset */
int _channels;
return "test/data/1s_24-bit_48k_silence.wav";
}
+static string test_corpus = "../libdcp-test";
+
+#include "decryption_test.cc"
#include "dcp_test.cc"
#include "error_test.cc"
#include "read_dcp_test.cc"
#include "color_test.cc"
#include "recovery_test.cc"
-BOOST_AUTO_TEST_CASE (crypt_chain)
-{
- boost::filesystem::remove_all ("build/test/crypt");
- boost::filesystem::create_directory ("build/test/crypt");
- libdcp::make_crypt_chain ("build/test/crypt");
-}
+//BOOST_AUTO_TEST_CASE (crypt_chain)
+//{
+// boost::filesystem::remove_all ("build/test/crypt");
+// boost::filesystem::create_directory ("build/test/crypt");
+// libdcp::make_crypt_chain ("build/test/crypt");
+//}
-#include "encryption_test.cc"
-#include "certificates_test.cc"
+//#include "encryption_test.cc"
+//#include "certificates_test.cc"