From: Carl Hetherington Date: Sat, 2 Sep 2017 22:02:35 +0000 (+0100) Subject: More end-to-end sound tests. X-Git-Tag: v2.11.23~26 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=d557a34c5eb00549e152b28daba48ffec58936bf More end-to-end sound tests. --- diff --git a/test/ffmpeg_audio_only_test.cc b/test/ffmpeg_audio_only_test.cc index ebfffc3eb..bbeef0b11 100644 --- a/test/ffmpeg_audio_only_test.cc +++ b/test/ffmpeg_audio_only_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Carl Hetherington + Copyright (C) 2016-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -30,9 +30,13 @@ #include "lib/job_manager.h" #include "lib/audio_buffers.h" #include "test.h" +#include +#include #include #include +#include +using std::min; using boost::shared_ptr; static SNDFILE* ref = 0; @@ -62,7 +66,7 @@ audio (boost::shared_ptr audio, int channels) } /** Test the FFmpeg code with audio-only content */ -static void +static shared_ptr test (boost::filesystem::path file) { shared_ptr film = new_test_film ("ffmpeg_audio_only_test"); @@ -78,7 +82,7 @@ test (boost::filesystem::path file) wait_for_jobs (); BOOST_CHECK (!JobManager::instance()->errors()); - /* Compare the audio data we read with what libsndfile reads */ + /* Compare the audio data player reads with what libsndfile reads */ SF_INFO info; info.format = 0; @@ -94,22 +98,105 @@ test (boost::filesystem::path file) while (!player->pass ()) {} sf_close (ref); + delete[] ref_buffer; + + return film; } BOOST_AUTO_TEST_CASE (ffmpeg_audio_only_test1) { /* S16 */ - test ("test/data/staircase.wav"); + shared_ptr film = test ("test/data/staircase.wav"); + + /* Compare the audio data in the DCP with what libsndfile reads */ + + SF_INFO info; + info.format = 0; + ref = sf_open ("test/data/staircase.wav", SFM_READ, &info); + /* We don't want to test anything that requires resampling */ + BOOST_REQUIRE_EQUAL (info.samplerate, 48000); + + int16_t* buffer = new int16_t[info.channels * 2000]; + + dcp::SoundAsset asset (dcp_file(film, "pcm")); + shared_ptr reader = asset.start_read (); + for (int i = 0; i < asset.intrinsic_duration(); ++i) { + shared_ptr frame = reader->get_frame(i); + sf_count_t this_time = min (info.frames, 2000L); + sf_readf_short (ref, buffer, this_time); + for (int j = 0; j < this_time; ++j) { + BOOST_REQUIRE_EQUAL (frame->get(2, j) >> 8, buffer[j]); + } + info.frames -= this_time; + } + + delete[] buffer; } BOOST_AUTO_TEST_CASE (ffmpeg_audio_only_test2) { /* S32 1 channel */ - test ("test/data/sine_440.wav"); + shared_ptr film = test ("test/data/sine_440.wav"); + + /* Compare the audio data in the DCP with what libsndfile reads */ + + SF_INFO info; + info.format = 0; + ref = sf_open ("test/data/sine_440.wav", SFM_READ, &info); + /* We don't want to test anything that requires resampling */ + BOOST_REQUIRE_EQUAL (info.samplerate, 48000); + + int32_t* buffer = new int32_t[info.channels * 2000]; + + dcp::SoundAsset asset (dcp_file(film, "pcm")); + shared_ptr reader = asset.start_read (); + for (int i = 0; i < asset.intrinsic_duration(); ++i) { + shared_ptr frame = reader->get_frame(i); + sf_count_t this_time = min (info.frames, 2000L); + sf_readf_int (ref, buffer, this_time); + for (int j = 0; j < this_time; ++j) { + int32_t s = frame->get(2, j); + if (s > (1 << 23)) { + s -= (1 << 24); + } + BOOST_REQUIRE_MESSAGE (abs(s - (buffer[j] / 256)) <= 1, "failed on asset frame " << i << " sample " << j); + } + info.frames -= this_time; + } + + delete[] buffer; } BOOST_AUTO_TEST_CASE (ffmpeg_audio_only_test3) { /* S24 1 channel */ - test ("test/data/sine_24_48_440.wav"); + shared_ptr film = test ("test/data/sine_24_48_440.wav"); + + /* Compare the audio data in the DCP with what libsndfile reads */ + + SF_INFO info; + info.format = 0; + ref = sf_open ("test/data/sine_24_48_440.wav", SFM_READ, &info); + /* We don't want to test anything that requires resampling */ + BOOST_REQUIRE_EQUAL (info.samplerate, 48000); + + int32_t* buffer = new int32_t[info.channels * 2000]; + + dcp::SoundAsset asset (dcp_file(film, "pcm")); + shared_ptr reader = asset.start_read (); + for (int i = 0; i < asset.intrinsic_duration(); ++i) { + shared_ptr frame = reader->get_frame(i); + sf_count_t this_time = min (info.frames, 2000L); + sf_readf_int (ref, buffer, this_time); + for (int j = 0; j < this_time; ++j) { + int32_t s = frame->get(2, j); + if (s > (1 << 23)) { + s -= (1 << 24); + } + BOOST_REQUIRE_MESSAGE (abs(s - buffer[j] /256) <= 1, "failed on asset frame " << i << " sample " << j); + } + info.frames -= this_time; + } + + delete[] buffer; } diff --git a/test/remake_id_test.cc b/test/remake_id_test.cc index d8bb5df83..8d924d702 100644 --- a/test/remake_id_test.cc +++ b/test/remake_id_test.cc @@ -42,7 +42,7 @@ BOOST_AUTO_TEST_CASE (remake_id_test) BOOST_REQUIRE (!wait_for_jobs ()); /* Copy the video file */ - boost::filesystem::path first_video = video_file(film); + boost::filesystem::path first_video = dcp_file(film, "j2c"); boost::filesystem::copy_file (first_video, first_video.string() + ".copy"); /* Make a new DCP with the same video file */ diff --git a/test/test.cc b/test/test.cc index 9027b8b71..95d84bcc9 100644 --- a/test/test.cc +++ b/test/test.cc @@ -492,10 +492,10 @@ check_one_frame (boost::filesystem::path dcp_dir, int64_t index, boost::filesyst } boost::filesystem::path -video_file (shared_ptr film) +dcp_file (shared_ptr film, string prefix) { boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (film->dir(film->dcp_name())); - while (i != boost::filesystem::directory_iterator() && !boost::algorithm::starts_with (i->path().leaf().string(), "j2c")) { + while (i != boost::filesystem::directory_iterator() && !boost::algorithm::starts_with (i->path().leaf().string(), prefix)) { ++i; } diff --git a/test/test.h b/test/test.h index 75ab7b7f6..b0fe648f3 100644 --- a/test/test.h +++ b/test/test.h @@ -38,5 +38,5 @@ extern void check_ffmpeg (boost::filesystem::path, boost::filesystem::path, int extern void check_image (boost::filesystem::path, boost::filesystem::path); extern boost::filesystem::path test_film_dir (std::string); extern void write_image (boost::shared_ptr image, boost::filesystem::path file, std::string format); -boost::filesystem::path video_file (boost::shared_ptr film); +boost::filesystem::path dcp_file (boost::shared_ptr film, std::string prefix); void check_one_frame (boost::filesystem::path dcp, int64_t index, boost::filesystem::path ref);