Then choose which standard DCP should use based on the CPL(s).
reel->add(std::make_shared<dcp::ReelSoundAsset>(sound_asset, 0));
/* Make a CPL with this reel */
- auto cpl = std::make_shared<dcp::CPL>("My film", dcp::ContentKind::FEATURE);
+ auto cpl = std::make_shared<dcp::CPL>("My film", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl->add(reel);
/* Write the DCP */
dcp::DCP dcp ("DCP");
dcp.add (cpl);
- dcp.write_xml (dcp::Standard::SMPTE);
+ dcp.write_xml ();
return 0;
}
}
}
- output_dcp.write_xml (*standard, issuer, creator, issue_date, annotation_text, signer);
+ output_dcp.write_xml (issuer, creator, issue_date, annotation_text, signer);
}
static string const smpte_335_ns = "http://www.smpte-ra.org/reg/335/2012";
-CPL::CPL (string annotation_text, ContentKind content_kind)
+CPL::CPL (string annotation_text, ContentKind content_kind, Standard standard)
/* default _content_title_text to annotation_text */
: _issuer ("libdcp" LIBDCP_VERSION)
, _creator ("libdcp" LIBDCP_VERSION)
, _annotation_text (annotation_text)
, _content_title_text (annotation_text)
, _content_kind (content_kind)
+ , _standard (standard)
{
ContentVersion cv;
cv.label_text = cv.id + LocalTime().as_string();
}
for (auto i: f.node_child("ReelList")->node_children("Reel")) {
- _reels.push_back (make_shared<Reel>(i, *_standard));
+ _reels.push_back (make_shared<Reel>(i, _standard));
}
auto reel_list = f.node_child ("ReelList");
void
-CPL::write_xml (boost::filesystem::path file, Standard standard, shared_ptr<const CertificateChain> signer) const
+CPL::write_xml (boost::filesystem::path file, shared_ptr<const CertificateChain> signer) const
{
xmlpp::Document doc;
xmlpp::Element* root;
- if (standard == Standard::INTEROP) {
+ if (_standard == Standard::INTEROP) {
root = doc.create_root_node ("CompositionPlaylist", cpl_interop_ns);
} else {
root = doc.create_root_node ("CompositionPlaylist", cpl_smpte_ns);
bool first = true;
for (auto i: _reels) {
- auto asset_list = i->write_to_cpl (reel_list, standard);
- if (first && standard == Standard::SMPTE) {
+ auto asset_list = i->write_to_cpl (reel_list, _standard);
+ if (first && _standard == Standard::SMPTE) {
maybe_write_composition_metadata_asset (asset_list);
first = false;
}
indent (root, 0);
if (signer) {
- signer->sign (root, standard);
+ signer->sign (root, _standard);
}
doc.write_to_file_formatted (file.string(), "UTF-8");
class CPL : public Asset
{
public:
- CPL (std::string annotation_text, ContentKind content_kind);
+ CPL (std::string annotation_text, ContentKind content_kind, Standard standard);
/** Construct a CPL object from a XML file */
explicit CPL (boost::filesystem::path file);
/** Write an CompositonPlaylist XML file
*
* @param file Filename to write
- * @param standard INTEROP or SMPTE
* @param signer Signer to sign the CPL, or 0 to add no signature
*/
void write_xml (
boost::filesystem::path file,
- Standard standard,
std::shared_ptr<const CertificateChain>
) const;
void set_additional_subtitle_languages (std::vector<dcp::LanguageTag> const& lang);
- boost::optional<Standard> standard () const {
+ Standard standard () const {
return _standard;
}
std::vector<std::shared_ptr<Reel>> _reels;
/** Standard of CPL that was read in */
- boost::optional<Standard> _standard;
+ Standard _standard;
};
#include <libxml++/libxml++.h>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
+#include <numeric>
using std::string;
if (root == "CompositionPlaylist") {
auto cpl = make_shared<CPL>(path);
- if (_standard && cpl->standard() && cpl->standard().get() != _standard.get() && notes) {
+ if (_standard && cpl->standard() != _standard.get() && notes) {
notes->push_back ({VerificationNote::Type::ERROR, VerificationNote::Code::MISMATCHED_STANDARD});
}
_cpls.push_back (cpl);
void
DCP::write_xml (
- Standard standard,
string issuer,
string creator,
string issue_date,
NameFormat name_format
)
{
+ if (_cpls.empty()) {
+ throw MiscError ("Cannot write DCP with no CPLs.");
+ }
+
+ auto standard = std::accumulate (
+ std::next(_cpls.begin()), _cpls.end(), _cpls[0]->standard(),
+ [](Standard s, shared_ptr<CPL> c) {
+ if (s != c->standard()) {
+ throw MiscError ("Cannot make DCP with mixed Interop and SMPTE CPLs.");
+ }
+ return s;
+ }
+ );
+
for (auto i: cpls()) {
NameFormat::Map values;
values['t'] = "cpl";
- i->write_xml (_directory / (name_format.get(values, "_" + i->id() + ".xml")), standard, signer);
+ i->write_xml (_directory / (name_format.get(values, "_" + i->id() + ".xml")), signer);
}
shared_ptr<PKL> pkl;
* @param name_format Name format to use for the CPL and PKL filenames
*/
void write_xml (
- Standard standard,
std::string issuer = String::compose("libdcp %1", dcp::version),
std::string creator = String::compose("libdcp %1", dcp::version),
std::string issue_date = LocalTime().as_string(),
boost::filesystem::path const out = "build/test/combine_two_dcps_with_same_asset_filenames_test";
shared_ptr<dcp::DCP> second = make_simple ("build/test/combine_input2");
- second->write_xml (dcp::Standard::SMPTE);
+ second->write_xml ();
remove_all (out);
vector<path> inputs;
boost::filesystem::path const out = "build/test/combine_two_dcps_with_interop_subs_test";
auto first = make_simple_with_interop_subs ("build/test/combine_input1");
- first->write_xml (dcp::Standard::INTEROP);
+ first->write_xml ();
auto second = make_simple_with_interop_subs ("build/test/combine_input2");
- second->write_xml (dcp::Standard::INTEROP);
remove_all (out);
vector<path> inputs;
boost::filesystem::path const out = "build/test/combine_two_dcps_with_smpte_subs_test";
shared_ptr<dcp::DCP> first = make_simple_with_smpte_subs ("build/test/combine_input1");
- first->write_xml (dcp::Standard::SMPTE);
+ first->write_xml ();
shared_ptr<dcp::DCP> second = make_simple_with_smpte_subs ("build/test/combine_input2");
- second->write_xml (dcp::Standard::SMPTE);
+ second->write_xml ();
remove_all (out);
vector<path> inputs;
boost::filesystem::path const out = "build/test/combine_two_dcps_with_interop_ccaps_test";
shared_ptr<dcp::DCP> first = make_simple_with_interop_ccaps ("build/test/combine_input1");
- first->write_xml (dcp::Standard::INTEROP);
+ first->write_xml ();
shared_ptr<dcp::DCP> second = make_simple_with_interop_ccaps ("build/test/combine_input2");
- second->write_xml (dcp::Standard::INTEROP);
+ second->write_xml ();
remove_all (out);
vector<path> inputs;
boost::filesystem::path const out = "build/test/combine_two_dcps_with_interop_ccaps_test";
shared_ptr<dcp::DCP> first = make_simple_with_smpte_ccaps ("build/test/combine_input1");
- first->write_xml (dcp::Standard::SMPTE);
+ first->write_xml ();
shared_ptr<dcp::DCP> second = make_simple_with_smpte_ccaps ("build/test/combine_input2");
- second->write_xml (dcp::Standard::SMPTE);
+ second->write_xml ();
remove_all (out);
vector<path> inputs;
boost::filesystem::path const out = "build/test/combine_two_multi_reel_dcps";
shared_ptr<dcp::DCP> first = make_simple ("build/test/combine_input1", 4);
- first->write_xml (dcp::Standard::SMPTE);
+ first->write_xml ();
shared_ptr<dcp::DCP> second = make_simple ("build/test/combine_input2", 4);
- second->write_xml (dcp::Standard::SMPTE);
+ second->write_xml ();
remove_all (out);
vector<path> inputs;
boost::filesystem::path const out = "build/test/combine_two_dcps_with_shared_asset";
shared_ptr<dcp::DCP> first = make_simple ("build/test/combine_input1", 1);
- first->write_xml (dcp::Standard::SMPTE);
+ first->write_xml ();
remove_all ("build/test/combine_input2");
shared_ptr<dcp::DCP> second(new dcp::DCP("build/test/combine_input2"));
mxf_meta.company_name = "OpenDCP";
mxf_meta.product_version = "0.0.25";
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->set_content_version (
dcp::ContentVersion("urn:uuid:75ac29aa-42ac-1234-ecae-49251abefd11","content-version-label-text")
);
reel->add (simple_markers());
cpl->add (reel);
second->add (cpl);
- second->write_xml (dcp::Standard::SMPTE);
+ second->write_xml ();
remove_all (out);
vector<path> inputs;
boost::filesystem::path const out = "build/test/combine_two_dcps_with_duplicated_asset";
auto first = make_simple ("build/test/combine_input1", 1);
- first->write_xml (dcp::Standard::SMPTE);
+ first->write_xml ();
remove_all ("build/test/combine_input2");
auto second = make_shared<dcp::DCP>("build/test/combine_input2");
mxf_meta.company_name = "OpenDCP";
mxf_meta.product_version = "0.0.25";
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->set_content_version (
dcp::ContentVersion("urn:uuid:75ac29aa-42ac-1234-ecae-49251abefd11","content-version-label-text")
);
reel->add (simple_markers());
cpl->add (reel);
second->add (cpl);
- second->write_xml (dcp::Standard::SMPTE);
+ second->write_xml ();
remove_all (out);
vector<path> inputs;
BOOST_AUTO_TEST_CASE (cpl_metadata_bad_values_test)
{
- dcp::CPL cpl("", dcp::ContentKind::FEATURE);
+ dcp::CPL cpl("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
BOOST_CHECK_THROW (cpl.set_version_number(-1), dcp::BadSettingError);
vector<dcp::ContentVersion> cv;
{
RNGFixer fix;
- dcp::CPL cpl("", dcp::ContentKind::FEATURE);
+ dcp::CPL cpl("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl.set_issue_date ("2020-08-28T13:35:06+02:00");
vector<dcp::ContentVersion> cv;
lt.push_back(dcp::LanguageTag("fr-ZA"));
cpl.set_additional_subtitle_languages (lt);
- cpl.write_xml ("build/test/cpl_metadata_write_test1.xml", dcp::Standard::SMPTE, shared_ptr<dcp::CertificateChain>());
+ cpl.write_xml ("build/test/cpl_metadata_write_test1.xml", shared_ptr<dcp::CertificateChain>());
check_xml (
dcp::file_to_string("test/ref/cpl_metadata_test1.xml"),
dcp::file_to_string("build/test/cpl_metadata_write_test1.xml"),
BOOST_AUTO_TEST_CASE (cpl_metadata_roundtrip_test_1)
{
dcp::CPL cpl ("test/ref/cpl_metadata_test1.xml");
- cpl.write_xml ("build/test/cpl_metadata_roundtrip_test1.xml", dcp::Standard::SMPTE, shared_ptr<dcp::CertificateChain>());
+ cpl.write_xml ("build/test/cpl_metadata_roundtrip_test1.xml", shared_ptr<dcp::CertificateChain>());
vector<string> ignore;
ignore.push_back ("Id");
check_xml (
{
RNGFixer fix;
- dcp::CPL cpl("", dcp::ContentKind::FEATURE);
+ dcp::CPL cpl("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl.set_issue_date ("2020-08-28T13:35:06+02:00");
cpl.set_content_version (dcp::ContentVersion("id", "version"));
cpl.set_issuer ("libdcp1.6.4devel");
reel->add (black_picture_asset("build/test/cpl_metadata_write_test1"));
cpl.add (reel);
- cpl.write_xml ("build/test/cpl_metadata_write_test2.xml", dcp::Standard::SMPTE, shared_ptr<dcp::CertificateChain>());
+ cpl.write_xml ("build/test/cpl_metadata_write_test2.xml", shared_ptr<dcp::CertificateChain>());
check_xml (
dcp::file_to_string("test/ref/cpl_metadata_test2.xml"),
dcp::file_to_string("build/test/cpl_metadata_write_test2.xml"),
BOOST_AUTO_TEST_CASE (cpl_metadata_roundtrip_test_2)
{
dcp::CPL cpl ("test/ref/cpl_metadata_test2.xml");
- cpl.write_xml ("build/test/cpl_metadata_roundtrip_test2.xml", dcp::Standard::SMPTE, shared_ptr<dcp::CertificateChain>());
vector<string> ignore;
ignore.push_back ("Id");
+ cpl.write_xml ("build/test/cpl_metadata_roundtrip_test2.xml", shared_ptr<dcp::CertificateChain>());
check_xml (
dcp::file_to_string("test/ref/cpl_metadata_test2.xml"),
dcp::file_to_string("build/test/cpl_metadata_roundtrip_test2.xml"),
BOOST_AUTO_TEST_CASE (cpl_ratings)
{
- dcp::CPL cpl ("annotation", dcp::ContentKind::FEATURE);
+ dcp::CPL cpl ("annotation", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
vector<dcp::Rating> ratings;
ratings.push_back (dcp::Rating("http://www.mpaa.org/2003-ratings", "PG-13"));
shared_ptr<dcp::Reel> reel(new dcp::Reel());
cpl.add (reel);
- cpl.write_xml ("build/test/cpl_ratings.xml", dcp::Standard::SMPTE, {});
+ cpl.write_xml ("build/test/cpl_ratings.xml", {});
vector<string> ignore;
ignore.push_back ("Id");
auto reel = make_shared<dcp::Reel>();
reel->add (make_shared<dcp::ReelInteropSubtitleAsset>(subs, dcp::Fraction (24, 1), 24, 0));
- auto cpl = make_shared<dcp::CPL>("", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("", dcp::ContentKind::TRAILER, dcp::Standard::INTEROP);
cpl->add (reel);
dcp.add (cpl);
- dcp.write_xml (dcp::Standard::INTEROP);
+ dcp.write_xml ();
dcp::DCP dcp2 (directory);
dcp2.read ();
auto reel = make_shared<dcp::Reel>();
reel->add (make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction (24, 1), 24, 0));
- auto cpl = make_shared<dcp::CPL>("", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
dcp.add (cpl);
- dcp.write_xml (dcp::Standard::SMPTE);
+ dcp.write_xml ();
dcp::DCP dcp2 (directory);
dcp2.read ();
RNGFixer fixer;
make_simple("build/test/DCP/dcp_test1")->write_xml(
- dcp::Standard::SMPTE, "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "A Test DCP"
+ "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "A Test DCP"
);
/* build/test/DCP/dcp_test1 is checked against test/ref/DCP/dcp_test1 by run/tests */
boost::filesystem::remove_all ("build/test/DCP/dcp_test2");
boost::filesystem::create_directories ("build/test/DCP/dcp_test2");
dcp::DCP d ("build/test/DCP/dcp_test2");
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::FEATURE);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl->set_content_version (
dcp::ContentVersion("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00", "81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00")
);
d.add (cpl);
- d.write_xml (dcp::Standard::SMPTE, "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp");
+ d.write_xml ("OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp");
/* build/test/DCP/dcp_test2 is checked against test/ref/DCP/dcp_test2 by run/tests */
}
reel->add(make_shared<dcp::ReelSoundAsset>(sound, 0));
reel->add(simple_markers());
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
B.add (cpl);
- B.write_xml (dcp::Standard::SMPTE);
+ B.write_xml ();
dcp::EqualityOptions eq;
eq.reel_hashes_can_differ = true;
boost::filesystem::remove_all ("build/test/DCP/dcp_test5");
boost::filesystem::create_directories ("build/test/DCP/dcp_test5");
dcp::DCP d ("build/test/DCP/dcp_test5");
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::FEATURE);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl->set_content_version (
dcp::ContentVersion("urn:uri:81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00", "81fb54df-e1bf-4647-8788-ea7ba154375b_2012-07-17T04:45:18+00:00")
);
d.add (cpl);
- d.write_xml (dcp::Standard::SMPTE, "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp");
+ d.write_xml ("OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp");
/* build/test/DCP/dcp_test5 is checked against test/ref/DCP/dcp_test5 by run/tests */
}
{
RNGFixer fix;
- make_simple("build/test/DCP/dcp_test7")->write_xml(
- dcp::Standard::INTEROP, "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp"
+ make_simple("build/test/DCP/dcp_test7", 1, 24, dcp::Standard::INTEROP)->write_xml(
+ "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp"
);
/* build/test/DCP/dcp_test7 is checked against test/ref/DCP/dcp_test7 by run/tests */
dcp::DCP dcp ("test/data/extra_assetmap");
BOOST_CHECK_NO_THROW (dcp.read());
}
+
+
+/** Test that writing the XML for a DCP with no CPLs throws */
+BOOST_AUTO_TEST_CASE (dcp_with_no_cpls)
+{
+ dcp::DCP dcp ("build/test/dcp_with_no_cpls");
+ BOOST_REQUIRE_THROW (dcp.write_xml(), dcp::MiscError);
+}
+
+
+/** Test that writing the XML for a DCP with Interop CPLs makes a SMPTE assetmap */
+BOOST_AUTO_TEST_CASE (dcp_with_interop_cpls)
+{
+ boost::filesystem::path path = "build/test/dcp_with_interop_cpls";
+ boost::filesystem::remove_all (path);
+ dcp::DCP dcp (path);
+ auto cpl1 = make_shared<dcp::CPL>("", dcp::ContentKind::FEATURE, dcp::Standard::INTEROP);
+ cpl1->add(make_shared<dcp::Reel>());
+ dcp.add(cpl1);
+ auto cpl2 = make_shared<dcp::CPL>("", dcp::ContentKind::FEATURE, dcp::Standard::INTEROP);
+ cpl2->add(make_shared<dcp::Reel>());
+ dcp.add(cpl2);
+ dcp.write_xml ();
+ BOOST_REQUIRE (boost::filesystem::exists(path / "ASSETMAP"));
+ BOOST_REQUIRE (!boost::filesystem::exists(path / "ASSETMAP.xml"));
+}
+
+
+/** Test that writing the XML for a DCP with SMPTE CPLs makes a SMPTE assetmap */
+BOOST_AUTO_TEST_CASE (dcp_with_smpte_cpls)
+{
+ boost::filesystem::path path = "build/test/dcp_with_smpte_cpls";
+ boost::filesystem::remove_all (path);
+ dcp::DCP dcp (path);
+ auto cpl1 = make_shared<dcp::CPL>("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
+ cpl1->add(make_shared<dcp::Reel>());
+ dcp.add(cpl1);
+ auto cpl2 = make_shared<dcp::CPL>("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
+ cpl2->add(make_shared<dcp::Reel>());
+ dcp.add(cpl2);
+ dcp.write_xml ();
+ BOOST_REQUIRE (!boost::filesystem::exists(path / "ASSETMAP"));
+ BOOST_REQUIRE (boost::filesystem::exists(path / "ASSETMAP.xml"));
+}
+
+
+/** Test that writing the XML for a DCP with mixed-standard CPLs throws */
+BOOST_AUTO_TEST_CASE (dcp_with_mixed_cpls)
+{
+ dcp::DCP dcp ("build/test/dcp_with_mixed_cpls");
+ dcp.add(make_shared<dcp::CPL>("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE));
+ dcp.add(make_shared<dcp::CPL>("", dcp::ContentKind::FEATURE, dcp::Standard::INTEROP));
+ dcp.add(make_shared<dcp::CPL>("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE));
+ BOOST_REQUIRE_THROW (dcp.write_xml(), dcp::MiscError);
+}
signer->add (dcp::Certificate (dcp::file_to_string ("test/ref/crypt/leaf.signed.pem")));
signer->set_key (dcp::file_to_string ("test/ref/crypt/leaf.key"));
- shared_ptr<dcp::CPL> cpl (new dcp::CPL ("A Test DCP", dcp::ContentKind::FEATURE));
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
dcp::Key key;
d.add (cpl);
- d.write_xml (dcp::Standard::SMPTE, "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp", signer);
+ d.write_xml ("OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "Created by libdcp", signer);
dcp::DecryptedKDM kdm (
cpl,
writer->write (frame.data(), frame.size());
auto reel = make_shared<dcp::Reel>();
reel->add(make_shared<dcp::ReelMonoPictureAsset>(asset, 0));
- auto cpl = make_shared<dcp::CPL>("test", dcp::ContentKind::FEATURE);
+ auto cpl = make_shared<dcp::CPL>("test", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl->add(reel);
/* This certificate_chain is valid from 26/12/2012 to 24/12/2022 */
BOOST_AUTO_TEST_CASE (markers_write_test)
{
- dcp::CPL cpl("Markers test", dcp::ContentKind::TEST);
+ dcp::CPL cpl("Markers test", dcp::ContentKind::TEST, dcp::Standard::SMPTE);
auto asset = make_shared<dcp::ReelMarkersAsset>(dcp::Fraction(24, 1), 432000, 0);
asset->set (dcp::Marker::FFOC, dcp::Time(1, 1, 9, 16, 24));
cpl.add (reel);
- cpl.write_xml ("build/test/markers_test.xml", dcp::Standard::SMPTE, {});
+ cpl.write_xml ("build/test/markers_test.xml", {});
}
static void
reel->add (black_picture_asset(dcp::String::compose("build/test/parse_mca_descriptors_from_mxf_test%1", i), 24));
reel->add (reel_sound_asset);
- dcp::CPL cpl("", dcp::ContentKind::FEATURE);
+ dcp::CPL cpl("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl.add (reel);
cpl.set_main_sound_configuration("51/L,R,C,LFE,Ls,Rs");
cpl.set_main_sound_sample_rate(48000);
cpl.set_main_picture_stored_area(dcp::Size(1998, 1080));
cpl.set_main_picture_active_area(dcp::Size(1998, 1080));
- cpl.write_xml (dcp::String::compose("build/test/parse_mca_descriptors_from_mxf_test%1/cpl.xml", i), dcp::Standard::SMPTE, shared_ptr<dcp::CertificateChain>());
+ cpl.write_xml (dcp::String::compose("build/test/parse_mca_descriptors_from_mxf_test%1/cpl.xml", i), shared_ptr<dcp::CertificateChain>());
cxml::Document ref("CompositionPlaylist", private_test / dcp::String::compose("51_sound_with_mca_%1.cpl", i));
cxml::Document check("CompositionPlaylist", dcp::String::compose("build/test/parse_mca_descriptors_from_mxf_test%1/cpl.xml", i));
reel->add (black_picture_asset("build/test/write_mca_descriptors_to_mxf_test", 24));
reel->add (reel_sound_asset);
- dcp::CPL cpl("", dcp::ContentKind::FEATURE);
+ dcp::CPL cpl("", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl.add (reel);
cpl.set_main_sound_configuration("51/L,R,C,LFE,Ls,Rs");
cpl.set_main_sound_sample_rate(48000);
cpl.set_main_picture_stored_area(dcp::Size(1998, 1080));
cpl.set_main_picture_active_area(dcp::Size(1998, 1080));
- cpl.write_xml ("build/test/write_mca_descriptors_to_mxf_test/cpl.xml", dcp::Standard::SMPTE, shared_ptr<dcp::CertificateChain>());
+ cpl.write_xml ("build/test/write_mca_descriptors_to_mxf_test/cpl.xml", shared_ptr<dcp::CertificateChain>());
cxml::Document ref("CompositionPlaylist", private_test / "51_sound_with_mca_1.cpl");
cxml::Document check("CompositionPlaylist", "build/test/write_mca_descriptors_to_mxf_test/cpl.xml");
asset_A->set_key (key);
- shared_ptr<dcp::CPL> cpl (new dcp::CPL ("A Test DCP", dcp::ContentKind::FEATURE));
shared_ptr<dcp::Reel> reel (new dcp::Reel ());
reel->add (shared_ptr<dcp::ReelMonoPictureAsset> (new dcp::ReelMonoPictureAsset (asset_A, 0)));
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::FEATURE, dcp::Standard::SMPTE);
cpl->add (reel);
dcp::LocalTime start;
shared_ptr<dcp::DCP>
-make_simple (boost::filesystem::path path, int reels, int frames)
+make_simple (boost::filesystem::path path, int reels, int frames, dcp::Standard standard)
{
/* Some known metadata */
dcp::MXFMetadata mxf_meta;
boost::filesystem::remove_all (path);
boost::filesystem::create_directories (path);
auto d = make_shared<dcp::DCP>(path);
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, standard);
cpl->set_annotation_text ("A Test DCP");
cpl->set_issuer ("OpenDCP 0.0.25");
cpl->set_creator ("OpenDCP 0.0.25");
shared_ptr<dcp::DCP>
make_simple_with_interop_subs (boost::filesystem::path path)
{
- shared_ptr<dcp::DCP> dcp = make_simple (path);
+ auto dcp = make_simple (path, 1, 24, dcp::Standard::INTEROP);
shared_ptr<dcp::InteropSubtitleAsset> subs(new dcp::InteropSubtitleAsset());
subs->add (simple_subtitle());
shared_ptr<dcp::DCP>
make_simple_with_interop_ccaps (boost::filesystem::path path)
{
- shared_ptr<dcp::DCP> dcp = make_simple (path);
+ auto dcp = make_simple (path, 1, 24, dcp::Standard::INTEROP);
shared_ptr<dcp::InteropSubtitleAsset> subs(new dcp::InteropSubtitleAsset());
subs->add (simple_subtitle());
extern std::shared_ptr<dcp::SoundAsset> simple_sound (boost::filesystem::path path, std::string suffix, dcp::MXFMetadata mxf_meta, std::string language, int frames = 24, int sample_rate = 48000);
extern std::shared_ptr<dcp::Subtitle> simple_subtitle ();
extern std::shared_ptr<dcp::ReelMarkersAsset> simple_markers (int frames = 24);
-extern std::shared_ptr<dcp::DCP> make_simple (boost::filesystem::path path, int reels = 1, int frames = 24);
+extern std::shared_ptr<dcp::DCP> make_simple (boost::filesystem::path path, int reels = 1, int frames = 24, dcp::Standard = dcp::Standard::SMPTE);
extern std::shared_ptr<dcp::DCP> make_simple_with_interop_subs (boost::filesystem::path path);
extern std::shared_ptr<dcp::DCP> make_simple_with_smpte_subs (boost::filesystem::path path);
extern std::shared_ptr<dcp::DCP> make_simple_with_interop_ccaps (boost::filesystem::path path);
reel->add (reel_asset);
reel->add (simple_markers());
- auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, standard);
cpl->add (reel);
auto dcp = make_shared<dcp::DCP>(dir);
dcp->add (cpl);
dcp->write_xml (
- standard,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
reel->add (make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "", 16 * 24), 0));
reel->add (simple_markers(16 * 24));
- auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-");
cpl->set_main_sound_sample_rate (48000);
dcp::DCP dcp (dir);
dcp.add (cpl);
dcp.write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
auto reel = make_shared<dcp::Reel>();
reel->add (black_picture_asset(dir));
- auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-");
cpl->set_main_sound_sample_rate (48000);
dcp::DCP dcp (dir);
dcp.add (cpl);
dcp.write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
auto reel = make_shared<dcp::Reel>();
reel->add (black_picture_asset(dir));
- auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-");
cpl->set_main_sound_sample_rate (48000);
dcp::DCP dcp (dir);
dcp.add (cpl);
dcp.write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
reel->add (reel_sound);
reel->add (simple_markers());
- auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
cpl->_additional_subtitle_languages.push_back("this-is-wrong");
cpl->_additional_subtitle_languages.push_back("andso-is-this");
auto dcp = make_shared<dcp::DCP>(dir);
dcp->add (cpl);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
picture_writer->finalize ();
auto d = make_shared<dcp::DCP>(dcp_path);
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->set_annotation_text ("A Test DCP");
cpl->set_issue_date ("2012-07-17T04:45:18+00:00");
cpl->set_main_sound_configuration ("L,C,R,Lfe,-,-");
d->add (cpl);
d->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
dcp->cpls().front()->reels().front()->add(reel_subs);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
}
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
}
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
dcp->cpls().front()->reels().front()->add(reel_subs);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
dcp->cpls().front()->reels().front()->add(reel_subs);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
markers2->set (dcp::Marker::LFOC, dcp::Time(4 * 24 - 1, 24, 24));
reel2->add (markers2);
- auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel1);
cpl->add (reel2);
auto dcp = make_shared<dcp::DCP>(dir);
dcp->add (cpl);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
auto reel_sound = make_shared<dcp::ReelSoundAsset>(sound, 0);
reel->add (reel_sound);
reel->add (simple_markers());
- auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
auto dcp = make_shared<dcp::DCP>(dir);
dcp->add (cpl);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path const dir("build/test/verify_missing_cpl_annotation_text");
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path const dir("build/test/verify_mismatched_cpl_annotation_text");
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path const dir("build/test/verify_mismatched_asset_duration");
prepare_directory (dir);
shared_ptr<dcp::DCP> dcp (new dcp::DCP(dir));
- shared_ptr<dcp::CPL> cpl (new dcp::CPL("A Test DCP", dcp::ContentKind::TRAILER));
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
shared_ptr<dcp::MonoPictureAsset> mp = simple_picture (dir, "", 24);
shared_ptr<dcp::SoundAsset> ms = simple_sound (dir, "", dcp::MXFMetadata(), "en-US", 25);
dcp->add (cpl);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
{
prepare_directory (dir);
auto dcp = make_shared<dcp::DCP>(dir);
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
auto constexpr reel_length = 192;
dcp->add (cpl);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
{
prepare_directory (dir);
auto dcp = make_shared<dcp::DCP>(dir);
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
auto constexpr reel_length = 192;
dcp->add (cpl);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
{
prepare_directory (dir);
auto dcp = make_shared<dcp::DCP>(dir);
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
auto constexpr reel_length = 192;
dcp->add (cpl);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path const dir("build/test/verify_missing_hash");
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
}
dcp->cpls()[0]->reels()[0]->add(markers_asset);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
auto cpl = dcp->cpls()[0];
cpl->unset_version_number();
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_missing_extension_metadata1";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_missing_extension_metadata2";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_invalid_xml_cpl_extension_metadata3";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_invalid_extension_metadata1";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_invalid_extension_metadata2";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_invalid_xml_cpl_extension_metadata6";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_invalid_xml_cpl_extension_metadata7";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_invalid_xml_cpl_extension_metadata8";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
path dir = "build/test/verify_invalid_xml_cpl_extension_metadata9";
auto dcp = make_simple (dir);
dcp->write_xml (
- dcp::Standard::SMPTE,
dcp::String::compose("libdcp %1", dcp::version),
dcp::String::compose("libdcp %1", dcp::version),
dcp::LocalTime().as_string(),
signer->add (dcp::Certificate(dcp::file_to_string("test/ref/crypt/leaf.signed.pem")));
signer->set_key (dcp::file_to_string("test/ref/crypt/leaf.key"));
- auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER);
+ auto cpl = make_shared<dcp::CPL>("A Test DCP", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
dcp::Key key;
d.add (cpl);
- d.write_xml (dcp::Standard::SMPTE, "OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "A Test DCP", signer);
+ d.write_xml ("OpenDCP 0.0.25", "OpenDCP 0.0.25", "2012-07-17T04:45:18+00:00", "A Test DCP", signer);
check_verify_result (
{dir},
boost::filesystem::path dir = "build/test/verify_jpeg2000_codestream_libdcp";
prepare_directory (dir);
auto dcp = make_simple (dir);
- dcp->write_xml (dcp::Standard::SMPTE);
+ dcp->write_xml ();
vector<dcp::VerificationNote> notes;
dcp::MonoPictureAsset picture (find_file(dir, "video"));
auto reader = picture.start_read ();
string const creator = "libdcp";
string const annotation_text = "Created by libdcp";
- auto cpl = make_shared<dcp::CPL>("My film", dcp::ContentKind::FEATURE);
+ auto cpl = make_shared<dcp::CPL>("My film", dcp::ContentKind::FEATURE, dcp::Standard::INTEROP);
cpl->add (reel);
cpl->set_issuer (issuer);
cpl->set_creator (creator);
dcp::DCP dcp ("build/test/write_interop_subtitle_test3");
dcp.add (cpl);
- dcp.write_xml (dcp::Standard::INTEROP, issuer, creator, issue_date, annotation_text);
+ dcp.write_xml (issuer, creator, issue_date, annotation_text);
check_xml (
dcp::file_to_string("test/ref/write_interop_subtitle_test3/subs.xml"),
dcp::DCP fixed (*output);
fixed.add (cpl);
fixed.resolve_refs (assets);
- fixed.write_xml (dcp::Standard::INTEROP);
+ fixed.write_xml ();
cout << "Fixed XML files written to " << output->string() << "\n";
}