Add comment.
[dcpomatic.git] / test / audio_analysis_test.cc
index 9ad37ec2e77673a0f2a22eccc69c57403896f26d..77b251918793f975882c2ecd0252f357b3d3c630 100644 (file)
@@ -41,6 +41,7 @@
 #include "lib/ratio.h"
 #include "test.h"
 #include <boost/test/unit_test.hpp>
+#include <numeric>
 
 
 using std::make_shared;
@@ -101,15 +102,8 @@ BOOST_AUTO_TEST_CASE (audio_analysis_serialisation_test)
 
 BOOST_AUTO_TEST_CASE (audio_analysis_test)
 {
-       auto film = new_test_film ("audio_analysis_test");
-       film->set_dcp_content_type (DCPContentType::from_isdcf_name("FTR"));
-       film->set_container (Ratio::from_id("185"));
-       film->set_name ("audio_analysis_test");
-       boost::filesystem::path p = TestPaths::private_data() / "betty_L.wav";
-
-       auto c = make_shared<FFmpegContent>(p);
-       film->examine_and_add_content (c);
-       BOOST_REQUIRE (!wait_for_jobs());
+       auto c = make_shared<FFmpegContent>(TestPaths::private_data() / "betty_L.wav");
+       auto film = new_test_film("audio_analysis_test", { c });
 
        auto job = make_shared<AnalyseAudioJob>(film, film->playlist(), false);
        JobManager::instance()->add (job);
@@ -120,12 +114,8 @@ BOOST_AUTO_TEST_CASE (audio_analysis_test)
 /** Check that audio analysis works (i.e. runs without error) with a -ve delay */
 BOOST_AUTO_TEST_CASE (audio_analysis_negative_delay_test)
 {
-       auto film = new_test_film ("audio_analysis_negative_delay_test");
-       film->set_name ("audio_analysis_negative_delay_test");
        auto c = make_shared<FFmpegContent>(TestPaths::private_data() / "boon_telly.mkv");
-       film->examine_and_add_content (c);
-       BOOST_REQUIRE (!wait_for_jobs());
-
+       auto film = new_test_film("audio_analysis_negative_delay_test", { c });
        c->audio->set_delay (-250);
 
        auto job = make_shared<AnalyseAudioJob>(film, film->playlist(), false);
@@ -137,11 +127,8 @@ BOOST_AUTO_TEST_CASE (audio_analysis_negative_delay_test)
 /** Check audio analysis that is incorrect in 2e98263 */
 BOOST_AUTO_TEST_CASE (audio_analysis_test2)
 {
-       auto film = new_test_film ("audio_analysis_test2");
-       film->set_name ("audio_analysis_test2");
        auto c = make_shared<FFmpegContent>(TestPaths::private_data() / "3d_thx_broadway_2010_lossless.m2ts");
-       film->examine_and_add_content (c);
-       BOOST_REQUIRE (!wait_for_jobs());
+       auto film = new_test_film("audio_analysis_test2", { c });
 
        auto job = make_shared<AnalyseAudioJob>(film, film->playlist(), false);
        JobManager::instance()->add (job);
@@ -154,16 +141,10 @@ BOOST_AUTO_TEST_CASE (audio_analysis_test2)
  */
 BOOST_AUTO_TEST_CASE (audio_analysis_test3)
 {
-       auto film = new_test_film ("analyse_audio_test");
-       film->set_container (Ratio::from_id ("185"));
-       film->set_dcp_content_type (DCPContentType::from_isdcf_name("TLR"));
-       film->set_name ("frobozz");
-
        auto content = make_shared<FFmpegContent>("test/data/white.wav");
-       film->examine_and_add_content (content);
-       BOOST_REQUIRE (!wait_for_jobs());
-
+       auto film = new_test_film("analyse_audio_test", { content });
        film->set_audio_channels (12);
+
        boost::signals2::connection connection;
        bool done = false;
        JobManager::instance()->analyse_audio(film, film->playlist(), false, connection, [&done](Job::Result) { done = true; });
@@ -175,13 +156,8 @@ BOOST_AUTO_TEST_CASE (audio_analysis_test3)
 /** Run an audio analysis that triggered an exception in the audio decoder at one point */
 BOOST_AUTO_TEST_CASE (analyse_audio_test4)
 {
-       auto film = new_test_film ("analyse_audio_test");
-       film->set_container (Ratio::from_id ("185"));
-       film->set_dcp_content_type (DCPContentType::from_isdcf_name("TLR"));
-       film->set_name ("frobozz");
        auto content = content_factory(TestPaths::private_data() / "20 The Wedding Convoy Song.m4a")[0];
-       film->examine_and_add_content (content);
-       BOOST_REQUIRE (!wait_for_jobs());
+       auto film = new_test_film("analyse_audio_test", { content });
 
        auto playlist = make_shared<Playlist>();
        playlist->add (film, content);
@@ -193,7 +169,7 @@ BOOST_AUTO_TEST_CASE (analyse_audio_test4)
 
 BOOST_AUTO_TEST_CASE (analyse_audio_leqm_test)
 {
-       auto film = new_test_film("analyse_audio_leqm_test");
+       auto film = new_test_film("analyse_audio_leqm_test");
        film->set_audio_channels (2);
        auto content = content_factory(TestPaths::private_data() / "betty_stereo_48k.wav")[0];
        film->examine_and_add_content (content);
@@ -215,7 +191,7 @@ BOOST_AUTO_TEST_CASE (analyse_audio_leqm_test)
 BOOST_AUTO_TEST_CASE(analyse_audio_leqm_same_with_empty_channels)
 {
        auto dcp = make_shared<DCPContent>(TestPaths::private_data() / "JourneyToJah_TLR-1_F_EN-DE-FR_CH_51_2K_LOK_20140225_DGL_SMPTE_OV");
-       auto film = new_test_film2("analyse_audio_leqm_test2", { dcp });
+       auto film = new_test_film("analyse_audio_leqm_test2", { dcp });
        film->set_audio_channels(8);
 
        auto analyse = [film, dcp](int channels) {
@@ -241,7 +217,7 @@ BOOST_AUTO_TEST_CASE(analyse_audio_leqm_same_with_empty_channels)
 BOOST_AUTO_TEST_CASE(analyse_audio_with_long_silent_end)
 {
        auto content = content_factory(TestPaths::private_data() / "2364.mkv")[0];
-       auto film = new_test_film2("analyse_audio_with_long_silent_end", { content });
+       auto film = new_test_film("analyse_audio_with_long_silent_end", { content });
 
        auto playlist = make_shared<Playlist>();
        playlist->add(film, content);
@@ -254,7 +230,7 @@ BOOST_AUTO_TEST_CASE(analyse_audio_with_long_silent_end)
 BOOST_AUTO_TEST_CASE(analyse_audio_with_strange_channel_count)
 {
        auto content = content_factory(TestPaths::private_data() / "mali.mkv")[0];
-       auto film = new_test_film2("analyse_audio_with_strange_channel_count", { content });
+       auto film = new_test_film("analyse_audio_with_strange_channel_count", { content });
 
        auto playlist = make_shared<Playlist>();
        playlist->add(film, content);
@@ -263,3 +239,47 @@ 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_film("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_film("analyse_audio_with_more_channels_than_film_6ch", { sound });
+
+       auto playlist = make_shared<Playlist>();
+       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());
+}
+
+
+BOOST_AUTO_TEST_CASE(analyse_audio_uses_processor_when_analysing_whole_film)
+{
+       auto sound = content_factory(TestPaths::private_data() / "betty_stereo.wav")[0];
+       auto film = new_test_film("analyse_audio_uses_processor_when_analysing_whole_film", { sound });
+
+       auto job = make_shared<AnalyseAudioJob>(film, film->playlist(), true);
+       JobManager::instance()->add(job);
+       BOOST_REQUIRE(!wait_for_jobs());
+
+       AudioAnalysis analysis(job->path());
+
+       BOOST_REQUIRE(analysis.channels() > 2);
+       bool centre_non_zero = false;
+       /* Make sure there's something from the mid-side decoder on the centre channel */
+       for (auto point = 0; point < analysis.points(2); ++point) {
+               if (std::abs(analysis.get_point(2, point)[AudioPoint::Type::PEAK]) > 0) {
+                       centre_non_zero = true;
+               }
+       }
+
+       BOOST_CHECK(centre_non_zero);
+}
+