summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cpl.cc15
-rw-r--r--src/cpl.h6
-rw-r--r--src/types.cc41
-rw-r--r--src/types.h5
4 files changed, 44 insertions, 23 deletions
diff --git a/src/cpl.cc b/src/cpl.cc
index c862a853..86b738d9 100644
--- a/src/cpl.cc
+++ b/src/cpl.cc
@@ -288,7 +288,16 @@ CPL::read_composition_metadata_asset (cxml::ConstNodePtr node)
_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) {
@@ -492,7 +501,9 @@ CPL::maybe_write_composition_metadata_asset(xmlpp::Element* node, bool include_m
_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");
diff --git a/src/cpl.h b/src/cpl.h
index 71ac8545..686954b2 100644
--- a/src/cpl.h
+++ b/src/cpl.h
@@ -283,11 +283,11 @@ public:
_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;
}
@@ -377,7 +377,7 @@ private:
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;
diff --git a/src/types.cc b/src/types.cc
index 153a73af..9b868197 100644
--- a/src/types.cc
+++ b/src/types.cc
@@ -473,8 +473,8 @@ MainSoundConfiguration::MainSoundConfiguration (string s)
{
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") {
@@ -482,7 +482,14 @@ MainSoundConfiguration::MainSoundConfiguration (string s)
} 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;
@@ -590,31 +597,33 @@ dcp::string_to_status (string s)
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;
}
diff --git a/src/types.h b/src/types.h
index 5f955c4b..a670fdd5 100644
--- a/src/types.h
+++ b/src/types.h
@@ -119,7 +119,8 @@ std::vector<dcp::Channel> used_audio_channels ();
enum class MCASoundField
{
FIVE_POINT_ONE,
- SEVEN_POINT_ONE
+ SEVEN_POINT_ONE,
+ OTHER
};
@@ -445,7 +446,7 @@ bool operator== (Luminance const& a, Luminance const& b);
class MainSoundConfiguration
{
public:
- MainSoundConfiguration (std::string);
+ explicit MainSoundConfiguration(std::string);
MainSoundConfiguration (MCASoundField field_, int channels);
MCASoundField field () const {