summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-11-28 19:36:06 +0100
committerCarl Hetherington <cth@carlh.net>2021-11-29 01:08:53 +0100
commit87133162b564d29592eefbbddc02399e880504b6 (patch)
tree55f8830149e1dcf43401997faf5bada1811a9b61
parent7b7455685ef18e7b84909f4b0a81a985c60940da (diff)
Add --channel option to dcpomatic_create.
-rw-r--r--src/lib/create_cli.cc36
-rw-r--r--src/lib/create_cli.h1
-rw-r--r--src/tools/dcpomatic_create.cc9
-rw-r--r--test/create_cli_test.cc15
4 files changed, 59 insertions, 2 deletions
diff --git a/src/lib/create_cli.cc b/src/lib/create_cli.cc
index 8ea4e143f..8d7c59287 100644
--- a/src/lib/create_cli.cc
+++ b/src/lib/create_cli.cc
@@ -54,7 +54,8 @@ string CreateCLI::_help =
" --threed make a 3D DCP\n"
" --j2k-bandwidth <Mbit/s> J2K bandwidth in Mbit/s\n"
" --left-eye next piece of content is for the left eye\n"
- " --right-eye next piece of content is for the right eye\n";
+ " --right-eye next piece of content is for the right eye\n"
+ " --channel <channel> next piece of content should be mapped to audio channel L, R, C, Lfe, Ls or Rs\n";
template <class T>
@@ -100,7 +101,15 @@ argument_option (
return;
}
- *out = convert(argv[++n]);
+ auto const arg = argv[++n];
+ auto const value = convert(arg);
+ if (!value) {
+ *error = String::compose("%1: %2 is not valid for %3", argv[0], arg, long_name);
+ *claimed = true;
+ return;
+ }
+
+ *out = value;
*claimed = true;
}
@@ -123,6 +132,7 @@ CreateCLI::CreateCLI (int argc, char* argv[])
string template_name_string;
int j2k_bandwidth_int = 0;
auto next_frame_type = VideoFrameType::TWO_D;
+ optional<dcp::Channel> channel;
int i = 1;
while (i < argc) {
@@ -171,6 +181,26 @@ CreateCLI::CreateCLI (int argc, char* argv[])
argument_option(i, argc, argv, "-o", "--output", &claimed, &error, &output_dir, string_to_path);
argument_option(i, argc, argv, "", "--j2k-bandwidth", &claimed, &error, &j2k_bandwidth_int);
+ std::function<optional<dcp::Channel> (string)> convert_channel = [](string channel) -> optional<dcp::Channel>{
+ if (channel == "L") {
+ return dcp::Channel::LEFT;
+ } else if (channel == "R") {
+ return dcp::Channel::RIGHT;
+ } else if (channel == "C") {
+ return dcp::Channel::CENTRE;
+ } else if (channel == "Lfe") {
+ return dcp::Channel::LFE;
+ } else if (channel == "Ls") {
+ return dcp::Channel::LS;
+ } else if (channel == "Rs") {
+ return dcp::Channel::RS;
+ } else {
+ return {};
+ }
+ };
+
+ argument_option(i, argc, argv, "", "--channel", &claimed, &error, &channel, convert_channel);
+
if (!claimed) {
if (a.length() > 2 && a.substr(0, 2) == "--") {
error = String::compose("%1: unrecognised option '%2'", argv[0], a) + String::compose(_help, argv[0]);
@@ -179,8 +209,10 @@ CreateCLI::CreateCLI (int argc, char* argv[])
Content c;
c.path = a;
c.frame_type = next_frame_type;
+ c.channel = channel;
content.push_back (c);
next_frame_type = VideoFrameType::TWO_D;
+ channel = {};
}
}
diff --git a/src/lib/create_cli.h b/src/lib/create_cli.h
index 3a06c64f8..9cd790536 100644
--- a/src/lib/create_cli.h
+++ b/src/lib/create_cli.h
@@ -38,6 +38,7 @@ public:
struct Content {
boost::filesystem::path path;
VideoFrameType frame_type;
+ boost::optional<dcp::Channel> channel;
};
bool version;
diff --git a/src/tools/dcpomatic_create.cc b/src/tools/dcpomatic_create.cc
index 73bcfd882..1c11de3e3 100644
--- a/src/tools/dcpomatic_create.cc
+++ b/src/tools/dcpomatic_create.cc
@@ -137,6 +137,15 @@ main (int argc, char* argv[])
if (j->video) {
j->video->set_frame_type (i.frame_type);
}
+ if (j->audio && i.channel) {
+ for (auto stream: j->audio->streams()) {
+ AudioMapping mapping(stream->channels(), film->audio_channels());
+ for (int channel = 0; channel < stream->channels(); ++channel) {
+ mapping.set(channel, *i.channel, 1.0f);
+ }
+ stream->set_mapping (mapping);
+ }
+ }
}
}
diff --git a/test/create_cli_test.cc b/test/create_cli_test.cc
index b5663f81c..93d33fa85 100644
--- a/test/create_cli_test.cc
+++ b/test/create_cli_test.cc
@@ -154,4 +154,19 @@ BOOST_AUTO_TEST_CASE (create_cli_test)
BOOST_REQUIRE (cc.j2k_bandwidth);
BOOST_CHECK_EQUAL (*cc.j2k_bandwidth, 120000000);
BOOST_CHECK (!cc.error);
+
+ cc = run ("dcpomatic2_create --channel L fred.wav --channel R jim.wav sheila.wav");
+ BOOST_REQUIRE_EQUAL (cc.content.size(), 3U);
+ BOOST_CHECK_EQUAL (cc.content[0].path, "fred.wav");
+ BOOST_CHECK (cc.content[0].channel);
+ BOOST_CHECK (*cc.content[0].channel == dcp::Channel::LEFT);
+ BOOST_CHECK_EQUAL (cc.content[1].path, "jim.wav");
+ BOOST_CHECK (cc.content[1].channel);
+ BOOST_CHECK (*cc.content[1].channel == dcp::Channel::RIGHT);
+ BOOST_CHECK_EQUAL (cc.content[2].path, "sheila.wav");
+ BOOST_CHECK (!cc.content[2].channel);
+
+ cc = run ("dcpomatic2_create --channel foo fred.wav");
+ BOOST_REQUIRE (cc.error);
+ BOOST_CHECK (boost::algorithm::starts_with(*cc.error, "dcpomatic2_create: foo is not valid for --channel"));
}