#include "lib/ratio.h"
#include "test.h"
#include <boost/test/unit_test.hpp>
+#include <numeric>
using std::make_shared;
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);
/** 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);
/** 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);
*/
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; });
/** 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);
BOOST_AUTO_TEST_CASE (analyse_audio_leqm_test)
{
- auto film = new_test_film2 ("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);
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) {
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);
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);
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);
+}
+