From 00948a5f283ba60b53632749f8d5684c0f3236cd Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 25 Jul 2023 11:04:30 +0200 Subject: Write 8 or 16 audio channels to SMPTE DCP MXFs, as appropriate (#2443). --- src/lib/reel_writer.cc | 3 +-- src/lib/writer.cc | 7 +++++-- test/ffmpeg_audio_test.cc | 8 +++++--- 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::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(i)); + if (i < audio_channels) { + msc.set_mapping(i, static_cast(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 */ -- cgit v1.2.3