From 80572044b4e613d5dd25894294d92b6d87f65ed3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 24 May 2016 09:55:53 +0100 Subject: Move namespaces into variables. --- src/cpl.cc | 7 +++++-- src/dcp.cc | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/cpl.cc b/src/cpl.cc index c408fe97..b96e15d2 100644 --- a/src/cpl.cc +++ b/src/cpl.cc @@ -45,6 +45,9 @@ using boost::optional; using boost::dynamic_pointer_cast; using namespace dcp; +static string const cpl_interop_ns = "http://www.digicine.com/PROTO-ASDCP-CPL-20040511#"; +static string const cpl_smpte_ns = "http://www.smpte-ra.org/schemas/429-7/2006/CPL"; + CPL::CPL (string annotation_text, ContentKind content_kind) : _annotation_text (annotation_text) /* default _content_title_text to _annotation_text */ @@ -110,9 +113,9 @@ CPL::write_xml (boost::filesystem::path file, Standard standard, shared_ptr Date: Tue, 24 May 2016 11:26:50 +0100 Subject: Add reporting of DCP type. --- src/cpl.cc | 8 +++ src/cpl.h | 7 ++ src/dcp.cc | 24 ++++++- src/dcp.h | 8 +++ src/exceptions.cc | 6 ++ src/exceptions.h | 6 ++ test/read_dcp_test.cc | 22 +++++- test/ref/DCP/dcp_test3/ASSETMAP | 2 + test/ref/DCP/dcp_test3/VOLINDEX | 2 + .../cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml | 76 +++++++++++++++++++++ .../j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf | Bin 0 -> 561776 bytes .../pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf | Bin 0 -> 881174 bytes .../pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml | 76 +++++++++++++++++++++ 13 files changed, 234 insertions(+), 3 deletions(-) create mode 100644 test/ref/DCP/dcp_test3/ASSETMAP create mode 100644 test/ref/DCP/dcp_test3/VOLINDEX create mode 100644 test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml create mode 100644 test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf create mode 100644 test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf create mode 100644 test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml (limited to 'src') diff --git a/src/cpl.cc b/src/cpl.cc index b96e15d2..0d8221e2 100644 --- a/src/cpl.cc +++ b/src/cpl.cc @@ -70,6 +70,14 @@ CPL::CPL (boost::filesystem::path file) cxml::Document f ("CompositionPlaylist"); f.read_file (file); + if (f.namespace_uri() == cpl_interop_ns) { + _standard = INTEROP; + } else if (f.namespace_uri() == cpl_smpte_ns) { + _standard = SMPTE; + } else { + boost::throw_exception (XMLError ("Unrecognised CPL namespace " + f.namespace_uri())); + } + _id = remove_urn_uuid (f.string_child ("Id")); _annotation_text = f.optional_string_child ("AnnotationText").get_value_or (""); _metadata.issuer = f.optional_string_child ("Issuer").get_value_or (""); diff --git a/src/cpl.h b/src/cpl.h index 9d22cbd4..5ff320d2 100644 --- a/src/cpl.h +++ b/src/cpl.h @@ -114,6 +114,10 @@ public: int64_t duration () const; + boost::optional standard () const { + return _standard; + } + protected: /** @return type string for PKLs for this asset */ std::string pkl_type (Standard standard) const; @@ -129,6 +133,9 @@ private: std::string _content_version_id; ///< <Id> in <ContentVersion> std::string _content_version_label_text; ///< <LabelText> in <ContentVersion> std::list > _reels; + + /** Standard of CPL that was read in */ + boost::optional _standard; }; } diff --git a/src/dcp.cc b/src/dcp.cc index 3298cfae..11146562 100644 --- a/src/dcp.cc +++ b/src/dcp.cc @@ -81,6 +81,7 @@ DCP::DCP (boost::filesystem::path directory) _directory = boost::filesystem::canonical (_directory); } +/** Call this instead of throwing an exception if the error can be tolerated */ template void survivable_error (bool keep_going, dcp::DCP::ReadErrors* errors, T const & e) { @@ -108,7 +109,16 @@ DCP::read (bool keep_going, ReadErrors* errors, bool ignore_incorrect_picture_mx } cxml::Document asset_map ("AssetMap"); + asset_map.read_file (asset_map_file); + if (asset_map.namespace_uri() == assetmap_interop_ns) { + _standard = INTEROP; + } else if (asset_map.namespace_uri() == assetmap_smpte_ns) { + _standard = SMPTE; + } else { + boost::throw_exception (XMLError ("Unrecognised Assetmap namespace " + asset_map.namespace_uri())); + } + list > asset_nodes = asset_map.node_child("AssetList")->node_children ("Asset"); map paths; BOOST_FOREACH (shared_ptr i, asset_nodes) { @@ -153,11 +163,23 @@ DCP::read (bool keep_going, ReadErrors* errors, bool ignore_incorrect_picture_mx delete p; if (root == "CompositionPlaylist") { - _cpls.push_back (shared_ptr (new CPL (path))); + shared_ptr cpl (new CPL (path)); + if (_standard && cpl->standard() && cpl->standard().get() != _standard.get()) { + survivable_error (keep_going, errors, MismatchedStandardError ()); + } + _cpls.push_back (cpl); } else if (root == "DCSubtitle") { + if (_standard && _standard.get() == SMPTE) { + survivable_error (keep_going, errors, MismatchedStandardError ()); + } other_assets.push_back (shared_ptr (new InteropSubtitleAsset (path))); } } else if (boost::filesystem::extension (path) == ".mxf") { + + /* XXX: asdcplib does not appear to support discovery of read MXFs standard + (Interop / SMPTE) + */ + ASDCP::EssenceType_t type; if (ASDCP::EssenceType (path.string().c_str(), type) != ASDCP::RESULT_OK) { throw DCPReadError ("Could not find essence type"); diff --git a/src/dcp.h b/src/dcp.h index 05c2026b..7d6d1567 100644 --- a/src/dcp.h +++ b/src/dcp.h @@ -102,6 +102,11 @@ public: void resolve_refs (std::list > assets); + /** @return Standard of a DCP that was read in */ + boost::optional standard () const { + return _standard; + } + private: /** Write the PKL file. @@ -126,6 +131,9 @@ private: boost::filesystem::path _directory; /** the CPLs that make up this DCP */ std::list > _cpls; + + /** Standard of DCP that was read in */ + boost::optional _standard; }; } diff --git a/src/exceptions.cc b/src/exceptions.cc index ed6edaa4..14ae8e9c 100644 --- a/src/exceptions.cc +++ b/src/exceptions.cc @@ -70,3 +70,9 @@ ProgrammingError::ProgrammingError (string file, int line) { } + +MismatchedStandardError::MismatchedStandardError () + : DCPReadError ("DCP contains both Interop and SMPTE parts") +{ + +} diff --git a/src/exceptions.h b/src/exceptions.h index 801bfb01..3410337e 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -153,6 +153,12 @@ public: ProgrammingError (std::string file, int line); }; +class MismatchedStandardError : public DCPReadError +{ +public: + MismatchedStandardError (); +}; + } #endif diff --git a/test/read_dcp_test.cc b/test/read_dcp_test.cc index 097d0aa9..60aa3591 100644 --- a/test/read_dcp_test.cc +++ b/test/read_dcp_test.cc @@ -18,14 +18,15 @@ */ #include +#include #include "dcp.h" #include "cpl.h" using std::list; using boost::shared_ptr; -/** Read DCP that is in git and make sure that basic stuff is read in correctly */ -BOOST_AUTO_TEST_CASE (read_dcp) +/** Read a SMPTE DCP that is in git and make sure that basic stuff is read in correctly */ +BOOST_AUTO_TEST_CASE (read_dcp_test1) { dcp::DCP d ("test/ref/DCP/dcp_test1"); d.read (); @@ -35,4 +36,21 @@ BOOST_AUTO_TEST_CASE (read_dcp) BOOST_CHECK_EQUAL (cpls.front()->annotation_text(), "A Test DCP"); BOOST_CHECK_EQUAL (cpls.front()->content_kind(), dcp::FEATURE); + BOOST_REQUIRE (d.standard()); + BOOST_CHECK_EQUAL (d.standard(), dcp::SMPTE); +} + +/** Read an Interop DCP that is in git and make sure that basic stuff is read in correctly */ +BOOST_AUTO_TEST_CASE (read_dcp_test2) +{ + dcp::DCP d ("test/ref/DCP/dcp_test3"); + d.read (); + + list > cpls = d.cpls (); + BOOST_CHECK_EQUAL (cpls.size(), 1); + + BOOST_CHECK_EQUAL (cpls.front()->annotation_text(), "Test_FTR-1_F-119_10_2K_20160524_IOP_OV"); + BOOST_CHECK_EQUAL (cpls.front()->content_kind(), dcp::FEATURE); + BOOST_REQUIRE (d.standard()); + BOOST_CHECK_EQUAL (d.standard(), dcp::INTEROP); } diff --git a/test/ref/DCP/dcp_test3/ASSETMAP b/test/ref/DCP/dcp_test3/ASSETMAP new file mode 100644 index 00000000..6b4de017 --- /dev/null +++ b/test/ref/DCP/dcp_test3/ASSETMAP @@ -0,0 +1,2 @@ + +urn:uuid:fe6cc6ff-05f8-435e-9486-7ce432f3855aCreated by DCP-o-matic 2.8.4devel 4ba821a8b012016-05-24T10:56:58+01:00DCP-o-matic 2.8.4devel 4ba821a8b0DCP-o-matic 2.8.4devel 4ba821a8b0urn:uuid:d87a950c-bd6f-41f6-90cc-56ccd673e131truepkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml108175urn:uuid:cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml108542urn:uuid:c6035f97-b07d-4e1c-944d-603fc2ddc242j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf10561776urn:uuid:69cf9eaf-9a99-4776-b022-6902208626c3pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf10881174 diff --git a/test/ref/DCP/dcp_test3/VOLINDEX b/test/ref/DCP/dcp_test3/VOLINDEX new file mode 100644 index 00000000..49dd7ecc --- /dev/null +++ b/test/ref/DCP/dcp_test3/VOLINDEX @@ -0,0 +1,2 @@ + +1 diff --git a/test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml b/test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml new file mode 100644 index 00000000..8185ddb1 --- /dev/null +++ b/test/ref/DCP/dcp_test3/cpl_cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296.xml @@ -0,0 +1,76 @@ + +urn:uuid:cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296Test_FTR-1_F-119_10_2K_20160524_IOP_OV2016-05-24T10:56:58+01:00DCP-o-matic 2.8.4devel 4ba821a8b0DCP-o-matic 2.8.4devel 4ba821a8b0Test_FTR-1_F-119_10_2K_20160524_IOP_OVfeatureurn:uuid:dc199ce3-c0ab-4e4c-84fa-7f2e5b34a4afurn:uuid:dc199ce3-c0ab-4e4c-84fa-7f2e5b34a4af2016-05-24T10:56:58+01:00urn:uuid:439ff814-0e1b-44ab-9165-2b265b355f20urn:uuid:c6035f97-b07d-4e1c-944d-603fc2ddc242j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf24 12402442m6Sxyk+CT/aq0dEnjGXX//AjA=24 11.85urn:uuid:69cf9eaf-9a99-4776-b022-6902208626c3pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf24 124024a+7/nC9SIvCIziRyH9BXOr4r0fk=dnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com7dnQualifier=S9Mf7OiiXsCV2LGoSr1LKsRcat0=,CN=CS.dcpomatic.smpte-430-2.LEAF,OU=dcpomatic.com,O=dcpomatic.comD4hqt7drQ3mOOk9N7uQ4h3I8skc=KF8cjLvn5dwNxzHUXxT/ux479kEJmakBb2y6VCJ7scbH50NKVfDaufxMDf8Owt7A +RKy0yGTo9IzOcooBUDbtQypKxZEN2I9zPOWBSsgFRthMPODbJ9oHa5i0JoiHePW6 +pn/jrEI62WoF6O7+u2Y1WAGY/aERJyD285387OXLWHVjKOQtG2MoorbRyIBtG6vL +g6lYum8B/etyKxoJ5Rpc6BMqe/X+6kGtgxmrEqOaDuEm49GMw4c1sXqjE6/NtOUo +gE7oBooOzKw9J2GKv4haUwbauVaezyDXBQRHOWJ4WGRRhfbmP93ouKsr0ZqohbGQ +4xovNoDaN513KXzGSo/87g==dnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com7MIIEaTCCA1GgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhTEWMBQGA1UECgwNZGNw +b21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNvbTEsMCoGA1UEAwwjLmRj +cG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUxJTAjBgNVBC4THEZaTitD +OXIrUDhzcnowK3VINDVKSGNESGIwZz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEy +MTIyNjA4WjB/MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv +bWF0aWMuY29tMSYwJAYDVQQDDB1DUy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuTEVB +RjElMCMGA1UELhMcUzlNZjdPaWlYc0NWMkxHb1NyMUxLc1JjYXQwPTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKxEJwAKDOwDLron0tTs+uMYdFBXCUsq +Y+wxFhQCkuAgnD8evF91kUIBd79W0fd3XByGj6tyi5S0JOIYtDmq8bA3RnpQ/R9S +KQKESnHtt9Zptxk5KbIUUShiEBTTLfeLtubn8IFqgsarPEJPdXyjvzzyNEqbWpW0 +SVYC09/GzhOFjRzikAdG+MrWa93xGyf7/Bonmt4Z/pE2C+Enq7Oj0ascBYtWDB9T +U5IihXvo9VcAfiXWQlDoWrCP+YxjwRgMByh21RGJxdtqwV6KaBhmCEy976IVr8VW +DLmq8c5Nnz6vwypGCbdtLFr9Gxd93JbA+KPvXp7zx6d5+WfOJx8sE4sCAwEAAaOB +6DCB5TAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIFoDAdBgNVHQ4EFgQUS9Mf7Oii +XsCV2LGoSr1LKsRcat0wgagGA1UdIwSBoDCBnYAUFZN+C9r+P8srz0+uH45JHcDH +b0ihgYGkfzB9MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv +bWF0aWMuY29tMSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1Qx +JTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz2CAQYwDQYJKoZI +hvcNAQELBQADggEBAK2GcL7gKu6C/deJtQqZgeM/hHXEpo+jRwBuOe6D5Z7CN2O3 +DuhO54otN+mL6ImyrUvDZCoJa70gdnjLzrx8soBHXQ8IgMUh5+HItUYbX/U+vnTK +f8Ox1XybZenYNi8quwuodGBBZOWbXjLiMdVKkrCSjOiQRG6dCyFLIUZH/lsCETRI +7E+bdQmIh3+tiUtQar2D4kO2G1GrMKzpGWL1Vap6vEK2Lrvj8xQNmDT6VOUGE3Yz +qx0kHkPEYazi8aX/h7VG/ikTtR9Y57UNJTs7pG7EUIQZPRjaSptTQsB1qAP6ZsH8 ++Ko1kgIe6OKqckVkZyZDqM1LlgbC+3cRk5bf6/E=dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com6MIIEbTCCA1WgAwIBAgIBBjANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv +bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw +b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF +WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEzMTIyNjA4WjCB +hTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNv +bTEsMCoGA1UEAwwjLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUx +JTAjBgNVBC4THEZaTitDOXIrUDhzcnowK3VINDVKSGNESGIwZz0wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0io5HerL+iBGM+CWbpq5ZaTu35dA5Gp79 +iGl8J0S2tgzkkX5lXyJTtI5GZYMtaJWHwQYtbpmYsOxvhc4Xv/Jhfr0fPwQTFZTW +2jJQaLg2wno4SbP2mNU5QBCqPPkPvoNAmu0fqWmkBX8HAEIrYHxDDR4e/ZgEEnJp +D1RpwiMxVX9dCvtcmr8vqz8PSQ5xBJA+tw8WJgV+T/woDEvYZ9t65O4Opg70TGWS +hNRCJc7NUXP354zutfLjibLNyScQCf37ssh/2P8rp1+JdIxYqEhOIKNox9eHeBOT +P54W685/KJ8GGsHc+sKydMzJIu4HkVqHhY5WSLc2wj/07Hq59tffAgMBAAGjge4w +geswEgYDVR0TAQH/BAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFBWT +fgva/j/LK89Prh+OSR3Ax29IMIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dt +dz4pPiL7oYGBpH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwN +ZGNwb21hdGljLmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5S +T09UMSUwIwYDVQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0G +CSqGSIb3DQEBCwUAA4IBAQCYfqgS0+IPUUOgnYp59XXJxDq8sFE+eq0CTueJYgNQ +NglLhxz5jg+BsaFgK+yrcZNewNFTmXoXzJVAa2SjMscekk3qatJetFOcuidyo35b +Gp5tCQ+hZgVbzj29k7SAWzxZuSjcq3thjdvuC3pqqtd5W4MKXs4Tq8636NaR4rdi ++7/PCOznwmvBPLil0HjStWLuICNSauNarlvnloz6/hrik8XLKy5aXoFzKqW47T/C +lSymaosY/U/1U/UbwsACVtZ5l29SNeVfLT3AkLokskuP1ceIWzi/2biTbErUIQaM +SnqVheFcP0A/FDF6ql+okHDFuN0TsehGX9p17zuxGcN5dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com5MIIEZDCCA0ygAwIBAgIBBTANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv +bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw +b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF +WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTE0MTIyNjA4WjB9 +MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29t +MSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4T +HEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz0wggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDjajsB3pAAVr+/ZpUBHDIUTumgjvnCZRBxoYoRUjaH0wWG +UnbRU4DVh/0JcpZo3fcgpOhv34WPq+UHpXj/So2eMwiZIlx4EC/F8VqQkiXohJEE +JNKcDbLKLoQEs2sNayZ1SF0IY7D57CGifHMIUpZRwyv1LYweVbP7nIsvBxhoABg3 +8li3azYXiFgEGbjkmHOVyy3kR+SLn+PQ99qGhc6Qh7fR2aduDqHl971LKwpfoKqy +WoE62x8XrK1udWqmZNhvxvfh0YIXNyEJ0nVae77y/iiBLiVMQq81QQioGZblBD2n +um8gCuwsCay1Md9++D7Hzzc695LH8Ntx2elhtl/DAgMBAAGjge4wgeswEgYDVR0T +AQH/BAgwBgEB/wIBAzALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFADoClXjIOjSJghF +91Dtdz4pPiL7MIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dtdz4pPiL7oYGB +pH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGlj +LmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5ST09UMSUwIwYD +VQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0GCSqGSIb3DQEB +CwUAA4IBAQCT59b0YpNVyW2L19k69rqkzvSAB08mNhDkzWF66zAqtI9GT5ZEPSTn +U/84icV7EAFGyuSXjUnQNHyV5fIJu68vrg+dAHhRYKUi2xPgxHPKpxuPmmzKeqCw +UgCoV802RQNVFMwUo0khOi7LLsvOb3FDkA0yLflngOCBmLdKMBZJPrcAVO++qWJB +gpkZkt5Q7snLsw4oLvLklL4wdX8qkn2PUiZohY5r68kIalEg89MZXtFiWWTh3K9R +vr++lap40maqjMFG0xFO/K7Ujyc19m03fVRhCEZJIyyE7jJFis669Jh/IlF6UyrD +rm43765q3A5P1Y6iCVbprbuPbZ6VE/CJ diff --git a/test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf b/test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf new file mode 100644 index 00000000..f1907030 Binary files /dev/null and b/test/ref/DCP/dcp_test3/j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf differ diff --git a/test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf b/test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf new file mode 100644 index 00000000..fccb2ef0 Binary files /dev/null and b/test/ref/DCP/dcp_test3/pcm_69cf9eaf-9a99-4776-b022-6902208626c3.mxf differ diff --git a/test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml b/test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml new file mode 100644 index 00000000..a795c95c --- /dev/null +++ b/test/ref/DCP/dcp_test3/pkl_d87a950c-bd6f-41f6-90cc-56ccd673e131.xml @@ -0,0 +1,76 @@ + +urn:uuid:d87a950c-bd6f-41f6-90cc-56ccd673e131Test_FTR-1_F-119_10_2K_20160524_IOP_OV2016-05-24T10:56:58+01:00DCP-o-matic 2.8.4devel 4ba821a8b0DCP-o-matic 2.8.4devel 4ba821a8b0urn:uuid:cbfd2bc0-21cf-4a8f-95d8-9cddcbe51296cbfd2bc0-21cf-4a8f-95d8-9cddcbe512961MZ0cQr217LcIgobkC1/emgJrTU=8542text/xml;asdcpKind=CPLurn:uuid:c6035f97-b07d-4e1c-944d-603fc2ddc242c6035f97-b07d-4e1c-944d-603fc2ddc24242m6Sxyk+CT/aq0dEnjGXX//AjA=561776application/x-smpte-mxf;asdcpKind=Pictureurn:uuid:69cf9eaf-9a99-4776-b022-6902208626c369cf9eaf-9a99-4776-b022-6902208626c3a+7/nC9SIvCIziRyH9BXOr4r0fk=881174application/x-smpte-mxf;asdcpKind=SounddnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com7dnQualifier=S9Mf7OiiXsCV2LGoSr1LKsRcat0=,CN=CS.dcpomatic.smpte-430-2.LEAF,OU=dcpomatic.com,O=dcpomatic.comavzD/rIrawR3OhFlc4RNgYKC3UY=rEKXBDgklh0uiEeOeMipEixNdjBlSX3/9Urq822IXQDwm9Ty9fevo5LlfBqHsghD +0dh6N5il0CTn5LvokmuKcRjOdn5gEntpxfJvXLVZqMTVBxSgbuQMkVxKQYucx70k ++wP62PpMvOdPI7Aro+CeyTf0mwS5u/w2YMvGahR/gvlwgw32Lf3Ebe0KWHbG0lbd +zdfm3R7x2zb6XY4OB6TtH80JaIozyCe+Hs1ie7JmeXRBdxXZpGpNfhZ5+1Xw/Abm +x+FAb07KijyxMhtLRqFN/qBeEu68XChbjDK6zxKCUiuNS5I6Kh6DodMuOE9JpMSl +UZpVSCjsIVFd1kL8eFdvSA==dnQualifier=FZN\+C9r\+P8srz0\+uH45JHcDHb0g=,CN=.dcpomatic.smpte-430-2.INTERMEDIATE,OU=dcpomatic.com,O=dcpomatic.com7MIIEaTCCA1GgAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBhTEWMBQGA1UECgwNZGNw +b21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNvbTEsMCoGA1UEAwwjLmRj +cG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUxJTAjBgNVBC4THEZaTitD +OXIrUDhzcnowK3VINDVKSGNESGIwZz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEy +MTIyNjA4WjB/MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv +bWF0aWMuY29tMSYwJAYDVQQDDB1DUy5kY3BvbWF0aWMuc21wdGUtNDMwLTIuTEVB +RjElMCMGA1UELhMcUzlNZjdPaWlYc0NWMkxHb1NyMUxLc1JjYXQwPTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKxEJwAKDOwDLron0tTs+uMYdFBXCUsq +Y+wxFhQCkuAgnD8evF91kUIBd79W0fd3XByGj6tyi5S0JOIYtDmq8bA3RnpQ/R9S +KQKESnHtt9Zptxk5KbIUUShiEBTTLfeLtubn8IFqgsarPEJPdXyjvzzyNEqbWpW0 +SVYC09/GzhOFjRzikAdG+MrWa93xGyf7/Bonmt4Z/pE2C+Enq7Oj0ascBYtWDB9T +U5IihXvo9VcAfiXWQlDoWrCP+YxjwRgMByh21RGJxdtqwV6KaBhmCEy976IVr8VW +DLmq8c5Nnz6vwypGCbdtLFr9Gxd93JbA+KPvXp7zx6d5+WfOJx8sE4sCAwEAAaOB +6DCB5TAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIFoDAdBgNVHQ4EFgQUS9Mf7Oii +XsCV2LGoSr1LKsRcat0wgagGA1UdIwSBoDCBnYAUFZN+C9r+P8srz0+uH45JHcDH +b0ihgYGkfzB9MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3Bv +bWF0aWMuY29tMSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1Qx +JTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz2CAQYwDQYJKoZI +hvcNAQELBQADggEBAK2GcL7gKu6C/deJtQqZgeM/hHXEpo+jRwBuOe6D5Z7CN2O3 +DuhO54otN+mL6ImyrUvDZCoJa70gdnjLzrx8soBHXQ8IgMUh5+HItUYbX/U+vnTK +f8Ox1XybZenYNi8quwuodGBBZOWbXjLiMdVKkrCSjOiQRG6dCyFLIUZH/lsCETRI +7E+bdQmIh3+tiUtQar2D4kO2G1GrMKzpGWL1Vap6vEK2Lrvj8xQNmDT6VOUGE3Yz +qx0kHkPEYazi8aX/h7VG/ikTtR9Y57UNJTs7pG7EUIQZPRjaSptTQsB1qAP6ZsH8 ++Ko1kgIe6OKqckVkZyZDqM1LlgbC+3cRk5bf6/E=dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com6MIIEbTCCA1WgAwIBAgIBBjANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv +bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw +b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF +WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTEzMTIyNjA4WjCB +hTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGljLmNv +bTEsMCoGA1UEAwwjLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5JTlRFUk1FRElBVEUx +JTAjBgNVBC4THEZaTitDOXIrUDhzcnowK3VINDVKSGNESGIwZz0wggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0io5HerL+iBGM+CWbpq5ZaTu35dA5Gp79 +iGl8J0S2tgzkkX5lXyJTtI5GZYMtaJWHwQYtbpmYsOxvhc4Xv/Jhfr0fPwQTFZTW +2jJQaLg2wno4SbP2mNU5QBCqPPkPvoNAmu0fqWmkBX8HAEIrYHxDDR4e/ZgEEnJp +D1RpwiMxVX9dCvtcmr8vqz8PSQ5xBJA+tw8WJgV+T/woDEvYZ9t65O4Opg70TGWS +hNRCJc7NUXP354zutfLjibLNyScQCf37ssh/2P8rp1+JdIxYqEhOIKNox9eHeBOT +P54W685/KJ8GGsHc+sKydMzJIu4HkVqHhY5WSLc2wj/07Hq59tffAgMBAAGjge4w +geswEgYDVR0TAQH/BAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFBWT +fgva/j/LK89Prh+OSR3Ax29IMIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dt +dz4pPiL7oYGBpH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwN +ZGNwb21hdGljLmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5S +T09UMSUwIwYDVQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0G +CSqGSIb3DQEBCwUAA4IBAQCYfqgS0+IPUUOgnYp59XXJxDq8sFE+eq0CTueJYgNQ +NglLhxz5jg+BsaFgK+yrcZNewNFTmXoXzJVAa2SjMscekk3qatJetFOcuidyo35b +Gp5tCQ+hZgVbzj29k7SAWzxZuSjcq3thjdvuC3pqqtd5W4MKXs4Tq8636NaR4rdi ++7/PCOznwmvBPLil0HjStWLuICNSauNarlvnloz6/hrik8XLKy5aXoFzKqW47T/C +lSymaosY/U/1U/UbwsACVtZ5l29SNeVfLT3AkLokskuP1ceIWzi/2biTbErUIQaM +SnqVheFcP0A/FDF6ql+okHDFuN0TsehGX9p17zuxGcN5dnQualifier=AOgKVeMg6NImCEX3UO13Pik\+Ivs=,CN=.dcpomatic.smpte-430-2.ROOT,OU=dcpomatic.com,O=dcpomatic.com5MIIEZDCCA0ygAwIBAgIBBTANBgkqhkiG9w0BAQsFADB9MRYwFAYDVQQKDA1kY3Bv +bWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29tMSQwIgYDVQQDDBsuZGNw +b21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4THEFPZ0tWZU1nNk5JbUNF +WDNVTzEzUGlrK0l2cz0wHhcNMTYwNTE2MTIyNjA4WhcNMjYwNTE0MTIyNjA4WjB9 +MRYwFAYDVQQKDA1kY3BvbWF0aWMuY29tMRYwFAYDVQQLDA1kY3BvbWF0aWMuY29t +MSQwIgYDVQQDDBsuZGNwb21hdGljLnNtcHRlLTQzMC0yLlJPT1QxJTAjBgNVBC4T +HEFPZ0tWZU1nNk5JbUNFWDNVTzEzUGlrK0l2cz0wggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDjajsB3pAAVr+/ZpUBHDIUTumgjvnCZRBxoYoRUjaH0wWG +UnbRU4DVh/0JcpZo3fcgpOhv34WPq+UHpXj/So2eMwiZIlx4EC/F8VqQkiXohJEE +JNKcDbLKLoQEs2sNayZ1SF0IY7D57CGifHMIUpZRwyv1LYweVbP7nIsvBxhoABg3 +8li3azYXiFgEGbjkmHOVyy3kR+SLn+PQ99qGhc6Qh7fR2aduDqHl971LKwpfoKqy +WoE62x8XrK1udWqmZNhvxvfh0YIXNyEJ0nVae77y/iiBLiVMQq81QQioGZblBD2n +um8gCuwsCay1Md9++D7Hzzc695LH8Ntx2elhtl/DAgMBAAGjge4wgeswEgYDVR0T +AQH/BAgwBgEB/wIBAzALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFADoClXjIOjSJghF +91Dtdz4pPiL7MIGoBgNVHSMEgaAwgZ2AFADoClXjIOjSJghF91Dtdz4pPiL7oYGB +pH8wfTEWMBQGA1UECgwNZGNwb21hdGljLmNvbTEWMBQGA1UECwwNZGNwb21hdGlj +LmNvbTEkMCIGA1UEAwwbLmRjcG9tYXRpYy5zbXB0ZS00MzAtMi5ST09UMSUwIwYD +VQQuExxBT2dLVmVNZzZOSW1DRVgzVU8xM1BpaytJdnM9ggEFMA0GCSqGSIb3DQEB +CwUAA4IBAQCT59b0YpNVyW2L19k69rqkzvSAB08mNhDkzWF66zAqtI9GT5ZEPSTn +U/84icV7EAFGyuSXjUnQNHyV5fIJu68vrg+dAHhRYKUi2xPgxHPKpxuPmmzKeqCw +UgCoV802RQNVFMwUo0khOi7LLsvOb3FDkA0yLflngOCBmLdKMBZJPrcAVO++qWJB +gpkZkt5Q7snLsw4oLvLklL4wdX8qkn2PUiZohY5r68kIalEg89MZXtFiWWTh3K9R +vr++lap40maqjMFG0xFO/K7Ujyc19m03fVRhCEZJIyyE7jJFis669Jh/IlF6UyrD +rm43765q3A5P1Y6iCVbprbuPbZ6VE/CJ -- cgit v1.2.3 From 85c699d29aab7ca7f7218b3f7f859e10c9025e37 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 24 May 2016 12:25:22 +0100 Subject: Add somewhat speculative Rec 1886 and Rec 2020 colour conversions. --- src/colour_conversion.cc | 38 ++++++++++++++++++++++++++++++++++ src/colour_conversion.h | 2 ++ src/modified_gamma_transfer_function.h | 7 ++++++- 3 files changed, 46 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/colour_conversion.cc b/src/colour_conversion.cc index 8c48c2e1..46bc717e 100644 --- a/src/colour_conversion.cc +++ b/src/colour_conversion.cc @@ -97,6 +97,44 @@ ColourConversion::p3_to_xyz () return *c; } +ColourConversion const & +ColourConversion::rec1886_to_xyz () +{ + /* According to Olivier on DCP-o-matic bug #832, Rec. 1886 is Rec. 709 with + 2.4 gamma, so here goes ... + */ + static ColourConversion* c = new ColourConversion ( + shared_ptr (new GammaTransferFunction (2.4)), + YUV_TO_RGB_REC709, + Chromaticity (0.64, 0.33), + Chromaticity (0.3, 0.6), + Chromaticity (0.15, 0.06), + /* D65 */ + Chromaticity (0.3127, 0.329), + optional (), + shared_ptr (new GammaTransferFunction (2.6)) + ); + return *c; +} + +ColourConversion const & +ColourConversion::rec2020_to_xyz () +{ + /* From Wikipedia */ + static ColourConversion* c = new ColourConversion ( + shared_ptr (new ModifiedGammaTransferFunction (1 / 0.45, 0.08145, 0.0993, 4.5)), + YUV_TO_RGB_REC709, + Chromaticity (0.708, 0.292), + Chromaticity (0.170, 0.797), + Chromaticity (0.131, 0.046), + /* D65 */ + Chromaticity (0.3127, 0.329), + optional (), + shared_ptr (new GammaTransferFunction (2.6)) + ); + return *c; +} + ColourConversion::ColourConversion ( shared_ptr in, YUVToRGB yuv_to_rgb, diff --git a/src/colour_conversion.h b/src/colour_conversion.h index 47071dd1..f974a182 100644 --- a/src/colour_conversion.h +++ b/src/colour_conversion.h @@ -139,6 +139,8 @@ public: static ColourConversion const & rec601_to_xyz (); static ColourConversion const & rec709_to_xyz (); static ColourConversion const & p3_to_xyz (); + static ColourConversion const & rec1886_to_xyz (); + static ColourConversion const & rec2020_to_xyz (); protected: /** Input transfer function (probably a gamma function, or something similar) */ diff --git a/src/modified_gamma_transfer_function.h b/src/modified_gamma_transfer_function.h index e8875d4b..c200743a 100644 --- a/src/modified_gamma_transfer_function.h +++ b/src/modified_gamma_transfer_function.h @@ -25,10 +25,15 @@ namespace dcp { -/** A transfer function which for an input x gives an output y where +/** A transfer function which for an input x gives a linear output y where * * y = x / B for x <= threshold * y = ((x + A) / (1 + A))^power for x > threshold + * + * The reverse transform is + * + * x = y * B for y <= threshold / B + * x = (1 + A) * y ^ (1 / power) - A for y > threshold / B */ class ModifiedGammaTransferFunction : public TransferFunction { -- cgit v1.2.3