_luminance = Luminance (lum);
}
- _main_sound_configuration = node->optional_string_child("MainSoundConfiguration");
+ if (auto msc = node->optional_string_child("MainSoundConfiguration")) {
+ try {
+ _main_sound_configuration = MainSoundConfiguration(*msc);
+ } catch (MainSoundConfigurationError& e) {
+ /* With Interop DCPs this node may not make any sense, but that's OK */
+ if (_standard == dcp::Standard::SMPTE) {
+ throw e;
+ }
+ }
+ }
auto sr = node->optional_string_child("MainSoundSampleRate");
if (sr) {
_luminance->as_xml (meta, "meta");
}
- meta->add_child("MainSoundConfiguration", "meta")->add_child_text(*_main_sound_configuration);
+ if (_main_sound_configuration) {
+ meta->add_child("MainSoundConfiguration", "meta")->add_child_text(_main_sound_configuration->to_string());
+ }
meta->add_child("MainSoundSampleRate", "meta")->add_child_text(raw_convert<string>(*_main_sound_sample_rate) + " 1");
auto stored = meta->add_child("MainPictureStoredArea", "meta");
_luminance = l;
}
- boost::optional<std::string> main_sound_configuration () const {
+ boost::optional<dcp::MainSoundConfiguration> main_sound_configuration () const {
return _main_sound_configuration;
}
- void set_main_sound_configuration (std::string c) {
+ void set_main_sound_configuration(dcp::MainSoundConfiguration c) {
_main_sound_configuration = c;
}
boost::optional<std::string> _distributor;
boost::optional<std::string> _facility;
boost::optional<Luminance> _luminance;
- boost::optional<std::string> _main_sound_configuration;
+ boost::optional<MainSoundConfiguration> _main_sound_configuration;
boost::optional<int> _main_sound_sample_rate;
boost::optional<dcp::Size> _main_picture_stored_area;
boost::optional<dcp::Size> _main_picture_active_area;
{
vector<string> parts;
boost::split (parts, s, boost::is_any_of("/"));
- if (parts.size() != 2) {
- throw MainSoundConfigurationError (s);
+ if (parts.empty()) {
+ throw MainSoundConfigurationError(s);
}
if (parts[0] == "51") {
} else if (parts[0] == "71") {
_field = MCASoundField::SEVEN_POINT_ONE;
} else {
- throw MainSoundConfigurationError (s);
+ _field = MCASoundField::OTHER;
+ }
+
+ if (parts.size() < 2) {
+ /* I think it's OK to just have the sound field descriptor with no channels, though
+ * to me it's not clear and I might be wrong.
+ */
+ return;
}
vector<string> channels;
Channel
dcp::mca_id_to_channel (string id)
{
- if (id == "L") {
+ transform(id.begin(), id.end(), id.begin(), ::tolower);
+
+ if (id == "l") {
return Channel::LEFT;
- } else if (id == "R") {
+ } else if (id == "r") {
return Channel::RIGHT;
- } else if (id == "C") {
+ } else if (id == "c") {
return Channel::CENTRE;
- } else if (id == "LFE") {
+ } else if (id == "lfe") {
return Channel::LFE;
- } else if (id == "Ls" || id == "Lss") {
+ } else if (id == "ls" || id == "lss") {
return Channel::LS;
- } else if (id == "Rs" || id == "Rss") {
+ } else if (id == "rs" || id == "rss") {
return Channel::RS;
- } else if (id == "HI") {
+ } else if (id == "hi") {
return Channel::HI;
- } else if (id == "VIN") {
+ } else if (id == "vin") {
return Channel::VI;
- } else if (id == "Lrs") {
+ } else if (id == "lrs") {
return Channel::BSL;
- } else if (id == "Rrs") {
+ } else if (id == "rrs") {
return Channel::BSR;
- } else if (id == "DBOX") {
+ } else if (id == "dbox") {
return Channel::MOTION_DATA;
- } else if (id == "FSKSync") {
+ } else if (id == "sync" || id == "fsksync") {
return Channel::SYNC_SIGNAL;
- } else if (id == "SLVS") {
+ } else if (id == "slvs") {
return Channel::SIGN_LANGUAGE;
}
enum class MCASoundField
{
FIVE_POINT_ONE,
- SEVEN_POINT_ONE
+ SEVEN_POINT_ONE,
+ OTHER
};
class MainSoundConfiguration
{
public:
- MainSoundConfiguration (std::string);
+ explicit MainSoundConfiguration(std::string);
MainSoundConfiguration (MCASoundField field_, int channels);
MCASoundField field () const {
cpl->set_content_version (
dcp::ContentVersion("urn:uuid:75ac29aa-42ac-1234-ecae-49251abefd11","content-version-label-text")
);
- cpl->set_main_sound_configuration("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
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(1440, 1080));
cpl->set_content_version (
dcp::ContentVersion("urn:uuid:75ac29aa-42ac-1234-ecae-49251abefd11","content-version-label-text")
);
- cpl->set_main_sound_configuration("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
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(1440, 1080));
}
+/* 482-12 says that implementations may use case-insensitive comparisons for the channel identifiers,
+ * and there is one DCP in the private test suite (made by Disney) that uses LS for left surround.
+ */
+BOOST_AUTO_TEST_CASE(main_sound_configuration_test_case_insensitive)
+{
+ dcp::MainSoundConfiguration msc("51/L,-,C,LFE,LS,RS,HI,VIN");
+ BOOST_CHECK_EQUAL(msc.to_string(), "51/L,-,C,LFE,Ls,Rs,HI,VIN");
+ BOOST_CHECK_EQUAL(msc.channels(), 8);
+ BOOST_CHECK_EQUAL(msc.field(), dcp::MCASoundField::FIVE_POINT_ONE);
+ BOOST_CHECK_EQUAL(msc.mapping(0).get(), dcp::Channel::LEFT);
+ BOOST_CHECK(!msc.mapping(1));
+ BOOST_CHECK_EQUAL(msc.mapping(2).get(), dcp::Channel::CENTRE);
+ BOOST_CHECK_EQUAL(msc.mapping(3).get(), dcp::Channel::LFE);
+ BOOST_CHECK_EQUAL(msc.mapping(4).get(), dcp::Channel::LS);
+ BOOST_CHECK_EQUAL(msc.mapping(5).get(), dcp::Channel::RS);
+ BOOST_CHECK_EQUAL(msc.mapping(6).get(), dcp::Channel::HI);
+ BOOST_CHECK_EQUAL(msc.mapping(7).get(), dcp::Channel::VI);
+}
+
+
BOOST_AUTO_TEST_CASE (luminance_test1)
{
BOOST_CHECK_NO_THROW (dcp::Luminance(4, dcp::Luminance::Unit::CANDELA_PER_SQUARE_METRE));
msc.set_mapping (2, dcp::Channel::CENTRE);
msc.set_mapping (3, dcp::Channel::LFE);
msc.set_mapping (13, dcp::Channel::SYNC_SIGNAL);
- cpl.set_main_sound_configuration (msc.to_string());
+ cpl.set_main_sound_configuration(msc);
cpl.set_main_sound_sample_rate (48000);
cpl.set_main_picture_stored_area (dcp::Size(1998, 1080));
msc.set_mapping (2, dcp::Channel::CENTRE);
msc.set_mapping (3, dcp::Channel::LFE);
msc.set_mapping (13, dcp::Channel::SYNC_SIGNAL);
- cpl.set_main_sound_configuration (msc.to_string());
+ cpl.set_main_sound_configuration(msc);
cpl.set_main_sound_sample_rate (48000);
cpl.set_main_picture_stored_area (dcp::Size(1998, 1080));
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_configuration(dcp::MainSoundConfiguration("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));
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_configuration(dcp::MainSoundConfiguration("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));
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_configuration(dcp::MainSoundConfiguration("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->set_content_version (
dcp::ContentVersion("urn:uuid:75ac29aa-42ac-1234-ecae-49251abefd11", "content-version-label-text")
);
- cpl->set_main_sound_configuration("51/L,R,C,LFE,Ls,Rs");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,R,C,LFE,Ls,Rs"));
cpl->set_main_sound_sample_rate(sample_rate);
cpl->set_main_picture_stored_area(dcp::Size(1998, 1080));
cpl->set_main_picture_active_area(dcp::Size(1998, 1080));
auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
- cpl->set_main_sound_configuration("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
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(1440, 1080));
reel->add (black_picture_asset(dir));
auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
- cpl->set_main_sound_configuration("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
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(1440, 1080));
reel->add (black_picture_asset(dir));
auto cpl = make_shared<dcp::CPL>("hello", dcp::ContentKind::TRAILER, dcp::Standard::SMPTE);
cpl->add (reel);
- cpl->set_main_sound_configuration("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
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(1440, 1080));
cpl->add (reel);
cpl->_additional_subtitle_languages.push_back("this-is-wrong");
cpl->_additional_subtitle_languages.push_back("andso-is-this");
- cpl->set_main_sound_configuration("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
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(1440, 1080));
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("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
cpl->set_main_sound_sample_rate (48000);
cpl->set_main_picture_stored_area(dcp::Size(width, height));
cpl->set_main_picture_active_area(dcp::Size(width, height));
cpl->set_issuer ("OpenDCP 0.0.25");
cpl->set_creator ("OpenDCP 0.0.25");
cpl->set_issue_date ("2012-07-17T04:45:18+00:00");
- cpl->set_main_sound_configuration("51/L,C,R,LFE,-,-");
+ cpl->set_main_sound_configuration(dcp::MainSoundConfiguration("51/L,C,R,LFE,-,-"));
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(1440, 1080));