summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/audio_analysis_test.cc126
-rw-r--r--test/colour_conversion_test.cc70
-rw-r--r--test/create_cli_test.cc16
m---------test/data0
-rw-r--r--test/frame_rate_test.cc297
-rw-r--r--test/hints_test.cc44
-rw-r--r--test/image_content_fade_test.cc40
-rw-r--r--test/image_test.cc335
-rw-r--r--test/render_subtitles_test.cc7
-rw-r--r--test/test.cc7
-rw-r--r--test/test.h1
-rw-r--r--test/threed_test.cc144
-rw-r--r--test/util_test.cc18
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"));