From 02d4493e593d567b210cd7f2b98d33a345867d1d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 25 Jul 2023 11:04:30 +0200 Subject: [PATCH] Go back to respecting the user's choice for the number of audio channels in the MXF. --- src/lib/reel_writer.cc | 3 +-- src/lib/writer.cc | 7 +++++-- test/audio_processor_test.cc | 2 +- test/content_test.cc | 3 +++ test/cpl_metadata_test.cc | 4 ++-- test/ffmpeg_audio_test.cc | 8 +++++--- test/import_dcp_test.cc | 1 + test/no_use_video_test.cc | 4 ++++ test/player_test.cc | 3 +++ test/reels_test.cc | 5 +++++ test/srt_subtitle_test.cc | 1 + test/threed_test.cc | 1 + 12 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index e8db82fbb..7c0c9188a 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(), + film()->audio_channels(), lang ? *lang : dcp::LanguageTag("en-US"), standard ); diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 71e9d579d..8b8ab89de 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 = film()->audio_channels(); + 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/audio_processor_test.cc b/test/audio_processor_test.cc index 8d59a3fe9..4fe5eeb10 100644 --- a/test/audio_processor_test.cc +++ b/test/audio_processor_test.cc @@ -47,7 +47,7 @@ BOOST_AUTO_TEST_CASE (audio_processor_test) film->examine_and_add_content (c); BOOST_REQUIRE (!wait_for_jobs()); - film->set_audio_channels (6); + film->set_audio_channels(16); film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST")); film->set_audio_processor (AudioProcessor::from_id ("mid-side-decoder")); diff --git a/test/content_test.cc b/test/content_test.cc index 85862af82..47099025e 100644 --- a/test/content_test.cc +++ b/test/content_test.cc @@ -45,6 +45,7 @@ BOOST_AUTO_TEST_CASE (content_test1) film->set_dcp_content_type (DCPContentType::from_isdcf_name ("FTR")); film->set_name ("content_test1"); film->set_container (Ratio::from_id ("185")); + film->set_audio_channels(16); auto content = content_factory(TestPaths::private_data() / "demo_sound_bug.mkv")[0]; film->examine_and_add_content (content); @@ -150,6 +151,8 @@ BOOST_AUTO_TEST_CASE (content_test6) &cl ); + film->set_audio_channels(16); + make_and_verify_dcp (film); check_dcp (TestPaths::private_data() / "fha", film); diff --git a/test/cpl_metadata_test.cc b/test/cpl_metadata_test.cc index b8346c663..544e78899 100644 --- a/test/cpl_metadata_test.cc +++ b/test/cpl_metadata_test.cc @@ -71,7 +71,7 @@ BOOST_AUTO_TEST_CASE(main_sound_configuration_test_51_vi) BOOST_REQUIRE(msc); /* We think this should say 51 not 71 at the start (#2580) */ - BOOST_CHECK_EQUAL(msc->to_string(), "51/L,R,C,LFE,Ls,Rs,-,VIN,-,-,-,-,-,-,-,-"); + BOOST_CHECK_EQUAL(msc->to_string(), "51/L,R,C,LFE,Ls,Rs,-,VIN"); } @@ -117,5 +117,5 @@ BOOST_AUTO_TEST_CASE(main_sound_configuration_test_71) auto msc = cpl->main_sound_configuration(); BOOST_REQUIRE(msc); - BOOST_CHECK_EQUAL(msc->to_string(), "71/L,R,C,LFE,Lss,Rss,-,VIN,-,-,Lrs,Rrs,-,-,-,-"); + BOOST_CHECK_EQUAL(msc->to_string(), "71/L,R,C,LFE,Lss,Rss,-,VIN,-,-,Lrs,Rrs"); } diff --git a/test/ffmpeg_audio_test.cc b/test/ffmpeg_audio_test.cc index 910fc942c..b2a83aad8 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 = 6; + 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 */ diff --git a/test/import_dcp_test.cc b/test/import_dcp_test.cc index acac79051..7387c7be7 100644 --- a/test/import_dcp_test.cc +++ b/test/import_dcp_test.cc @@ -85,6 +85,7 @@ BOOST_AUTO_TEST_CASE (import_dcp_test) B->set_dcp_content_type (DCPContentType::from_isdcf_name ("TLR")); B->set_name ("frobozz"); B->set_interop (false); + B->set_audio_channels(16); auto d = make_shared("build/test/import_dcp_test/" + A->dcp_name()); B->examine_and_add_content (d); diff --git a/test/no_use_video_test.cc b/test/no_use_video_test.cc index 0ad17d7b9..b2e019581 100644 --- a/test/no_use_video_test.cc +++ b/test/no_use_video_test.cc @@ -61,6 +61,8 @@ BOOST_AUTO_TEST_CASE (no_use_video_test1) B->set_position (film, dcpomatic::DCPTime()); A->video->set_use (false); + film->set_audio_channels(16); + make_and_verify_dcp (film); check_dcp ("test/data/no_use_video_test1", film); @@ -81,6 +83,8 @@ BOOST_AUTO_TEST_CASE (no_use_video_test2) B->set_position (film, dcpomatic::DCPTime()); A->video->set_use (false); + film->set_audio_channels(16); + make_and_verify_dcp (film); check_dcp (TestPaths::private_data() / "no_use_video_test2", film); diff --git a/test/player_test.cc b/test/player_test.cc index a6e7cd2de..5120c0180 100644 --- a/test/player_test.cc +++ b/test/player_test.cc @@ -558,6 +558,7 @@ BOOST_AUTO_TEST_CASE(multiple_sound_files_bug) auto C = content_factory(TestPaths::private_data() / "kook" / "3.wav").front(); auto film = new_test_film2("multiple_sound_files_bug", { A, B, C }, &cl); + film->set_audio_channels(16); C->set_position(film, DCPTime(3840000)); make_and_verify_dcp(film, { dcp::VerificationNote::Code::MISSING_CPL_METADATA }); @@ -573,6 +574,7 @@ BOOST_AUTO_TEST_CASE(trimmed_sound_mix_bug_13) auto A = content_factory("test/data/sine_16_48_440_10.wav").front(); auto B = content_factory("test/data/sine_16_44.1_440_10.wav").front(); auto film = new_test_film2("trimmed_sound_mix_bug_13", { A, B }); + film->set_audio_channels(16); A->set_position(film, DCPTime()); A->audio->set_gain(-12); @@ -600,6 +602,7 @@ BOOST_AUTO_TEST_CASE(trimmed_sound_mix_bug_13_frame_rate_change) A->set_video_frame_rate(film, 24); B->set_video_frame_rate(film, 24); film->set_video_frame_rate(25); + film->set_audio_channels(16); make_and_verify_dcp(film, { dcp::VerificationNote::Code::MISSING_CPL_METADATA }); check_mxf_audio_file("test/data/trimmed_sound_mix_bug_13_frame_rate_change.mxf", dcp_file(film, "pcm_")); diff --git a/test/reels_test.cc b/test/reels_test.cc index de3f56d2e..3d4dd0e6e 100644 --- a/test/reels_test.cc +++ b/test/reels_test.cc @@ -134,6 +134,8 @@ BOOST_AUTO_TEST_CASE (reels_test2) BOOST_CHECK_EQUAL (film->reels().size(), 3U); BOOST_REQUIRE (!wait_for_jobs()); + film->set_audio_channels(16); + make_and_verify_dcp (film); check_dcp ("test/data/reels_test2", film->dir (film->dcp_name())); @@ -141,6 +143,7 @@ BOOST_AUTO_TEST_CASE (reels_test2) auto c = make_shared(film->dir(film->dcp_name())); auto film2 = new_test_film2 ("reels_test2b", {c}); film2->set_reel_type (ReelType::BY_VIDEO_CONTENT); + film2->set_audio_channels(16); auto r = film2->reels (); BOOST_CHECK_EQUAL (r.size(), 3U); @@ -210,6 +213,8 @@ BOOST_AUTO_TEST_CASE (reels_test4) film->examine_and_add_content (subs); BOOST_REQUIRE (!wait_for_jobs()); + film->set_audio_channels(16); + auto reels = film->reels(); BOOST_REQUIRE_EQUAL (reels.size(), 4U); auto i = reels.begin (); diff --git a/test/srt_subtitle_test.cc b/test/srt_subtitle_test.cc index 3863ebf9f..c9aab59d9 100644 --- a/test/srt_subtitle_test.cc +++ b/test/srt_subtitle_test.cc @@ -55,6 +55,7 @@ BOOST_AUTO_TEST_CASE (srt_subtitle_test) film->set_name ("frobozz"); film->set_audio_channels (6); film->set_interop (false); + film->set_audio_channels(16); auto content = make_shared("test/data/subrip2.srt"); film->examine_and_add_content (content); BOOST_REQUIRE (!wait_for_jobs()); diff --git a/test/threed_test.cc b/test/threed_test.cc index 87ddd25ae..a53b4d10e 100644 --- a/test/threed_test.cc +++ b/test/threed_test.cc @@ -168,6 +168,7 @@ BOOST_AUTO_TEST_CASE (threed_test6) film->examine_and_add_content (L); auto R = make_shared("test/data/3dR.mp4"); film->examine_and_add_content (R); + film->set_audio_channels(16); BOOST_REQUIRE (!wait_for_jobs()); L->video->set_frame_type (VideoFrameType::THREE_D_LEFT); -- 2.30.2