diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/audio_analysis_test.cc | 126 | ||||
| -rw-r--r-- | test/colour_conversion_test.cc | 70 | ||||
| -rw-r--r-- | test/create_cli_test.cc | 16 | ||||
| m--------- | test/data | 0 | ||||
| -rw-r--r-- | test/frame_rate_test.cc | 297 | ||||
| -rw-r--r-- | test/hints_test.cc | 44 | ||||
| -rw-r--r-- | test/image_content_fade_test.cc | 40 | ||||
| -rw-r--r-- | test/image_test.cc | 335 | ||||
| -rw-r--r-- | test/render_subtitles_test.cc | 7 | ||||
| -rw-r--r-- | test/test.cc | 7 | ||||
| -rw-r--r-- | test/test.h | 1 | ||||
| -rw-r--r-- | test/threed_test.cc | 144 | ||||
| -rw-r--r-- | test/util_test.cc | 18 |
13 files changed, 657 insertions, 448 deletions
diff --git a/test/audio_analysis_test.cc b/test/audio_analysis_test.cc index 19555001b..578250b2c 100644 --- a/test/audio_analysis_test.cc +++ b/test/audio_analysis_test.cc @@ -40,6 +40,7 @@ #include "lib/playlist.h" #include "lib/ratio.h" #include "test.h" +#include <dcp/scope_guard.h> #include <boost/test/unit_test.hpp> #include <numeric> @@ -49,142 +50,142 @@ using std::vector; using namespace dcpomatic; -BOOST_AUTO_TEST_CASE (audio_analysis_serialisation_test) +BOOST_AUTO_TEST_CASE(audio_analysis_serialisation_test) { int const channels = 3; int const points = 4096; auto random_float = []() { - return (float (rand ()) / RAND_MAX) * 2 - 1; + return (float(rand()) / RAND_MAX) * 2 - 1; }; - AudioAnalysis a (3); + AudioAnalysis a(3); for (int i = 0; i < channels; ++i) { for (int j = 0; j < points; ++j) { AudioPoint p; - p[AudioPoint::PEAK] = random_float (); - p[AudioPoint::RMS] = random_float (); - a.add_point (i, p); + p[AudioPoint::PEAK] = random_float(); + p[AudioPoint::RMS] = random_float(); + a.add_point(i, p); } } vector<AudioAnalysis::PeakTime> peak; for (int i = 0; i < channels; ++i) { - peak.push_back (AudioAnalysis::PeakTime(random_float(), DCPTime(rand()))); + peak.push_back(AudioAnalysis::PeakTime(random_float(), DCPTime(rand()))); } - a.set_sample_peak (peak); + a.set_sample_peak(peak); - a.set_samples_per_point (100); - a.set_sample_rate (48000); - a.write ("build/test/audio_analysis_serialisation_test"); + a.set_samples_per_point(100); + a.set_sample_rate(48000); + a.write("build/test/audio_analysis_serialisation_test"); - AudioAnalysis b ("build/test/audio_analysis_serialisation_test"); + AudioAnalysis b("build/test/audio_analysis_serialisation_test"); for (int i = 0; i < channels; ++i) { - BOOST_CHECK_EQUAL (b.points(i), points); + BOOST_CHECK_EQUAL(b.points(i), points); for (int j = 0; j < points; ++j) { - AudioPoint p = a.get_point (i, j); - AudioPoint q = b.get_point (i, j); - BOOST_CHECK_CLOSE (p[AudioPoint::PEAK], q[AudioPoint::PEAK], 1); - BOOST_CHECK_CLOSE (p[AudioPoint::RMS], q[AudioPoint::RMS], 1); + AudioPoint p = a.get_point(i, j); + AudioPoint q = b.get_point(i, j); + BOOST_CHECK_CLOSE(p[AudioPoint::PEAK], q[AudioPoint::PEAK], 1); + BOOST_CHECK_CLOSE(p[AudioPoint::RMS], q[AudioPoint::RMS], 1); } } - BOOST_REQUIRE_EQUAL (b.sample_peak().size(), 3U); + BOOST_REQUIRE_EQUAL(b.sample_peak().size(), 3U); for (int i = 0; i < channels; ++i) { - BOOST_CHECK_CLOSE (b.sample_peak()[i].peak, peak[i].peak, 1); - BOOST_CHECK_EQUAL (b.sample_peak()[i].time.get(), peak[i].time.get()); + BOOST_CHECK_CLOSE(b.sample_peak()[i].peak, peak[i].peak, 1); + BOOST_CHECK_EQUAL(b.sample_peak()[i].time.get(), peak[i].time.get()); } - BOOST_CHECK_EQUAL (a.samples_per_point(), 100); - BOOST_CHECK_EQUAL (a.sample_rate(), 48000); + BOOST_CHECK_EQUAL(a.samples_per_point(), 100); + BOOST_CHECK_EQUAL(a.sample_rate(), 48000); } -BOOST_AUTO_TEST_CASE (audio_analysis_test) +BOOST_AUTO_TEST_CASE(audio_analysis_test) { 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); - BOOST_REQUIRE (!wait_for_jobs()); + JobManager::instance()->add(job); + BOOST_REQUIRE(!wait_for_jobs()); } /** Check that audio analysis works (i.e. runs without error) with a -ve delay */ -BOOST_AUTO_TEST_CASE (audio_analysis_negative_delay_test) +BOOST_AUTO_TEST_CASE(audio_analysis_negative_delay_test) { auto c = make_shared<FFmpegContent>(TestPaths::private_data() / "boon_telly.mkv"); auto film = new_test_film("audio_analysis_negative_delay_test", { c }); - c->audio->set_delay (-250); + c->audio->set_delay(-250); auto job = make_shared<AnalyseAudioJob>(film, film->playlist(), false); - JobManager::instance()->add (job); - BOOST_REQUIRE (!wait_for_jobs()); + JobManager::instance()->add(job); + BOOST_REQUIRE(!wait_for_jobs()); } /** Check audio analysis that is incorrect in 2e98263 */ -BOOST_AUTO_TEST_CASE (audio_analysis_test2) +BOOST_AUTO_TEST_CASE(audio_analysis_test2) { auto c = make_shared<FFmpegContent>(TestPaths::private_data() / "3d_thx_broadway_2010_lossless.m2ts"); auto film = new_test_film("audio_analysis_test2", { c }); auto job = make_shared<AnalyseAudioJob>(film, film->playlist(), false); - JobManager::instance()->add (job); - BOOST_REQUIRE (!wait_for_jobs()); + JobManager::instance()->add(job); + BOOST_REQUIRE(!wait_for_jobs()); } /* Test a case which was reported to throw an exception; analysing * a 12-channel DCP's audio. */ -BOOST_AUTO_TEST_CASE (audio_analysis_test3) +BOOST_AUTO_TEST_CASE(audio_analysis_test3) { auto content = make_shared<FFmpegContent>("test/data/white.wav"); auto film = new_test_film("analyse_audio_test", { content }); - film->set_audio_channels (12); + 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; }); - BOOST_REQUIRE (!wait_for_jobs()); - BOOST_CHECK (done); + BOOST_REQUIRE(!wait_for_jobs()); + BOOST_CHECK(done); } /** Run an audio analysis that triggered an exception in the audio decoder at one point */ -BOOST_AUTO_TEST_CASE (analyse_audio_test4) +BOOST_AUTO_TEST_CASE(analyse_audio_test4) { auto content = content_factory(TestPaths::private_data() / "20 The Wedding Convoy Song.m4a")[0]; auto film = new_test_film("analyse_audio_test", { content }); auto playlist = make_shared<Playlist>(); - playlist->add (film, content); + playlist->add(film, content); boost::signals2::connection c; JobManager::instance()->analyse_audio(film, playlist, false, c, [](Job::Result) {}); - BOOST_CHECK (!wait_for_jobs ()); + BOOST_CHECK(!wait_for_jobs()); } -BOOST_AUTO_TEST_CASE (analyse_audio_leqm_test) +BOOST_AUTO_TEST_CASE(analyse_audio_leqm_test) { auto film = new_test_film("analyse_audio_leqm_test"); - film->set_audio_channels (2); + film->set_audio_channels(2); auto content = content_factory(TestPaths::private_data() / "betty_stereo_48k.wav")[0]; film->examine_and_add_content({content}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); auto playlist = make_shared<Playlist>(); - playlist->add (film, content); + playlist->add(film, content); boost::signals2::connection c; JobManager::instance()->analyse_audio(film, playlist, false, c, [](Job::Result) {}); - BOOST_CHECK (!wait_for_jobs()); + BOOST_CHECK(!wait_for_jobs()); AudioAnalysis analysis(film->audio_analysis_path(playlist)); /* The CLI tool of leqm_nrt gives this value for betty_stereo_48k.wav */ - BOOST_CHECK_CLOSE (analysis.leqm().get_value_or(0), 88.276, 0.001); + BOOST_CHECK_CLOSE(analysis.leqm().get_value_or(0), 88.276, 0.001); } @@ -315,3 +316,38 @@ BOOST_AUTO_TEST_CASE(ebur128_test) } #endif + +static bool saw_ffmpeg_error = false; + +static +void +test_log_callback(void*, int level, const char*, va_list) +{ + if (level <= AV_LOG_WARNING) { + saw_ffmpeg_error = true; + } +} + + +/* The file in this test has the audio stream as index 0, video as 1, + * with both streams having the same ID. This triggered a bug where + * on analysis (with video disabled) the video packets would be fed + * to the audio decoder, causing chaos manifesting as many audio decoder + * errors. + */ +BOOST_AUTO_TEST_CASE(analysis_stream_confusion_test) +{ + auto sound = content_factory(TestPaths::private_data() / "ge.mkv")[0]; + auto film = new_test_film("analysis_stream_confusion_test", { sound }); + + av_log_set_callback(test_log_callback); + dcp::ScopeGuard sg = []() { + capture_ffmpeg_logs(); + }; + + auto job = make_shared<AnalyseAudioJob>(film, film->playlist(), true); + JobManager::instance()->add(job); + BOOST_REQUIRE(!wait_for_jobs()); + + BOOST_CHECK(!saw_ffmpeg_error); +} diff --git a/test/colour_conversion_test.cc b/test/colour_conversion_test.cc index 7b4d1eebd..fd2b7294b 100644 --- a/test/colour_conversion_test.cc +++ b/test/colour_conversion_test.cc @@ -26,8 +26,19 @@ #include "lib/colour_conversion.h" +#include "lib/content.h" +#include "lib/content_factory.h" #include "lib/film.h" +#include "lib/video_content.h" +#include "test.h" +#include <dcp/cpl.h> +#include <dcp/dcp.h> #include <dcp/gamma_transfer_function.h> +#include <dcp/j2k_transcode.h> +#include <dcp/mono_j2k_picture_asset.h> +#include <dcp/openjpeg_image.h> +#include <dcp/reel.h> +#include <dcp/reel_picture_asset.h> #include <libxml++/libxml++.h> #include <boost/test/unit_test.hpp> #include <iostream> @@ -120,3 +131,62 @@ BOOST_AUTO_TEST_CASE (colour_conversion_test4) BOOST_CHECK (ColourConversion::from_xml(in, Film::current_state_version).get() == i.conversion); } } + + +static void check(std::shared_ptr<const dcp::OpenJPEGImage> image, int px, int py, int cx, int cy, int cz) +{ + BOOST_CHECK_EQUAL(image->data(0)[px + py * image->size().width], cx); + BOOST_CHECK_EQUAL(image->data(1)[px + py * image->size().width], cy); + BOOST_CHECK_EQUAL(image->data(2)[px + py * image->size().width], cz); +} + + +BOOST_AUTO_TEST_CASE(end_to_end_rgb_black_test) +{ + auto pattern = content_factory(TestPaths::private_data() / "BlackCal_Levels_4k.png"); + auto film = new_test_film("end_to_end_rgb_black_test", pattern); + make_and_verify_dcp(film); + + dcp::DCP dcp(film->dir(film->dcp_name())); + dcp.read(); + BOOST_REQUIRE_EQUAL(dcp.cpls().size(), 1U); + auto cpl = dcp.cpls()[0]; + BOOST_REQUIRE_EQUAL(cpl->reels().size(), 1U); + auto reel = cpl->reels()[0]; + auto picture = std::dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(reel->main_picture()->j2k_asset()); + BOOST_REQUIRE(picture); + + auto reader = picture->start_read(); + auto frame = reader->get_frame(0); + auto image = dcp::decompress_j2k(*frame.get(), 0); + + /* Border is black. Make sure we move past the pillarboxing */ + check(image, 158, 2, 0, 0, 0); +} + + +BOOST_AUTO_TEST_CASE(end_to_end_rgb_white_test) +{ + auto pattern = content_factory(TestPaths::private_data() / "WhiteCal_Levels_4k.png"); + auto film = new_test_film("end_to_end_rgb_white_test", pattern); + make_and_verify_dcp(film); + + dcp::DCP dcp(film->dir(film->dcp_name())); + dcp.read(); + BOOST_REQUIRE_EQUAL(dcp.cpls().size(), 1U); + auto cpl = dcp.cpls()[0]; + BOOST_REQUIRE_EQUAL(cpl->reels().size(), 1U); + auto reel = cpl->reels()[0]; + auto picture = std::dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(reel->main_picture()->j2k_asset()); + BOOST_REQUIRE(picture); + + auto reader = picture->start_read(); + auto frame = reader->get_frame(0); + auto image = dcp::decompress_j2k(*frame.get(), 0); + + /* Border is white. Make sure we move past the pillarboxing. + * These XYZ values are from the ISDCF framing chart. + */ + check(image, 158, 2, 3883, 3960, 4092); +} + diff --git a/test/create_cli_test.cc b/test/create_cli_test.cc index c71031fbc..0f127c018 100644 --- a/test/create_cli_test.cc +++ b/test/create_cli_test.cc @@ -322,6 +322,22 @@ BOOST_AUTO_TEST_CASE (create_cli_test) BOOST_CHECK(film->content()[0]->video->fade_in() == 24); BOOST_CHECK(film->content()[0]->video->fade_out() == 0); BOOST_CHECK(collected_error.empty()); + + /* Extract a 1.85 frame from a 320x240 source */ + cc = run("dcpomatic2_create --container-ratio 185 --fill-crop test/data/red_24.mp4"); + BOOST_CHECK(!cc.error); + film = cc.make_film(error); + BOOST_REQUIRE_EQUAL(film->content().size(), 1U); + BOOST_REQUIRE(film->content()[0]->video); + BOOST_CHECK(film->content()[0]->video->requested_crop() == Crop(0, 0, 33, 33)); + + /* Extract a 1.85 frame from a 2048x858 source */ + cc = run("dcpomatic2_create --container-ratio 185 --fill-crop test/data/scope_dcp"); + BOOST_CHECK(!cc.error); + film = cc.make_film(error); + BOOST_REQUIRE_EQUAL(film->content().size(), 1U); + BOOST_REQUIRE(film->content()[0]->video); + BOOST_CHECK(film->content()[0]->video->requested_crop() == Crop(230, 230, 0, 0)); } diff --git a/test/data b/test/data -Subproject f93feeca2c9f44819a7e50f98262dc960f8d7e9 +Subproject cec02cb60028b76800357604f8331b903388d77 diff --git a/test/frame_rate_test.cc b/test/frame_rate_test.cc index 8d085478f..74f372c95 100644 --- a/test/frame_rate_test.cc +++ b/test/frame_rate_test.cc @@ -42,7 +42,7 @@ /* Test Playlist::best_dcp_frame_rate and FrameRateChange with a single piece of content. */ -BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single) +BOOST_AUTO_TEST_CASE(best_dcp_frame_rate_test_single) { auto content = std::make_shared<FFmpegContent>("test/data/test.mp4"); auto film = new_test_film("best_dcp_frame_rate_test_single", { content }); @@ -50,174 +50,183 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_single) /* Run some tests with a limited range of allowed rates */ std::list<int> afr; - afr.push_back (24); - afr.push_back (25); - afr.push_back (30); - Config::instance()->set_allowed_dcp_frame_rates (afr); + afr.push_back(24); + afr.push_back(25); + afr.push_back(30); + Config::instance()->set_allowed_dcp_frame_rates(afr); content->_video_frame_rate = 60; - int best = film->best_video_frame_rate (); + int best = film->best_video_frame_rate(); auto frc = FrameRateChange(60, best); - BOOST_CHECK_EQUAL (best, 30); - BOOST_CHECK_EQUAL (frc.skip, true); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + BOOST_CHECK_EQUAL(best, 30); + BOOST_CHECK_EQUAL(frc.skip(), 1); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 50; - best = film->best_video_frame_rate (); - frc = FrameRateChange (50, best); - BOOST_CHECK_EQUAL (best, 25); - BOOST_CHECK_EQUAL (frc.skip, true); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(50, best); + BOOST_CHECK_EQUAL(best, 25); + BOOST_CHECK_EQUAL(frc.skip(), 1); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 48; - best = film->best_video_frame_rate (); - frc = FrameRateChange (48, best); - BOOST_CHECK_EQUAL (best, 24); - BOOST_CHECK_EQUAL (frc.skip, true); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(48, best); + BOOST_CHECK_EQUAL(best, 24); + BOOST_CHECK_EQUAL(frc.skip(), 1); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 30; - best = film->best_video_frame_rate (); - frc = FrameRateChange (30, best); - BOOST_CHECK_EQUAL (best, 30); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(30, best); + BOOST_CHECK_EQUAL(best, 30); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 29.97; - best = film->best_video_frame_rate (); - frc = FrameRateChange (29.97, best); - BOOST_CHECK_EQUAL (best, 30); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, true); - BOOST_CHECK_CLOSE (frc.speed_up, 30 / 29.97, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(29.97, best); + BOOST_CHECK_EQUAL(best, 30); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), true); + BOOST_CHECK_CLOSE(frc.speed_up(), 30 / 29.97, 0.1); content->_video_frame_rate = 25; - best = film->best_video_frame_rate (); - frc = FrameRateChange (25, best); - BOOST_CHECK_EQUAL (best, 25); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(25, best); + BOOST_CHECK_EQUAL(best, 25); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 24; - best = film->best_video_frame_rate (); - frc = FrameRateChange (24, best); - BOOST_CHECK_EQUAL (best, 24); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(24, best); + BOOST_CHECK_EQUAL(best, 24); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 14.5; - best = film->best_video_frame_rate (); - frc = FrameRateChange (14.5, best); - BOOST_CHECK_EQUAL (best, 30); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 2); - BOOST_CHECK_EQUAL (frc.change_speed, true); - BOOST_CHECK_CLOSE (frc.speed_up, 15 / 14.5, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(14.5, best); + BOOST_CHECK_EQUAL(best, 30); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 2); + BOOST_CHECK_EQUAL(frc.change_speed(), true); + BOOST_CHECK_CLOSE(frc.speed_up(), 15 / 14.5, 0.1); content->_video_frame_rate = 12.6; - best = film->best_video_frame_rate (); - frc = FrameRateChange (12.6, best); - BOOST_CHECK_EQUAL (best, 25); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 2); - BOOST_CHECK_EQUAL (frc.change_speed, true); - BOOST_CHECK_CLOSE (frc.speed_up, 25 / 25.2, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(12.6, best); + BOOST_CHECK_EQUAL(best, 25); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 2); + BOOST_CHECK_EQUAL(frc.change_speed(), true); + BOOST_CHECK_CLOSE(frc.speed_up(), 25 / 25.2, 0.1); content->_video_frame_rate = 12.4; - best = film->best_video_frame_rate (); - frc = FrameRateChange (12.4, best); - BOOST_CHECK_EQUAL (best, 25); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 2); - BOOST_CHECK_EQUAL (frc.change_speed, true); - BOOST_CHECK_CLOSE (frc.speed_up, 25 / 24.8, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(12.4, best); + BOOST_CHECK_EQUAL(best, 25); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 2); + BOOST_CHECK_EQUAL(frc.change_speed(), true); + BOOST_CHECK_CLOSE(frc.speed_up(), 25 / 24.8, 0.1); content->_video_frame_rate = 12; - best = film->best_video_frame_rate (); - frc = FrameRateChange (12, best); - BOOST_CHECK_EQUAL (best, 24); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 2); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(12, best); + BOOST_CHECK_EQUAL(best, 24); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 2); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); + + content->_video_frame_rate = 120; + best = film->best_video_frame_rate(); + frc = FrameRateChange(120, best); + BOOST_CHECK_EQUAL(best, 30); + BOOST_CHECK_EQUAL(frc.skip(), 3); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); /* Now add some more rates and see if it will use them in preference to skip/repeat. */ - afr.push_back (48); - afr.push_back (50); - afr.push_back (60); - Config::instance()->set_allowed_dcp_frame_rates (afr); + afr.push_back(48); + afr.push_back(50); + afr.push_back(60); + Config::instance()->set_allowed_dcp_frame_rates(afr); content->_video_frame_rate = 60; - best = film->playlist()->best_video_frame_rate (); - frc = FrameRateChange (60, best); - BOOST_CHECK_EQUAL (best, 60); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->playlist()->best_video_frame_rate(); + frc = FrameRateChange(60, best); + BOOST_CHECK_EQUAL(best, 60); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 50; - best = film->playlist()->best_video_frame_rate (); - frc = FrameRateChange (50, best); - BOOST_CHECK_EQUAL (best, 50); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->playlist()->best_video_frame_rate(); + frc = FrameRateChange(50, best); + BOOST_CHECK_EQUAL(best, 50); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); content->_video_frame_rate = 48; - best = film->playlist()->best_video_frame_rate (); - frc = FrameRateChange (48, best); - BOOST_CHECK_EQUAL (best, 48); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, false); - BOOST_CHECK_CLOSE (frc.speed_up, 1, 0.1); + best = film->playlist()->best_video_frame_rate(); + frc = FrameRateChange(48, best); + BOOST_CHECK_EQUAL(best, 48); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), false); + BOOST_CHECK_CLOSE(frc.speed_up(), 1, 0.1); /* Check some out-there conversions (not the best) */ - frc = FrameRateChange (14.99, 24); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 2); - BOOST_CHECK_EQUAL (frc.change_speed, true); - BOOST_CHECK_CLOSE (frc.speed_up, 24 / (2 * 14.99), 0.1); + frc = FrameRateChange(14.99, 24); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 2); + BOOST_CHECK_EQUAL(frc.change_speed(), true); + BOOST_CHECK_CLOSE(frc.speed_up(), 24 / (2 * 14.99), 0.1); /* Check some conversions with limited DCP targets */ - afr.clear (); - afr.push_back (24); - Config::instance()->set_allowed_dcp_frame_rates (afr); + afr.clear(); + afr.push_back(24); + Config::instance()->set_allowed_dcp_frame_rates(afr); content->_video_frame_rate = 25; - best = film->best_video_frame_rate (); - frc = FrameRateChange (25, best); - BOOST_CHECK_EQUAL (best, 24); - BOOST_CHECK_EQUAL (frc.skip, false); - BOOST_CHECK_EQUAL (frc.repeat, 1); - BOOST_CHECK_EQUAL (frc.change_speed, true); - BOOST_CHECK_CLOSE (frc.speed_up, 24.0 / 25, 0.1); + best = film->best_video_frame_rate(); + frc = FrameRateChange(25, best); + BOOST_CHECK_EQUAL(best, 24); + BOOST_CHECK_EQUAL(frc.skip(), 0); + BOOST_CHECK_EQUAL(frc.repeat(), 1); + BOOST_CHECK_EQUAL(frc.change_speed(), true); + BOOST_CHECK_CLOSE(frc.speed_up(), 24.0 / 25, 0.1); } /* Test Playlist::best_dcp_frame_rate and FrameRateChange with two pieces of content. */ -BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_double) +BOOST_AUTO_TEST_CASE(best_dcp_frame_rate_test_double) { auto A = std::make_shared<FFmpegContent>("test/data/test.mp4"); auto B = std::make_shared<FFmpegContent>("test/data/test.mp4"); @@ -226,71 +235,71 @@ BOOST_AUTO_TEST_CASE (best_dcp_frame_rate_test_double) /* Run some tests with a limited range of allowed rates */ std::list<int> afr = { 24, 25, 30 }; - Config::instance()->set_allowed_dcp_frame_rates (afr); + Config::instance()->set_allowed_dcp_frame_rates(afr); A->_video_frame_rate = 30; B->_video_frame_rate = 24; - BOOST_CHECK_EQUAL (film->best_video_frame_rate(), 25); + BOOST_CHECK_EQUAL(film->best_video_frame_rate(), 25); A->_video_frame_rate = 24; B->_video_frame_rate = 24; - BOOST_CHECK_EQUAL (film->best_video_frame_rate(), 24); + BOOST_CHECK_EQUAL(film->best_video_frame_rate(), 24); A->_video_frame_rate = 24; B->_video_frame_rate = 48; - BOOST_CHECK_EQUAL (film->best_video_frame_rate(), 24); + BOOST_CHECK_EQUAL(film->best_video_frame_rate(), 24); } -BOOST_AUTO_TEST_CASE (audio_sampling_rate_test) +BOOST_AUTO_TEST_CASE(audio_sampling_rate_test) { auto content = std::make_shared<FFmpegContent>("test/data/test.mp4"); auto film = new_test_film("audio_sampling_rate_test", { content }); std::list<int> afr = { 24, 25, 30 }; - Config::instance()->set_allowed_dcp_frame_rates (afr); + Config::instance()->set_allowed_dcp_frame_rates(afr); auto stream = std::make_shared<FFmpegAudioStream>("foo", 0, 0, 0, 0, 0, 0); content->audio = std::make_shared<AudioContent>(content.get()); - content->audio->add_stream (stream); + content->audio->add_stream(stream); content->_video_frame_rate = 24; - film->set_video_frame_rate (24); + film->set_video_frame_rate(24); stream->_frame_rate = 48000; - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), 48000); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), 48000); stream->_frame_rate = 44100; - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), 48000); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), 48000); stream->_frame_rate = 80000; - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), 48000); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), 48000); content->_video_frame_rate = 23.976; - film->set_video_frame_rate (24); + film->set_video_frame_rate(24); stream->_frame_rate = 48000; - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), 47952); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), 47952); content->_video_frame_rate = 29.97; - film->set_video_frame_rate (30); - BOOST_CHECK_EQUAL (film->video_frame_rate (), 30); + film->set_video_frame_rate(30); + BOOST_CHECK_EQUAL(film->video_frame_rate(), 30); stream->_frame_rate = 48000; - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), 47952); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), 47952); content->_video_frame_rate = 25; - film->set_video_frame_rate (24); + film->set_video_frame_rate(24); stream->_frame_rate = 48000; - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), 50000); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), 50000); content->_video_frame_rate = 25; - film->set_video_frame_rate (24); + film->set_video_frame_rate(24); stream->_frame_rate = 44100; - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), 50000); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), 50000); /* Check some out-there conversions (not the best) */ content->_video_frame_rate = 14.99; - film->set_video_frame_rate (25); + film->set_video_frame_rate(25); stream->_frame_rate = 16000; /* The FrameRateChange within resampled_frame_rate should choose to double-up the 14.99 fps video to 30 and then run it slow at 25. */ - BOOST_CHECK_EQUAL (content->audio->resampled_frame_rate(film), lrint (48000 * 2 * 14.99 / 25)); + BOOST_CHECK_EQUAL(content->audio->resampled_frame_rate(film), lrint(48000 * 2 * 14.99 / 25)); } diff --git a/test/hints_test.cc b/test/hints_test.cc index 55bd9d77f..7cb9d676b 100644 --- a/test/hints_test.cc +++ b/test/hints_test.cc @@ -211,7 +211,7 @@ BOOST_AUTO_TEST_CASE (hint_subtitle_mxf_too_big) BOOST_CHECK_EQUAL ( hints[0], "At least one of your subtitle files is larger than " MAX_TEXT_MXF_SIZE_TEXT " in total. " - "You should divide the DCP into shorter reels." + "The largest file is 134MB. You should divide the DCP into shorter reels." ); } @@ -245,7 +245,7 @@ BOOST_AUTO_TEST_CASE (hint_closed_caption_xml_too_big) BOOST_CHECK_EQUAL ( hints[0], "At least one of your closed caption files' XML part is larger than " MAX_CLOSED_CAPTION_XML_SIZE_TEXT ". " - "You should divide the DCP into shorter reels." + "The largest XML part is 482KB. You should divide the DCP into shorter reels." ); } @@ -315,3 +315,43 @@ BOOST_AUTO_TEST_CASE(hints_mpeg2) "encoded with JPEG2000 rather than MPEG2. Make sure that your cinema really wants an old-style MPEG2 DCP." ); } + + +BOOST_AUTO_TEST_CASE(hints_120fps) +{ + auto content = content_factory("test/data/numbered_120.mp4"); + auto film = new_test_film("hints_120fps", content); + auto hints = get_hints(film); + for (auto hint: hints) { + BOOST_CHECK(hint.find("There is a large difference between the frame rate of your DCP and that of some of your content.") == std::string::npos); + } +} + + +BOOST_AUTO_TEST_CASE(hints_ccap_not_too_many_lines_xml) +{ + auto content = content_factory(TestPaths::private_data() / "ccap_not_too_many_lines.xml")[0]; + auto film = new_test_film("hints_ccap_not_too_many_lines", { content }); + content->text[0]->set_type(TextType::CLOSED_CAPTION); + auto hints = get_hints(film); + + BOOST_CHECK( + std::none_of(hints.begin(), hints.end(), [](string const& hint) { + return hint.find("Some of your closed captions span more than 3 lines") != std::string::npos; + }) + ); +} + + +BOOST_AUTO_TEST_CASE(hints_ccap_too_many_lines_xml) +{ + auto content = content_factory(TestPaths::private_data() / "ccap_too_many_lines.xml")[0]; + auto film = new_test_film("hints_ccap_too_many_lines", { content }); + content->text[0]->set_type(TextType::CLOSED_CAPTION); + auto hints = get_hints(film); + BOOST_CHECK( + std::any_of(hints.begin(), hints.end(), [](string const& hint) { + return hint.find("Some of your closed captions span more than 3 lines") != std::string::npos; + }) + ); +} diff --git a/test/image_content_fade_test.cc b/test/image_content_fade_test.cc index 70d72871e..b033050e5 100644 --- a/test/image_content_fade_test.cc +++ b/test/image_content_fade_test.cc @@ -24,16 +24,24 @@ #include "lib/film.h" #include "lib/video_content.h" #include "test.h" +#include <dcp/cpl.h> +#include <dcp/dcp.h> +#include <dcp/mono_j2k_picture_asset.h> +#include <dcp/mono_j2k_picture_asset_reader.h> +#include <dcp/openjpeg_image.h> +#include <dcp/reel.h> +#include <dcp/reel_picture_asset.h> #include <boost/test/unit_test.hpp> +using std::dynamic_pointer_cast; using std::string; using std::list; -BOOST_AUTO_TEST_CASE (image_content_fade_test) +BOOST_AUTO_TEST_CASE(image_content_fade_in_test) { - auto film = new_test_film("image_content_fade_test"); + auto film = new_test_film("image_content_fade_in_test"); auto content = content_factory("test/data/flat_red.png")[0]; film->examine_and_add_content({content}); BOOST_REQUIRE (!wait_for_jobs()); @@ -45,5 +53,31 @@ BOOST_AUTO_TEST_CASE (image_content_fade_test) * differences in sound between the DCP and the reference to avoid test * failures for unrelated reasons. */ - check_dcp("test/data/image_content_fade_test", film->dir(film->dcp_name()), true); + check_dcp("test/data/image_content_fade_in_test", film->dir(film->dcp_name()), true); +} + + +BOOST_AUTO_TEST_CASE(image_content_fade_out_test) +{ + auto content = content_factory("test/data/flat_red.png")[0]; + auto film = new_test_film("image_content_fade_out_test", {content}); + content->video->set_fade_out(12); + make_and_verify_dcp(film); + + dcp::DCP dcp(film->dir(film->dcp_name())); + dcp.read(); + auto picture = dynamic_pointer_cast<dcp::MonoJ2KPictureAsset>(dcp.cpls()[0]->reels()[0]->main_picture()->asset()); + auto reader = picture->start_read(); + auto frame = reader->get_frame(239)->xyz_image(); + + auto const width = frame->size().width; + auto const height = frame->size().height; + + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + for (int c = 0; c < 2; ++c) { + BOOST_REQUIRE(frame->data(c)[y * width + x] <= 4); + } + } + } } diff --git a/test/image_test.cc b/test/image_test.cc index aa3baeb4f..807f88d04 100644 --- a/test/image_test.cc +++ b/test/image_test.cc @@ -43,50 +43,50 @@ using std::make_shared; using std::string; -BOOST_AUTO_TEST_CASE (aligned_image_test) +BOOST_AUTO_TEST_CASE(aligned_image_test) { - auto s = new Image (AV_PIX_FMT_RGB24, dcp::Size (50, 50), Image::Alignment::PADDED); - BOOST_CHECK_EQUAL (s->planes(), 1); + auto s = new Image(AV_PIX_FMT_RGB24, dcp::Size(50, 50), Image::Alignment::PADDED); + BOOST_CHECK_EQUAL(s->planes(), 1); /* 192 is 150 aligned to the nearest 64 bytes */ - BOOST_CHECK_EQUAL (s->stride()[0], 192); - BOOST_CHECK_EQUAL (s->line_size()[0], 150); - BOOST_CHECK (s->data()[0]); - BOOST_CHECK (!s->data()[1]); - BOOST_CHECK (!s->data()[2]); - BOOST_CHECK (!s->data()[3]); + BOOST_CHECK_EQUAL(s->stride()[0], 192); + BOOST_CHECK_EQUAL(s->line_size()[0], 150); + BOOST_CHECK(s->data()[0]); + BOOST_CHECK(!s->data()[1]); + BOOST_CHECK(!s->data()[2]); + BOOST_CHECK(!s->data()[3]); /* copy constructor */ - auto t = new Image (*s); - BOOST_CHECK_EQUAL (t->planes(), 1); - BOOST_CHECK_EQUAL (t->stride()[0], 192); - BOOST_CHECK_EQUAL (t->line_size()[0], 150); - BOOST_CHECK (t->data()[0]); - BOOST_CHECK (!t->data()[1]); - BOOST_CHECK (!t->data()[2]); - BOOST_CHECK (!t->data()[3]); - BOOST_CHECK (t->data() != s->data()); - BOOST_CHECK (t->data()[0] != s->data()[0]); - BOOST_CHECK (t->line_size() != s->line_size()); - BOOST_CHECK_EQUAL (t->line_size()[0], s->line_size()[0]); - BOOST_CHECK (t->stride() != s->stride()); - BOOST_CHECK_EQUAL (t->stride()[0], s->stride()[0]); + auto t = new Image(*s); + BOOST_CHECK_EQUAL(t->planes(), 1); + BOOST_CHECK_EQUAL(t->stride()[0], 192); + BOOST_CHECK_EQUAL(t->line_size()[0], 150); + BOOST_CHECK(t->data()[0]); + BOOST_CHECK(!t->data()[1]); + BOOST_CHECK(!t->data()[2]); + BOOST_CHECK(!t->data()[3]); + BOOST_CHECK(t->data() != s->data()); + BOOST_CHECK(t->data()[0] != s->data()[0]); + BOOST_CHECK(t->line_size() != s->line_size()); + BOOST_CHECK_EQUAL(t->line_size()[0], s->line_size()[0]); + BOOST_CHECK(t->stride() != s->stride()); + BOOST_CHECK_EQUAL(t->stride()[0], s->stride()[0]); /* assignment operator */ - auto u = new Image (AV_PIX_FMT_YUV422P, dcp::Size (150, 150), Image::Alignment::COMPACT); + auto u = new Image(AV_PIX_FMT_YUV422P, dcp::Size(150, 150), Image::Alignment::COMPACT); *u = *s; - BOOST_CHECK_EQUAL (u->planes(), 1); - BOOST_CHECK_EQUAL (u->stride()[0], 192); - BOOST_CHECK_EQUAL (u->line_size()[0], 150); - BOOST_CHECK (u->data()[0]); - BOOST_CHECK (!u->data()[1]); - BOOST_CHECK (!u->data()[2]); - BOOST_CHECK (!u->data()[3]); - BOOST_CHECK (u->data() != s->data()); - BOOST_CHECK (u->data()[0] != s->data()[0]); - BOOST_CHECK (u->line_size() != s->line_size()); - BOOST_CHECK_EQUAL (u->line_size()[0], s->line_size()[0]); - BOOST_CHECK (u->stride() != s->stride()); - BOOST_CHECK_EQUAL (u->stride()[0], s->stride()[0]); + BOOST_CHECK_EQUAL(u->planes(), 1); + BOOST_CHECK_EQUAL(u->stride()[0], 192); + BOOST_CHECK_EQUAL(u->line_size()[0], 150); + BOOST_CHECK(u->data()[0]); + BOOST_CHECK(!u->data()[1]); + BOOST_CHECK(!u->data()[2]); + BOOST_CHECK(!u->data()[3]); + BOOST_CHECK(u->data() != s->data()); + BOOST_CHECK(u->data()[0] != s->data()[0]); + BOOST_CHECK(u->line_size() != s->line_size()); + BOOST_CHECK_EQUAL(u->line_size()[0], s->line_size()[0]); + BOOST_CHECK(u->stride() != s->stride()); + BOOST_CHECK_EQUAL(u->stride()[0], s->stride()[0]); delete s; delete t; @@ -94,49 +94,49 @@ BOOST_AUTO_TEST_CASE (aligned_image_test) } -BOOST_AUTO_TEST_CASE (compact_image_test) +BOOST_AUTO_TEST_CASE(compact_image_test) { - auto s = new Image (AV_PIX_FMT_RGB24, dcp::Size (50, 50), Image::Alignment::COMPACT); - BOOST_CHECK_EQUAL (s->planes(), 1); - BOOST_CHECK_EQUAL (s->stride()[0], 50 * 3); - BOOST_CHECK_EQUAL (s->line_size()[0], 50 * 3); - BOOST_CHECK (s->data()[0]); - BOOST_CHECK (!s->data()[1]); - BOOST_CHECK (!s->data()[2]); - BOOST_CHECK (!s->data()[3]); + auto s = new Image(AV_PIX_FMT_RGB24, dcp::Size(50, 50), Image::Alignment::COMPACT); + BOOST_CHECK_EQUAL(s->planes(), 1); + BOOST_CHECK_EQUAL(s->stride()[0], 50 * 3); + BOOST_CHECK_EQUAL(s->line_size()[0], 50 * 3); + BOOST_CHECK(s->data()[0]); + BOOST_CHECK(!s->data()[1]); + BOOST_CHECK(!s->data()[2]); + BOOST_CHECK(!s->data()[3]); /* copy constructor */ - auto t = new Image (*s); - BOOST_CHECK_EQUAL (t->planes(), 1); - BOOST_CHECK_EQUAL (t->stride()[0], 50 * 3); - BOOST_CHECK_EQUAL (t->line_size()[0], 50 * 3); - BOOST_CHECK (t->data()[0]); - BOOST_CHECK (!t->data()[1]); - BOOST_CHECK (!t->data()[2]); - BOOST_CHECK (!t->data()[3]); - BOOST_CHECK (t->data() != s->data()); - BOOST_CHECK (t->data()[0] != s->data()[0]); - BOOST_CHECK (t->line_size() != s->line_size()); - BOOST_CHECK_EQUAL (t->line_size()[0], s->line_size()[0]); - BOOST_CHECK (t->stride() != s->stride()); - BOOST_CHECK_EQUAL (t->stride()[0], s->stride()[0]); + auto t = new Image(*s); + BOOST_CHECK_EQUAL(t->planes(), 1); + BOOST_CHECK_EQUAL(t->stride()[0], 50 * 3); + BOOST_CHECK_EQUAL(t->line_size()[0], 50 * 3); + BOOST_CHECK(t->data()[0]); + BOOST_CHECK(!t->data()[1]); + BOOST_CHECK(!t->data()[2]); + BOOST_CHECK(!t->data()[3]); + BOOST_CHECK(t->data() != s->data()); + BOOST_CHECK(t->data()[0] != s->data()[0]); + BOOST_CHECK(t->line_size() != s->line_size()); + BOOST_CHECK_EQUAL(t->line_size()[0], s->line_size()[0]); + BOOST_CHECK(t->stride() != s->stride()); + BOOST_CHECK_EQUAL(t->stride()[0], s->stride()[0]); /* assignment operator */ - auto u = new Image (AV_PIX_FMT_YUV422P, dcp::Size (150, 150), Image::Alignment::PADDED); + auto u = new Image(AV_PIX_FMT_YUV422P, dcp::Size(150, 150), Image::Alignment::PADDED); *u = *s; - BOOST_CHECK_EQUAL (u->planes(), 1); - BOOST_CHECK_EQUAL (u->stride()[0], 50 * 3); - BOOST_CHECK_EQUAL (u->line_size()[0], 50 * 3); - BOOST_CHECK (u->data()[0]); - BOOST_CHECK (!u->data()[1]); - BOOST_CHECK (!u->data()[2]); - BOOST_CHECK (!u->data()[3]); - BOOST_CHECK (u->data() != s->data()); - BOOST_CHECK (u->data()[0] != s->data()[0]); - BOOST_CHECK (u->line_size() != s->line_size()); - BOOST_CHECK_EQUAL (u->line_size()[0], s->line_size()[0]); - BOOST_CHECK (u->stride() != s->stride()); - BOOST_CHECK_EQUAL (u->stride()[0], s->stride()[0]); + BOOST_CHECK_EQUAL(u->planes(), 1); + BOOST_CHECK_EQUAL(u->stride()[0], 50 * 3); + BOOST_CHECK_EQUAL(u->line_size()[0], 50 * 3); + BOOST_CHECK(u->data()[0]); + BOOST_CHECK(!u->data()[1]); + BOOST_CHECK(!u->data()[2]); + BOOST_CHECK(!u->data()[3]); + BOOST_CHECK(u->data() != s->data()); + BOOST_CHECK(u->data()[0] != s->data()[0]); + BOOST_CHECK(u->line_size() != s->line_size()); + BOOST_CHECK_EQUAL(u->line_size()[0], s->line_size()[0]); + BOOST_CHECK(u->stride() != s->stride()); + BOOST_CHECK_EQUAL(u->stride()[0], s->stride()[0]); delete s; delete t; @@ -150,10 +150,10 @@ alpha_blend_test_bgra_onto(AVPixelFormat format, string suffix) { auto proxy = make_shared<FFmpegImageProxy>(TestPaths::private_data() / "prophet_frame.tiff"); auto raw = proxy->image(Image::Alignment::PADDED).image; - auto background = raw->convert_pixel_format (dcp::YUVToRGB::REC709, format, Image::Alignment::PADDED, false); + auto background = raw->convert_pixel_format(dcp::YUVToRGB::REC709, format, Image::Alignment::PADDED, false); auto overlay = make_shared<Image>(AV_PIX_FMT_BGRA, dcp::Size(431, 891), Image::Alignment::PADDED); - overlay->make_transparent (); + overlay->make_transparent(); for (int y = 0; y < 128; ++y) { auto p = overlay->data()[0] + y * overlay->stride()[0]; @@ -179,9 +179,9 @@ alpha_blend_test_bgra_onto(AVPixelFormat format, string suffix) } } - background->alpha_blend (overlay, Position<int> (13, 17)); + background->alpha_blend(overlay, Position<int>(13, 17)); - auto save = background->convert_pixel_format (dcp::YUVToRGB::REC709, AV_PIX_FMT_RGB24, Image::Alignment::COMPACT, false); + auto save = background->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGB24, Image::Alignment::COMPACT, false); write_image(save, "build/test/image_test_bgra_" + suffix + ".png"); check_image("build/test/image_test_bgra_" + suffix + ".png", TestPaths::private_data() / ("image_test_bgra_" + suffix + ".png")); @@ -194,7 +194,7 @@ alpha_blend_test_rgba64be_onto(AVPixelFormat format, string suffix) { auto proxy = make_shared<FFmpegImageProxy>(TestPaths::private_data() / "prophet_frame.tiff"); auto raw = proxy->image(Image::Alignment::PADDED).image; - auto background = raw->convert_pixel_format (dcp::YUVToRGB::REC709, format, Image::Alignment::PADDED, false); + auto background = raw->convert_pixel_format(dcp::YUVToRGB::REC709, format, Image::Alignment::PADDED, false); auto overlay = make_shared<Image>(AV_PIX_FMT_RGBA64BE, dcp::Size(431, 891), Image::Alignment::PADDED); overlay->make_transparent(); @@ -233,7 +233,7 @@ alpha_blend_test_rgba64be_onto(AVPixelFormat format, string suffix) /** Test Image::alpha_blend */ -BOOST_AUTO_TEST_CASE (alpha_blend_test) +BOOST_AUTO_TEST_CASE(alpha_blend_test) { alpha_blend_test_bgra_onto(AV_PIX_FMT_RGB24, "rgb24"); alpha_blend_test_bgra_onto(AV_PIX_FMT_BGRA, "bgra"); @@ -348,12 +348,12 @@ BOOST_AUTO_TEST_CASE(alpha_blend_text) /** Test merge (list<PositionImage>) with a single image */ -BOOST_AUTO_TEST_CASE (merge_test1) +BOOST_AUTO_TEST_CASE(merge_test1) { int const stride = 48 * 4; - auto A = make_shared<Image>(AV_PIX_FMT_BGRA, dcp::Size (48, 48), Image::Alignment::COMPACT); - A->make_transparent (); + auto A = make_shared<Image>(AV_PIX_FMT_BGRA, dcp::Size(48, 48), Image::Alignment::COMPACT); + A->make_transparent(); auto a = A->data()[0]; for (int y = 0; y < 48; ++y) { @@ -367,19 +367,19 @@ BOOST_AUTO_TEST_CASE (merge_test1) } list<PositionImage> all; - all.push_back (PositionImage (A, Position<int>(0, 0))); - auto merged = merge (all, Image::Alignment::COMPACT); + all.push_back(PositionImage(A, Position<int>(0, 0))); + auto merged = merge(all, Image::Alignment::COMPACT); - BOOST_CHECK (merged.position == Position<int>(0, 0)); - BOOST_CHECK_EQUAL (memcmp (merged.image->data()[0], A->data()[0], stride * 48), 0); + BOOST_CHECK(merged.position == Position<int>(0, 0)); + BOOST_CHECK_EQUAL(memcmp(merged.image->data()[0], A->data()[0], stride * 48), 0); } /** Test merge (list<PositionImage>) with two images */ -BOOST_AUTO_TEST_CASE (merge_test2) +BOOST_AUTO_TEST_CASE(merge_test2) { - auto A = make_shared<Image>(AV_PIX_FMT_BGRA, dcp::Size (48, 1), Image::Alignment::COMPACT); - A->make_transparent (); + auto A = make_shared<Image>(AV_PIX_FMT_BGRA, dcp::Size(48, 1), Image::Alignment::COMPACT); + A->make_transparent(); auto a = A->data()[0]; for (int x = 0; x < 16; ++x) { /* blue */ @@ -388,8 +388,8 @@ BOOST_AUTO_TEST_CASE (merge_test2) a[x * 4 + 3] = 255; } - auto B = make_shared<Image>(AV_PIX_FMT_BGRA, dcp::Size (48, 1), Image::Alignment::COMPACT); - B->make_transparent (); + auto B = make_shared<Image>(AV_PIX_FMT_BGRA, dcp::Size(48, 1), Image::Alignment::COMPACT); + B->make_transparent(); auto b = B->data()[0]; for (int x = 0; x < 16; ++x) { /* red */ @@ -399,26 +399,26 @@ BOOST_AUTO_TEST_CASE (merge_test2) } list<PositionImage> all; - all.push_back (PositionImage(A, Position<int>(0, 0))); - all.push_back (PositionImage(B, Position<int>(0, 0))); - auto merged = merge (all, Image::Alignment::COMPACT); + all.push_back(PositionImage(A, Position<int>(0, 0))); + all.push_back(PositionImage(B, Position<int>(0, 0))); + auto merged = merge(all, Image::Alignment::COMPACT); - BOOST_CHECK (merged.position == Position<int>(0, 0)); + BOOST_CHECK(merged.position == Position<int>(0, 0)); auto m = merged.image->data()[0]; for (int x = 0; x < 16; ++x) { - BOOST_CHECK_EQUAL (m[x * 4], 255); - BOOST_CHECK_EQUAL (m[x * 4 + 3], 255); - BOOST_CHECK_EQUAL (m[(x + 16) * 4 + 3], 0); - BOOST_CHECK_EQUAL (m[(x + 32) * 4 + 2], 255); - BOOST_CHECK_EQUAL (m[(x + 32) * 4 + 3], 255); + BOOST_CHECK_EQUAL(m[x * 4], 255); + BOOST_CHECK_EQUAL(m[x * 4 + 3], 255); + BOOST_CHECK_EQUAL(m[(x + 16) * 4 + 3], 0); + BOOST_CHECK_EQUAL(m[(x + 32) * 4 + 2], 255); + BOOST_CHECK_EQUAL(m[(x + 32) * 4 + 3], 255); } } /** Test Image::crop_scale_window with YUV420P and some windowing */ -BOOST_AUTO_TEST_CASE (crop_scale_window_test) +BOOST_AUTO_TEST_CASE(crop_scale_window_test) { auto proxy = make_shared<FFmpegImageProxy>("test/data/flat_red.png"); auto raw = proxy->image(Image::Alignment::PADDED).image; @@ -432,19 +432,19 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test) /** Special cases of Image::crop_scale_window which triggered some valgrind warnings */ -BOOST_AUTO_TEST_CASE (crop_scale_window_test2) +BOOST_AUTO_TEST_CASE(crop_scale_window_test2) { auto image = make_shared<Image>(AV_PIX_FMT_XYZ12LE, dcp::Size(2048, 858), Image::Alignment::PADDED); - image->crop_scale_window ( + image->crop_scale_window( Crop(279, 0, 0, 0), dcp::Size(1069, 448), dcp::Size(1069, 578), dcp::YUVToRGB::REC709, VideoRange::FULL, AV_PIX_FMT_RGB24, VideoRange::FULL, Image::Alignment::COMPACT, false ); - image->crop_scale_window ( + image->crop_scale_window( Crop(2048, 0, 0, 0), dcp::Size(1069, 448), dcp::Size(1069, 578), dcp::YUVToRGB::REC709, VideoRange::FULL, AV_PIX_FMT_RGB24, VideoRange::FULL, Image::Alignment::COMPACT, false ); } -BOOST_AUTO_TEST_CASE (crop_scale_window_test3) +BOOST_AUTO_TEST_CASE(crop_scale_window_test3) { auto proxy = make_shared<FFmpegImageProxy>(TestPaths::private_data() / "player_seek_test_0.png"); auto xyz = proxy->image(Image::Alignment::PADDED).image->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGB24, Image::Alignment::PADDED, false); @@ -456,7 +456,7 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test3) } -BOOST_AUTO_TEST_CASE (crop_scale_window_test4) +BOOST_AUTO_TEST_CASE(crop_scale_window_test4) { auto proxy = make_shared<FFmpegImageProxy>(TestPaths::private_data() / "player_seek_test_0.png"); auto xyz = proxy->image(Image::Alignment::PADDED).image->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGB24, Image::Alignment::PADDED, false); @@ -472,7 +472,7 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test4) } -BOOST_AUTO_TEST_CASE (crop_scale_window_test5) +BOOST_AUTO_TEST_CASE(crop_scale_window_test5) { auto proxy = make_shared<FFmpegImageProxy>(TestPaths::private_data() / "player_seek_test_0.png"); auto xyz = proxy->image(Image::Alignment::PADDED).image->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_XYZ12LE, Image::Alignment::PADDED, false); @@ -484,7 +484,7 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test5) } -BOOST_AUTO_TEST_CASE (crop_scale_window_test6) +BOOST_AUTO_TEST_CASE(crop_scale_window_test6) { auto proxy = make_shared<FFmpegImageProxy>(TestPaths::private_data() / "player_seek_test_0.png"); auto xyz = proxy->image(Image::Alignment::PADDED).image->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_XYZ12LE, Image::Alignment::PADDED, false); @@ -501,7 +501,7 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test6) /** Test some small crops with an image that shows up errors in registration of the YUV planes (#1872) */ -BOOST_AUTO_TEST_CASE (crop_scale_window_test7) +BOOST_AUTO_TEST_CASE(crop_scale_window_test7) { using namespace boost::filesystem; for (int left_crop = 0; left_crop < 8; ++left_crop) { @@ -526,7 +526,7 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test7) } -BOOST_AUTO_TEST_CASE (crop_scale_window_test8) +BOOST_AUTO_TEST_CASE(crop_scale_window_test8) { using namespace boost::filesystem; @@ -543,20 +543,20 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test8) } -BOOST_AUTO_TEST_CASE (as_png_test) +BOOST_AUTO_TEST_CASE(as_png_test) { auto proxy = make_shared<FFmpegImageProxy>("test/data/3d_test/000001.png"); auto image_rgb = proxy->image(Image::Alignment::PADDED).image; auto image_bgr = image_rgb->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_BGRA, Image::Alignment::PADDED, false); - image_as_png(image_rgb).write ("build/test/as_png_rgb.png"); - image_as_png(image_bgr).write ("build/test/as_png_bgr.png"); + image_as_png(image_rgb).write("build/test/as_png_rgb.png"); + image_as_png(image_bgr).write("build/test/as_png_bgr.png"); - check_image ("test/data/3d_test/000001.png", "build/test/as_png_rgb.png"); - check_image ("test/data/3d_test/000001.png", "build/test/as_png_bgr.png"); + check_image("test/data/3d_test/000001.png", "build/test/as_png_rgb.png"); + check_image("test/data/3d_test/000001.png", "build/test/as_png_bgr.png"); } -BOOST_AUTO_TEST_CASE (as_jpeg_test) +BOOST_AUTO_TEST_CASE(as_jpeg_test) { auto proxy = make_shared<FFmpegImageProxy>("test/data/3d_test/000001.png"); auto image_rgb = proxy->image(Image::Alignment::PADDED).image; @@ -564,67 +564,67 @@ BOOST_AUTO_TEST_CASE (as_jpeg_test) image_as_jpeg(image_rgb, 60).write("build/test/as_jpeg_rgb.jpeg"); image_as_jpeg(image_bgr, 60).write("build/test/as_jpeg_bgr.jpeg"); - check_image ("test/data/as_jpeg_rgb.jpeg", "build/test/as_jpeg_rgb.jpeg"); - check_image ("test/data/as_jpeg_bgr.jpeg", "build/test/as_jpeg_bgr.jpeg"); + check_image("test/data/as_jpeg_rgb.jpeg", "build/test/as_jpeg_rgb.jpeg"); + check_image("test/data/as_jpeg_bgr.jpeg", "build/test/as_jpeg_bgr.jpeg"); } /* Very dumb test to fade black to make sure it stays black */ static void -fade_test_format_black (AVPixelFormat f, string name) +fade_test_format_black(AVPixelFormat f, string name) { - Image yuv (f, dcp::Size(640, 480), Image::Alignment::PADDED); - yuv.make_black (); - yuv.fade (0); + Image yuv(f, dcp::Size(640, 480), Image::Alignment::PADDED); + yuv.make_black(); + yuv.fade(0); string const filename = "fade_test_black_" + name + ".png"; image_as_png(yuv.convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGBA, Image::Alignment::PADDED, false)).write("build/test/" + filename); - check_image ("test/data/" + filename, "build/test/" + filename); + check_image("test/data/" + filename, "build/test/" + filename); } /* Fade red to make sure it stays red */ static void -fade_test_format_red (AVPixelFormat f, float amount, string name) +fade_test_format_red(AVPixelFormat f, float amount, string name) { auto proxy = make_shared<FFmpegImageProxy>("test/data/flat_red.png"); auto red = proxy->image(Image::Alignment::PADDED).image->convert_pixel_format(dcp::YUVToRGB::REC709, f, Image::Alignment::PADDED, false); - red->fade (amount); + red->fade(amount); string const filename = "fade_test_red_" + name + ".png"; image_as_png(red->convert_pixel_format(dcp::YUVToRGB::REC709, AV_PIX_FMT_RGBA, Image::Alignment::PADDED, false)).write("build/test/" + filename); - check_image ("test/data/" + filename, "build/test/" + filename); + check_image("test/data/" + filename, "build/test/" + filename); } -BOOST_AUTO_TEST_CASE (fade_test) +BOOST_AUTO_TEST_CASE(fade_test) { - fade_test_format_black (AV_PIX_FMT_YUV420P, "yuv420p"); - fade_test_format_black (AV_PIX_FMT_YUV422P10, "yuv422p10"); - fade_test_format_black (AV_PIX_FMT_RGB24, "rgb24"); - fade_test_format_black (AV_PIX_FMT_XYZ12LE, "xyz12le"); - fade_test_format_black (AV_PIX_FMT_RGB48LE, "rgb48le"); - - fade_test_format_red (AV_PIX_FMT_YUV420P, 0, "yuv420p_0"); - fade_test_format_red (AV_PIX_FMT_YUV420P, 0.5, "yuv420p_50"); - fade_test_format_red (AV_PIX_FMT_YUV420P, 1, "yuv420p_100"); - fade_test_format_red (AV_PIX_FMT_YUV422P10, 0, "yuv422p10_0"); - fade_test_format_red (AV_PIX_FMT_YUV422P10, 0.5, "yuv422p10_50"); - fade_test_format_red (AV_PIX_FMT_YUV422P10, 1, "yuv422p10_100"); - fade_test_format_red (AV_PIX_FMT_RGB24, 0, "rgb24_0"); - fade_test_format_red (AV_PIX_FMT_RGB24, 0.5, "rgb24_50"); - fade_test_format_red (AV_PIX_FMT_RGB24, 1, "rgb24_100"); - fade_test_format_red (AV_PIX_FMT_XYZ12LE, 0, "xyz12le_0"); - fade_test_format_red (AV_PIX_FMT_XYZ12LE, 0.5, "xyz12le_50"); - fade_test_format_red (AV_PIX_FMT_XYZ12LE, 1, "xyz12le_100"); - fade_test_format_red (AV_PIX_FMT_RGB48LE, 0, "rgb48le_0"); - fade_test_format_red (AV_PIX_FMT_RGB48LE, 0.5, "rgb48le_50"); - fade_test_format_red (AV_PIX_FMT_RGB48LE, 1, "rgb48le_100"); + fade_test_format_black(AV_PIX_FMT_YUV420P, "yuv420p"); + fade_test_format_black(AV_PIX_FMT_YUV422P10, "yuv422p10"); + fade_test_format_black(AV_PIX_FMT_RGB24, "rgb24"); + fade_test_format_black(AV_PIX_FMT_XYZ12LE, "xyz12le"); + fade_test_format_black(AV_PIX_FMT_RGB48LE, "rgb48le"); + + fade_test_format_red (AV_PIX_FMT_YUV420P, 0, "yuv420p_0"); + fade_test_format_red (AV_PIX_FMT_YUV420P, 0.5, "yuv420p_50"); + fade_test_format_red (AV_PIX_FMT_YUV420P, 1, "yuv420p_100"); + fade_test_format_red (AV_PIX_FMT_YUV422P10, 0, "yuv422p10_0"); + fade_test_format_red (AV_PIX_FMT_YUV422P10, 0.5, "yuv422p10_50"); + fade_test_format_red (AV_PIX_FMT_YUV422P10, 1, "yuv422p10_100"); + fade_test_format_red (AV_PIX_FMT_RGB24, 0, "rgb24_0"); + fade_test_format_red (AV_PIX_FMT_RGB24, 0.5, "rgb24_50"); + fade_test_format_red (AV_PIX_FMT_RGB24, 1, "rgb24_100"); + fade_test_format_red (AV_PIX_FMT_XYZ12LE, 0, "xyz12le_0"); + fade_test_format_red (AV_PIX_FMT_XYZ12LE, 0.5, "xyz12le_50"); + fade_test_format_red (AV_PIX_FMT_XYZ12LE, 1, "xyz12le_100"); + fade_test_format_red (AV_PIX_FMT_RGB48LE, 0, "rgb48le_0"); + fade_test_format_red (AV_PIX_FMT_RGB48LE, 0.5, "rgb48le_50"); + fade_test_format_red (AV_PIX_FMT_RGB48LE, 1, "rgb48le_100"); } -BOOST_AUTO_TEST_CASE (make_black_test) +BOOST_AUTO_TEST_CASE(make_black_test) { - dcp::Size in_size (512, 512); - dcp::Size out_size (1024, 1024); + dcp::Size in_size(512, 512); + dcp::Size out_size(1024, 1024); list<AVPixelFormat> pix_fmts = { AV_PIX_FMT_RGB24, // 2 @@ -667,8 +667,8 @@ BOOST_AUTO_TEST_CASE (make_black_test) for (auto i: pix_fmts) { auto foo = make_shared<Image>(i, in_size, Image::Alignment::PADDED); - foo->make_black (); - auto bar = foo->scale (out_size, dcp::YUVToRGB::REC601, AV_PIX_FMT_RGB24, Image::Alignment::PADDED, false); + foo->make_black(); + auto bar = foo->scale(out_size, dcp::YUVToRGB::REC601, AV_PIX_FMT_RGB24, Image::Alignment::PADDED, false); uint8_t* p = bar->data()[0]; for (int y = 0; y < bar->size().height; ++y) { @@ -677,7 +677,7 @@ BOOST_AUTO_TEST_CASE (make_black_test) if (*q != 0) { std::cerr << "x=" << x << ", (x % 3)=" << (x % 3) << "\n"; } - BOOST_CHECK_EQUAL (*q++, 0); + BOOST_CHECK_EQUAL(*q++, 0); } p += bar->stride()[0]; } @@ -685,7 +685,7 @@ BOOST_AUTO_TEST_CASE (make_black_test) } -BOOST_AUTO_TEST_CASE (make_part_black_test) +BOOST_AUTO_TEST_CASE(make_part_black_test) { auto proxy = make_shared<FFmpegImageProxy>("test/data/flat_red.png"); auto original = proxy->image(Image::Alignment::PADDED).image; @@ -709,8 +709,8 @@ BOOST_AUTO_TEST_CASE (make_part_black_test) for (auto i: pix_fmts) { for (auto j: positions) { auto foo = original->convert_pixel_format(dcp::YUVToRGB::REC601, i, Image::Alignment::PADDED, false); - foo->make_part_black (j.first, j.second); - auto bar = foo->convert_pixel_format (dcp::YUVToRGB::REC601, AV_PIX_FMT_RGB24, Image::Alignment::PADDED, false); + foo->make_part_black(j.first, j.second); + auto bar = foo->convert_pixel_format(dcp::YUVToRGB::REC601, AV_PIX_FMT_RGB24, Image::Alignment::PADDED, false); auto p = bar->data()[0]; for (int y = 0; y < bar->size().height; ++y) { @@ -720,19 +720,19 @@ BOOST_AUTO_TEST_CASE (make_part_black_test) int g = *q++; int b = *q++; if (x >= j.first && x < (j.first + j.second)) { - BOOST_CHECK_MESSAGE ( + BOOST_CHECK_MESSAGE( r < 3, "red=" << static_cast<int>(r) << " at (" << x << "," << y << ") format " << i << " from " << j.first << " width " << j.second ); } else { - BOOST_CHECK_MESSAGE ( + BOOST_CHECK_MESSAGE( r >= 252, "red=" << static_cast<int>(r) << " at (" << x << "," << y << ") format " << i << " from " << j.first << " width " << j.second ); } - BOOST_CHECK_MESSAGE ( + BOOST_CHECK_MESSAGE( g == 0, "green=" << static_cast<int>(g) << " at (" << x << "," << y << ") format " << i << " from " << j.first << " width " << j.second ); - BOOST_CHECK_MESSAGE ( + BOOST_CHECK_MESSAGE( b == 0, "blue=" << static_cast<int>(b) << " at (" << x << "," << y << ") format " << i << " from " << j.first << " width " << j.second ); } @@ -747,14 +747,15 @@ BOOST_AUTO_TEST_CASE (make_part_black_test) * filler 128x128 black frame is emitted from the FFmpegDecoder and the overall crop in either direction * is greater than 128 pixels. */ -BOOST_AUTO_TEST_CASE (over_crop_test) +BOOST_AUTO_TEST_CASE(over_crop_test) { auto image = make_shared<Image>(AV_PIX_FMT_RGB24, dcp::Size(128, 128), Image::Alignment::PADDED); - image->make_black (); - auto scaled = image->crop_scale_window ( + image->make_black(); + auto scaled = image->crop_scale_window( Crop(0, 0, 128, 128), dcp::Size(1323, 565), dcp::Size(1349, 565), dcp::YUVToRGB::REC709, VideoRange::FULL, AV_PIX_FMT_RGB24, VideoRange::FULL, Image::Alignment::PADDED, true ); string const filename = "over_crop_test.png"; - write_image (scaled, "build/test/" + filename); - check_image ("test/data/" + filename, "build/test/" + filename); + write_image(scaled, "build/test/" + filename); + check_image("test/data/" + filename, "build/test/" + filename); } + diff --git a/test/render_subtitles_test.cc b/test/render_subtitles_test.cc index 4e87abde0..4fc98cb56 100644 --- a/test/render_subtitles_test.cc +++ b/test/render_subtitles_test.cc @@ -176,8 +176,11 @@ BOOST_AUTO_TEST_CASE(render_text_with_newline_test) #elif defined(DCPOMATIC_WINDOWS) check_image("test/data/windows/render_text_with_newline_test.png", "build/test/render_text_with_newline_test.png"); #elif PANGO_VERSION_CHECK(1, 57, 0) - /* This pango version is the one on Arch, which renders slightly differently */ - check_image("test/data/arch/render_text_with_newline_test.png", "build/test/render_text_with_newline_test.png"); + /* This pango version is the one on Arch and Ubuntu 26.04, both of which render slightly differently */ + BOOST_REQUIRE( + check_image_and_report("test/data/arch/render_text_with_newline_test.png", "build/test/render_text_with_newline_test.png") + || check_image_and_report("test/data/ubuntu-26.04/render_text_with_newline_test.png", "build/test/render_text_with_newline_test.png") + ); #elif PANGO_VERSION_CHECK(1, 52, 1) /* This pango version is the one on Ubuntu 24.04, which renders slightly differently */ check_image("test/data/ubuntu-24.04/render_text_with_newline_test.png", "build/test/render_text_with_newline_test.png"); diff --git a/test/test.cc b/test/test.cc index 641ee4085..27b00b9d3 100644 --- a/test/test.cc +++ b/test/test.cc @@ -473,6 +473,13 @@ check_image (boost::filesystem::path ref, boost::filesystem::path check, double } +bool +check_image_and_report(boost::filesystem::path ref, boost::filesystem::path check, double threshold) +{ + return rms_error(ref, check) < threshold; +} + + void check_file (boost::filesystem::path ref, boost::filesystem::path check) { diff --git a/test/test.h b/test/test.h index 172edcf71..cd40c7872 100644 --- a/test/test.h +++ b/test/test.h @@ -69,6 +69,7 @@ extern bool mxf_atmos_files_same (boost::filesystem::path ref, boost::filesystem extern void check_xml(boost::filesystem::path, boost::filesystem::path, std::list<Glib::ustring>); extern void check_ffmpeg(boost::filesystem::path, boost::filesystem::path, float audio_tolerance); extern void check_image(boost::filesystem::path ref, boost::filesystem::path check, double threshold = 4); +extern bool check_image_and_report(boost::filesystem::path ref, boost::filesystem::path check, double threshold = 4); extern boost::filesystem::path test_film_dir (std::string); extern void write_image (std::shared_ptr<const Image> image, boost::filesystem::path file); boost::filesystem::path dcp_file (std::shared_ptr<const Film> film, std::string prefix); diff --git a/test/threed_test.cc b/test/threed_test.cc index bc6f83f59..3a8a50a40 100644 --- a/test/threed_test.cc +++ b/test/threed_test.cc @@ -54,54 +54,54 @@ using std::shared_ptr; /** Basic sanity check of THREE_D_LEFT_RIGHT */ -BOOST_AUTO_TEST_CASE (threed_test1) +BOOST_AUTO_TEST_CASE(threed_test1) { auto c = make_shared<FFmpegContent>("test/data/test.mp4"); auto film = new_test_film("threed_test1", { c }); - c->video->set_frame_type (VideoFrameType::THREE_D_LEFT_RIGHT); + c->video->set_frame_type(VideoFrameType::THREE_D_LEFT_RIGHT); - film->set_container (Ratio::from_id ("185")); - film->set_dcp_content_type (DCPContentType::from_isdcf_name ("TST")); - film->set_three_d (true); - make_and_verify_dcp (film); + film->set_container(Ratio::from_id("185")); + film->set_dcp_content_type(DCPContentType::from_isdcf_name("TST")); + film->set_three_d(true); + make_and_verify_dcp(film); } /** Basic sanity check of THREE_D_ALTERNATE; at the moment this is just to make sure * that such a transcode completes without error. */ -BOOST_AUTO_TEST_CASE (threed_test2) +BOOST_AUTO_TEST_CASE(threed_test2) { auto c = make_shared<FFmpegContent>("test/data/test.mp4"); auto film = new_test_film("threed_test2", { c }); - c->video->set_frame_type (VideoFrameType::THREE_D_ALTERNATE); + c->video->set_frame_type(VideoFrameType::THREE_D_ALTERNATE); - film->set_three_d (true); - make_and_verify_dcp (film); + film->set_three_d(true); + make_and_verify_dcp(film); } /** Basic sanity check of THREE_D_LEFT and THREE_D_RIGHT; at the moment this is just to make sure * that such a transcode completes without error. */ -BOOST_AUTO_TEST_CASE (threed_test3) +BOOST_AUTO_TEST_CASE(threed_test3) { auto film = new_test_film("threed_test3"); auto L = make_shared<FFmpegContent>("test/data/test.mp4"); auto R = make_shared<FFmpegContent>("test/data/test.mp4"); film->examine_and_add_content({L, R}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); - L->video->set_frame_type (VideoFrameType::THREE_D_LEFT); - R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT); + L->video->set_frame_type(VideoFrameType::THREE_D_LEFT); + R->video->set_frame_type(VideoFrameType::THREE_D_RIGHT); - film->set_three_d (true); - make_and_verify_dcp (film); + film->set_three_d(true); + make_and_verify_dcp(film); } -BOOST_AUTO_TEST_CASE (threed_test4) +BOOST_AUTO_TEST_CASE(threed_test4) { ConfigRestorer cr; @@ -109,18 +109,18 @@ BOOST_AUTO_TEST_CASE (threed_test4) auto L = make_shared<FFmpegContent>(TestPaths::private_data() / "LEFT_TEST_DCP3D4K.mov"); auto R = make_shared<FFmpegContent>(TestPaths::private_data() / "RIGHT_TEST_DCP3D4K.mov"); film->examine_and_add_content({L, R}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); - L->video->set_frame_type (VideoFrameType::THREE_D_LEFT); - R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT); + L->video->set_frame_type(VideoFrameType::THREE_D_LEFT); + R->video->set_frame_type(VideoFrameType::THREE_D_RIGHT); /* There doesn't seem much point in encoding the whole input, especially as we're only * checking for errors during the encode and not the result. Also decoding these files * (4K HQ Prores) is very slow. */ - L->set_trim_end (dcpomatic::ContentTime::from_seconds(22)); - R->set_trim_end (dcpomatic::ContentTime::from_seconds(22)); + L->set_trim_end(dcpomatic::ContentTime::from_seconds(22)); + R->set_trim_end(dcpomatic::ContentTime::from_seconds(22)); - film->set_three_d (true); + film->set_three_d(true); make_and_verify_dcp( film, {dcp::VerificationNote::Code::INVALID_PICTURE_ASSET_RESOLUTION_FOR_3D}, @@ -131,47 +131,47 @@ BOOST_AUTO_TEST_CASE (threed_test4) } -BOOST_AUTO_TEST_CASE (threed_test5) +BOOST_AUTO_TEST_CASE(threed_test5) { auto film = new_test_film("threed_test5"); auto L = make_shared<FFmpegContent>(TestPaths::private_data() / "boon_telly.mkv"); auto R = make_shared<FFmpegContent>(TestPaths::private_data() / "boon_telly.mkv"); film->examine_and_add_content({L, R}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); - L->video->set_frame_type (VideoFrameType::THREE_D_LEFT); - R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT); + L->video->set_frame_type(VideoFrameType::THREE_D_LEFT); + R->video->set_frame_type(VideoFrameType::THREE_D_RIGHT); /* There doesn't seem much point in encoding the whole input, especially as we're only * checking for errors during the encode and not the result. */ - L->set_trim_end (dcpomatic::ContentTime::from_seconds(3 * 60 + 20)); - R->set_trim_end (dcpomatic::ContentTime::from_seconds(3 * 60 + 20)); + L->set_trim_end(dcpomatic::ContentTime::from_seconds(3 * 60 + 20)); + R->set_trim_end(dcpomatic::ContentTime::from_seconds(3 * 60 + 20)); - film->set_three_d (true); - make_and_verify_dcp (film, {dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_2K}); + film->set_three_d(true); + make_and_verify_dcp(film, {dcp::VerificationNote::Code::INVALID_PICTURE_FRAME_RATE_FOR_2K}); } -BOOST_AUTO_TEST_CASE (threed_test6) +BOOST_AUTO_TEST_CASE(threed_test6) { auto film = new_test_film("threed_test6"); auto L = make_shared<FFmpegContent>("test/data/3dL.mp4"); auto R = make_shared<FFmpegContent>("test/data/3dR.mp4"); film->examine_and_add_content({L, R}); film->set_audio_channels(16); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); - L->video->set_frame_type (VideoFrameType::THREE_D_LEFT); - R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT); + L->video->set_frame_type(VideoFrameType::THREE_D_LEFT); + R->video->set_frame_type(VideoFrameType::THREE_D_RIGHT); - film->set_three_d (true); - make_and_verify_dcp (film); - check_dcp ("test/data/threed_test6", film->dir(film->dcp_name())); + film->set_three_d(true); + make_and_verify_dcp(film); + check_dcp("test/data/threed_test6", film->dir(film->dcp_name())); } /** Check 2D content set as being 3D; this should give an informative error */ -BOOST_AUTO_TEST_CASE (threed_test7) +BOOST_AUTO_TEST_CASE(threed_test7) { using boost::filesystem::path; @@ -179,87 +179,87 @@ BOOST_AUTO_TEST_CASE (threed_test7) path const content_path = "test/data/flat_red.png"; auto c = content_factory(content_path)[0]; film->examine_and_add_content({c}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); - c->video->set_frame_type (VideoFrameType::THREE_D); - c->video->set_length (24); + c->video->set_frame_type(VideoFrameType::THREE_D); + c->video->set_length(24); - film->set_three_d (true); - make_dcp (film, TranscodeJob::ChangedBehaviour::IGNORE); - film->write_metadata (); + film->set_three_d(true); + make_dcp(film, TranscodeJob::ChangedBehaviour::IGNORE); + film->write_metadata(); - auto jm = JobManager::instance (); - while (jm->work_to_do ()) { + auto jm = JobManager::instance(); + while (jm->work_to_do()) { while (signal_manager->ui_idle()) {} - dcpomatic_sleep_seconds (1); + dcpomatic_sleep_seconds(1); } - while (signal_manager->ui_idle ()) {} + while (signal_manager->ui_idle()) {} - BOOST_REQUIRE (jm->errors()); + BOOST_REQUIRE(jm->errors()); shared_ptr<Job> failed; for (auto i: jm->_jobs) { if (i->finished_in_error()) { - BOOST_REQUIRE (!failed); + BOOST_REQUIRE(!failed); failed = i; } } - BOOST_REQUIRE (failed); - BOOST_CHECK_EQUAL (failed->error_summary(), fmt::format("The content file {} is set as 3D but does not appear to contain 3D images. Please set it to 2D. You can still make a 3D DCP from this content by ticking the 3D option in the DCP video tab.", boost::filesystem::canonical(content_path).string())); + BOOST_REQUIRE(failed); + BOOST_CHECK_EQUAL(failed->error_summary(), fmt::format("The content file {} is set as 3D but does not appear to contain 3D images. Please set it to 2D. You can still make a 3D DCP from this content by ticking the 3D option in the DCP video tab.", boost::filesystem::canonical(content_path).string())); - while (signal_manager->ui_idle ()) {} + while (signal_manager->ui_idle()) {} - JobManager::drop (); + JobManager::drop(); } /** Trigger a -114 error by trying to make a 3D DCP out of two files with slightly * different lengths. */ -BOOST_AUTO_TEST_CASE (threed_test_separate_files_slightly_different_lengths) +BOOST_AUTO_TEST_CASE(threed_test_separate_files_slightly_different_lengths) { auto film = new_test_film("threed_test3"); auto L = make_shared<FFmpegContent>("test/data/test.mp4"); auto R = make_shared<FFmpegContent>("test/data/test.mp4"); film->examine_and_add_content({L, R}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); - L->video->set_frame_type (VideoFrameType::THREE_D_LEFT); - R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT); - R->set_trim_end (dcpomatic::ContentTime::from_frames(1, 24)); + L->video->set_frame_type(VideoFrameType::THREE_D_LEFT); + R->video->set_frame_type(VideoFrameType::THREE_D_RIGHT); + R->set_trim_end(dcpomatic::ContentTime::from_frames(1, 24)); - film->set_three_d (true); - make_and_verify_dcp (film); + film->set_three_d(true); + make_and_verify_dcp(film); } /** Trigger a -114 error by trying to make a 3D DCP out of two files with very * different lengths. */ -BOOST_AUTO_TEST_CASE (threed_test_separate_files_very_different_lengths) +BOOST_AUTO_TEST_CASE(threed_test_separate_files_very_different_lengths) { auto film = new_test_film("threed_test3"); auto L = make_shared<FFmpegContent>("test/data/test.mp4"); auto R = make_shared<FFmpegContent>("test/data/test.mp4"); film->examine_and_add_content({L, R}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); - L->video->set_frame_type (VideoFrameType::THREE_D_LEFT); - R->video->set_frame_type (VideoFrameType::THREE_D_RIGHT); - R->set_trim_end (dcpomatic::ContentTime::from_seconds(1.5)); + L->video->set_frame_type(VideoFrameType::THREE_D_LEFT); + R->video->set_frame_type(VideoFrameType::THREE_D_RIGHT); + R->set_trim_end(dcpomatic::ContentTime::from_seconds(1.5)); - film->set_three_d (true); - make_and_verify_dcp (film); + film->set_three_d(true); + make_and_verify_dcp(film); } -BOOST_AUTO_TEST_CASE (threed_test_butler_overfill) +BOOST_AUTO_TEST_CASE(threed_test_butler_overfill) { auto film = new_test_film("threed_test_butler_overfill"); auto A = make_shared<FFmpegContent>(TestPaths::private_data() / "arrietty_JP-EN.mkv"); auto B = make_shared<FFmpegContent>(TestPaths::private_data() / "arrietty_JP-EN.mkv"); film->examine_and_add_content({A, B}); - BOOST_REQUIRE (!wait_for_jobs()); + BOOST_REQUIRE(!wait_for_jobs()); Player player(film, Image::Alignment::COMPACT, false); int const audio_channels = 2; @@ -279,7 +279,7 @@ BOOST_AUTO_TEST_CASE (threed_test_butler_overfill) butler->get_video(Butler::Behaviour::BLOCKING, &error); butler->get_audio(Butler::Behaviour::BLOCKING, audio.data(), audio_frames); } - BOOST_REQUIRE (error.code == Butler::Error::Code::NONE); + BOOST_REQUIRE(error.code == Butler::Error::Code::NONE); } diff --git a/test/util_test.cc b/test/util_test.cc index defc7f907..ee26cc18c 100644 --- a/test/util_test.cc +++ b/test/util_test.cc @@ -93,11 +93,11 @@ BOOST_AUTO_TEST_CASE(seconds_to_approximate_hms_test) BOOST_AUTO_TEST_CASE(time_to_hmsf_test) { - BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_frames(12, 24), 24), "00:00:00.12"); - BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_frames(24, 24), 24), "00:00:01.00"); - BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_frames(32, 24), 24), "00:00:01.08"); - BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_seconds(92), 24), "00:01:32.00"); - BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_seconds(2 * 60 * 60 + 92), 24), "02:01:32.00"); + BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_frames(12, 24), 24), "00:00:00:12"); + BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_frames(24, 24), 24), "00:00:01:00"); + BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_frames(32, 24), 24), "00:00:01:08"); + BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_seconds(92), 24), "00:01:32:00"); + BOOST_CHECK_EQUAL(time_to_hmsf(DCPTime::from_seconds(2 * 60 * 60 + 92), 24), "02:01:32:00"); } @@ -110,14 +110,6 @@ BOOST_AUTO_TEST_CASE(tidy_for_filename_test) } -BOOST_AUTO_TEST_CASE(utf8_strlen_test) -{ - BOOST_CHECK_EQUAL(utf8_strlen("hello world"), 11U); - BOOST_CHECK_EQUAL(utf8_strlen("hëllo world"), 11U); - BOOST_CHECK_EQUAL(utf8_strlen("hëłlo wørld"), 11U); -} - - BOOST_AUTO_TEST_CASE(careful_string_filter_test) { BOOST_CHECK_EQUAL("hello_world", careful_string_filter("hello_world")); |
