From 5b916bf26e3ad1cc49ef8e498bd5e4ff844ed7db Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 15 Nov 2023 17:02:16 +0100 Subject: Fix audio analysis attempts with source files that have more channels than the film. --- src/lib/audio_analyser.cc | 12 ++++++++++-- test/audio_analysis_test.cc | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/lib/audio_analyser.cc b/src/lib/audio_analyser.cc index 45097c5b6..df76932de 100644 --- a/src/lib/audio_analyser.cc +++ b/src/lib/audio_analyser.cc @@ -86,10 +86,18 @@ AudioAnalyser::AudioAnalyser (shared_ptr film, shared_ptraudio_channels(); auto content = _playlist->content(); if (content.size() == 1 && content[0]->audio) { - _leqm_channels = content[0]->audio->mapping().mapped_output_channels().size(); + _leqm_channels = 0; + for (auto channel: content[0]->audio->mapping().mapped_output_channels()) { + /* This means that if, for example, a file only maps C we will + * calculate LEQ(m) for L, R and C. I'm not sure if this is + * right or not. + */ + _leqm_channels = std::min(film->audio_channels(), channel + 1); + } + } else { + _leqm_channels = film->audio_channels(); } /* XXX: is this right? Especially for more than 5.1? */ diff --git a/test/audio_analysis_test.cc b/test/audio_analysis_test.cc index 9ad37ec2e..8bdca4c32 100644 --- a/test/audio_analysis_test.cc +++ b/test/audio_analysis_test.cc @@ -263,3 +263,23 @@ BOOST_AUTO_TEST_CASE(analyse_audio_with_strange_channel_count) BOOST_CHECK(!wait_for_jobs()); } + +BOOST_AUTO_TEST_CASE(analyse_audio_with_more_channels_than_film) +{ + auto picture = content_factory("test/data/flat_red.png"); + auto film_16ch = new_test_film2("analyse_audio_with_more_channels_than_film_16ch", picture); + film_16ch->set_audio_channels(16); + make_and_verify_dcp(film_16ch); + + auto pcm_16ch = find_file(film_16ch->dir(film_16ch->dcp_name()), "pcm_"); + auto sound = content_factory(pcm_16ch)[0]; + + auto film_6ch = new_test_film2("analyse_audio_with_more_channels_than_film_6ch", { sound }); + + auto playlist = make_shared(); + playlist->add(film_6ch, sound); + boost::signals2::connection c; + JobManager::instance()->analyse_audio(film_6ch, playlist, false, c, [](Job::Result) {}); + BOOST_CHECK(!wait_for_jobs()); +} + -- cgit v1.2.3