summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-07-25 11:04:30 +0200
committerCarl Hetherington <cth@carlh.net>2023-07-31 00:07:54 +0200
commit00948a5f283ba60b53632749f8d5684c0f3236cd (patch)
tree0510aa6f23e490307643d8703f81421c5dc27d29
parentee0a4116a5526f0d6ae8fa763519b7bedd2dcce6 (diff)
Write 8 or 16 audio channels to SMPTE DCP MXFs, as appropriate (#2443).channels-again2
-rw-r--r--src/lib/reel_writer.cc3
-rw-r--r--src/lib/writer.cc7
-rw-r--r--test/ffmpeg_audio_test.cc8
3 files changed, 11 insertions, 7 deletions
diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc
index e8db82fbb..f9a110ed1 100644
--- a/src/lib/reel_writer.cc
+++ b/src/lib/reel_writer.cc
@@ -179,8 +179,7 @@ ReelWriter::ReelWriter (
_sound_asset = make_shared<dcp::SoundAsset> (
dcp::Fraction(film()->video_frame_rate(), 1),
film()->audio_frame_rate(),
- /* Always make 16-channel sound assets for SMPTE; libdcp will pad unused channels for us */
- standard == dcp::Standard::SMPTE ? MAX_DCP_AUDIO_CHANNELS : film()->audio_channels(),
+ audio_channels_to_write_to_mxf(film()),
lang ? *lang : dcp::LanguageTag("en-US"),
standard
);
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index 71e9d579d..573e9da26 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -653,9 +653,12 @@ Writer::finish (boost::filesystem::path output_dcp)
field = dcp::MCASoundField::FIVE_POINT_ONE;
}
- dcp::MainSoundConfiguration msc(field, MAX_DCP_AUDIO_CHANNELS);
+ auto const audio_channels = audio_channels_to_write_to_mxf(film());
+ dcp::MainSoundConfiguration msc(field, audio_channels);
for (auto i: film()->mapped_audio_channels()) {
- msc.set_mapping(i, static_cast<dcp::Channel>(i));
+ if (i < audio_channels) {
+ msc.set_mapping(i, static_cast<dcp::Channel>(i));
+ }
}
cpl->set_main_sound_configuration(msc);
diff --git a/test/ffmpeg_audio_test.cc b/test/ffmpeg_audio_test.cc
index 910fc942c..638f9b1e3 100644
--- a/test/ffmpeg_audio_test.cc
+++ b/test/ffmpeg_audio_test.cc
@@ -58,8 +58,10 @@ BOOST_AUTO_TEST_CASE (ffmpeg_audio_test)
BOOST_REQUIRE (!wait_for_jobs());
+ int constexpr audio_channels = 8;
+
film->set_container (Ratio::from_id ("185"));
- film->set_audio_channels (6);
+ film->set_audio_channels(audio_channels);
film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST"));
make_and_verify_dcp (film);
@@ -71,7 +73,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_audio_test)
auto sound_asset = check.cpls().front()->reels().front()->main_sound ();
BOOST_CHECK (sound_asset);
- BOOST_CHECK_EQUAL(sound_asset->asset()->channels (), 16);
+ BOOST_REQUIRE_EQUAL(sound_asset->asset()->channels (), audio_channels);
/* Sample index in the DCP */
int n = 0;
@@ -82,7 +84,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_audio_test)
auto sound_frame = sound_asset->asset()->start_read()->get_frame (frame++);
uint8_t const * d = sound_frame->data ();
for (int offset = 0; offset < sound_frame->size(); offset += (3 * sound_asset->asset()->channels())) {
- for (auto channel = 0; channel < MAX_DCP_AUDIO_CHANNELS; ++channel) {
+ for (auto channel = 0; channel < audio_channels; ++channel) {
auto const sample = d[offset + channel * 3 + 1] | (d[offset + channel * 3 + 2] << 8);
if (channel == 2) {
/* Input should be on centre */