From: Carl Hetherington Date: Sun, 28 Nov 2021 18:36:06 +0000 (+0100) Subject: Add --channel option to dcpomatic_create. X-Git-Tag: v2.15.178~3 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=5f206d32ff60148ab72b35d5823f56bdbb7f50bf Add --channel option to dcpomatic_create. --- 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 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 next piece of content should be mapped to audio channel L, R, C, Lfe, Ls or Rs\n"; template @@ -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 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 (string)> convert_channel = [](string channel) -> optional{ + 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 channel; }; bool version; diff --git a/src/tools/dcpomatic_create.cc b/src/tools/dcpomatic_create.cc index 944ec3284..d78aef3df 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 9010dae21..dff10a11c 100644 --- a/test/create_cli_test.cc +++ b/test/create_cli_test.cc @@ -156,4 +156,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")); }